AnyノードはPythonコードの短いプログラムを記述して実行できる特殊なノードです。Anyノードを使いこなすことができれば、マリオネットの活用の幅が大きく広がります。今回は、すぐに真似できるAnyノードの記述例をいくつか紹介します。
マリオネットでは600を超えるノードが標準で搭載されおり、作図したりデータを整理したり、Vectorworksを複雑にコントロールすることが可能です。ただ、マリオネットを使いこなしてくると、あれがない、これがない、とVectorworksでやりたいことのすべてに対応するのは難しいことに気がつきます。
マリオネットに搭載されているノードはスクリプト(VectorScriptまたはVectorworksPython)に用意されたAPIがベースになっています。
○ 動作 | ○ マリオネットノード | ○ スクリプトAPI |
柱状体を作図する | Extrude | BeginXtrd~EndXtrd |
ワークシートから値を取得する | Get Cell Value | GetWSCellValue |
オブジェクトのレコードを編集する | Set Record Field | SetRField |
ユーザーインターフェース(整数値の入力) | Integer Dialog | IntDialog |
VectorScriptに用意された関数の数は2000を超えます。数だけで比較するとマリオネットはVecterScriptやPythonでコーディングした場合の30%ほどの力しかないのです。
マリオネットではPythonで自作のノードを作成することができますので、標準のノードに対応がない関数を使ってコーディングしたオリジナルのノードを追加して、どんどん拡張することが可能です。
ただ、オリジナルノードの作成ではPythonのコードをそれなりの行数を書く必要があり、加えてマリオネット特有のノードの入力や出力の文法の理解も求められます。そのため初心者には敷居が高い作業となっています。
対してAnyノードはもう少し優しい手順で、自作のプログラムを実行することができます。
28-1. Anyノード
Anyノードはevalフィールドに記述されたPythonコードのプログラムを実行して、その結果を出力します。
evalフィールドには複雑なプログラムを詰め込むこともできますが、狭いフィールドへの入力のため1行程度の短いプログラムが想定されています。自作のノードと同じくPythonのコーディングが必要になりますが、1行ですので単語(API)を調べて貼り付ける程度の作業で動かすことができます。短いプログラムではできることは限られますが、うまく使えば十分に拡張できます。
Anyノードはマリオネット解説講座 第20回「おすすめノード10選」でも簡単に紹介していますが、今回はAnyノードの記述例についてもう少し詳しく解説していきます。
28-1-1. 数列の作成
マリオネットで自動化を考えた時、最も登場回数が多いのは数列を生成するプログラムでしょう。数列は、例えばSeriesノードを使用して、開始番号や要素の数など複数のノードを組み合わせて作成します。慣れると難しいプログラムではありませんが、頻出すると複数のノードを置くのが面倒になってきます。とりあえず1~10くらいの数列でテストしたい場合や、数列の中身が決まっている静的な場合、Anyノードが活用できます。
Anyノードのevalフィールドに数列を記述する場合、Pythonのリスト表現を利用します。数列に含めたい数字を[]で囲み、左から順番に書いていきます。各要素はカンマ「,」で区切ります。要素の数や、昇順降順など順番に制限はありません。
-
- 1~10
[1,2,3,4,5,6,7,8,9,10]
-
- 奇数
[1,3,5,7,9]
-
- 実数
[0,0.5,1.0,1.5,2.0]
-
- 負の数
[0,-1,-2,-3]
-
- 真偽交互
[0,1,0,1,0,1,0,1]
要素数の大きい数列はrangeを利用してまとめて作成できます。
-
- 0~99
list( range(100) )
-
- 1〜100
list( range(1,101) )
-
- 2~100 (2とび)
list( range(2,101,2) )
-
- 10~1
list( range(10,0,-1) )
28-1-2. メニューコマンド実行
スクリプトのAPI DoMenuTextByName を利用してメニューコマンドを直接呼び出すことができます。ビューメニューや加工メニューをマリオネットから操作できるようになります。
-
- 図形を分解
vs.DoMenuTextByName( 'Decompose' , 0 )
-
- シンボル解除
vs.DoMenuTextByName( 'Symbol to Group' , 0 )
-
- 斜め右から見る
vs.DoMenuTextByName( 'Standard Views' , 8 )
-
- 前から見る
vs.DoMenuTextByName( 'Standard Views' , 3 )
-
- レンダリング (仕上げRenderworks)
vs.DoMenuTextByName( 'RenderWorks Render Chunk' , 2 )
-
- 書類の保存
vs.DoMenuTextByName( 'Save' , 0 )
プログラムの開発には強制終了がつきもの。プログラムの中でファイルの保存を実行してしまえば心配無用です。
これ以外のメニューコマンド名はここから探すことができます。
28-1-3. ファイルパスの取得
ファイルオープンのダイアログボックスを開いて、GUIから選択したファイルのパスの文字列を取得することができます。
AnyノードのevalフィールドにスクリプトAPIの GetFile を入力してください。
vs.GetFile()
実行すると、ファイルを指定するGUIが表示されます。ファイルを選択してOKをクリックすると、ファイルのパスを取得してプログラムを続きから実行します。
例えば、指定したファイルの中身を文字列図形として図面に貼り付ける場合、次のように使用できます。
※manipulatefileノードは日本語を含むファイルに対応していません。manipulatefileノードの編集画面を開き、次の通り文字コード指定してご利用ください。
-
- UTF-8の場合
ファイルではなくフォルダを選んでパスを取得する場合は、スクリプトAPI GetFolder を入力します。
vs.GetFolder()
28-1-4. 図形のハンドルの取得
図形の編集は、図形のハンドルを取得するところから始まります。図形のハンドルはObjs By Critノードで条件を詳細に指定して取得することもできますが、Anyで手軽に取得しましょう。
-
- 一番前の図形
vs.FActLayer()
-
- 一番後ろの図形
vs.LActLayer()
-
- 選択されている図形のうち一番前の図形
vs.FSActLayer()
28-1-5. 環境設定
スクリプトのAPI SetPref や SetPrefInt を利用して、Vectorworksアプリケーションまたは書類の設定をマリオネットからコントロールできるようになります。
グリッド表示や単位の設定など、新しく書類を開くたびに必要だった環境構築の作業も簡単に自動化できるかもしれません。
-
- グリッドを表示しない
vs.SetPref( 35, False )
-
- 文字スタイルの設定 (イタリック)
vs.SetPrefReal( 58, 2 )
APIの先頭ををSetでなくGetとすれば現在の設定状況を取得することも可能です。
-
- 平面回転の角度
vs.GetPrefReal( 93 )
-
- 現在の単位記号
vs.GetPrefString( 154 )
環境設定に対応する番号とAPIはここで確認できます。
次回は、Anyノードと似た機能を持つfunctionノードを紹介します。functionノードはPythonのコードを実行できるノードです。
fnuctionノードは入力ポートを持っているため、変数を扱うことができます。Anyとfunctionを組みあわせて動的なプログラムを作成する例を解説します。
この機能を利用できる製品
Vectorworks Architect建築設計や内装、ディスプレイデザインに対応した先進的なBIM・インテリア設計支援機能、拡張機能、さらには豊富な建築向けのデータライブラリを搭載した建築/内装業界向け製品 |
|
Vectorworks Landmark地形モデルや多彩な植栽、灌水設備計画等に対応するランドスケープデザイン機能、さらには豊富な造園向けのデータライブラリを搭載した都市計画/造園業界向け製品 |
|
Vectorworks Spotlightステージプランニングやライティング計画に対応した先進的な舞台照明計画支援機能、さらには各種メーカー製のトラスや照明機材、音響機器等の豊富なデータライブラリを搭載したエンタテインメント業界向け製品 |
|
Vectorworks Design Suite専門分野別(建築設計/ディスプレイデザイン、ランドスケープデザイン、ステージデザイン&スポットライトプランニング)の設計支援機能、拡張機能、さらには豊富なデータライブラリを搭載した最上位の製品 |