前回の記事で属性情報を持たせて、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 さんのブログを参考にしております。実務的な記事がたくさん書かれており非常に参考になりますので、ご興味ある方は以下にリンクを張っておきますのでのぞいてみてはいかがでしょうか。
【参考文献】