# 資料

資料是程式的內容。它會通過線路向節點提供輸入，並在節點中經過處理變為新形式的輸出資料。接下來我們將檢閱資料的定義、構建方式，並開始在 Dynamo 中使用資料。

## 什麼是資料？

資料是一組定性或定量變數的值。資料最簡單的形式是數字，例如 `0`、`3.14` 或 `17`。但是資料也有許多不同類型：表示變動數字的變數 (`height`)、字元 (`myName`)、幾何圖形 (`Circle`)，或資料項目的清單 (`1,2,3,5,8,13,...`)。

在 Dynamo 中，我們將資料加入/饋入節點的輸入埠 - 我們可以有資料而不採取動作，但必須有資料才能處理節點所代表的動作。將節點加入工作區後，如果未提供任何輸入，則結果將是函數，而不是動作本身的結果。

\![資料與動作](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-cht/.gitbook/assets/data%20-%20what%20is%20data.jpg)

> 1. 簡單資料
> 2. 資料與動作 (節點) 已成功執行
> 3. 無資料輸入的動作 (節點) 將傳回一般函數

### 空值 - 沒有資料

注意空值 `'null'` 類型表示沒有資料。雖然這是抽象概念，但是您在使用視覺程式設計時可能已瞭解這一點。若某動作無法建立有效的結果，該節點會傳回空值。

測試空值及移除資料結構中的空值是建立功能強大的程式至關重要的構成部分。

| 圖示 | 名稱/語法         | 輸入  | 輸出 |
| -- | ------------- | --- | -- |
| !  | Object.IsNull | obj | 布林 |

### 資料結構

執行視覺程式設計時，會很快產生大量資料，需要對其階層採用某種管理方式。承擔此角色的是資料結構，即我們儲存資料所採用的組織配置。資料結構的詳細資料及使用方法視程式設計語言而不同。

在 Dynamo 中，我們透過清單將階層加入至資料。我們將在後續章節中深入探索這一功能，不過接下來先從簡單的內容開始：

清單代表一種資料結構中放置的一系列項目：

* 我的手 (*清單*) 有五根手指 (*項目*)。
* 我所在的街道 (*清單*) 有十棟房子 (*項目*)。

\![清單分解](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-cht/.gitbook/assets/data%20-%20data%20structures.jpg)

> 1. **Number Sequence** 節點使用 *start*、*amount* 及 *step* 輸入來定義數字清單。使用這些節點，我們已建立兩個包含十個數字的獨立清單，其中一個清單的範圍是 *100-109*，另一個的範圍是 *0-9*。
> 2. **List.GetItemAtIndex** 節點會以特定的索引選取清單中的項目。若選擇 *0*，即可取得清單中的第一個項目 (在此案例中是 *100*)。
> 3. 對第二個清單套用相同的程序，取得值 *0*，即清單中的第一個項目。
> 4. 現在，我們使用 **List.Create** 節點將兩個清單合二為一。請注意，節點會建立\_清單的清單\_。這會變更資料結構。
> 5. 再次使用 **List.GetItemAtIndex** 時，將索引設定為 *0*，即可取得清單之清單中的第一個清單。這意味著將清單視為項目，這與其他指令碼撰寫語言略有不同。在稍後的章節中，我們將透過清單操控與資料結構取得更進階的結果。

理解 Dynamo 中資料階層的關鍵概念：**對資料結構而言，會將清單視為項目**。換言之，Dynamo 採用由上而下的程序瞭解資料結構。這意味著什麼？接下來我們舉例說明。

## 練習：使用資料建立圓柱鏈

> 按一下下方的連結下載範例檔案。
>
> 附錄中提供完整的範例檔案清單。

{% file src="/files/L8Ug9Up10WnVtUwSLwtx" %}

在這第一個範例中，我們將組裝薄殼圓柱，這將使用我們在本節中討論的幾何圖形階層。

### 第 I 部分：使用一些可變參數為一個圓柱設定圖表。

1\. 加入 **Point.ByCoordinates -** 在圖元區加入節點後，我們會在 Dynamo 預覽格線的原點看到某個點。*x、y* 與 *z* 輸入的預設值是 *0.0*，給我們此位置的點。

!

2.**Plane.ByOriginNormal -** 幾何圖形階層的下一步是平面。有數種方式可以建構平面，我們將使用原點與法線作為輸入。原點是上一步驟中建立的點節點。

