マリオネット・スクリプト解説講座

第29回「functionノードの使い方」

ArchitectLandmarkSpotlightDesigner2022

この記事は【2022年8月30日】に公開されたもので、2年以上経過しています。
記事の内容が古くなっていたり、新機能の追加・機能の改善が図られていることがあります。

前回解説したAnyノードと似た機能を持つfunctionノードをご紹介します。functionノードはAnyと同様にPythonコードの短いプログラムを記述することができます。今回はAnyとfunctionノードの違いと、その活用方法について解説いたします。

functionノードは四則演算や三角関数など演算を想定したノードです。Pythonの文法で計算式を記入できるもので、その仕組みはAnyとほとんど同じものになります。functionのAnyとの違いは、数学に特化したmathモジュールが使用できる点と、xポートから入力された変数xを計算式に利用することができる点です。変数が扱えるということは、つまり動的なプログラムを実行することができます。

29-1. 数学的処理

まずはfunctionノードが属するカテゴリの通り数学的な演算に使用する方法を解説します。functionノードの f(x) フィールドには、変数xに使用した演算式を記述します。

xの関数の方程式で右辺だけをフィールドに入力するイメージで使用します。例えば、

「f(x) = 2*x+1」

の式を実行する場合には、

「2*x+1」

をf(x)フィールドに入力します。

加算:

x + 1

減算:

x - 1

乗算:

x * 2

徐算:

x / 2

余り:

x % 2

べき乗:

x ** 2

平方根:

math.sqrt( x )

三角関数:

math.sin( x )
math.cos( x )
math.tan( x )

演算の使用例として2次関数のグラフを作図するプログラムを示します。今回は次の式で示す通り、傾きが1で切片が1の2次関数を計算します。

y = x2+1

Anyノードでxの範囲を定義する変数のリストを作成して、functionに入力します。Anyノードでは「-2 < x < 2」 の範囲を0.1刻みで変化する数列を、次のコードで生成しています。

list( num * 0.1 for num in range(-20, 21) )

functionには2次関数の式を入力します。

x**2+1

yの値とxの値を合わせて座標化し、Polygon 2Dノードに入力します。

実行すると式の通り傾きが1で切片が1の2次関数のグラフが描画されます。

29-2. 次の図形、前の図形

次は、数字でなく図形のハンドルを変数xとして利用する記述例です。変数xの型は数値に限りません。ハンドルや文字列も入力可能です。

スクリプトAPI NextObj は図形の重なり順のうち、入力された図形の次の図形を取得する関数です。このAPIを使用して次のように記述できます。

vs.NextObj( x )

これを利用して、Anyノードにvs.FActLayer()で取得した最前の図形を起点に、NextObjで順繰りに図形を取得することができます。

※FActLayerやNextObjのAPIでの「最前」とは、画面上では最も奥の図形です。NextObjでいう「次」は画面上1つ手前の図形になります。

画面上の手前から奥に向かって図形を取得する場合は、LActLayerとPrevObjのスクリプトAPIを使用します。

vs.LActLayer()
vs.PrevObj( x )

29-3. 動的な数列作成

Anyノードで数列を生成する場合、数の範囲が決まっている静的な数列しか作成できませんでした。fnctionノードでは入力されたデータの値や数に応じて、動的に数列を作成することができます。

データの総数をxとして「1,2,..,データの総数」の数列を作成する場合には次のように記述します。

list( range(1,x+1) )

lenを使用することで、データ数を取得するGet List Lengthノードを省略することもできます。

list( range(1,len(x)+1) )

例として、行数が可変なデータファイルをワークシートに読み込むプログラムを作成します。敷地の測点番号と座標の値がカンマ区切りで入力されているデータを使用します。

Anyノードを使用してファイルを開きます。ファイル選択ダイアログを開いてファイルパスを生成する仕組みです。

vs.GetFile()

Manipulate Fileノードでは行ごとに読み込むように設定します。

ワークシートのセルの番号を設定しています。

Get List Lengthノードから繋いだfunctionは、読み込んだファイルの行数で作成した数列です。ワークシートの行番号に対応します。

list( range(1,x+1) )

左中央のfunctionでは、カンマのある箇所で文字列を分解して、1行に含まれる項目数を取得します。

len(x.split(','))

この次につながるfunctionは1行に含まれる項目数で作成した数列です。ワークシートの列番号に対応します。

list( range(1,x+1) )

最後にMix2ノードのCycleモードで、行と列の数を組み合わせてセルの番地を作ります。

ここでは、あらかじめ大きめのサイズ(行数、列数)で作成したワークシートを使用します。

ワークシートにはカンマで区切った文字をセルに入力します。

29-4. オブジェクトのプロパティ設定

オブジェクトのハンドルを変数xとして利用し、オブジェクトのパラメータの番号を指定して設定をコントロールします。

専用のノードが用意されていないプラグインオブジェクトの設定も、取得と再設定ができるようになるかもしれません。設定可能な項目とその番号についてはスクリプトリファレンスAppendixを参照してください。

整数値や真偽値、文字列などプロパティの設定値の種類によって記述するAPIを使い分けます。

取得 設定
整数値 GetObjectVariableInt

GetObjectVariableLongInt

SetObjectVariableInt

SetObjectVariableLongInt

実数値 GetObjectVariableReal SetObjectVariableReal
座標値 GetObjectVariablePoint SetObjectVariablePoint
真偽値 GetObjectVariableBoolean SetObjectVariableBoolean
文字列 GetObjectVariableString SetObjectVariableString
ハンドル GetObjectVariableHandle SetObjectVariableHandle

いくつか記述例を示します。

寸法線(x)の文字を常に内側に表示するかどうか(True or False)の取得

GetObjectVariableBoolean( x, 3 )

シンボルの挿入位置を壁の面に設定

SetObjectVariableInt( x, 125, 1 )

入力されたビューポート(x)のレンダリングを陰線消去に設定

SetObjectVariableInt( x, 1001, 6 )

指定した名前のビューポートのレンダリング種類を入力した番号(x)の設定に変更

SetObjectVariableInt( vs.GetObject('ビューポートの名前'), 1001, x )

この機能を利用できる製品

Architect

Vectorworks Architect

建築設計や内装、ディスプレイデザインに対応した先進的なBIM・インテリア設計支援機能、拡張機能、さらには豊富な建築向けのデータライブラリを搭載した建築/内装業界向け製品
詳細情報 購入ページ

Landmark

Vectorworks Landmark

地形モデルや多彩な植栽、灌水設備計画等に対応するランドスケープデザイン機能、さらには豊富な造園向けのデータライブラリを搭載した都市計画/造園業界向け製品
詳細情報 購入ページ

Spotlight

Vectorworks Spotlight

ステージプランニングやライティング計画に対応した先進的な舞台照明計画支援機能、さらには各種メーカー製のトラスや照明機材、音響機器等の豊富なデータライブラリを搭載したエンタテインメント業界向け製品
詳細情報 購入ページ

Designer

Vectorworks Design Suite

専門分野別(建築設計/ディスプレイデザイン、ランドスケープデザイン、ステージデザイン&スポットライトプランニング)の設計支援機能、拡張機能、さらには豊富なデータライブラリを搭載した最上位の製品
詳細情報 購入ページ