Maya Script Pymel 選択範囲の記憶

import pymel.core as pm

class MemSel(object):
	sceneName = ""
	vsel = []
	esel = []
	fsel = []
	uvsel = []

mem = MemSel()

def selection(mode):
	sname = pm.Env().sceneName()
	if mem.sceneName != sname:
		mem.sceneName = sname
		mem.vsel = []
		mem.esel = []
		mem.fsel = []
		mem.uvsel = []
	sel = pm.selected() if pm.selected()!=[] else pm.ls(hl=1)
	if sel:
		if mode == "object":
			pm.selectMode(o=1)
		else:
			pm.selectMode(co=1)
		if type(sel[0]) == pm.nodetypes.Mesh:
			name = sel[0]
		elif type(sel[0]) == pm.nodetypes.Transform:
			name = sel[0].getShape()
		else:
			name = sel[0]._node
		if type(sel[0]) == pm.MeshVertex:
			if mem.vsel != sel:
				mem.vsel = sel
		if type(sel[0]) == pm.MeshEdge:
			if mem.esel != sel:
				mem.esel = sel
		if type(sel[0]) == pm.MeshFace:
			if mem.fsel != sel:
				mem.fsel = sel
		if type(sel[0]) == pm.MeshUV:
			if mem.uvsel != sel:
				mem.uvsel = sel
				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)
			if mem.vsel and mem.vsel[0].split(".")[0] == name :
				pm.select(mem.vsel)
			else:
				pm.select(cl=1)
		if mode == "edge":
			pm.selectType(smp=0,sme=1,smf=0,smu=0,pv=0,pe=1,pf=0,puv=0)
			if mem.esel and mem.esel[0].split(".")[0] == name :
				pm.select(mem.esel)
			else:
				pm.select(cl=1)
		if mode == "face":
			pm.selectType(smp=0,sme=0,smf=1,smu=0,pv=0,pe=0,pf=1,puv=0)
			if mem.fsel and mem.fsel[0].split(".")[0] == name :
				pm.select(mem.fsel)
			else:
				pm.select(cl=1)
		if mode == "uv":
			pm.selectType(pv=0,pe=0,pf=0,puv=1,smp=0,sme=0,smf=0,smu=1)
			if mem.uvsel and mem.uvsel[0].split(".")[0] == name :
				pm.select(mem.uvsel)
			else:
				pm.select(cl=1)

相変わらず稚拙なコードです。
でもなんとかできました。
ただ、自分が使うもの限定なので、ポリゴンメッシュのみに対応しております。
XSIと違い、それぞれのオブジェクトの選択範囲を記憶するのではなく、頂点、エッジ、フェース、UV
をそれぞれ一つだけ記憶できます。
オブジェクトごとにインスタンスを作れば複数オブジェクトにも対応できるのだとは思います。
そこまで求めておりません。
このスクリプトを作っていて、モデリングはmodoで済ませるから、使わないよな。でも作ってみたいなぁ。
という中途半端な気持ちで作っていたので、コードも中途半端です。

 

クラスをただの箱としてしか使っていない。
最初は中で色々やるようにしていたのですが、スーパークラスが必要になりそうなので、
まだクラスの知識もおぼつかないし、そこまで求めていないし。とこんな形になりました。

 

しかし、地味に便利です。これくらいで十分だ。
userSetup.pyに書き込んでおくとホットキーで使えます。
使い方は、

selection("vertex")

で頂点選択

selection("edge")

でエッジ選択

selection("face")

でフェース選択

selection("uv")

でUV選択

selection("object")

でオブジェクト選択です。
因みに自分の場合は、オブジェクト選択に、

pm.runtime.SelectTool()

と、2行目を追加し、オブジェクト選択モードに変更すると同時にセレクトツールに移行させております。
ツールドロップのような役割を果たします。
これも選択範囲が記憶されているので、使い勝手は十分だと思います。
そして、割り当てるキーはmodoと同じ、それぞれ「1」、「2」、「3」、uvが「Ctrl」+「1」です。
で、オブジェクト選択は「q」です。おぉ、modoのように使いやすい。と感激します。

 

そして、クラスを箱として使い、メモリに格納したい情報を置いておける。という利点をいいことに、
ノーマルマップが貼られているマテリアルのカラーとノーマルを入れ替えるものなども作ってみました。
しかし、職場では問題なく動作するのに自宅では動かない。
どうやらPymelでマテリアルを取得するだけでエラーが帰ってきます。
2012と2013の違いなのでしょうか?他の環境を知らないので分からない。
やはりこういう時にAPIの知識が必要なんだろうなぁ、と感じてしまいます。
API勉強すればC++への移行も少しはしやすいんだろうなぁ。
まぁ、気が向いたらやります。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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