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

第16回「クラス・レイヤ作成の自動化」

ArchitectLandmarkSpotlightDesigner2021

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

マリオネットでは図形だけでなく、クラスやレイヤなど作業環境をコントロールすることができます。クラス・レイヤを操作するノードの簡単な使い方を解説します。

Vectorworksで意外と時間をとられるのが作業環境の構築です。たくさんのクラス・レイヤをドキュメント毎にオーガナイザでチクチク作成するのは手間がかかります。テンプレート機能を使用すれば任意のクラス・レイヤ設定がされた状態で作業を始めることができますが、例えば作業の途中にまとまったクラス・レイヤを追加するといった場合に、効率的よく作成することができれば作業時間を短縮できます。

サンプルファイルダウンロード

16-1. クラスを作成するノード

Marionette Default Libraray > クラス > 設定系関数-クラス

「Name Class」ノードは入力された名前でクラスを作成します。名前が重複しないように注意する必要があります。

シンプルなネットワーク

1. 「String」ノードに次の名前を設定します:テストクラス

2. 「Name Class」ノードに「String」の結果を入力します。

3. プログラムを実行します。

4. クラス「テストクラス」が作成されています。

16-2. レイヤを作成するノード

Marionette Default Libraray > レイヤ > 基本

「Layer」ノードは入力された名前でレイヤを作成します。既に存在するレイヤの名前が入力された場合は、新しく作成することなくレイヤのハンドルだけを出力します。

シンプルなネットワーク

1. 「String」ノードに次の名前を設定します:テストレイヤ

2. 「Layer」ノードに「String」の結果を入力します。

3. プログラムを実行します。

4. レイヤ「テストレイヤ」が作成されています。

 

16-3. クラスをワークシートから自動作成

クラスの名前と、階層構造の情報をワークシートから取得して、クラスを自動的に作成するスクリプトを作成します。次の書式でクラスの情報を記載したワークシートをあらかじめ用意します。

ワークシート名:クラス一覧

16-3-1. ワークシートから情報を取得する

 

Marionette Default Libraray > ワークシート-データ

ワークシートから値を取得するには「Get Cell String」ノードを使用します。セルの行番号と列番号を指定して、セルに入力されている値を取得します。

最初に「Name」ノードにワークシート名「クラス一覧」を設定して、ハンドルを取得しておきましょう。

今回は、1行目から10行目までの各階層の名前のデータを取得します。

まずは行番号を作成します。「Series」ノードを使用して[1,2,3,…,10]の数列を作成します。

列番号も同様に「Series」ノードを使用して[1,2,3]の数列を作成します。

この数列をそのまま「Get Cell String」に入力といきたいところですが、今回の場合は上手くいきません。次の2点の性質があるためです。

    • 「「Get Cell String」ノードはRowのリストとColのリストの先頭から順に1つずつ組み合わせてセル番地とする」
    • 「ノードに入力された長さの異なる数列(リスト)は、長いほうに合うように補填される」

Rowに数列 [1,2,3,…,10] を、Colに数列[1,2,3]を入力した場合、 [1,2,3] の数列が補填され [1,2,3,3,3,3,3,3] として扱われ、セルの番地は次のようになります。

(row,col) = (1,1),(2,2),(3,3),(4,3),(5,3),(6,3),(7,3),(8,3),(9,3),(10,3)

今回のように、テーブル状のデータ隙間なく取得する場合「Mix2」ノードを使用して番地を作成します。

Marionette Default Libraray > データフロー

「Mix2」は2つのリストの組み合わせ方法を選択してデータ整形するノードです。list1に行番号のリストを、list2に列番号のリストを入力します。

「Mix2」ノードの”ListMatching”パラメータを「Cross Reference」に設定します。

「Cross Reference」ではすべての組み合わせのデータを作成します。結果は次のようになります。

(row,col) = (1,1),(1,2),(1,3),
       (2,1),(2,2),(2,3),
       (3,1),(3,2),(3,3),
       (4,1),(4,2),(4,3),
       (5,1),(5,2),(5,3),
       (6,1),(6,2),(6,3),
       (7,1),(7,2),(7,3),
       (8,1),(8,2),(8,3),
       (9,1),(9,2),(9,3),
       (10,1),(10,2),(10,3)

「Mix2」を通したあとに「Get Cell String」に入力して結果を確認しましょう。

問題なく取得できているようです。

このままだと3つの階層分のデータが1次元のリストに収まっているため扱いにくいです。「Cunk List」ノードを使用して行ごとのデータのかたまりに整形します。

見やすくなりました。

16-3-2. クラスの名前を作成する

