マリオネット解説講座

第5回「いいものは使おう、無いものは創ろう」

ArchitectLandmarkSpotlightDesigner

マリオネットには標準で多くのノードが搭載されていますが、目的のものがない場合もあります。そんなときは既存のノードをカスタマイズしちゃいましょう!

第4回「レイヤ追従型柱状体」でレイヤの高さを取得しましたが、2つのノードをつなげる必要がありました。

今回は、紫のLayer Popupをカスタマイズして、1つのノードでレイヤの高さを取得できるようにしてみます。

5-1. 標準のノードのソースを確認

5-1-1. ノードを配置

まずは、標準のノード「Layer Popup」を配置します。

マリオネットツールを選択し、ツールバーの選択中のノード入力関数初級にある「Layer Popup」をダブルクリックして選択します。

画面上の任意の場所でクリックしてノードを配置します。

5-2. ノードのソースを見る

配置されたノードが選択された状態で、オブジェクト情報パレットの形状タブにある編集をクリックします。

スクリプトエディタダイアログが開き、このノードのソースを見ることができます。

5-2. ソースの編集

5-2-1. ソースに書かれている内容

今回のノードは入力ポートがないものになりますが、書かれている内容はブロックごとに下図のようになっています。

5-2-2. スクリプトの参照部分

まず、スクリプトエディタの一番上にグレーで記載されている部分ですが、このノードが参照している大元のスクリプトを指しています。

#COMMAND;READONLYREFFILE;[VWLibDef]/Input/Basic\PopupLayers.py;

ノードをカスタマイズしたい場合は、参照しないようにする必要があるので、1行目を空白行にします。

5-2-3. 出力ポートを変更する

上記のオレンジの部分がノードの外見やポートの種類、説明などが記載されている部分です。

16〜18行目がレイヤのハンドルを返すようになっていますが、ここをレイヤの高さを返すように変更します。

現在は下記のようになっていますが、

#Output Ports
output = Marionette.PortOut('hLayer')
output.SetDescription('The handle to the selected layer.')

ここを下のように書き換えます。各行の先頭にTabを入力するようにしてください。

#Output Ports
output = Marionette.PortOut('nHeight')
output.SetDescription('レイヤの高さ')

スクリプトエディタを閉じてみると、出力ポートの名称が変わっているのを確認できます。

5-2-4. レイヤの高さを取得する

次に選択したレイヤの高さを取得してみます。
26〜27行目に記載されているのが、さまざまな処理をするブロックです。

#script
hLayer = vs.GetObject(layer)

現在はレイヤのハンドルを取得するだけですが、ここをレイヤの高さを取ってこれるように変更します。
現在の行の下に1行追記します。ここでも行頭のタブを忘れないようにしてください。

#script
hLayer = vs.GetObject(layer)
nHeight, nWallHeight = vs.GetLayerElevation(hLayer)

追加した1行で、レイヤの高さと壁の高さを取得できます。

5-2-5. 出力ポートに値を設定する

最後にレイヤの高さを出力ポートに設定します。
30〜31行目を下記のように変更します。

#outputs
self.Params.output.value = nHeight

これでノードの編集は終わりです。最後にデバッグをしてみましょう。

5-3. デバッグ

マリオネットツールを選択し、ツールバーの選択中のノードでデバッグDummy Endを選択します。

Layer Popupの右側に配置し、2つを接続します。

オブジェクト情報パレットでLayerを選択します。

マリオネットツールをデバッグモードに切り替え、接続線の上にカーソルを合わせて、接続線が赤く強調表示されたらクリックします。

マリオネット接続ワイヤの値ダイアログが表示され、レイヤの高さが出力されていることを確認できます。

このように、標準で搭載されているノードをカスタマイズすることで、効率的なノードに変更することができます。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください