【Maya】fileノードを作れなくなる問題を解決する

問題の概要

デザイナーさんからとあるツールでエラーが起きると報告を受けて調べてみると、fileノードを作る処理がコケていることがわかりました。

from maya import cmds
cmds.shadingNode("file", asTexture=True, isColorManaged=True, name="test")
# Error: RuntimeError: file <maya console> line 2: Maya command error #

???

さらに調べてみると、問題のシーンを一回でも開くと、以降開いた全てのシーンで同じ問題が発生することがわかりました。つらい。
ちなみにこのとき既に存在するfileノードはハイパーシェードに追加されますが、追加で作成したものは表示されません。

調べてみる

これ系は大概Mayaが自動的につくるノードが悪い気がするので、そこに焦点を絞ってまずは正常なシーンでfileノードへの接続をノードエディタで見てみます。
こういった調査のときは補助ノードも有効にしておきます。(Show Auxiliary Nodes)

NodeEditor

detaultTextureList1というやつがあやしいですね。
というわけでmaファイルを読んでみると…。

select -ne :defaultTextureList1;
	setAttr -av -cb on ".cch";
	setAttr -k on ".fzn";
	setAttr -cb on ".ihi";
	setAttr -av -cb on ".nds";
	setAttr -cb on ".bnm";
	setAttr -s 26 ".tx";
lockNode -l 0 -lu 1;

はい。なんか見覚えありますね。
問題のノードのlockUnpublishedフラグが有効になっているようです。
initialShadingGroupが同じ状態になっているとメッシュが表示されないみたいな問題が発生するやつを思い出します。

復旧処理を書く

というわけでこんな感じの処理をしてやればおっけーです。

from maya import cmds

def fix_invalid_default_texture_ist():
    default_texture_list = cmds.ls(type="defaultTextureList")
    if not default_texture_list:
        return

    default_texture_list = default_texture_list[0]
    if not cmds.lockNode(default_texture_list, q=True, lu=True)[0]:
        return

    cmds.lockNode(default_texture_list, l=False, lu=False)

fix_invalid_default_texture_ist()

原因は謎なので気持ち悪いんですが、シーンオープンとかにフックしてこの処理を実行するようにしておけば基本的に困ることはなさそうです。

スポンサーリンク