« リミテッドアニメーションの功罪 | トップページ | 観劇!激見!! »

2012年2月14日 (火)Logicは外

おはようございます。本日の当番、モーションデザイナーのR.Iです。

さて前回のブログで簡単なUI付きのスクリプトを作成しました。

そのスクリプト中に

#UIの設定
oLayout.Logic = """

PPG.Model_List.value = ""
PPG.Model_Name.value = ""

def Model_List_OnChanged():
	App = Application
	oRoot = App.ActiveSceneRoot
	PPG.Model_Name.value = ""

def Model_Name_OnChanged():
	PPG.Model_List.value = ""

def CreateModel_OnClicked():
	App = Application
	oRoot = App.ActiveSceneRoot
	oSel = App.Selection
	oModel_List = str(oRoot.FindChildren("*","#model","",0).GetAsText()).split(",")
	oModel_List.sort()

	if oSel.Count > 0:
		if len(oModel_List) > 0 and str(PPG.Model_List.value) != "":

			oModel = oRoot.FindChildren(oModel_List[int(PPG.Model_List.value)],"#model","",0)
			oModel[0].AddChild(oSel)
			PPG.Close()

		elif str(PPG.Model_Name) == "":
			LogMessage("Not Mark RadioButton or Not Input ModelName!!")

		if PPG.Model_Name.value != "":
			oModel = oRoot.FindChildren(str(PPG.Model_Name.value),"#model","",0)

			if str(PPG.Model_Name.value) != str(oModel.GetAsText()):
				oRoot.AddModel(oSel,PPG.Model_Name.value)

			else:
				oModel[0].AddChild(oSel)
			PPG.Close()		
	else:
		LogMessage("Not Select Obj!!")
"""

というUIのイベントを設定する部分がありました。

前回は「勉強ついでに」ということでLogicの書式に従ってスクリプトを
書いてましたが、このLogic部分だけですごく長いです。
これが一つのファイルに全部、記述されていると見にくいのでは?と思い、
いい方法はないかと調べていたら「外部から参照する方法」があることを知り、
さっそく試してみました。

外部から参照するので「Logicの部分」を外部参照用に書き換え、
「Logic.pys」として保存します。

#Logic.pys

PPG.Model_List.value = ""
PPG.Model_Name.value = ""

def Model_List_OnChanged():
	App = Application
	oRoot = App.ActiveSceneRoot
	PPG.Model_Name.value = ""
def Model_Name_OnChanged():
	PPG.Model_List.value = ""


def CreateModel_OnClicked():
	App = Application
	oRoot = App.ActiveSceneRoot
	oSel = App.Selection
	oModel_List = str(oRoot.FindChildren("*","#model","",0).GetAsText()).split(",")
	oModel_List.sort()

	if oSel.Count > 0:
		if len(oModel_List) > 0 and str(PPG.Model_List.value) != "":

			oModel = oRoot.FindChildren(oModel_List[int(PPG.Model_List.value)],"#model","",0)
			oModel[0].AddChild(oSel)
			PPG.Close()

		elif str(PPG.Model_Name) == "":
			LogMessage("Not Mark RadioButton or Not Input ModelName!!")

		if PPG.Model_Name.value != "":
			oModel = oRoot.FindChildren(str(PPG.Model_Name.value),"#model","",0)

			if str(PPG.Model_Name.value) != str(oModel.GetAsText()):
				oRoot.AddModel(oSel,PPG.Model_Name.value)
			
			else:
				oModel[0].AddChild(oSel)
			PPG.Close()		
	else:
		LogMessage("Not Select Obj!!")

次にメイン部分のスクリプトを「main.pys」として保存します。

#main.pys

from win32com.client import constants as c

App = Application;oRoot = App.ActiveSceneRoot
Logic_Path = "C:\\"

#パラメータの設定関数 引数 : なし 戻り値 : カスタムプロパティ
def fParm_Set():
	oProp = XSIFactory.CreateObject( "CustomProperty" )
	oProp.Name = "CreateModel_Tool"
	oProp.AddParameter3( "Model_List" , c.siString , "Model" )
	oProp.AddParameter3( "Model_Name" , c.siString , "" )
	return oProp


#レイアウトを設定する関数 引数 : カスタムプロパティ 戻り値 : レイアウト後のカスタムプロパティ
def fLayout_Set(CP_Parms):
	oLayout = CP_Parms.PPGLayout

	#モデルがシーン上に存在するかどうか検索
	oChildren = oRoot.FindChildren("*","#model","",0)
	if oChildren.Count > 0:	#モデルが存在したらUIにラジオボタンを追加する
		oModel_List = oChildren.GetAsText().split(",")
		oModel_List.sort()

		for oModel_Cnt in range(oChildren.Count):
			oModel_List.insert(oModel_Cnt * 2 + 1 ,oModel_Cnt)

		oLayout.AddEnumControl("Model_List",oModel_List,"Scene_ModelList","Radio")

	oLayout.AddItem("Model_Name","New_Model_Name") #新規モデル名を入力するテキストボックスを追加


	oLayout.AddButton("CreateModel","Run") #ボタンを追加

	oLayout.Language = "Python"
	oLayout.SetAttribute("LogicFile" , Logic_Path + "Logic.pys") #PPGLayout.Logicを外部から参照
	return CP_Parms


#メイン関数
def main():
	oProp = fLayout_Set(fParm_Set())
	App.InspectObj(oProp , "" , oProp.Name , c.siFollow , 0)


#処理
main()

「main.pys」を実行すると前回と同じ処理結果になります。

oLayout.SetAttribute("LogicFile" , Logic_Path + "Logic.pys")

上記の処理が外部参照の部分になります。

PPGLayout.SetAttribute PPGLayout.SetAttribute("LogicFile" , 外部参照するスクリプトのパス)

というように記述すれば、外部参照が可能です。

これによって処理が小分けになって見やすくなったり、
スクリプトエディタによっては、文字列、コメント、コマンドごとに
色分けされるので見やすくなると思います。
ちなみに前回、Logic部分は全て文字列の判定だったため、
Logic以下は同じ色になってしまい、とても見にくかったです・・・(=_=;)

Logicの外部参照については以上になります。

昔、自分が書いたスクリプトのほとんどは一つのファイルにドサッと
書いてあるので、機会があれば、今回のように整理していきたいなと思います。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2012/02/logic-a7ab.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« リミテッドアニメーションの功罪 | トップページ | 観劇!激見!! »

モーションデザイナー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217647/53975035

この記事へのトラックバック一覧です: Logicは外:

« リミテッドアニメーションの功罪 | トップページ | 観劇!激見!! »