今回は、プラグインElefrontを用いて、上画像の様な曲面に配置された三角形パネルに、属性情報を持たせ、最終的に単品図を起こすとこまでやっていきたいと思います。Elefrontのプラグインをインストールしてから臨んて頂ければと思います(こちらから)。今回の記事は2部に分けて書いていこうと思います。Part1ではモデリング~属性情報を持たせてRhinocerosにBakeするところまでを行います。Part2では、Part1でBakeしたものをGrasshopperに取りこみ、パネルの単品図をおこしていくところまでをやっていきます。
今回の記事は、Syntegrate Japanさんの記事を参考にさせていただきました。実務でどのようにGrasshopperを使用しているか、など、かなり勉強になる記事がたくさんあります。
是非、のぞいてみてください。⇒ Syntegrate Japan Blog
また、ソースコードはGithubにプッシュしてますので、完成コードをみながら行いたい方はこちらからダウンロードしてください。
目次
概要

上画像がPart1のプログラムの全体となっております。
各ブロックごとに説明していきたいと思います。
曲面を構成する基準線を作成

- Circleコンポ―ネントで半径3000mm, 1000mmの2つの円を生成します。
- Divideコンポーネントで生成した2つの円を50分割していきます。これらの分割点を波打たせていきます。
- List Lengthコンポーネントで分割点の数を取得します。
- Rangeコンポーネントで外円は360度×3=1080度、内円は360度×4=1440度を分割点の数で分割した角度を取得します。分割する角度を変更すれば、波の数が変わります。
- これらの角度からSine波を生成していきますが、Cull Indexコンポーネントでリストの分割した角度の最後の値(1080度と1440度)は不要なので削除します。その後Radiansコンポーネントでラジアン変換します。
- SineコンポーネントでSine波を取得します。
- Unit Zコンポーネントで取得したSine波をZ方向のベクトルに変換します。
- Sine波は-1~1までの値をとります。これらの値に振幅を掛けていきます。外円には500mm、内円には100mmの振幅をMultiplicationコンポーネントで掛けています。
- Moveコンポーネントで分割点をZ方向に移動させます。振幅を掛けたSine波を掛けることで波打つかと思います。
- Explode Treeコンポーネントでブランチごとにリストを取得します。外円の分割点と内円の分割点のリストがそれぞれ取得できるかと思いますので、Lineコンポーネントで外円と内円の分割点を直線で結びます。これらが基準線となってきます。
三角形パネルを生成

- Divideコンポーネントで先ほど生成した直線を分割します。今回は5分割しています。
- 取得した分割点P1、ShiftListコンポーネントでリストをずらしたP2、Relativeコンポーネントでブランチを1つずらしたP3、ブランチをずらしたものをShift Listコンポーネントでリストを1つずらしたP4を生成します。
- 4Point Surfaceコンポーネントで3点をから三角形サーフェイスを生成します。P1,P2,P3を頂点とする三角形、P3,P4,P2を頂点とする三角形を生成します。
- Mergeコンポーネントで生成した三角形のリストを結合しSimplifyしときます。CleanTreeコンポーネントでNullを削除し、リスト内の不要な値を削除します。
三角形パネルを納めるフレームの生成

(今回はフレームに属性情報を持たせたり、図面化はしないので適当に作ってます。スキップ可能です。)
- Curveコンポーネントで先ほど生成した三角形パネルのエッジを取得します。
- OffsetCurveコンポーネントで取得したポリラインを内側に10mmオフセットします。
- Boundary Surfaceコンポーネントでオフセット前と後の2曲線の間にサーフェイスを生成します。
- Mesh Brepコンポーネントで生成したサーフェイスをメッシュ化します。
- Combine & Cleanコンポーネントでメッシュを結合・分割数を減らします。
- プラグインWeaver BirdのWeaverbird's Mesh Thicknessコンポーネントで厚みを持たせます。 (※WeaverBirdのインストールはこちらから )
パネルの生成

- 先ほどオフセットしたポリラインにSurfaceコンポーネントを接続し、三角形サーフェイスを生成します。
- Areaコンポーネントで生成したサーフェイスの中心点を取得し、PlaneOriginコンポーネントで法線方向のベクトルを取得します。
- 法線方向のベクトルのリストをListItemコンポーネントに接続し、接続先でFlattenし、リストの最初の法線ベクトルを取得します。
- FlipPlaneコンポーネントで、すべての法線方向を合わせていきます。
- Moveコンポーネントでサーフェイスをフレームの中心に移動させるため、法線方向のベクトルをAmplitudeコンポーネント10mm移動させます。
- Extrudeコンポーネントで移動させたサーフェイスを法線方向のベクトルで5mm押し出します。
パネルにIDを振る

