Maya Script Pymel 選択範囲の記憶 複数版
またまたスクリプトにはまっておりました。
以前書いた選択範囲の記憶、複数版もできるのではないか。
という思いを抱いてしまったので、作ってみました。
インスタンスを使う、とかカッコいいこと書いておりましたが、使いませんでした。
辞書を使いました。
中々苦戦しましたが、なんとかできたようです。多分。バグがあったらごめんなさい。
しかし、またまた作っておいてなんですが、使わないなぁ、、
なんでMayaはこうも選択範囲の作成が大変なんだろうか?
modoに慣れているとその使いにくさに絶句してしまう。
スクリプトを作ったはいいが、使わないなぁ、、もやは趣味の領域です。
スクリプトなので、もちろん遅いかと思います。
シーンを新たに開くとリセットされます。
記憶できる選択範囲は、頂点、エッジ、フェース、UVです。
テストです。
まずはひとつのオブジェクトを選択し、selection(“vertex”)で選択範囲を作ります。
次にselection(“object”)を使ってすべてのオブジェクトを選択します。
そのままselection(“vertex”)で頂点選択に戻ります。
ちゃんと覚えています。
で、selection(“edge”)を使ってエッジ選択をします。
再びselection(“vertex”)で頂点選択に戻ってみます。
もちろん、まだ覚えております。
で、selection(“edge”)で再びエッジ選択にします。
うん、今のところ大丈夫。多分。
で、ソースコードです。改造は自由に行なってください。
class MemSel(object): vsel = {} esel = {} fsel = {} uvsel = {} mem = MemSel() def mem_clear(): mem.vsel = {} mem.esel = {} mem.fsel = {} mem.uvsel = {} def mem_clear_sjob(): sjob = pm.scriptJob(e=["SceneOpened","mem_clear()"]) mem_clear_sjob() def selection(mode): if pm.selectMode(q=1,o=1): obj = pm.ls(sl=1,o=1) else: obj = pm.ls(hl=1) sel = pm.selected() newSelect = [] if obj: names = [] for o in obj: list = [] if type(o) == pm.nodetypes.Transform: name = o.getShape() names.append(name) if sel: for s in sel: shapeName = s.split(".")[0] if shapeName == name: list.append(s) if type(s) == pm.MeshVertex: mem.vsel[name] = list if type(s) == pm.MeshEdge: mem.esel[name] = list if type(s) == pm.MeshFace: mem.fsel[name] = list if type(s) == pm.MeshUV: mem.uvsel[name] = list if mode == "object": pm.selectMode(o=1) else: pm.selectMode(co=1) pm.select(cl=1) if mode == "vertex": pm.selectType(smp=1,sme=0,smf=0,smu=0,pv=1,pe=0,pf=0,puv=0) for name in names: if name in mem.vsel and mem.vsel[name]: newSelect.append(mem.vsel[name]) if mode == "edge": pm.selectType(smp=0,sme=1,smf=0,smu=0,pv=0,pe=1,pf=0,puv=0) for name in names: if name in mem.esel and mem.esel[name]: newSelect.append(mem.esel[name]) if mode == "face": pm.selectType(smp=0,sme=0,smf=1,smu=0,pv=0,pe=0,pf=1,puv=0) for name in names: if name in mem.fsel and mem.fsel[name]: newSelect.append(mem.fsel[name]) if mode == "uv": pm.selectType(pv=0,pe=0,pf=0,puv=1,smp=0,sme=0,smf=0,smu=1) for name in names: if name in mem.uvsel and mem.uvsel[name]: newSelect.append(mem.uvsel[name]) if newSelect: pm.select(newSelect)
コメントする
トラックバックする
トラックバック用URL: