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 isinstance(x,pm.MeshFace): print "MeshFace" if isinstance(x,pm.MeshVertex): print "MeshVertex" if isinstance(x,pm.MeshEdge): print "MeshEdge" if isinstance(x,pm.MeshUV): print "MeshUV" if isinstance(x,pm.MeshVertexFace): print "MeshVertexFace" if isinstance(x,pm.nodetypes.Transform): print "Transform" if isinstance(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 isinstance(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)
選択されたものがフェースであるかを判別し、実行するようにしております。
フェース選択の境界にあるエッジを選択するものです。
作り終えて、動作を見た時に、見たことのある動作だ、ということに気が付きました。
よくよく考えてみると、以前作ったものを記事として書いている。
すっかり忘れておりました、、ただのバカです。
まぁ、こんな書き方もあるよ。と、自分に言い聞かせて納得するよりほかありません。
しかし、過去の記事、ところどころコードの文字が化けていますね、、使いものにならない。
メモ代わりに使っているので、元もない。仕方がない。
2017/10/25
masaharu様のご指摘いただき、記事の一部を修正しました。
ありがとうございました。
17.10.23 @ 5:04 PM
今更ですが
if type(x) == pm.MeshFace:
となっている所は
if isinstance(x,pm.MeshFace):
の方が良いです。
type(type(x)) はとなり
type(x)自体はtypeクラスのインスタンスです。
下記のifのコメントを切り替えて試して頂ければ分かると思います。
import pymel.core as pm
sel = pm.selected()
if type(sel) == ‘list’:
#if isinstance(sel,list):
print ‘type ok’
17.10.24 @ 11:09 PM
masaharu様
コメントありがとうございます。
なるほど、今度直させていただきます。
そうですよねぇ、書籍などでもisinstance()を使ってますもんねぇ。
ついつい入力しやすい方をやってしまっております、、
ご指摘ありがとうございました。