my funeral week

少しでも日々の生活に変化を。

MayaScripts_CameraRemover:削除できないカメラを除去

Mayaにて新規シーンを作成すると、大体以下のカメラが最初からシーンに含まれていると思います。

  • persp
  • top
  • front
  • side

んで、仕事しているとたま~にこれらのカメラが複製されて・・・

  • persp
    • persp1
    • persp2
    • persp3
    • persp4
  • top
  • top1
  • top2
  • front
  • front1
  • front2
  • side
  • side1
  • side2

みたいな感じになっているシーンに出くわすことがあるのですが、もうこんなのは明らかに 「ゴミ」 なので削除しようとDeleteを実行すると・・・、

削除不能ノード 'front1' は削除できません。

こんなエラーが出て削除できないことがあります!

この原因は何なのかと言うと、各ゴミカメラが StartupCemera として設定されたまま複製されていることで暗黙的に削除不能ノードとされているから・・・だと思います。しらんけど。

まぁ、とにかく削除するにはこのフラグを折ってから削除すれば良いのです。


CameraRemover

本日の本題である「選択しているゴミカメラを削除する」コードになります。

# encoding=utf8
# -*- coding:utf-8 -*-

import pymel.core as pm

BUTTON = ["Yes", "No"]

def main ():
    # Dagフラグを立てて選択からカメラのみを抽出
    selected = pm.ls(sl = True, dag = True, type = "camera")
    if not selected : return# 選択なし処理キャンセル
    
    # 念の為の確認ダイアログ
    msg = "Are you sure to delete following camera ?\n" + "".join(["\n-" + i.name() for i in selected])
    confirmed = pm.confirmDialog(t = "Delete Camera", m = msg, b = BUTTON, ds = BUTTON[1])
    if confirmed != BUTTON[0] : return# 処理キャンセル
    
    for i in selected:
        i.setStartupCamera(False)# 削除不能の原因となるStartupCemeraフラグを折る
        
    # カメラの親のTransformごと削除
    pm.delete([i.getParent() for i in selected])


削除したいカメラを選択して上記を実行すると以下のような確認ダイアログが表示されるので、「Yes」を選択するとそれで終わりです。

f:id:garysfirearms108:20210812122429j:plain

選択していたゴミはシーンから削除されます。



なんでゴミカメラが生まれるのかは分かりませんが、入れ子になっているリファレンスの編集中にとか、なんかショートカットを押してしまっているとか、何かしらのヒューマンエラーが根源でしょう。どんだけ気を付けていてもミスるときはありますから・・・。

それでは、また。