いかがお過ごしでしょうか? あっついですね~
今日は絶好の引きこもり日和です。
今回もMODOの記事です。
ちょっとテクニカルなので、興味の無い方はスルーでお願いいたします。
MODO901から、Win/MacでPySideが利用できるようになり、スクリプト開発の選択肢が広がりました。
ただし、注意点が有ります。
まず、PySideで実装したコードを、そのまま「スクリプトの実行」で実行することは出来ません。
私も勘違いしていたのですが、サポート担当の方に確認したところ、
スクリプト実行においては、「Fire & Forget」タイプのスクリプト(ざっくりいうと非同期)は
実行できないとの事です。
イベントループでデッドロックが起こり、フリーズすると思われます。なるほど。
では、どうすればPySideを利用できるか?
それは、「カスタムビューポート」を使うとの事です。
これは、ビューポート(※)をカスタマイズする機能で、Win/Macでは、MODO901の新機能です。
つまり、自作したビューポートの上に、PySide製のGUIを配置するわけです。
※ビューポート:MODOの画面を構成するフレームのこと。
3Dビューポートだけでなく、アイテムリストやシェーダーツリーなどもそうです。
ヘルプの「ビューポートってなに?」を参照
以上!
……と言いたい所ですが、
上記のサイトは、MODOでのキット開発に慣れている人向けの記述のようで、
他にもいくつか手順が必要です。
なので、以下にまとめておきますね。
手順1. PySideスクリプトを作成する。
今回は例として、アバウト画面を表示した後、
”Congratulations!”とポップアップを表示するサンプルを作成してみます。
コードは以下。続いて、内容を順に説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#python import lx import lxifc import PySide from PySide.QtGui import * # Sample class inherited from lxifc.CustomView class PySideSample(lxifc.CustomView): # implement this method. def customview_Init(self, pane): if pane == None: return False custPane = lx.object.CustomPane(pane) if custPane.test() == False: return False # get the parent object parent = custPane.GetParent() # get PySide QWidget from parent object p = lx.getQWidget(parent) # Check that it suceeds if p == None: return False # implement PySide code layout = PySide.QtGui.QVBoxLayout() button = QPushButton("Show [About MODO]") f = button.font() f.setPointSize(30) button.setFont(f) button.clicked.connect(self.onClicked) layout.addWidget(button) layout.setContentsMargins(2,2,2,2) p.setLayout(layout) return True # Slot def onClicked(self): lx.eval("app.about") messageBox = PySide.QtGui.QMessageBox() messageBox.setText("Congratulations!") messageBox.exec_() lx.out("finished.") lx.bless(PySideSample, "PySide Sample") |
■1~5行目:
lxに加え、lxifcとPysideをインポートします。
■8行目:
”lxifc.CustomView”クラスを派生し、カスタムビューポート用のサンプルクラスを定義します。
これが本体です。
■11行目:
customview_Init()関数をオーバーライド実装します。
■12~28行目:
この部分は、お決まりで良いと思います。
paneが渡ってくるので、その親オブジェクトから、GUI部品を配置するWidgetを用意します。
■30~43行目:
PySideを使った実処理。
「Show [About MODO]」という名前のボタンに、
スロット(onClicked:クリックされた時の処理)を割り当てて配置。
最後にTrue(初期化正常終了)を返却します。
■46~53行目:
前述のボタンがクリックされた時の処理。
アバウト画面の表示と、ポップアップ表示と、「Finished」というログの表示を行います。
■55行目:
上記のクラスを”PySide Sample”という名前でPython serverに伝えます。
コードは以上です。
手順2. ユーザスクリプトフォルダの”lxserv”フォルダに格納する。
カスタムビューポートは、Python serverとして起動する必要が有ります。
ユーザスクリプトフォルダに、”lxserv”という名前のフォルダを(無ければ)作成し、
手順1.で作ったスクリプトを保存します。
ファイル名は、かならずクラス名と一致させます。
今回の場合は、「PySideSample.py」となります。
場所は、「システム」メニューの「ユーザスクリプトフォルダを開く」で確認できますが、
通常は、以下です。
■Windows:
C:\Users\(ユーザ名)\AppData\Roaming\Luxology\Scripts\lxserv\
■MacOS:
/Users/(ユーザ名)/Library/Application Support/Luxology/Scripts/lxserv/
このlxservフォルダ、キット開発のベテランにはお馴染みなのかもしれませんが、
私のようなニュービーが気づくには、ちょっと苦しかったです。
手順3. MODOを起動する。
MODOを起動すると、スクリプトがコンパイルされます。
エラーが無ければ、バイトコード(*.pyc)が出来るはず。
手順4. カスタムビューポートを表示する。
では、表示してみましょう。
適当なビューポート(アイテムリストなど)の「+」マークをクリックします。
続いて、「アプリケーション」→「カスタムビュー」を開くと、
先ほど作成したビューポート(“PySide Sample”)が出てくるはずです。
これを選びましょう。
下ようになれば成功です。
関係無いですが、901の新機能の「Script Editor」が同じところにいますね。
つまり、スクリプトエディタも、同様の方法で、カスタムビューポートで実装されているのが分かります。
(こちらは、MODOインストールフォルダの、\extra\scripts\lxservにいます。)
さて、ボタンを押してみましょう。
アバウト画面が表示され…
クリックして閉じると…
はい、おめでと~ございます。
手順は以上です。
オリジナルスクリプトをばりばりと作っていきましょう。
ここまで書きましたが、最後に、思ったことを述べておきます。
確かに出来る事は増え、UIもリッチになります。
しかし、この方式だと、結局ユーザーに手順2.~4.を強要してしまう事になるんですよね。
個人的には、PySideの機能そのものよりも、
いちいちユーザーがキット用に設定を変更する手間が省けるかもしれない、
という所にメリットを感じていました。
なので、これを積極的に使っていくかどうかは、ちょっと迷っている所です。
もちろん今後、自作ビューポートの提供が一般的になって、
この手順が当たり前になれば、どんどん使っていけそうです。
ではまた。