2015年8月30日日曜日

ダイナモ白熱教室(8)-Rhinocerosのデータを読む(2)

RhinoからDynamoへ

それではライノセラスのデータをRhynamoを使ってダイナモのデザインスクリプト(DS)に変換して読み込んでみます。今回は下の図のような簡素なライノデータを読んでみます。簡素といっても3つのNurbsCurveを基にロフトで作成したけっこう複雑な曲面です。
ロフトで作成したサーフェイス
まず前回同様の手順で、どのような要素が含まれているかを調べます。このデータは「デフォルト」レイヤに3つのNurbCurveを、レイヤ4にサーフェイスを作成しましたので、スライダを動かして、レイヤ4を選択します。
前回のグラフで、ファイルを選択しなおす。
レイヤ4にはBrepとしてPolySurfaceがある。
したがって、Brepをデザインスクリプトに変換するノードを追加します。検索バーに「Brep」と入力し、「Rhino_BrepToDS」を追加し、次のように接続します。接続先を間違えないでください。
ライノのデータを読み込んだところ
GeometryとしてPolySurfaceが取り込まれている。
これでダイナモのジオメトリとしてライノのデータを取り込むことができました。さらにRevitに取り込むことも簡単にできます。

ImportInstance.ByGeometry/ByGeometries

一番安直なのは、作成されたジオメトリを単純に「塊」としてRevitに取り込む方法です。
ImportInstance.ByGeometryまたはByGeometriesを下の図のように接続します。
ByGeometries
Revitに取り込まれたジオメトリ

ByGeometryとByGeometriesの違いは、複数のジオメトリがあった場合、そのジオメトリごとバラバラに取り込むか、塊として取り込むかの違いです。

しかしながら、この方法では、単にDWGやSATファイルとして取り込んだ場合と、大きな違いはありませんね。

例えば、サーフェイス面を分割して、下の図のような形状を作ってからRevitに取り込むことも可能です。
ダイナモで面を均等割りして、円のプロファイルで籠状にしてみたところ
次回は、上図のようなサーフェイスの加工について、手順を説明します。


2015年8月23日日曜日

ダイナモ白熱教室(8)-Rhinocerosのデータを読む(1)

ライノのデータを読むには?

ライノセラスのデータの拡張子は.3dmです。このデータをRevitに読み込むには、「読み込めないACISオブジェクトがあります」の回で説明したように2004DWG形式に変換して、読み込む方法が最も簡単です。しかし、ジオメトリとして読み込めるだけで、さらに分析を行うにはダイナモで読み込むと便利です。ここで重要な用語は

  • Rhynamo(ライナモ)
  • アダプティブコンポーネント

の二つです。ライナモとはダイナモのパッケージ(アドオン)です。ダイナモには様々なパッケージが公開されています。まずはダイナモを起動して、パッケージをインストールするところから始めましょう。

ライナモのインストール

ダイナモを起動し、[パッケージ]-[パッケージの検索]を選択

ダイアログボックス上部に「Rhynamo」と入力

Rhynamoの○に↓をクリックし、インストールします。ライブラリの一番下に「Rhynamo」が登場します。

ライナモを使ってみる

それでは、何らかのライノセラスのファイルを用意して、これをダイナモで読み込んでみましょう。ライノのHPではサンプルファイルが落とせますのでこれを利用してもよいでしょう。
まずはファイルを指定します。以下のノードを追加します。

File Path

ファイルパスを指定するノードです。Browseをクリックし、3dmファイルを指定します。

File.FromPath

ファイルパス名からファイルオブジェクトを生成します。これをFile Pathに接続します。
ファイル取得のお決まりのパターン


ライブラリの「Rhynamo」を展開して、ReadRhinoの

OpenRhino3dmModel.Get_RhynoModel

ノードを追加します。
Rhynamo
これを以下のようにつないで、下の□をクリックすると
データのプロパティを取得
データのプロパティの一部を取得できます。右側の一番上の「RihinoModel」から、形状データを取得することができます。

レイヤ情報の取得

まずはこのファイルのレイヤを取得してみましょう。[Rhino Object]の

