Maya Script Pymel コンポーネント選択でトランスフォームノードを取得

なんだか意味の分からないタイトルです。
コンポーネント選択時(頂点選択、エッジ選択、フェース選択)、にスクリプトからトランスフォームノードを捕まえられるのか。という話です。
なぜ、それが必要になったか。はっきり言って勘違いでした。
あえて恥を晒す必要もないのですが、メモ帳代わりに書いておきます。

 

そもそもやろうとしていることが、法線方向の表示をコンポーネント選択の時でもオン、オフが切り替えられるといいのになぁ。
ということがきっかけです。
modoはレイヤーを変えない限りは選択範囲を覚えているし、新たに選択するとしても選択自体が簡単なので、問題ない。
Mayaではそのどちらにも問題があるので、いちいちオブジェクト選択に戻して、選択し直すのが面倒くさい。
そんな横着な発想から始まりました。そもそもスクリプトを作るのは横着な発想からであることが大半だ。

 

それはさておき、
Mayaの構造を相変わらず詳しく知りません。
なので、法線表示のアトリビュートはトランスフォームノードにあるのだとばかり思っておりました。ただの思いこみです。
なので、トランスフォームノードを取得する必要があるのだろう。と、探していると、望みの物を見つけました。
ただ、相変わらず、そのままだと若干不都合がある。なので、改造しました。

import pymel.core as pm
pm.selected()[0]._node.getParent()

コンポーネント選択で、何かを選択し、上記のスクリプトを実行するとトランスフォームノードを取得できます。
Mayaの構造知りませんが、シェイプノードの親は確実にそれのトランスフォームノードなのでしょうか?
確実にトランスフォームを取得する、という点では、

import pymel.core as pm
pm.selected()[0]._node.listRelatives(ap=1,type="transform")

こうなるのでしょうか?そこまでする必要もない。長ったらしい記述を見ていると自分でもそう思います。
で、そんな誤解と不理解からこんなスクリプトを作ってしまいました。

import pymel.core as pm
for x in pm.selected(o=1):
	if type(x) != pm.nodetypes.Transform:
		pm.setAttr(pm.PyNode(x).getParent()+".displayNormal", not pm.getAttr(pm.PyNode(x).getParent()+".displayNormal"))
		pm.setAttr(pm.PyNode(x).getParent()+".normalType",2)
	else:
		pm.setAttr(x+".displayNormal", not pm.getAttr(x+".displayNormal"))
		pm.setAttr(x+".normalType",2)

うーん、馬鹿丸出しです。
まぁ、動作はするし、別に問題があるわけではないのですが、せっかくのオブジェクト指向が無駄になっている。
その後色々と調べたり、実験したりしているうちにようやく法線方向の表示はシェイプノードにあることに気が付きました。
それはそうだ。と当然のように納得し、早速作り直しました。

import pymel.core as pm
for x in pm.selected(o=1):
	x.displayNormal.set(not x.displayNormal.get())
	x.normalType.set(2)

おお、わかりやすく読みやすい。と感動してしまいました。
コマンドとして入力しなくても、すでにオブジェクト自体にそのアトリビュートを持っております。
少しずつ、Mayaの構造とオブジェクト指向を学んでおります。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です