2010年12月18日

MotionBuilder スクリプトチュートリアル GUI編2

今回ボタンの使い方の例としてスクリプトランチャを作る
ボタンを押したら他のスクリプトを実行するヤツ
MBはスクリプトの実行が面倒くさいのでよく使うと思う

まずはボタンの使い方
ボタンを2つ付けて押すとそれぞれ「Script1」「Script2」とログに出すスクリプト

from pyfbsdk import *
from pyfbsdk_additions import *

class scriptLuncher() :
def __init__(self, name, w, h) :
self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h

x = FBAddRegionParam(0,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('mainLayout','mainLayout', x, y, w, h)

layout = VBoxLayout()
self.tool.SetControl('mainLayout', layout)

btn = FBButton()
btn.Caption = 'Script1'
btn.OnClick.Add(self.onClick1)
layout.Add(btn, 20)

btn = FBButton()
btn.Caption = 'Script2'
btn.OnClick.Add(self.onClick2)
layout.Add(btn, 20)
def show(self) :
ShowTool(self.tool)
def onClick1(self, ctl, event) :
print 'Script1'
def onClick2(self, ctl, event) :
print 'Script2'


scriptLuncher('MBScriptLuncher', 300, 280).show()



ボタンを押すと、OnClick.Add()で指定した関数が呼ばれる

2つ作ったので2つ関数が必要になる


が、2つ3つ程度ならコレでもいいけど10個とかになってくると面倒くさいし、動的にボタンを増やすとか出来ないのでどうにかする




from pyfbsdk import *
from pyfbsdk_additions import *

class CustomButton(FBButton) :
def __init__(self, scriptPath='') :
FBButton.__init__(self)
self.scriptPath = scriptPath


class scriptLuncher() :
def __init__(self, name, w, h) :
self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h

x = FBAddRegionParam(0,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('mainLayout','mainLayout', x, y, w, h)

layout = VBoxLayout()
self.tool.SetControl('mainLayout', layout)

for i in range(2) :
btn = CustomButton('Script' + str(i+1))
btn.Caption = 'Script' + str(i+1)
btn.OnClick.Add(self.onClick)
layout.Add(btn, 20)
def show(self) :
ShowTool(self.tool)
def onClick(self, ctl, event) :
print ctl.scriptPath



scriptLuncher('MBScriptLuncher', 300, 280).show()



FBButtonクラスを継承してCustomButtonクラスを作ってscriptPathってパラメータを追加した

次はコンフィグファイルを読み込んでボタンを追加していく


↓のようにキャプションとスクリプトのパスをセミコロンで区切ったリストを書いたテキストファイルを作って「MBScriptLuncher.cfg.txt」って名前で「MBのインストールフォルダ\bin\config\」に保存




Script1;Script1.py

Script2;Script2.py


・・・





from pyfbsdk import *
from pyfbsdk_additions import *
import os

class CustomButton(FBButton) :
def __init__(self, scriptPath='') :
FBButton.__init__(self)
self.scriptPath = scriptPath

class scriptLuncher() :
def __init__(self, name, w, h) :
self.cfgpath = os.path.normpath(os.path.join(FBSystem().ApplicationPath, '..\\config\\MBScriptLuncher.cfg.txt'))
self.scriptList = list()


self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h

x = FBAddRegionParam(0,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('mainLayout','mainLayout', x, y, w, h)

layout = VBoxLayout()
self.tool.SetControl('mainLayout', layout)

self.getScriptList()
for sl in self.scriptList :
btn = CustomButton(sl[1])
btn.Caption = sl[0]
btn.OnClick.Add(self.onClick)
layout.Add(btn, 20)

def show(self) :
ShowTool(self.tool)
def onClick(self, ctl, event) :
FBApplication().ExecuteScript(ctl.scriptPath)
def getScriptList(self) :
if not os.path.exists(self.cfgpath) :
return
f = open(self.cfgpath, 'rt')
while 1 :
buf = f.readline()
if '' == buf :
break
if '\n' == buf :
continue
self.scriptList.append(buf.replace('\n','').split(';'))
f.close()



scriptLuncher('MBScriptLuncher', 300, 280).show()



ここまでやると結構使えると思うけど、スクリプトファイルをドロップしてボタンが追加できると便利じゃね?




from pyfbsdk import *
from pyfbsdk_additions import *
import os
import re

class CustomButton(FBButton) :
def __init__(self, scriptPath='') :
FBButton.__init__(self)
self.scriptPath = scriptPath

class scriptLuncher() :
def __init__(self, name, w, h) :
self.cfgpath = os.path.normpath(os.path.join(FBSystem().ApplicationPath, '..\\config\\MBScriptLuncher.cfg.txt'))
self.scriptList = list()

self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h

x = FBAddRegionParam(0,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('mainLayout','mainLayout', x, y, w, h)

self.tool.OnShow.Add(self.onShow)

self.layout = VBoxLayout()
self.tool.SetControl('mainLayout', self.layout)

con = FBContainer()
con.OnDragAndDrop.Add(self.onDragDrop)
self.layout.Add(con, 20)


self.getScriptList()
for sl in self.scriptList :
btn = CustomButton(sl[1])
btn.Caption = sl[0]
btn.OnClick.Add(self.onClick)
self.layout.Add(btn, 20)
def show(self) :
ShowTool(self.tool)
def onClick(self, ctl, event) :
FBApplication().ExecuteScript(ctl.scriptPath)
def getScriptList(self) :
if not os.path.exists(self.cfgpath) :
return
f = open(self.cfgpath, 'rt')
while 1 :
buf = f.readline()
if '' == buf :
break
if '\n' == buf :
continue
self.scriptList.append(buf.replace('\n','').split(';'))
f.close()
def onShow(self, ctl, event) :
if False == event.Shown :
self.saveScriptList()
def saveScriptList(self) :
f = open(self.cfgpath, 'wt')
for sl in self.scriptList :
f.write('%s;%s\n'%(sl[0], sl[1]))
f.close()
def onDragDrop(self, ctl, event) :
if FBDragAndDropState.kFBDragAndDropDrop == event.State :
for c in event.Components :
path = c.LongName
if 'py' != path.split('.')[-1] :
continue
p = re.compile('Drive ([A-Z])(.*)')
m = p.match(path)
if None == m :
continue
path = m.group(1) + ':' + m.group(2)
name = path.split('\\')[-1].split('.')[0]
self.scriptList.append([name, path])
btn = CustomButton(path)
btn.Caption = name
btn.OnClick.Add(self.onClick)
self.layout.Add(btn, 20)



scriptLuncher('MBScriptLuncher', 300, 280).show()



ファイルのドロップを受け付けるコントロールが限られているのでFBContainerを使った

レイアウトにOnDragAndDropを付けてくれればいいのに


あと、折角追加したボタンがコンフィグファイルに保存されないのはアレなのでウインドウを閉じる時に保存するようにした



次回は選択されているオブジェクトを取得してFCurveをいじる

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。