RhinoObject.Get_RhinolayerNames

を追加し、以下のようにつなげば、どのようなレイヤが含まれているかわかります。
レイヤの取得
レイヤごとにジオメトリを取り出す
ライノのレイヤ別にジオメトリを取り出すことができます。まずは、

Integer Slider
List.GetItemAtIndex

を追加し、さらに[Rihino Object]から

RihinoObject.Get_RihinoObjectsByLayer

を追加し、以下のようにつなぎます。スライダの最大値はレイヤの数に合わせておきます。
Get_RhinoObjectsByLayer
さらにライブラリ一番右の[Rhino ..n To Ds]から、

RhinoTranslationToDS.Rhino_AllGeometryToDS

を追加します。下部の□をクリックし、スライダを動かせば、各レイヤにどのようなジオメトリが含まれているかがわかります。
各レイヤに含まれるオブジェクトタイプがわかる
このリストの見方ですが、
[0] Points
[1] Curves
[2] Breps
[3] Extrusions
[4] Meshes
がそれぞれいくつ含まれているかが表示されています。


次回はこの情報を基に、いよいよライノのデータをダイナモに取り込んでみます。



2015年8月2日日曜日

地形(1)

Revitでは数少ないサーフェイスメッシュ要素である地形ですが、敷地を正確に作成することは計画をするうえで重要です。今回は下の図のような簡単なのり面を含む地形を例にして、上手な敷地の作り方を考えてみます。
坂に囲まれた敷地

等高線と三角形の分割エッジを表示する

地形はメッシュ構造で作成するので、ポリゴン(三角形)をいかに作るかを意識する必要があります。地形を作成するときは以下の設定をお勧めします。

等高線のピッチを設定する
(1) [マス&外構]-[外構を作成]パネルの矢印をクリック
外構の設定
(2) 地形の高さにもよりますが、この例ではピッチを100に設定します。
等高線のピッチを変更
(3) 地形を作成する平面ビュー(建築テンプレートならば、設計GLのビューなど配置図のビュー)を開き、[表示]-[表示グラフィックス]で、地形のサブカテゴリをONにします。
地形のサブカテゴリをON
(4) 地形が設計GL(Z=0)よりも低い位置にある場合は、ビューの奥行きをZ=0以下まで伸ばす必要があります。ビューのプロパティから、[ビュー範囲]をクリックし、ビューの奥行を[無制限]とします。
ビューの奥行を無制限に

三角形を意識しながら地形をつくろう

地形はポリゴン(三角形)の集合で構成されるので、地形を作成するときも事前に三角形に分割してみるとやりやすくなります。まったくの長方形でも二つの三角形に分割されます。今回の敷地だと次のように分割して考えます。
ポリゴンに分割して考える

実際の敷地はもっと複雑ですが、基本は同じです。三角形が多ければ正確な形状に近づきますが、パフォーマンスを考えるとある程度の抽象化が必要です。まず、周辺の4点をそれぞれの高さで作成してみます。
敷地が2枚の三角形で表されています。
地形は二つのポリゴンに分割され、1枚は傾いています。さらに道路の底面部を作成してみます。
道路の4点(-1500)を追加

道路の底面部(左下隅)は平たんになりましたが、敷地が未完成です。敷地の4点の±0の点を追加します。
敷地の3点(±0)を追加
地形は点を打つごとに、最寄りの点と三角形(ポリゴン)を作ります。この三角形ができていく様子と、等高線の状況を確認しながら地形作成を進めることが大事です。
三角形と等高線に注意しながら地形を作成する
これは3Dビューでも同じビュー設定で確認できます。
3Dで等高線と三角形を分割
あとはサブ領域を作成して、マテリアルを設定し、等高線や分割エッジをOFFにします。
サブ領域
舗装に頼らなくても、きれいな坂道を作ることができます。三角形と等高線を意識しながら地形を作成してみてください。



2015年7月26日日曜日

読み込めないACIS オブジェクトがあります。

他のCADで作成した3Dモデルを読み込む

