株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • MotionBuilderのPythonスクリプトを始めたい方へ2(UI初級編)

MotionBuilderのPythonスクリプトを始めたい方へ2(UI初級編)

2015/6/1

Tag: ,

こんにちは、TD室の森本です。

前回から結構期間が経っていますが
MotionBuilder(以下MB)でPythonスクリプトをやってみたいという方に少しは役に立っているでしょうか?
簡単な処理のPythonスクリプトが使えるようになった次のステップとして
今回はMBで実装されているUIモジュールを使って簡単なUIを作ろうと思います

今回の紹介しているPythonスクリプトについてはMB2015で動作を確認しています
MBのバージョンによって若干クラス名が違うこともありますので
別バージョンで動作しない場合はエラー箇所のクラス名を確認して書き換えてください

まずは簡単なウィンドウをつくる

それでは始めますがまずは最初にMBのUIモジュールを読み込みます

from pyfbsdk_additions import*

ただし実際にはUIでボタンを押しりしたときにMB上でなにか動作させるために
通常のPythonモジュールも必要になってくるので

from pyfbsdk import*
from pyfbsdk_additions import*

となります

まずは単純にWindowを1つ出しましょう

from pyfbsdk import*
from pyfbsdk_additions import*

TestWindow=FBCreateUniqueTool("TestWindow")
ShowTool(TestWindow)

これをMB上のPythonEditorで実行するとTestWindowという名前のウィンドウができあがりました。
次はウィンドウにボタンを追加しますがここでUIの配置のやり方について以下のようなやり方があります。

①Regionを設定して配置していく方法

UIに対してRegion(領域)を設定してそのRegionに対して新たにUIを配置していく方法です

# *- coding: utf-8 -*-
from pyfbsdk import*
from pyfbsdk_additions import*

# Topウィンドウを作る
TestWindow=FBCreateUniqueTool("TestWindow")

