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

第11回「マリオネットネットワークの作り方」

ArchitectLandmarkSpotlightDesigner2021

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

前回マテリアルを集計するサンプルプログラムを作成しました。今回はこのサンプルの作り方を解説しながら、マリオネットネットワークを組む時の考え方やポイントをいくつかご紹介します。

前回作成したサンプルファイルを使用して説明します。

前回の解説講座で、図面上のマテリアルの体積を集計してグラフ化するサンプルを作成しました。ノード数が多いので複雑に見えますが、手順としてはいたってシンプルです。

    1. マテリアルの取得
    2. マテリアルの体積を取得
    3. マテリアルの種類ごとに体積を積算
    4. 積算した結果をグラフ化

ネットワークの全体を眺めてみると、黄色のノードが多く見られます。これらはデータフローカテゴリに属するノードで、数列の生成や並び替え、複製など、”データを整える”機能を持っています。データフローノードは各手順の間で出力データと入力データのデータ形式を整えてつなぐ重要な役割を担います。データフローは図形と違ってカタチのないものなので最初はとっつきにくいですが、使いこなせるようになるとマリオネットの表現の幅が大きく拡がります。

11-1. 仕様設計とコアノード

今回の大目標は「図面上のマテリアルの体積を集計してグラフ化する」です。

手順としては前述の通りマテリアルの取得〜グラフ化の4段階です。この段階でデータ形式など細かいところははっきり決める必要はありません。マリオネットのデータ形式は各ノードの入力条件に依存するためです。

ここでひとつ目のポイントです。各手順でコアとなるノードを1つ選定します。コアノードはその手順を実現できる機能を持っているかどうかを基準に選びます。実現できるノードが見つからない場合は手順そのものを見直す必要があります。

    1. マテリアルの取得 -> GetComponentMaterial
    2. マテリアルの体積を取得 -> GetMaterialVolume
    3. マテリアルの種類ごとに体積を積算 -> add list
    4. 積算した結果をグラフ化 -> Bar Chart

11-2. 最後の手順から始める

マリオネットでは各ノードで入力するべきデータの種類や形式が決まっているので、それにしたがって入力データを準備すればいつか必ず完成するという考え方です。左から右へというマリオネットのベースに逆らう方法ですが、左から順にやって最後の最後にデータの形式がどうしても合わないといったミスを防ぐことができます。

手順4「積算した結果をグラフ化」のコアノード”Bar Chart”からはじめます。

“Bar Chart”は棒グラフを作成するノードです。7つのパラメータの入力を受け付けます。

グラフの表示位置の情報はデフォルトを使用して、色の情報は任意のRGB値のリストを作成して入力します。

残りの3つのパラメータを次の通り準備します。

    • ラベル(listLabels) -> マテリアルの名前
    • 値(listData) -> 積算したマテリアルの体積
    • 凡例(listSeries) -> マテリアルの名前

“ForEachMaterial”ノードはマテリアル定義のハンドルの一覧を取得します。ハンドルから名前を取得してマテリアルの種類一覧を作成します。

マテリアルの種類一覧をラベルと凡例に入力します。”Pass”ノードは何も処理をせずに左から右へデータを流すノードです。ネットワークの整理に使用することができます。

値に入力するデータは各マテリアルの体積です。マテリアルの種類の数だけ積算したデータを準備します。

この時点では体積のデータがないので、ダミーデータを使ってグラフの結果を確認します。実数値”1″をマテリアルの種類の数だけ複製したデータ作ります。

ダミーデータを接続したらプログラムを実行して、グラフの結果を確認しながら書類の縮尺や文字サイズを調節します。

(文字が被っていますがよしとします。)

11-3. 2次元データの積算

マリオネットでは1本のワイヤーに複数の値が流れるため、リストのリストなど多次元のデータ形式を扱うことが難しいです。名前のリストや値のリストなど様々なデータを扱うことになりますが、ネットワークをうまくつなげるにはすべて1次元のデータで管理することが重要になります。

ここがマリオネットで一番難しいポイントになりますが、いくつかコツがあります。

今回はマテリアルの種類ごとに体積を積算したデータを作成します。

“addlist”は入力された値のリストを積算するノードです。”addlist”は1次元のリストにしか対応していないので「種類ごとに」という処理を表現できません。今回の「種類ごとの値のリスト」のように2次元のデータを1次元化する最も簡単な方法はワイヤーを分けることです。

マテリアルの種類ごとに拾ってきた体積のリストを入力データとして次のように処理します。

    1. “List Explode”で種類ごとに分解
    2. “addlist”でひとつの種類の体積のリストを積算
    3. “Ordered List”で積算の結果をリスト化

