2008/11/10

Softimage : Sukio Sukio Sukio Python - IV : UIの基本構造

今回で、4回目になりました。
スクリプティングは、毎回同じことをやらせるのにとても都合のいいものです。
寝ている間に、作業を終わらせることだって可能なのです。
物量が無ければ、ほとんど意味の無いものですけど。

さて、今回は、カスタムプロパティを使い、なんらかの動作をさせるボタンを作成してみましょう。

単純に、ボタンを押したら選択されているもののposXをパラメータの値に移動するというものを作ってみます。


from win32com.client import constants as c

LogicCode = """
def PosX_OnClicked():
    app = Application
    log = app.LogMessage
    fNmb = PPG.Number.Value
    app.Selection(0).Posx.Value = fNmb
    log(fNmb)
"""

app = Application
log = app.LogMessage

oPSet = app.ActiveSceneRoot.AddProperty(
    "CustomProperty",
    False,
    "ButtonTEST" )

oPSet.AddParameter2(
    "number",
    c.siDouble,
    0.0,
    -20.0, 20.0,
    -20.0, 20.0,
    c.siClassifUnknown,
    c.siPersistable | c.siAnimatable )

oLayout = oPSet.PPGLayout

oLayout.AddButton( "PosX" )
oLayout.AddItem( "Number" )

oLayout.Language = "Python"
oLayout.Logic = LogicCode

app.InspectObj( oPSet, "", "", c.siLock )


いささか難しいコードになってしまいますが、一番シンプルな形ではないでしょうか。
CMは、InspectObjのみとなってしまいますが、解説をいたします。

XSIでのUIのダイアログの事をPPG(Property Page)と呼びます。
PPGを作るには、3つの段階が必要になります。

1. 内部的に処理するパラメータを定義する。(AddParameter)
2. PPG内のレイアウトにどのような形で変数を表示させるか。(AddItem)
3. ボタン、チェックボックス、ドロップダウンボックス、などをユーザーが押したり値をいじったら何を実行するか。(Logic)

まず、必要なパラメータを準備しましょう。
AddPropertyで、カスタムプロパティを作成します。

oPSet = app.ActiveSceneRoot.AddProperty( "CustomProperty", False, "ButtonTEST" )

ActiveSceneRootは、XSIの"Scene_Root"モデルを意味します。
そこにプロパティ"ButtonTEST"を付けなさいという命令文です。
イコールで繋ぐと、oPSetには、カスタムプロパティが入ります。

次に、選択したもののposXを入れたいのですから、浮動小数点のタイプを用いたほうがいいでしょう。
AddParameter2で、変数を作成します。

oPSet.AddParameter2("number",c.siDouble,0.0,-20.0, 20.0,-20.0,20.0,c.siClassifUnknown,c.siPersistable | c.siAnimatable )

この変数名をnumberということにします。
第2引数は、タイプですから、c.siDoubleという浮動小数点の定数を入れます。
あとは、表示するバーのデフォルトの値、最大最小値、内部的な制限の最大最小値、パラメータの分類(多くはデフォルトでOKです)
c.siPersistableは、値を保存可能に、c.siAnimatableはこのパラメータ自体をアニメーション可能にします。
物凄くたくさんのオプションが存在するので、マニュアルを見て、いろいろ試してみましょう。

次に、レイアウトを決めます。
oLayout = oPSet.PPGLayout

カスタムプロパティには、PPGLayoutというメソッドが存在します。
コレを用いて、レイアウトにアクセスします。
レイアウトに表示させたいものは、Numberというパラメータバーと実行するボタンです。

oLayout.AddButton( "PosX" )
oLayout.AddItem( "Number" )

ボタンを作成するときは、AddParameter2を用いなくても大丈夫。
ボタンにパラメータは必要ありません。
ボタンの下に、numberというパラメーターバーを表示させます。

ここまで、実行して、出来たプロパティをつつけば、レイアウト通り出来ているはずです。
ただし、ボタンを押しても何も動きません。
動作させるには、Logicメソッドを用いて、PPGに仕組みを覚えさせなければいけません。
この形で仕組みを書くには、LogicコードをStringで渡してあげなくてはならないのです。

Stringを使う際、"(ダブルクォーテーション)または、'(シングルクォーテーション)でくくった形になります。
しかし、Pythonでは、インデントや改行などがあり、通常一行で書くにはとても辛い所です。
ですが、'''を使う事によって、書いた文面を見た目通りに変数に入れることが出来ます。


LogicCode = """
def PosX_OnClicked():
    app = Application
    log = app.LogMessage
    fNmb = PPG.Number.Value
    app.Selection(0).Posx.Value = fNmb
    log(fNmb)
"""


LogicCode変数は、'''から'''までというニュアンスです。この中の

fNmb = PPG.Number.Value

という部分。これは、PPGのNumberというパラメータの値を参照します。
fNmbという変数に入れています。(自分だけ分かればいいので、float Numberの略です)
Selection(0)は、一番初めに選択したものになります。
ちなみに、Selection(1)は、二番目に選択したものが入ります。

app.Selection(0).Posx.Value = fNmb

ここで、ポジションXの値をfNmbから受け取っています。
フルで書くと

Application.Selection(0).Kinematics.Local.Posx.Value = fNmb

となりますが、キネマティクスのローカルは、ショートカットがききます。

最後のCM

app.InspectObj( oPSet, '', '', c.siLock )

これは、カスタムプロパティを左クリックでつついたように表示するってコマンドです。
c.siLockは、ページをロックします。
他のオブジェクトをInspectしても表示を切り替えないようにするためです。

以上、PPGの作り方の解説でした。
少々分からないことだらけでしょうが、一個一個解析していけば、素晴らしいUIが完成すること間違いなしです。

ちなみに、この書き方の弱点は、保存して、次に開いたときにレイアウトが保存出来ないってところです。
今回の、ボタンとパラメータバーだけでは大丈夫ですが、コンボボックスやら、チェックボックス、FCurveエディター、などなど、豪華に作ったはいいが、消えてしまうのね~というのが開発者として、一回は通る道になっております。
それを回避するには、カスタムプロパティ自体をプラグインとして登録してあげるしかありません。
これは、マニュアルや他の人が作ったやり方を参照したほうが、覚えるのは早いでしょう。
幸い、CustomPropertyWizardという恐ろしく便利なプリセット作成ツールがあるので、それを使ってくださいね。

次回は、OMを使って、パラメータにアクセスする方法の見つけ方でもやりましょうか。

ではでは、ゴキゲンヨウ!

0 件のコメント:

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...