Maya Script Pymel 選択範囲の記憶 複数版

またまたスクリプトにはまっておりました。
以前書いた選択範囲の記憶、複数版もできるのではないか。
という思いを抱いてしまったので、作ってみました。

 

インスタンスを使う、とかカッコいいこと書いておりましたが、使いませんでした。
辞書を使いました。
中々苦戦しましたが、なんとかできたようです。多分。バグがあったらごめんなさい。
しかし、またまた作っておいてなんですが、使わないなぁ、、
なんでMayaはこうも選択範囲の作成が大変なんだろうか?
modoに慣れているとその使いにくさに絶句してしまう。
スクリプトを作ったはいいが、使わないなぁ、、もやは趣味の領域です。
スクリプトなので、もちろん遅いかと思います。
シーンを新たに開くとリセットされます。
記憶できる選択範囲は、頂点、エッジ、フェース、UVです。

 

テストです。
まずはひとつのオブジェクトを選択し、selection(“vertex”)で選択範囲を作ります。
2012_10_06Image_01
次にselection(“object”)を使ってすべてのオブジェクトを選択します。
2012_10_06Image_02
そのままselection(“vertex”)で頂点選択に戻ります。
2012_10_06Image_03
ちゃんと覚えています。
で、selection(“edge”)を使ってエッジ選択をします。
2012_10_06Image_04
再びselection(“vertex”)で頂点選択に戻ってみます。
2012_10_06Image_05
もちろん、まだ覚えております。
で、selection(“edge”)で再びエッジ選択にします。
2012_10_06Image_06
うん、今のところ大丈夫。多分。

 

で、ソースコードです。改造は自由に行なってください。

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)

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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