2014年7月26日土曜日

ダイナモ白熱教室(3)~エクセル

座標

Revitは座標を入力するという行為が全くありません。これはRevitの優れたユーザーインターフェイスのおかげなのですが、時には座標の値が必要になることもあります。今回はダイナモを使ってファミリの配置座標をエクセルに出力してみます。

エクセルのバージョン

ダイナモが対応しているエクセルは2013以降のバージョンです。まだ2010を使っている人も多いでしょうから、今回はCSVファイルに出力することにしましょう。

ファミリの座標

Revitで新規のプロジェクトを作成して、たとえば椅子のファミリを適当に並べます。これらの挿入点をダイナモで探ってみましょう。なお、Dynamoは今のところ2バイト文字に対応していないので、ファミリの名前をアルファベットに変更する必要があります。
椅子の座標を取得してみる

ファミリタイプの名前で選択する

ダイナモを起動します。前回は手動で要素を選択しましたが、今回はファミリのタイプ名で選択してみます。

(1)[Revit]-[Selection]-[All Element of Family Type]
(2)[Revit]-[Selection]-[FamilyTypes]
(3)図のように接続し、ファミリタイプを選択します。
ファミリタイプを選択(アルファベットしか対応していないので注意)

ファミリの座標を取得する

ファミリインスタンスの座標をリストとして取得します。

(1)[Revit]-[Element]-[Family Instance]-[Query]-[Location]
(2)図のように接続し、F5で実行します。
(3)左下の□をクリックし座標が取得できていることを確認します。
座標が取得されていることを確認

座標の値を数字だけのリストにする

取得されたのは座標の値ではなく、Pointのリストになっています。CSVに書き出したいのは座標の数字なので、ここからXYZの値を取り出しリスト化します。

(1)[Geometry]-[Point]-[Query]-[X]、[Y]、[Z]を追加
(2)[Core]-[List]-[Create]を追加し、index0の隣の[+]をクリックし、index1とindex2を追加
(3)[Core]-[View]-{Watch]を追加し、下の図のように接続
(4)[F5]で実行
Pointが数字のリストに変換された

リストの行と列を入れ替える

Watchノードを見てみると、現在取得できているのは

[0] X座標値0,X座標値1,X座標値2,.....
[1] Y座標値0,Y座標値1,Y座標値2,.....
[2] Z座標値0,Z座標値1,Z座標値2.....

のリストです。(リストの番号は0から始まります。).
これを

[0] X座標値0,Y座標値0,Z座標値0
[1] X座標値1,Y座標値1,Z座標値1
[2] X座標値2,Y座標値2,Z座標値2
...
となるように、行と列を入れ替えます。これはエクセルでもおなじみのTransposeを利用します。

(1) [Core]-[List]-[Action]-[Transpose]
(2) [Watch]を追加し、図のように接続、F5で実行します。

.
リストの行と列を入れ替え

CSVに出力

準備ができたので、これをCSVファイルに出力します。
(1) [Core]-[File]-[Actions]-[ExportToCSV]
(2) [Core]-[Input]-[File path]を追加し、[Browse]をクリックし、新規ファイル名を指定します。このとき拡張子CSVを付けることをお忘れなく。
(3) Watchを追加し、図のように接続
(4) F5で実行し、最後のWatchにTrueが表示されていたら出力成功です。
最後のWatchノードにTrueが表示されれば成功
指定したフォルダのCSVファイルをエクセルで開いてみてください。
座標の一覧を取得できた
今回はCSVファイルを使いましたが、エクセル2013以降をお持ちの場合は、
[Office]-[Excel]-[Write]
もお試しください。行やシート名を指定して出力が可能です。
エクセルに直接出力も可能
さて、次回はエクセルに取得した座標を使って、あらたにファミリを配置してみます。

2014年7月19日土曜日

ダイナモ白熱教室(2)~リスト

リストの作成

前回は「モデル線分上を移動する1点」を作成しました。今回は線分を一定間隔で分割した点のリストを作成し、複数本の木を配置してみましょう。
前回のファイルをRevit(rvtファイル)→ダイナモ(dynファイル)の順番で開いてください。ダイナモのファイルとRevitのファイルには関係性が生じており、異なるファイルを開くとダイナモのコマンドラインにエラーが表示されます。

Try02 - 線分上に等間隔で木を植える

曲線を等間隔に分割した点を作成する

