Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
ベクトルは大きさと方向を表すもので、特定の速度で特定の方向に向かって加速する矢印として描画できます。ベクトルは、Dynamo のモデルにおける主要なコンポーネントです。ベクトルは[Helper]という抽象的なカテゴリに分類されるため、ベクトルを作成しても背景プレビューには何も表示されないことに注意してください。
ベクトル プレビューの代わりに線分を使用することができます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
平面は 2 次元サーフェスで、無限に広がる平坦なサーフェスとして描画できます。各平面には、原点、X 方向、Y 方向、Z (上)方向があります。
平面は抽象的な概念ですが、平面には基準点があるため、空間内で平面の場所を特定することができます。
Dynamo では、平面は背景プレビューにレンダリングされます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
座標系は、点やその他のジオメトリ要素の位置を決定します。次の画像は、Dynamo での外観と各カラーの意味について説明しています。
座標系は抽象的な概念ですが、座標系には基準点があるため、空間内で座標系の場所を特定することができます。
Dynamo の座標系は、点(基準点)と 3 つの軸を定義する線分(X は赤、Y は緑、Z は青で表示)として背景プレビューにレンダリングされます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
抽象的なジオメトリ タイプの主要なグループは、ベクトル、平面、座標系により構成されています。ベクトル、平面、座標系により、形状を表すその他のジオメトリの位置、方向、空間コンテキストを定義することができます。たとえば、ニューヨーク市 42 丁目のブロードウェイ(座標系)の路上(平面)に立って北(ベクトル)を向いている場合、ベクトル、平面、座標系という[Helper]カテゴリの情報を使用して自分の現在の居場所を定義していることになります。電話ケース製品や高層ビルについても、同じことが言えます。モデルを開発するには、このコンテキストが必要です。
ベクトルとは、方向と大きさを表すジオメトリの量です。ベクトルは抽象的な概念です。つまり、ジオメトリ要素ではなく量を表します。ベクトルは点と同様に値のリストで構成されているため、点とベクトルを混同しないようにする必要があります。ただし、点とベクトルには大きな違いがあります。点が特定の座標系における位置を表すのに対して、ベクトルは位置における相対的な差異を表します。これは、「方向」と言い換えることもできます。
相対的な違いの考え方が分かりにくい場合は、ベクトル AB を「点 A に立って点 B の方向を向いている」と考えてみてください。 現在地 A から目的地 B に対する方向が、ベクトルです。
ここでは、同じ AB 表記を使用して、ベクトルを構成する要素について説明します。
ベクトルの開始点は、起点と呼ばれます。
ベクトルの終了点は、先端または向きと呼ばれます。
ベクトル AB とベクトル BA は違います。これらは、反対方向のベクトルです。
ベクトルとその定義に関するジョークとして、古典的なコメディである Airplane (邦題: フライングハイ)の有名なジョークがあります。
Roger, Roger.What's our vector, Victor? (訳注: ロジャー、了解だ(発音は「ロジャー」、ラジャー)。ビクター、機首の向き(発音は「ベクター」、ベクトル)は?
平面は、2 次元の抽象的な Helper です。 より厳密に定義すると、平面とは 2 つの方向に無限に延びる概念的に「平らな」面のことです。平面は、通常、小さな長方形として基準点の近くにレンダリングされます。
ここで、「基準点とは、CAD ソフトウェアでモデルを作成する場合に使用する、座標系に関係ある用語ではないだろうか」と思いつく人がいるかもしれません。
そのとおりです。多くのモデル作成ソフトウェアは、構築面(「レベル」)を使用してローカルな 2 次元のコンテキストを定義し、その面上に図面を作成します。XY 平面、XZ 平面、YZ 平面や、北、南東などの用語の方がなじみがあるかもしれません。これらはすべて、無限の平らなコンテキストを定義する平面です。平面には深さはありませんが、方向の記述に役立ちます。
平面を理解できれば、座標系もすぐに理解することができます。平面のすべての要素は、標準的なユークリッド座標系または XYZ 座標系の要素と同じです。
ただし、円柱や球体など、他の座標系もあります。平面の要素は、これらの座標系の要素とは異なります。他のジオメトリ タイプに座標系を適用し、そのジオメトリ上の位置を定義することもできます。これについては、これ以降のセクションで説明します。
別の座標系(円柱、球体)に関する説明をここに追加
ビジュアル プログラミング環境の Dynamo では、データの処理方法を構築することができます。数値やテキストだけでなく、ジオメトリもデータです。コンピュータが認識できるジオメトリ(計算設計用のジオメトリと呼ぶ場合もあります)は、美しいモデル、複雑なモデル、パフォーマンス重視のモデルを作成するためのデータです。ジオメトリを使用するには、そのジオメトリのさまざまな入力と出力を理解する必要があります。
ジオメトリ データ タイプには複数のタイプがありますが、最初に曲線について説明します。曲線には、曲がっているか、まっすぐか、長いか、短いかなど、その形状を表す一連のプロパティが存在します。線分からスプライン曲線まで、すべての曲線タイプは点という構成要素で定義されることに注意してください。
線分
ポリライン
円弧
円
楕円
NURBS 曲線
ポリカーブ
NURBS は、曲線やサーフェスを正確に表現するために使用されるモデルです。NURBS 曲線の作成には 2 つ方法があります。それぞれの方法で Dynamo で正弦曲線を作成し、結果を比較してみましょう。
NurbsCurve.ByControlPoints ノードは、点のリストを制御点として使用します。
NurbsCurve.ByPoints ノードは、点のリストを使用して曲線を描画します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
曲線という用語は通常、すべての曲がった形状を指します(直線を含みます)。大文字の「C」で始まる「Curve」は、直線、円、スプライン曲線など、すべての形状タイプの親カテゴリです。より厳密に定義すると、曲線とは、(x = -1.26*t, y = t
)などの単純な関数から微積分を使用する複雑な関数まで、さまざまな関数の集合に「t」を代入して指定することができるすべての点のことです。操作する曲線の種類に関係なく、この「t」というパラメータが評価対象のプロパティになります。また、形状の外観にかかわらず、すべての曲線には開始点と終了点があり、この開始点と終了点が、曲線の作成に使用される t の最小値と最大値に対応します。これを理解すると、曲線の方向についても理解できます。
Dynamo では、曲線に対する t の値の範囲は 0.0 ~ 1.0 になります。これは、覚えておく必要があります。
すべての曲線には、曲線の記述や解析で使用されるさまざまなプロパティと性質があります。開始点と終了点の間の距離がゼロの場合は、「閉じた」曲線になります。 また、すべての曲線には複数の制御点があります。これらの点がすべて一つの平面上に配置されている場合、その曲線は「平らな」曲線になります。 一部のプロパティは曲線全体に適用されますが、曲線上の特定の点にのみ適用されるプロパティもあります。たとえば平面性はグローバル プロパティですが、特定の t 値における接線ベクトルはローカル プロパティです。
線分は、最も簡単な形状の曲線です。直線は曲線には見えないかもしれませんが、曲率がゼロであるというだけで、実際には曲線です。線分を作成する方法はいくつかあります。最も直感的な方法は、点 A から点 B までの線分を作成する方法です。この場合、線分 AB の形状が点間に描画されますが、数学的には、直線が両方向に無限に延びている状態になります。
2 つの線分を接続すると、ポリラインが作成されます。ここで、制御点について簡単に説明します。どの制御点の位置を編集しても、ポリラインの形状が変化します。ポリラインが閉じている場合は、ポリゴンが作成されます。ポリゴンの辺の長さがすべて同じである場合、このポリゴンは正多角形になります。
ここからは、形状を定義するための複雑なパラメトリック関数を見ていきます。これまでは線分について説明しましたが、ここでは 1 つまたは 2 つの半径を設定することにより、円弧、円、楕円弧、楕円を作成します。円弧と円または楕円の違いは、形状が閉じているかどうかだけです。
NURBS (非一様有理スプライン)は、単純な 2 次元の線分、円、円弧、長方形の形状から、複雑な 3 次元フリーフォームの有機的な曲線まで、あらゆる形状を正確にモデル化することができる数学的表現です。その柔軟性(比較的少ない制御点で、次数の設定に基づいたスムーズな補間が可能)と精度(堅牢な数学演算による形状指定)により、イラストレーションやアニメーションから製造にわたる幅広いプロセスで使用することができます。
次数: 曲線の次数により、制御点が曲線に与える影響力の範囲が決まります。次数が大きいほど、影響力の範囲も大きくなります。次数は正の整数です。この数値は通常 1、2、3、または 5 ですが、任意の正の整数にすることができます。NURBS 線分とポリラインの次数は、通常は 1 です。ほとんどのフリーフォーム曲線の次数は、3 または 5 です。
制御点: 制御点は、次数 + 1 個以上の点を含むリストです。NURBS 曲線の形状を変更するための最も簡単な方法は、その制御点を移動する方法です。
ウェイト: 制御点には、ウェイトと呼ばれる数値が関連付けられています。ウェイトは、通常は正の数値です。曲線の制御点のすべてのウェイトの値が同じである場合(通常は 1)、その曲線は非有理曲線と呼ばれます。それ以外の場合は、有理曲線と呼ばれます。ほとんどの NURBS 曲線は、非有理曲線です。
ノット: ノットは、N を制御点の数としたとき、「次数 + N - 1」個の数値のリストとして表されます。ノットはウェイトとともに使用され、作成される曲線上の制御点の影響力をコントロールします。ノットは、曲線上の特定の点でねじれを作成する場合などに使用します。
次数 = 1
次数 = 2
次数 = 3
次数の値が大きいほど、作成される曲線を補間するための制御点の数が多くなります。
この索引では、この手引で言及しているすべてのノードと他の便利なコンポーネントについて、補足情報を提供します。ここで紹介するのは、Dynamo で使用できる 500 個のノードのうち一部にすぎません。
**つまり、直方体の幅(X 軸)の長さ 10 を作成し、それを X 軸で 2 倍のスケーリングを行う座標系に変換しても、幅は 10 のままです。ASM では、ボディの頂点を予測可能な順序で抽出することができないため、変換後に寸法を決定することはできません。
単一のサーフェスから作成することのできない複雑なモデルを構築する場合や、明示的な体積を定義する場合は、(およびポリサーフェス)を使用する必要があります。単純な立方体でさえ、全部で 6 つのサーフェスが必要になる複雑な構造をしています。ソリッドには、サーフェスには存在しない 2 つの重要な概念があります。それは、高度な位相幾何学的な概念(面、辺、頂点)と、ブール演算という概念です。
を使用して、ソリッドを修正することができます。いくつかのブール演算を使用して、スパイク状のボールを作成してみましょう。
Sphere.ByCenterPointRadius ノードを使用して、ベースとなるソリッドを作成します。
Topology.Faces ノードと Face.SurfaceGeometry ノードを使用してソリッドの面のクエリーを実行し、サーフェス ジオメトリに変換します。この場合、球体には 1 つの面しかありません。
Cone.ByPointsRadii ノードで、サーフェス上の点を使用して円錐を作成します。
Solid.UnionAll ノードを使用して、円錐と球体との和演算を行います。
Topology.Edges ノードを使用して、新しいソリッドの辺のクエリーを実行します。
Solid.Fillet ノードを使用して、スパイク状の球体のエッジの面取りを行います。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
ブール演算は複雑なため、計算に時間がかかります。「フリーズ機能」を使用すると、選択したノードとその影響を受ける下流ノードの実行を中断できます。
1. Solid.UnionAll ノードの和演算をフリーズするには、右クリックしてコンテキスト メニューを使用します。
2.選択したノードとすべての下流ノードがライト グレーのゴースト モードでプレビュー表示され、影響を受けるワイヤが破線で表示されます。影響を受けるジオメトリのプレビューも、ゴースト モードになります。これで、ブール論理和を計算することなく、上流で値を変更することができます。
3.ノードのフリーズを解除するには、ノードを右クリックして[フリーズ]の選択を解除します。
4.影響を受けるすべてのノードとそれに関連するジオメトリのプレビューが更新され、標準プレビュー モードに戻ります。
ソリッドは 1 つまたは複数のサーフェスから構成され、「内部」と「外部」を定義する閉じた境界によって体積が定義されます。 ソリッドとして認識される条件は、サーフェスの数に関係なく、全体が完全に閉じた形状になっているということです。ソリッドは、サーフェスまたはポリサーフェスを結合して作成することも、ロフト、スイープ、回転などの操作を使用して作成することもできます。球体、立方体、円錐、円柱プリミティブなどもソリッドです。立方体から 1 つまたは複数の面を取り除いた場合、その形状はポリサーフェスとして認識されます。ポリサーフェスのプロパティはソリッドのプロパティと似ていますが、このポリサーフェスはソリッドではありません。
単一のサーフェスで構成される平面は、ソリッドではありません。
単一のサーフェスで構成される球体は、ソリッドです。
2 つの結合されたサーフェスで構成される円錐は、ソリッドです。
3 つの結合されたサーフェスで構成される円柱は、ソリッドです。
6 つの結合されたサーフェスで構成される立方体は、ソリッドです。
ソリッドは、頂点、辺、面という 3 種類の要素で構成されます。面は、ソリッドを構成するサーフェスです。辺は、隣接する面の接続を定義する曲線です。頂点は、これらの曲線の開始点と終了点です。Topology ノードを使用すると、これらの要素についてクエリーを実行することができます。
面
辺
頂点
ソリッドの辺をフィレット操作や面取り操作で変更することにより、角のとがりや出っ張りを取り除くことができます。面取り操作を実行すると、2 つの面の間に直線的なサーフェスが作成され、フィレット操作を実行すると、2 つの面がなめらかに接合されます。
ソリッド立方体
面取りされた立方体
フィレットされた立方体
ソリッドのブール演算は、2 つ以上のソリッドを組み合わせるための方法です。ブール演算を 1 回実行すると、実際には次に示す 4 つの操作が実行されます。
2 つ以上のオブジェクトを交差させる。
すべてのオブジェクトを交点で分割する。
ジオメトリの不要な部分を削除する。
すべてのオブジェクトを 1 つに結合する。
和: ソリッドの重複部分を削除して 1 つのソリッドに結合します。
差: 一方のソリッドから別のソリッドを取り除きます。取り除く側のソリッドは、ツールと呼ばれます。ツールとなるソリッドを切り替えて、逆のボリュームを作成することができます。
積: 2 つのソリッドが交差している部分だけを保持します。
UnionAll ノードは、球体と外側を向いた円錐の和演算を行います。
DifferenceAll ノードは、球体と内側を向いた円錐の差演算を行います。
線分はポイントのセットで構成され、各ラインには最低 2 つのポイントがあります。Dynamo で線分を作成する最も一般的な方法の 1 つは、Line.ByStartPointEndPoint
を使用して Dynamo で線分を作成することです。
ノードのフリーズの詳細については、「」セクションを参照してください。
このように、ソリッドのブール演算は、作業時間を節約するための強力な機能です。ソリッドのブール演算には、ジオメトリのどの部分を保持するかを区別する 3 つの操作があります。
これら 3 つの演算に加えて、Dynamo には、さまざまなソリッドの差演算と和演算を実行するための Solid.DifferenceAll ノードと Solid.UnionAll ノードが用意されています。
CREATE |
Color.ByARGB アルファ、赤、緑、青の各成分から色を作成します。 |
Color Range 開始色と終了色間の色のグラデーションから色を取得します。 |
ACTIONS |
Color.Brightness 色の明度の値を取得します。 |
Color.Components 色の各成分を、アルファ、赤、緑、青の順のリストとして返します。 |
Color.Saturation 色の彩度の値を取得します。 |
Color.Hue 色の色相の値を取得します。 |
QUERY |
Color.Alpha 色のアルファ成分の値(0 ~ 255)を取得します。 |
Color.Blue 色の青色成分の値(0 ~ 255)を取得します。 |
Color.Green 色の緑色成分の値(0 ~ 255)を取得します。 |
Color.Red 色の赤色成分の値(0 ~ 255)を取得します。 |
CREATE |
GeometryColor.ByGeometryColor 任意の色を使用してジオメトリを表示します。 |
ACTIONS |
View.Watch ノードの出力を視覚化します。 |
View.Watch 3D ジオメトリのダイナミック プレビューを表示します。 |
ACTIONS |
Boolean True と False のいずれかを選択します。 |
Code Block DesignScript のコードを直接作成することができます。 |
Directory Path システム上で任意のフォルダを選択して、そのパスを取得することができます。 |
File Path システム上で任意のファイルを選択して、そのファイル名を取得することができます。 |
Integer Slider 整数値を生成するスライダです。 |
Number 数値を作成します。 |
Number Slider 数値を生成するスライダです。 |
String 文字列を作成します。 |
Object.IsNull 指定されたオブジェクトが NULL であるかどうかを判断します。 |
CREATE |
List.Create 与えられた入力に基づいて新しいリストを作成します。 |
List.Combine 2 つのシーケンスの各要素にコンビネータを適用します。 |
Number Range 指定された範囲内で数値のシーケンスを作成します。 |
Number Sequence 数値のシーケンスを作成します。 |
ACTIONS |
List.Chop リストを、それぞれ指定された個数の項目から成るリストの集合に分割します。 |
List.Count 指定されたリストに格納されている項目の数を返します。 |
List.Flatten ネストされたリストのリストを、指定された量だけフラットにします。 |
List.FilterByBoolMask 別個のブール値を要素に持つリスト内で対応するインデックスを検索して、シーケンスをフィルタします。 |
List.GetItemAtIndex リストの、指定されたインデックスにある項目を取得します。 |
List.Map リスト内のすべての要素に関数を適用し、その結果から新しいリストを生成します。 |
List.Reverse 指定されたリスト内の項目を逆順で含む新しいリストを作成します。 |
List.ReplaceItemAtIndex リストの、指定されたインデックスにある項目を置き換えます。 |
List.ShiftIndices リスト内のインデックスを、指定された量だけ右に移動します。 |
List.TakeEveryNthItem 指定されたオフセットの後、指定された値の倍数であるインデックスの項目を、指定されたリストから取得します。 |
List.Transpose 任意のリストのリストの行と列を入れ替えます。他の行よりも短い行がある場合は、作成される配列が常に長方形になるように、プレースホルダーとして NULL 値が挿入されます。 |
ACTIONS |
If 条件ステートメントです。テスト入力のブール値をチェックします。テスト入力が true である場合は、結果として true の入力を出力します。false である場合は、結果として false の入力を出力します。 |
ACTIONS |
Math.Cos 角度の余弦を求めます。 |
Math.DegreesToRadians 度単位の角度をラジアン単位の角度に変換します。 |
Math.Pow 指定された指数に対して値を累乗します。 |
Math.RadiansToDegrees ラジアン単位の角度を度単位の角度に変換します。 |
Math.RemapRange 分布比率を保持しながら数値のリストの範囲を調整します。 |
Math.Sin 角度の正弦を求めます。 |
Formula 数学式を評価します。NCalc を評価に使用します。次を参照してください。http://ncalc.codeplex.com |
Map 値を入力された範囲にマッピングします。 |
ACTIONS |
String.Concat 複数の文字列を 1 つの文字列に連結します。 |
String.Contains 指定された文字列に指定されたサブストリングが含まれているかどうかを判断します。 |
String.Join 複数の文字列を 1 つの文字列に連結し、結合されるそれぞれの文字列の間に区切り文字を挿入します。 |
String.Split 1 つの文字列を文字列のリストに分割します。指定された区切り文字によって分割場所が決定されます。 |
String.ToNumber 文字列を整数または倍精度浮動小数点数に変換します。 |
CREATE |
Circle.ByCenterPointRadius 入力された中心点と半径をワールド座標系の XY 平面に持ち、ワールド座標系の Z 軸を法線とする円を作成します。 |
Circle.ByPlaneRadius 入力された平面の基準点(ルート)に中心を持ち、指定された半径を持つ円を平面上に作成します。 |
CREATE |
CoordinateSystem.ByOrigin 入力された点に基準点を持ち、X 軸と Y 軸を WCS(ワールド座標系)の X 軸および Y 軸に設定した座標系を作成します。 |
CoordinateSystem.ByCyclindricalCoordinates 指定された座標系に対して、指定された円柱座標パラメータに基づいて座標系を作成します。 |
CREATE |
Cuboid.ByLengths ワールド座標系の基準点を中心として、幅、長さ、高さを持つ直方体を作成します。 |
Cuboid.ByLengths (origin) 中心を入力された点に設定し、指定された幅、長さ、高さの直方体を作成します。 |
Cuboid.ByLengths (coordinateSystem) ワールド座標系の基準点を中心として、幅、長さ、高さを持つ直方体を作成します。 |
Cuboid.ByCorners lowPoint から highPoint までの範囲に広がる直方体を作成します。 |
Cuboid.Length 実際のワールド空間寸法ではなく、直方体の入力寸法を返します。** |
Cuboid.Width 実際のワールド空間寸法ではなく、直方体の入力寸法を返します。** |
Cuboid.Height 実際のワールド空間寸法ではなく、直方体の入力寸法を返します。** |
BoundingBox.ToCuboid ソリッドの直方体として境界ボックスを取得します。 |
ACTIONS |
Curve.Extrude (distance) 法線ベクトルの方向に曲線を押し出します。 |
Curve.PointAtParameter StartParameter() から EndParameter() までの範囲の指定されたパラメータで曲線上の点を取得します。 |
ACTIONS |
Geometry.DistanceTo このジオメトリから別のジオメトリへの距離を取得します。 |
Geometry.Explode 複合要素または分割されていない要素をコンポーネント パーツに分割します。 |
Geometry.ImportFromSAT 読み込まれたジオメトリのリストです。 |
Geometry.Rotate (basePlane) 平面の基準点と法線を中心にオブジェクトを指定された角度だけ回転させます。 |
Geometry.Translate 指定された方向に距離を指定して、ジオメトリ タイプを平行移動させます。 |
CREATE |
Line.ByBestFitThroughPoints 点の散布図に最もよく近似する直線を作成します。 |
Line.ByStartPointDirectionLength 開始点から始まり、ベクトルの向きに指定された長さだけ延長する線分を作成します。 |
Line.ByStartPointEndPoint 入力された 2 点を端点とする線分を作成します。 |
Line.ByTangency 入力された曲線に接し、曲線のパラメータで指定された点に位置する直線を作成します。 |
QUERY |
Line.Direction 曲線の方向を返します。 |
Create |
NurbsCurve.ByControlPoints 明示的な制御点を使用して B スプライン曲線を作成します。 |
NurbsCurve.ByPoints 点間を補間して B スプライン曲線を作成します。 |
Create |
NurbsSurface.ByControlPoints 明示的な制御点と指定された U 次数と V 次数を使用して NURBS 曲面 を作成します。 |
NurbsSurface.ByPoints 指定された補間される点、U 次数、V 次数を使用して NURBS 曲面を作成します。作成されるサーフェスはすべての指定された点を通過します。 |
CREATE |
Plane.ByOriginNormal 中心をルート点に持ち、入力された法線ベクトルを持つ平面を作成します。 |
Plane.XY ワールド座標系の XY に平面を作成します。 |
CREATE |
Point.ByCartesianCoordinates 指定された座標系と 3 つのデカルト座標で点を作成します。 |
Point.ByCoordinates (2d) 指定された 2 つのデカルト座標を使用して、XY 平面に点を作成します。Z コンポーネントは 0 です。 |
Point.ByCoordinates (3d) 指定された 3 つのデカルト座標を使用して点を作成します。 |
Point.Origin 基準点 (0,0,0)を取得します。 |
ACTIONS |
Point.Add 点にベクトルを追加します。Translate(Vector)と同じ操作です。 |
QUERY |
Point.X 点の X 座標を取得します。 |
Point.Y 点の Y 座標を取得します。 |
Point.Z 点の Z 座標を取得します。 |
CREATE |
Polycurve.ByPoints 点をつなげる線分のシーケンスからポリカーブを作成します。閉じた曲線を作成するには、最後の点の位置を始点の位置と同じにします。 |
CREATE |
Rectangle.ByWidthLength (Plane) 入力された幅(平面の X 軸の長さ)と高さ(平面の Y 軸の長さ)を使用して、平面のルートを中心とする長方形を作成します。 |
CREATE |
Sphere.ByCenterPointRadius 入力された点を中心とし、指定された半径を持つソリッド球体を作成します。 |
CREATE |
Surface.ByLoft 入力された断面曲線間をロフトしてサーフェスを作成します。 |
Surface.ByPatch 入力された曲線で設定される閉じた境界の内部を塗り潰してサーフェスを作成します。 |
ACTIONS |
Surface.Offset サーフェスの法線の方向に指定された距離だけサーフェスをオフセットします。 |
Surface.PointAtParameter 指定された U および V パラメータの点を返します。 |
Surface.Thicken サーフェスに厚みを持たせてソリッドを作成します。サーフェスを法線の方向に両側に押し出します。 |
CREATE |
UV.ByCoordinates 2 つの倍精度浮動小数点値から UV を作成します。 |
CREATE |
Vector.ByCoordinates 3 つのユークリッド座標でベクトルを形成します。 |
Vector.XAxis 基底 X 軸ベクトル(1,0,0)を取得します。 |
Vector.YAxis 基底 Y 軸ベクトル(0,1,0)を取得します。 |
Vector.ZAxis 基底 Z 軸ベクトル(0,0,1)を取得します。 |
ACTIONS |
Vector.Normalized 正規化されたベクトルを取得します。 |
CREATE |
CoordinateSystem.ByOrigin 入力された点に基準点を持ち、X 軸と Y 軸を WCS(ワールド座標系)の X 軸および Y 軸に設定した座標系を作成します。 |
CoordinateSystem.ByCyclindricalCoordinates 指定された座標系に対して、指定された円柱座標パラメータに基づいて座標系を作成します。 |
+ 加算 |
- 減算 |
* 乗算 |
/ 除算 |
% 剰余演算により、1 番目の入力を 2 番目の入力で除算して剰余を取得します。 |
< より小さい |
> より大きい |
== 2 つの値が等しいかどうか検証します。 |
点は、座標と呼ばれる 1 つまたは複数の値によって定義されます。点を定義するために必要な座標値の数は、その点が存在する座標系やコンテキストによって異なります。
Dynamo で使用される最も一般的な種類の点は、3 次元のワールド座標系内に存在します。それらの点には、[X,Y,Z]の 3 つの座標があります(Dynamo の 3D 点)。
Dynamo の 2D 点には 2 つの座標[X,Y]があります。
曲線とサーフェスのパラメータは連続しており、指定されたジオメトリのエッジを超えて拡張されます。パラメータ空間を定義する形状は 3 次元のワールド座標系内に存在しているため、パラメータ座標をいつでも「ワールド」座標に変換することができます。たとえば、サーフェス上の点[0.2, 0.5]は、ワールド座標系の点[1.8, 2.0, 4.1]と同一です。
ワールド XYZ 座標とみなされる座標で表された点
指定された座標系(円柱座標)で表された点
サーフェス上の UV 座標で表された点
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
ジオメトリがモデルの言語だと仮定すると、点はアルファベットにあたります。点は、点以外のすべてのジオメトリを作成するための基礎になります。たとえば、1 本の曲線を作成するには、少なくとも 2 つの点が必要です。また、1 つのポリゴンまたはメッシュ面を作成するには、少なくとも 3 つの点が必要です。正弦関数を使用して点群の位置、順序、関係を定義すると、円や曲線など、高次元のジオメトリを定義することができます。
関数
x=r*cos(t)
とy=r*sin(t)
を使用する円関数
x=(t)
とy=r*sin(t)
を使用した正弦曲線
点は、2 次元の座標系内にも存在することができます。通常は、使用する空間に応じて異なる文字表記を使用します。この手引では、平面上では[X,Y]を使用し、サーフェス上では[U,V]を使用します。
ユークリッド座標系上の点: [X,Y,Z]
曲線パラメータの座標系上の点: [t]
サーフェス パラメータの座標系上の点: [U,V]
コンピュータ モデリングの分野では、3D ジオメトリを表現する形式としてメッシュが広く普及しています。メッシュ ジオメトリは一般的に四角形または三角形の集合で構成され、NURBS 操作の代替として、軽量で柔軟なジオメトリにすることができます。メッシュは、レンダリングやビジュアライゼーションからデジタル製造や 3D プリントまで、あらゆる用途に使用されます。
Dynamo では、面と頂点のデータ構造を使用してメッシュを定義します。最も基本的なレベルでは、この構造はポリゴンにグループ化された単なる点の集合です。メッシュの点を頂点と呼び、サーフェスのような形状のポリゴンを面と呼びます。
メッシュを作成するには、頂点のリストと、それらの頂点をインデックス グループと呼ばれる面にグループ化するための仕組みが必要です。
頂点のリスト
面を定義するためのインデックス グループのリスト
Dynamo のメッシュ機能は、Mesh Toolkit パッケージをインストールすることによって拡張することができます。Dynamo Mesh Toolkit は、外部ファイル形式からメッシュを読み込む機能、Dynamo のジオメトリ オブジェクトからメッシュを作成する機能、頂点とインデックスからメッシュを手動で作成する機能を提供するライブラリです。
このライブラリには、メッシュの変更や修復を行うためのツールや、製造処理で使用する水平方向のスライスを抽出するためのツールも用意されています。
このパッケージの使用例については、「Mesh Toolkit のケース スタディ」を参照してください。
メッシュは、サーフェスまたはソリッド ジオメトリを表す四角形と三角形の集まりです。メッシュ オブジェクトは、ソリッドと同様に、頂点、辺、面から構成されます。メッシュには、標準のプロパティの他に、法線のような独自のプロパティもあります。
メッシュの頂点
メッシュの辺: 隣接する面が 1 つだけの辺を「裸の辺」と呼びます。 それ以外のすべての辺を、「おおわれた辺」と呼びます。
メッシュの面
メッシュの頂点は、単純な点のリストです。メッシュを作成する場合や、メッシュの構造に関する情報を取得する場合、頂点のインデックスは非常に重要です。各頂点には、対応する頂点法線(ベクトル)があります。この頂点法線は、頂点において隣接する面の方向の平均を表すため、メッシュが「内向き」か「外向き」かを判断する場合に役立ちます。
頂点
頂点法線
面は、3 つまたは 4 つの頂点の順番付きリストです。そのため、メッシュ面の「サーフェス」としての表示方法は、インデックス化された頂点の位置によって決まります。メッシュを構成する頂点のリストは既に作成されているため、ここでは個々の点を指定して面を定義するのではなく、頂点のインデックスをそのまま使用します。これにより、複数の面で同じ頂点を使用することができます。
四角形の面は、0、1、2、3 のインデックスから構成されます。
三角形の面は、1、4、2 のインデックスから構成されます。インデックス グループの順序は、変更することができます。ただし、反時計回りに並んでいる必要があります。これにより、面が正しく定義されます。
メッシュ ジオメトリと NURBS ジオメトリとの違いは何でしょうか。どのような場合にどちらのジオメトリを使用したらよいのでしょうか。
前の章で、NURBS サーフェスは 2 つの方向に向かう一連の NURBS 曲線によって定義されるということを説明しました。これらの方向には、U
と V
というラベルが付けられます。これにより、2 次元サーフェスの範囲に応じて、NURBS サーフェスをパラメータ化することができます。曲線自体は、計算式としてコンピュータに格納されます。これにより、生成されるサーフェスを任意の精度で計算することができます。ただし、複数の NURBS サーフェスを結合するのは難しい場合があります。2 つの NURBS サーフェスを結合すると、ポリサーフェスが作成されます。ジオメトリの異なる部分には、異なる UV パラメータと曲線がそれぞれ定義されます。
サーフェス
アイソパラメトリック(Isoparm)曲線
サーフェス制御点
サーフェス制御ポリゴン
パラメトリック点
サーフェス フレーム
メッシュ
裸の辺
メッシュ ネットワーク
メッシュの辺
頂点法線
メッシュ面、メッシュ面の法線
NURBS サーフェスとは異なり、メッシュは、正確に定義された複数の不連続な頂点と面で構成されます。頂点のネットワークは、通常、単純な UV
座標で定義することはできません。面は互いに連続していないため、精度はメッシュ内で定義されます。精度を高めるには、メッシュを変更し、面の数を増やす必要があります。メッシュには数学的な表現方法がないため、1 つのメッシュ内で複雑なジオメトリをより柔軟に処理することができます。
メッシュと NURBS サーフェスのもう一つの重要な違いは、メッシュ内または NURBS ジオメトリ内のローカルの変更が形状全体に与える影響の度合いです。メッシュで 1 つの頂点を移動すると、その頂点に隣接する面だけが影響を受けます。NURBS サーフェスの場合、影響の範囲はより複雑で、サーフェスの次数、制御点のウェイト、制御点のノットによって影響の範囲が異なります。ただし、一般的には、NURBS サーフェスで 1 つの制御点を移動した場合の方が、ジオメトリの変更はより広範囲で滑らかなものになります。
NURBS サーフェスで 1 つの制御点を移動すると、形状全体に影響が及びます。
メッシュ ジオメトリで 1 つの頂点を移動すると、隣接する要素にのみ影響が及びます。
この対比関係は、直線と曲線で構成されるベクター イメージと、個々のピクセルで構成されるラスター イメージとの関係に似ています。ベクター イメージを拡大表示しても曲線はくっきりと表示されるのに対して、ラスター イメージを拡大表示すると個々のピクセルが拡大されて表示されます。つまり、NURBS サーフェスは、数学的に滑らかな関係があるという点でベクター イメージに似ています。一方メッシュは、一定の解像度を持つという点でラスター イメージに似ています。
モデル内でサーフェスを使用して、オブジェクトを 3 次元の世界で表現できるようにします。曲線は常に平らというわけではありません。つまり、曲線は 3 次元のオブジェクトですが、曲線が定義する空間は必ず 1 次元になります。サーフェスを定義すると、次元をもう 1 つ増やし、別のプロパティの集合を他のモデリング操作で使用できるようになります。
Dynamo のパラメータにサーフェスを読み込んで評価し、どのような情報を抽出できるかを確認します。
Surface.PointAtParameter ノードは、指定された UV 座標における点を返します。
Surface.NormalAtParameter ノードは、指定された UV 座標における法線ベクトルを返します。
Surface.GetIsoline ノードは、U 座標または V 座標におけるアイソパラメトリック曲線を返します。入力が isoDirection であることに注意してください。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
サーフェスは、1 つの関数と 2 つのパラメータによって定義される数学的な形状です。曲線を定義する t
ではなく、サーフェスでは U
と V
を使用してパラメータ空間を定義します。そのため、このタイプのジオメトリを使用すると、より多くのジオメトリ データを描画することができます。たとえば、曲線には法線ベクトルと接平面があり、接平面は曲線に沿って回転させることができます。一方、サーフェスの法線ベクトルと接平面は、方向が固定されています。
サーフェス
U アイソカーブ
V アイソカーブ
UV 座標
接平面
法線ベクトル
サーフェスの範囲: サーフェスの範囲は、そのサーフェス上の 3 次元の点を指定する(U,V)パラメータの範囲として定義されます。各次元(U または V)の範囲は、通常 2 つの数値(U の最小値から U の最大値までの数値と、V の最小値から V の最大値までの数値)で表されます。
サーフェスの形状が「長方形」に見えない場合や、サーフェスのローカルのアイソカーブの密度が高い場合や低い場合がありますが、サーフェスの範囲によって定義される「空間」は常に 2 次元になります。Dynamo におけるサーフェスの範囲は、U 方向と V 方向の両方向で、最小値 0.0 から最大値 1.0 までの範囲内で定義する必要があります。ただし、平らなサーフェスやトリム サーフェスについては、範囲が異なる場合があります。
アイソカーブ(アイソパラメトリック曲線): サーフェス上の U 定数値または V 定数値と、対応するもう一方の U 方向または V 方向の値の範囲によって定義される曲線です。
UV 座標: U と V (場合によってはさらに W)を使用して定義される、UV パラメータ空間内の点です。
接平面: 特定の UV 座標において、U アイソカーブと V アイソカーブの両方に接する平面です。
法線ベクトル: 接平面に対して相対的に「上」方向を定義するベクトルです。
NURBS サーフェスは、NURBS 曲線によく似ています。NURBS サーフェスは、2 つの方向に向かう NURBS 曲線のグリッドとして考えることができます。NURBS サーフェスの形状は、制御点の数と、そのサーフェスの U 方向および V 方向の次数によって定義されます。制御点、ウェイト、次元を使用して、形状、法線、接線、曲率などのプロパティを計算する場合にも、同じアルゴリズムが使用されます。
NURBS サーフェスの場合、ジオメトリによって 2 つの方向が暗黙的に定義されます。これは、表示される形状に関係なく、NURBS サーフェスは制御点から構成される長方形のグリッドであるためです。これらの方向は、多くの場合、ワールド座標系に対して任意の方向が相対的に設定されています。このチュートリアルでは、これらの方向を頻繁に使用し、サーフェスに基づいてモデルの解析や他のジオメトリの生成を行います。
Degree (U,V) = (3,3)
Degree (U,V) = (3,1)
Degree (U,V) = (1,2)
Degree (U,V) = (1,1)
ポリサーフェスは、エッジで結合されているサーフェスによって構成されます。ポリサーフェスのトポロジを経由して結合された形状間を移動できるため、ポリサーフェスは 2 次元の UV 定義よりも多くの機能を持っています。
一般的にトポロジとは、パーツの結合や関連についての概念を指しますが、Dynamo におけるトポロジとは、一種のジオメトリでもあります。具体的には、トポロジは、サーフェス、ポリサーフェス、ソリッドの親カテゴリにあたります。
このような方法でサーフェスを結合することにより、複雑な形状を作成したり、継ぎ目の形状の詳細を定義することができます。このように結合されたサーフェスは、パッチと呼ばれる場合もあります。ポリサーフェスのエッジに対して、フィレット操作や面取り操作を簡単に適用することができます。
ここまでの説明で、ビジュアル プログラミングの基本的な仕組みについて確認しました。ここからは、ビジュアル プログラミングで使用する構成要素について詳しく見ていきましょう。この章では、Dynamo 内で受け渡されるデータの基本的な概念について説明します。
データの最も単純な形式が数値だとするならば、数値を関連づける最も簡単な方法は数学的方法を活用することです。割り算のような単純な演算子から、三角関数などの複雑な計算式まで、数学的方法は数値の関係とパターンを調べるための非常に便利な方法です。
演算子は、代数関数と 2 つの入力値を組み合わせて使用する一連のコンポーネントであり、1 つの出力値を生成します(加算、減産、乗算、除算など)。演算子は、[Operators] > [Actions]で使用できます。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
演算子と変数を組み合わせて、式を使用してより複雑な関係を形成します。スライダを使用して、入力パラメータでコントロールできる式を作成します。
1. この数列は、パラメータ式内の「t」を表しています。ここでは、サイズの大きなリストを使用して、らせん構造を定義します。
Number Sequence ノードで、start、amount、step という 3 つの入力に基づいて数列を定義します。
2.上記の手順により、パラメータ領域を定義するための数値のリストが作成されます。次に、黄金螺旋式を表すノードのグループを作成します。
黄金螺旋は、次の等式として定義されます。
次の図は、ビジュアル プログラミング形式の黄金螺旋を表しています。ここからは、順を追ってノード グループを確認していきます。ビジュアル プログラムと記述形式の等式との相違点に注意してください。
a.Number Slider ノードを使用して、キャンバスに 2 つの数値スライダを追加します。これらのスライダは、パラメータ式の変数である「a」と「b」を表します。これらの変数は、柔軟に変化する定数や、必要な結果に合わせて調整可能なパラメータを表します。
b.Multiplication (*) ノードはアスタリスクで表されます。このノードを繰り返し使用して、乗算変数を接続します。
c.Math.RadiansToDegrees ノードで「t」の値を角度に変換して、三角関数内でその角度を評価します。Dynamo では、三角関数の評価には角度が既定で使用されます。
d.Math.Pow ノードは、「t」および数値「e」の関数として動作し、フィボナッチ数列を作成します。
e.Math.Cos と Math.Sin ノードは、三角関数です。パラメータ指定の各点の X 座標と Y 座標を識別します。
f.Watch ノードで、出力値として 2 つのリストが生成されたことを確認します。これらのリストが、らせんの生成に使用される点群の x 座標と y 座標になります。
上記の手順でも問題なく機能しますが、多数のノードを使用するため、手間がかかります。より効率的なワークフローを作成するには、DesignScript を確認し、Dynamo 表現の文字列を 1 つのノード内に定義します。次の手順では、パラメータ式を使用してフィボナッチ曲線を描画する方法について確認します。
Point.ByCoordinates ノードの x 入力に上部の乗算ノードを接続し、y 入力に下部の乗算ノードを接続します。この操作により、パラメータで制御された点群のらせん構造が画面上に表示されます。
Polycurve.ByPoints ノードは、前のステップの Point.ByCoordinates を points に接続します。ここでは閉曲線は作成しないため、connectLastToFirst 入力には何も接続しなくてかまいません。この操作により、前の手順で定義した各点を通過するらせん構造が作成されます。
これで、フィボナッチ曲線が作成されました。ここからは、2 つの演習で「オウムガイ」と「ヒマワリ」を作成してみましょう。これらは自然界にみられる形状を抽象的に表しているばかりではなく、フィボナッチ曲線の 2 つの異なる適用例を的確に表現しています。
円弧を作成するための Circle.ByCenterPointRadius ノードの入力ポートに、前の手順と同じ値を接続します。radius 入力の値は既定で 1.0 に設定されているため、出力として円弧が即座に表示されます。点群が基準点から遠ざかっていく様子がよくわかります。
数列のノード グループは「t」の元の配列です。これを Circle.ByCenterPointRadius の radius 入力に接続すると、円弧の中心は基準点から離れていきますが、円の半径は次第に長くなっていき、特長的な形状のらせん構造が作成されます。
余裕があれば、これを 3D に変換してみてください。
ここまでの手順では、円弧を重ねたオウムガイのような形状を作成しました。次に、パラメータ制御のグリッドを使用してみましょう。ここでは、フィボナッチ曲線の基本的ならせんを使用して、フィボナッチ グリッドを作成していきます。結果として、ヒマワリのようならせん形状が作成されます。
最初に、前の演習と同じ手順を実行します。Point.ByCoordinates ノードを使用して、点群をらせん状に並べた配列を作成します。
![](../images/5-3/2/math-part IV-01.jpg)
次に、これらの手順に従って、さまざまな回転の一連のらせんを生成します。
a.Geometry.Rotate ノードには、同じ名前のノードが複数存在します。geometry、basePlane、degrees という入力を持つ Geometry.Rotate ノードを選択してください。geometry 入力に Point.ByCoordinates ノードを接続します。このノードを右クリックして、レーシングが「直積」に設定されていることを確認します。
b.Plane.XY ノードを basePlane 入力に接続します。これにより、基準点に向かって回り込んでいくように点が描画されます。基準点の位置は、らせんの基準の位置と同じです。
c.Number Range ノードで角度を入力することにより、複数の巻き筋を作成します。Number Range コンポーネントを使用すると、この操作をすばやく実行することができます。このコンポーネントを degrees 入力に接続します。
d.Number ノードをキャンバスに 3 つ追加して縦に並べ、数値の範囲を定義します。上から下に、それぞれ 0.0、360.0、120.0 の値を割り当てます。これらの値により、らせんの巻き筋が制御されます。Number Range ノードに 3 つの Number ノードを接続すると、結果が出力されます。
出力結果が渦の流れのようになってきました。Number Range パラメータの一部を調整して、出力結果がどのように変わるか確認してみましょう。
Number Range ノードの step の入力値を 120.0 から 36.0 に変更します。この操作により、巻き筋の数が増え、グリッドの密度が上がります
Number Range ノードの step の入力値を 36.0 から 3.6 に変更します。この操作により、グリッドの密度が大幅に上がり、螺旋の方向が不明瞭になります。これで、ヒマワリが完成しました。
ジオメトリは、設計用の言語です。プログラミング言語やプログラミング環境の核心部分でジオメトリ カーネルを使用している場合は、設計ルーチンを自動化し、アルゴリズムを使用して設計の繰り返し部分を生成することにより、正確で安定したモデルを設計することができます。
ジオメトリのタイプとその相互関係を理解すれば、ライブラリ内で使用できるジオメトリ ノードのグループをナビゲートできるようになります。ジオメトリ ノードは、階層別ではなくアルファベット順に整理されています。Dynamo のユーザ インタフェース内のレイアウトに似たイメージで表示されます。
Dynamo でモデルを作成し、[背景プレビュー]でプレビュー表示される内容をグラフ内のデータ フローに接続する作業は、時間の経過に伴ってより直感的に行うことができるようになります。
仮の座標系が色付きのグリッド ラインによってレンダリングされています。
ノードを選択すると、そのノードによってジオメトリが作成される場合は、対応するジオメトリが背景内でハイライト表示されます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
ジオメトリとは、古典的な定義によれば、形状の外形、サイズ、相対的な位置、空間上の特性に関する研究(幾何学)のことです。この分野には、数千年にもおよぶ豊かな歴史があります。コンピュータの出現と普及により、私たちは、ジオメトリの定義、研究、生成を行うための強力な手段を手に入れました。現在では、ジオメトリの複雑な相互作用の結果を簡単に計算できるようになりました。
コンピュータを利用してどれほど多様で複雑なジオメトリを作成できるかということを確かめるには、「Stanford Bunny」という文字列で Web を検索してみてください。「Stanford Bunny」とは、アルゴリズムのテストで使用されている標準モデルのことです。
アルゴリズム、コンピューティング、複雑性という観点からジオメトリを理解するのは、難しそうだと感じるかもしれません。しかし、比較的単純ないくつかの重要な原則を理解すれば、それをベースとしてより高度なケースに適用することができます。
ジオメトリはデータです。コンピュータや Dynamo にとって、Stanford Bunny と数値に大きな違いはありません。
ジオメトリは、抽象化に依存します。基本的に、ジオメトリの要素は、特定の空間座標系内で、数値、関係、計算式によって記述されます。
ジオメトリには階層があります。点が集まって線が構成され、線が集まって面が構成されます。
ジオメトリは、細部と全体の両方を同時に記述します。たとえば曲線が存在する場合、その曲線は曲線の形状を表すと同時に、その曲線を構成する点群も表します。
実際の作業では、複雑なモデルの開発においてさまざまなジオメトリの構成、解体、再構成を柔軟に実行できるように、作業の内容(ジオメトリのタイプやジオメトリの構成など)について理解しておく必要があります。
ここで、ジオメトリの抽象と階層との関係について簡単に説明します。これら 2 つの概念は相互に関係していますが、この関係を最初から明確に理解するのは必ずしも簡単なことではありません。そのため、複雑なワークフローやモデルの開発を開始すると、すぐに理解の壁に直面することがあります。ここでは、入門者向けに次元という概念を使用して、モデリングについて簡単に説明します。1 つの形状を記述するためにいくつの次元が必要になるかを考えると、ジオメトリの階層構成を理解する手がかりになります。
座標によって定義される点には、次元は存在しません。点は、各座標を示す単なる数字に過ぎません。
2 つの点によって定義される線には、1 つの次元が存在します。線の上では、前方(正の方向)または後方(負の方向)に向かって移動することができます。
複数の線によって定義される面には、2 つの次元が存在します。面の上では、前後だけでなく左右に移動することもできます。
複数の面によって定義される直方体には 、3 つの次元が存在します。ボックスの中では、前後左右に加えて、高低の位置関係を定義することができます。
ジオメトリを分類する場合、次元という概念は役に立ちますが、必ずしもそれが最適な概念というわけではありません。なぜなら、点、線、面、直方体だけを使用してモデルを作成することはほとんどないからです。曲線や曲面を使用する場合を考えてみれば、それは明らかです。また、方向、体積、パーツ間の関係などを定義する、完全に抽象的なジオメトリ タイプのまったく異なるカテゴリもあります。ベクトルを実際にこの手でつかむことはできません。では、空間内に見えているものに対してベクトルを定義するにはどうすればいいでしょうか。ジオメトリの階層をさらに細分化すると、抽象的なジオメトリ タイプを「補助的なジオメトリ タイプ」とみなすべきだということがわかります。各タイプは、その機能と、モデル要素の形状を記述するタイプを基準として、グループ化することができます。
Dynamo で作成するモデルは、ノードを使用して生成されるモデルだけではありません。ジオメトリでの作業を次のレベルに進めるには、キーとなる方法がいくつかあります。
Dynamo では、CSV ファイルを使用して点群を読み込んだり、SAT ファイルを読み込んでサーフェスを作成するなど、ファイルを読み込んでさまざまな操作を行うことができます。
Dynamo を Revit と組み合わせると、Revit の要素を参照して Dynamo で使用することができます。
Dynamo Package Manager には、ジオメトリのタイプや操作を拡張するための追加の機能が用意されています。Mesh Toolkit パッケージを確認してください。
データは、各種プログラムの構成要素です。データはワイヤ経由でやり取りされ、そのデータを処理するノードに入力情報を提供します。処理されたデータは、新しい形式の出力データになります。ここでは、データの定義と構造について確認し、Dynamo で実際にデータを使用してみます。
データとは、定性的な変数や定量的な変数の集まりのことです。最も単純な形式のデータは、0
、3.14
、17
などの数値です。この他にも、変化する数値を表す変数(height
)、文字(myName
)、ジオメトリ(Circle
)、データ項目のリスト(1,2,3,5,8,13,...
)など、さまざまな種類のデータがあります。
Dynamo のノードの入力ポートには、データを追加または送信する必要があります。アクションが設定されていないデータを使用することはできますが、ノードが表すアクションを処理する場合はデータが必要になります。ノードをワークスペースに追加する際に、そのノードに対して入力データを指定しなかった場合、結果として関数が返されます。アクション自体の結果は返されません。
単純なデータ
データとアクション(ノード)が正常に実行される
入力データが指定されていないアクション(ノード)から一般的な関数が返される
Null に注意しましょう。'null'
タイプはデータが存在しないことを表します。これは抽象的な概念ですが、ビジュアル プログラミングを使用しているとよく登場します。たとえば、アクションを実行して正しい結果が生成されなかった場合に、ノードから NULL が返されます。
安定したプログラムを作成するには、NULL をテストし、データ構造から NULL を削除することが重要になります。
ビジュアル プログラミングを行うと、大量のデータを非常に短時間で生成できるため、データ階層を管理するための手段が必要になります。これを行うには、データ構造を使用します。データ構造とは、データを格納するための構造化されたスキームのことです。データ構造の仕様と使用方法は、プログラミング言語によって異なります。
Dynamo の場合、リストを使用してデータに階層を追加します。これについては、これ以降の章で詳しく説明します。ここでは、簡単な操作から始めてみましょう。
リストは、1 つのデータ構造内に配置された項目の集合を表します。リストと項目の関係は次のようになります。
私の手(リスト)には 5 本の指(項目)がある。
私の家の前の通り(リスト)には 10 軒の家(項目)が建っている。
Number Sequence ノードは、start 入力、amount 入力、step 入力を使用して数値のリストを定義します。上の図の 2 つのノードを使用して、10 個の数値を格納する 2 つのリストを作成しました。一方のリストには 100 から 109 までの数値が格納され、もう一方のリストには 0 から 9 までの数値が格納されています。
List.GetItemAtIndex ノードは、特定のインデックスを使用して、リスト内の特定の項目を選択します。0 を選択すると、リスト内の最初の項目(この場合は 100)が取得されます。
もう一方のリストでも同じ手順を実行すると、リスト内の最初の項目である 0 が取得されます。
次に、List.Create ノードを使用して、2 つのリストをマージして 1 つのリストを作成します。このノードによって「リストのリスト」が作成されることに注意してください。これにより、データの構造が変化します。
インデックスを 0 に設定してもう一度 List.GetItemAtIndex ノードを使用すると、「リストのリスト」内の最初の項目が取得されます。この場合、リストが項目として処理されます。この動作は、他のスクリプト言語とは多少異なっています。リストの操作とデータ構造については、これ以降の章でさらに詳しく説明します。
Dynamo のデータ階層を理解するには、「データ構造については、リストが項目として認識される」という概念を理解する必要があります。つまり、Dynamo は、トップダウン プロセスを使用してデータ構造を認識するということです。これは何を意味するのでしょうか。例を使用して詳しく説明します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
この最初の例では、ジオメトリ階層全体にわたるシェル化された円柱を作成します。ジオメトリ階層については、このセクションで説明します。
1.Point.ByCoordinates を追加する - このノードをキャンバスに追加すると、Dynamo プレビュー グリッドの基準点に点が表示されます。x,y 入力と z 入力の既定値は 0.0 です。この場合、Dynamo プレビュー グリッドの基準点に点が表示されます。
2.Plane.ByOriginNormal - ジオメトリ階層内の次の段階は、平面です。平面を作成する方法はいくつかありますが、ここでは、基準点と法線を入力して作成します。ここで使用する基準点は、前の手順で作成した点ノードです。
Vector.ZAxis - このノードは、Z 方向の単位ベクトルです。このノードには入力はなく、[0,0,1]という値のベクトルしかないことに注意してください。このノードは、Plane.ByOriginNormal ノードの normal の入力として使用します。これにより、Dynamo のプレビューに長方形の平面が表示されます。
3.Circle.ByPlaneRadius - 次に、前の手順で作成した平面から曲線を作成して階層を拡張します。このノードに接続すると、基準点に円が表示されます。このノードの半径の既定値は 1 です。
4.Curve.Extrude - このノードに深さを設定することにより、基準点に表示されている円を立体的な 3 次元の円柱にします。このノードは、曲線を押し出してサーフェスを作成します。このノードの距離の既定値は 1 です。この場合、ビューポートに円柱が表示されます。
5.Surface.Thicken - このノードは、指定の距離でサーフェスをオフセットして形状を閉じることにより、閉じたソリッドを作成します。厚さの既定値は 1 です。この場合、その値に従って、シェル化された円柱がビューポートに表示されます。
6.Number Slider - ここでは、すべての入力に対して既定値を使用するのではなく、パラメータ制御をモデルに追加してみましょう。
範囲編集用キャレット - 数値スライダをキャンバスに追加したら、左上のキャレットをクリックして範囲オプションを表示します。
Min/Max/Step - Min、Max、Step の値を、それぞれ 0、2、0.01 に変更します。これにより、ジオメトリ全体のサイズをコントロールします。
7.Number Slider - すべての既定の入力で、この数値スライダのコピー アンド ペースト操作を繰り返します(Number Slider ノードを選択して[Ctrl]+[C]を押し、次に[Ctrl]+[V]を押す)。この操作は、既定値が設定されているすべての入力に Number Slider ノードが接続されるまで繰り返します。定義を有効にするには、一部のスライダ値をゼロより大きな値に設定する必要があります。たとえば、サーフェスに厚みを付ける場合は、押し出しの深さをゼロより大きな値に指定する必要があります。
8.これで、数値スライダを使用したパラメータ制御のシェル化された円柱が作成されました。いくつかのパラメータの値を変更して、Dynamo のビューポート内でジオメトリが動的に更新されることを確認してください。
Number Slider - これまでの手順で、多くのスライダをキャンバスに追加してきました。そのため、作成したツールのインタフェースをクリーンアップする必要があります。各スライダを右クリックして[名前変更]を選択し、そのスライダのパラメータ(厚さ、半径、高さなど)に適した名前に変更します。
9.ここまでの手順で、厚みのある円柱が作成されました。この時点では、この円柱はまだ 1 つのオブジェクトにすぎません。ここからは、動的にリンクされた円柱の配列を作成していきます。そのためには、項目を 1 つずつ操作するのではなく、円柱のリストを作成します。
追加用ノード (+) - ここでの目的は、前の手順で作成した円柱の横に、一連の円柱を追加することです。現在の円柱の横に別の円柱を追加するには、円柱の半径とシェルの厚さの両方を考慮する必要があります。ここでは、2 つのスライダの値を追加して、円柱の半径とシェルの厚さを設定します。
10.この操作は少し複雑であるため、手順を追って詳しく説明します。最終的な目標は、連続する各円柱の位置を定義する数値のリストを作成することです。
a.乗算用ノード (*) - 最初に、前の手順で指定した値を 2 倍にします。前の手順で指定した値は半径でしたが、ここでは円柱の直径を指定します。
b.Sequence - 次に、このノードを使用して、数値の配列を作成します。最初の入力は、前の手順の 乗算用ノード (*) の step の値です。start の値は、Number ノードを使用して 0.0 に設定します。
c.Integer Slider - Integer Slider ノードを接続して amount の値を設定します。これにより、作成される円柱の数が決まります。
d.出力のリスト - このリストには、配列内の各円柱の移動距離が表示されます。このリストは、元のスライダのパラメータによって制御されます。
11.この手順は簡単です。前の手順で指定したシーケンスを、元の Point.ByCoordinates ノードの x 入力に接続するだけです。この操作により、pointX スライダが置き換えられます。このスライダは、削除してかまいません。これで、ビューポートに円柱の配列が表示されます(Integer Slider ノードで 0 よりも大きな値を設定してください)。
12.円柱の配列は、すべてのスライダに動的にリンクされたままの状態になっています。各スライダの値を変更して、円柱の定義がどのように更新されるかを確認してください。
リストを使用して、データを整理することができます。コンピュータのオペレーティング システム上にはファイルとフォルダがありますが、Dynamo では、項目とリストが、それぞれファイルとフォルダに対応します。オペレーティング システムのように、さまざまな方法でデータの作成、変更、クエリーを実行することができます。この章では、Dynamo でリストを管理する方法を詳しく説明します。
色は、効果的なビジュアルを作成するためだけではなく、ビジュアル プログラムの出力で差異をレンダリングするためにも重要なデータ タイプです。抽象的なデータや変化する数値を操作する場合、何がどの程度変化するのかを確認するのが難しいことがあります。Dynamo は、色の処理に優れたアプリケーションです。
Dynamo では、ARGB 入力を使用して色を作成します。これは、アルファ、赤、緑、青の各チャネルに対応しています。アルファは色の 透明度 を表し、他の 3 つのチャネルは、色のスペクトル全体を生成するための原色として組み合わせて使用されます。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
次の表に記載されている各ノードにより、色を定義するアルファ、赤、緑、青の各プロパティのクエリーが実行されます。Color.Components ノードは、これら 4 つのプロパティをそれぞれ異なる出力として生成します。そのため、色のプロパティのクエリーを実行する場合は、このノードを使用すると便利です。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
次の表に記載されている色は、HSB 色空間に対応しています。色を、色相、彩度、明るさに分割すると、より直感的に色を解釈することができます。たとえば、最初に処理する色を決め、次にその色の彩度と明るさを設定します。このように、色相、彩度、明るさをそれぞれ個別に設定していきます。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
色範囲は、#part-ii-from-logic-to-geometry の演習で説明した、数値のリストを別の範囲に再マッピングする Remap Range ノードに似ています。ただし、色範囲は、数値 の範囲にマッピングされるのではなく、入力された 0 から 1 までの数値に基づいて 色のグラデーション にマッピングされます。
現在のノードは正しく機能しますが、最初からすべてを正しく機能させるのは少し大変です。色のグラデーションを理解するための最適な方法は、色のグラデーションを対話式に試す方法です。ここでは、簡単な演習を行い、数値に対応する色の出力を使用してグラデーションを設定する方法を確認します。
3 つの色を定義する: Code Block ノードを使用して 0 から 255 までの適切な数値の組み合わせに接続することにより、赤、緑 、 青 を定義します。
リストを作成する: 3 つの色を 1 つのリストにマージします。
インデックスを定義する: 0 から 1 までの範囲で、各色のグリップ位置を定義するリストを作成します。緑の値が 0.75 になっていることに注意してください。これにより、色範囲スライダの水平方向のグラデーションの 4 分の 3 が緑色になります。
Code Block ノードを設定する: 0 から 1 までの値を入力することで、グラデーションを色に変換します。
Display.ByGeometry ノードを使用すると、Dynamo のビューポート内でジオメトリに色を付けることができます。この機能は、ジオメトリの各種タイプを区別する場合、パラメータの概念を表現する場合、シミュレーション用の解析凡例を定義する場合に便利です。この場合の入力は単純で、ジオメトリと色だけです。上の図のようなグラデーションを作成するには、color 入力を Color Range ノードに接続します。
Display.BySurfaceColors ノードを使用すると、サーフェス全体にデータを色でマッピングすることができます。この機能により、日照解析、エネルギー解析、近接度解析など、各種の解析で取得したデータを視覚化することができます。Dynamo では、他の CAD 環境でマテリアルにテクスチャを適用する場合と同様に、サーフェスに色を適用することができます。次の簡単な演習で、このツールの使用方法を確認します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
この演習では、パラメータを使用して、ジオメトリと並行して色の管理を行います。この演習で使用するジオメトリは、単純ならせん構造です。このらせん構造は、Code Block ノードを使用して定義します。これは、パラメータを使用する関数をすばやく簡単に作成するための方法です。この演習の目的は、ジオメトリではなく色を操作することであるため、コード ブロックを使用してキャンバスを見やすい状態に保ったまま、らせん構造を効率的に作成します。この手引ではより高度なマテリアルを取り上げるようになるため、ここからは、コード ブロックを頻繁に使用することになります。
Code Block ノードを使用して、上図に示す式を持つ 2 つのコード ブロックを定義します。これは、パラメータを使用してらせん構造をすばやく作成するための方法です。
Point.ByCoordinates ノードの座標(x,y,z)に Code Block ノードの 3 つの出力を接続します。
これで、らせん構造を形成する点の配列が表示されます。次の手順では、このらせん構造の点群から曲線を作成して、完全ならせん構造を作成します。
PolyCurve.ByPoints ノードの points 入力に Point.ByCoordinates ノードの出力を接続します。これにより、らせん状の曲線が作成されます。
Curve.PointAtParameter ノードの curve 入力に PolyCurve.ByPoints ノードの出力を接続します。この手順の目的は、曲線に沿ってスライドするパラメータのアトラクタ点を作成することです。この曲線によってパラメータの点が評価されるため、0 から 1 の範囲で param の値を入力する必要があります。
Number Slider ノードをキャンバスに追加したら、Min の値を 0.0 、Max の値を 1.0、Step の値を .01 に変更します。次に、Number Slider ノードの出力を Curve.PointAtParameter ノードの param 入力に接続します。らせん構造全体に沿って表示されている点を、スライダのパーセンテージとして表すことができるようになりました(開始点は 0、終点は 1)。
これで、参照点が作成されました。次に、この参照点から、らせん構造を定義する元の点までの距離を比較します。この距離により、色とジオメトリをコントロールします。
Geometry.DistanceTo ノードの other 入力に Curve.PointAtParameter ノードの出力を接続します。geometry 入力に Point.ByCoordinates ノードを接続します。
Watch ノードに、らせん構造の曲線を構成するそれぞれの点から参照点までの距離のリストが表示されます。
次の手順では、らせん構造の各点から参照点までの距離のリストを使用して、パラメータを設定します。また、これらの距離の値を使用して、曲線に沿った一連の球形の半径を定義します。これらの球形を適切なサイズに保つには、距離の値を 再マッピング する必要があります。
Math.RemapRange ノードの numbers 入力に Geometry.DistanceTo ノードの出力を接続します。
値が 0.01 の Code Block ノードを Math.RemapRange ノードの newMin 入力に接続し、値が 1 の Code Block ノードを Math.RemapRange ノードの newMax 入力に接続します。
いずれかの Watch ノードに Math.RemapRange ノードの出力を接続し、もう一方の Watch ノードに Geometry.DistanceTo ノードの出力を接続します。次に、結果を比較します。
この手順により、距離のリストがより狭い範囲に再マッピングされます。再マッピングの結果が適切な場合であっても、newMin と newMax の値を編集することができます。これらの値は、範囲全体で 分布比率 を保持したまま再マッピングされます。
Sphere.ByCenterPointRadius ノードの radius 入力に Math.RemapRange ノードの出力を接続し、元の Point.ByCoordinates ノードの出力を Sphere.ByCenterPointRadius ノードの centerPoint 入力に接続します。
Number Slider ノードの値を変更し、球体のサイズが更新されることを確認します。ここで、パラメータ ツールを使用します。
球体のサイズは、曲線に沿った参照点によって定義されるパラメータ配列を示しています。ここでは、球体の半径と同じ考え方で、球体の色を操作してみます。
Color Range ノードをキャンバス上に追加します。value 入力にマウス ポインタを置くと、0 から 1 までの範囲で数値を指定する必要があることがわかります。ここでは、Geometry.DistanceTo ノードの出力から数値を再マッピングして、それらの数値をこの範囲に対応させる必要があります。
Sphere.ByCenterPointRadius ノードでのプレビューを一時的に無効にします(右クリックして[プレビュー]を選択)。
Math.RemapRange ノードの numbers 入力にも同様にGeometry.DistanceTo ノードの出力を接続します。
Code Block ノードを使用して、Math.RemapRange ノードの newMin 入力の値として 0 を設定し、newMax 入力の値として 1 を設定します。この場合、1 つのコード ブロックで 2 つの出力を定義できることに注意してください。
Color Range ノードの value 入力に Math.RemapRange 出力を接続します。
Color.ByARGB ノードを使用して、2 つの色を作成します。この手順は複雑そうに感じるかもしれませんが、他のソフトウェアで使用する RGB カラーの場合と同じです。ここでは、ビジュアル プログラミングを使用して色を処理するというだけのことです。
Code Block ノードを使用して、0 と 255 という 2 つの値を作成します。次に、上の図のように、この 2 つの値を Color.ByARGB の各入力に接続します(または、任意の色を 2 つ作成します)。
Color Range ノードの colors 入力では、色のリストが必要になります。上の手順で作成した 2 つの色を使用して、色のリストを作成する必要があります。
List.Create ノードを使用して、2 つの色を 1 つのリストにマージします。次に、このノードの出力を Color Range ノードの colors 入力に接続します。
Display.ByGeometryColor ノードの geometry 入力に Sphere.ByCenterPointRadius ノードを接続し、Color Range ノードを Display.ByGeometryColor ノードの color 入力に接続します。これで、曲線領域全体にスムーズな色のグラデーションが適用されます。
前の手順の Number Slider ノードの値を定義内で変更すると、色とサイズが変更されます。この場合、色と半径のサイズは相互に直接関係しています。これで、2 つのパラメータ間の関係を視覚的に確認することができます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
最初に、Display.BySurfaceColors ノードの入力として使用するサーフェスを作成(または参照)する必要があります。この例では、正弦曲線と余弦曲線間をロフトします。
このノード グループ は、Z 軸に沿って点を作成してから、正弦関数と余弦関数に基づいてそれらの点の位置を変更します。その後、2 つの点リストを使用して NURBS 曲線が生成されます。
Surface.ByLoft ノードを使用して、NURBS 曲線のリスト間に、補間されたサーフェスを生成します。
File Path ノードを使用して、下流のピクセル データのサンプリングを行うためのイメージ ファイルを選択します。
File.FromPath ノードを使用してファイル パスをファイルに変換し、そのファイルを Image.ReadFromFile ノードに渡してサンプリング用のイメージを出力します。
Image.Pixels ノードを使用してイメージを入力し、そのイメージの X、Y 座標に対応して使用されるサンプル値を指定します。
Slider ノードを使用して、Image.Pixels ノードのサンプル値を指定します。
Display.BySurfaceColors ノードを使用して、色の値の配列を、X、Y 座標に対応してサーフェス全体にマッピングします。
400x300 のサンプル解像度で、出力サーフェスのプレビューを拡大します。
ロジック(正確には条件付きロジック)により、テストに基づく単一のアクションや一連のアクションを指定することができます。テストの評価を行うと、True
または False
のブール値が返されます。このブール値を使用して、プログラム フローをコントロールすることができます。
数値変数には、さまざまな数値の範囲全体を格納することができます。ブール変数には、True または False、Yes または No、1 または 0 など、2 つの値のみを格納することができます。このようにブール値の範囲は限られているため、ブール値を使用して計算を行うことはほとんどありません。
If ステートメントは、プログラミングにおける重要な概念です。このステートメントは、「 この条件 が真である場合は この処理 を実行し、偽である場合は 別の処理 を実行する」という形式で記述されます。このステートメントの結果として出力されるアクションは、ブール値によって制御されます。Dynamo で If ステートメントを定義する場合、いくつかの方法があります。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
ここでは簡単な例を使用して、If 条件ステートメントを使用する 3 つのノードの動作を確認していきます。
上の図では、Boolean ノードの出力値が True に設定されているため、その結果として "this is the result if true" という文が表示されます。この場合、If ステートメントを構成する 3 つのノードの動作は同じになります。
繰り返しますが、これら 3 つのノードの動作はすべて同じになります。ブール値 を False に変更すると、元の If ステートメントで定義されているとおりに、出力結果の値が Pi になります。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
ここでは、ロジックを使用して、数値のリストを偶数のリストと奇数のリストに分割してみましょう。
a.Number Range ノードを使用して、数値の範囲をキャンバスに追加します。
b.Number ノードを使用して、3 つの Number ノードをキャンバスに追加します。各 Number ノードで、次のように値を指定します。start 入力: 0.0、end 入力: 10.0、step 入力: 1.0。
c.Output として、0 から 10 までの範囲にわたる 11 個の数値のリストが生成されます。
d.「(%)」ノード(モジュロ演算ノード)の x 入力に Number Range ノードを接続し、y 入力で 2.0 を指定します。この操作により、リスト内の各数値を 2 で除算した場合の余りが算出されます。このリストの出力値は、0 と 1 が交互に現れる数値のリストになります。
e.「(==)」ノード(等価テスト ノード)を使用して、キャンバスに等価テストを追加します。「(%)」ノードの出力を「(==)」ノードの x 入力に接続し、Number ノードの 0.000 出力を「(==)」ノードの y 入力に接続します。
f.Watch ノードを使用して、等価テストの出力が true と false の値を交互に繰り返すリストになっていることを確認します。これらの値を使用して、リスト内の項目が区別されます。0 (または true)は偶数を表し、1 (または false)は奇数を表します。
g.List.FilterByBoolMask ノードは、ブール値の入力に基づいて数値をフィルタし、2 つの異なるリストに分割します。元の 数値の範囲 を list 入力に接続し、「(==)」ノードの出力を mask 入力に接続します。in 出力は true の値を表し、out 出力は false の値を表します。
h.Watch ノードを使用して、偶数のリストと奇数のリストが生成されたことを確認します。これで、論理演算子を使用して、リストがパターン別に分類されました。
ここでは、最初の演習で作成したロジックを変更してモデリング操作に適用してみましょう。
2.ここでも、前の演習と同じノードを使用します。ただし、次のように、いくつか違いがあります。
a.これらの入力値で Sequence ノードを使用します。
b.List.FilterByBoolMask ノードの list 入力に対する接続が解除されています。これらのノードは、この演習の後半で使用します。
3.最初に、上の図に示されているように、グラフの別のグループを作成します。このノード グループは、曲線を定義するためのパラメータ制御式を表しています。ここで、次の点に注意する必要があります。
a.最初の Number Slider は、波の周波数を表します。最小 1、最大 4、ステップ 0.01 の値である必要があります。
b.2 番目の Number Slider は、波の振幅を表します。最小 0、最大 1、ステップ 0.01 の値である必要があります。
c.PolyCurve.ByPoints ノードにより、上図のとおりにノード ダイアグラムを構成した時点で、Dynamo のプレビューに正弦曲線が出力されます。
ここでは、静的なプロパティで Number ノードを使用し、動的なプロパティで Number Slider ノードを使用して入力を行います。この手順の最初で定義した元の数値の範囲をそのまま使用してもかまいませんが、ここで作成する正弦曲線に対して、ある程度の柔軟性を設定しておく必要があります。Number Slider ノードの値を変更して、曲線の周波数と振幅がどのように変化するかを確認してください。
4.ここで少し先回りをして、最終的な結果を確認しましょう。個別に作成した最初の 2 つのステップを接続する必要があります。基本の正弦曲線を使用して、ジッパー状のコンポーネントの位置をコントロールし、真偽判定のロジックを使用して、小さなボックスと大きなボックスを交互に配置します。
a.Sequence ノードの step 入力の値 2 で作成された数列の範囲を Math.RemapRange ノードで再マッピングして、新しい一連の数値を作成します。元の数値の範囲は、0 から 100 までになります(step 値 1)。新しい数値の範囲は、0 から 1 になります。最小値の 0 を newMin 入力に接続し、最大値の 1 を newMax 入力に接続します。
5.Curve.PointAtParameter ノードを作成し、ステップ 04 の Math.RemapRange 出力を param 入力として接続します。
この操作により、曲線に沿って点群が作成されます。ここでは数値の範囲を 0 から 1 までの範囲に再マッピングしましたが、その理由は、param 入力に 0 から 1 までの範囲の値を指定する必要があるためです。0 の値は始点を表し、1 の値は終点を表します。すべての中間値は、[0,1] の範囲内で評価されます。
6.Curve.PointAtParameter ノードの出力を List.FilterByBoolMask ノードに接続し、奇数インデックスと偶数インデックスのリストを分離します。
a.List.FilterByBoolMask ノードの list 入力に、前の手順で使用した Curve.PointAtParameter ノードを接続します。
b.Watch ノードを in 出力と out 出力に 1 つずつ接続し、偶数値のインデックスを表すリストと奇数値のインデックスを表すリストが生成されたことを確認します。これらの点群は、曲線上に同じ方法で配置されます。これについては、次の手順で確認します。
7.次に、ステップ 05 で List.FilterByBoolMask ノードの出力結果を使用して、インデックスに従ってサイズが設定されたジオメトリを生成します。
Cuboid.ByLengths ノードを上の図のように接続し、正弦曲線に沿ったジッパー構造を作成します。ノード名の「Cuboid」とは、直方体という意味です。ここでは、直方体の中央に位置する曲線上の点を基準として、直方体のサイズを定義します。この操作により、偶数と奇数の除算ロジックがモデル内に明示的に定義されます。
a.偶数インデックスの直方体のリスト。
b.奇数インデックスの直方体のリスト。
できました!この演習で説明したロジック演算に従ってジオメトリ寸法を定義するプロセスをプログラムしました。
リストとは、要素(項目)の集合です。例として、1 房のバナナを考えてみましょう。1 本のバナナが、リスト(房)内の 1 つの項目になります。それぞれのバナナをばらばらに取り上げるより、房をまとめて持ち上げる方が簡単です。同じことが、データ構造内のパラメータに基づく関係によって各要素をグループ化する場合についても当てはまります。
写真: Augustus Binu
日用品を購入する場合、購入した商品をすべて買い物カゴに入れます。このカゴも、リストと考えることができます。たとえば、3 房のバナナを使用して 多くの バナナ ブレッドを作るとします。この場合、すべてのバナナが入っている袋がバナナの房のリストで、それぞれの房がバナナのリストになります。この袋は 2 次元の「リストのリスト」で、バナナの房は 1 次元の「リスト」です。
Dynamo では、リスト データには順序が付けられ、各リストの最初の項目にはインデックス「0」が割り当てられます。次のセクションでは、Dynamo におけるリストの定義の仕組みと、複数のリストの相互関係について説明します。
リストのインデックスは、1 ではなく必ず 0 から始まります。これは、最初は不思議に感じるかもしれません。今後、リストの最初の項目と言う場合は、インデックス 0 の付いた項目のことを意味します。
たとえば、右手の指を使って数を数える場合、1 から 5 の順序で数えます。0 から数え始めることはほとんどないはずです。しかし、右手の指を Dynamo のリストだと仮定すると、それぞれの指に 0 から 4 のインデックスが割り当てられることになります。プログラミングの初心者にとっては少し不思議に感じられるかもしれませんが、ほとんどのコンピュータ システムでは、インデックスの値はゼロで始まるのが普通です。
ここでも、引き続きリスト内に 5 つの項目が含まれています。ただし、最初の項目に 0 のインデックス値が割り当てられているものと仮定して説明を続けます。リストに格納できる項目は、数値だけではありません。Dynamo でサポートされているデータ タイプであれば、点、曲線、サーフェス、ファミリなど、任意のデータ タイプをリスト内に格納することができます。
a.インデックス
b.点
c.項目
多くの場合、リストに格納されているデータのタイプを確認する最も簡単な方法は、ノードの出力を Watch ノードに接続する方法です。既定では、Watch ノードにはリストの左側のすべてのインデックスと、右側のすべてのデータ項目が自動的に表示されます。
これらのインデックスは、リストを操作する場合の重要な要素です。
リストの入力と出力は、使用する Dynamo ノードによって異なります。例として、5 つの点を持つリストのノードの出力を PolyCurve.ByPoints ノードと Circle.ByCenterPointRadius ノードに接続してみましょう。
PolyCurve.ByPoints ノードの points 入力には、Point[] が必要です。これは、点のリストを表しています。
PolyCurve.ByPoints ノードの出力は、5 つの点を持つリストから作成された単一のポリカーブです。
Circle.ByCenterPointRadius ノードの centerPoint 入力には、Point が必要です。
Circle.ByCenterPointRadius ノードの出力は、5 つの円を持つリストです。それぞれの円の中心が、元のリスト内の点に対応しています。
PolyCurve.ByPoints と Circle.ByCenterPointRadius の入力データは同じですが、Polycurve.ByPoints ノードは 1 つのポリカーブを返し、Circle.ByCenterPointRadius ノードは各点を中心とする 5 つの円を返します。この場合、5 つの点をつなぐ曲線としてポリカーブが描画され、Circle.ByCenterPointRadius ノードは各点を中心とする個別の円を描画します。これは、直感的に理解することができます。では、データには何が起きているのでしょうか。
Polycurve.ByPoints の points 入力の上にカーソルを置くと、この入力に Point[] が必要であることがわかります。最後の角括弧に注意してください。これは、点のリストであることを表しています。ポリカーブを作成するには、ポリカーブごとにリストを入力する必要があります。入力された各リストは、Polycurve.ByPoints ノードによって 1 つのポリカーブに集約されます。
一方、Circle.ByCenterPointRadius ノードの centerPoint 入力には、Point が必要です。このノードはリストの項目である 1 つの点を取得し、それを円の中心として定義します。入力されたデータから 5 つの円が生成されるのは、このためです。Dynamo の入力に関するこれらの違いを認識しておくと、ノードによるデータ処理の仕組みを正しく理解することができます。
データの一致は、明確に解決することができない問題です。このような問題は、異なるサイズの入力をノードに渡すときに発生します。データ一致アルゴリズムを変更すると、結果が大きく変わってしまうことがあります。
例として、2 点の間に直線セグメントを作成するノード(Line.ByStartPointEndPoint)を考えてみます。このノードは、点の座標を指定する 2 つの入力パラメータを使用します。
最も単純な方法は、一方のリストが終了するまで、入力された点を 1 対 1 で接続していく方法です。これは、「最短リスト」アルゴリズムと呼ばれます。Dynamo ノードの既定の動作です。
「最長リスト」アルゴリズムの場合、すべてのリストの最後の項目に達するまで、同じ要素を繰り返し使用して入力が接続されたままの状態になります。
最後に、「直積」方式について説明します。この方式では、考えられる接続がすべて生成されます。
これらの点の集まりの間に直線を描画する場合、いくつかの方法があります。レーシング オプションを使用するには、ノードの中心を右クリックして[レーシング]メニューを選択します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
次の図を使用して、レーシング操作について説明します。ここでは、上記の基準ファイルを使用して、最短リスト、最長リスト、直積を定義します。
Point.ByCoordinates ノードでレーシングを変更しますが、上図のグラフについては何も変更しません。
レーシング オプション(既定のオプションも同様)として_最短リスト_を選択すると、5 つのポイントで構成される基本的な対角線が得られます。最短リストのレーシングは、2 つのリストのうち短い方のリストの最後の項目に達した場合に動作が終了します。そのためこの例では、5 つの点が含まれているリストの最後に達すると、レーシング動作が停止します。
レーシングを[最長リスト]に変更すると、垂直方向に伸びる対角線が生成されます。上の概念図のように、長い方のリストの最後の項目に達するまで、短い方のリスト(項目数が 5 のリスト)の最後の項目が繰り返し使用されます。
レーシングを[直積]に変更すると、各リスト間で考えられるすべての組み合わせの 5x10 の点のグリッドが生成されます。これは、上の概念図に示す直積に該当するデータ構造です。ただし、ここで使用しているデータは、「リストのリスト」です。ポリカーブを接続すると、各リストは X 値によって定義され、垂直な直線の列が生成されていることがわかります。
文字列とは、正確には、リテラル定数や何らかのタイプの変数を表す一連の文字の集合のことです。広い意味では、文字列とは、テキストを意味するプログラミング用語です。ここまでの手順では、整数と小数の両方を使用してパラメータをコントロールしてきましたが、テキストについても同じ処理を行うことができます。
文字列は、カスタム パラメータの定義、ドキュメント セットの注釈付け、テキストベースのデータ セットの解析など、さまざまな目的で使用することができます。String ノードは、[Core] > [Input]カテゴリで使用することができます。
上記のサンプル ノードは、すべて文字列用のノードです。数値は文字と同様に、文字列として表すことも、テキスト配列全体として表すこともできます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
文字列のクエリーを実行することにより、大量のデータをすばやく解析することができます。ここでは、ワークフローを促進してソフトウェアの相互運用性を向上させるための基本的な操作について説明します。
次の図は、外部のスプレッドシートから取得したデータの文字列を示しています。この文字列は、XY 面上の長方形の頂点を表しています。簡単な演習として、文字列の分割操作を確認してみましょう。
「;」セパレータは、長方形の各頂点を分割します。これにより、各頂点の 3 つの項目が含まれているリストが作成されます。
String.Split ノードの中央にある[+]をクリックして、新しいセパレータを作成します。
「,」という文字をキャンバスに追加し、separator1 入力に接続します。
リストの項目が 10 個になります。String.Split ノードは、separator0 に基づいて分割を行ってから、separator1 に基づいて分割を行います。
上記のリストの項目は数値に見えますが、Dynamo 内では個別の文字列として認識されます。点群を作成するには、データ タイプを文字列から数値に変換する必要があります。これを行うには String.ToNumber ノードを使用します。
String.ToNumber ノードは、単純なノードです。String.Split ノードの出力を String.ToNumber ノードの入力に接続します。出力の表示は変わりませんが、データ タイプは 文字列 から 数値 に変換されています。
いくつかの基本的な操作を実行すると、元の文字列の入力に基づいて基準点に三角形が描画されます。
文字列は一般的なテキスト オブジェクトであるため、さまざまな目的で使用することができます。ここでは、[Core] > [String]カテゴリの主要なアクションをいくつか見てみましょう。
このカテゴリには、複数の文字列を順に結合する方法が用意されています。リストから各リテラル文字列を取得して、1 つの文字列に結合します。
以下は、3 つの文字列を連結する方法を示しています。
String.Concat ノード中央の[+]/[-]ボタンをクリックして、連結する文字列の追加と除外を行います。
出力として、スペースと句読点を含む 1 つの連結された文字列が生成されます。
結合操作は連結操作に非常によく似ていますが、句読点のレイヤーが追加される点が異なります。
Excel を使用したことがあれば、CSV ファイルについても知っているでしょう。CSV とは、カンマ区切り値という意味です。セパレータとしてカンマ(この場合は 2 つのダッシュ)を String.Join ノードで使用すると、CSV に似たデータ構造を作成することができます。
次の図は、2 つの文字列を結合する方法を示しています。
separator 入力を使用して、結合された文字列の区切り文字を指定することができます。
この演習では、文字列のクエリーと文字列の操作を実行して、Robert Frost の「Stopping By Woods on a Snowy Evening」という詩の最後の節を分解してみましょう。実際の開発作業で詩の文字列を操作することはありませんが、文字列に対する操作を理解するのに役立ちます。
最初に、節の文字列を分解する基本的な操作を実行します。文字はカンマに基づいて書式設定されていることがわかります。この書式を使用して、各行を個々の項目に分割します。
ベースとなる文字列を String ノードに貼り付けます。
別の String ノードを使用して、セパレータを指定します。ここでは、カンマをセパレータとして使用します。
String.Split ノードをキャンバスに追加し、2 つの String ノードに接続します。
出力として、各行が個別の要素に分割されます。
次に、詩のサビとなる最後の 2 行を処理しましょう。元の節は 1 つのデータ項目でした。最初の手順で、このデータを個別の項目に分割しました。そのため、必要な文字列を検索する必要があります。この例では、リストの最後にある 2 つの項目を選択することは難しく ありません が、書籍全体が処理対象になるような場合、内容をすべて読んでから各要素を手作業で区別するのは大変な作業になります。
String.Contains ノードを使用して文字セットを検索すれば、こうした手作業を行う必要はありません。これは、文書ファイルで「検索」コマンドを実行するのと似ています。この場合、対象のサブストリングが項目内で見つかったかどうかに応じて、「true」または「false」が返されます。
String.Contains ノードの searchFor 入力で、節内で検索するサブストリングを定義します。ここでは、String ノードで「And miles」と指定します。
出力として、false と true のリストが表示されます。次の手順では、このブール値ロジックを使用して各要素をフィルタします。
List.FilterByBoolMask ノードを使用して false と true を抽出します。in 出力は、mask 入力が true になっているステートメントを返し、out 出力は、mask 入力が false になっているステートメントを返します。
in 出力により、節の最後の 2 行が返されます。この 2 行には、「And miles」という文字列が含まれています。
次に、最後の 2 行を結合して節の繰り返しを強調します。前の手順の出力を確認すると、リスト内に 2 つの項目が含まれていることがわかります。
2 つの List.GetItemAtIndex ノードを使用し、0 と 1 を index 入力の値として指定することにより、2 つの項目を分離することができます。
各ノードの出力として、最後の 2 行が順に表示されます。
これらの 2 つの項目を 1 つに結合するには、String.Join ノードを使用します。
String.Join ノードを追加したら、セパレータを指定する必要があります。
セパレータを指定するには、キャンバスに String ノードを追加してカンマを入力します。
最終的な出力として、最後の 2 行が 1 行に結合されます。
このように、最後の 2 行を分割する作業は手間がかかります。文字列の操作では、多くの場合、事前の作業が必要になります。ただし、文字列の操作は拡張可能であるため、大規模なデータセットにも比較的簡単に適用することができます。スプレッドシートでパラメータを使用して対話式に操作する場合は、文字列の操作を実行すると便利です。
Dynamo 2.0 では、これまでに説明したディクショナリのノードだけでなく、コード ブロックにおけるディクショナリの新機能も導入されました。
次のような構文、つまりノードの DesignScript ベースの表現を使用できます。
ディクショナリは Dynamo のオブジェクト タイプであるため、次のアクションを実行できます。
このような操作は、Revit データを文字列に関連付ける場合に特に便利です。次に、Revit での使用例を見てみましょう。
Dynamo 2.0 では[Dictionary]カテゴリのさまざまなノードが公開されており、使用することができます。作成、アクション、クエリー のノードがあります。
Dictionary.ByKeysValues
は、指定した値とキーでディクショナリを作成します。(項目数は、最短のリストの入力によります)
Dictionary.Components
は、入力ディクショナリのコンポーネントを作成します。(これはノードの作成と逆の操作です)。
Dictionary.RemoveKeys
は、入力キーが削除された新しいディクショナリのオブジェクトを作成します。
Dictionary.SetValueAtKeys
は、入力キーと値に基づいて新しいディクショナリを作成し、対応するキーで現在の値を置き換えます。
Dictionary.ValueAtKey
は、入力キーに対する値を返します。
Dictionary.Count
は、ディクショナリに含まれるキーと値のペア数を示します。
Dictionary.Keys
は、現在ディクショナリに格納されているキーを返します。
Dictionary.Values
は、現在ディクショナリに格納されている値を返します。
ディクショナリに関するあらゆるデータは、インデックスとリストを操作する従来の方法に代わる優れた手段です。
Dynamo 2.0 では、ディクショナリのデータ タイプをリストのデータ タイプと分離する概念が導入されました。この変更により、ワークフローにおけるデータの作成や操作の方法が大幅に変更される可能性があります。2.0 よりも前のバージョンでは、ディクショナリとリストは 1 つのデータ タイプとして統合されていました。つまり、リストが実際には整数キーを持つディクショナリだったのです。
ディクショナリは、キーと値のペアの集合で構成されたデータ タイプで、各キーは各集合に固有です。ディクショナリは順序付けされておらず、基本的には、リストにあるようなインデックス値の代わりにキーを使用して「調べる」ことができます。Dynamo 2.0 では、キーに文字列のみを使用できます。
リストは、順序付けされた値の集合で構成されたデータ タイプです。Dynamo では、リストはインデックス値として整数を使用します。
ディクショナリは、リストと分離されたことによって第一級オブジェクトとなりました。そのため、インデックス値を覚えたり、ワークフロー全体で厳密なリスト構造を維持することなく、値の格納や検索をすばやく容易に行うことができます。ユーザのテストにおいて、複数の GetItemAtIndex
ノードの代わりにディクショナリを使用した場合に、グラフのサイズが大幅に低減することがわかりました。
構文 の変更により、コード ブロック内のディクショナリとリストの初期化および操作の方法が変更されました。
ディクショナリは {key:value}
の構文を使用します。
リストは [value,value,value]
の構文を使用します。
ディクショナリを作成、編集、クエリーするための 新しいノード が、ライブラリに追加されました。
v1.x のコード ブロックで作成されたリストは、スクリプトのロード時に、角括弧 [ ]
を波括弧 { }
の代わりに使用する新しいリスト構文に自動的に移行されます。
コンピュータ サイエンスにおいて、ディクショナリはリストのように、オブジェクトの集合です。リストは特定の順序で並んでいますが、ディクショナリは 順序なし の集合です。一連番号(インデックス)に依存せず、キー を使用します。
次の画像では、可能性のあるディクショナリの使用例を示しています。多くの場合、ディクショナリを使用して、直接的な関係を持たない 2 つのデータを関連付けます。ここでは、スペイン語バージョンの単語を英語バージョンに接続して、後で検索できるようにしています。
2 つのデータを関連付けるディクショナリを作成します。
指定されたキーを使用して値を取得します。
リストとは何かということを理解したところで、ここからは、リストに対して実行できる操作について見ていきます。ここでは、リストをトランプのカードだと考えてください。1 組のトランプがリストで、1 枚 1 枚のカードが 1 つの項目ということになります。
リストに関する質問(クエリー)を作成する場合、次のような質問が考えられます。これにより、リストの特性(プロパティ)がわかります。
Q: カードの数は?A: 52 枚
Q: スートの数は?A: 4 つ
Q: 素材は?A: 紙
Q: 長さは?A: 89 ミリ
Q: 幅は?A: 64 ミリ
リストに対して実行できる操作(アクション)としては、次のような操作が考えられます。この場合、実行する操作に応じてリストが変化します。
カードをシャッフルする。
数字の順にカードを並べ替える。
スート別にカードを並べ替える。
カード全体をいくつかに分割する。
各プレーヤにカードを配ることにより、カード全体をいくつかに分割する。
デッキから特定のカードを選ぶ。
Dynamo では、これらの操作に似た操作を実行することができます。その場合、Dynamo の各ノードを使用して、一般的なデータのリストを操作することになります。これ以降の各演習では、リストに対して実行できる基本的な操作をいくつか見ていきます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
下の図は、2 つの円の間に線を引いて基本的なリスト操作を表しているベース グラフです。リスト内のデータを管理する方法を紹介し、次のリスト アクションを使用して視覚的な結果を示します。
最初に、
500;
という値が表示されている Code Block ノードを使用します。上記の Code Block ノードを Point.ByCoordinates ノードの x 入力に接続します。
上記のノードを Plane.ByOriginNormal ノードの origin 入力に接続します。
Plane.ByOriginNormal ノードを Circle.ByPlaneRadius ノードの plane 入力に接続します。
Code Block ノードを使用して、radius の値を
50;
に設定します。これは、最初に作成する円の半径です。Geometry.Translate ノードを使用して、上記の円を Z の正の向きに 100 単位移動します。
Code Block ノードで
0..1..#10;
というコードを指定して、0 から 1 までの範囲で 10 個の数字を定義します。上記の Code Block ノードを 2 つの Curve.PointAtParameter ノードの param 入力に接続します。次に、上部に配置されている方の Curve.PointAtParameter ノードの curve 入力に Circle.ByPlaneRadius ノードを接続し、下部に配置されている方の Curve.PointAtParameter ノードの curve 入力に Geometry.Translate ノードを接続します。
Line.ByStartPointEndPoint ノードを使用して、2 つの Curve.PointAtParameter ノードを接続します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
List.Count ノードは、リスト内の値の数をカウントしてその数を返すという単純なノードです。「リストのリスト」を操作する場合は、このノードの使用方法も多少複雑になりますが、それについてはこれ以降のセクションで説明します。
**List.Count ****** ノードは、Line.ByStartPointEndPoint ノード内の線分の数を返します。この場合は 10 という値が返されますが、これは、元の Code Block ノードで作成した点の数に対応しています。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
List.GetItemAtIndex ノードは、リスト内の項目のクエリーを実行するための基本的な方法です。
まず、Line.ByStartPointEndPoint ノードを右クリックして、プレビューをオフにします。
List.GetItemAtIndex ノードを使用して、インデックス値「0」を選択するか、線分のリスト内の先頭の項目を選択します。
スライダの値を 0 から 9 の間で変更し、List.GetItemAtIndex ノードを使用して別の項目を選択します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
List.Reverse ノードは、リスト内のすべての項目の順序を逆にします。
順序が逆になった線分のリストをわかりやすく表示するために、Code Block を
0..1..#50;
に変更して線分の数を増やします。Line.ByStartPointEndPoint ノードを複製し、Curve.PointAtParameter ノードと 2 番目の Line.ByStartPointEndPoint ノードの間に List.Reverse ノードを挿入します。
Watch3D ノードを使用して、2 つの異なる結果をプレビューします。一方のノードには、リストが反転されていない結果が表示されます。それぞれの線分が、対応する点に対して垂直に接続されています。もう一方のノードには、反転していないリストとは逆の順序で、すべての点が接続されます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
List.ShiftIndices ノードは、ねじれパターンやらせんパターンなどを作成する場合に便利なノードです。このノードは、指定されたインデックス値の分だけ、リスト内の項目を移動します。
List.Reverse ノードの場合と同様に、List.ShiftIndices ノードを Curve.PointAtParameter ノードと Line.ByStartPointEndPoint ノードの間に挿入します。
Code Block ノードを使用して、リストを移動するインデックス値として「1」を指定します。
この場合の変化はわずかですが、下部に表示されている方の Watch3D ノード内のすべての線分が、インデックス 1 つ分だけ横にずれた点に接続されています。
Code Block ノードの値を「30」などの大きな値に変更すると、すべての線分が大きく変化することがわかります。元の円柱形状がこのように変化する動作は、カメラの絞りによく似ています。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
List.FilterByBooleanMask ノードは、ブール値のリストに基づいて、特定の項目を削除します。ブール値とは、「true」または「false」を読み取る値のことです。
「true」または「false」を読み取る値のリストを作成するには、次の手順を実行します。
Code Block ノードを使用して、
0..List.Count(list);
という構文の式を作成します。次に、Curve.PointAtParameter ノードを list 入力に接続します。この設定については、Code Block の章で詳しく説明します。ここでは、上記の構文を使用すると、Curve.PointAtParameter ノードの各インデックス値を表すリストが作成されるということだけを覚えてください。剰余演算を処理する「%」ノードを使用して、Code Block ノードの出力を x 入力に接続し、4 という値を y 入力に接続します。この操作により、インデックス値のリストを 4 で割った場合の余りが取得されます。剰余演算を処理する「%」ノードは、パターンを作成する場合に非常に便利なノードです。たとえば、整数を 4 で割った場合の余りは、0、1、2、3 のいずれかになります。
剰余演算を処理する「%」ノードの値が 0 になっている場合、インデックス値は 4 で割り切れる数値(0、4、8 など)であるということがわかります。「== 」ノードを使用して、インデックス値を「0」という値に対してテストすると、そのインデックス値が割り切れる数値であるかどうかを判断することができます。
Watch ノードには、true,false,false,false... というパターンでテストの結果が表示されます。
この true/false のパターンを使用して、2 つの List.FilterByBooleanMask ノードの mask 入力に接続します。
Curve.PointAtParameter ノードを、2 つの List.FilterByBooleanMask ノードの list 入力に接続します。
List.FilterByBooleanMask の出力が in と out から読み取られます。in は、「true」というマスク値を持つ値を表し、out は、「false」というマスク値を持つ値を表します。in 出力を Line.ByStartPointEndPoint ノードの startPoint 入力と endPoint 入力に接続すると、フィルタされた線分のリストが作成されます。
下部に表示されている方の Watch3D ノードに、線分の数が点の数よりも少ない円柱が表示されます。フィルタ処理で true の値だけに絞り込んだため、ノードの 25% だけが選択されました。
Revit 内で、そこに含まれるデータの一部を使って検索しようとしたことがありますか?
次の例のような作業を行ったことがあるのではないでしょうか。
下図では、Revit モデル内のすべての部屋を収集し、必要な部屋のインデックスを(部屋番号で)取得し、最終的にそのインデックスにある部屋がわかります。
モデル内のすべての部屋を収集します。
検索する部屋番号。
部屋番号を取得し、その番号のインデックスを見つけます。
インデックスで部屋を取得します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
次に、ディクショナリを使用して、これを再作成してみましょう。まず、Revit モデル内のすべての部屋を収集する必要があります。
操作する Revit カテゴリを選択します(ここでは部屋を操作します)。
Dynamo に対して、これらの要素すべての収集を指示します。
使用するデータは部屋番号です。
ここでは、指定されたキーと要素でディクショナリを作成します。
Dictionary.ByKeysValues ノードは、適切に入力されるとディクショナリを作成します。
Keys
は文字列であることが必要ですが、values
はさまざまなオブジェクト タイプにすることができます。
最終的に、部屋番号を使って、ディクショナリから部屋を取得することができます。
String
は、ディクショナリからオブジェクトを検索するために使用しているキーです。Dictionary.ValueAtKey ノードで、ディクショナリからオブジェクトを取得します。
ディクショナリによるこの同じ方法を使用して、グループ化されたオブジェクトでディクショナリを作成することもできます。指定されたレベルですべての部屋を検索する場合、上のグラフを次のように修正できます。
キーとして部屋番号を使用するのではなく、パラメータの値(ここではレベル)を使用できます。
これで、部屋をそのレベルごとにグループ化することができます。
レベルごとにグループ化された要素を使用することで、共有のキー(固有のキー)をディクショナリのキーとして使用し、部屋のリストを要素として使用できるようになります。
最終的に、Revit モデル内のレベルを使用して、ディクショナリ内で、そのレベルに配置されている部屋を検索できます。
Dictionary.ValueAtKey
は、レベル名を取得して、そのレベルの部屋オブジェクトを返します。
[Dictionary]カテゴリのノードを使用する機会は、実際には無限にあるのです。Revit 内の BIM データを要素自体に関連付けることができるので、さまざまな使用例が考えられます。
ここでは、階層にもう 1 つの層を追加してみましょう。「リストの操作」の章で例として取り上げたトランプを、ここでも例として使用します。たとえば、複数のデッキ(デッキとは 1 組のトランプのこと)が含まれたボックスを作成したとすると、そのボックスはデッキを格納するリストで、各デッキはカードのリストということになります。これが、「リストのリスト」という考え方です。たとえば次の図では、硬貨の山のリストが入っていて、それぞれの山には硬貨のリストが含まれています。
リストのリストに関する質問(クエリー)を作成する場合、次のような質問が考えられます。これにより、リストの特性(プロパティ)がわかります。
Q: 硬貨は何種類?A: 2.
Q: 硬貨のタイプ値は? A: $0.01 と $0.25 です。
Q: 25 セント硬貨の材質は?A: 銅 75%、ニッケル 25%
Q: 1 セント硬貨の材質は?A: 亜鉛 97.5%、銅 2.5%
リストのリストに対して実行できる操作(アクション)としては、次のような操作が考えられます。この場合、実行する操作に応じてリストのリストが変化します。
25 セント硬貨または 1 セント硬貨の特定の山を選ぶ。
特定の 25 セント硬貨または 1 セント硬貨を選ぶ。
25 セント硬貨の山と 1 セント硬貨の山の配置を変える。
25 セント硬貨の山と 1 セント硬貨の山をすべて入れ替える。
前の章でも説明したように、Dynamo の各ノードを使用して、上記の操作に似た操作を実行することができます。ここでは、物理的な物体ではなく抽象的なデータを操作するため、データ階層を上下に移動する方法をコントロールするための一連のルールが必要になります。
リストのリストを操作する場合、データは複雑な階層構造になっていますが、この複雑な構造により、非常に高度なパラメータ操作を実行することができます。これ以降の各演習では、基礎的な概念といくつかの操作方法を確認していきます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
このセクションで説明する基本的な概念は、「Dynamo は、リストをオブジェクトとして処理する」ということです。トップダウン階層は、オブジェクト指向プログラミングをベースとして開発されています。Dynamo は、List.GetItemAtIndex などのコマンドでサブ要素を選択するのではなく、データ構造内でメイン リストのインデックスを選択します。リスト中で選択したその項目が、別のリストである場合もあります。ここからは、サンプルの図を使用して詳しく説明していきます。
Code Block ノードを使用して、
0..2; 0..3;
という 2 つの範囲が定義されています。これらの範囲は、レーシングが「外積」に設定された Point.ByCoordinates ノードに接続されています。これにより、点のグリッドが作成され、リストのリストが出力として返されます。
Watch ノードの各リストで、4 つの項目を持つ 3 つのリストが指定されていることに注意してください。
インデックス値 0 を指定して List.GetItemAtIndex ノードを使用した場合、Dynamo は、最初のリストとそのリスト内のすべてのコンテンツを選択します。他のプログラムでは、データ構造内のすべてのリストの最初の項目だけが選択される場合がありますが、Dynamo は、トップダウン階層を使用してデータの処理を行います。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
フラット化を行うと、データ構造からすべてのデータ層が削除されます。この機能は、操作にデータ階層が必要ない場合に便利ですが、情報が削除される可能性があります。次の図は、データのリストをフラット化した結果を示しています。
Code Block ノードで
-250..-150..#4;
というコード行を挿入して範囲を定義します。Code Block ノードを Point.ByCoordinates ノードの x 入力と y 入力に接続します。これにより、点のグリッドを取得するための「外積」に対するレーシングが設定されます。
Watch ノードに、リストのリストが表示されます。
PolyCurve.ByPoints ノードは、各リストを参照して個別のポリカーブを作成します。Dynamo のプレビューに 4 つのポリカーブが表示されます。それぞれのポリカーブが、グリッド内の各行を表しています。
PolyCurve.ByPoints ノードの前に Flatten ノードを挿入して、すべての点を含む単一のリストを作成します。PolyCurve.ByPoints ノードは、リストを参照して 1 つのカーブを作成しますが、すべての点が 1 つのリスト上に存在しているため、点のリスト全体を通過するジグザクのポリカーブが 1 つだけ作成されます。
独立したデータ層をフラット化する方法も用意されています。List.Flatten ノードを使用すると、データ層の数を定義して、最上位の階層からデータ層をフラット化することができます。このノードは、現在のワークフローに必ずしも関係しない複雑なデータ構造を操作する場合に特に便利です。別の方法として、Flatten ノードを関数として List.Map ノードで使用することもできます。List.Map ノードの詳細については、以下で説明します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
パラメトリック モデリングを行う際に、既存のリストのデータ構造を修正したい場合があります。その場合、さまざまなノードを使用できますが、List.Chop ノードが最も基本的なノードです。List.Chop ノードで設定された数の項目を使用すると、1 つのリストを複数のサブリストに分割することができます。
Chop コマンドを実行すると、指定されたリストの長さに従ってリストが分割されます。List.Chop ノードは、データ構造を削除するのではなく新しいデータ層をデータ構造に追加するなど、いくつかの点で List.Flatten ノードとは逆の動作を行います。List.Chop ノードは、次の例のようなジオメトリに関する操作を実行する場合に便利です。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
List.Map ノードと List.Combine ノードは、階層内の 1 段階下の層で、設定された関数を入力リストに適用します。リストの組み合わせとリストのマップはほとんど同じ操作ですが、組み合わせの場合は、特定の関数の入力に対応する複数の入力を使用できる点が、マップとは異なっています。
簡単な例として、前のセクションで説明した List.Count ノードをもう一度確認してみましょう。
List.Count ノードは、リスト内のすべての項目をカウントします。ここでは、List.Count ノードを使用して、List.Map ノードの仕組みについて説明します。
Code Block ノードで、次の 2 行を挿入します。
-50..50..#Nx; -50..50..#Ny;
このコードを入力すると、Code Block ノードに Nx と Ny という 2 つの入力が作成されます。
2 つの Integer Slider ノードを使用して Nx の値と Ny の値を Code Block ノードに接続すると、これらの値が定義されます。
次に、Code Block ノードの各行を Point.ByCoordinates ノードの x 入力と y 入力に接続します。このノードを右クリックして「レーシング」と「外積」を続けて選択します。この操作により、点のグリッドが作成されます。-50 から 50 までの範囲が定義されているため、ここでは既定の Dynamo グリッド全体を使用しています。
Watch ノードに、作成された点が表示されます。データ構造を確認すると、リストのリストが作成されていることがわかります。それぞれのリストが、グリッドの点の 1 行を表しています。
前の手順の Watch ノードの出力に List.Count ノードを接続します。
Watch ノードを List.Count ノードの出力に接続します。
List.Count ノードによって 5 という値が生成されていることに注意してください。これは、Code Block ノードで定義されている「Nx」変数と同じ値です。こうなる理由は次のとおりです。
まず、Point.ByCoordinates ノードは、リストを作成するための主要な入力として「x」入力を使用します。Nx の値が 5 で Ny の値が 3 の場合、3 つの項目を持つ 5 つのリストが含まれた 1 つのリストが作成されます。
Dynamo は、リストをオブジェクトとして処理するため、List.Count ノードは、階層内のメインのリストに適用されます。その結果、メインのリストに含まれているリストの数である 5 という値が生成されることになります。
List.Map ノードを使用して、階層内の 1 段階下の層で「関数」を実行します。
List.Count ノードには入力がないことに注意してください。List.Count ノードは関数として使用されるため、このノードは階層内の 1 段階下の層にあるすべてのリストに適用されます。List.Count ノードの空の入力は、List.Map ノードの list 入力に対応しています。
List.Count ノードにより、5 つの項目を持つリストが 1 つ作成されます。それぞれの項目の値は 3 になります。この値は、各サブリストの長さを表しています。
この演習では、List.Combine ノードを使用して、個別のオブジェクト リストに関数を適用する方法を説明します。
最初に、2 つの点のリストを設定します。
Sequence ノードを使用して 10 の値を生成し、各値に 10 のステップ増分を指定します。
結果を Point.ByCoordinates ノードの x 入力に接続します。これにより、Dynamo で点のリストが作成されます。
2 番目の Point.ByCoordinates ノードをワークスペースに追加し、x 入力として同じ Sequence 出力を使用し、y 入力として Integer Slider を使用し、その値を 31 (1 番目の点のセットと重ならない限り任意の値)に設定して、2 つの点のセットがお互いに重ならないようにします。
次に、List.Combine ノードを使用して、2 つの異なるリスト内のオブジェクトに関数を適用します。この場合、単純な線描画関数になります。
ワークスペースに List.Combine ノードを追加し、2 つの点のセットを list0 と list1 入力として接続します。
List.Combine ノードの入力関数として Line.ByStartPointEndPoint ノードを使用します。
完了すると、2 つの点のセットが Line.ByStartPointEndPoint 関数を介して一緒に圧縮またはペアリングされ、Dynamo で 10 行が返されます。
List.Combine の別の使用例については、N 次元のリストの演習を参照してください。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
List.Map ではなく List@Level 機能を使用すると、ノードの入力ポートに使用するリストのレベルを直接選択することができます。この機能は、入力ポートに指定されたあらゆる入力値に使用できます。使用すると、もっともすばやく簡単にリストのレベルにアクセスすることができます。ノードの入力として使用するリストのレベルを指定するだけで、後はすべてをノードに任せることができます。
この演習では、List@Level 機能を使用して特定のデータ レベルを分離してみましょう。
点によって構成される単純な 3D グリッドから始めることにします。
X、Y、Z に Range ノードを接続することでグリッドが構成されています。したがって、データの構造は X リスト、Y リスト、Z リストの 3 層から成ることがわかります。
これらの層は、異なるレベルに存在します。レベルは、プレビュー バルーンの下に表示されます。リスト レベルの列はリスト データに対応しています。ここで、作業中のレベルを確認することができます。
リスト レベルは逆順で階層化されているので、最低レベルのデータは常に「L1」にあります。これにより、上流で何かが変更されたとしても、グラフを意図したとおりに動作させることができます。
List@Level 機能を使用するには、[>]をクリックします。このメニュー内部では、2 つのチェックボックスが表示されます。
レベルを使用 - このオプションをオンにすると、List@Level の機能が有効になります。このオプションをクリックした後で、ノードで使用する入力リスト レベルをすべてクリックして選択することができます。このメニューで上矢印か下矢印をクリックすることにより、さまざまなレベル オプションを試すことができます。
リスト構造を保持 - オンにしていると、その入力のレベル構造を保持することができます。意図的にデータを複数のサブリストに整理している場合は、このオプションをオンにしておくと、いかなる情報も失わずにリスト構造をそのまま保持しておくことができます。
リスト レベル全体を切り替えることにより、単純な 3D グリッド上でリスト構造を視覚的に確認することができます。リスト レベルとインデックスの組み合わせを変更すると、元の 3D セットとは異なる点のセットが返されます。
DesignScript で「@L2」を選択すると、レベル 2 のリストのみを選択することができます。index に 0 が入力されているとき、レベル 2 のリストには Y を 0 とする点のセットのみが含まれているので、XZ のグリッド面のみが返されます。
レベル フィルタを「@L1」に変更すると、リスト レベル 1 に含まれるすべての点を確認することができます。index に 0 が入力されているとき、レベル 1 のリストにはフラット リストの 3D ポイントがすべて含まれています。
同様に「@L3」に変更すると、リスト レベル 3 の点のみが表示されます。index に 0 が入力されているとき、レベル 3 のリストには Z を 0 とする点のセットのみが含まれているので、XY のグリッド面のみが返されます。
同様に「@L4」に変更すると、リスト レベル 4 の点のみが表示されます。index に 0 が入力されているとき、レベル 4 のリストには X を 0 とする点のセットのみが含まれているので、YZ のグリッド面のみが返されます。
今回の例は List.Map でも作成できますが、List@Level を使用すると、動作を単純化して簡単にノード データにアクセスできるようになります。次に List.Map と List@Level の比較をご覧ください。
どちらの方法でも同じ点にアクセスすることができますが、List@Level を使用するとたった 1 個のノードだけでデータのレイヤを簡単に切り替えることができます。
List.Map を使用して点構成のグリッドにアクセスするには、List.Map の隣に List.GetItemAtIndex ノードを配置する必要があります。レベルの階層を下りていくたびに、List.Map ノードを追加していく必要があります。リストが複雑になればなるほど、目的の情報レベルにアクセスするには、多数の List.Map ノードをグラフに追加しなければなりません。
この例では、List.GetItemAtIndex ノードを List.Map ノードに接続することにより、List.GetItemAtIndex で「@L3」を選択したときと同じリスト構造を持つ同じ点のセットを取得しています。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
転置は、リストのリストを操作する場合の基本的な機能です。転置を実行すると、スプレッドシート プログラムの場合と同様に、データ構造内の列と行の位置が反転します。次の基本的な行列を使用して、転置の仕組みを説明します。また、次のセクションでは、転置機能を使用して幾何学的な関係を作成する方法について説明します。
最初に、前の演習で使用した List.Count ノードを削除して別のジオメトリに移動し、データ構造がどのようになっているかを確認します。
Point.ByCoordinates ノードから続く Watch ノードの出力に、PolyCurve.ByPoints ノードを接続します。
出力として 5 つのポリカーブが作成され、Dynamo のプレビューにそれらのポリカーブが表示されます。Dynamo ノードは点のリスト(この場合は、点のリストのリスト)を検索し、そのリストから 1 つのポリカーブを作成します。原則として、各リストはデータ構造内で曲線に変換されます。
List.Transpose ノードは、すべての項目をメイン リスト内のすべてのリストと切り替えます。この動作は少し複雑に感じるかもしれませんが、データ構造内の列と行を入れ替える Microsoft Excel と同じ仕組みです。
転置により、リストの構造が変更されていることを確認します。転置前は 3 つの項目を持つ 5 つのリストだったのに対して、転置後は 5 つの項目を持つ 3 つのリストに変わっています。
PolyCurve.ByPoints ノードにより、元の曲線に対して垂直方向に 3 つのポリカーブが作成されます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
この演習では、前の演習で作成したロジックを使用してサーフェスを編集します。この演習の目的は直感的な操作を行うことですが、データ構造のナビゲーションは少し複雑な操作です。ここでは、制御点を移動することにより、サーフェスの編集を行います。
最初に、上図の各ノードの文字列を操作します。既定の Dynamo グリッド全体にわたる基本的なサーフェスを作成します。
Code Block ノードを使用して次の 2 つのコード行を入力し、Surface.PointAtParameter ノードの u 入力と v 入力にそれぞれのコード行を接続します(
-50..50..#3;
と-50..50..#5;
)。Surface.PointAtParameter ノードのレーシングを「外積」に設定します。
Watch ノードに、5 つの項目を持つ 3 つのリストが含まれた 1 つのリストが表示されます。
この演習では、作成したグリッドの中心点のクエリーを実行します。これを行うには、中央のリストの中心点を選択します。
正しい点を選択するには、Watch ノードの各項目をクリックして、正しい点が選択されているかどうかを確認します。
Code Block ノードを使用して、リストのリストをクエリーするための基礎となるコード行を次の形式で指定します。
points[1][2];
Geometry.Translate ノードを使用して、選択した点を Z の正の向きに 20 単位移動します。
List.GetItemAtIndex ノードを使用して、点の中央の行を選択します。前の手順と同様に、Code Block ノードで
points[1];
というコード行を指定してクエリーを実行することもできます。
ここまでの手順で、中心点のクエリーを実行し、中心点を上方向に移動しました。ここでは、この中心点を元のデータ構造に戻します。
最初に、前の手順で分離したリストの項目を置き換えます。
List.ReplaceItemAtIndex ノードで「2」というインデックス値を使用し、置き換える項目を対象となる点(Geometry.Translate ノードの Geometry 出力)に接続して、中心点を置き換えます。
対象の点がリストの中央の項目に入力されたことが出力として表示されます。
ここでは、前の演習で変更したリストを、元のデータ構造であるリストのリストに戻します。
前の演習と同様に、List.ReplaceItemAtIndex ノードを使用して、中央のリストを変更したリストで置き換えます。
これら 2 つのノードのインデックスを定義する Code Block ノードの値は、それぞれ 1 と 2 であることに注意してください。これらの値は、Code Block ノードで指定した元のクエリー(points[1][2])に対応しています。
インデックス 1 の位置でリストを選択すると、Dynamo のプレビューでデータ構造がハイライト表示されます。これで、対象の点が元のデータ構造に正しく移動されたことになります。
上図の点のセットからサーフェスを作成する方法はいくつかあります。ここでは、複数の曲線をまとめてロフトしてサーフェスを作成してみましょう。
NurbsCurve.ByPoints ノードを作成し、新しいデータ構造を接続して、3 つの NURBS 曲線を作成します。
Surface.ByLoft ノードを NurbsCurve.ByPoints ノードの出力に接続します。これで、サーフェスが変更されました。ジオメトリの元の Z 値を変更することができます。この値を変更して、ジオメトリがどのように変化するかを確認してください。
ここでは、データ階層にさらに層を追加して、より高度なリストの操作方法について見ていきます。データ構造を拡張して、2 次元を超える多次元のリストのリストを作成することができます。Dynamo のリストは項目として処理されるため、必要な数の次元を持つデータを作成することができます。
多次元のリストの構造は、ロシアのマトリョーシカ人形に似ています。各リストは、複数の項目を格納するコンテナとして考えることができます。各リストには独自のプロパティが存在し、それぞれのリストは独自のオブジェクトとして見なされます。
ロシアのマトリョーシカ人形(写真: )は、N 次元のリストの構造に似ています。それぞれの層が 1 つのリストを表し、各リスト内に項目が格納されています。Dynamo では、1 つのリストに複数のリストを格納することができます。この場合、格納されているそれぞれのリストが、格納元のリストの項目になります。
N 次元のリストを視覚的に説明するのは難しいため、この章ではいくつかの演習を使用して、2 次元を超える多次元のリストを操作する方法について見ていきます。
Dynamo のデータ管理において最も複雑な概念はマッピングですが、複雑なリスト階層を操作する場合は特に、マッピングが重要になります。この章の演習では、多次元のデータを操作する際に、どのようなケースでマッピングと組み合わせ機能を使用するかについて説明します。
List.Map ノードと List.Combine ノードの概要については、前の章で説明しました。この章の最後の演習でこれらのノードを使用して、複雑なデータ構造の操作を行います。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
この章では、読み込んだジオメトリを操作するための演習を 3 つ見ていきます。この演習はその最初の演習です。演習を進めていくにつれて、より複雑なデータ構造を扱います。
最初に、演習ファイル フォルダ内の .sat ファイルを使用します。このファイルを取得するには、File Path ノードを使用します。
Geometry.ImportFromSAT ノードを使用すると、ジオメトリが 2 つのサーフェスとして Dynamo のプレビューに読み込まれます。
説明を簡単にするため、この演習では 1 つのサーフェスだけを使用します。
インデックス値として 1 を選択して、上部のサーフェスをグラブします。これを行うには、List.GetItemAtIndex ノードを使用します。
Geometry.ImportFromSAT プレビューのジオメトリ プレビューをオフにします。
次に、グラブしたサーフェスを点のグリッドに分割します。
1.Code Block ノードを使用して、次の 2 つのコード行を入力します。
0..1..#10;
0..1..#5;
2.2 つの Code Block 値を、Surface.PointAtParameter ノードの u 入力と v 入力に接続します。次に、このノードの_レーシング_を「外積」に変更します。
3.出力としてデータ構造が表示されます。このデータ構造は、Dynamo のプレビューで表示することもできます。
次に、最後のステップの点を使用して、サーフェスに沿って 10 個のカーブを生成します。
NurbsCurve.ByPoints ノードを Surface.PointAtParameter ノードの出力に接続して、データ構造の内容を確認します。
List.GetItemAtIndex ノードのプレビューをオフにすると、結果が明確になります。
基本的な List.Transpose ノードにより、リストのリストの列と行が反転します。
List.Transpose ノードの出力を NurbsCurve.ByPoints ノードに接続すると、サーフェスに沿って水平方向に 5 本の曲線が作成されます。
前のステップで NurbsCurve.ByPoints ノードのプレビューをオフにしていると、イメージで同じ結果が得られます。
この演習では、少し複雑な操作を実行してみましょう。ここでは、前の演習で作成した曲線に対して操作を実行します。具体的には、これらの曲線を別のサーフェスに関連付けて、2 つのサーフェス間で曲線をロフトします。この操作を実行する場合、データ構造の処理が少し複雑になりますが、基本的な考え方はこれまでと同じです。
最初に、List.GetItemAtIndex ノードを使用して、前の演習で読み込んだジオメトリの上部サーフェスを分離します。
Surface.Offset ノードで 10 という値を指定して、サーフェスをオフセットします。
前の演習と同様に、Code Block ノードで次の 2 つのコード行を入力します。
0..1..#10;
0..1..#5;
上記のコード行を 2 つの Surface.PointAtParameter ノードに接続し、各ノードの レーシング を「外積」に設定します。いずれか一方のノードが元のサーフェスに接続され、もう一方のノードがオフセットされたサーフェスに接続されます。
これらのサーフェスのプレビューをオフにします。
前の演習と同様に、Surface.PointAtParameter ノードの出力を 2 つの NurbsCurve.ByPoints ノードに接続します。結果は、2 つのサーフェスに対応するカーブを示します。
List.Create ノードを使用して、2 組の曲線を 1 つのリストのリストに結合します。
10 個の項目を持つ 2 つのリストが出力として表示されます。各リストが、NURBS 曲線の各接続セットを表しています。
Surface.ByLoft ノードを実行すると、このデータ構造を視覚的に理解することができます。このノードは、各サブリスト内のすべての曲線をロフトします。
前のステップで Surface.ByLoft ノードのプレビューをオフにします。
List.Transpose ノードを使用すると、リスト内のすべての列と行が反転します。このノードにより、10 本の曲線を持つ 2 つのリストが、2 本の曲線を持つ 10 個のリストに変換されます。また、各 NURBS 曲線が、もう一方のサーフェスの隣接する曲線に関連付けられます。
Surface.ByLoft ノードを使用して、リブ形状の構造物を作成します。
次に、この結果を得るための別のプロセスを説明します。
開始する前に、前のステップで Surface.ByLoft プレビューをオフにして、混乱を避けます。
ここでは、List.Transpose ノードの代わりに List.Combine ノードを使用します。このノードは、各サブリスト上で「コンビネータ」を実行します。
この演習では、List.Create ノードを「コンビネータ」として使用します。これにより、サブリスト内の各項目のリストが作成されます。
Surface.ByLoft ノードを使用して、前の手順と同じサーフェスを取得します。この場合は List.Transpose ノードを使用した方が簡単ですが、さらに複雑なデータ構造を操作する場合は、List.Combine ノードを使用することをお勧めします。
リブ形状の構造物内の曲線の方向を切り替える場合は、手順をいくつか戻り、NurbsCurve.ByPoints ノードに接続する前に List.Transpose ノードを使用します。これにより、リスト内の列と行が反転し、水平方向のリブ形状が 5 つ作成されます。
ここからは、さらに高度な操作を実行してみましょう。この演習では、読み込んだ 2 つのサーフェスを両方とも使用して、複雑なデータ階層を作成します。ただし、基本的な考え方はこれまでと同じで、同じ操作を実行することになります。
最初に、前の演習で読み込んだファイルを使用します。
前の演習と同様に Surface.Offset ノードを使用し、サーフェスをオフセットする値として 10 を指定します。
オフセットされたノードによって 2 つのサーフェスが作成されたことが出力として表示されます。
前の演習と同様に、Code Block ノードで次の 2 つのコード行を入力します。
0..1..#20;
0..1..#20;
上記のコード行を 2 つの Surface.PointAtParameter ノードに接続し、各ノードのレーシングを 「外積」 に設定します。いずれか一方のノードが元のサーフェスに接続され、もう一方のノードがオフセットされたサーフェスに接続されます。
前の演習と同様に、Surface.PointAtParameter ノードの出力を 2 つの NurbsCurve.ByPoints ノードに接続します。
NurbsCurve.ByPoints ノードの出力を確認すると、この出力が 2 つのリストを持つリストであることがわかります。これは、前の演習で扱ったリストよりも複雑なデータ構造です。データは基礎となるサーフェスによって分類されるため、構造化されたデータに別の層を追加します。
Surface.PointAtParameter ノードでは、データ構造がさらに複雑になっていることがわかります。このノードでは、「リストのリストのリスト」が作成されます。
続行する前に、既存のサーフェスのプレビューをオフにします。
List.Create ノードを使用して、NURBS 曲線を 1 つのデータ構造にマージします。これにより、「リストのリストのリスト」が作成されます。
Surface.ByLoft ノードを接続すると、元のサーフェスが取得されます。これは、元のデータ構造から作成された独自のリスト内にサーフェスがそのまま残っているためです。
前の演習では、List.Transpose ノードを使用してリブ形状の構造物を作成しましたが、ここでは同じ操作を行うことはできません。List.Transpose ノードを使用できるのは 2 次元のリストの場合ですが、ここでは 3 次元のリストを操作するため、リスト内の列と行を反転する操作を簡単に実行することはできません。これまでに説明したように、リストはオブジェクトとして処理されるため、サブリストが含まれていないリストを List.Transpose ノードを使用して反転することはできますが、階層内の 1 段階下の層でリストの NURBS 曲線を反転することはできません。
ここでは、List.Combine ノードを使用します。さらに複雑なデータ構造を処理する場合は、List.Map ノードと List.Combine ノードを使用します。
List.Create ノードを「コンビネータ」として使用して、この操作に適したデータ構造を作成します。
階層内の 1 段階下の層で、データ構造を転置する必要があります。これを行うには、List.Map ノードを使用します。このノードは List.Combine ノードに似ていますが、複数の入力リストではなく 1 つの入力リストだけを使用する点が異なっています。
List.Map ノードに List.Transpose ノードを適用します。これにより、メイン リスト内のサブリストの列と行が反転します。
これで、適切なデータ階層を持つ NURBS 曲線をまとめてロフトし、リブ形状の構造物を作成できるようになりました。
図に示されている入力設定を持つ Surface.Thicken ノードを使用して、ジオメトリに深さを追加します。
この構造にサーフェスを追加して補強してみましょう。別の Surface.ByLoft ノードを追加し、前のステップの NurbsCurve.ByPoints ノードの最初の出力を入力として使用します。
プレビューが見にくくなってきたので、これらのノードのプレビューをオフにします。ノードを右クリックし、[プレビュー]のチェックを外して結果を見やすくします。
選択したサーフェスに厚みをつければ、操作は完了です。
これで、さまざまなデータを使用したロッキング チェアが完成しました。
最後に、ロッキング チェアの溝の方向を変えてみましょう。前の演習では転置用のノードを使用しましたが、ここでも同じような方法で操作を行います。
データ階層にもう 1 つ深い層があるため、List.Map ノードと List.Tranpose 関数を使用して Nurbs の曲線方向を変更します。
Code Block ノードのコード行を次のように変更して、溝の数を増やします。
0..1..#20;``0..1..#30;
最初に作成したロッキング チェアは滑らかな形状でしたが、このロッキング チェアはまったく異なる形状になりました。
ディクショナリは、キーと呼ばれる別のデータと関連付けられているデータの集まりです。ディクショナリでは、データを検索、削除、および挿入する機能が公開されています。
基本的には、ディクショナリを非常にスマートな検索手段と考えることができます。
ディクショナリの機能はこれまで Dynamo 内で利用可能でしたが、Dynamo 2.0 では、このデータ タイプを管理する新しい方法を導入しました。
このセクションでは、プロのような独自のビジュアル プログラムを作成する際に役立つ、Dynamo ライブラリで使用できる基本ノードについて説明します。
: Dynamo のジオメトリ要素の仕組みを紹介します。プリミティブから単純な、または複雑なジオメトリを作成する複数の方法について説明します。
: データの定義と、プログラムで使用できる基本的なタイプを紹介します。また、設計ワークフローに数値演算と論理演算を組み込む方法についても学習します。
:データ構造を管理および調整する方法を紹介します。リストの概念の詳細を理解し、リストを使用して設計データを効率的に管理できるようにします。
: ディクショナリについて解説します。ディクショナリを使用して、既存の結果から特定のデータと値を検索する方法を確認してください。
アイコン | 名前/構文 | 入力 | 出力 |
---|---|---|---|
写真:
次に、このデータを検索するために使うキーを決定する必要があります。(キーに関する情報は、「」セクションを参照してください)。
写真:
注: この演習は前バージョンの Dynamo を使用して作成されました。 List.Map の機能に関する問題の大半は、 List@Level _機能の追加によって解決されました。詳細については、後述の _ を参照してください。
注: この演習は前バージョンの Dynamo を使用して作成されました。List.Combine の機能に関する問題の大半は、 List@Level 機能の追加によって解決されました。詳細については、後述の を参照してください。
Code Block では、「[]」という省略表記を使用してリストを定義します。この方法を使用すると、List.Create ノードを使用するよりも素早く柔軟にリストを作成することができます。Code Block の詳細は、「」を参照してください。次の図は、Code Block を使用して、複数の式を持つリストを作成する方法を示しています。
Code Block で「[]」という省略表記を使用すると、複雑なデータ構造で特定の項目をすばやく簡単に選択することができます。Code Block の詳細は、「で説明しています。次の図は、Code Block を使用して、複数のデータ タイプが存在するリストのクエリーを実行する方法を示しています。
オリジナル画像提供:
Object.IsNull
obj
bool
ARGB Color (Color.ByARGB)
A、R、G、B
color
アルファ(Color.Alpha)
color
A
赤(Color.Red)
color
R
緑(Color.Green)
color
G
青(Color.Blue)
color
B
コンポーネント(Color.Components)
color
A、R、G、B
色相(Color.Hue)
color
Hue
彩度(Color.Saturation)
color
Saturation
明るさ(Color.Brightness)
color
Brightness
加算(+)
var[]...[], var[]...[]
var[]...[]
減算(-)
var[]...[], var[]...[]
var[]...[]
乗算(*)
var[]...[], var[]...[]
var[]...[]
除算(/)
var[]...[], var[]...[]
var[]...[]
If (If)
test、true、false
結果
Formula (IF(x,y,z))
x、y、z
結果
Code Block ((x?y:z);)
x? y, z
結果