# TopウィンドウにBtnLytという名前の領域を設定する
x = FBAddRegionParam(10, FBAttachType.kFBAttachNone, "")
y = FBAddRegionParam(20, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(50,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(30,FBAttachType.kFBAttachNone,"")
TestWindow.AddRegion("BtnLyt","BtnLyt", x, y, w, h)

# ボタンを作ってTopウィンドウのBtnLyt領域にボタンのUIを設定する
TestBtn=FBButton()
TestWindow.SetControl("BtnLyt",TestBtn)

# Topウィンドウ表示時のウィンドウサイズの指定
TestWindow.StartSizeX = 200
TestWindow.StartSizeY = 200

# Topウィンドウを表示
ShowTool(TestWindow)

以上のスクリプトを実行するとボタンが配置されたウィンドウが立ち上がります。
Topウィンドウに縦、横、高さ、幅を指定してRegionを設定してボタンを登録します。

RegionLayout 1

ここで縦、横などを指定するときにFBAttachType.kFBAttachNoneという記述がありますが
このAttachTypeを切り替えることで色々なRegionの指定ができます。
FBAttachType.kFBAttachNone 指定なし、数値がそのまま縦、横などの数値になる
FBAttachType.kFBAttachBottom 底からのアタッチ、数値が底からみた数値として配置される
FBAttachType.kFBAttachRight 右側からのアタッチ、数値が右側からみた数値として配置される
などがあります。
これらのFBAttachTypeを切り替えることでウィンドウのサイズを変更したときに変更に合わせて
UIの配置も変わる配置を作れます。

RegionLayout AttachType

②Layoutクラス(例:BoxLayout)を使用して配置していく方法

複数のUIを配置する際に一つ一つRegionを指定して配置するのが面倒な場合に
Layoutクラスを使用して簡単にUIを整列させた状態で並べることが出来ます。
ここでは縦方向に並べるLayoutであるFBVBoxLayoutについて説明します。

# *- coding: utf-8 -*-
from pyfbsdk import*
from pyfbsdk_additions import*

# Topウィンドウを作る
TestWindow=FBCreateUniqueTool("TestWindow")

# VBoxLayoutをつくってTopウィンドウに配置する
VBoxLyt=FBVBoxLayout()

x = FBAddRegionParam(0, FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0, FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight,"")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom,"")
TestWindow.AddRegion("VBoxLyt","VBoxLyt", x, y, w, h)
TestWindow.SetControl("VBoxLyt",VBoxLyt)

# ボタン(A)をつくってVBoxLayoutに登録する
ABtn=FBButton()
ABtn.Caption="A"
VBoxLyt.Add(ABtn,30)

# ボタン(B)をつくってVBoxLayoutに登録する
BBtn=FBButton()
BBtn.Caption="B"
VBoxLyt.Add(BBtn,50)

# Topレイアウトを表示
TestWindow.StartSizeX = 200
TestWindow.StartSizeY = 200
ShowTool(TestWindow)

上記スクリプトの記述では幅を指定して配置していますが
AddRelativeメソッドを使用することでBoxLayout内で設定された幅に合わせて
追加したUIの幅が調整されます
BoxLayout

今回は例としてFBVBoxLayoutを使用しましたが他にも横方向のFBHBoxLayoutやグリッド配置のFBGridLayout等があり
Layout関係のクラスの使い方はMB内のSampleスクリプトがあるのでそちらも参考にしてください

ボタンにイベントを追加

これでUIにボタンを配置することが出来ましたがこのままではボタンを押しても何も反応しません。
そこでボタンにイベントを追加していきましょう

最初のRegionを使って一つのボタンを配置したPythonスクリプトに
ボタンを押したときにメッセージボックスを出すイベントを追加します

# *- coding: utf-8 -*-
from pyfbsdk import*
from pyfbsdk_additions import*

# ボタンを押したときのイベント時に実行される関数の設定
def BtnOnClick(control,event):
    FBMessageBox("BtnClick!",control.Caption,"OK")

# Topウィンドウを作る
TestWindow=FBCreateUniqueTool("TestWindow")

# TopウィンドウにBtnLytという名前の領域を設定する
x = FBAddRegionParam(10, FBAttachType.kFBAttachNone, "")
y = FBAddRegionParam(20, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(50,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(30,FBAttachType.kFBAttachNone,"")
TestWindow.AddRegion("BtnLyt","BtnLyt", x, y, w, h)

# ボタンを作ってTopウィンドウのBtnLyt領域にボタンのUIを設定する
TestBtn=FBButton()
TestBtn.Caption="Test"
TestWindow.SetControl("BtnLyt",TestBtn)

# ボタンを押したときにイベント(BtnOnClickを実行)を設定
TestBtn.OnClick.Add(BtnOnClick)

# Topウィンドウ表示時のウィンドウサイズの指定
TestWindow.StartSizeX = 200
TestWindow.StartSizeY = 200

# Topウィンドウを表示
ShowTool(TestWindow)

上記スクリプトを実行して出来たUIでボタン押すとメッセージボックスがでてきます

25行目の
TestBtn.OnClick.Add(BtnOnClick)
でクリックした際にBtnOnClick関数が実行されるように設定しています

BtnOnClick関数に関しては6行目の
def BtnOnClick(control,event):
で設定していますが
UIのイベントに設定した関数はcontrolとeventの引数をもっています

controlに関してはイベントを起こすキーになったUIのオブジェクト
(ここではボタンを押すというイベントを設定した元のUIである「TestBtn(FBButtonクラス)」が格納されています)
eventにはイベント自体の内容が格納されています
イベントに関しては今回のボタンだと押すだけなので大して意味はないですが
例えばFBSpread(スプレッドシートのUI)を使ったイベントの場合はイベントの発生源の行や列の値をとったりできます)

今回はイベント発生時の内容として7行目の
FBMessageBox(“BtnClick!”,control.Caption,”OK”)
においてボタンを作ったときに付けたボタンの表示名(TestBtn.Caption=”Test”)を
ボタンを押した際にcontrol.Captionとして取り出して表示しています

実践的なスクリプトサンプル

ということで一通りUIでボタンをつくってイベントを設定するところまで説明しましたが
これらを使ってもう少し実践で使えるようなスクリプトを作ってみます


# *- coding: utf-8 -*-
from pyfbsdk import*
from pyfbsdk_additions import*

import os

# =========================================================
# スクリプト置いてあるフォルダー
ScriptFolder=r"C:\MBScript"
# =========================================================

# スクリプトリストの辞書をつくる(Key:スクリプトファイル名、Value:スクリプトファイルのPath)
dScriptList={}
for oFile in os.listdir(ScriptFolder):
    if oFile.endswith(".py"):
        dScriptList[oFile.replace(".py","")]=os.path.join(ScriptFolder,oFile)

# Event ===================================================
def ScriptBtnOnClick(control,event):
    # ボタンの表示名(スクリプト名)からスクリプトリストの辞書をつかってスクリプトファイルのパスを取得
    if control.Caption in dScriptList.keys():
        oScriptPath=dScriptList[control.Caption]
        # 取得したスクリプトファイルを実行
        FBApplication().ExecuteScript(oScriptPath)

# UI ======================================================

# Topウィンドウを作る
RootWindow=FBCreateUniqueTool("ScriptWindow")

# VBoxLayoutをつくってTopウィンドウに配置する
VBoxLyt=FBVBoxLayout()

x = FBAddRegionParam(0, FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0, FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight,"")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom,"")
RootWindow.AddRegion("VBoxLyt","VBoxLyt", x, y, w, h)
RootWindow.SetControl("VBoxLyt",VBoxLyt)

# スクリプト名のリストを辞書からつくってスクリプト名のボタンを並べる
lScriptList=dScriptList.keys()
lScriptList.sort()
for oScript in lScriptList:
    oUIBtn=FBButton()
    oUIBtn.Caption=oScript
    # 作ったボタンに押したときのイベントの設定を追加
    oUIBtn.OnClick.Add(ScriptBtnOnClick)
    VBoxLyt.AddRelative(oUIBtn)

# Topレイアウトを表示
RootWindow.StartSizeX = 100
RootWindow.StartSizeY = 300
ShowTool(RootWindow)

このスクリプトを実行すると
9行目に設定したアドレスの中にあるpythonファイルをボタン名にした
UIウィンドウが立ち上がってボタンを押すとPythonファイルが実行されます

スクリプトの中身としてはフォルダの中からPythonファイルのリストをつくって
先ほどの説明のFBVBoxLayout()を使用して縦にリストのボタンを並べています
また、ボタンを押した際にボタンの名前からスクリプトのパスを取得して実行するイベントが設定されています

自分用のスクリプト一覧のランチャー等の使い方ができるので使ってみてください

まとめ

今回は前回の初心者向けの続きとしてMotionBuilderでのUI初級編として簡単なUIの作り方を説明しましたが
単純に少しボタンを配置したUIがつくれるだけでも組み合わせてスクリプトの利便性があがります

MotionBuilderにも様々なサンプルUIが用意されているので中身を見てもらって
参考にすればより様々なタイプのUIが組めるようになると思います

また、PySide等を使用するとより高度なUIがつくれますので
さらに興味が出た方はそちらを調べるのもいいかもしれません

以前にでたPyQTのMotionBuilderの記事です
*MotionBuilder2012のGUIはQtで作られてるのにスクリプトでPyQtが使えないっておかしくね?
https://dftalk.jp/cp-bin/wordpress/?p=4018

UI以外の処理部分についても以前の記事も参考になるので是非どうぞ
*モーションビルダースクリプトTips
https://dftalk.jp/cp-bin/wordpress/?p=4700

*MotionBuilderでツールをより使ってもらうために
https://dftalk.jp/cp-bin/wordpress/?p=6539

*MotionBuilderをカスタマイズしよう
https://dftalk.jp/cp-bin/wordpress/?p=7339

*MotionBuilderでScript!!便利なコンストレインの活用術!!(初級編)
https://dftalk.jp/cp-bin/wordpress/?p=9135

*MotionBuilderのPythonスクリプトを始めたい方へ
https://dftalk.jp/cp-bin/wordpress/?p=12696

今回はこの辺りで、ではまた。

.

※免責事項※
本記事内で公開している全ての手法の有用性、安全性について、当方は一切の保証を与えるものではありません。
これらの手法を実施したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*