今回はマリオネットを使用して、領域内に図形を敷き詰めるプログラムを作成します。座席のレイアウトやタイルの敷き詰めでの活用方法を解説します。
図形の敷き詰めは、座席の配置やタイルの敷き詰めなど様々な場面で使われますが、決められた領域内に図形を綺麗に収めることを考えると、
-
- どこを基準に並べらたら良いか
- 部材はいくつ必要か
- はみ出す部分はどうするか
などなど、頭を悩ませるポイントが多いです。
手作業で配列複製などを駆使しながら綺麗に並べた後に、タイルの大きさが変更になったり、座席ブロック間の通路幅が変更になったりして、最初からやり直し、、、泣きたくなります。
-
- 図形を並べてブロック化
- 図形サイズの可変化
- 図形のブロックを領域内に収める
これらの処理を記憶して、レイアウトのやり直しを前提とした試行錯誤できるプログラムを作りましょう。
この図形の敷き詰めは、実はプログラミングの分野としても課題の多い問題です。今回は、簡単のため並べる図形を四角形に限定してプログラムを作っていきます。
48-1. 四角形の配列
まずは、サイズ、数を指定して四角形を行列状に並べるプログラムです。配列複製コマンドで実施していることを、プログラムで再現します。
Seriesノードでx列とy列の0始まりの数列を作成します。ここでは説明のため、x方向に4列、y方向に3列の簡単な数列を作成します。
Mix2ノードでxとyの組み合わせのパターンを作成します。
x-y配列の中での番地をすべて洗い出すことができました。
この番地のリストに四角形のサイズをかけ合わせることで、それぞれの四角形の左下隅の座標のリストを作成することができます。
ここまでは(0,0)を基準に配列を作成しています。基準位置を設定する場合は、座標のリストに基準となる座標を加算します。
作成した座標のリストをCreate Rectangleノードに入力して、それぞれの番地に四角形を作成します。
四角形を並べるプログラムが完成しました。入力する列数やサイズを変更すれば、生成される四角形のブロックも変わります。
作成したプログラムは、後で使いやすいようにラッパーノードに変換しておきましょう。紫色の入力値のノードはPassノードに置き換えて外に出しておきます。
48-2. 内外判定エンジン
次に、プログラムのコアとなる、領域内に図形が収まっているかどうかを判定するエンジンを作っていきます。
今回は「四角形の四隅の頂点が全て領域内に収まっていれば、その四角形は領域内に収まっていると判定する」という仕様でプログラムを作ります。
まずGet Bounding Boxノードを使用して、四角形の四隅の座標を取得します。確認用に「A」の名前を設定した四角形のハンドルを対象に作業します。
Get Bounding Boxノードは図形のバウンダリングボックスの左上と右下の座標を取得します。バウンダリングボックスは図形を囲む最小の四角形です。
左上と右下の座標を組み換えて、左下と右上の座標を作成します。
ここで、確認用に四角形を収める図形を多角形で作成し、名前に「B」を設定します。
Bのハンドルと四角形の4隅の座標をIs In or On Polyノードに入力し、座標がBの内側に入っているかどうかそれぞれ判定します。
「4点が全て収まっている」の条件を満たすのは、4つのIs In or On Polyノードの結果が全てTrueの時です。andノードを3つ使用して、4つ全てTrueとなるかどうか判定します。
デバッグモードで動作を確認します。AがBに収まっているとき、Trueです。
AがBの外にある時、Falseです。
AがBの一部分だけが重なるとき、Falseです。
※ 一見これで良さそうですが、Aの頂点がBの辺と重なる時、コンピュータの誤差によってTrueとFalseで判定が揺れる場合があります。これを回避するには許容誤差等を設定してあげる必要がありますが、プログラムが複雑になるため今回は回避せずに進めます。
許容誤差の設定を追加したラッパーノードを含むサンプルファイルをユーザーフォーラムにて公開しています。
判定プログラムもラッパーノードに変換します。
名前Aの四角形を削除して、入力する四角形のデータを1.で生成した四角形のブロックに変更します。
四角形のブロックはx:0〜3600、y:0〜1515の範囲で生成される設定にしてあります。領域から少しはみ出すようにBの位置調整してプログラムを実行すると、1つ目の四角形はFalse(はみ出す)、2〜8つ目の四角形はTrue(収まる)のように四角形ごとに内外を確認することができます。
48-3. データの可視化
図形の敷き詰めでは多数の図形を扱います。領域内に収まる図形はどれだけあるのか、パッと分かると効率的に検討できますね。内外判定エンジンの結果を利用して、データの可視化を行います。
領域内の図形は緑に、領域外の図形は赤にカラーリングする
内外判定エンジンの結果をFilterノードに入力して、元の四角形のハンドルをTrueとFalseに分別します。Attributeノードを使用して、Trueのハンドルは緑に、Falseのハンドルには赤を設定して、どちらも不透明度を50%くらいにします。
プログラムを実行すると、四角形が色分けされ内外の判定が一目瞭然となりました。
四角形の数を数えて、図面上に文字図形として表示する
領域内つまり緑の図形はいくつあるのか調べるには、内外判定エンジンの結果から、Trueのデータに対してGet List Lengthノードを使用してデータ数を取得します。
データの数の数値をCreate Textノードを使用して文字列図形として図面上に表示します。文字図形の位置は領域Bの中心としておきます。
48-4. オブジェクト化
作成したプログラムをオブジェクト化して、サイズや列数をパラメトリックに試行錯誤できるようにします。
オブジェクトのパラメータとして扱いたいノードに名前を設定します。
-
- 四角形の幅:w
- 四角形の高さ:h
- x方向の列数:xnum
- y方向の列数:ynum
配置基準はControl Point 2Dノードに置き換えて、コントロールポイントで変更できるようにします。内外判定に使用する領域はコントロールジオメトリに置き換えます。
コンテキストメニューから「マリオネットネットワークをラップする」を選択してラッパーノードに変換し、ラッパーノードと配置可能領域とする多角形(or曲線)を同時に選択し、コンテキストメニューから「オブジェクトノードに変換」を選択します。
マリオネットオブジェクトに変換されました。配置の基準はコントロールポイントで変更できます。
四角形のサイズや列数のパラメータがオブジェクト情報パレットに表示され、パラメータを変更するとオブジェクトに反映されます。
内外判定に使用する領域(コントロールジオメトリ)は変形ツールから修正することができます。
48-5. 領域外の図形の非表示
赤く表現しているのは領域外と判定された図形です。オブジェクトに「領域外の図形を非表示」のパラメータを追加して、領域外の図形の表示/非表示を切り替えられるようにしましょう。スクリプトの編集画面に入り、プログラムを修正します。
Boolノードで「領域外の図形を非表示」のチェックボックスを作成します。その結果と赤い図形のハンドルをValveノードに入力し、BoolノードがTrue、つまり「領域外の図形を非表示」のチェックがONのときのみ、Deleteノードが実行されるように設定します。
チェックがOFFのとき、赤い図形が表示されます。
チェックがONのとき、赤い図形が非表示となります。
48-6. 座席のレイアウト
作成したマリオネットオブジェクトを座席のレイアウトに活用してみましょう。並べたそれぞれの四角形の位置に、座席のシンボルを配置するようにプログラムを変更します。
領域内に収まる四角形を対象に、Get Bounding Boxノードを使用して四角形の左下の座標を抽出します。
四角形の左下を基準にInsert Symbolノードでシンボルを挿入します。ここでは「イベント 椅子 2」のシンボルを配置します。
「イベント 椅子 2」シンボルでは椅子の背もたれの中心が挿入点となっていますので、四角形に収まるように挿入位置と角度を調整します。
挿入位置の座標の指定には、Control Point 2Dノードを使用するとコントロールポイントで調整できるので便利です。
「イベント 椅子 2」のシンボルが四角形上に配置されます。
コントロールポイントは一つ目(左下)の四角形の位置を基準にシンボルの挿入点を設定します。代表となるシンボルに連動して全てのシンボルの位置が調整されます。
座席のブロックごとにオブジェクトを配置すれば、イベント会場全体の座席レイアウトも可能です。
※にてご利用いただける座席セクションレイアウトツールでは、より詳細な座席の設定が可能です。あわせてご活用ください。
48-7. タイルカーペットの敷き詰め
座席のレイアウトで変更した部分のプログラムは削除し、今度は、タイルカーペットの敷き詰め用にプログラムをカスタマイズします。領域からはみ出すタイルは、領域の枠に合わせて切り欠きします。
領域からはみ出す四角形は「内外判定エンジンで領域外と判定された四角形」のうち「四角形の4つの頂点のうち1つでも領域内に入っている図形」となります。
「内外判定エンジンで領域外と判定された四角形」については内外判定エンジンのFalseの結果が該当します。「四角形の4つの頂点のうち1つでも領域内に入っている図形」については新しく判定エンジンを作成します。
4点の内外判定するところは同じですので、内外判定エンジンの「RectInPoly」ラッパーノードを流用します。
はみ出しの判定では、次のように判定条件を表現できます。
-
- 1点目の頂点が領域の内側にある(True) または(or)
- 2点目の頂点が領域の内側にある(True) または(or)
- 3点目の頂点が領域の内側にある(True) または(or)
- 4点目の頂点が領域の内側にある(True)
流用したプログラムのandノードの部分をorノードに変更します。
ラッパーノードの名前は「OverlapPoly」とします。
「RectInPoly」ラッパーノードのFalseの結果を「OverlapPoly」ラッパーノードに入力します。
結果のTrueの図形は黄色に、Falseの図形は赤に設定します。
ここでスクリプトの編集画面を出て、動作を確認します。領域のラインと重なる図形は黄色に、領域の外にある図形は赤となっていれば成功です。
黄色にカラーリングした図形が、領域に収まるように切り欠きを実行します。黄色の図形と領域の図形をPlanar Booleanノードに入力し、図形の共通部分を残す「intersect」モードに設定します。
領域からはみ出す部分が削除され、タイルが加工された状態で表示されます。
最後に、黄色の図形(加工が必要なタイル)がいくつあるのか、こちらも可視化しましょう。
この設定では、領域内のタイルが17個、加工が必要なタイルが24個という情報が可視化されました。
今回の記事で使用したサンプルファイルはユーザーフォーラムからダウンロードしていただけます。
この機能を利用できる製品
Vectorworks Architect建築設計や内装、ディスプレイデザインに対応した先進的なBIM・インテリア設計支援機能、拡張機能、さらには豊富な建築向けのデータライブラリを搭載した建築/内装業界向け製品 |
|
Vectorworks Landmark地形モデルや多彩な植栽、灌水設備計画等に対応するランドスケープデザイン機能、さらには豊富な造園向けのデータライブラリを搭載した都市計画/造園業界向け製品 |
|
Vectorworks Spotlightステージプランニングやライティング計画に対応した先進的な舞台照明計画支援機能、さらには各種メーカー製のトラスや照明機材、音響機器等の豊富なデータライブラリを搭載したエンタテインメント業界向け製品 |
|
Vectorworks Design Suite専門分野別(建築設計/ディスプレイデザイン、ランドスケープデザイン、ステージデザイン&スポットライトプランニング)の設計支援機能、拡張機能、さらには豊富なデータライブラリを搭載した最上位の製品 |