前回のダイナモの「Curve.PointAtDistance」ノードをみると、[distance]のインプットは[Double Slider]から単一の値のみがインプットされています。作成された点を確認するには[Curve.PointAtDistance]ノードの右下にある小さな□をクリックします。
スライダから21.275のみがdistanceにインプットされるので作成される座標も一つだけとなる

ここに点のリストを作成するにはdistanceに複数の値をインプットします。一定間隔の数字のリストを作成するにはNumber RangeまたはNumber Sequenceを使います。
(1)[Core]-[List]-[Create]-[Number Range]
(2)[Double Slider]のアウトプットをNumber RangeのStepにつなぎかえます。
(3)[Number Range]の[seq]を[Curve.PointAtDistance]の[distance]につなぎます。
Number Rangeを追加
Number Rangeのstartには0をインプットします。
(1)[Core]-[Input]-[Number]
(2)NumberのアウトプットをNumber Rangeのstartに接続
Numberをstartに接続

Number Range のendには曲線の長さをインプットします。曲線の長さを調べるノードがあります。
(1)[Geometry]-[Curve]-[Query]-[Length]
(2)[Element.Geometry]のvar[]と[Length]のdoubleと[Number Range]のendを接続します。
線の長さが最大値として設定されれた。

実行~その1

F5キーを押して実行してみます。残念ながらエラーがでてただしく作動しません。なぜでしょうか?
黄色くなっているところがエラー
どのようなリストが作成されたかをWatchノードを使って確認してみます。
(1)[Core]-[View]-[Watch]
(2)Number RangeノードのseqとWatchをつないでF5で再度実行します。
Watchに作成されたリストが表示される。
Watchは状況を確認するためのノードです。ここに表示されたリストは複数の値が入ってはいますが、リストのリストになっています。もう少しわかりやすくかくと

[0] 0, 9.654, 19.309, 28.963, 38.617
[1] (今回はない)

Number Rangeから入れ子のリストがdistanceへ入っていたので受け入れられない値としてエラーが発生していました。
入れ子のリストは受け付けない

エラーを修正

この2次元リストを単純な1次元リストに変更します。
(1)[Builtin Function]-[Flatten]
(2)さらにWatchを追加し、下の図のように接続、F5キーをおして実行します。
リストの変化に注目!
これでエラーなく実行されました。・・・・が、どうでしょう?Revitの画面ではいまだに木が1本しかありませんね。つまり点は一つしか作成されていないということです。

リストとリストの掛け合わせ

確認のため、もうひとつWatchを追加して、Curve.PointAtDistanceの出力を見てみましょう。
点がひとつしかない!?

distanceには確かにリストがインプットされていますが、出力された点は一つです。
Curve.PointAtDistanceの右下の小さなマーク「|」に注目してください。ここにマウスカーソルをもっていくと...

となっています。つまり二つのリストの同じ番号同志を掛け合わせた処理を行うということを示しています。
現在、curveにもdistanceにもリストがインプットされています。curveのほうもWatchで確認してみます。
curveとdistanceの第一要素だけが処理されている
これはリスト同士の掛け合わせを変更することで改善できます。
(1)[Curve.PointAtDistance]ノードを右クリック
(2)[Laceing]-[Longest]または[Cross Product]
(3)F5で実行

最初の設定ではShortestが選択されていたため、一番短いcurveのリストが要素数1なのでひとつだけ処理されましたが、Longestにすると長いほうのdistanceのリストの数に合わせて処理されます。
複数の処理が実行された。
複数の曲線がインプットされた場合、すべての処理を実行するためにCross Productを選択するとよいでしょう。



リストの操作はDynamoにおいて非常に重要なテクニックですのでしっかり理解しましょう。

次回はファミリの座標を取得して、エクセルに出力します。

2014年7月13日日曜日

ダイナモ白熱教室(1)

ダイナモを使ってみよう!

皆さんは「ライノ」とか「グラスホッパー」の名前を耳にしたことがあるでしょうか?パラメトリックデザインというジャンルも徐々に市民権を得てきていますが、Revitのプラグイン「ダイナモ」は、このコンセプトをRevitに取り入れたものです。でも

「そもそもRevitのファミリってパラメトリックじゃん。何が違うの?」

と思われる方もいらっしゃるでしょう。百聞は一見にしかず。まずは使ってみて、その違いを実感しましょう。