**Vector.ZAxis -** 這是 z 方向的單位化向量。請注意，沒有輸入，只有值為 \[0,0,1] 的向量。我們將此用作 **Plane.ByOriginNormal** 節點的 *normal* 輸入。這會在 Dynamo 預覽中產生矩形平面。

!

3.**Circle.ByPlaneRadius -** 接下來是階層，現在我們使用上一步驟中建立的平面來建立曲線。插入節點後，我們得到一個位於原點的圓。節點的預設半徑值為 *1*。

!

4.**Curve.Extrude -** 現在我們指定深度與第三個延伸方向，讓其成為比較常見的形狀。此節點將以擠出方式根據曲線建立曲面。節點上的預設距離為 *1*，我們應該會在視埠中看到圓柱。

!

5.**Surface.Thicken -** - 此節點會將曲面偏移指定的距離並封閉外形，以產生封閉實體。預設厚度值為 *1*，我們應該會在視埠中看到符合這些值的薄殼圓柱。

!

6.**Number Slider -** 我們接下來不使用所有這些輸入的預設值，而是對模型加入一些參數式控制。

**Domain Edit -** 在圖元區加入數字滑棒後，按一下左上方的脫字字元以顯示範圍選項。

**Min/Max/Step -** 分別將 *min*、*max* 與 *step* 值變更為 *0*、*2* 與 *0.01*。我們這樣做是為了控制整體幾何圖形的大小。

!

7.**Number Sliders -** 在所有的預設輸入中，我們多次複製並貼上此數字滑棒 (選取滑棒，按一下 Ctrl+C，然後按一下 Ctrl+V)，直到具有預設值的所有輸入都改用滑棒為止。某些滑棒值必須大於零，以便讓定義生效 (例如：若要增厚曲面，需要有擠出深度)。

!

!

8.現在我們已使用這些滑棒建立參數式薄殼圓柱。嘗試調整其中某些參數，即可在 Dynamo 視埠中看到幾何圖形的動態更新。

!

**Number Sliders -** 在此基礎上更進一步，我們在圖元區上加入了許多滑棒，並需要清理剛剛建立的工具介面。在滑棒上按一下右鍵，選取「更名...」，然後變更每個滑棒的名稱以適當描述其參數 (厚度、半徑、高度等等)。

!

### 第 II 部分：從第 I 部分填入圓柱陣列

9.現在，我們已建立良好的增厚圓柱。這目前只是一個物件，接下來我們瞭解如何建立保持動態連結的一系列圓柱。為了實現這一點，我們將建立圓柱清單，而不是使用單一項目。

**加 (+) -** 我們的目標是在已建立的圓柱旁，加入一列圓柱。若要在與目前圓柱相鄰的位置加入一個圓柱，需要考慮圓柱的半徑以及薄殼的厚度。我們將滑棒的兩個值相加，即可得到此數值。

!

10.此步驟較複雜，接下來我們慢慢完成：最終目標是建立數字清單，這些數字會定義圓柱列中每個圓柱的位置。

!

> a.**乘 -** 首先，我們要將上一步驟中的值乘以 2。上一步驟中的值表示半徑，我們要將圓柱移動完整直徑的距離。
>
> b.**Number Sequence -** 我們使用此節點建立一系列數字。*乘* 節點的第一個輸入是上一步驟中的 *step* 值。可以使用 *Number* 節點將 *start* 值設定為 *0.0*。
>
> c.**Integer Slider** - 對於 *amount* 值，我們連接整數滑棒。這會定義所建立圓柱的數量。
>
> d.**輸出** - 此清單會顯示每個圓柱在陣列中的移動距離，並由原始滑棒進行參數式驅動。

11.此步驟足夠簡單 - 將上一步驟中定義的序列插入原始 **Point.ByCoordinates** 的 *x* 輸入。這將取代我們可以刪除的 *pointX* 滑棒。現在，我們將在視埠中看到一系列圓柱 (請確保整數滑棒大於 0)。

!

12. 圓柱鏈仍動態連結至所有滑棒。調整每個滑棒可以查看定義更新！

!


---

# 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/zh-tw/5_essential_nodes_and_concepts/5-3_the-building-blocks-of-programs/1-data.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.