ダイナモをお休みして、今回は他のCADシステムで作成した、3DモデルをRevitに取り込むときのちょっとしたコツをご紹介します。
下の図は3dsMAXのサンプルファイルです。これをRevitに取り込んでみます。
3dsMAXのサンプル「Ford Focus.max」
基本的にはDWGに変換してから読み込みます。Exportでファイル形式にDWGを指定して出力します。
AutoCAD DWGを指定して出力
Revitでファミリ、あるいはプロジェクトを開いて、「CADを読み込む」でこのデータを読み込んだ時に下の図のような警告が表示されます。
読み込めないACISオブジェクト?
一瞬どきりとしますが、この警告を回避するにはどうすればいいでしょう?

2007形式のDWGで読み込むとOK

回避方法は結構単純で、DWGの形式を2007形式(あるいは2004形式)にすることで、この警告はでなくなります。そればかりか読み込み時間もものすごく短くなります。
2007形式のDWGで読み込むと◎

ではなぜこのような違いがあるのでしょうか?最初の2013形式のファイルをAutoCADで開いて、プロパティを確認すると、「メッシュ」となっています。
オブジェクトは「メッシュ」
これはAutoCAD2010で登場したオブジェクトです。警告はこれを「ポリメッシュ」に変換しなさい、と言っているのです。AutoCADにメッシュをポリメッシュに変換するコマンドがあるのかというと、どうもこれはなさそうで、一番簡単な方法は、2007あるいは2004形式に保存することです。保存後のファイルを開いてオブジェクトをチェックしてみます。
メッシュがポリメッシュに変換されています。
確かに、「ポリメッシュ」に変換されています。Revitの「AutoCADを使ってポリメッシュオブジェクトに変換し・・・・」というのはこのことだったのです。
これをRevitに読み込むと、問題なく読み込めます。

読み込んだ3Dモデルの断面を表示するには?

3DモデルをRevitに読み込むときは、直接プロジェクトに読み込むのではなく、一旦ファミリに読み込んでから、そのファミリをプロジェクトにロードすると、断面を切ることができるようになります。下の図は、左はプロジェクトに直接DWGを読み込んだもので、右は同じDWGをファミリに読み込んでから、改めてプロジェクトにロードしたものです。見た目は何も変わりません。
左は直接DWGをプロジェクトに読み込んでいる
この車の断面図を作成してみます。
左:DWGをプロジェクトに直接読み込んだ場合 / 右:DWGをファミリに取り込んでプロジェクトにロードした場合

このように、プロジェクトにDWGを直接読み込むと、断面を切ることができません。一方、一旦DWGをファミリに取り込んでからロードした場合は、断面を作成することが可能です。

しかし、読み込み先のファミリのカテゴリには注意してください。一般モデルなど、切断可能なカテゴリを選べば断面は作成されますが、点景や家具など切断不可能なカテゴリを選んだ場合はやはり切断できません。

2015年7月19日日曜日

ダイナモ白熱教室(7)~点-線-面

前回作成したコサインカーブのZ座標をXY平面の座標に割り当ててみます。前回の最後のグラフは次のようになっていました。
このグラフでできたCosカーブをすべての座標に割り当てる

Point.Add / Vector.ByCoordinates

点にベクトルを与えて新しい点を作成するノードです。引数は

  • point
  • vectorToAdd

の二つで、pointは前々回に作成した、XY平面上(Z=0)の点のリストで、vectorToAddは前回のコサインカーブを基に新たに作成します。

VectorByCoordinatesのノードを追加し、下の図の水色の部分のようにZにつなぎます。
Zベクトルを作成
このベクトルを各点に割り当てます。まず、上図のピンク色のPoint.ByCoordenatesノードの右下の□をクリックし、リストを表示します。次にそのリストの最初の[0]Listを選択すると、背景の3Dビューに[0,0]などのインデックスが表示され、最初のリストがどこにあるのかを目視確認できます。
リストの所在が確認できる
この列に対して、コサインカーブを割り当てます。

List.Map

ベクトルを加算するリストは2次元配列になっています。この1次元側にZベクトルを加算します。この場合List.Mapを使い、各リストに処理をマッピングします。

  • Point.Add
  • List.Map