“List Explode”と”Ordered List”はリストの要素数(ポート数)の上限が決まっているので、これを超える場合はポートを増設する必要があります。今回はマテリアルの数が上限に達していないためデフォルトのまま使用します。

11-4. データ形式を考える

マリオネットで2次元のデータを作成する方法のひとつに”Collate”ノードを使用する方法があります。”Collate”ノードは1次元のリストを任意の要素数のリストに振り分けることができます。

少し分かりにくいですが、例えば9要素の1次元リストを、3要素の2次元リストに振り分ける場合、次のようになります。

このノードを使用することを想定してデータ形式を考えます。次の2点を条件にデータを作成します。

    1. マテリアルの種類ごとに体積のリスト作成する
    2. 種類ごとのリストの要素数が同じ
例えば次のようなイメージです。

要素数を同じにするために、すべての壁にすべての材料の入れ物を用意して0で埋めています。

これは2次元的な表現ですので、Collateに入力する1次元のデータは次のようになります。

このイメージを元にマリオネットでデータの入れ物を作成します。

“Objs by Crit”ノードは任意の条件に合致するオブジェクトを一覧で取得できます。条件に”図形の種類:壁”を指定して壁の一覧を取得します。

マテリアルの種類の数と、壁の数を掛け合わせてデータを作成します。”Get List Length”で数を数えながら、実数値0を”Repeat”ノードで複製します。

材料5種×壁数7で、要素数35の”0″の1次元のリストができました。試しにCollateノードを通してデバッグモードで確認すると、5×7の2次元のリストに変換されることが確認できます。

11-5. 構成要素の体積を取得する

データの入れ物が準備できたので、マテリアルの体積を取得してデータを埋めます。

今回は壁の構成要素のマテリアルの体積を取得します。図形に含まれるマテリアルの体積を取得する”GetMaterialVolume”ノードに、構成要素のマテリアルを取得する”GetComponentMaterial”ノードを接続します。

“GetComponentMaterial”では構成要素のハンドルを番号で取得するため、番号のリストを作成します。構成要素の数を取得する”Get Number of Components”ノードを使用して、次のように数列を作成します。

[1,2,3,...,構成要素の数]

例えば、構成要素が6つの場合は[1,2,3,4,5,6]となります。

“Series”ノードに、start:1、step:1、count:構成要素の数を入力します。

“GetComponentMaterial”の親オブジェクトには壁のハンドルを構成要素の数だけ複製して入力します。この複製によってGetComponentMaterialに入力されるデータ数のズレがなくなります。

同様にGetMaterialVolumeにも壁のハンドルを接続して体積を取得します。

体積の値を取得できたので、データの入れ物に埋めていきます。

Set Itemノードで要素の番号(index)を指定して代入しますが、データの入れ物が1次元のデータになっているので要素にアクセスするのに少し工夫が必要です。要素のindexは壁の番号(ID1)とマテリアルの種類の番号(ID2)から次のように計算します。

index = ID1 * マテリアルの種類の数 + ID2

掛け算のmulノードと足し算のaddノードを用いて式を作成します。

ID1は壁の番号です。壁の番号はindexノードを使って現在の壁がリストの何番目にあたるを調べます。壁の番号はRepeatを使って構成要素の数だけ複製してmulノードに入力します。

ID2についてはindexノードを使って現在のマテリアルがマテリアルの種類のリストのうち何番目に当たるかを調べます。

11-6. プログラムの実行

今回のサンプルでは各手順で同じデータを扱うため共有できるノードがいくつかあります。

ノードの数や共有の数が増えるとワイヤーが長くなる箇所が出てきます。可読性を上げるためにPassノードを間にうまく使いながらネットワークを整理しましょう。

今回のサンプルでは、あらかじめ図面上に配置した壁(マテリアル設定済み)を使用して集計を行います。壁が配置してあるレイヤをアクティブにして、プログラムを実行してください。

グラフが生成されて、使用されているマテリアルの体積が種類ごとにプロットされました。

11-7. まとめ

今回紹介したポイントをおさらいします。

    • コアノードを決める
    • ネットワークは右から左へ作る
    • データは1次元のリストで扱う
    • データの要素数を揃える

今回紹介したのは目的から方法を逆算する考え方ですが、目的がある程度決まっていたからこそ適用できる方法です。例えばアルゴリムデザインのように、方法をしっかり作り込むことで面白い結果を得るようなプログラムには合わないでしょう。

なかなか整理できずに手が付けられないというときに、とりあえず作り始める方法としては有用ですので是非参考にしてください。

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

Architect

Vectorworks Architect

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

Landmark

Vectorworks Landmark

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

Spotlight

Vectorworks Spotlight

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

Designer

Vectorworks Design Suite

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