# カスタム ノードを作成する

Dynamo では、いくつかの方法でカスタム ノードを作成することができます。最初からカスタム ノードを作成することも、既存のグラフから作成することも、C# を使用して明示的に作成することもできます。このセクションでは、既存のグラフを使用して Dynamo UI 内にカスタム ノードを作成する方法について説明します。ワークスペースを整理し、一連のノードをパッケージ化して別の場所で再利用する場合は、この方法が最適です。

## 演習: UV マッピング用のカスタム ノード

### パート I: グラフから開始する

次の図は、UV 座標を使用して、1 つのサーフェスから別のサーフェスに点をマッピングする場合の例を示しています。この概念を適用して、XY 平面上の曲線を参照する、複数の小さなパネルから構成されるサーフェスを作成してみましょう。ここでは、パネル化用の四角形のパネルを作成しますが、同じ概念を適用して、UV マッピングを使用する多様なパネルを作成することもできます。この演習を行うと、このグラフや Dynamo の別のワークフローで同様のプロセスを簡単に繰り返すことができるようになるため、カスタム ノード開発のよい練習になります。

!

> 下のリンクをクリックして、サンプル ファイルをダウンロードします。
>
> すべてのサンプル ファイルの一覧については、付録を参照してください。

最初に、カスタム ノード内にネストするグラフを作成します。この例では、UV 座標を使用して、基準となるサーフェスから目的のサーフェスにポリゴンをマッピングするグラフを作成します。この UV マッピング プロセスは頻繁に使用するプロセスであるため、カスタム ノードの演習素材として適しています。サーフェスと UV 空間の詳細については、「[サーフェス](/ja/5_essential_nodes_and_concepts/5-2_geometry-for-computational-design/5-surfaces.md)」ページを参照してください。完全なグラフは、上記でダウンロードした .zip ファイルの *UVmapping\_Custom-Node.dyn* になります。

!

> 1. **Code Block:** この行を使用して、-45 ～ 45 `45..45..#10;` の範囲の 10 個の数値を作成します。
> 2. **Point.ByCoordinates:** **Code Block** ノードの出力を x 入力と y 入力に接続し、\[レーシング]を\[外積]に設定します。これで、点のグリッドが作成されます。
> 3. **Plane.ByOriginNormal:** *Point* 出力を *origin* 入力に接続して、各点に平面を作成します。この操作では、既定の法線ベクトル(0,0,1)が使用されます。
> 4. **Rectangle.ByWidthLength:** 前の手順で作成した平面を *plane* 入力に接続し、値 *10* の **Code Block** ノードを使用して幅と長さを指定します。

これで、長方形のグリッドが作成されます。UV 座標を使用して、これらの長方形を目的のサーフェスにマッピングします。

!

> 1. **Polygon.Points:** 前の手順の **Rectangle.ByWidthLength** 出力を *polygon* 入力に接続し、各長方形の頂点を抽出します。これらの点を、目的のサーフェスにマッピングします。
> 2. **Rectangle.ByWidthLength:** 値 *100* で **Code Block** ノードを使用して、長方形の幅と長さを指定します。これが、基準サーフェスの境界線になります。
> 3. **Surface.ByPatch:** 前の手順の **Rectangle.ByWidthLength** 出力を *closedCurve* 入力に接続し、基準となるサーフェスを作成します。
> 4. **Surface.UVParameterAtPoint:** **Polygon.Points** ノードの *Point* 出力と **Surface.ByPatch** ノードの *Surface* 出力を接続して、各点で UV パラメータを返します。

これで、基準となるサーフェスと UV 座標のセットが作成されました。次に、目的のサーフェスを読み込み、2 つのサーフェス間で点をマッピングします。

!

