Maya Script Pymel 選択範囲の記憶 その2 ScriptJob

恥ずかしながら、またバグがありました。
大したデバッグをしておりませんでした。すみません。
気がついたきっかけは、似たようなスクリプトの構造でカラーテクスチャとノーマルテクスチャを入れ替えるスクリプトを使った時でした。
スクリプトを使用し、再び同じシーンを開いてスクリプトを実行すると、エラーが帰って来ました。
場合によってはMayaが落ちました。
どうもエラーメッセージを見てみると、そんなオブジェクト存在しないよ。というようなことが書いてありました。
同じシーンから取ってきたのだから、同じじゃないの?と思っていたのですが、違うようです。
で、解決方法としては、シーンを開くたびにメモリを初期化すれば良いじゃないか。
ということで、scriptJobを使いました。以前ウェイトエディタを作った時にも使ったのですが、
あれは、UIにペアレントされていたので、UIを消せば消えるので気軽に使えました。
しかし、今回の場合UIがないので、そうも行きません。
なので、またuserSetup.pyだのみです。

import pymel.core as pm

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):
	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)

C:\Users\(ユーザー名)\Documents\maya\2013-x64※バージョン名\ja_JP\prefs\scripts\userSetup.py
に記述することで使えます。
うーん、賢くない。一層のこと関数にアトリビュートを持たせてやったほうが良いのだろうか?
まぁ、使えるからいいや。

 

因みに、scriptJobですが、

import pymel.core as pm
for x in pm.scriptJob(lj=1):
	print x.split("\n")[0]

このようにすると、すでに発行されているscriptJobを確認することができます。
デフォルトで100個近くあるのですね。ちょっとびっくりです。
だったらひとつくらい、良いかな。そんな軽い気持ちになれます。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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