Maya Script Pymel 選択タイプを取得

Pymelをせっかく使っているので、選択されたものが何であるのかを見て、
それによって、分岐させたい。そんなことを考えて色々と試しておりました。

 

今までどおりのPythonであれば、最悪、

import maya.cmds as cmds
cmds.ls(sl=1)[0].split(".")[1].find("vtx")

などと、文字列に変換して調べる。という方法もありました。
しかし、せっかくオブジェクト指向なので、それを活用した方法はないものか、
検索をしてみると、どうやら同じようなことを考えている人たちはいるようで、
いくつかのものを発見することができました。
しかし、どれもうまく行かない、、
それらを参考にして作ってみました。

import pymel.core as pm
for x in pm.selected(fl=1):
	if type(x) == pm.MeshFace:
		print "MeshFace"
	if type(x) == pm.MeshVertex:
		print "MeshVertex"
	if type(x) == pm.MeshEdge:
		print "MeshEdge"
	if type(x) == pm.MeshUV:
		print "MeshUV"
	if type(x) == pm.MeshVertexFace:
		print "MeshVertexFace"
	if type(x) == pm.nodetypes.Transform:
		print "Transform"
	if type(x) == pm.nodetypes.Mesh:
		print "Shape"
	print x

このコードでは、頂点、エッジ、フェース、UV、頂点フェース、トランスフォーム、シェイプを判断できます。
これが最良の方法かどうかは知りませんが、とりあえず判別できます。
で、それで何か作ってみよう、と、こんなものを作りました。

import pymel.core as pm
edges = pm.ls([pm.polyListComponentConversion(x,te=1) for x in pm.selected(fl=1)if type(x)==pm.MeshFace],fl=1)
edgesSet = set(edges)
[edgesSet.remove(x) for x in list(edgesSet)if edges.count(x)>1]
if edgesSet!=set():
	pm.select(edgesSet)

選択されたものがフェースであるかを判別し、実行するようにしております。
フェース選択の境界にあるエッジを選択するものです。
作り終えて、動作を見た時に、見たことのある動作だ、ということに気が付きました。
よくよく考えてみると、以前作ったものを記事として書いている。
すっかり忘れておりました、、ただのバカです。
まぁ、こんな書き方もあるよ。と、自分に言い聞かせて納得するよりほかありません。

 

しかし、過去の記事、ところどころコードの文字が化けていますね、、使いものにならない。
メモ代わりに使っているので、元もない。仕方がない。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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