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において非常に重要なテクニックですのでしっかり理解しましょう。

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