を追加し、次の図のように接続します。
List.Map
結果は下の図のようになります。
Y方向にコサインカーブを割り当て

List.Transpose

今度はX方向にコサインカーブを割り当ててみます。ピンク色の部分のPoint.ByCoordinatesからは[X,Y]のリストが出てくるので、これを反転して[Y,X]のリストにしてマップします。リストのX、Yを入れ替えるにはエクセルでもおなじみのTransposeノードを使用して、下の図のようにつなぎます。
Transpose
結果は・・・
X方向にコサインカーブを割り当て

NurbsCurve.ByPoint

この点を結んで曲線を作成し、さらに面を張ってみましょう。まずは

  • NurbCurve.ByPoint

を追加し、List.Mapに接続します。すると、各リストがつながって曲線として表示されます。
NurbsCurve.ByPoints

Surface.ByLoft

曲線をつないで面を作成します。

  • Surface.ByLoft

を追加し、NurbsCurve.ByPointsに接続すると、面が作成できます。
X方向にコサインカーブを割り当てた面の作成

Transposeを使わない最初のバージョンであれば

Y方向にコサインカーブを割り当てた面
ここでは「点」→「線」→「面」の基本的な流れを説明しました。

2015年7月11日土曜日

ダイナモ白熱教室(6)~Cos

前回は一定の割合で50m×20mのメッシュ状の点を作成しました。今回はZ方向にコサインカーブを描いてみます。

まずは単純にY=0の直線状にZ方向にコサインカーブで点を作成しましょう。

Math.Cosノード

Dynamoを立ち上げ、前回のファイルを開きます。

Numberノードを追加し「0..360..#res」とし、これをIntegerSlider(Resolution)と結びます。0°から360°をres分割したリストを作成します。

次にMath.CosノードとPoint.ByCoordinatesを追加し、下の図のように結ぶと、コサインカーブに沿った点が現れます。
振幅1.0のコサインカーブができた

振幅を可変化

cos(x)の最大値は1なので、これを任意の幅に書き換えれるようにします。また、(0,0)の位置で-1となるのでこれを反転するために負の値を掛けます。つまり

-Wz・Cos(a)

とします。

  1. Number Sliderを追加し名前をWzとする。
  2. *を二つとNumberを一つ追加し、Numberに-1を入力。
  3. 下の図のようにつなぎます。
-Wz・Cos (a)
Wzスライダーを動かして、コサインカーブの振幅幅が変化することを確認してください。
コサインカーブの変化を観察しよう!
次に、結果に振幅の値を加えることで、マイナスの値にならないようにします。

-Wz・Cos(a)+Wz

+ノードを追加して、次のように接続します。
コサインカーブがZ≧0にあることを確認してください。
全ての点がZ≧0に

周期を変更する

現状1周期ですが、これを3周期に変えてみます。式は周期をPeriodとして

-Wz・Cos(Period・a)+Wz

Numberノード、*ノードを追加し、下の図のように接続します。

3周期
Number Sliderで周期を可変化してもよいでしょう。

振幅に変化を加える

振幅が定数だと、周期ごとのカーブの形状は同じですが、振幅にもCosを割り当て変化を加えましょう。

f(a)=-Wz・Cos(a)+Wz

g(a)=-f(a)・Cos(Period・a)+f(a)


としてみましょう。こうのような関数のチェックにはGeoGebra(https://www.geogebra.org/)というアプリケーションが便利です。Windows Storeなどで入手できるので、チェックしてみてください。下の図はGeoGebraでこの関数を表示している様子です。
GeoGebraは幾何学好きにはたまらない!
これをグラフに表わすと次のようになります。
ちょっと複雑になってきましたが・・
この結果は下の図のようになります。
振幅がCos

コードブロックでまとめる

コードブロックを使えば、もう少しグラフをわかりやすくすることができます。
コードブロックでスッキリ
このグラフでも同様の結果を得ることができます。コードブロックは適切に使えば、グラフをわかりやすくまとめることができます。ちょっとプログラマーっぽいですが、案外簡単に慣れてしまうものです。ぜひトライしてみてください。