- TreeStaticsコンポーネントでパネルのTree構造のPathを取得します。現状、Pathは{0;0}{0;1}....{1;0}...{49;9}といった感じで、0~49までのブランチに更に0~9までのブランチが枝分かれしているかと思います。直線と直線の間が50あり、その中に10枚パネルが含まれることになします。
- TextSplitコンポーネントでPathを{;}でスプリットすることで、Pathの数字部分のみを取得します。
- ListItemコンポーネントで1番目から0~49までの数字が取得でき、2番目からそこから更に枝分かれした0~9までの値が取得できます。ConcatenateコンポーネントでP-(0 ~49)-(0~9)といったIDを振っていきます。P0-0, P0-1,....P49-9といった感じでIDを生成しました。
- 前項でAreaコンポーネントで取得したパネルのセンターのツリー構造を参照し、UnflattenTreeコンポーネントでTree構造を合わせておきます。
- Text TagコンポーネントでパネルのセンターにIDを配置していきます。
パネル面積 / 頂点を取得

- 今回はパネルの頂点と面積を属性情報として入れていこうと思います。Deconstruct BrepコンポーネントでExtrudeして生成したパネルの面を取得します。
- Areaコンポーネントでパネルを分割したサーフェイスの面積を取得し、SortListコンポーネントで面積でSortすることで、面積をKeyとしてサーフェイスを昇順に並べ替えます。Reverseして降順にリストを並べ替ええ、List Itemコンポーネントの0番目を取得して、最も大きな面を取得します。
- Discontinuityコンポーネントで取得した三角形サーフェイスの頂点を取得しList Itemコンポーネントでの0番目、1番目、2番目を取得することでそれぞれの頂点のリストを取得します。
- Areaコンポーネントで面積も取得します。
属性情報を付与してBake

- Mergeコンポーネントで属性情報をまとめていきます。D1にID(PanelName)、D2にarea(パネル面積)、D3に頂点P1、D4にP2、D5にP3を格納します。(※Tree構造を合わせてマージすることに注意してください。)
- Elefrontを使用していきます。Define Object Attributesコンポーネントでオブジェクトに持たせる属性情報を定義していきます。KeyにPanelName(ID), area, P1,P2,P3の文字列を接続し、Valueは先ほどMergeしたAttributesを接続します。[]LにBakeするさいのLayer名を接続します。Define LayerコンポーネントでPanelというレイヤを定義し、接続します。
- BakeObjectsコンポーネントでベイクするオブジェクトを接続します。今回は押出しではなく、三角形サーフェイスをBakeしていきます。Attributesに先ほど定義した属性情報を接続します。BakeNameはpanelBakeという名前にしておきます、これを設定しておくことで、Bake後に値が変更になり再度Bakeしなおした場合に、前回のBakeを自動的に削除してくれます。Buttonコンポーネントを接続し、このButtonを押せばBakeされます。
Part1完成

- Bakeしたオブジェクトを選択し、属性情報が格納されていることがか確認できていればOKです。

- また、値を変更し再度Bakeしなおすことも可能です。
Part1は以上になります。Part2ではこの属性情報を持たせてBakeしたものを新たにGrasshopperに取り込み、パネルの単品図をおこしていきます。同じGrasshopperのファイルで作業してもいいのですが、処理も重くなって来たりメンバー間での受け渡しなどを想定し、機能ごとにGrasshopperのファイルを分けてます。ご興味いただければ引き続きPart2を見ていただけると嬉しいです。以上
【参考文献】
- eleFront : https://docs.elefront.io/
- Syntegrate Japan Blog : Elefrontについて#1 -Elefrontで何ができるのか
- Syntegrate Japan Blog : Elefrontについて#2 -User Attributesとは
- Syntegrate Japan Blog : Elefrontについて#3 -Elefrontを用いた場合のワークフロー
- Syntegrate Japan Blog : Elefrontについて#4 -User AttributesをつけてBake
- Syntegrate Japan Blog : Elefrontについて#5 -User Attributesを読み込んで利用する