# 自訂

我們先前對編輯基本建築量體進行瞭解時，希望一次編輯大量元素，以更深入地探究 Dynamo/Revit 連結。大規模自訂變得更加複雜，因為資料結構需要更高級的清單作業。但是，此作業所遵循的基本原則在本質上並無不同。接下來針對一組自適應元件瞭解分析的某些因素。

### 點位置

假設我們已建立一系列自適應元件，希望根據其點位置來編輯參數。例如，點可以驅動與元素面積相關的厚度參數。或者，點可以驅動與全年日曬相關的不透明度參數。藉由 Dynamo，可以使用一些簡單的步驟將分析連接至參數，我們將在以下練習中探究基本版本。

!

> 使用 **AdaptiveComponent.Locations** 節點查詢所選自適應元件的自適應點。這可讓我們使用提取出的 Revit 元素進行分析。

透過萃取自適應元件的點位置，我們可以對該元素執行一系列分析。藉由四點自適應元件，您可以針對諸如指定面板等物件研究平面的偏差。

### 太陽方位分析

!

> 使用重新對映將一組資料對映到參數範圍。這是參數式模型中使用的基本工具，我們將在以下練習中展示該工具。

使用 Dynamo，自適應元件的點位置可用於建立每個元素的最佳擬合平面。我們也可以在 Revit 檔案中查詢日光位置，研究平面相對於日光的方位，並與其他自適應元件進行比較。在以下的練習中，我們將建立由演算法控制的屋頂，以設置該功能。

## 練習

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

此練習將詳細說明上一節中示範的技巧。在此案例中，我們將使用 Revit 元素定義參數式曲面，同時實體化四點自適應元件，然後根據太陽方位對其進行編輯。

!

> 1. 先選取兩條邊與\_「Select Edge」\_節點。兩條邊是中庭的長跨距。
> 2. 使用 *List.Create* 節點將兩條邊合併到一個清單中。
> 3. 使用 *Surface.ByLoft* 在兩條邊之間建立曲面。

!

> 1. 使用 *Code Block*，定義從 0 至 1 的範圍 (包含均勻分佈的 10 個值)：`0..1..#10;`
> 2. 將 *Code Block* 插入 *Surface.PointAtParameter* 節點的 *u* 與 *v* 輸入，並將 *Surface.ByLoft* 節點插入 *surface* 輸入。在節點上按一下右鍵，將 *交織* 變更為 *「笛卡兒積」*。這將在曲面上產生點的網格。

此點網格可作為以參數式方式定義之曲面的控制點。我們希望萃取其中每個點的 u 與 v 位置，以便能將其插入至參數式公式，並保留相同的資料結構。我們可以查詢剛剛建立點的參數位置，以執行此作業。

!

> 1. 在圖元區加入 *Surface.ParameterAtPoint* 節點，連接輸入，如上所示。
> 2. 使用 UV.U 節點查詢這些參數的 *u* 值。
> 3. 使用 UV.V 節點查詢這些參數的 *v* 值。
> 4. 輸出會顯示每個曲面點的對應 *u* 與 *v* 值。現在我們已取得所需範圍，每個值都介於 *0* 與 *1* 之間，並具有正確的資料結構，我們已準備好套用參數式演算法。

!

> 1. 在圖元區加入 *Code Block*，然後輸入程式碼：`Math.Sin(u*180)*Math.Sin(v*180)*w;`。這是一個參數式函數，可從平面建立正弦凸塊。
> 2. 將 *UV.U* 連接至 *u* 輸入，將 UV.V 連接至 *v* 輸入。
> 3. *w* 輸入表示形狀的 *幅度*，因此我們為其連接 *Number Slider*。

!

> 1. 現在，我們有一個由演算法定義的值清單。接下來使用此值清單在 *+Z* 方向將點上移。使用 *Geometry.Translate*，將 *Code Block* 插入 *zTranslation*，並將 *Surface.PointAtParameter* 插入 *geometry* 輸入。您應該會看到新的點顯示在 Dynamo 預覽中。
> 2. 最後，我們使用 *NurbsSurface.ByPoints* 節點建立曲面，將上一步驟中的節點插入 points 輸入。我們建立了自己的參數式曲面。自由拖曳滑棒，觀看凸塊的收縮與膨脹。

使用參數式曲面，我們要定義將其面板化的方式，以排列四點自適應元件。Dynamo 沒有即裝即用的曲面平板化功能，因此我們可以尋找社群是否有實用的 Dynamo 套件。

