無数のBlock同士の細かい位置ずれをRhino上でチェックする方法
留め金物の微小な位置ずれ
ファサードの案件で必ず出くわす、ファスナーと言われる留め金物があります。建築のファサード部材と鉄骨との接合部に用いられるもので、ファサード部材を固定するために使用されます。
シンテグレートではこのような細かい部材もモデリングしているのですが、毎回ものすごい数になってしまいます。

この金物、数が非常に多くなるのですが、手作業による修正を重ねていく中で意図せずズレてしまう場合があります。今回はそれをあぶり出す方法をご紹介しようと思います。
ファスナーとは
まず最初にファスナーの説明を簡単に。ファスナーは留め金物のことを指しますが、これひとつでは機能しません。これにブラケット、インサートなどがつく必要があります。今回はわかりやすいように下記のパーツで構成されたひとまとまりのセットをファスナーセットと呼ぶことにします。
- インサート
- ファスナー
- ブラケット
ライノファイル上ではインサート、ファスナー、ブラケットそれぞれがblockになっており、ファスナーセットはblockが3つ集まったものになっています。

今回チェックしようとしているのは下記のようなファスナーセットの中で一部のパーツの位置がずれてしまっているような類のエラーです。

ファスナーセット毎にIDを振る
今回はこのような感じで、ファサードがプレキャストコンクリートのパネルで分割されている状況を想定しました。

一枚のパネルに対して四箇所で固定しています。ここでまずファスナーセット毎にIDをつけましょう。ファスナーセット01か02は気にせず、ファスナーセットひとまとまりに対してグループをつくるイメージでKey/Valueを振っていきます。

- Key: ファスナーセットID
- Value: yymmdd_xxxxxx_XX_xxxx
Valueには他と被らないようなランダムな数字が入るよう設定しています。

ライノ上でモデルを選択してこのようにKey/Valueが入っていればOKです。
全体モデルからファスナーの組み合わせを各種一つずつ取り出す
今回ファスナーの組み合わせは二種類なので、全体モデルから各セット一つずつピックアップして保存します。これを”REF.3dm”として、インサート、ファスナー、ブラケットの相対位置関係の基準とします。参照用ですね。その他のものは”CHECK.3dm”として別の3dmファイルに分けます。
ここからの作業は”REF.3dm”にあるファスナーセットの位置関係と異なるものを”CHECK.3dm”の中から炙り出す作業になります。

ファスナーセットのパーツ同士の相対距離をリストに書き出す
続いてレファレンス用とチェック用、それぞれの情報をリストに書き出します。ファスナーセットはブラケットを親として、インサート、ファスナーは親ブラケットからの距離を測っています。
こちらがそのスクリプトです。
レファレンス用リストを作成の際は”REF.3dm”を開いてからスクリプトを走らせます。この際に立ち上がるポップアップウィンドウで”Ref_List”を選択してください。同様の工程をチェック用リストでも行います。

こちらが書き出されたリストです。
GUID/ block名/ ブラケットからの距離/ GUID/ block名/ ブラケットからの距離/ GUID/ block名/ ブラケットからの距離
となっています。


リストの比較でエラーをあぶり出す
先程のリストで相対距離とともにGUIDも取り出しておいたので、基準と距離の数値が違うものがあればそのGUIDをはき出すようにしています。
こちらがそのスクリプト。
今回サンプル用にわざと動かしたものが7箇所でしたがすべて拾えていました。

このチェックでは0.1mm以下の誤差でも拾っていますが、どの程度まで見るべきかは状況次第です。また、下の絵を見てもらうとわかるように、1mm以上のズレでもぱっと見わかりません。斜め壁のファスナーなどは特に見つけにくくなります。


まとめ
ファスナーの位置チェック、どうだったでしょうか。私たちのワークフローでは、普通はこのようなパネルのモデリングや配置にはGrasshopperを活用します。そのため、仮にエラーがあったとしても、内容が「全部5mmずれてしまっている」などすべて同じになるので、対象のオブジェクトを選択したり、修正が多少は容易にできます。
しかし、状況によっては手作業でのデータ修正が必要な場合もあります。こんなときに生じたエラーは内容もまちまちになり、状況を把握するのが困難になります。こういった場合の対応策として、まずエラーをゼロにするのは不可能と割り切り、ミスが起こることを考慮した上でそれをどこかで拾える仕組みやチェック体制を考える方が有効です。
今回のケースでも、1万を超える数のファスナーたちをどうチェックするか方法を考えたとき、チェックを目視で行うのは無理なので何かしらの工夫が必要です。この場合はファスナーセットIDを仕込んでおくというのがキーポイントで、関係するもの同士はこうしたKey/Valueで紐づけができるように予め準備しておくことが大切です。後できっと、いや絶対何かの役に立つときがきます。
最後に
ファスナー配置のような作業ではblockをうまく使うことが肝だと思いますが、その際にはblockの持つmatrixの情報がとても便利です(matrixとはblockの元の位置から現在の位置までの移動・回転などの情報が入っている行列です)。他にもblockのうまい使い方などあれば教えてください。
あと私はスクリプトは初心者レベルです、とりあえず動けばよいというレベルなので優しい気持ちで見てみてください。あと、変な箇所等あれば指摘してもらえるとうれしいです。
(編注: 現在リファクタリングの真っ最中です)
ではまた。
サンプルファイルもこちらに挙げておきます。試してみたい方はどうぞ。