とうとうRhino.insideなるものがライノ7から標準搭載されるらしいなんて噂を聞きつけ早速触ってみようと思っているのです。
結構前からRhinoInsieのWIP(work in progress)版が出てたらしいですけど私は全く触ってませんでした。
世界ではBIMが主流になり、どうもREVITが強いように感じているわけですが、、、(賛否両論あるとは思いますけど)
RHINOがBIMの中で使えるようになったことでその流れが加速するのでは?
と思っているのは私だけでしょうか。
RHINOからREVIT、REVITからRHINOの互換性ができたことで、クレイジーな形を簡単に図面化し、管理できるようになったのではないか。
RHINO.INSIDEで具体的に何ができるようになったのか実際に触りつつ、考えていきたいと思っています。
目次
REVITのRhino.InsideでRHINOCEROSとGrasshopperが動く!
難しい話は置いておいて、簡単に言うとREVITの中でライノセラスとグラスホッパーが動くらしい!ということですね。
パラメーターを使って動的にレビットがいじれるのか?じゃぁDynamoってどうなるの?とか色々疑問に思ったりする訳です。
とりあえずメリットは何かというとそれはもちろん自由な形がREVIT内で直接作れるんじゃないか?ということですね。
レビットって結構堅いイメージがあるんですね、縦横縛りがきついというか、曲面とか苦手そうなイメージがあります。
例えば、ダイナモでアダプティブコンポーネントを作って曲面に取りつくパネルを作成するとします。
そうすると、何故か方立と無目がxyz方向にしか引き延ばせなくて、パネルに対して法線方向にExtrudeできなかったりとか起こってたんですね。
当時REVIT2015の頃の話なのでとっくの昔に解決していることなのかもしれませんが、そういうのが、ライノの機能でいろいろ解決するんじゃ?
という期待を持ってしまいますね。
ダイナモって結構ピッキーな(繊細な?)プラグインだと私は勝手に思っていて、カーブの種類も色々あって別々にハンドリングしないといけないとか、縛りが多いなって思っていたのですが、GHが入ったら全部カーブでOKになって一気に解決するんじゃないか?なんて思ってしまいます。
とりあえず試してみないことには推測だけで何も進まないので、触ってみます!
RhinoInsideをREVITに入れるための前提から立ち上げまで
▼ここのリンクから、ダウンロードできます!
とはいえ、まずライノWIPとREVIT2017~2020が必要と書いてあります。
そのプラットフォームを準備するだけで結構ハードル高いなって思いました。
要するにライノ6のライセンスを購入していて、かつ、REVITのサブスクリプションもあるという状況ですね。
ある程度デカいプロジェクトじゃないとお金が浮かないから使えないじゃないか、、、と思ったりしてしまいます。
さて、リンクからダウンロードしてきたファイルを開いて、インストールします。
インストールが終わって、REVITを立ち上げても一見何も変わってないように見えます。
建築テンプレートで新規プロジェクトを開きます。
REVITを立ち上げた時に上のバーのアドインにライノマークが追加されています。
このアイコンをクリックするとライノが使えそうなバーが出てきます。
さらに、ライノのアイコンをクリックするとライノが立ち上がりました!そして、コマンドラインにGrasshopperとタイプするとグラスホッパーも問題なく立ち上がります。
それでは、これからどのようにRhinocerosとGrasshopper、REVITが連携するのか実験していきたいと思います。
REVITとRhinoInsideを連携してみる
REVITとRHINOCEROSとGrasshopperが立ち上がったところですが。
で?次は??? ってなりますね。
特に変わったところはというと、Grasshopper側にRevit Primitivesのコンポーネントが追加されているのがまず一つ。
それから、REVITツールバーが増えています。
ライノ6で使っているコンポーネントはそのまま継承されているようです。
どうやらこのグラスホッパーコンポーネントを使って連携をするようですね。
ということはグラスホッパーが使えることが前提として要求されているみたいです
ボックスを例えばライノ側に描きます。
レビット側にはこれだけでは何も表示されないようです。
REVITにジオメトリを渡してあげるためにはDirectShapeというコンポーネントを使うのが手っ取り早そうです。
DirectShapeの挙動の考察
グラスホッパーでDirectShapeにBrepを繋いでみます。
ライノのボックスがレビット側に描画されました。
オブジェクトはピンされた状態で、一般モデルとして読み込まれているようです。
一度ピンを外して一般モデルのボックスを消してみます。
プレビュー状態は残りますが、REVITのオブジェクトは消すことができました。
プレビューはこの三つのアイコンで非表示、ワイヤフレーム、描画と切り替えられるようです。
一方でレビットのモデルを消してもライノ側のオブジェクトには影響はありませんでした。
もう一度レビットにボックスを渡してあげるにはどうすれば良いでしょうか。
グラスホッパーのノードを一度外して、もう一度つなぎ直してみます。
すると、再びボックスが現れました。
どうやら、ノードを繋ぐ瞬間にトリガーが発生し、オブジェクトをREVITに渡しているようです。
それでは、ボックスを消さずに、つなぎ直したらボックスは2つになるのでしょうか?
実験してみると、これは2つにはなりませんでした。
ノードを繋ぐとオブジェクトがなくなっている場合、再生成がされるだけで、コピーが作成されるわけではないようです。
それでは、ボックスをグラスホッパー側で移動してみましょう。
すると、プレビューが移動したのがREVIT側で確認できます。
これはあくまでもプレビューなのでレビット側にはまだオブジェクトは生成されていません。
MoveコンポーネントをDirectShapeに繋いで初めてオブジェクトが生成されます。
要するにDirectShapeとはライノにおけるダブらないベイクコンポーネントに近いのでしょうか?
今度はライノで元のBREPであるボックスを水平移動してみます。
するとなんということでしょうか、REVIT側のボックスはライノ側のMOVEコマンドに追従して自動的に移動します。
ということはDirectShapeとはベイクでなく、常に最新のRH+GH側の情報をアップデートしてくれるコンポーネントのようです。
それでは、REVIT側のボックスを移動したらどうなるのでしょうか。
予想では移動したボックスはコピーされ、元の場所に新たなボックスが作成されるのでは?と考えるのが妥当でしょうか。
実験結果は、「REVIT側で移動したボックスは再生成されない。そして移動した先のボックスがライノ側にプレビュー表示される」でした。
ずいぶんと予想と異なる動きをしていますね。
ということは、DirectShapeでは生成したオブジェクトのID情報のようなものでREVIT側に作成したモデルを把握しているということになりそうです。
さらに、MOVEコマンドでライノの元モデルを動かしてみましょう。
すると、「先ほどREVIT側で移動したボックスはもはやライノの動きに追従しない。一度作成されたオブジェクトは再生成されない」という結果になりました。
ということはDirectShapeは「常にアップデートされた状況を描画するが、既に描画されたオブジェクトがシーン内に存在している場合それを上書きしない」ということになりそうです。
けっこうややこしいですね。
REVIT側で移動したボックスを単純にコピーしたらどうなるでしょうか?
ライノには特に影響はないようです。よって、DirectShapeによって作られたBOXだけが特別であるということになりそうです。
REVIT Primitives: Graphical Elementの挙動の考察
では先ほどコピーしたレビット側のボックスをライノ側に表示したい場合どうすれば良いでしょうか。
REVIT側のオブジェクトを拾うには、ツールバーのParamsの右側にある先ほどのRevit Primitivesコンポーネントを使うことになりそうです。
Revit PrimitivesのGraphical Elementを選択し、コンポーネントを配置したら、右クリックし、Set one Graphical Elementを選択し、REVIT側のボックスを選択します。
これでREVIT側のジオメトリをGHに読み込み、ライノ側に表示させることができました。
その他にもいろいろな要素を読み込めそうな雰囲気がします。
それではボックスをREVIT側で移動してみましょう。
当然GHの方でも移動されるはずと思うところですが、、、
REVIT側で元ジオメトリを移動してしまうと、リンクが切れてしまうようです。
これは要注意ですね。
一度レビット側のプリミティブ設定をGHで行っても、「REVITの変更にライノ+GHは追従しない」ということになります。
これは本当に正しいでしょうか。違う要素を使ってもう一度実験してみましょう。
今度は壁を使ってみます。
REVITの要素を拾ってライノに表示させることはできますね。
では、壁を編集したらどうなるでしょうか。
一瞬リンクが切れてしまったように見えますが、、、、
ノードを繋ぎ直すと復活します。
であれば、先ほどのGraphical Elementも同様なのでは?という発想に行きつき、もう一度、実験してみると、、
REVIT側のモデルに変更があっても、一時的にリンクが切れたように見えますが、つなぎ直すとリンクは機能しているということが確認できました。
よってRevit PrimitivesはREVIT側の変更に追従するが、一時的にリンクが外れたように見える場合があるということが分かりました。
RHINOモデルをRhino.Insideを使ってREVITに流し込んでみる
これから基本的な事からいろいろな検証をしていきたいと考えていますが、基本をすっ飛ばして気になるのは既存のライノモデルはREVITで断面は切れるのか?ということです。
とりあえず手ごろなモデルを突っ込んでみてどうなるか検証してみましょう。
Rhino.Insideでファイルを開きます。
このモデルは曲線とポリサーフェスとサーフェスとメッシュでできているということが分かります。
これを全部REVITに渡すことができるのでしょうか。
まずは、ジオメトリの種類ごとに分けてGHで拾います。
すると?すでにプレビューがREVIT側にでてきているようですね。
そして、DirectShapeに全てのコンポーネントをそれぞれつなぎます。
平面図の生成
するとなんと、ビューの設定を設計GLにしてみると、全てのジオメトリが描画されたことが確認できます。
次に立面図を確認してみます。
立面図の生成
立面図をREVITのビューで確認してみると、下のようになりました。サーフェスがバキバキになっていますが、力技で図面化できそうです。
これは期待できそうですね。
続いて断面図を出してみます。
断面図の生成
表示>断面より断面線を追加し、ビューで確認してみます。
これは、使えますね。
ライノで適当に作った形もREVITで図面化できてしまいそうです。
ファミリを利用した梁と柱の作成
ここで気になるのはライノで作成したジオメトリをファミリとしてREVITに渡せるかということですね。
非常に単純なモデルですが梁、柱をREVITのファミリとして渡してあげたいと思います。
とりあえず四角を書いて各点でDiscontinuityを用いてShatterしたものを用意します。
柱は各点をZ=0平面にプロットしてライン化します。
REVIT梁ファミリエレメントの作成
ここで使用するのはAddBeamです。
このコンポーネントのCにカーブを繋いであげるだけで、取り急ぎREVITの方にシェイプができているようです。
しかし、まだTのタイプとLのレベルを入力していないので、おそらくはデフォルトタイプとして書き出されてるのでしょうか。
タイププロパティを見てみましょう。
タイプはデフォルトの一番上の物が選ばれていますね。
レベルはレベル2になっています。
これをきちんと選んであげたい所です。
それから、プロパティも上書きしてあげたいと思います。
まずはModelCategoriesPickerでファミリのカテゴリを選びます。
次にElementTypePickerでファミリタイプを選びます。
このプルダウンで、タイプが選べます。ノードを繋ぐところが見えないので繋げられるのか一瞬不安になりますが、きちんと繋がります。
これの代わりにFilterを使ってQueryTypeを使うこともできますが、それは後述しようと思います。
おなじInputのパンからLevelPickerを選択しレベルを選択します。このレベルピッカーは、REVIT内のレベルを参照するようになっています。
これでファミリを作る基本原理は分かりました。
それでは、タイププロパティを上書きしてみましょう。
ElementParametersコンポーネントを使うとどんなパラメーターがあるのか確認できます。
この中の例えば高さプロパティを10という値で上書きしてみます。
プロパティの上書きにはSetElementParameterを使います。
すると、構造断面ジオメトリの高さが304.80㎝になったことがわかります。
おかしいですね、確かに値は上書きされているのですが、何か単位が違うように思えます。
1=30.48㎝の計算になっています。これは恐らくフィートですね。
UnitConverterをかませてmmをftに変換します。10では梁が生成されないので1000ミリにしてみます。
無事、高さが1000ミリの梁を作ることに成功しました。
REVIT柱ファミリエレメントの作成
同様に柱も作成してみます。
AddColumnコンポーネントでほぼ同様のやり方で、柱の上書きができました。
折れ梁のファミリ自動生成
ライノで作成した自由なNurbサーフェスにそって折れ梁を這わせることを考えます。
これらのrhinoで作った梁をいっぺんにREVITに移植できないかと考えます。
RHINOのスクリプトは参考までに張っておきます。
新しいコンポーネントを置くたびに計算が走り、このくらいの規模になるとプレビューだけでもかなり重いですね。
なるべく、プレビューはきって動かす方が良いなと思います。
前章と同様の手順で作成したスクリプトに流し込んでみます。折れ梁のポリラインは受け付けないようなので、Discontinuityで線分に割ってから梁を作成する必要がありそうです。
全部で1000本近い梁になりますが、REVITに流し込むと1分くらい待たされます。
待ち時間としてはちょっと気になる長さですね。
大型物件になるとスクリプトを分割する必要が出てくるかもしれません。
ちょっと梁が重なってしまいますが、まぁこれはしょうがないのでしょうか。
新しいタイプを作って、X軸方向だけ太くしてみます。
新しいコンポーネントを作るたびに計算が走るので、スクリプトをいじる際は、Disabledしてしまった方がいいですね。
DupulicateTypeで新しいタイプを作り、そのタイプパラメーターを2000で上書きしてみました。
梁の天端ではなく中心ラインを拾っているので、おかしな接合部になってしまっています。
全ての梁をフィルターを使って選択し、Z位置合わせを上にすることで解決できました。
Query とFilterコンポーネント
QueryとFilterとIdentityの使い方が何だか最初はよくわかりませんでした。
コンポーネントを開いてみるとQuery~~というのとFilterというのが沢山あるのが分かります。
クエリというのはデータベースに対する命令みたいなことなのかなと理解しています。
データベースの母集団の中からフィルターを使ってふるいにかけて特定のアイテムを探し出すみたいなイメージです。
例えば上の図のようにCategoryPickerを使用してカテゴリーフィルタを使うと、QueryElementを使用した柱のエレメントがフィルタリングされます。
また、レベルを追加することで、柱で、かつレベル別にエレメントをフィルターしたりすることもできるようです。
おわりに
まだあるコンポーネントの数パーセントしか触っていませんが、少なくともライノとレビットのキャッチボールは成立しているということが分かります。
もっと基本的な検証や、スピードの問題、カーブのハンドリング等、色々検証したいポイントはありますが、今のところかなり期待できそうです。
今後、動的にアルゴリズムを使ったファミリを作成したりということが出来たらRhinoceros,Grasshopper,REVITの連係プレーにより物凄いことができるのではないかと思います。
久しぶりにレビットを触るので、レビットの機能も思い出しつつ、RHINOとREVITの新しいワークフローを探っていきます。
ライノの自由度と、REVITの図面化管理能力を遣えば、最強の建築ツールになりえる可能性は十分にあり得るのではないかと思います。
今後もまだ使っていないコンポーネントを触りつつ、この記事をアップデートしてできたらいいなと思っているところです。
今後ともどうぞよろしくお願いいたします。