!

> 1. 移至 *「套件」>「搜尋套件...」*
> 2. 搜尋 *LunchBox*，並安裝 *LunchBox for Dynamo*。對於諸如此類的幾何圖形作業，這是非常有用的一組工具。

> 1. 下載之後，您現在可以完整存取 LunchBox 套件。搜尋 *Quad Grid*，然後選取 *LunchBox Quad Grid By Face*。將參數式曲面插入至 *surface* 輸入，並將 *U* 與 *V* 分割份數設定為 *15*。您在 Dynamo 預覽中應該會看到一個有四邊形平板的曲面。

> 如果您對其設置感到好奇，可以按兩下 *Lunch Box* 節點，並查看其內容。

> 返回 Revit，接下來快速查看我們將在這裡使用的自適應元件。無需沿其作業，但這是我們將要實體化的屋頂面板。它是四點自適應元件，是 ETFE 系統的粗略表示。中心空心的鎖點框與稱為 *ApertureRatio* 的參數有關。

> 1. 我們將在 Revit 中實體化大量幾何圖形，因此請確保將 Dynamo 求解器調整為 *「手動」*。
> 2. 在圖元區加入 *Family Types* 節點，然後選取 *「ROOF-PANEL-4PT」*。
> 3. 在圖元區加入 *AdaptiveComponent.ByPoints* 節點，將 *Panel Pts* 從 *LunchBox Quad Grid by Face* 輸出連接至 *points* 輸入。將 *Family Types* 節點連接至 *familySymbol* 輸入。
> 4. 按一下\_「執行」\_。建立幾何圖形時，Revit 需要\_考慮\_一段時間。若花費太長時間，請將 *Code Block 的「15」* 減少為較小的數字。這將減少屋頂上面板的數量。

*注意：若 Dynamo 花費很長時間來計算節點，您可能要在開發圖表時，使用「凍結」節點功能以暫停所執行的 Revit 作業。如需有關凍結節點的更多資訊，請參閱〈實體〉一章中的〈凍結〉一節。*

> 返回 Revit，我們已在屋頂上建立一系列面板。

> 拉近，我們可以更近地查看其曲面品質。

### 分析

> 1. 從上一步繼續執行，接下來更進一步，根據其日曬時間驅動每個面板的孔徑。拉近至 Revit，選取一個面板，可以看到在性質列中，有一個名為 *Aperture Ratio* 的參數。設置族群，讓孔徑的範圍大致介於 *0.05* 到 *0.45* 之間。

> 2. 如果打開太陽路徑，可以在 Revit 中看到目前的太陽位置。

> 3. 我們可以使用 *SunSettings.Current* 節點參考此太陽位置。

1. 將太陽設定插入 *Sunsetting.SunDirection* 以取得太陽向量。
2. 從用於建立自適應元件的 *Panel Pts* 中，使用 *Plane.ByBestFitThroughPoints* 近似元件的平面。
3. 查詢此平面的 *法向*。
4. 使用 *內積* 計算太陽方位。內積是一個決定兩個向量平行程度的公式。我們將取得每個自適應元件的平面法向，並與太陽向量進行比較，以粗略模擬太陽方位。
5. 採用結果的 *絕對值*。這可確保在平面法向指向相反方向時，內積是準確的。
6. 按一下\_「執行」\_。

> 1) 看看 *內積* ，我們產生了許多數字。我們希望使用其相對分佈，但需要將這些數字縮攏到我們想要編輯的 *Aperture Ratio* 參數的適當範圍內。

1. *Math.RemapRange* 是執行此作業的強大工具。它採用輸入清單，並將邊界重新對映到兩個目標值。
2. 在 *Code Block* 中，將目標值定義為 *0.15* 與 *0.45*。
3. 按一下\_「執行」\_。

> 1) 將重新對映的值連接至 *Element.SetParameterByName* 節點。

1. 將字串 *Aperture Ratio* 連接至 *parameterName* 輸入。
2. 將 *adaptive components* 連接至 *element* 輸入。
3. 按一下\_「執行」\_。

> 返回 Revit，透過距離，我們可以瞭解太陽方位對 ETFE 面板孔徑產生的影響。

> 拉近，我們可以看到在面向日光時，ETFE 面板更為封閉。此時我們的目標是減少日曬帶來的過熱。如果我們根據日曬而希望讓更多光線進入，只需在 *Math.RemapRange* 上切換範圍即可。
