2010年12月11日

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

MBのスクリプトを書く機会があったのでチュートリアルっぽいのを書いてみる。
一応書く予定は
ウインドウとかボタンやリストみたいなコントロールなどGUI
選択されているオブジェクトの取得
FCurveへのアクセスと修正
Relationコンストレインの追加
Storyのトラック、クリップの取得、修正、追加
Storyのショットトラックを参照してプレイブラストを作る


今回はウインドウの表示から基本的なレイアウトまで
たぶん一番簡単なウインドウの表示
# ライブラリのインポート
# pyfbsdkはSDKのコアでpyfbsdk_additionはGUI周りのヘルパー
from pyfbsdk import *
from pyfbsdk_additions import *

# FBToolオブジェクトを作る
tool = CreateUniqueTool('GUISample_01')
# ウインドウのサイズを決める
tool.StartSizeX = 300
tool.StartSizeY = 300
# ウインドウを表示する
ShowTool(tool)

300x300のウインドウが表示される
検証はしてないけど、グローバル変数を使っていると色々とトラブルが起きたりするので、グローバル変数を使わないように書き換える
from pyfbsdk import *
from pyfbsdk_additions import *

class MyTool :
def __init__(self, name, w, h) : # 初期化
self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h
def show(self) : # ウインドウの表示
ShowTool(self.tool)

# MyTooオブジェクトを作ると同時にshowメソッドを実行する
MyTool('GUISample', 300, 300).show()

ウインドウにボタンを追加する
from pyfbsdk import *
from pyfbsdk_additions import *

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

# コントロールを貼り付ける領域を設定する
# 親の座標系で X位置 10、Y位置 10、幅 60、高さ 20
x = FBAddRegionParam(10,FBAttachType.kFBAttachNone, "")
y = FBAddRegionParam(10,FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(60,FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(20,FBAttachType.kFBAttachNone, "")
self.tool.AddRegion('btn1','btn1', x, y, w, h)
btn = FBButton()
btn.Caption = 'Fix'
self.tool.SetControl('btn1', btn)

# 親の領域(この場合はウインドウ)の相対位置で領域設定
# 相対位置で設定すると親の領域の変化に追従するようになる
# 親の座標系で X位置 10、Y位置 40、幅 親の右端から-10まで、高さ 親の下端から-10まで
x = FBAddRegionParam(10,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(40,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(-10,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(-10,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('btn2','btn2', x, y, w, h)
btn = FBButton()
btn.Caption = 'Flex'
self.tool.SetControl('btn2', btn)
def show(self) :
ShowTool(self.tool)

MyTool('GUISample', 300, 300).show()

領域を設定して張り付けると指定した場所に貼り付けられるのは良いんだけど、コントロールが増えると正直面倒臭い。
なのでBoxLayoutを使ってコントロールを配置する
from pyfbsdk import *
from pyfbsdk_additions import *

class MyTool :
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)
# VBoxLayoutは上から順にコントロールを並べる
self.mainLayout = VBoxLayout()
self.tool.SetControl('mainLayout', self.mainLayout)

btn = FBButton()
btn.Caption = 'button1'
# 高さ20でボタンを配置
self.mainLayout.Add(btn, 20)
btn = FBButton()
btn.Caption = 'button2'
# 高さを割合で設定して配置
self.mainLayout.AddRelative(btn, 1)
btn = FBButton()
btn.Caption = 'button3'
self.mainLayout.Add(btn, 20)
btn = FBButton()
btn.Caption = 'button4'
self.mainLayout.AddRelative(btn, 3)
# HBoxLayoutは左から順にコントロールを並べる
hbox = HBoxLayout()
self.mainLayout.Add(hbox, 30)
btn = FBButton()
btn.Caption = 'button5'
# 幅を割合で設定して配置
hbox.AddRelative(btn, 1)
btn = FBButton()
btn.Caption = 'button6'
# 幅50でボタンを配置
hbox.Add(btn, 50)
btn = FBButton()
btn.Caption = 'button7'
hbox.AddRelative(btn, 1)
def show(self) :
ShowTool(self.tool)

MyTool('GUISample', 300, 300).show()

レイアウトは入れ子にしてもOK
あとGridLayoutってのもあるけどあまり使いどころが無いと思うので書かない
最後にタブコントロール。FBTabPanelから継承されてるのでヘルプはコッチを見たほうがいいかも
from pyfbsdk import *
from pyfbsdk_additions import *

class MyTool :
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)
self.mainLayout = TabControl()
self.tool.SetControl('mainLayout', self.mainLayout)

layout = VBoxLayout()
self.mainLayout.Add('tab1', layout)
btn = FBButton()
btn.Caption = 'button1'
layout.AddRelative(btn)
layout = VBoxLayout()
self.mainLayout.Add('tab2', layout)
memo = FBMemo()
memo.Text = 'memo'
layout.AddRelative(memo)
self.mainLayout.SetContent(0)
def show(self) :
ShowTool(self.tool)

MyTool('GUISample', 300, 300).show()


つづく

どうでもいいけどコレでPythonのコードをHTMLに変換してるよ
posted by ika at 15:05 | Comment(8) | TrackBack(0) | MotionBuilder | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
うぉおお!!ショットトラックを参照してプレイブラストを作成に超期待してます!
Posted by pochi at 2010年12月16日 11:06
AlignAxis.pyが消えています
再公開をお願いします。
Posted by nonaka at 2010年12月16日 15:44
nonakaさん

Pythonスクリプトが全滅っぽいです。
時間のある時に直しておきます。

とりあえずAlignAxis.pyはSkyDriveの方にアップしました。

http://cid-8ccd39ed28f8f8de.office.live.com/self.aspx/XSI%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/AlignAxis.py
Posted by ika336 at 2010年12月18日 16:54
pochiさん

やっぱりMBのプレイブラスト絡みは不満が多そうですね。
バッチレンダリングは出来ないけど、クリップを指定してレンダリングする物は出来てるのでFCurveの前にそっちにしようかな
Posted by ika336 at 2010年12月18日 17:01
スイマセン。超初歩的な質問なんですがどうやってスクリプト実行すればいんでしょうか?一番簡単なウインドウの表示すら出来ません・・・
MBのPythonEditorにコピーペーストしてExcute Activ Work Areaをクリックでは駄目なのでしょうか。
環境はMB2010 windowsXp64bit
Pythonは最新の「python-3.1.3.amd64.msi」をインストールしてみました。
Posted by pochi at 2010年12月21日 01:44
pochiさん

そのやり方でいいはずなんですが、エラーとか出ていますか?
Posted by ika336 at 2010年12月21日 18:40
こちらから質問してたのに返信遅れてすいません。
PythonEditorには以下の部分をコピーペーストして実行してみました。

# ライブラリのインポート# pyfbsdkはSDKのコアでpyfbsdk_additionはGUI周りのヘルパーfrom pyfbsdk import *from pyfbsdk_additions import *# FBToolオブジェクトを作るtool = CreateUniqueTool('GUISample_01')# ウインドウのサイズを決めるtool.StartSizeX = 300tool.StartSizeY = 300# ウインドウを表示するShowTool(tool)

MBのPythonEditor上では以下の警告が表示されました。
File "C:/test_001.py", line 1
SyntaxError: Non-ASCII character '\x83' in file C:/test_001.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Posted by pochi at 2010年12月26日 22:54
pochiさん

日本語がNGでした。
コメントを足してからテストしてませんでした。スミマセン。
日本語を削除すると動くようになると思います。
Posted by ika at 2011年01月01日 18:33
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

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