Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Dynamo は、AEC の世界に向けてコーディングを開始するのに最適です。コーディングの旅を始めるにあたり、次のセクションを参照することをお勧めします。
コード ブロックを使用すると、Dynamo の核となる DesignScript というプログラミング言語を詳しく理解することができます。予備的な設計ワークフローをサポートするためにまったく新しく開発された DesignScript は、簡潔で理解しやすい言語です。短いコードを迅速に変更することも、大規模で複雑な相互作用に対応することもできます。DesignScript は、Dynamo 内部のほとんどの要素を駆動するエンジンの中核でもあります。Dynamo ノード内のほぼすべての機能と相互作用について、スクリプト言語に対する 1 対 1 の関係が存在するため、ノードベースの相互作用とスクリプトを柔軟に切り替えることができます。これは、Dynamo 独自の機能です。
操作に慣れていない初級ユーザのために、ノードを自動的にテキスト構文に変換する機能が用意されています。これにより、DesignScript の理解をサポートしたり、グラフの大きな部分のサイズを簡単に小さくすることができます。この操作は、「ノードをコード化」という処理を使用して実行されます。この処理については、「DesignScript 構文」のセクションで詳しく説明します。操作に慣れている上級ユーザは、コード ブロックで各種の標準的なコードのパラダイムを使用して、既存の機能とユーザ定義の関係を組み合わせてカスタマイズすることができます。初心者ユーザと上級ユーザの間に位置する中級ユーザについては、設計作業をすばやく行うためのさまざまなショートカットやコード スニペットが用意されています。プログラミング経験のないユーザにとって、「コード ブロック」という言葉は難しそうに感じるかもしれませんが、使用方法も簡単で、安定して動作します。初級ユーザは、最小限のコードを記述してコード ブロックを効率的に使用でき、上級ユーザは、Dynamo 定義内の任意の場所で呼び出すことのできるスクリプト定義を作成することができます。
コード ブロックとは、一言でいうと、ビジュアル スクリプティング環境内で使用するテキスト スクリプティング インタフェースです。コード ブロックは、数値、文字列、式などのデータ タイプとして使用することができます。コード ブロックは Dynamo 専用に設計されているため、コード ブロック内で任意の変数を定義することができます。定義した変数は、自動的にノードの入力に追加されます。
コード ブロックを使用すると、入力値の指定方法を柔軟に決定することができます。(10, 5, 0) という座標の基本的な点を作成するには、次のようにいくつかの方法があります。
ライブラリ内の使用可能な各種の関数に慣れてくると、「Point.ByCoordinates」と入力する方が、ライブラリ内を検索して目的のノードを探すよりも早いということがわかるようになります。「Point.」と入力すると、点に対して適用できる関数のリストが表示されます。これにより、直感的にスクリプトを作成することができ、Dynamo で関数を適用する方法を理解することができます。
Code Block ノードは、[Core] > [Input] > [Actions] > [Code Block] で使用することができます。または、キャンバス上でダブルクリックするだけで Code Block ノードが表示されます。この方が簡単です。Code Block ノードは頻繁に使用されるため、キャンバス上でダブルクリックするだけで Code Block ノードが表示されるようになっています。
Code Block ノードを使用すると、データ タイプについても柔軟に操作することができます。Code Block ノードを使用して、数値、文字列、式をすばやく定義し、目的の値を出力することができます。
次の図を見ると、値を定義するための従来の方法(左側の方法)は少し冗長であることがわかります。この方法では、インタフェース内で目的のノードを検索してキャンバスに追加し、データを入力する必要があります。Code Block ノードを使用すると、キャンバス上でダブルクリックするだけで Code Block ノードを表示し、基本的な構文で正しいデータ タイプを入力することができます。
Code Block ノードと比べた場合、Number、String、Formula の各ノードは旧式のノードということができます。
従来の方法
コード ブロック
コード ブロックは、ビジュアル プログラミング環境をテキストベースの環境に動的にリンクさせる、Dyanamo 独自の機能です。コード ブロックでは、1 つのノードですべての Dynamo ノードにアクセスし、グラフ全体を定義することができます。コード ブロックは Dynamo の基本的な要素です。この章をよく読んで、コード ブロックを理解してください。
Code Block にはデータ管理を 大幅に 容易にする基本的な省略表記方法がいくつかあります。ここでは基本の概要を示し、この省略表記をデータの作成とクエリーの両方に使用する方法を説明します。
基本的な省略表記を組み合わせることで、範囲とシーケンスを設定することができます。下記の画像を「..」構文のガイドとして参照し、Code Block を使用して数値データのリストを設定してみましょう。この表記に慣れると、数値データを効率的に作成できるようになります。
この例では、数値範囲を
beginning..end..step-size;
の基本的な Code Block 構文で置き換えて設定します。数値で表すと、0..10..1;
になります。構文
0..10..1;
は0..10;
と同等です。ステップサイズの 1 は、省略表記の既定値です。つまり、0..10;
はステップサイズが 1 であるシーケンス 0 から 10 を表しています。シーケンス の例も同様です。ただし、「#」を使用して、15 までの値を含むリストではなく、15 個の値を含むリストを指定しています。このケースでは、
beginning..#ofSteps..step-size:
を定義しています。シーケンスの実際の構文は0..#15..2
です。今度は前の手順の「#」を構文の step-size 部分に配置してみましょう。これで、数値範囲 は beginning から end に設定され、これらの 2 つの間の値が step-size 表記に指定された値で均等に分割されます:
beginning..end..#ofSteps
高度な範囲を作成すると、リストのリストを簡単な方法で使用できます。次の例では、メイン範囲の表記から変数を分離して、このリストに別の範囲を作成します。
1.ネストされた範囲を作成して、「#」が指定されている表記と指定されていない表記とを比較してみましょう。ロジックは基本的な範囲と同じですが、多少複雑になります。
2.サブ範囲はメイン範囲内の任意の場所に設定できます。また、2 つのサブ範囲を設定することもできます。
3.範囲内の「end」値をコントロールすることにより、長さが異なる範囲を追加で作成できます。
ロジックの演習として上記の 2 つの省略表記を比較し、サブ範囲 と # 表記が出力をどのようにコントロールしているかを読み解いてください。
リストは省略表記を使用して作成できる他、すばやく作成することも可能です。これらのリストには幅広い要素タイプを含めることができ、クエリーを実行することも可能です(リストはリスト自体がオブジェクトです)。簡単に言うと、Code Block でブラケット(角括弧)を使用してリストを作成し、リスト内の項目のクエリーを実行します。
1.文字列を使用してリストをすばやく作成し、項目のインデックスを使用してクエリーを実行します。
2.変数を使用してリストを作成し、範囲の省略表記を使用してクエリーを実行します。
ネストされたリストを管理するプロセスは同様です。リストの順番に配慮し、複数の角括弧のセットを使用します。
1.リストのリストを設定します。
2.1 つの角括弧の表記を使用してクエリーを実行します。
3.2 つの角括弧の表記を使用して項目のクエリーを実行します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
この演習では、新しい省略表記のスキルを使用して範囲と式を設定し、一風変わった卵型のサーフェスを作成します。この演習では、Code Block と既存の Dynamo ノードを並行して使用する方法を学習します。Dynamo ノードを視覚的に配置して設定を確認しながら、Code Block を使用して大きなデータを処理します。
まず上記のノードを接続してサーフェスを作成します。数値ノードを使用して幅と長さを設定する代わりに、キャンバスをダブルクリックして、Code Block に 100;
と入力します。
Code Block に
0..1..#50
と入力して、0 から 1 の範囲を 50 個に分割するように設定します。範囲を Surface.PointAtParameter ノードに接続します。これは 0 から 1 の範囲内にある u と v の値を取得してサーフェス全体に設定します。Surface.PointAtParameter ノードを右クリックし、レーシングを[外積]に変更します。
この手順では、最初の関数を適用して、グリッドを Z の正の向きに移動します。このグリッドは基盤となる関数に基づいて生成されるサーフェスをコントロールします。下図に示すように、新しいノードを追加します。
式ノードを使用する代わりに、Code Block を使用して
(0..Math.Sin(x*360)..#50)*5;
を指定します。この式を簡単に分割して説明するために、式内に範囲を設定します。この式は正弦関数です。正弦関数は Dynamo で角度(度)入力を受け取ります。このため、完全な正弦波を取得するには、x 値(0 から 1 までの入力範囲)を 360 で乗算します。次に、各行のコントロール グリッドの点と同じ数だけ分割するため、#50 を指定して 50 個のサブディビジョンを設定します。最後に、Dynamo プレビューで効果を確認できるようにするため、累乗の指数に 5 を指定して変換の振幅を大きくします。
以前の Code Block は正常に動作しましたが、完全にパラメータではありませんでした。動的にパラメータをコントロールするため、前の手順の行を
(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;
に置き換えます。こうすることで、これらの値を入力に基づいて設定できるようになります。
スライダ(範囲 0 から 10)を変更して、どのような結果が生じるか確認します。
数値範囲を転置することにより、カーテン ウェーブの方向を反転します:
transposeList = List.Transpose(sineList);
。
sineList と tranposeList を追加すると、歪曲した卵型のサーフェスが生成されます:
eggShellList = sineList+transposeList;
。
以下に指定するスライダの値を変更して、このアルゴリズムをなだらかにします。
最後に、Code Block を使用して、データの一部のクエリーを実行しましょう。特定の範囲の点を指定してサーフェスを再生成するには、Geometry.Translate ノードと NurbsSurface.ByPoints ノードの間に上記の Code Block ノードを追加します。sineStrips[0..15..1];
が指定されています。これにより、50 行の最初の 16 行の点が選択されます。サーフェスを再作成すると、点のグリッドの一部が分離されて生成されていることがわかります。
最後の手順では、この Code Block をよりパラメトリックなものにするため、範囲 0 から 1 のスライダを使用してクエリーをコントロールします。これは、次のコード行で行います。
sineStrips[0..((List.Count(sineStrips)-1)*u)];
わかりにくいかもしれませんが、このコード行により、リストの長さを乗数 0 から 1 の値を使用してすばやくスケールできます。
スライダに 0.53
の値を設定すると、グリッドの中央をわずかに超えるサーフェスが作成されます。
想定どおり、スライダを 1
に設定すると、すべての点のグリッドを使用してサーフェスが作成されます。
ビジュアル プログラムを参照する際、Code Block をハイライト表示して Code Block ノードの各関数を確認できます。
1.最初の Code Block ノードは Number ノードを置き換えます。
2.2 番目の Code Block ノードは Number Range ノードを置き換えます。
3.3 番目の Code Block ノードは Formula ノード(および List.Transpose、List.Count、Number Range の各ノード)を置き換えます。
4.4 番目の Code Block ノードはリストのリストのクエリーを実行し、List.GetItemAtIndex ノードを置き換えます。
このセクションでは、DesignScript を使用するジオメトリの作成に関する一連の演習を紹介します。サンプルの DesignScript を Dynamo のコード ブロックにコピーしながら操作してください。
Dynamo でのフリーフォーム曲線の作成には、基本的な方法が 2 つあります。点の集合を指定して、Dynamo によってその間に滑らかな曲線を補間する方法と、特定の次数の曲線の基礎となる制御点を指定する、より低レベルのメソッドです。補間による曲線は、線分が取るべき形状を設計者が正確に認識している場合や、曲線が通過できる場所と通過できない場所に対する特定の拘束が設計に含まれている場合に便利です。制御点を介して指定された曲線は、本質的には一連の直線セグメントであり、アルゴリズムによってスムージングされて最終的な曲線形状となります。制御点を介して曲線を指定することは、さまざまな次数のスムージングで曲線形状を検討する場合や、曲線セグメント間でスムーズな連続性が必要な場合に便利です。
補間された曲線を作成するには、点の集合を NurbsCurve.ByPoints メソッドに渡すのみです。
生成された曲線は入力された点それぞれと交差し、集合の最初の点から始まり、最後の点で終わります。オプションの周期パラメータを使用すると、閉じた周期的な曲線を作成できます。Dynamo では欠落しているセグメントは自動的に入力されるので、重複する終了点(開始点と同一)は必要ありません。
NURBS 曲線はほぼ同じ方法で生成され、入力された点は直線セグメントの端点を表し、次数と呼ばれる 2 番目のパラメータによって、曲線のスムージングの量とタイプが指定されます。* 次数が 1 の曲線はスムーズな部分がなく、ポリラインとなります。
次数が 2 の曲線は、曲線が交差し、ポリライン セグメントの中点と正接するようにスムージングされます。
Dynamo では、次数 20 までの NURBS (Non-Uniform Rational B Spline、非一様有理 B スプライン)曲線がサポートされます。次のスクリプトは、スムージング レベルの増加が曲線の形状に与える効果を示します。
制御点の数は、曲線の次数よりも少なくとも 1 つ多くする必要があります。
制御頂点による曲線の構築には、個々の曲線セグメント間で正接状態を維持できるという利点もあります。最後の 2 つの制御点間の方向が抽出され、この方向がそれに続く曲線の最初の 2 つの制御点で継続されることによって正接を維持します。次の例では、別々であっても 1 つの曲線のようにスムーズな 2 つの NURBS 曲線が作成されます。
*これは、NURBS 曲線ジオメトリについての非常に簡単な説明です。より正確かつ詳細な説明については、Pottmann 氏その他(2007 年)の考察を参照してください。
Dynamo のノード名に共通の形式があることにお気付きでしょうか。各ノードはスペースなしの「.」構文を使用しています。これは、各ノードの最上部にあるテキストがスクリプトの実際の構文を表しており、「.」(ドット表記)が呼び出し可能なメソッドと要素を区切っています。これにより、ビジュアル スクリプトから文字ベースのスクリプトに簡単に変換することができます。
ドット表記の一般的な使用例として、apple (リンゴ)というパラメータが Dynamo でどのように処理されるか見てみましょう。以下は、リンゴを食べる前にリンゴに対して実行するいくつかのメソッドを示しています。(注: これらは Dynamo の実際のメソッドではありません)。
説明 | ドット表記 | 出力 |
---|
読者がどう思われるかはわかりませんが、上記の表の出力から判断すると、私にはおいしいリンゴのように見えます。Apple.eat() を実行しようと思います。
リンゴの例を念頭に置きながら、Point.ByCoordinates で Code Block を使用して点を作成する方法を見てみましょう。
Code Block ノードの構文 Point.ByCoordinates(0,10);
は、Dynamo の Point.ByCoordinates ノードと同じ結果を生成します。ただし、1 つのノードを使用して点を作成できるという違いがあります。x 入力と y 入力に異なるノードを接続する必要がないため、より効率的です。
Code Block で Point.ByCoordinates を使用することにより、初期設定のままのノード (x,y) と同じ順番で入力を指定します。
ライブラリ内の通常のノードは、Code Block を通じて呼び出すことができます。ただし、特別なユーザ インタフェース機能を持つ特別な UI ノード は呼び出すことができません。たとえば、Circle.ByCenterPointRadius を呼び出すことはできますが、Watch 3D ノードを呼び出すことは意味がありません。
通常の(ライブラリのほとんどの)ノードは一般的に 3 つのタイプに分けられます。ライブラリはこれらのカテゴリに基づいて編成されています。これらの 3 つのタイプのメソッド(ノード)では、Code Block で呼び出されるときの処理がそれぞれ異なります。
Create - 何かを作成(または構築)します
Action - 何かに対してアクションを実行します
Query - 既に存在する何かのプロパティを取得します
[Create]カテゴリはジオメトリを一から構築します。Code Block には値を左から右に入力します。これらの入力の順番は、上から下に入力するノードの入力の順序と同じです。
Line.ByStartPointEndPoint ノードと、Code Block 内の対応する構文とでは、同じ結果が生成されます。
このタイプのオブジェクトに対してはアクションを行います。Dynamo は(多くのコーディング言語で一般的な) ドット表記 を使用して、対象に対してアクションを適用します。対象とするオブジェクトを決めたら、ドットに続けてアクション名を入力します。Action タイプのメソッドの入力は、Create タイプのメソッドと同様、括弧で囲んで指定されます。ただし、対応するノードの最初の入力を指定する必要はありません。代わりに、アクションの実行対象の要素を指定します。
Point.Add ノードは Action タイプのノードであるため、構文の動作が多少異なります。
入力は(1) point と、(2)その点に追加する vector の 2 つです。Code Block では、点(対象)に「pt」という名前を付けています。*“vec” *という名前のベクトルを「pt」に追加するには、pt.Add(vec)、つまり「対象、ドット、アクション」の形式で書き込みます。Add アクションの入力は 1 つのみであるか、または Point.Add ノードの最初の入力を除くすべての入力になります。Point.Add ノードの最初の入力は点自体です。
Query タイプのメソッドはオブジェクトのプロパティを取得します。オブジェクト自体が入力であるため、入力を指定する必要はありません。括弧は必要ありません。
ノードを使用するレーシングと、Code Block を使用するレーシングとは少々異なります。ノードを使用する場合、ユーザはノードを右クリックして、実行するレーシング オプションを選択します。Code Block を使用する場合、ユーザはデータを構築する方法をより詳しくコントロールできます。Code Block の省略表記では、複製ガイド を使用して、複数の 1 次元リストをペアリングする方法を設定します。山括弧「<>」内の数値(<1>、<2>、<3> など)は、生成するネストされたリストの階層を設定します。
この例では、省略表記で 2 つの範囲を設定します(省略表記については、この章の次のセクションで詳しく説明します)。つまり、
0..1;
は{0,1}
に相当し、-3..-7
は{-3,-4,-5,-6,-7}
に相当します。この結果、2 つの x 値と 5 つの y 値のリストが返されます。このような範囲が一致していないリストを持つ複製ガイドを使用しない場合は、2 つの点が含まれるリストが返され、リストの長さは短い方の長さになります。複製ガイドを使用すると、2 つの値と 5 つの値を組み合わせたすべての座標(または外積)を表示できます。構文 Point.ByCoordinates
(x_vals<1>,y_vals<2>);
を使用すると、それぞれ 5 つの項目を含む 2 つのリストが生成されます。構文 Point.ByCoordinates
(x_vals<2>,y_vals<1>);
を使用すると、それぞれ 2 つの項目を含む 5 つのリストが生成されます。
この表記では、5 つの項目を持つ 2 つのリストと 2 つの項目を持つ 5 つのリストのどちらを優先リストにするか指定することもできます。例では、複製ガイドの順番を変更することにより、グリッドの点の行のリストまたは列のリストを生成できます。
Code Block を使用する上記の方法を使用するには多少の慣れが必要ですが、Dynamo には処理を容易にする[ノードをコード化]という機能があります。この機能を使用するには、Dynamo グラフでノードの配列を選択し、キャンバスを右クリックして、[ノードをコード化]を選択します。Dynamo はこれらのノードを、すべての入力と出力を含め、1 つの Code Block に統合します。このツールは Code Block の学習に役立つだけでなく、より効率的でパラメトリックな Dynamo グラフの使用を可能にします。次の演習では最後に[ノードをコード化]を使用します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
Code Block の性能を紹介するため、既存のアトラクタ フィールドの設定を Code Block の形式に変換します。既存の設定を使用することにより、Code Block がビジュアル スクリプトとどのように関連付けられているかを確認し、DesignScript 構文について学習します。
まず、上記の画像の設定を再作成します(またはサンプル ファイルを開きます)。
Point.ByCoordinates ノードのレーシングが 外積 に設定されていることに注目してください。
グリッド内の各点は、参照点までの距離に基づいて Z の正の向きに移動します。
サーフェスが再作成されて厚みが付けられ、参照点までの距離を基準にしてジオメトリ内にふくらみが作成されます。
まず、参照点 Point.ByCoordinates
(x,y,0);
を定義します。参照点ノードの最上部で指定したものと同じ Point.ByCoordinates 構文を使用します。Code Block に変数 x と y が挿入され、スライダを使用してこれらを動的に更新できます。
-50 から 50 までの範囲の スライダ をいくつか Code Block ノードの入力に追加します。これにより、既定の Dynamo グリッド全体を使用できます。
Code Block ノードの 2 行目で、数値シーケンス ノードを置き換える省略表記を定義します。
coordsXY = (-50..50..#11);
これについては、次のセクションで詳しく説明します。ここでは、この省略表記がビジュアル スクリプトの Number Sequence ノードに相当していることを確認してください。
次に、coordsXY シーケンスから点のグリッドを作成します。これを行うには Point.ByCoordinates 構文を使用します。ただし、ビジュアル スクリプトで実行した場合と同様、リストにある 外積 を作成する必要もあります。これを行うには、行(
gridPts = Point.ByCoordinates(coordsXY<1>,coordsXY<2>,0);
)を入力します。山括弧は外積参照を意味します。Watch3D ノードには Dynamo のグリッド全体に点のグリッドが表示されます。
少し難しくなってきますが、ここで、点のグリッドを参照点までの距離に基づいて上方向に移動する必要があります。まず新しい点のセット transPts を呼び出しましょう。変換は既存の要素に対するアクションであるため、
Geometry.Translate...
ではなくgridPts.Translate
を使用します。キャンバス上の実際のノードから、3 つの入力があることが読み取れます。変換するジオメトリは既に宣言されています。この要素に対して、gridPts.Translate を使用してアクションを実行しているためです。残りの 2 つの入力は関数 direction と distance の括弧内に挿入されます。
方向の指定は簡単です。
Vector.ZAxis()
を使用して垂直方向に移動します。参照点と各グリッド間の距離は計算する必要があります。これは同様に、参照点に対するアクションとして実行します:
refPt.DistanceTo(gridPts)
。最後のコード行は、変換された点を示します:
transPts=gridPts.Translate(Vector.ZAxis(),refPt.DistanceTo(gridPts));
。
これで適切なデータ構造を持つ点のグリッドを使用して NURBS サーフェスを作成できます。
srf = NurbsSurface.ByControlPoints(transPts);
を使用してサーフェスを作成します。
最後に、サーフェスに深さを追加するため、
solid = srf.Thicken(5);
を使用してソリッドを構築します。ここではコードで 5 単位を指定して厚みを付けますが、これを変数として(thickness などの名前を付けて)宣言し、スライダを使用して値をコントロールすることも可能です。
[ノードをコード化]機能を使用すると、先ほど終了した演習全体を、ボタンをクリックするだけで自動化できます。このツールはカスタム設定や再利用可能な Code Block の作成に優れているだけでなく、Dynamo でスクリプトを作成する方法を学習するのにも役立ちます。
まず、この演習の手順 1 で使用したビジュアル スクリプトを操作してみます。すべてのノードを選択し、キャンバスを右クリックして、[ノードをコード化]を選択します。非常に簡単です。
Dynamo はビジュアル グラフ、レーシングなどの文字ベースのバージョンを自動化しています。これをビジュアル スクリプトでテストして、Code Block の性能をお試しください。
関数は Code Block ノード内で作成することができ、Dynamo 定義の任意の場所から呼び出すことができます。これにより、パラメトリック ファイル内に新しいコントロール レイヤーが追加されます。Code Block ノードは、テキストベースのカスタム ノードとしてみなすことができます。この場合、「親」コード ブロックに簡単にアクセスすることができます。親コード ブロックは、グラフ上の任意の場所に配置することができます。ワイヤは必要ありません。
最初の行に、キーワードの「def」と関数名を続けて入力し、入力データの名前を括弧で囲んで記述します。関数の本文を定義する場合は、波括弧 {} を使用します。値を返す場合は、「return =」を指定します。関数を定義する Code Block ノードは他の Code Block ノードから呼び出されるため、入力ポートと出力ポートはありません。
関数を呼び出すには、同じファイル内で別の Code Block ノードを使用して、呼び出す関数の名前と、親 Code Block ノードで定義されているものと同じ数の引数を指定します。これは、ライブラリ内に用意されているノードと同様に動作します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
この演習では、点の入力リストから球体を生成する一般的な定義を作成します。これらの球体の半径は、各点の Z プロパティによってコントロールされます。
最初に、0 から 100 までの範囲内で 10 個の数値を作成しましょう。これらの数値を Point.ByCoordinates ノードに接続し、斜線を作成します。
Code Block ノードを作成して、定義を追加します。
次のコード行を使用します。
inputPt は、関数をコントロールする点を表す名前です。この時点では、この関数はまだ機能しませんが、これ以降の手順でこの関数を設定していきます。
Code Block ノードを使用して、この関数にコメントと sphereRadius 変数を入力します。この変数により、各点の Z 位置のクエリーが実行されます。inputPt.Z はメソッドであるため、引数を指定するための括弧は必要ありません。これは既存の要素のプロパティの クエリー であるため、入力は必要ありません。
ここで、別の Code Block ノードで作成した関数を呼び出してみましょう。キャンバスをダブルクリックして新しい Code Block ノードを作成し、sphereB と入力すると、既に定義されている sphereByZ 関数が候補として表示されます。これにより、前の手順で作成した関数が IntelliSense ライブラリに追加されていることがわかります。
関数を呼び出して Pt という変数を作成して、前の手順で作成した点を接続します。
出力されたリストを確認すると、値がすべて NULL になっていることがわかります。なぜでしょうか。これは、この関数を定義するときに sphereRadius 変数は計算しましたが、この関数が何を 出力 として 返す のかを定義しなかったためです。これについては、次の手順で修正します。
sphereByZ 関数に
return = sphereRadius;
というコード行を追加して、関数の出力を定義する必要があります。これは重要な手順です。Code Block ノードの出力は、各点の Z 座標です。
親 関数を編集して、実際に球体を作成してみましょう。
まず、次のコード行で球体を定義します。
sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);
次に、戻り値が sphereRadius から sphere となるように
return = sphere;
と記述します。これにより、Dynamo プレビューで非常に大きな球体が表示されます。
1.これらの球体のサイズを調整するには、
sphereRadius = inputPt.Z/20;
という除数を追加して sphereRadius 値を更新します。これで、各球体が離れて表示され、半径と Z 値との関係がわかるようになります。
Point.ByCoordinates ノードでレーシングを[最短リスト]から[直積]に変更して、点のグリッドを作成します。sphereByZ 関数により、すべての点で Z 値に基づいた半径の円が作成されます。
次に、Point.ByCoordinates ノードの X 入力に元の数値のリストを接続してみます。この操作により、球体によって構成される立方体が作成されます。
注: この処理に時間がかかる場合は、#10 を #5 などの値に変更してください。
ここで作成した sphereByZ 関数は汎用的な関数であるため、前の演習で作成したらせん構造を呼び出して、この関数を適用することができます。
最後に、半径の比をユーザ設定のパラメータでコントロールしてみましょう。これを行うには、関数に対して新しい入力を作成し、除数の 20 をパラメータで置き換える必要があります。
sphereByZ 関数の定義を、次のように更新します。
sphereByZ(Pt,ratio);
のように、子の Code Block ノードの入力に ratio 変数を追加して更新します。次に、新しく作成した Code Block ノードの入力に Number Slider ノードを接続し、半径の比に基づいて半径のサイズを変更します。
計算設計ではオブジェクトが最終的な位置や形状で明示的に作成されることはほとんどなく、通常は既存のジオメトリに基づいて、移動、回転、およびその他の方法で配置されます。ベクトル計算は、幾何学的な足場の一種として機能することで方向およびジオメトリに対する向きを示し、視覚的に表示せずに 3D 空間での動きを概念化します。
最も基本的には、ベクトルは 3D 空間における位置を表し、通常は(0, 0, 0)の位置からその位置までの矢印の終了点と考えられます。ベクトルは ByCoordinates コンストラクタで、新しく作成される Vector オブジェクトの X、Y、Z の位置を指定することで作成できます。Vector オブジェクトはジオメトリ オブジェクトではないため、Dynamo ウィンドウには表示されません。ただし、新しく作成または修正されたベクトルに関する情報は、コンソール ウィンドウに出力されます。
一連の算術演算が Vector オブジェクトで定義されることによって数直線上の 1 次元空間で実数を移動するように、3 次元空間で加算、減算、乗算、およびその他の方法でオブジェクトを移動できます。
ベクトルの加算は、2 つのベクトルのコンポーネントの合計として定義され、2 つのコンポーネントのベクトルの矢印が「後端に先端が付く」形で配置された場合に結果として得られるベクトルと考えることができます。 ベクトルの加算は Add メソッドを使用して実行され、左側のダイアグラムで表示されます。
同様に、2 つの Vector オブジェクトは、Subtract メソッドを使用して互いに減算できます。ベクトルの減算は 1 番目のベクトルから 2 番目のベクトルへの方向と考えることができます。
ベクトルの乗算はベクトルの終了点がそのベクトル自身の方向に所定のスケール係数だけ移動すると考えることができます。
通常、ベクトルのスケールを変更する場合には、結果として得られるベクトルの長さをスケール変更された量と正確に同じにすることが求められます。これは、最初にベクトルを正規化する、つまり、ベクトルの長さが正確に 1 に等しくなるように設定することで、容易に実行できます。
c の長さは正確に 5 に等しいですが、a (1, 2, 3)と同じ方向を向いたままです。
ベクトル計算には 1 次元の計算とは明確な類似点のないメソッドがさらに 2 つあります。外積と内積です。外積は、2 つの既存のベクトルに対して(90 度で)直交するベクトルを生成する手段です。たとえば、X 軸と Y 軸の外積は Z 軸です。ただし、2 つの入力ベクトルが互いに直交している必要はありません。外積ベクトルは Cross メソッドを使用して計算されます。
ベクトル計算のさらに少し高度な関数が内積です。2 つのベクトル間の内積は、2 つのベクトル間の角度に関係する実数(Vector オブジェクトではない)ですが、角度そのものではありません。内積の便利なプロパティの 1 つとして、2 つのベクトルが垂直の場合、かつ垂直の場合に限り、そのベクトル間の内積が 0 となります。内積は Dot メソッドを使用して計算されます。
Dynamo の標準のジオメトリ ライブラリで最も単純なジオメトリ オブジェクトは、点です。すべてのジオメトリはコンストラクタという特別な関数を使用して作成され、各関数はその特定のジオメトリ タイプの新しいインスタンスを返します。Dynamo では、コンストラクタの名前はオブジェクトのタイプ(この場合は Point)で始まり、構築メソッドが続きます。X、Y、Z のデカルト座標で指定された 3 次元の点を作成するには、次のように ByCoordinates コンストラクタを使用します。
Dynamo では、コンストラクタは通常、接頭表記「By」を使用して指定され、これらの関数を呼び出すと、そのタイプの新しく作成されたオブジェクトを返します。この新しく作成されたオブジェクトは、等号の左側にある名前の変数に格納されます。
ほとんどのオブジェクトには、多種多様なコンストラクタがあり、次のように BySphericalCoordinates コンストラクタを使用すると、球の半径、1 番目の回転角度、2 番目の回転角度(度単位)を指定して、球体上の点を作成できます。
点を使用して、線分などのより高い次元のジオメトリを構築できます。次のように ByStartPointEndPoint コンストラクタを使用すると、2 つの点の間に Line オブジェクトを作成できます。
同様に、線分を使用してより高い次元のサーフェス ジオメトリを作成できます。たとえば、Loft コンストラクタを使用すると、一連の線分または曲線を使用してその間にサーフェスを補間します。
サーフェスを使用してより高い次元のソリッド ジオメトリを作成することもできます。たとえば指定した距離だけサーフェスに厚みを付けてソリッドを作成します。多くのオブジェクトには、メソッドと呼ばれる関数がアタッチされ、これを使用することでプログラマはその特定のオブジェクトに関するコマンドを実行できます。ジオメトリのすべてのピースに共通するメソッドには、Translate および Rotate があり、それぞれ指定した量だけジオメトリを移動および回転します。サーフェスには Thicken メソッドがあり、1 つの数字を入力してサーフェスの新しい厚みを指定します。
Intersection コマンドによって、高い次元のオブジェクトから低い次元のジオメトリを抽出できます。この抽出された低い次元のジオメトリは、ジオメトリの作成、抽出、再作成を繰り返すことで、高い次元のジオメトリの基盤を形成できます。この例では、生成されたソリッドを使用してサーフェスを作成し、そのサーフェスを使用して曲線を作成します。
計算設計では、曲線とサーフェスが、以降のジオメトリの構築の基礎となる足場として頻繁に使用されます。この初期のジオメトリを後のジオメトリの基盤として使用するために、オブジェクトの領域全体での位置や向きなどの属性を、スクリプトによって抽出できる必要があります。曲線とサーフェスの両方によってサポートされるこの抽出はパラメータ化と呼ばれます。
曲線上のすべての点は 0 から 1 までの範囲の一意のパラメータを持つと考えることができます。いくつかの制御点や補間された点に基づいて NURBS 曲線を作成する場合、最初の点のパラメータは 0、最後の点のパラメータは 1 となります。中間点の正確なパラメータを事前に知ることはできません。そのため、一連のユーティリティ関数で緩和されるものの、厳しい制限のように感じられるかもしれません。サーフェスのパラメータ化は曲線の場合と同様ですが、1 つではなく、u と v という 2 つのパラメータがあります。次の点を使用してサーフェスを作成する場合、
p1 のパラメータは u = 0 v = 0 で、p9 のパラメータは u = 1 v = 1 です。
パラメータ化は、曲線の生成に使用する点を決定する場合にはそれほど有用ではなく、主に、中間点が NurbsCurve コンストラクタおよび NurbsSurface コンストラクタで生成された場合にその位置を判断するために使用します。
曲線には PointAtParameter メソッドがあり、0 から 1 の double 型の引数を 1 つ使用して、そのパラメータの Point オブジェクトを返します。たとえば、このスクリプトでは、パラメータが 0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9、1 の点を見つけます。
同様に、サーフェスには PointAtParameter メソッドがあり、生成された点の u パラメータと v パラメータという 2 つの引数を使用します。
曲線上およびサーフェス上の個々の点を抽出することは便利ですが、スクリプトでは通常、曲線やサーフェスが向いている方向など、パラメータの特定の幾何学的特性を知る必要があります。CoordinateSystemAtParameter メソッドでは、曲線やサーフェスのパラメータでの位置だけでなく、方向が設定された座標系も見つかります。たとえば、次のスクリプトによって、回転サーフェスに沿って方向が設定された座標系が抽出され、その座標系の向きを使用して、サーフェスに垂直な線分が生成されます。
前に述べたように、曲線やサーフェスの長さ全体で常に均一にパラメータ化されるわけではありません。つまり、0.5 のパラメータが常に中点に対応したり、0.25 が常に曲線またはサーフェスの 1/4 の点に対応するわけではありません。この制限を回避するため、曲線にはパラメータ化のコマンドの追加のセットがあり、これによって、曲線に沿った特定の長さにある点を検索できます。
Dynamo が多様で複雑なジオメトリ形状を作成できる一方で、単純なジオメトリ プリミティブは、任意の計算設計の中核となり、設計された最終形状で直接表現されるか、より複雑なジオメトリを生成するための足場として使用されます。
厳密にはジオメトリの一部ではありませんが、CoordinateSystem はジオメトリを構築するための重要なツールです。CoordinateSystem オブジェクトは、位置および回転、せん断変形、スケーリングなどのジオメトリ変換の両方を把握します。
x = 0、y = 0、z = 0 の点を中心とし、回転、スケーリング、せん断変形などの変換がない CoordinateSystem の作成に必要なのは、Identity コンストラクタを呼び出すことのみです。
CoordinateSystem.ByOriginVectors という別のコンストラクタを使用すると、次のように特定の点に座標系を作成できますが、ジオメトリ変換された CoordinateSystem については、この章で説明しません。
最も単純なジオメトリ プリミティブは点であり、3 次元空間でゼロ次元の場所を表します。前に説明したように、特定の座標系での点の作成には、いくつかの異なる方法があります。Point.ByCoordinates は X、Y、Z 座標を指定して点を作成し、Point.ByCartesianCoordinates は特定の座標系で X、Y、Z 座標を指定して点を作成し、Point.ByCylindricalCoordinates は半径、回転角度、および高さを使用して円柱上にある点を作成し、Point.BySphericalCoordinates は半径と 2 つの回転角度を使用して球上にある点を作成します。
この例は、さまざまな座標系で作成された点を示しています。
次に高い次元の Dynamo プリミティブは線分セグメントで、2 つの端点間にある無限の数の点を表します。Line.ByStartPointEndPoint コンストラクタを使用して 2 つの境界点を明示的に指定するか、Line.ByStartPointDirectionLength で開始点、方向、およびその方向の長さを指定することで、線分を作成できます。
Dynamo には、最も基本的なタイプのジオメトリ プリミティブを 3 次元で表すオブジェクトがあります。Cuboid.ByLengths で作成される直方体、Cone.ByPointsRadius および Cone.ByPointsRadii で作成される円錐、Cylinder.ByRadiusHeight で作成される円柱、Sphere.ByCenterPointRadius で作成される球です。
次の Python スクリプトは、点の配列を生成する例をいくつか示しています。これらは、次のように、Python Script ノードに貼り付ける必要があります。
python_points_1
python_points_2
python_points_3
python_points_4
python_points_5
リンゴは何色ですか? | Apple.color | red |
リンゴは熟していますか? | Apple.isRipe | true |
リンゴの重さはどのくらいですか? | Apple.weight | 6 oz |
リンゴはどこで生まれましたか? | Apple.parent | tree |
リンゴは何を作りますか? | Apple.children | seeds |
このリンゴは地元で育てられましたか? | Apple.distanceFromOrchard | 60 mi. |
2 次元のアナログから NURBS 曲線への変換が NURBS 曲面であり、フリーフォーム NURBS 曲線のように、2 つの基本的な方法で NURBS 曲面を構築できます。その方法とは、基点のセットを入力して Dynamo によってその間を補間する方法と、サーフェスの制御点を明示的に指定する方法です。また、フリーフォーム曲線のように、補間によるサーフェスは、サーフェスが取るべき形状を設計者が正確に認識している場合や、サーフェスが拘束点を通過することが必要な設計の場合に便利です。一方、制御点によって作成されたサーフェスは、さまざまなスムージング レベルで実験的な設計を行う場合に便利です。
補間されたサーフェスを作成するには、サーフェスの形状を近似する 2 次元の点の集合を生成するだけです。集合は、長方形であることが必要です。つまり、ギザギザではありません。NurbsSurface.ByPoints メソッドで、これらの点からサーフェスが構築されます。
フリーフォーム NURBS 曲面も、サーフェスの基礎となる制御点を指定することで作成できます。NURBS 曲線のように、制御点は直線セグメントによる四角形のメッシュを表すと考えることができ、このメッシュはサーフェスの次数に応じてスムージングされて最終的なサーフェス形状となります。NURBS 曲面を制御点によって作成するには、2 つのパラメータを NurbsSurface.ByPoints に追加して、サーフェスの両方向での基礎となる曲線の次数を示します。
NURBS 曲面の次数を増やして、結果として得られるサーフェス ジオメトリを変更できます。
サーフェスは、一連の入力された点の間を補間することで作成できるのと同様に、一連のベースとなる曲線の間を補間することで作成できます。これをロフトと呼びます。ロフトによるサーフェスは、Surface.ByLoft コンストラクタを使用して、入力された曲線の集合のみをパラメータとして作成されます。
回転のサーフェスは別のタイプのサーフェスで、中心軸を中心にベースとなる曲線をスイープして作成されます。補間されたサーフェスが 2 次元のアナログから補間された曲線への変換だとすると、回転のサーフェスは、2 次元のアナログから円や円弧への変換です。
回転のサーフェスは、サーフェスの「エッジ」を表すベースとなる曲線、サーフェスの基点となる軸の原点、中心の「核」の方向となる軸方向、スイープの開始角度、およびスイープの終了角度によって指定されます。これらは Surface.Revolve コンストラクタへの入力として使用されます。
Intersect、Trim、および SelectTrim は、点、曲線、サーフェスなどの低い次元のジオメトリに主に使用されます。一方、ソリッド ジオメトリには、Trim と同様の方法でマテリアルを取り除くことおよび要素を結合して全体を大きくすることの両方によって構築後に形状を修正するための、一連のメソッドが追加されています。
Union メソッドでは、2 つのソリッド オブジェクトが使用され、両方のオブジェクトによってカバーされる空間から単一のソリッド オブジェクトが作成されます。オブジェクト間で重複する空間は最終形状に結合されます。この例では、球と直方体が結合して単一のソリッドの球-立方体形状となります。
Difference メソッドでは、Trim のように、ベースとなるソリッドから入力されたツールとなるソリッドの内容が取り除かれます。この例では、球から小さなくぼみが削り出されています。
Intersect メソッドでは、2 つのソリッド入力間の重複するソリッドが生成されます。次の例では、Difference が Intersect に変更され、結果として得られるソリッドは、最初に削り出されていた空間がなくなっています。
データ タイプ
標準 Dynamo
Code Block の同等表記
数値
文字列
シーケンス
範囲
インデックスでの項目の取得
リストの作成
文字列の連結
条件ステートメント
ノード
Code Block の同等表記
注
演算子(+、&&、>=、Not など)
+、&&、>=、! など
「Not」は「!」になりますが、「Factorial」(階乗)と区別するためにノードは「Not」と呼ばれます
ブールの True
true;
小文字を使用します
ブールの False
false;
小文字を使用します
3 次元空間で X、Y、Z 座標を明示的に指定することで、特定のジオメトリ オブジェクトを作成できます。ただし、多くの場合、オブジェクト自体またはその基礎となる座標系でジオメトリ変換を使用して、ジオメトリを最終的な位置に移動します。
最も単純な幾何学的変換は移動であり、オブジェクトを X、Y、Z 軸方向に指定した単位の数だけ動かします。
Dynamo 内のすべてのオブジェクトは、オブジェクト名の末尾に .Translate メソッドを追加することで移動できますが、より複雑な変換では、基礎となる座標系から新しい座標系にオブジェクトを変換する必要があります。たとえば、オブジェクトを X 軸を中心にして 45 度回転させるには、回転していない既存の座標系から、.Transform メソッドで X 軸を中心にして 45 度回転した座標系にオブジェクトを移動します。
移動と回転に加えて、スケール変更やせん断変形された座標系も作成できます。座標系のスケールは .Scale メソッドを使用して変更できます。
せん断変形された座標系は、非直交ベクトルを CoordinateSystem コンストラクタに入力することで作成されます。
スケール変更とせん断変形は回転や移動よりも比較的複雑なジオメトリ変換であるため、すべての Dynamo オブジェクトで実行できるわけではありません。次の表は、スケールが均一でない座標系およびせん断変形された座標系を持つことができる Dynamo オブジェクトの概略です。
これまでの多くの例では、低い次元のオブジェクトから高い次元のジオメトリを構築することに注目してきました。交差メソッドを使用すると、この高い次元のジオメトリから低い次元のオブジェクトを生成でき、一方でトリム コマンドを選択すると、ジオメトリ形状を作成した後にスクリプトによって大幅に修正できます。
Intersect メソッドは Dynamo のジオメトリのすべてのピース上で定義されます。つまり、理論的にはジオメトリのどのピースもジオメトリの他の任意のピースと交差できます。点に関する交差では結果として得られるオブジェクトは常に入力された点そのものとなるなど、意味のない交差も当然あります。オブジェクト間での交差のその他の可能な組み合わせについて、次の表で概要を示します。次の表はさまざまな交差の操作の結果の概要を示しています。
次の非常に簡単な例では、平面と NURBS 曲面の交差を示しています。交差によって NURBS 曲線の配列が生成され、これを他の NURBS 曲線のように使用できます。
Trim メソッドは Intersect メソッドに非常によく似ており、ジオメトリのほぼすべてのピースに対して定義されます。ただし Trim には Intersect よりもはるかに多くの制限があります。
Trim メソッドについては、「選択」点が必要であることに注意が必要です。この点によってどのジオメトリを破棄してどの部分を保持するかが決まります。Dynamo は、選択点に最も近いトリムされたジオメトリを見つけて破棄します。
前のセクションでは、Dynamo で Python スクリプトを使用する方法について説明しました。このセクションでは、スクリプティング環境に Revit ライブラリを接続する方法を見てみましょう。ここまでの手順で、次のコード ブロックの最初の 4 行を使用して、Python 標準ライブラリと Dynamo の Core ノードが既に読み込まれています。数行のコードを追加するだけで、Revit の各種のノード、要素、ドキュメント マネージャを読み込むことができます。
これにより、Revit API にアクセスし、任意の Revit タスクでカスタム スクリプトを使用できるようになります。ビジュアル プログラミングのプロセスと Revit API スクリプトを組み合わせることにより、コラボレーションやツールの開発が容易になります。たとえば、BIM マネージャと回路設計者が、同じグラフを使用して同時に作業することができます。こうしたコラボレーションにより、モデルの設計と施工を改善できます。
新しい Revit プロジェクトを作成します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
これ以降の一連の演習では、Dynamo for Revit における基本的な Python スクリプトについて説明します。この演習では、Revit のファイルと要素を使用します。また、Revit と Dynamo 間の通信についても説明します。
ここでは、Dynamo セッションにリンクされた Revit ファイルの doc 、 uiapp 、 app を取得するための一般的な方法について説明します。Revit API を使用したことのある方ならば、Watch リストのような項目を見たことがあるかもしれません。これらの項目を見たことがなくても、特に問題はありません。これ以降の演習で、別の例を使用して説明します。
RevitServices を読み込み、Dynamo のドキュメント データを取得するには、次のようなスクリプトを記述します。
ここで、Dynamo の Python Script ノードを確認します。次のコードを参照することもできます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
この演習では、Dynamo の Python Script ノードを使用して、Revit 内に単純なモデル曲線を作成します。
最初に、Revit 内に新しいコンセプト マス ファミリを作成します。
コンセプト マス フォルダ を開き、Metric Mass.rft テンプレート ファイルを使用します。
Revit で、キーボード ショートカット un
を使用してプロジェクトの単位の設定を表示し、長さの単位をメートルに変更します。
Dynamo を起動し、下図に示す一連のノードを作成します。次に、Dynamo のノードを使用して、Revit 内に 2 つの参照点を作成します。
Code Block ノードを作成し、
"0;"
の値を設定します。この値を、ReferencePoint.ByCoordinates ノードの X、Y、Z 入力に接続します。
-100 ~ 100 の範囲内で、ステップ値が 1 の Number Slider ノードを 3 つ作成します。
各スライダを ReferencePoint.ByCoordinates ノードに接続します。
Python Script ノードをワークスペースに追加し、このノードの[+]ボタンをクリックして入力をもう 1 つ追加し、各入力に参照点を接続します。Python Script ノードを開きます。
ここで、Dynamo の Python Script ノードを確認します。下の完全なコードを見つけます。
System Array: Revit の入力には、Python リストではなく System.Array が必要です。これは 1 行のコードに過ぎませんが、引数のタイプに注意すると、Revit での Python プログラミングが容易になります。
ここまでの手順では、Dynamo で Python を使用して、線分で接続された 2 つの参照点を作成しました。次の演習で、さらに操作を進めてみましょう。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
この演習では、簡単な操作を実行することにより、Revit と Dynamo 間で相互にデータやジオメトリを接続する場合の要点について説明します。最初に Revit-StructuralFraming.rvt を開き、次に Dynamo を起動して、Revit-StructuralFraming.dyn ファイルを開きます。
この Revit ファイルは、基本的なファイルです。レベル 1 とレベル 2 にそれぞれ 1 本ずつ、2 本の異なる参照曲線が描画されています。これらの曲線を Dynamo に読み込み、ライブ リンクを作成します。
このファイルでは、Python Script ノードの 5 つの入力に一連のノードが接続されています。
各 Select Model Element ノードの[選択]ボタンをクリックし、Revit 内の対応する曲線を選択します。
Code Block ノードで「
0..1..#x;
」という構文を使用して、 0 ~ 20 までの範囲を持つ Integer Slider ノードを x 入力に接続します。この操作により、2 本の曲線の間に作成する梁の数を指定します。Structural Framing Types ノードのドロップダウン メニューで、既定の W12x26 梁を選択します。
Levels ノードで、「Level 1」を選択します。
この Python コードは、これまでのコードよりも行数が多くなっていますが、コード行の前後のコメントを参照すると、プロセス内の処理内容を確認できます。
Revit で、2 つの曲線にわたる梁の配列が構造要素として作成されました。注: この構造要素は、Dynamo でネイティブの Revit インスタンスを作成する場合の例として使用しているもので、実際にはあり得ない構造要素であることに注意してください。
Dynamo でも、結果を確認できます。Watch3D ノードの梁は、Revit 要素からクエリーされたジオメトリを参照します。
このセクションでは、Revit 環境から Dynamo 環境にデータを変換する一連のプロセスを作成しました。このプロセスをまとめると、次のようになります。
Revit の要素を選択する
Revit の要素を Dynamo の曲線に変換する
Dynamo の曲線を一連の Dynamo の点に分割する
Dynamo の 2 つの曲線間の点を使用して Dynamo の線分を作成する
Dynamo の線分を参照することにより、Revit の梁を作成する
Revit の梁のジオメトリに対してクエリーを実行することにより、Dynamo のサーフェスを出力する
これは複雑なプロセスに見えるかもしれませんが、スクリプトを使用すると、Revit で曲線を編集してソルバを再実行するのと変わらないほど単純な処理になります(ただし、そのためには、元の梁を削除する必要があります)。これは、Python で梁を配置することによって、初期設定のままのノードにある関連付けが解除されるためです。
Revit で参照曲線を更新すると、梁の新しい配列が作成されます。
Python は、シンプルな構文が特徴の、幅広く使用されているプログラミング言語です。構文が非常に読みやすいため、他の多くの言語より簡単に習得できます。Python はモジュールとパッケージをサポートしており、既存のアプリケーションに組み込むことができます。Python を実行する方法については、 のページを参照してください。
Dynamo 2.0 では、初めて Python ウィンドウを開く際に、既定で使用するテンプレート (.py extension)
を指定することができます。この機能があると、Dynamo 内で Python を効率よく使用できるため以前からご要望をいただいておりました。テンプレートを使用できる機能があるため、カスタム Python スクリプトを開発する際に既定のインポートをすぐに利用できます。
このテンプレートは、Dynamo をインストールした APPDATA
にあります。
通常は次のように計算されます。( %appdata%\Dynamo\Dynamo Core\{version}\ )
この機能を使用するには、 DynamoSettings.xml
ファイルで次の行を追加する必要があります。(メモ帳で編集します)
<PythonTemplateFilePath />
を見つけて、これを次のように置き換えるだけです。
注: CURRENTUSER を自分のユーザ名に置き換えてください
次に、使用する機能を組み込んだテンプレートを作成する必要があります。ここでは、Revit に関連するインポートおよび Revit で作業する際の他の一般的な項目の一部を組み込みます。
空のメモ帳を起動して、次のコードを貼り付けることができます。
貼り付けが完了したら、このファイルを PythonTemplate.py
という名前で APPDATA
フォルダ内に保存します。
Python テンプレートが定義されると、Python Script ノードが配置されるたびに、Dynamo はこのテンプレートを検索します。見つからない場合、既定の Python ウィンドウのように表示されます。
Python テンプレート(たとえばここで作成した Revit でのテンプレート)が見つかった場合、組み込んだ既定の項目がすべて表示されます。
この優れた追加機能(Radu Gidei 氏による)に関する詳細は、こちらを参照してください。https://github.com/DynamoDS/Dynamo/pull/8122
Dynamo のビジュアル プログラミング環境で、テキスト プログラミングを使用するのはなぜでしょうか。には、多くの利点があります。直感的なビジュアル インタフェースにより、特別な構文を学習することなくプログラムを作成することができます。ただし、ビジュアル プログラムは、処理が煩雑になったり、機能が不足することがあります。Python には、「if/then」の条件ステートメントやループを簡単に記述するための方法が用意されています。Python は、Dynamo の機能を拡張し、多数のノードを数行の簡潔なコード行で置き換えることができる強力なツールです。
ビジュアル プログラミング:
テキスト プログラム:
Code Block ノードと同様に、Python Script ノードはビジュアル プログラミング環境内のスクリプト インタフェースです。Python Script ノードは、ライブラリの[Script] > [Editor] > [Python Script]にあります。
このノードをダブルクリックすると、Python のスクリプト エディタが開きます。ノードを右クリックして[編集...]を選択することもできます。エディタ上部の定型文は、必要なライブラリを参照する際に役立ちます。Python Script ノードの入力値は、IN 配列に格納されます。値は、OUT 変数に割り当てられて Dynamo に返されます。
これらのメソッドには、ByCoordinates などのコンストラクタ、Add などのアクション、X、Y、Z 座標などのクエリーがあります。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
この例では、Python Script ノードを記述してソリッド モジュールからパターンを作成し、カスタム ノードに変換します。最初に、Dynamo ノードを使用してソリッド モジュールを作成します。
Rectangle.ByWidthLength: ノードを使用して、ソリッドのベースとなる長方形を作成します。
Surface.ByPatch: ノードの closedCurve 入力に Rectangle 出力を接続し、下部サーフェスを作成します。
Geometry.Translate: ノードの geometry 入力に Rectangle 出力を接続し、長方形を上に移動します。次に、Code Block ノードを使用してソリッドの厚さを指定します。
Polygon.Points: ノードを使用して、変換された長方形に対してクエリーを実行し、頂点を抽出します。
Geometry.Translate: ノードを使用して、4 つの点に対応する 4 つの値のリストを作成します。この操作により、ソリッドの 1 つの頂点が上に移動します。
変換後の点を Polygon.ByPoints: ノードで使用して、上部ポリゴンを再作成します。
Surface.ByPatch: ノードを使用してポリゴンを結合し、上部サーフェスを作成します。
これで、上部サーフェスと下部サーフェスが作成されました。次に、2 つのプロファイルの間をロフトしてソリッドの側面を作成しましょう。
List.Create: ノードの index 入力に、底面の長方形と上面のポリゴンを接続します。
Surface.ByLoft: ノードを使用して 2 つのプロファイルをロフトし、ソリッドの側面を作成します。
List.Create: ノードの index 入力に上部サーフェス、側面サーフェス、下部サーフェスを接続して、サーフェスのリストを作成します。
Solid.ByJoinedSurfaces: ノードを使用してサーフェスを結合し、ソリッド モジュールを作成します。
これで、ソリッドが作成されました。次に、ワークスペースに Python Script ノードをドロップします。
ノード上の[+]アイコンをクリックし、ノードに入力を追加します。入力には IN[0]、IN[1]などの名前が付いています。これらはリスト内の項目を表しています。
最初に、入力と出力を定義しましょう。ノードをダブルクリックして、Python エディタを開きます。エディタ内のコードを修正するには、次のコードを実行します。
このコードの意味については、演習を進めながら説明していきます。ここで、ソリッド モジュールを配列化するためには、どのような情報が必要になるかを考慮する必要があります。最初に、移動距離を決定するために、ソリッドの寸法を知る必要があります。境界ボックスにはバグがあるため、境界ボックスを作成するにはエッジ曲線のジオメトリを使用する必要があります。
ここで、Dynamo の Python Script ノードを確認します。Dynamo のノードのタイトルと同じ構文が使用されていることがわかります。以下のコメント付きコードを確認してください。
ここでは、ソリッドのモジュールの移動と回転を行うため、Geometry.Transform の操作を使用しましょう。Geometry.Transform ノードを確認すると、ソリッドを変換するにはソース座標系とターゲット座標系が必要になることがわかります。この場合、ソース座標系はソリッドのコンテキストの座標系で、ターゲット座標系は配列化された各モジュールの別の座標系になります。そのため、x 値と y 値をループして、座標系を毎回異なる距離と方向で変換する必要があります。
[実行]をクリックし、コードを保存します。次のように、Python Script ノードを既存のスクリプトに接続します。
Solid.ByJoinedSurfaces からの出力を、Python Script ノードの最初の入力として接続し、Code Block を使用してその他の入力を定義します。
Topology.Edges ノードを作成し、Python Script ノードからの出力を入力として使用します。
最後に Edge.CurveGeometry ノードを作成し、Topology.Edges からの出力を入力として使用します。
シード値を変更すると、異なるパターンが作成されます。ソリッド モジュールのパラメータを変更して、異なるエフェクトを作成することもできます。
これで、便利な Python Script ノードが作成されました。このノードをカスタム ノードとして保存しましょう。Python Script ノードを選択し、ワークスペースを右クリックして、[カスタム ノードを作成]を選択します。
名前、説明、カテゴリを設定します。
この操作により、カスタム ノードを編集するための新しいワークスペースが開きます。
Inputs: 入力名をわかりやすい名前に変更し、データ タイプと既定値を追加します。
Output: 出力名を変更します。
ノードを .dyf ファイルとして保存すると、先ほど行った変更がカスタム ノードに反映されます。
クラス | スケールが均一でない座標系 | せん断変形された座標系 |
---|---|---|
Dynamo プロジェクトの背景には、プラットフォーム実装のスコープを拡大するという計画があります。そのため、Dynamo には新しいプログラムが追加されていく予定になっています。ユーザは、Python スクリプティング環境からプラットフォーム固有の API にアクセスできるようになります。このセクションでは Revit を扱いますが、今後は章の数を増やして、別のプラットフォーム上でのスクリプト作成に関する説明を追加する予定です。また、さまざまな ライブラリにアクセスして Dynamo に読み込むことができるようになりました。
次の例では、Dynamo で Python を使用して、Revit 固有の操作を実行する方法について説明します。Python と Dynamo および Revit との関係の詳細については、を参照してください。Python と Revit のもう 1 つの便利なリソースは、 プロジェクトです。
Autodesk.DesignScript.Geometry ライブラリにより、Code Block ノードと同様のドット表記を使用することができます。Dynamo 構文の詳細については、「」および「」を参照してください(この PDF 文書をダウンロードするには、リンクを右クリックし、[名前を付けてリンク先を保存...]をクリックしてください)。「Point.」などのジオメトリ タイプを入力すると、点の作成や点のクエリーを実行するためのメソッドのリストが表示されます。
対象:
サーフェス
曲線
平面
ソリッド
サーフェス
曲線
点
点、曲線
サーフェス
曲線
点
点
点
曲線
平面
曲線
点
曲線
曲線
ソリッド
サーフェス
曲線
曲線
ソリッド
使用: 点
曲線
平面
サーフェス
ソリッド
対象: 曲線
可
不可
不可
不可
不可
ポリゴン
-
不可
可
不可
不可
サーフェス
-
可
可
可
可
ソリッド
-
-
可
可
可
円弧
不可
不可
NURBS 曲線
可
可
NURBS 曲面
不可
不可
円
不可
不可
線分
可
可
平面
不可
不可
点
可
可
ポリゴン
不可
不可
ソリッド
不可
不可
サーフェス
不可
不可
文字
不可
不可