前回の記事、「Elefrontを使用して属性情報を扱う(Part1 : モデリング / 属性情報を持たせたBake)」で属性情報を持たせて、RhinocerosにBakeを行いました。今回は、Bakeしたモデルから属性情報を取得し、単品図をおこしていきます。前回作成しBakeしたモデルをしようしますので準備したうえで臨んでいただければと思います。また、ソースコードはGithubにプッシュしてますので、完成コードをみながら行いたい方はこちらからダウンロードしてください。
目次
概要

上画像がPart2のプログラム全体像です。各ブロックごとに説明していこうと思います。
Rhinocerosからモデル取得しID順に並べ替え

※データツリーの操作がメインになってきます。PanelコンポーネントでTree構造を確認しながら理解して進めていただければと思います。
- ReferencebyLayerコンポーネントで指定したレイヤに含まれるオブジェクトを取得します。前回panelというレイヤにBakeしたので、panelという文字列を接続し、前回Bakeしたサーフェイスを取得します。
- 取得したパネルから属性情報を取得します。GetUserValueコンポーネントで指定したKeyの属性情報を取得します。前回、PanelNameというKeyにIDを格納したので、panelNameという文字列を接続し、IDを取得します。
- IDは「P0-0, P0-1,.....P0-9,P1-0....P49-9」といった感じで付与しておりました、まずは取得したオブジェクトをID順に成形していきたいと思います。TextSplitコンポーネントで「P-」を指定し、IDの番号部分を取得します。
- List Itemコンポーネントで0番目IDの最初の数字 「P0-1でいうと0の部分」、1番目からハイフン以降の数字を取得します。
- Sort Duplication Valuesコンポーネントで最初の数字のダブりを削除します。0~49までが格納されたリストが取得できるかと思います。このリストをSortListコンポーネントで昇順に並べ替えます。
- MemberIndexコンポーネントで先ほどのList Itemコンポーネントの0番目で取得したIDの最初の数字のリストをFlattenしてMemberIndexコンポーネントで0~49の数字と一致するインデックス番号を取得します。ここで得たIndex番号をReverseすることで、サーフェイスのインデックス番号をP0-0...P49-9といった感じで並び変わりました。
- List Itemコンポーネントで先ほど取得したパネルサーフェイをMemberIndexコンポーネントで取得した並び替えたインデックス番号で、並び替えます。わかりにくいかもしれませんが、これでパネルがP0-0...P49-9といった感じで昇順に並び変わりました。
属性情報を取得

- ID順に並べ替えたサーフェイスから属性情報を取得します。前回設定した情報は、「パネルの頂点P1,P2,P3, パネルの面積area, パネルのID panelName」。
- GetUserValueコンポーネントでそれぞれの属性を取得します。
- IDに関しては、先ほど取得し、Index番号をID順に並べ替えたので、List Itemコンポーネントで並べ替えたIDのリストを取得します。
単品図を配置する位置を設定

- ここでパネルの単品図を配置する位置を生成していきます。今回パネルは10枚×50列で500枚あります。10枚1組(ex : P0-0~P0-9)で図面を作成していきますので、5×2=10を5組、これを10列作っています。詳細は割愛します。
パネルXY平面に再配置

- SurfaceコンポーネントでID順に並べ替えたパネルを取得してきます。
- AreaコンポーネントとPlaneOriginコンポーネントでパネルの法線方向のベクトルを取得します。
- 前項で生成したパネルを再配置する平面位置をUnflattenTreeコンポーネントでツリー構造を合わせます。
- OrientコンポーネントでSourceを取得した法線ベクトル、Targetをツリー構造を合わせた再配置する位置を接続し、XY平面上にパネルごとに再配置します。
図面枠の作成

- 適当に図面枠を作成します。10パネルごとにグループ化したので、今回は簡易的に10個のパネルを囲う四角形を生成しています。(※図面枠適当ですみません・・・)詳細は割愛します。
寸法線を作図

- SurfaceコンポーネントでID順に並べ替えたパネルを取得します。
- Discontinuityコンポーネントで三角形の頂点を取得します。
- List Itemコンポーネントで三角形の3つの頂点それぞれを取得します。
- DefineLinerDimensionコンポーネントで寸法線を入れていきます。P1、P2には3つの頂点のそれぞれの組み合わせで接続していきます。Offset端子にエッジからのオフセット距離を指定します。
- 入力端子DimensionStyleには、ValueListコンポーネントでRhinoceros上で設定している注釈スタイルを指定します。

- Mergeコンポーネントで生成した寸法線のリストをマージしておきます。
属性情報も記載

- xy平面に再配置した際のパネルの再配置位置(unflattenTreeコンポーネントの出力端子)から再配置位置を取得し、そこからーy方向に下がった位置にIDと面積を記載していきます。
- Dataコンポーネントで面積の属性情報を取得してきます。面積は小数点第一位まで表示したいので、ExpressionコンポーネントでRoundしていきます。
- Concatenateコンポーネントでmm2を語尾につけ、DefineTextObjectコンポーネントでテキストオブジェクトを生成します。
- 続いてIDを取得してきます。こちらもDefineTextObjectコンポーネントでテキストオブジェクトを生成します。
生成した図面のBake


- 単品図をRhinoceros上にBakeできるようにしておきます。
- DefineLayerコンポーネントでレイヤ名を、DefineObjectAttributesコンポーネントに定義したレイヤ名を接続し、BakeObjectsコンポーネントに接続します。BakeNameはそれぞれ一意の名前を接続します。
図面ごとにグループ化

- 使うかわかりませんが、とりあえず図面ごとにグループ化しておきます。
完成

以上になります。データツリーの操作がメインになりました。Panelコンポーネント等で、データの中身をしっかり確認しながら進めていただければと思います。特に、並べ替えの処理などで失敗すると、オブジェクトと属性情報が不整合を起こしたりすると厄介です。しっかり確認しながら進めていただければと思います。Part1でも述べましたが、Syntegrate Japanさんのブログを参考にしております。実務的な記事がたくさん書かれており非常に参考になりますので、ご興味ある方は以下にリンクを張っておきますのでのぞいてみてはいかがでしょうか。
【参考文献】
- 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を読み込んで利用する