ダイナモをインストールする。

ダイナモは以下のURLから無料でダウンロードできます。
http://dynamobim.org/
DynamoのHP

今のところ、最新のバージョンは0.7.1でまだメジャーが0のアルファバージョンです。

Try01-植木算

「池の周りに5m間隔で木を植えると・・・」というのは小学生の「植木算」ですが、これに類似して「線上に一定間隔で木を植える」というお題をRevitで解いてみましょう。
モデル線分に沿って木を並べる

(1) Revitを起動し、規定のテンプレートで新規プロジェクトを開始します。
(2) level1を作業面として、任意のモデル線分を作成します。
(3) アドインタブでDynamo 0.7 のアイコンを選択して起動します。

ダイナモの起動直後の画面です。
Dynamoの画面
木のファミリは
・挿入点
・ファミリタイプ
が必要です。まずは挿入点を計算します。

Revitのデータを取得する

作成したモデル線分の情報を取得してみましょう。左側の黒地に白字のペインから
[Revit]-[Selection]-[Select Model Element]
をクリックすると、右側の作業領域に「select Model element」という四角いボックスが現れます。
これを「ノード」と呼びます

このSelectをクリックし、Revitの画面に戻り上記で作成したモデル線分を選択します。ダイナモを全画面表示にしているとRevitの画面に切り替わらないので、一旦ダイナモの画面を最小化するか、位置を調整して、Revitの画面を表示してください。
選択が終わると、ノードにはモデル線分のIDが表示されます。
選択した要素のIDが表示されます

Selectionの領域をみてみると、様々な情報がRevitから取得できることがわかります。
なかなか興味深いものが並んでいるのですが、またの機会に回すとして次に行きましょう。

モデル線分から幾何情報を取り出す

選択したモデル線分から幾何学的な情報だけを取り出します。そしてこの曲線を分割して点の配列を作成します。
(1)[Revit]-[Element]-[Actions]-[Geometry]をクリックし、Element.Geometryノードを追加
(2)[Select Model element]の[Element]をクリックし、ハンドルを伸ばしてElement.GeometryのElementをクリックしてつなげます。
Elementをつなぐ
これで幾何曲線の情報(curve)を取り出せました。ここでダイナモの画面左下のRUNボタンまたはF5キーをおして実行してみましょう。
取得した曲線が表示さる
選択したモデル線分から取得した曲線が表示されます。画面右下の[Geom]をクリックすれば、Revit同様の操作で画面を移動・拡縮できます。
見やすい位置になったらNodeをおして戻ります。
画面右下の切り替えボタン

点を作成する

抽出した幾何曲線を分割して、曲線上に点を作成してみましょう。
(1){Geometry]-[Curve]-[Action]-[PointAtDistance]を選択します。これは、曲線状をある一定の距離で分割した点の配列を作成するノードです。
(2)[Core]-[Input]-「Double Slider]をクリックします。これは実数の数字を作成するスライダです。
(3)これらを下の図のように連結します。
(4)スライダを適切な位置に移動して[F5]を押して実行すると、ひとつだけ点が現れます。
スライダを移動して点を移動させてみます。
スライダを移動してはF5を押して点が異なる位置に描画されていることを確認しましょう。
木のファミリを配置してみる
(1)[Revit]-[Element]-[FamilyInstance]-[Create]-[ByPoint]
(2)[Revit]-[Selection]-[FamilyTypes]
(3)(1)(2)のノードを下の図のように連結します。
ノードを連結
(4)Family Type でファミリタイプを選択します。しかしながら現時点では「ダイナモは2バイト文字に対応していない」ため、Revitに戻りタイプ名をアルファベットに変更してから選択します。
Revitでファミリ名とタイプ名をアルファベットに変更
ファミリタイプを選択
(5)[F5]キーで実行し、Revitの画面に切り替えてみます。
Revitにファミリが作成されています。

(6)次にスライダを動かして、[F5]キーまたは[RUN]で実行してみます。木の位置が変わることが確認できます。またRUNの横にある□Run Automaticallyを☑しておくと、自動的に実行されます。

(7)[File]-[Save]でこのファイルを保存しておきましょう。

いかがでしたか?今回は点を一つだけ作成しましたが、これではお題の「植木算」になっていませんね。そこで次回は複数の点を扱う「配列」について考察します。お楽しみに。