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]でこのファイルを保存しておきましょう。

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

2014年6月1日日曜日

RevitとExcel(4) ドアが取り付けられている壁

ホストの情報を得るには?

ドアがどの種類の壁に取り付けられているかを知りたい時があります。耐火壁に防火戸が取り付けられているか?を効率的に把握してみましょう。Revit User Tools最新版のExcel書き出しではファミリインスタンスのホストの情報を出力できます。以下のリンクからダウンロードしインストールしてください。

http://www.rugjapan.com/forum-thread/877.html

ドアの情報を出力

まずドアインスタンスの情報を出力します。
(1) RUTS-Excel-エクスポート拡張版
(2) ドアのインスタンスを選択し、HostにチェックをいれOK。
ドア-インスタンス-Hostにチェック

(3) さらにOKして、エクセルに出力。
HostのGUIDが出力されます。
HostのGUIDが出力される

壁の情報を出力

次に壁インスタンスの情報を出力します。
(1) RUTS-Excel0エクスポート拡張版
(2) 壁のインスタンスを選択し、コメントにチェックを入れます。
壁のインスタンスを出力
(3) さらにOKして、エクセルに出力。
新しいBOOKのシートに壁のインスタンス情報が出力されます。
壁インスタンスのパラメーター出力結果

これらを一つのBookにまとめてそれぞれのシート名にわかりやすい名前を付けておきます。ここではDoorとWallとしておきます。
一つのブックにまとめると扱いやすい

VLOOKUP関数で関連付けを行う

GUIDをキーとしてVLOOKUP関数で壁の情報をドアのシートに表示しましょう。
(1) ドアのシートをアクティブにし、2行目、Host列の右隣の「E2」のセルを選択し、「fx」をクリック。
関数の挿入
(2) VLOOKUP関数を選択
(3) 検索値に「D2」、範囲はWallシートのA列からC列(Wall!A:C)、列番号は「3」、検索方法は「FALSE」を指定します。
VLOOKUP関数の設定

(4) セルE2に壁のタイプ名(Wallシートの3列目、C列の値)が表示されます。

あとは、ハンドルを使ってコピーしてください。ドアのとりついている壁のタイプ名が取得できました。下の図はHost列を非表示にし、E1のタイトル名を入れた状態です。
ドアが取り付けられている壁の情報が表示された状態

並べ替えて分析する

簡単に分析してみましょう。まずドア、壁の順番で並べ替えます。
(1) [ホーム]-[編集]-[並べ替えとフィルター]-[ユーザー設定の並べ替え]
(2) Family Category とType、取り付けられている壁を指定してOK
並べ替えの指定

ドアのタイプごとに取り付けられている壁が表示されました。
並べ替えられて少しわかりやすくなりました。

小計をとってもうすこしわかりやすく表示してみます。
(1) [データ]-[小計]
(2) 図のように設定しOK
小計の設定

下の図の青枠部分をみてください。あるドアは、1時間耐火の内部の壁と、外壁の両方にに取り付けられているということがわかります。これは取り付け位置を間違えたのかもしれません。

取り付ける壁かドアタイプを間違えた可能性が・・・


ドアを出力するときコメントも出力しておけば、こうした問題点をRevitのパラメーターに戻すことができます。

Excelのパワフルな各種分析機能を組み合わせることで、より詳細な分析が可能になります。パラメーターの情報をいろいろな手法で分析するというのはいかにもBIMらしいですね。


2014年5月25日日曜日

RevitとExcel(3)~帖数と坪数

部屋の面積を帖・坪に換算する

住宅の場合、部屋の面積を㎡とともに帖で表記することはよくあることですが、残念ながら帖はRevitの単位にありません。そこでExcelで部屋の帖数を計算し、それをRevitに戻し、なおかつタグに表示してみます。

共有パラメーター「帖」の作成

共有パラメーターとは、複数のプロジェクトやファミリ間共通で使用するパラメーターのことです。共有パラメーターはGUIDという固有の番号を持っているため、名前が一致するだけでは複数のプロジェクト・ファミリで共通して使用することができません。定義方法はとても簡単です。

(1)[管理]-[設定]-[共有パラメーター]を選択
(2)[作成]ボタンをクリックし、任意のフォルダに任意の名前で保存します

任意のフォルダに任意の名前で保存

(3)[グループ]で[新規作成]をクリックし、任意の名前(ここでは「面積情報」)をつけます。
パラメーターグループを追加
(4)[パラメーター]の[新規作成]で名前を「帖」、パラメータータイプを「実数」とします。
名前は帖、パラメータータイプは「実数」
パラメーターのタイプを面積にすると、単位表示をした際「㎡」が付加されることを避けるためです。実数は「単位なし」という意味だと考えてください。

つづいてプロジェクトにパラメーターを追加します。


(1)[管理]-[設定]-[プロジェクトパラメーター]で[追加]をクリック
(2)パラメータータイプで「共有パラメーター」を選択、[選択]ボタンをクリック
共有パラメーター「帖」を追加する
(3)先ほど作成した「帖」を追加します。
(4)カテゴリで「部屋」を選択しOKします。
部屋カテゴリに「帖」パラメーターを追加
以上で共有パラメーター「帖」がプロジェクトに設定されました。

部屋の面積を出力

前回同様、Revit User Group提供のRUTSのExcel書出しを使いますが、書出しの前に単位の設定をしておきます。


(1) [管理]-[設定]-[プロジェクトで使う単位]
(2) [面積]をクリックし、「丸め」を小数点以下の桁数 2、単位記号 なしとしOK



RUTSのExcel書出し(エクスポート拡張版)を用いて、部屋の面積および帖を書き出します。
レベル、名前、面積、帖をチェック

帖のセルに計算式を設定します。1帖=1.652㎡として、小数点以下第2位を四捨五入するようにしてみます。計算式は

=ROUND(F2/1.652,1)


でよいでしょう。桁処理に正確さを期するのであれば、Round関数を二重にかけるなどの処置が必要です。
計算式を設定


この状態で、エクセルからRevitに情報を戻します。

[RUTS]-[EXCEL]-[インポート]


任意の部屋を選択し、帖が表示されていることを確認します。
部屋のプロパティ「帖」が設定されている

タグに帖数を表示する

次にタグに面積と帖数を表示してみましょう。


(1) 任意の部屋タグを選択し、[修正|部屋タグ]の[ファミリを編集]ボタンをクリックします。
(2) ファミリエディタが開いたら、中央の101を選択

(3) [修正|ラベル]の[ラベルを編集]
(4) 既存の「番号」を削除し、左下の「パラメーターを追加」アイコンをクリック
パラメーターを追加をクリック

(5) [選択]ボタンをおして、「帖」を追加します。
帖を→ボタンで追加し、末尾表記を「帖」とする
(6)ラベルを編集ダイアログボックスに戻り、「帖」を追加し、末尾表記に「帖」をいれます。
(7)ファミリエディタで「プロジェクトにロード」をクリック
(8)「既存のバージョンを上書きする」をクリック


帖数をタグに表示することができました。
帖数が表示されている

このようにエクセルと共有パラメーターを組み合わせることで、プロジェクトの状況に応じた様々な属性情報を追加したり、計算したり、表示したりすることができるようになります。

次回はさらにいろいろな応用例をご紹介します。