Vectorowrksのクラスではクラス名の階層ごとの名前をハイフン “-” で繋ぐことで階層構造を表現します。

    • 例:「モデル-壁-断熱材」

ワークシートから取得したデータから上記のようなクラス名を作成していきます。

まずはデータの整理をします。「List Explode」ノードで1行ごとのデータに分解します。このノードは9個までのデータしか扱うことができないので、もうひとつ「List Explode」をつないで10個目のデータを取得します。

データによっては2階層までのものがあり、3階層目のデータが空の場合があります。フィルターノードを通過させて空のデータを削除しておきます。

「Same String」ノードに空白文字を設定して「文字列が空のとき」の論理式を作成します。欲しいデータは「文字列が空でないとき」なので、フィルターノードのFalse側の結果(listFitems)を受け取ります。

Marionette Default Libraray > 文字列関数

「Str」ノードは文字列のリストを連結するノードです。このノードはセパレータの文字を指定することができるので、簡単に階層の名前の間をハイフンで繋ぐことができます。階層の名前と「String」ノードでハイフン”-“を入力して結果を確認します。

クラスの名前ができました。

16-3-3. クラスを作成する

クラスの名前を「Name Class」ノードに入力します。

力技になりますがこれをすべてのデータに対して実行します。データの整理〜クラスの作成までの処理をラッピングして複製しましょう。

プログラムが完成したら実行して結果を確認しましょう。ワークシートに記述した通りにクラスが作成されました。

16-4. レイヤをワークシートから自動作成

同様の仕組みを使って、レイヤのの名前と高さの情報をワークシートから取得して、レイヤを自動的に作成するスクリプトを作成します。次のように名前と高さのシンプルな4行のデータが記述されたワークシートを用意します。

ワークシート名:レイヤ一覧

16-4-1. データを分けて取得する

ここでは「Get Cell String」ノードを2つ使用して「名前」と「高さ」のデータに分けて取得します。それぞれ行番号に[1,2,3,4]の数列と列番号を入力します。

レイヤ名と高さのデータを取得できました。

16-4-2. レイヤを作成する

1列目のデータを格納した「Get Cell String」の結果を「Layer」ノードに入力します。

入力できたら実行して確認します。ワークシートに記述したレイヤが作成されました。この時点では高さの情報は反映されていません。

プログラムでは上から順に処理するので、ワークシートの表示順とレイヤの重なり順が合いません。「Revese」ノードでリストの順番を逆転します。

先ほど作成したレイヤを削除して、再度実行します。ワークシートの記述した順序でレイヤが作成されました。

16-4-3. 高さを設定する

2列目のデータを格納した「Get Cell String」の結果を、まずは「Revese」ノードでリストの順番を逆転します。

このあと、レイヤの高さを設定するノードに入力したいのですが、標準搭載のノードには「任意のレイヤの高さを設定するノード」がないので作成します。

標準搭載されている「Set Z Values」ノードは、アクティブなレイヤの高さを設定するノードです。”アクティブなレイヤ” ではなく “任意のレイヤ” となるようにコードを書いてみましょう。

「Set Z Values」ノードの編集画面を開きます。

まずはおまじないです。「READONLYREFFILE」の記述が含まれる1行目削除します。この作業によって編集内容の保存が可能になります。

自作のノードであることが分かりやすいようにノードの名前を変更しておきましょう。

7行目

this = Marionette.Node( "Set Z Values" )
↓
this = Marionette.Node( "Set Layer Elevation" )

ノード内で使用している「SetZVals」関数を「SetLayerElevation」関数に置き換えます。「SetLayerElevation」関数ではレイヤのハンドルが必要になりますので、ポート増設して対応します。これを実現するため次のようにコードを修正します。

#Input Portsの下に追加

inobj = Marionette.PortIn( vs.Handle(0), 'inLayer' )
#inputsの下に追加

inobj = self.Params.inobj.value
#scriptの下を変更

vs.SetZVals(zVal, deltaZVal)

↓

vs.SetLayerElevation( inobj, zVal, deltaZVal )

すべて修正するとに次のようなコードになります。

修正できたら「OK」ボタンを選択して閉じます。「Set Layer Elevation」ノードができました。

「inLayer」ポートにレイヤのハンドルを、「nZVal」に高さのデータを入力します。

プログラムを実行してオーガナイザダイアログで結果を確認します。ワークシートの記述通りに高さが設定されました。

サンプルファイルダウンロード

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

Architect

Vectorworks Architect

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

Landmark

Vectorworks Landmark

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

Spotlight

Vectorworks Spotlight

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

Designer

Vectorworks Design Suite

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