> 1. **File Path:** 読み込むサーフェスのファイル パスを選択します。ファイル タイプは .sat にしてください。\[*参照...*]ボタンをクリックして、上でダウンロードした .zip ファイルの *UVmapping\_srf.sat* にナビゲートします。
> 2. **Geometry.ImportFromSAT:** ファイル パスを接続して、サーフェスを読み込みます。読み込んだサーフェスがジオメトリのプレビューに表示されます。
> 3. **UV:** UV パラメータ出力を *UV.U* ノードと *UV.V* ノードに接続します。
> 4. **Surface.PointAtParameter:** 読み込んだサーフェス、U 座標、V 座標を接続します。これで、目的のサーフェス上に 3D の点のグリッドが表示されます。

最後に、3D の点を使用して長方形のサーフェス パッチを作成します。

!

> 1. **PolyCurve.ByPoints:** サーフェス上の点群を接続し、その点群からポリカーブを作成します。
> 2. **Boolean:** **Boolean** ノードをワークスペースに追加して *connectLastToFirst* 入力に接続し、値を True に切り替えてポリカーブを閉じます。これで、サーフェスに長方形がマッピングされて表示されます。
> 3. **Surface.ByPatch:** ポリカーブを *closedCurve* 入力に接続し、サーフェス パッチを作成します。

### パート II: グラフからカスタム ノードへ

次に、ノードの入力と出力を考慮しながら、カスタム ノード内にネストするノードを選択します。長方形以外の任意のポリゴンをマッピングできるように、カスタム ノードの柔軟性を可能な限り高めてみましょう。

次のノード(Polygon.Points から始まる)を選択し、ワークスペースを右クリックして\[カスタム ノードを作成]を選択します。

!

\[カスタム ノード プロパティ]ダイアログボックスで、カスタム ノードに名前、説明、カテゴリを割り当てます。

!

> 1. 名前: MapPolygonsToSurface
> 2. 説明: 基準点からターゲット サーフェスにポリゴンをマッピングします
> 3. アドオン カテゴリ: Geometry.Curve

カスタム ノードにより、ワークスペースが見やすくなりました。入力と出力には、元のノードに基づいて名前が付いています。カスタム ノードを編集して、これらの名前をもっとわかりやすい名前に変更しましょう。

!

編集するカスタム ノードをダブルクリックします。ワークスペースの背景色が黄色で表示されます。これは、カスタム ノードの内部を表しています。

!

> 1. 各 **Input** ノードの入力名を *baseSurface* と *targetSurface* に変更します。
> 2. マッピングするポリゴン用に **Output** ノードを追加します。

カスタム ノードを保存し、ホーム ワークスペースに戻ります。**MapPolygonsToSurface** ノードに変更内容が反映されます。

!

**カスタム コメント**を追加して、カスタム ノードの内容をさらにわかりやすくすることもできます。コメントを入力すると、入力タイプと出力タイプの内容だけでなく、ノードの機能を説明することができます。カスタム ノードの入力や出力にカーソルを置くと、コメントが表示されます。

編集するカスタム ノードをダブルクリックします。背景が黄色のワークスペースがもう一度表示されます。

!

> 1. Input の **Code Block** ノードの編集を開始します。コメントを入力する場合は、最初に「//」を入力してから、コメント テキストを入力します。ノードの内容を説明するためのコメントを入力してください。ここでは、*targetSurface* ノードの説明を入力します。
> 2. 特定の値に一致する入力タイプを設定して、*inputSurface* ノードの既定値を設定します。ここでは、既定値を元の **Surface.ByPatch** のセットに設定します。

コメントは、Output に適用することもできます。

!

> Output の Code Block ノードのテキストを編集します。「//」の後ろにコメント テキストを入力します。ここでは、*Polygons* と *surfacePatches* の Output の詳細な説明を追加します。

!

> 1. カスタム ノード入力にカーソルを置いてコメントを表示します。
> 2. *inputSurface* ノードの既定値が設定されているため、Surface 入力を使用することなく定義を実行することができます。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://primer2.dynamobim.org/ja/6_custom_nodes_and_packages/6-1_custom-nodes/2-creating.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
