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...
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...
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...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Dynamo 的使用者介面 (UI) 分為五個主要區域。我們在此將簡要概述,並在以下幾節進一步說明工作區和資源庫。
功能表
工具列
資源庫
工作區
執行列
以下是 Dynamo 應用程式的基本功能功能表。與大多數 Windows 軟體一樣,前兩個功能表與管理檔案、選取作業和編輯內容相關。其餘的功能表包含 Dynamo 更具體的功能。
在 Dynamo 下拉式功能表上可以找到一般資訊和設定。
關於 - 瞭解您電腦上安裝的 Dynamo 版本。
收集使用狀況資料的合約 - 這可讓您選擇是否分享您的使用者資料來改善 Dynamo。
偏好 - 包括各項設定,例如定義應用程式的小數點精確度和幾何圖形彩現品質。
結束 Dynamo
如果您遇到問題,請查閱 「說明」 功能表。您可以透過網際網路瀏覽器存取其中一個 Dynamo 參考網站。
開始使用 - 使用 Dynamo 的簡要介紹。
互動式指南 -
範例 - 參考範例檔案。
Dynamo 字典 - 所有節點上具備文件的資源。
Dynamo 網站 - 在 GitHub 上檢視 Dynamo 專案。
Dynamo 專案 Wiki - 造訪 Wiki,以學習使用 Dynamo API 進行開發,支援資源庫與工具。
顯示開始頁面 - 返回至文件中的 Dynamo 開始頁面。
報告錯誤 - 在 Github 開啟問題。
Dynamo 的工具列包含一系列按鈕,可快速存取以使用檔案及退回 [Ctrl + Z] 與重做 [Ctrl + Y] 指令。最右側是另一個按鈕,可以匯出工作區的快照,這對於製作文件及分享非常有用。
Dynamo 資源庫是一個功能資源庫的集合,每個資源庫都包含依品類分組的節點。它包含在 Dynamo 預設安裝期間加入的基本資源庫,隨著我們繼續介紹用法,我們將示範如何使用自訂節點和其他套件來延伸基本功能。資源庫一節將涵蓋使用資源庫更詳細的指導。
「工作區」是我們建構視覺程式的位置,您也可以變更其「預覽」設定,以從此處檢視 3D 幾何圖形。請參閱工作區,以取得更多詳細資料。
從此處執行 Dynamo 腳本。按一下「執行」按鈕上的下拉式圖示,可在不同模式之間進行變更。
自動:自動執行腳本。變更會即時更新。
手動:只在按一下「執行」按鈕時才執行腳本。在變更複雜繁重的腳本時,此功能非常有用。
周期性:此選項預設會灰顯。只有在使用 DateTime.Now 節點時才能使用。您可以將圖表設定為以指定間隔自動執行。
新建 - 建立新的 .dyn 檔案
開啟 - 開啟既有的 .dyn (工作區) 或 .dyf (自訂節點) 檔案
儲存/另存新檔 - 儲存使用中的 .dyn 或 .dyf 檔案
退回 - 退回上一個動作
重做 - 重做下一個動作
匯出工作區做為影像 - 將可見工作區匯出為 PNG 檔案
Dynamo 最初作為 Revit 中「建築資訊模型」的附加程式提供,現已成熟演變為許多產品。最重要的是,它是一個平台,支援設計人員探索視覺程式設計、解決問題以及製作自己的工具。我們透過設定一些環境 (這是什麼以及如何使用它?) 來開始我們的 Dynamo 旅程
Dynamo 是一種視覺程式設計應用程式,可以獨立的「沙箱」模式,或以其他軟體 (例如 Revit、FormIt 或 Civil 3D) 的外掛程式下載並執行。
Dynamo 能讓我們在視覺程式設計流程中工作,在此流程中,我們將多個元素連接在一起以定義關係,和組成自訂演算法的動作序列。我們可以將演算法用於一系列廣泛的應用程式,從處理資料到產生幾何圖形,所有動作都是即時動作而不需要編寫 code
。
節點和線路是 Dynamo 中支援視覺程式設計流程的關鍵元件。它有助於在設計的零件之間建立牢固的視覺和系統關係。在開發和最佳化設計工作流程時,只需按一下滑鼠即可輕鬆連接節點。
Dynamo 可對專案工作流程使用視覺程式設計以及開發自訂工具,可整合各種令人興奮的應用程式的各個面向。
Dynamo 是一種適用於設計人員的開放原始碼視覺程式設計平台。
您剛剛開啟了 Dynamo Primer,它是 Autodesk Dynamo 中針對視覺程式設計的全面指南。本手冊是一個用於共享程式設計基礎知識的持續專案。主題包括處理計算幾何圖形、規則型設計的最佳實務、跨學科程式設計應用程式以及 Dynamo 平台的更多相關主題。
在各種設計相關活動中可體現 Dynamo 的強大之處。Dynamo 利用一種易於存取的延伸清單來協助您開始使用:
第一次探索視覺程式設計
在各種軟體中連接工作流程
加入一個活躍的使用者、貢獻者及開發人員社群
開發開放原始碼平台,以持續改進
在這個活動期間以及使用 Dynamo 的興奮時刻,我們需要一份具有相同水準的文件 Dynamo Primer。
請參閱手冊使用者指南,以瞭解您可以從此手冊學習的內容。
我們持續改進 Dynamo,因此某些功能看起來可能與此手冊中所呈現的功能不同。但是,所有功能變更都會正確呈現。
Dynamo Primer 專案是開放原始碼專案!我們專注於提供高品質的內容,也感謝您提出的任何意見。如果您想要回報有關任何內容的問題,請發佈到我們的 GitHub 問題頁面:https://github.com/DynamoDS/DynamoPrimer/issues
如果您想要對此專案提供新的章節、進行編輯或新增任何其他內容,請查看 GitHub 儲存庫來開始:https://github.com/DynamoDS/DynamoPrimer。
Dynamo Primer 是一個開放原始碼專案,由 Autodesk 的 Matt Jezyk 和 Dynamo 開發團隊所發起。
Mode Lab 受託撰寫 Primer 的第一個版本。我們感謝他們為了建立這個寶貴資源付出的所有心力。
Parallax Team 的 John Pierson 受託更新 Primer 以反映 Dynamo 2.0 的修訂。
Matterlab 受託更新 Primer,以反映 Dynamo 2.13 的修訂。
Archilizer 受託更新 Primer,以反映 Dynamo 2.17 的修訂。
Wood Rodgers 受託更新 Primer 有關 Dynamo for Civil 3D 的內容。
特別感謝 Ian Keough 啟動和指導 Dynamo 專案。
感謝 Matt Jezyk、Ian Keough、Zach Kron、Racel Amour 和 Colin McCrone 充滿熱情地協同合作和參與 Dynamo 專案的一系列活動。
Dynamo 請參閱以下網站,以取得 Dynamo 最新的穩定版本。
http://dynamobim.com/download/ 或 http://dynamobuilds.com
*注意事項:從 Revit 2020 開始,Dynamo 會與 Revit 版本搭售,您不需要再手動安裝。如需更多資訊,請參閱此部落格文章。
DynamoBIM 其他資訊、學習內容和論壇的最佳來源是 DynamoBIM 網站。
http://dynamobim.org
Dynamo GitHub Dynamo 是 GitHub 上的一個開放原始碼開發專案。若要參與開發,可查看 DynamoDS。
https://github.com/DynamoDS/Dynamo
聯絡方式 讓我們瞭解關於此文件的所有問題。
Dynamo@autodesk.com
Copyright 2023 Autodesk
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.您可在以下網站獲取此「授權」的複本:
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.
本手冊包括 Mode Lab 開發的章節。這些章節專注於基礎內容,這些內容可協助您使用 Dynamo 開始開發您自己的視覺程式,並提供關於如何進一步發展 Dynamo 的關鍵見解。
本指南旨在滿足不同背景和技能等級的讀者需求。以下各節提供有關 Dynamo 設定、使用者介面和關鍵概念的一般簡介,建議新使用者閱讀下列主題:
對於想要更深入瞭解每個元素 (例如特定節點及其背後的概念) 的使用者,我們將在各自的章節中探討基礎知識。
如果您想要查看 Dynamo 工作流程的示範,我們在「範例工作流程」一節中包括了一些圖表。請遵循附加的指示建立您自己的 Dynamo 圖表。
在稍後的章節中,我們會介紹有關 Dynamo 的不同主題,您可以找到更多主題特定的練習。練習 通常可在每頁的最後一節看到。
如果沒有一群強大的活躍使用者和積極貢獻者,Dynamo 就沒有今天。請關注部落格、將您的工作新增到展示區或在論壇中討論 Dynamo,以參與社群。
Dynamo 是針對設計人員的一種視覺程式設計工具,我們可使用其開發各種工具,以利用外部庫或任何具有 API 的 Autodesk 產品。使用 Dynamo Sandbox,我們可以在「沙箱」形式的應用程式中開發程式 - 但 Dynamo 生態系統會持續增長。
專案的原始碼是開源的,我們可隨心所欲地延伸其功能。出庫使用 GitHub 上的專案,並瀏覽使用者自訂 Dynamo 的「進行中工作」。
根據需要瀏覽、分支並開始延伸 Dynamo
Dynamo 是進行中的開放原始碼開發專案。瞭解。
Dynamo 隨附於如 Revit3D、FormIt、Civil3D 等軟體而預先安裝。
如需更多 Dynamo 搭配特定軟體的使用說明,建議參閱以下各節:
如果想要以獨立應用程式的形式使用 Dynamo,請繼續閱讀 Sandbox 的下載說明。
如果您要尋找舊版或「最尖端」的開發版本,在同一頁面的下半部分可以找到所有版本。
「最尖端」的開發內容可能包含一些尚未完全測試的新功能和實驗性功能,因此或許不太穩定。使用這類版本,您可能會發現錯誤或問題,請向我們的團隊回報問題,協助我們改善應用程式。
建議初學者下載官方發行的穩定版本。
啟動已下載的任何版本之前,您必須先將內容解壓縮到您選擇的資料夾。
在壓縮檔案上按一下右鍵,然後選取 「解壓縮全部...」
選擇要解壓縮所有檔案的目的地。
在目的地資料夾中,按兩下 DynamoSandbox.exe 即可啟動
您會看到下面的 DynamoSandbox 啟動畫面。
恭喜您,您現在已經完成使用 DynamoSandbox 的設定!
Geometry 是 Dynamo Sandbox 中的一個額外功能,僅提供給目前擁有下列 Autodesk 軟體固定期限使用授權或授權的使用者:Revit、Robot Structural Analysis、FormIt 和 Civil 3D。Geometry 可讓使用者從 Dynamo Sandbox 匯入、建立、編輯和匯出幾何圖形。
Dynamo 工作區由四個主要元素組成。
所有作用中的頁籤。
預覽模式
縮放/平移控制
工作區中的節點
當您開啟新檔案時,預設會開啟新的「首頁」工作區。
您可以在自訂節點工作區中建立自訂節點並開啟它。
每個 Dynamo 視窗只允許一個首頁工作區,但您可以用頁籤開啟多個自訂節點工作區。
有 3 種方法可在不同預覽之間切換:
a.使用右上角的圖示
b.在工作區中按一下右鍵
從 3D 預覽切換至圖表預覽
從圖表預覽切換至 3D 預覽
c.使用鍵盤快速鍵 (Ctrl+B)
您在任何一個工作區都可以使用圖示或滑鼠導覽。
a.在圖表預覽模式中
使用圖示:
使用滑鼠:
按一下左鍵 - 選取
按一下左鍵並拖曳 - 選取方塊以選取多個節點
中鍵向上/向下捲動 - 拉近/拉遠
按一下中鍵並拖曳 - 平移
在圖元區上任意位置按一下右鍵 - 開啟圖元區搜尋
b.在 3D 預覽模式中
使用圖示:
使用滑鼠:
中鍵向上/向下捲動 - 拉近/拉遠
按一下中鍵並拖曳 - 平移
按一下右鍵並拖曳 - 環轉
按一下左鍵以選取任何節點。
若要選取多個節點,請按一下並拖曳以建立選取方塊。
若要開始使用,請從工具列面板啟動。視您使用的軟體而定,通常可從「功能表」> 「管理」 頁籤找到啟動圖示。按一下 Dynamo 圖示 即可啟動。
您可以從 取得 Dynamo 應用程式。從下載頁面可取得正式版、舊版或預先發行版。請造訪 頁面,然後按一下 「下載」 以取得官方發行的版本。
在此步驟,請下載並安裝 到您的電腦。
圖表預覽
3D 預覽
縮放至佈滿
放大
縮小
平移
縮放至佈滿
放大
縮小
平移
環轉
在本節中,我們將介紹 Dynamo 資源庫中提供的基本節點,這些節點將協助您像專業人士一樣建立自己的視覺程式。
用於計算設計的幾何圖形:如何在 Dynamo 中使用幾何元素?探索從基本圖元建立簡單或複雜幾何圖形的多種方法。
建置程式的區塊:什麼是「資料」?我可以在程式中開始使用哪些基本類型?此外,進一步瞭解如何在設計工作流程中納入數學和邏輯運算。
使用清單設計:如何管理和協調資料結構?進一步瞭解「清單」的概念,並使用它來有效地管理您的設計資料。
Dynamo 中的字典:什麼是字典?瞭解如何使用字典從既有結果中尋找特定資料和值。
資源庫包含所有載入的節點,其中包括 10 個安裝隨附的預設品類節點,以及已載入的其他所有自訂節點或套件。資源庫中的節點在資源庫、品類和子品類 (如果有) 內以階層方式組織。
基本節點:預設安裝隨附。
自訂節點:將常用常式或特殊圖表儲存為自訂節點。您也可以與社群共用您的自訂節點
Package Manager 中的節點:收集已發佈的自訂節點。
我們將瀏覽節點品類的階層,示範如何從資源庫快速搜尋,並了解其中某些常用節點。
透過在這些品類中進行瀏覽,能以最快方式瞭解可以加入到工作區的項目所在的階層,並以最佳方式探索尚未使用的新節點。
透過四處按一下功能表瀏覽資源庫,展開每個品類及其子品類
Geometry 功能表很適合在開始探索時使用,因為它們包含最多數量的節點。
資源庫
品類
子品類
節點
這些項目會根據節點是建立資料、執行動作或查詢資料,進一步分類成有相同子品類的節點。
將滑鼠懸停在節點上,可顯示名稱和圖示之外更詳細的資訊。我們由此可以快速了解節點的功能、所需的輸入及其提供的輸出。
描述 - 節點的普通語言描述
圖示 -「資源庫」功能表中更大版本的圖示
輸入 - 名稱、資料類型與資料結構
輸出 - 資料類型與結構
如果您知道希望加入至工作區的節點相關特性,在 「搜尋」 欄位中鍵入可查詢所有相符的節點。
選擇按一下要加入的節點,或按 Enter 將亮顯的節點加入工作區的中心。
除了使用關鍵字嘗試尋找節點,我們還可以在「搜尋欄位」中鍵入以句點分隔的階層,或使用程式碼區塊 (使用 Dynamo 文字語言)。
每個資源庫的階層都會反映在加入工作區的節點名稱中。
在資源庫階層中以 library.category.nodeName
格式鍵入節點位置的不同部分,會傳回不同的結果
library.category.nodeName
category.nodeName
nodeName
或 keyword
通常,工作區中節點的名稱將以 category.nodeName
格式呈現,但在「Input」與「View」品類中有一些明顯的例外。
請注意名稱相似的節點,並注意品類差異:
大多數資源庫中的節點將包括品類格式
Point.ByCoordinates
和 UV.ByCoordinates
的名稱相同,但來自不同品類
明顯的例外包括內建函數、Core.Input、Core.View 及運算子
Dynamo 的基本安裝中包括數百個節點,哪些節點對於開發視覺程式非常重要?接下來我們著重了解定義程式參數 (Input)、查看節點動作結果 (Watch) 以及透過捷徑 (Code Block) 定義輸入或功能所使用的節點。
輸入節點是視覺程式的使用者 (不論是您自己還是他人) 與關鍵參數結合的主要方式。以下是核心資源庫中一些可用的項目:
Boolean
Number
String
Number Slider
Directory Path
Integer Slider
File Path
Watch 節點對於管理流經視覺程式的資料非常重要。您可以透過節點資料預覽,將滑鼠懸停在節點上,來檢視節點的結果。
在 Watch 節點中保持顯示會很有用
或透過 Watch3D 節點查看幾何圖形結果。
這兩個節點都位於核心資源庫內的 View 品類中。
秘訣:若視覺程式包含許多節點,3D 預覽有時可能會分散您的注意力。請考慮不勾選「設定」功能表中的「展示背景預覽」選項,並使用 Watch3D 節點預覽幾何圖形。
Code Block 節點可以用於定義一塊程式碼 (以分號分隔各行)。這可以像 X/Y
一樣簡單。
我們也可以使用 Code Block 做為捷徑定義數字輸入或呼叫其他節點的功能。執行此作業的語法遵循 Dynamo 文字語言 DesignScript 的命名慣例。
以下是在腳本中使用 Code Block 的簡單示範 (含指示)。
按兩下以建立 Code Block 節點
鍵入 Circle.ByCenterPointRadius(x,y);
按一下工作區以清除選取,這會自動加入 x
和 y
輸入。
建立 Point.ByCoordinates 節點與 Number Slider,然後將其連接至 Code Block 的輸入。
執行視覺程式的結果如 3D 預覽中顯示為圓
在 Dynamo 中,節點互相連接以形成視覺程式的物件。每個節點執行一項作業 - 有時可能是簡單作業 (例如儲存數字),也可能是比較複雜的動作 (例如建立或查詢幾何圖形)。
Dynamo 中的大多數節點由五個部分組成。雖然有一些例外,例如輸入節點,但每個節點的剖析可說明如下:
名稱:採用
Category.Name
命名慣例的節點名稱主體:即節點的主體,在此處按一下右鍵會顯示整個節點在該層級的選項
埠 (輸入和輸出):線路的接收器,向節點提供輸入資料,以及提供節點動作結果。
預設值:對輸入埠按一下右鍵,某些節點具有可供使用或不可使用的預設值。
交織圖示:註明為配對清單輸入內容所指定的交織選項 (之後會進一步討論)
節點的輸入與輸出稱為「埠」,可作為線路的接收器。資料從左側透過埠進入節點,在執行其作業後從右側流出節點。
埠應當接收特定類型的資料。例如,若將一個數字 (例如 2.75) 連接至座標點節點上的埠,會成功建立一個點;但是如果為同一埠提供 「RED」,則會導致錯誤。
秘訣:將游標懸停在埠上可看到一個工具提示,其中包含預期的資料類型。
埠標示
工具提示
資料類型
預設值
Dynamo 會根據每個節點的狀態,讓節點呈現不同的顏色外觀,標示出視覺程式的執行狀態。狀態階層依照下列順序:「錯誤」>「警告」>「資訊」>「預覽」。
懸停在名稱或埠上或對名稱或埠按一下右鍵,可呈現其他資訊和選項。
滿足條件的輸入:節點的輸入埠標有藍色直線,代表節點連接良好,且所有輸入都成功連接。
未滿足條件的輸入:節點的一個或多個輸入埠標有紅色直線,表示必須讓這些輸入處於連接狀態。
函數:輸出函數且在輸出埠標有灰色直線的節點,即是函數節點。
選取狀態:目前選取的節點邊界會用水藍色醒目顯示。
凍結狀態:半透明藍色節點表示已凍結,暫停執行節點。
警告:節點下方的黃色狀態列為「警告」狀態,表示節點可能缺少輸入資料,或者資料類型不正確。
錯誤狀態:節點下方的紅色狀態列表示節點處於「錯誤」狀態。
資訊:節點下方的藍色狀態列表示「資訊」狀態,會標示出節點的相關實用資訊。當節點以可能影響效能等等的方式達到節點支援的最大值時,可觸發此狀態。
秘訣:隨時使用此工具提示資訊檢查上游節點,可查看所需的資料類型或資料結構是否有錯誤。
警告工具提示 -「Null」(亦即沒有資料) 無法識別為 Double (即數字)
使用 Watch 節點檢查輸入資料
上游的 Number 節點儲存「Red」,不是數字
在某些情況下,您可能想要阻止特定節點在視覺程式中執行。您可以透過「凍結」節點這樣做,在節點右鍵功能表下可以找到這個選項。
凍結節點也會凍結其下游的節點。換言之,所有依賴凍結節點輸出的節點也會跟著凍結。
線路連接兩個節點,以建立關係並建立視覺程式的流動。可以將這些按字面意思想成電線,用於將資料的脈衝從一個物件傳遞至另一個物件。
線路將一個節點的輸出埠連接至另一個節點的輸入埠。此定向性建立視覺程式中的資料流。
輸入埠位於節點的左側,輸出埠位於節點的右側,因此我們通常可以說程式從左邊流向右邊。
在埠上按一下左鍵來建立線路,接著在另一個節點的埠上按一下左鍵來建立連接。建立連接的過程中,線路會顯示為虛線,成功連接後即會變成實線。
資料將一律透過此線路從輸出流向輸入;但是,我們可透過點按連接埠的順序,建立任何方向的線路。
我們會經常需要編輯線路的連接,來調整視覺程式中的程式流。若要編輯線路,請按一下已連接節點的輸入埠。您現在有兩個選項:
變更輸入埠的連接,請在另一個輸入埠上按一下左鍵
若要移除線路,請將線路移開,然後在工作區上按一下左鍵
按住 Shift 並按一下左鍵重新連接多條線路
按住 Ctrl 並按一下左鍵複製線路
依預設,線路將以灰色線條呈現預覽。選取節點後,將使用與節點相同的水藍色亮顯方法呈現任何連接的線路。
亮顯的線路
預設線路
依預設隱藏線路
如果您想要隱藏圖表中的線路,可以從「檢視」>「連接器」> 取消勾選「展示連接器」找到此選項。
使用此設定時,只有選取的節點及其接合線路會以水藍色亮顯展示。
您也可以在節點輸出上按一下右鍵 > 選取「隱藏線路」,只隱藏選取的線路
作為一種視覺程式設計環境,Dynamo 可讓您設計資料的處理方式。資料是數字或文字,幾何圖形也是如此。從計算機的角度來說,幾何圖形或有時稱為計算幾何圖形是可以用於建立精美、複雜或效能驅動模型的資料。若要執行此作業,我們需要瞭解可使用的各種幾何圖形的輸入和輸出。
向量是一種大小和方向的表現法,您可以將其視為以指定速度向特定方向加速的箭頭。在 Dynamo 中,向量是模型的關鍵元件。請注意,由於向量屬於「協助工具」抽象品類,因此我們在建立向量時,不會在背景預覽中看到任何內容。
進行向量預覽時,我們可以使用直線代替向量。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
平面是一個二維表面,您可以將其視為無限延伸的平面。每個平面都有原點、X 方向、Y 方向和 Z (向上) 方向。
雖然平面是抽象的,但是具有原點位置,因此我們可以在空間中對其定位。
在 Dynamo 中,會在背景預覽中彩現平面。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
座標系統是一個決定點或其他幾何元素位置的系統。下圖說明座標系統在 Dynamo 中的外觀,以及每種顏色代表的意義。
雖然座標系統是抽象的,但是也具有原點位置,因此我們可以在空間中對其定位。
在 Dynamo 中,會在背景預覽中將座標系統彩現為一點 (原點) 與定義軸的直線 (遵循慣例,X 軸為紅色,Y 軸為綠色,Z 軸為藍色)。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
向量、平面與座標系統構成抽象幾何圖形類型的主要群組。它們能協助我們定義位置、方位以及對造型進行描述的其他幾何圖形空間環境。如果我說我在紐約城第 42 號街,位於百老匯 (座標系統),站在街面上 (平面),面向北方 (向量),這是使用了「協助工具」以定義我的位置。這同樣適用於手機殼產品或摩天大樓 - 我們需要此環境來開發模型。
向量是描述方向與大小的幾何量。向量是抽象的;亦即,它們代表數量,而非幾何元素。向量與點很容易混淆,因為兩者都由一系列值構成。但是兩者之間存在關鍵差異:點描述的是指定座標系統中的位置,而向量描述的是位置的相對差異,與「方向」相同。
若相對差異的概念讓您混淆,請將向量 AB 想像為「我站在 A 點,面向 B 點」。 從這裡 (A) 到那裏 (B) 的方向就是向量。
以下將使用上述 AB 表示法進一步詳細說明向量的各部分:
向量的起點稱為底端。
向量的終點稱為頂端或指向。
向量 AB 與向量 BA 不同,兩者指向相反方向。
如果您需要喜劇慈善相關的向量 (及其抽象定義),請觀看經典喜劇 Airplane,聽聽那句膾炙人口的幽默台詞:
Roger, Roger.What's our vector, Victor?
平面是二維抽象「協助工具」。 更具體地說,平面在概念上是「平」的,在兩個方向無限延伸。平面通常會以原點附近的小矩形呈現。
您可能會想,「等等!原點?聽上去像是座標系統...就像我在 CAD 軟體中用於塑型的工具!」
您想得對!大多數塑型軟體會利用建構平面或「水平面」來定義用於繪圖的局部二維環境。平面採用 XY、YZ、XZ 或北、東南等表述,聽上去可能更熟悉。這些都是定義無限「平」環境的平面。平面沒有深度,但它們也同樣能幫助我們描述方向。
如果我們能夠自如地使用平面,距離理解座標系統就不遠了。平面都有相同的部分,那就是座標系統 (只要是標準的「歐幾里得」或「XYZ」座標系統即可)。
但是,還有其他替代座標系統,例如圓柱座標系統或圓球座標系統。在稍後各節中我們可以看到,也可以將座標系統套用至其他幾何圖形類型,以定義該幾何圖形上的位置。
增加替代座標系統 - 圓柱座標系統,圓球座標系統
幾何圖形是設計的語言。若程式設計語言或環境的核心是幾何圖形核心,則在設計精確健全的模型、自動化設計常式及使用演算法產生設計迭代方面將帶來無限可能。
透過瞭解幾何圖形類型及其相關方式,我們可以導覽資源庫中提供的幾何圖形節點集合。幾何圖形節點依字母順序排列,與階層順序 (其顯示類似於在 Dynamo 介面中的配置) 截然不同。
此外,在 Dynamo 中製作模型,以及將我們在背景預覽中看到的預覽連接至圖表中的資料流,這兩項功能隨時間演進將變得更直觀。
請注意由格線與彩色軸呈現的假設座標系統
選取的節點會以亮顯顏色彩現背景中的對應幾何圖形 (若該節點建立幾何圖形)
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
幾何圖形一直以來的定義是對形狀、大小、圖形相對位置以及空間性質的研究。此領域具有數千年的悠久發展歷史。隨著電腦的問世與普及,我們在定義、探索及產生幾何圖形方面擁有了功能強大的工具。現在,可以很輕鬆地計算複雜幾何互動的結果,這種狀況幾乎隨處可見。
如果您很想瞭解各種複雜幾何圖形在運用電腦的力量後可以得到的結果,請在網路上快速搜尋 Stanford Bunny,這是用於測試演算法的權威模型。
在滿是演算法、運算與複雜性的環境中瞭解幾何圖形聽起來似乎讓人膽怯,但是存在一些關鍵且相對簡單的原則,我們可以以此為基礎開始開發更進階的應用:
幾何圖形是資料 - 對電腦與 Dynamo 而言,一隻兔子和一個數字沒有太大差別。
幾何圖形依賴於抽象 - 基本上,幾何元素是由指定空間座標系統中的數字、關係與公式來描述。
幾何圖形具有階層 - 許多點共同構成線,許多線共同構成面,依此類推
幾何圖形可以同時描述部分與整體 - 曲線既是指形狀,也是指曲線上的所有點
實際上,這些原則意味著我們需要了解我們正在使用的幾何圖形 (幾何圖形的類型、幾何圖形的建立方式等),我們才能在開發更複雜的模型時流暢地建構、分解和重新建構不同的幾何圖形。
接下來花一些時間看一下幾何圖形的抽象描述與階層描述之間的關係。由於這兩個概念彼此相關,但起初並不總是很明顯,因此我們在開始開發更深入的工作流程或模型後,會很快遇到概念障礙。對於初學者,接下來將使用維度來簡單描述模型的「內容」。透過描述一個形狀所需的維數,可以了解幾何圖形所屬的階層。
點 (由座標定義) 沒有任何維度,它只是描述每個座標的數字
直線 (由兩個點定義) 現在有 一個 維度 - 我們可以沿直線向前 (正方向) 或向後 (負方向)「行走」
平面 (由兩條直線定義) 有 兩個 維度 - 現在可以向左或向右行走
方塊 (由兩個平面定義) 有 三個 維度 - 我們可以相對於上下來定義位置
開始對幾何圖形分類時,維度是便利的方式,但不一定是最佳方式。畢竟我們不能只用點、直線、平面與方塊來塑型,如果需要彎曲的東西該怎麼辦呢?此外,還有其他完全抽象的幾何圖形類型品類。它們定義性質,例如方位、體積或零件之間的關係。我們無法真正抓住一個「向量」,那要如何相對於我們在空間中看到的東西來定義它呢?幾何階層的更詳細分類應考慮到抽象類型或「協助工具」之間的差異,我們可以根據協助行為以及對描述模型元素形狀進行協助的類型來對每種抽象類型或協助工具分組。
在 Dynamo 中建立模型並不限於使用節點可以產生的項目。以下是一些關鍵的方式,您可藉此運用幾何圖形讓程序更上一層樓:
Dynamo 允許您匯入檔案 - 請嘗試對點雲使用 CSV,或使用 SAT 以引入曲面
使用 Revit 時,可以參考要在 Dynamo 中使用的 Revit 元素
Dynamo Package Manager 可對延伸的幾何圖形類型及作業提供其他功能 - 請查看 Mesh Toolkit 套件
如果我們要建構無法從單個平面建立的更複雜模型,或如果我們要定義明確的體積,我們現在必須瞭解實體 (和 Polysurface) 領域。即使一個簡單的立方塊就夠複雜了,需要六個平面,每一面一個平面。實體提供了兩個平面不提供的關鍵概念 - 更細化的拓樸說明 (面、邊、頂點) 和布林作業。
您可以使用布林運算來修改實體。讓我們使用幾個布林運算建立一個尖刺球。
Sphere.ByCenterPointRadius:建立基礎實體。
Topology.Faces、Face.SurfaceGeometry:查詢實體的面並將其轉換為曲面幾何圖形 - 在此情況下,圓球只有一個面。
Cone.ByPointsRadii:使用曲面上的點建構圓錐。
Solid.UnionAll:將「圓錐」和「球」做聯集。
Topology.Edges:查詢新實體的邊
Solid.Fillet:對尖刺球的邊執行「圓角」作業
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
布林作業很複雜且可降低計算速度。您可以使用「凍結」功能暫停執行選取的節點和受影響的下游節點。
1. 使用右鍵關聯式功能表來凍結「實體聯集」作業
2.選取的節點和所有下游節點將以淺灰色重影模式預覽,受影響的線路將以虛線顯示。受影響的幾何圖像預覽也將被重像。現在,您可以變更上游值,而不計算布林聯集。
3.若要解凍節點,請按一下右鍵,然後取消勾選「凍結」。
4.所有受影響的節點和關聯的幾何圖像預覽將更新並回復至標準預覽模式。
您可以在節點和線路一節閱讀有關凍結節點的更多資訊。
實體由一個或多個曲面組成,以定義「內」或「外」的封閉邊界表示其體積。 無論有多少平面,它們必須形成一個「無縫」體積才會被視為實體。可透過連結平面或多面體來建立實體圖像,或透過使用作業 (例如,斷面混成、掃掠和迴轉) 來建立。圓球、立方體、圓錐與圓柱基本型也是實體。將立方塊至少一個面移除所得的圖像為 Polysurface,它有實體的某些相似性質,但不是實體。
平面是由單一曲面組成,不是實體。
圓球是由一個曲面組成,但 是 實體。
圓錐是由兩個曲面接合在一起而建立的實體。
圓柱是由三個表面接合在一起而建立的實體。
立方塊是由六個平面接合在一起而建立的實體。
實體由三種類型的元素組成:頂點、邊和面。面是構成實體的平面。邊是定義相鄰面之間連結的曲線,頂點是這些曲線的起點和終點。這些元素可以使用拓樸節點進行查詢。
面
邊
頂點
可透過對邊執行圓角或倒角作業來消除急轉角和角,從而對實體進行修改。「倒角」作業會在兩個面之間建立符合規則的曲面,而「圓角」作業會混合兩個面使其保持相切。
實體立方塊
倒角的立方塊
圓角的立方塊
實體布林作業是結合兩個或多個實體的方式。單一布林作業實際意味著執行四個作業:
讓兩個或多個物件交集。
讓它們在交集處分離。
刪除不需要的幾何圖形部分。
將所有物件重新接合在一起。
聯集: 移除實體的重疊部分並將它們接合為單一實體。
差集: 從一個實體減去另一個。要被減去的實體稱為工具。請注意,您可以切換作為工具的實體,以保留相反的部分。
交集: 僅保留兩個實體的交集部分。
UnionAll: 對球和向外圓錐進行「聯集」作業
DifferenceAll: 對球和向內圓錐進行「差集」作業
點只是利用稱為座標的一個值或多個值來定義。定義點需要的座標值數目取決於點所在的座標系統或環境。
Dynamo 中最常見的一種點存在於我們的三維世界座標系統中,有三個座標 [X,Y,Z] (Dynamo 中的 3D 點)。
Dynamo 中的 2D 點有兩個座標 [X,Y]。
曲線和曲面的參數是連續的,且會延伸到給定幾何圖形的邊緣之外。由於定義參數空間的形狀位於三維世界座標系統中,我們可以一律將參數式座標轉換為「世界」座標。例如,平面上的點 [0.2,0.5] 等同於世界座標中的點 [1.8,2.0,4.1]。
假定世界 XYZ 座標中的點
相對於給定座標系統 (圓柱) 的點
平面上 UV 座標中的點
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
如果幾何圖形是模型的語言,那麼點就是字母。點是建立所有其他幾何圖形的基礎 - 我們需要至少兩個點以建立曲線,我們需要至少三個點以使多邊形或網格面等。定義點之間位置、順序和關係 (嘗試正弦函數) 可讓我們定義高階的幾何圖形,例如圓或曲線。
使用函數
x=r*cos(t)
和y=r*sin(t)
的圓使用函數
x=(t)
和y=r*sin(t)
的正弦曲線
點也可以存在於二維座標系統中。根據我們處理的空間種類,依慣例具有不同的字母表示法,如果在平面上,我們可能會使用 [X,Y],如果在曲面上,我們會使用 [U,V]。
歐幾里得座標系統中的點:[X,Y,Z]
曲線參數座標系統中的點:[t]
曲面參數座標系統中的點:[U,V]
曲線是我們討論的第一種幾何資料類型,具有我們更熟悉的一組形狀描述性質 - 多彎或多直?多長或多短?請記住,點仍然是我們的基礎材料,用於定義從直線到雲形線的所有項目,以及所有曲線類型。
直線
聚合線
弧
圓
橢圓
NURBS 曲線
Polycurve
NURBS 是一個用於精確表示曲線和曲面的模型。Dynamo 中的正弦曲線使用兩種不同方法建立 NURBS 曲線以比較結果。
NurbsCurve.ByControlPoints 使用點清單做為控制點
NurbsCurve.ByPoints 繪製一條通過點清單的曲線
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
曲線一詞通常是所有不同彎曲 (甚至筆直) 造型的統稱。曲線是所有這些造型類型 (直線、圓、雲形線等) 的父系分類。若以更具技術性的語言來表述,一條曲線描述在一系列函數 (這些函數包含從諸如 x = -1.26*t, y = t
的簡單函數到涉及微積分的複雜函數) 中輸入「t」即可找到的每個可能點。不論使用何種類型的曲線,這個稱為「t」的參數是我們可以演算的性質。此外,不論造型外觀為何,所有曲線都有起點與終點,兩者分別對應於建立曲線所使用的最小 t 值與最大 t 值。這也有助於我們瞭解其方向性。
請務必注意,Dynamo 假設曲線「t」值的範圍是 0.0 到 1.0。
所有曲線還具有許多性質或特性,可用於對其進行描述或分析。若起點與終點之間的距離是零,則曲線是「封閉」曲線。 此外,每條曲線都有許多控制點,若所有這些點都位於同一平面上,則該曲線是「平面」曲線。 有些性質會套用至曲線的整體,而其他性質只會套用至曲線上的特定點。例如,平面性是曲線的整體性質,而指定 t 值處的切線向量是局部性質。
直線是形式最簡單的曲線。直線看上去可能並不彎曲,但實際上屬於曲線,只是沒有曲率而已。有幾種不同方式可以建立直線,最直觀的方式是從點 A 到點 B 畫線。直線 AB 的造型包含兩點之間的點,但在數學上,該直線在兩個方向無限延伸。
將兩條直線連接在一起,就產生聚合線。我們有一個簡單的方法可以表示什麼是控制點。編輯其中任何點的位置都將變更聚合線的造型。若聚合線是封閉的,則會產生多邊形。若多邊形所有邊長都相等,稱為正多邊形。
正如我們對定義造型的參數式函數提高複雜度一樣,我們可以在直線的基礎上更進一步,透過描述一或兩個半徑來建立弧、圓、橢圓弧或橢圓。弧與對應的圓或橢圓之間的差異只在於造型是否封閉。
NURBS (非均勻有理 B 雲形線) 是數學表述,可以對從簡單的二維直線、圓、弧或矩形到最複雜的三維自由形式基本曲線的任何造型進行準確塑型。由於具備靈活性 (控制點相對較少,但根據次數設定可以平滑內插) 與精確度 (受強大數學功能約束),因此 NURBS 模型可用於從插圖與動畫到製造的任何程序。
次數:曲線的次數決定控制點對曲線的影響範圍,次數越高,範圍越大。次數是正整數。該數通常是 1、2、3 或 5,但可以是任意正整數。NURBS 直線與聚合線通常是 1 次,而多數自由曲線是 3 或 5 次。
控制點:控制點是至少包含 (次數+1) 個點的清單變更 NURBS 曲線造型最簡單的方式之一,是移動控制點。
權重:控制點有一個稱為「權重」的關聯數字。權重通常是正數。若曲線控制點具有相同的權值 (通常為 1),則曲線稱為不合理曲線,否則稱為合理曲線。多數 NURBS 曲線都是非有理曲線。
節點:節點是 (次數+N-1) 個數字的清單,其中 N 是控制點的數量。節點與權重搭配使用,可控制控制點對結果曲線的影響。節點的一項用途是在曲線的特定點處建立扭折。
次數 = 1
次數 = 2
次數 = 3
請注意,次數值越高,內插產生的曲線所用的控制點就越多。
我們在模型中使用曲面來表示我們在三維世界中看到的物件。雖然曲線不一定在同一個平面上 (亦即三維曲線),但它們定義的空間始終是一個維度。曲面多了一個維度,並具有一系列其他性質,可供我們用於其他塑型作業。
在 Dynamo 中匯入曲面,並演算某個參數處的曲面,以瞭解我們可以擷取哪類資訊。
Surface.PointAtParameter 會傳回給定 UV 座標處的點
Surface.NormalAtParameter 會傳回給定 UV 座標處的法線向量
Surface.GetIsoline 會傳回 U 或 V 座標處的等參數曲線 - 注意 isoDirection 輸入。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
曲面是由函數與兩個參數定義的數學造型,我們不使用曲線的 t
,而是使用 U
與 V
來描述對應的參數空間。這意味著我們使用此類型的幾何圖形時,需要提取更多的幾何資料。例如,曲線具有切線向量與法向平面 (可以沿曲線長度旋轉或扭轉),而曲面具有方位一致的法線向量與相切平面。
曲面
U 等角曲線
V 等角曲線
UV 座標
互垂平面
法線向量
曲面範圍:曲面範圍定義為對該曲面上的三維點進行演算的 (U,V) 參數的範圍。每個維度 (U 或 V) 的範圍通常描述為兩個數字,即 U 最小值到 U 最大值與 V 最小值到 V 最大值。
雖然曲面的造型看上去可能不是「矩形」,而且局部可能存在更緊密或更鬆散的一組等角曲線,但曲面範圍所定義的「空間」始終是二維空間。在 Dynamo 中,我們都知道曲面範圍定義為在 U 與 V 兩個方向上從最小值 0.0 到最大值 1.0。平面曲面或修剪過的曲面可能有不同的範圍。
等角曲線 (即等參數曲線):由曲面上固定的 U 或 V 值以及所對應其他 U 或 V 方向的值範圍所定義的曲線。
UV 座標:UV 參數空間中由 U、V (有時還有 W) 定義的點。
互垂平面:在給定 UV 座標處與 U 及 V 等角曲線互垂的平面。
法線向量:相對於互垂平面定義「向上」方向的向量。
NURBS 曲面非常類似於 NURBS 曲線。您可以將 NURBS 曲面視為 NURBS 曲線在兩個方向構成的網格。NURBS 曲面的造型由許多控制點以及該曲面在 U 與 V 方向的度來定義。根據控制點、權重與次數來計算造型、法線、切線、曲率及其他性質採用的演算法相同。
對於 NURBS 曲面,幾何圖形會指示兩個方向,因為 NURBS 曲面不論造型為何,都是控制點的矩形網格。即使這些方向相對於世界座標系統而言通常是任意方向,但我們可以頻繁使用這些方向來分析模型,或根據曲面產生其他幾何圖形。
次數 (U,V) = (3,3)
階數 (U,V) = (3,1)
階數 (U,V) = (1,2)
階數 (U,V) = (1,1)
Polysurfaces 由跨邊接合的曲面構成。PolySurface 提供超過二維的 UV 定義,現在我們可以由此透過拓樸在連接的造型中移動。
雖然「拓樸」通常描述有關部分如何連接及/或相關的概念,但 Dynamo 中的拓樸也是幾何圖形的類型。確切地說,它是曲面、Polysurface 及實體的父系品類。
以有時稱為「修補」的方式接合曲面,我們可以製作更複雜的造型,並定義跨接縫的詳細資料。我們可以便利地將圓角或倒角作業套用至 PolySurface 的邊。
如果資料最簡單的形式是數字,則關聯這些數字最簡單的方式就是透過數學運算。從諸如除號等簡單運算子到三角函數,再到更複雜的公式,數學是開始探索數字關係與樣式的良好方式。
運算子是一組元件 (加、減、乘、除等),使用代數函數與兩個數字輸入值,產生一個輸出值。在「運算子」>「動作」下可以找到這些運算子。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
透過公式結合運算子和變數,以構成更複雜的關係。使用滑棒建立可透過輸入參數控制的公式。
1. 建立表示參數式方程式中「t」的數字序列,因此,我們希望使用大到足以定義螺旋線的清單。
Number Sequence: 根據以下三項輸入定義數字序列:start、amount 與 step。
2.上述步驟已建立用於定義參數範圍的數字清單。接下來,建立表示黃金螺旋線方程式的節點群組。
定義黃金螺旋線的方程式如下:
以下影像以視覺程式設計形式表示黃金螺旋線。逐步檢查節點群組時,請盡可能注意視覺程式與書寫方程式之間的對應。
a.Number Slider:在圖元區加入兩個數字滑棒。這些滑棒代表參數式方程式中的 a 與 b 變數。這些表示彈性的常數,或表示我們可以針對所需結果進行調整的參數。
b.相乘 (*):相乘節點由星號表示。我們會重複使用此符號連接相乘的變數
c.Math.RadiansToDegrees:「t」值需要轉換為度,才能在三角函數中演算。請記住,Dynamo 預設使用度來運算這些函數。
d.Math.Pow:以「t」與數字「e」表示的函數,此函數會建立 Fibonacci 序列。
e.Math.Cos 與 Math.Sin:這兩個三角函數將分別區分每個參數式點的 X 座標與 Y 座標。
f.Watch:現在可以看到輸出是兩個清單,分別是產生螺旋線所用點的 x 與 y 座標。
Point.ByCoordinates: 將上方的相乘節點連接到「x」輸入,將下方的節點連接到「y」輸入。我們現在可以在螢幕上看到點的參數式螺旋線。
Polycurve.ByPoints: 將上一步的 Point.ByCoordinates 連接到 points。我們可以保留 connectLastToFirst 無輸入,因為不打算繪製封閉曲線。這會建立一條穿過上一步定義的每個點的螺旋線。
我們現在完成了 Fibonacci 螺旋線!接下來進一步將此分為兩個單獨的練習,我們分別稱之為鸚鵡螺與向日葵。這些是自然系統的抽象名稱,但可以充分呈現 Fibonacci 螺旋線的兩種不同應用。
Circle.ByCenterPointRadius: 我們在此處將使用圓節點,採用與上一步相同的輸入。半徑的預設值為 1.0,所以我們可以立即看到輸出的圓。它會立即清晰展示點如何進一步偏離原點。
Number Sequence: 這是「t」的原始陣列。將此序列插入 Circle.ByCenterPointRadius 的半徑值後,圓心仍會離原點越來越遠,但半徑會增加,因而產生很酷的 Fibonacci 圓形。
如果您使用 3D 製作會更酷!
一開始,我們先執行上一個練習中的相同步驟:使用 Point.ByCoordinates 節點建立點的螺旋線陣列。
![](../images/5-3/2/math-part IV-01.jpg)
接下來,依照這些小步驟,以各種旋轉產生一系列螺旋線。
a.Geometry.Rotate: 有幾個 Geometry.Rotate 選項,請確保選擇以 geometry、basePlane 和 degrees 為輸入的節點。將 Point.ByCoordinates 連接至 geometry 輸入。在此節點上按一下右鍵,並確保將交織設定為「笛卡兒積」
b.Plane.XY: 連接至 basePlane 輸入。我們將繞原點旋轉,此原點的位置與螺旋線的基準位置相同。
c.Number Range: 對於角度輸入,我們希望建立多個旋轉。使用 Number Range 元件可以快速達成。將其連接至 degrees 輸入。
d.Number: 為了定義數字範圍,在圖元區以垂直順序加入三個數字節點。從上到下分別指定值為 0.0、360.0 與 120.0。這些值將驅動螺旋線旋轉。請注意將三個數字節點連接至 Number Range 節點後的輸出結果。
輸出開始形成一個漩渦。接下來調整某些 Number Range 參數,並查看結果的變化。
將 Number Range 節點的步長大小從 120.0 變更為 36.0。請注意,這會建立更多旋轉,因此會產生更密的格線。
將 Number Range 節點的步長大小從 36.0 變更為 3.6。現在,這會產生密度大得多的格線,螺旋線的方向性變得不清楚。各位,我們產生了一朵向日葵。
在我們已準備好要更深入瞭解如何開發視覺程式時,我們將需要更深入理解將使用的建置區塊。本章提供有關資料的基礎概念 - 透過 Dynamo 程式線路傳遞的物件。
在運算塑型領域,是 3D 幾何圖形最普遍的表現形式之一。網格幾何圖形通常由一系列四邊形或三角形組成,可以做為使用 NURBS 輕量靈活的替代方案,從彩現和視覺化到數位製造和 3D 列印的所有領域,都會使用網格。
Dynamo 使用面-頂點資料結構定義網格。在最基本的層級,此結構只是歸入多邊形的點集合。網格的點稱為頂點,而類似於曲面的多邊形稱為面。
若要建立網格,我們需要頂點清單,以及將這些頂點歸入面的系統 (稱為索引群組)。
頂點清單
將定義面的索引群組清單
該資源庫還提供工具來修改網格、修復網格,或萃取水平切片,以用於加工。
網格是表示曲面或實體幾何圖形的一系列四邊形與三角形。與實體相似,網格物件的結構包括頂點、邊與面。另外也有讓網格獨一無二的其他性質,例如法線。
網格頂點
網面邊 *只有一個相鄰面的邊稱為「裸露邊」。 所有其他邊稱為「覆蓋邊」
網格面
網格的頂點只是一系列點。在建構網格或取得網格結構的相關資訊時,頂點的索引非常重要。對於每個頂點,還有對應的頂點法線 (向量),可描述所貼附面的平均方向,並有助於我們瞭解網格的「向內」與「向外」方位。
頂點
頂點法線
面是按順序排列的三或四個頂點。因此,會根據編製索引的頂點位置指示網格面的「曲面」表現法。我們已擁有構成網格的頂點清單,因此不提供個別點以定義面,只需使用頂點索引即可。我們藉此也可以對多個面使用相同的頂點。
由索引 0、1、2、3 構成的四邊形面
由索引 1、4、2 構成的三角形面 注意可以轉換索引群組的順序 - 只要序列的順序採用逆時鐘方式,就會正確定義面
網格幾何圖形與 NURBS 幾何圖形有什麼不同?您什麼時候需要擇其一而使用?
在上一章,我們看到 NURBS 曲面由兩個方向的一系列 NURBS 曲線定義。這些方向標示為 U
與 V
,可藉此根據二維曲面範圍對 NURBS 曲面執行參數化。在電腦中,曲線本身儲存為方程式,藉此可採用任意小的精確度計算產生的曲面。但是,合併多個 NURBS 曲面會很困難。接合兩個 NURBS 曲面將產生 Polysurface,該幾何圖形的不同部分會有不同的 UV 參數與曲線定義。
曲面
等參數 (結構線) 曲線
曲面控制點
曲面控制多邊形
等參數點
曲面框
網格
裸露邊
網格網路
網格邊
頂點法線
網格面/網格面法線
另一方面,網格由離散數量的精確定義頂點及面構成。頂點的網路一般無法由簡單的 UV
座標定義,由於面是離散的,因此精確度內建於網格中,只能透過細化網格及加入更多面來變更。由於缺少數學描述,因此網格可以更靈活地處理單一網格中的複雜幾何圖形。
另一項重要差異在於網格或 NURBS 幾何圖形的局部變更對整體形狀的影響程度。移動網格的一個頂點只會影響該頂點相鄰的面。在 NURBS 曲面中,影響程度較複雜,取決於曲面的度以及控制點的權值與節點。但是,一般而言,在 NURBS 曲面中移動單一控制點會提高幾何圖形的平滑度,並對幾何圖形產生更廣泛的變化。
NURBS 曲面 - 移動控制點會對整個造型範圍產生影響
網格幾何圖形 - 移動頂點只對相鄰元素產生影響
向量影像 (由直線與曲線構成) 與點陣式影像 (由個別像素構成) 的對比有助於您理解這一點。若拉近向量影像,曲線仍清晰鮮明,而拉近點陣式影像時,會看到個別像素變得更大。在此類比中,NURBS 曲面相當於向量影像,因為存在平滑的數學關係,而網格的行為方式類似於具有固定解析度的點陣式影像。
正式的說法是,字串是字元的序列,表示文字常數或某些類型的變數。非正式的說法是,字串是文字式的程式設計行話。我們曾使用數字 (整數與小數) 來驅動參數,現在使用文字也可以做到這一點。
字串可以用於多種應用,包括定義自訂參數、註解文件集,以及剖析文字式資料集。字串節點位於 Core > Input 。
以上範例節點是字串。數字可以表示為字串、字母或文字陣列。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
透過查詢字串,您可以快速剖析大量資料。我們將討論一些基本作業,這些作業可以加快工作流程,有助於提高軟體互通性。
以下影像將考慮來自外部工作表的資料字串。該字串表示 XY 平面內某矩形的頂點。接下來在小練習中詳細瞭解某些字串分割作業:
「;」分隔符號分隔矩形的每個頂點。這會建立清單,每個頂點有 3 個項目。
透過按一下節點中部的「+」,可以建立新分隔符號。
在圖元區加入「,」字串,並插入新的分隔符號輸入。
現在結果將產生含十個項目的清單。節點會先根據 separator0 進行分割,然後根據 separator1 進行分割。
雖然以上項目清單可能看起來像數字,但是在 Dynamo 中,仍將其視為單獨的字串。若要建立點,需要將其資料類型從字串轉換為數字。我們使用 String.ToNumber 節點來達成
本節點非常簡單。將 String.Split 的結果插入輸入。輸出看上去似乎相同,但現在資料類型是 number 而不是 string。
透過其他某些基本作業,我們現在已根據原始字串輸入,在原點繪製了三角形。
由於字串是一般文字物件,因此可以適用於多種應用。接下來我們看一下在 Dynamo 的 Core > String 中的一些主要動作:
這種方法可以按順序合併兩個字串。它會提取清單中的每個文字字串,然後建立一個合併後的字串。
以下表示連接三個字串:
按一下節點中心的「+/-」按鈕,可以加上或減去連接的字串。
輸出是一個連接後的字串,其中包括空格與標點。
接合方法非常類似於連接,只是會加入標點。
如果您曾使用 Excel,可能會遇到 CSV 檔案。CSV 表示以逗號分隔的值。可以使用逗號 (或此案例中的兩條虛線) 做為分隔符號搭配 String.Join 節點,以建立類似的資料結構。
以下影像表示接合兩個字串:
藉由分隔符號輸入,可以建立對接合後的字串進行分割的字串。
接下來從這一節的基本字串分割開始。首先,我們注意到書寫格式的依據是逗號。我們將使用此格式將每行分隔為個別項目。
將基準字串貼至 String 節點。
另一個 String 節點用來表示分隔符號。在此案例中,我們將使用逗號。
將 String.Split 節點加入圖元區,並連接至兩個字串。
輸出顯示我們現在已將各行分隔為個別元素。
現在,我們來到詩詞美妙的部分:最後兩行。原始的一節是一個資料項目。在第一步,我們已將此資料分隔為個別項目。現在,我們需要搜尋要尋找的文字。雖然我們 可以 透過選取清單中的最後兩個項目來實現這一點,但是如果是整本書,我們不希望通讀所有內容然後手動隔離元素。
我們不是手動搜尋,而是使用 String.Contains 節點對一組字元執行搜尋。這類似於文字處理器中的「尋找」指令。在此案例中,會傳回「true」,若項目中找到該子字串,會傳回「false」。
在 searchFor 輸入中,我們會定義將在該節中尋找的子字串。接下來使用 String 節點搭配文字「And miles」。
輸出是 false 與 true 的清單。在下一步中,我們使用此布林邏輯對元素進行篩選。
我們將使用 List.FilterByBoolMask 節點篩選出 false 與 true。「in」輸出會傳回「遮罩」輸入為「true」的陳述式,而「out」輸出會傳回「遮罩」輸入為「false」的陳述式。
「in」的輸出與預期相同,是該節詩句的最後兩行。
現在,我們希望合併這兩行,以重複這節詩句。檢視上一步的輸出時,我們注意有清單中有兩個項目:
透過兩個 List.GetItemAtIndex 節點,我們可以使用值 0 與 1 做為索引輸入以隔離項目。
每個節點的輸出依序提供最後兩行。
為了將這兩個項目合併為一個,我們使用 String.Join 節點:
加入 String.Join 節點後,我們注意到需要分隔符號。
為了建立分隔符號,我們在圖元區加入 String 節點,然後鍵入逗號。
最終的輸出已將最後兩個項目合併為一個。
這看起來似乎要執行很多工作才能隔離最後兩行,的確,字串作業通常需要某些前置工作。但這些作業可擴充,而且可以相對輕鬆地套用至大型資料集。如果您以參數方式使用工作表與互通性,請確保考慮到字串作業。
藉由邏輯,或者更明確地說,藉由條件邏輯,我們可以根據測試指定單一或一組動作。在評估測試時,我們可以使用表示 True
或 False
的布林值控制程式流程。
數值變數可以儲存所有範圍的不同數字。布林變數只能儲存兩個值,稱為 True 或 False、是或否、0 或 1。由於布林值範圍有限,因此很少使用布林值執行計算。
「If」陳述式是程式設計中的關鍵概念:「如果 這 是真的,則會發生 那件事,否則會發生 其他事。」陳述式所產生的動作由布林值驅動。在 Dynamo 中,可以採用多種方式定義「if」陳述式:
接下來瞭解使用條件「if」陳述式的三種有效節點中每種節點的簡單範例。
在此影像中,boolean 設為 true,這意味著結果是字串 「this is the result if true」。建立 If 陳述式的三個節點在這裡的工作方式完全相同。
再說一次,節點的工作方式完全相同。若 boolean 變更為 false,則結果是數字 Pi,如原始 If 陳述式所定義。
在下方的連結按一下,下載範例檔案。
附錄中提供完整的範例檔案清單。
接下來使用邏輯將數字清單分隔為偶數清單與奇數清單。
a.Number Range - 在圖元區加入一個數字範圍。
b.Numbers - 在圖元區加入三個數字節點。每個數字節點的值應為:0.0 (start)、10.0 (end) 與 1.0 (step)。
c.輸出 - 輸出是一個 11 個數字 (從 0 到 10) 的清單。
d.模除 (%)- 將 Number Range 連接至 x,將 2.0 連接至 y。這會計算清單中的每個數字除以 2 產生的餘數。此清單的輸出是 0 與 1 交替顯示的數值清單。
e.相等性測試 (==) - 在圖元區加入相等性測試。將 模除 輸出插入 x 輸入,將 0.0 插入 y 輸入。
f.Watch - 相等性測試的輸出是 true 與 false 交替顯示的清單。這些值用於分隔清單中的項目。0 (或 true) 表示偶數,1 (或 false) 表示奇數。
g.List.FilterByBoolMask - 此節點將根據輸入的布林值,將這些值篩選到兩個不同清單中。將原始的 Number Range 插入 list 輸入,將 相等性測試 輸出插入 mask 輸入。輸出 in 表示 true 值,而輸出 out 表示 false 值。
h.Watch - 結果是我們現在產生了偶數清單與奇數清單。我們已使用邏輯運算子將清單分隔為多種樣式!
接下來我們將建置第一個練習中建立的邏輯,將此設置套用到塑型作業中。
2.我們從上一個練習開始,採用相同的節點。唯一的例外 (除了變更格式) 是:
a.使用 Sequence 節點搭配這些輸入值。
b.我們取消插入 List.FilterByBoolMask 的 list 輸入。暫時將這些節點放在一旁,這在稍後的練習中會有用。
3.我們先為圖表建立不同群組,如以上影像所示。此節點群組表示定義曲線所用的參數式方程式。一些註記如下:
a.第一個 Number Slider 表示波浪的頻率,最小值為 1,最大值為 4,步長為 0.01。
b.第二個 Number Slider 表示波浪的振幅,最小值為 0,最大值為 1,步長為 0.01。
c.PolyCurve.ByPoints - 若複製以上節點圖,在 Dynamo 預覽視埠中的結果將是一條正弦曲線。
此處採用的輸入方式:對比較靜態的性質使用數字節點,對比較彈性的性質使用數字滑棒。我們希望保留在這一步開始時定義的原始數字範圍。但是,我們在此建立的正弦曲線應具有某些彈性。我們可以移動這些滑棒以觀看曲線對其頻率與振幅的更新。
4.我們將對定義進行一些調整,因此接下來看一下最終結果,以便可以參考得到的結果。之前,前兩個步驟是分別執行的,現在我們要連接兩者。我們將使用基準正弦曲線以驅動拉鍊元件的位置,並使用 true/false 邏輯實現大小方塊的交替變化。
a.Math.RemapRange - 接下來使用步驟 02 中建立的數字序列,透過重新對映範圍建立新的數字系列。步驟 01 的原始數字介於 0-100 之間。這些數字的範圍分別由 newMin 與 newMax 輸入限制為從 0 到 1。
5.建立 Curve.PointAtParameter 節點,然後連接步驟 04 的 Math.RemapRange 輸出做為其 param 輸入。
此步驟將沿曲線建立點。我們將數字重新對映到從 0 至 1 的範圍,因為 param 的輸入會尋找此範圍內的值。0 值表示起點,1 值表示終點。這當中的所有數字都會在 [0,1] 範圍內運算。
6.將 Curve.PointAtParameter 的輸出連接至 List.FilterByBoolMask,以分隔奇數和偶數索引的清單。
a.List.FilterByBoolMask - 將上一步的 Curve.PointAtParameter 插入 list 輸入。
b.Watch - in 的 Watch 節點與 out 的 Watch 節點顯示我們有兩個分別代表偶數索引與奇數索引的清單。這些點按照在曲線上的位置順序排序,我們將在下一步示範。
7.接下來,我們將使用步驟 05 中 List.FilterByBoolMask 的輸出結果,根據其索引產生不同大小的幾何圖形。
Cuboid.ByLengths - 重新建立以上影像顯示的連接,以產生一條沿正弦曲線的拉鍊。立方體在這裡只是方塊,我們將根據方塊中心的曲線點定義其大小。現在,模型中應該已清晰呈現偶數/奇數的區分邏輯。
a.偶數索引處的立方體清單。
b.奇數索引處的立方體清單。
瞧!您剛剛根據本練習示範的邏輯作業,以程式設計了定義幾何圖形維度的過程。
資料是程式的內容。它會通過線路向節點提供輸入,並在節點中經過處理變為新形式的輸出資料。接下來我們將檢閱資料的定義、構建方式,並開始在 Dynamo 中使用資料。
資料是一組定性或定量變數的值。資料最簡單的形式是數字,例如 0
、3.14
或 17
。但是資料也有許多不同類型:表示變動數字的變數 (height
)、字元 (myName
)、幾何圖形 (Circle
),或資料項目的清單 (1,2,3,5,8,13,...
)。
在 Dynamo 中,我們將資料加入/饋入節點的輸入埠 - 我們可以有資料而不採取動作,但必須有資料才能處理節點所代表的動作。將節點加入工作區後,如果未提供任何輸入,則結果將是函數,而不是動作本身的結果。
簡單資料
資料與動作 (節點) 已成功執行
無資料輸入的動作 (節點) 將傳回一般函數
注意空值 'null'
類型表示沒有資料。雖然這是抽象概念,但是您在使用視覺程式設計時可能已瞭解這一點。若某動作無法建立有效的結果,該節點會傳回空值。
測試空值及移除資料結構中的空值是建立功能強大的程式至關重要的構成部分。
執行視覺程式設計時,會很快產生大量資料,需要對其階層採用某種管理方式。承擔此角色的是資料結構,即我們儲存資料所採用的組織配置。資料結構的詳細資料及使用方法視程式設計語言而不同。
在 Dynamo 中,我們透過清單將階層加入至資料。我們將在後續章節中深入探索這一功能,不過接下來先從簡單的內容開始:
清單代表一種資料結構中放置的一系列項目:
我的手 (清單) 有五根手指 (項目)。
我所在的街道 (清單) 有十棟房子 (項目)。
Number Sequence 節點使用 start、amount 及 step 輸入來定義數字清單。使用這些節點,我們已建立兩個包含十個數字的獨立清單,其中一個清單的範圍是 100-109,另一個的範圍是 0-9。
List.GetItemAtIndex 節點會以特定的索引選取清單中的項目。若選擇 0,即可取得清單中的第一個項目 (在此案例中是 100)。
對第二個清單套用相同的程序,取得值 0,即清單中的第一個項目。
現在,我們使用 List.Create 節點將兩個清單合二為一。請注意,節點會建立 清單的清單。這會變更資料結構。
再次使用 List.GetItemAtIndex 時,將索引設定為 0,即可取得清單之清單中的第一個清單。這意味著將清單視為項目,這與其他指令碼撰寫語言略有不同。在稍後的章節中,我們將透過清單操控與資料結構取得更進階的結果。
理解 Dynamo 中資料階層的關鍵概念:對資料結構而言,會將清單視為項目。換言之,Dynamo 採用由上而下的程序瞭解資料結構。這意味著什麼?接下來我們舉例說明。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
在這第一個範例中,我們將組裝薄殼圓柱,這將使用我們在本節中討論的幾何圖形階層。
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 - 在此基礎上更進一步,我們在圖元區上加入了許多滑棒,並需要清理剛剛建立的工具介面。在滑棒上按一下右鍵,選取「更名...」,然後變更每個滑棒的名稱以適當描述其參數 (厚度、半徑、高度等等)。
9.現在,我們已建立良好的增厚圓柱。這目前只是一個物件,接下來我們瞭解如何建立保持動態連結的一系列圓柱。為了實現這一點,我們將建立圓柱清單,而不是使用單一項目。
加 (+) - 我們的目標是在已建立的圓柱旁,加入一列圓柱。若要在與目前圓柱相鄰的位置加入一個圓柱,需要考慮圓柱的半徑以及薄殼的厚度。我們將滑棒的兩個值相加,即可得到此數值。
10.此步驟較複雜,接下來我們慢慢完成:最終目標是建立數字清單,這些數字會定義圓柱列中每個圓柱的位置。
a.乘 - 首先,我們要將上一步驟中的值乘以 2。上一步驟中的值表示半徑,我們要將圓柱移動完整直徑的距離。
b.Number Sequence - 我們使用此節點建立一系列數字。乘 節點的第一個輸入是上一步驟中的 step 值。可以使用 Number 節點將 start 值設定為 0.0。
c.Integer Slider - 對於 amount 值,我們連接整數滑棒。這會定義所建立圓柱的數量。
d.輸出 - 此清單會顯示每個圓柱在陣列中的移動距離,並由原始滑棒進行參數式驅動。
11.此步驟足夠簡單 - 將上一步驟中定義的序列插入原始 Point.ByCoordinates 的 x 輸入。這將取代我們可以刪除的 pointX 滑棒。現在,我們將在視埠中看到一系列圓柱 (請確保整數滑棒大於 0)。
12.圓柱鏈仍動態連結至所有滑棒。調整每個滑棒可以查看定義更新!
建立:從頭開始建立或建構幾何圖形。例如圓。
動作:對物件執行動作。例如,調整圓的比例。
查詢:取得已存在物件的性質。例如,取得圓的半徑。
關閉預覽:節點下方出現灰色狀態列和眼睛圖示 ,即表示已關閉節點的幾何圖形預覽。
如果您的視覺程式包含警告或錯誤,Dynamo 會提供有關問題的其他資訊。任何顯示為黃色的節點會在其名稱上方顯示工具提示。將滑鼠懸停在警告 或錯誤 工具提示圖示上,可將其展開。
這樣可使實體布林運算成為功能強大且節省時間的流程。有三種實體布林運算,可區分要保留幾何圖形的哪些部分。
除了這三個作業,Dynamo 有 Solid.DifferenceAll 和 Solid.UnionAll 節點用於對多個實體執行「差集」和「聯集」作業。
直線由一組點組成,每條直線至少有 2 個點。在 Dynamo 中建立直線最常使用的其中一個方法是使用 Line.ByStartPointEndPoint
。
現在,上一步的眾多節點都沒問題,但工作量很大。若要建立更有效率的工作流程,請參閱 將 Dynamo 表示式的字串定義為一個節點。在接下來的一系列步驟中,我們將瞭解使用參數式方程式來繪製 Fibonacci 螺旋線。
現在我們已經建立圓形的鸚鵡螺殼,接下來使用參數式格線。我們將對 Fibonacci 螺旋線使用基本旋轉,以建立 Fibonacci 格線,並在對結果進行塑型。
透過安裝 ,可以延伸 Dynamo 的網格功能。Dynamo Mesh Toolkit 可提供工具,以匯入外部檔案格式的網格、根據 Dynamo 幾何圖形物件建立網格,並根據網格的頂點與索引手動建置網格。
請造訪 ,取得使用此套件的範例。
在此練習中,我們將使用字串的查詢與操控方法解構 Robert Frost 的 的最後一節。這並不是字串最實用的應用,但將其套用至清晰的節奏與韻律時,將有助於我們掌握概念字串的動作。
Object.IsNull
obj
布林
建立
Color.ByARGB 依 Alpha、紅色、綠色與藍色等組成來建構顏色。
Color Range 從開始顏色與結束顏色之間的顏色漸層取得顏色。
動作
Color.Brightness 取得此顏色的亮度值。
Color.Components 依照以下順序列示顏色組成:Alpha、紅色、綠色、藍色。
Color.Saturation 取得此顏色的飽和度值
Color.Hue 取得此顏色的色相值。
查詢
Color.Alpha 找出顏色的 Alpha 組成 (0 到 255)。
Color.Blue 找出顏色的藍色組成 (0 到 255)。
Color.Green 找出顏色的綠色組成 (0 到 255)。
Color.Red 找出顏色的紅色組成 (0 到 255)。
建立
GeometryColor.ByGeometryColor 使用顏色顯示幾何圖形。
動作
View.Watch 視覺化節點的輸出。
View.Watch 3D 展示幾何圖形的動態預覽。
動作
Boolean 在 true 與 false 之間進行選取。
Code Block 允許直接編寫 DesignScript 程式碼。
Directory Path 可讓您選取系統上的目錄,以取得其路徑
File Path 可讓您選取系統中的檔案,以取得其檔名
Integer Slider 產生整數值的滑棒。
編號 建立數字。
Number Slider 產生數值的滑棒。
String 建立字串。
Object.IsNull 判定給定物件是否為空值。
建立
List.Create 從給定的輸入製作新清單。
List.Combine 將結合器套用至兩個序列中的每個元素
Number Range 建立指定範圍內的一系列數字
Number Sequence 建立一系列數字。
動作
List.Chop 將一個清單細分為一組清單 (其中每個清單包含指定數量的項目)。
List.Count 傳回給定清單中儲存的項目數目。
List.Flatten 依特定數量展開清單的巢狀清單。
List.FilterByBoolMask 查看個別布林清單中的對應索引來篩選順序。
List.GetItemAtIndex 取得給定清單中位於指定索引處的項目。
List.Map 將函數套用至清單的所有元素,從結果產生新清單
List.Reverse 建立新的清單,其中包含給定清單的項目,但以逆向順序排列
List.ReplaceItemAtIndex 取代給定清單中位於指定索引處的項目。
List.ShiftIndices 將清單中的索引向右移動給定數量
List.TakeEveryNthItem 在給定的偏移之後,擷取給定清單中索引是給定值倍數的項目。
List.Transpose 在清單的清單中交換列與欄。如果某些列短於其他列,會在結果陣列中插入空值作為預留位置,以便其永遠為矩形
動作
If 條件陳述式。檢查測試輸入的布林值。如果測試輸入為 true,結果會輸出真實的輸入,否則結果會輸出虛假的輸入。
動作
Math.Cos 計算角度的餘弦值。
Math.DegreesToRadians 將以度表示的角度轉換為以弳度表示的角度。
Math.Pow 計算數值的指定次方。
Math.RadiansToDegrees 將以弳度表示的角度轉換為以度表示的角度。
Math.RemapRange 調整數字清單的範圍,同時保留分配比率。
Math.Sin 計算角度的正弦值。
Formula 運算數學公式。使用 NCalc 進行運算。請參閱http://ncalc.codeplex.com
Map 將值對映到輸入範圍
動作
String.Concat 將多個字串連接成單一字串。
String.Contains 判定給定的字串是否包含給定的子字串。
String.Join 將多個字串連接成單一字串,同時在接合的每個字串之間插入給定的分隔符號。
String.Split 將單一字串分割為字串清單,分割位置由給定的分隔符號字串決定。
String.ToNumber 將字串轉換為整數或倍精數。
建立
Circle.ByCenterPointRadius 使用輸入中心點和世界 XY 平面中的半徑,並以世界 Z 為法線,來建立一個圓。
Circle.ByPlaneRadius 在輸入平面建立一個中心點在輸入平面原點 (根)、具有給定半徑的圓。
建立
CoordinateSystem.ByOrigin 建立一個原點在輸入點、X 與 Y 軸分別設定為 WCS X 軸與 Y 軸的座標系統
CoordinateSystem.ByCyclindricalCoordinates 以相對於指定座標系統的指定圓柱座標參數,建立一個座標系統
建立
Cuboid.ByLengths 建立一個中心點在 WCS 原點,且具有長度、寬度、高度的立方體。
Cuboid.ByLengths (origin)
建立一個中心點在輸入點,具有指定寬度、長度及高度的立方體。
Cuboid.ByLengths (coordinateSystem)
建立一個中心點在 WCS 原點,且具有長度、寬度、高度的立方體。
Cuboid.ByCorners
建立一個從低點跨距到高點的立方體。
Cuboid.Length
傳回立方體的輸入尺寸,而不是實際世界的空間尺寸。
Cuboid.Width
傳回立方體的輸入尺寸,而不是實際世界的空間尺寸。
Cuboid.Height
傳回立方體的輸入尺寸,而不是實際世界的空間尺寸。
BoundingBox.ToCuboid
取得邊界框做為實體立方體
動作
Curve.Extrude (distance) 在法線向量的方向擠出曲線。
Curve.PointAtParameter 取得曲線上位於 StartParameter() 與 EndParameter() 之間指定參數處的點。
動作
Geometry.DistanceTo 取得此幾何圖形與另一個幾何圖形的距離。
Geometry.Explode 將複合元素或非單獨元素分開為組成部分
Geometry.ImportFromSAT 匯入的幾何圖形的清單
Geometry.Rotate (basePlane) 繞平面原點及法線將物件旋轉指定度數。
Geometry.Translate 將任何幾何圖形類型在給定方向平移給定距離。
建立
Line.ByBestFitThroughPoints 建立一條與點的散射圖最近似的線。
Line.ByStartPointDirectionLength 建立一條從某點開始,沿向量方向延伸指定長度的直線。
Line.ByStartPointEndPoint 在兩個輸入點之間建立一條直線。
Line.ByTangency 建立一條在輸入曲線的參數點位置與輸入曲線相切的線。
查詢
Line.Direction 曲線的方向。
建立
NurbsCurve.ByControlPoints 使用明確控制點建立 BSplineCurve。
NurbsCurve.ByPoints 透過在點之間進行內插來建立 BSplineCurve
建立
NurbsSurface.ByControlPoints 使用明確控制點建立一個具有指定 U 與 V 次數的 NurbsSurface。
NurbsSurface.ByPoints 建立一個具有指定內插點及 U 與 V 次數的 NurbsSurface。產生的曲面將通過所有點。
建立
Plane.ByOriginNormal 建立一個中心點在根點,具有輸入法線向量的平面。
Plane.XY 在世界 XY 建立一個平面
建立
Point.ByCartesianCoordinates 在有 3 個直角座標的給定座標系統中產生一點
Point.ByCoordinates (2d) 在 XY 平面中給定 2 個直角座標產生一點。Z 分量是 0。
Point.ByCoordinates (3d) 給定 3 個直角座標產生一點。
Point.Origin 取得原點 (0,0,0)
動作
Point.Add 對點加入向量。與 Translate (Vector) 相同。
查詢
Point.X 取得點的 X 分量
Point.Y 取得點的 Y 分量
Point.Z 取得點的 Z 分量
建立
Polycurve.ByPoints 根據連接點的一系列線建立 PolyCurve。若要取得封閉的曲線,最後一個點應該與起點位於相同的位置。
建立
Rectangle.ByWidthLength (Plane) 建立一個中心點在輸入平面根,具有輸入寬度 (平面 X 軸長度) 與長度 (平面 Y 軸長度) 的矩形。
建立
Sphere.ByCenterPointRadius 建立一個中心點在輸入點,具有給定半徑的實體圓球。
建立
Surface.ByLoft 透過在輸入斷面曲線之間進行斷面混成來建立曲面
Surface.ByPatch 透過填滿輸入曲線所定義之封閉邊界的內部來建立曲面。
動作
Surface.Offset 沿曲面法線方向,將曲面偏移指定的距離
Surface.PointAtParameter 傳回指定的 U 與 V 參數處的點。
Surface.Thicken 將曲面增厚為實體,沿曲面法線的方向朝曲面兩側擠出。
建立
UV.ByCoordinates 從兩個倍精數建立 UV。
建立
Vector.ByCoordinates 由 3 個歐幾里得座標形成一個向量
Vector.XAxis 取得標準 X 軸向量 (1,0,0)
Vector.YAxis 取得標準 Y 軸向量 (0,1,0)
Vector.ZAxis 取得標準 Z 軸向量 (0,0,1)
動作
Vector.Normalized 取得向量的正規化版本
建立
CoordinateSystem.ByOrigin 建立一個原點在輸入點、X 與 Y 軸分別設定為 WCS X 軸與 Y 軸的座標系統
CoordinateSystem.ByCyclindricalCoordinates 以相對於指定座標系統的指定圓柱座標參數,建立一個座標系統
+ 加
- 減
* 乘
/ 除
% 模除會計算第一個輸入除以第二個輸入後的餘數
< 小於
> 大於
== 相等性會測試兩個值是否相等。
對於營造引人注目的視覺效果以及彩現視覺程式輸出的差異而言,顏色是很棒的資料類型。使用抽象資料及不同的數字時,有時很難查看變更的項目與變更程度。顏色在這裡大有用武之地。
在 Dynamo 中使用 ARGB 輸入建立顏色。這對應於 Alpha、紅色、綠色與藍色通道。Alpha 代表顏色的 透明度,而其他三項用作主要顏色以協同產生顏色的整個光譜。
ARGB 顏色 (Color.ByARGB)
A、R、G、B
color
以下表格中的顏色會查詢用於定義顏色的性質:Alpha、紅色、綠色與藍色。請注意,Color.Components 節點會提供所有四項作為不同輸出,因此該節點更適合查詢顏色的性質。
Alpha (Color.Alpha)
color
A
紅色 (Color.Red)
color
R
綠色 (Color.Green)
color
G
藍色 (Color.Blue)
color
B
組成 (Color.Components)
color
A、R、G、B
以下表格中的顏色對應於 HSB 顏色空間。將顏色分為色相、飽和度與亮度可以更直觀地解譯顏色:顏色應該是怎樣的?顏色是什麼色彩?顏色的明暗程度應該是怎樣的?這是分別劃分的色相、飽和度與亮度。
色相 (Color.Hue)
color
色相
飽和度 (Color.Saturation)
color
飽和度
亮度 (Color.Brightness)
color
亮度
顏色範圍類似於#part-ii-from-logic-to-geometry練習的 Remap Range 節點:可將數字清單重新對映到其他範圍。但它並非對映到 數字 範圍,而是根據介於 0 至 1 的輸入數字對映到 顏色漸層。
目前的節點運作正常,但第一次就要讓所有內容正常運作可能會有些困難。熟悉顏色漸層的最佳方式是以互動方式對其進行測試。接下來我們進行快速練習,以檢閱如何設置輸出顏色對應於數字的漸層。
定義三種顏色:使用 Code Block 節點,透過插入 0 與 255 的適當組合來定義 red、green 與 blue。
建立清單: 將三種顏色合併到一個清單中。
定義索引:建立清單以定義每種顏色的掣點位置 (從 0 至 1)。請注意值 0.75 為綠色。這會在顏色範圍滑棒上,將綠色置於水平漸層長度的 3/4 處。
Code Block:要轉換為顏色的輸入值 (介於 0 至 1 之間)。
使用 Display.ByGeometry 節點可以在 Dynamo 視埠中查看顏色幾何圖形。這有助於區分不同類型的幾何圖形、展示參數式概念,或定義模擬的分析圖例。輸入很簡單:幾何圖形與顏色。若要建立類似上面影像的漸層,請將顏色輸入連接至 Color Range 節點。
透過 Display.BySurfaceColors 節點,我們可以使用顏色對映整個曲面上的資料!此功能帶來某些振奮人心的可能性,可以對透過離散分析 (例如日光、能源及鄰近) 取得的資料進行視覺化。在 Dynamo 中將顏色套用至曲面類似於在其他 CAD 環境中將材質套用至材料。接下來在以下簡短練習中示範如何使用此工具。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
本練習的內容主要是以參數式方法控制顏色及幾何圖形。幾何圖形是一個基本螺旋線,我們下面使用 Code Block 定義。這是快速輕鬆的參數式函數建立方式,由於我們的焦點是顏色 (而不是幾何圖形),因此我們使用程式碼區塊高效建立螺旋線,而不贅述圖元區。隨著手冊改用更先進的材料,我們將更頻繁地使用程式碼區塊。
Code Block: 定義包含上述公式的兩個程式碼區塊。這是快速建立螺旋線的參數式方法。
Point.ByCoordinates:將程式碼區塊的三項輸出插入節點的座標。
現在我們可以看到建立螺旋線的一系列點。下一步是建立通過這些點的曲線,以便能看到螺旋。
PolyCurve.ByPoints: 將 Point.ByCoordinates 輸出連接至節點的 points 輸入。我們會得到一條螺旋曲線。
Curve.PointAtParameter: 將 PolyCurve.ByPoints 輸出連接至 curve 輸入。此步驟的目的是建立沿曲線滑動的參數式牽引點。由於曲線透過參數對點進行演算,因此我們需要輸入 0 與 1 之間的 param 值。
Number Slider: 加入圖元區後,將 min 值變更為 0.0,max 值變更為 1.0,step 值變更為 0.01。將滑棒輸出插入 Curve.PointAtParameter 的 param 輸入。現在,我們將看到沿螺旋線的長度由滑棒的百分比表示的點 (0 表示起點,1 表示終點)。
建立參考點後,現在我們比較從參考點到螺旋原始定義點的距離。此距離值將驅動幾何圖形與顏色。
Geometry.DistanceTo: 將 Curve.PointAtParameter 輸出連接至 輸入。將 Point.ByCoordinates 連接至 geometry 輸入。
Watch: 產生的結果將顯示從每個螺旋點至曲線上參考點之距離的清單。
下一步驟是使用從螺旋點至參考點之距離的清單來驅動參數。我們將使用這些距離值來定義曲線上一系列圓球的半徑。若要讓圓球保持合適的大小,我們需要 重新對映 距離值。
Math.RemapRange: 將 Geometry.DistanceTo 輸出連接至數字輸入。
Code Block: 將值為 0.01 的程式碼區塊連接至 newMin 輸入,將值為 1 的程式碼區塊連接至 newMax 輸入。
Watch: 將 Math.RemapRange 輸出連接至一個節點,將 Geometry.DistanceTo 輸出連接至另一個節點。比較結果。
此步驟已將距離清單重新對映到較小的範圍。我們可以採用合適的任何方式編輯 newMin 與 newMax 值。這些值將重新對映,並在整個範圍內具有相同的 分配比率
Sphere.ByCenterPointRadius: 將 Math.RemapRange 輸出連接至 radius 輸入,將原始 Point.ByCoordinates 輸出連接至 centerPoint 輸入。
變更數字滑棒的值,查看圓球大小更新。我們現在有一個參數式波浪
圓球的大小展示出由曲線上的參考點定義的參數式陣列。接下來我們應用相同的概念,使用圓球半徑來驅動其顏色。
Color Range: 加入圖元區頂部。懸停在 value 輸入上時,我們會注意到要求的數字介於 0 與 1 之間。我們需要重新對映 Geometry.DistanceTo 輸出中的數字,以便其與此範圍相容。
Sphere.ByCenterPointRadius: 我們暫時停用此節點的預覽 (按一下右鍵 >「預覽」)
Math.RemapRange: 此程序似乎應該很熟悉。將 Geometry.DistanceTo 輸出連接至數字輸入。
Code Block: 與之前的步驟類似,為 newMin 輸入建立值 0,為 newMax 輸入建立值 1。請注意,在此案例中,我們可以從一個程式碼區塊定義兩個輸出。
Color Range: 將 Math.RemapRange 輸出連接至 value 輸入。
Color.ByARGB: 這是我們為了建立兩種顏色將執行的作業。雖然此程序可能貌似有些難,但是它與其他軟體中的 RGB 顏色相同,我們只是剛剛使用視覺程式設計來執行此作業而已。
Code Block: 建立 0 與 255 兩個值。將兩個輸出插入與以上影像相同的兩個 Color.ByARGB 輸入 (或建立您最愛的兩種顏色)。
Color Range:colors 輸入要求提供顏色清單。我們需要使用上一步驟中建立的兩種顏色建立此清單。
List.Create: 將兩種顏色合併到一個清單中。將輸出插入 Color Range 的 colors 輸入。
Display.ByGeometryColor: 將 Sphere.ByCenterPointRadius 連接至 geometry 輸入,將 Color Range 連接至 color 輸入。現在,我們已在整個曲線範圍內建立平滑的漸層。
如果我們變更之前定義中 Number Slider 的值,顏色與大小就會更新。在此案例中,顏色與半徑大小直接相關:我們現在已在兩個參數之間建立視覺連結!
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
首先,我們需要建立 (或參考) 將用作 Display.BySurfaceColors 節點輸入的曲面。在此範例中,我們將在正弦及餘弦曲線之間進行斷面混成。
此節點群組將沿 Z 軸建立點,然後根據正弦及餘弦函數將其取代。然後,使用兩點清單產生 NURBS 曲線。
Surface.ByLoft:在清單的 NURBS 曲線之間產生內插曲面。
File Path:選取將針對下游像素資料進行取樣的影像檔案
使用 File.FromPath 將檔案路徑轉換為檔案,然後傳送至 Image.ReadFromFile 以輸出供取樣的影像
Image.Pixels:輸入影像,並提供沿影像的 x 和 y 維度將使用的取樣值。
滑棒:提供 Image.Pixels 的取樣值
Display.BySurfaceColors:分別沿 X 與 Y 軸在整個曲面內對映一系列顏色值
取樣解析度為 400x300 之輸出曲面的特寫預覽
加 (+)
var[]...[]、var[]...[]
var[]...[]
減 (-)
var[]...[]、var[]...[]
var[]...[]
乘 (*)
var[]...[]、var[]...[]
var[]...[]
除 (/)
var[]...[]、var[]...[]
var[]...[]
If (If)
test、true、false
result
Formula (IF(x,y,z))
x、y、z
result
Code Block ((x?y:z);)
x? y, z
result
清單是我們組織資料的方式。在您電腦的作業系統上,您具有檔案和資料夾。在 Dynamo 中,我們可以分別將這些視為項目和清單。與您的作業系統類似,有許多方式可建立、修改和查詢資料。在本章中,我們將詳細說明 Dynamo 中管理清單的方式。
清單是元素 (即項目) 的集合。例如一束香蕉。每個香蕉都是清單 (即香蕉束) 中的項目。揀選一束香蕉比分別揀選每個香蕉更容易,依據資料結構中的參數式關係對元素進行分組也是如此。
相片由 Augustus Binu 拍攝。
購買雜貨時,我們會將購買的所有商品放入袋中。這個袋子也是清單。如果要製作香蕉麵包,我們需要 3 束香蕉 (我們將製作 大量 香蕉麵包)。袋子表示香蕉束的清單,而每束香蕉表示香蕉的清單。袋子是清單的清單 (二維),而香蕉束是清單 (一維)。
在 Dynamo 中,清單資料具有順序,每個清單中第一個項目的索引都是「0」。以下我們將討論在 Dynamo 中如何定義清單,以及多個清單如何彼此相關。
起初有一點可能看起來很奇怪,那就是清單的第一個索引始終是 0,而不是 1。因此,在談到清單的第一個項目時,實際指的是索引 0 對應的項目。
例如,如果您數數右手手指的數量,很可能會從 1 數到 5。但是,如果將手指放在清單中,Dynamo 會為其指定從 0 至 4 的索引。雖然這對於程式設計的初學者而言可能有些奇怪,但從零開始的索引是多數運算系統中的標準做法。
請注意,我們的清單中仍有 5 個項目,清單恰好使用從零開始的計數系統。清單中正在儲存的項目不一定是數字。它們可以是 Dynamo 支援的任何資料類型,例如點、曲線、曲面、族群等。
a.索引
b.點
c.項目
通常,查看清單中所儲存資料類型的最簡單方法,是將觀看節點連接至另一個節點的輸出。依預設,觀看節點會在清單的左側自動展示所有索引,並在右側展示資料項目。
使用清單時,這些索引是非常重要的元素。
對清單而言,輸入與輸出視使用的 Dynamo 節點而有所不同。例如,接下來我們使用包含 5 個點的清單,並將此輸出連接至兩個不同的 Dynamo 節點:PolyCurve.ByPoints 與 Circle.ByCenterPointRadius:
PolyCurve.ByPoints 的 points 輸入是尋找 「Point[]」。這表示點清單
PolyCurve.ByPoints 的輸出是從一個包含五個點的清單建立的一條 PolyCurve。
Circle.ByCenterPointRadius 的 centerPoint 輸入要求 「Point」。
Circle.ByCenterPointRadius 的輸出是一個包含五個圓的清單,其中圓的中心對應於點的原始清單。
PolyCurve.ByPoints 與 Circle.ByCenterPointRadius 的輸入資料相同,但是 Polycurve.ByPoints 節點的結果是一條 PolyCurve,而 Circle.ByCenterPointRadius 節點的結果是中心位於每個點的 5 個圓。以直觀方式很容易理解這一點:polycurve 繪製為連接 5 個點的曲線,而圓會在每個點建立不同的圓。資料出現什麼情況?
將游標懸停在 Polycurve.ByPoints 的 points 輸入上方,可以看到輸入在尋找 「Point[]」。注意末尾的中括號。這表示點的清單,若要建立 polycurve,輸入需要是每個 polycurve 的清單。因此,此節點會將每個清單濃縮到一條 polycurve 中。
另一方面,Circle.ByCenterPointRadius 的 centerPoint 輸入要求 「Point」。此節點會尋找一個點,做為項目以定義圓的中心點。因此輸入資料會產生五個圓。辨識 Dynamo 中這些輸入的差異可協助您更好地瞭解在管理資料時節點的作業方式。
資料相符是沒有明確解決方案的問題。在節點對大小不同的輸入具有存取權時,會發生此問題。變更資料相符演算法會產生截然不同的結果。
想像在點之間建立直線段的節點 (Line.ByStartPointEndPoint)。它有兩個輸入參數,都提供點座標:
最簡單的方式是逐一連接輸入,直到其中一個串流結束為止。這稱為「最短清單」演算法。這是 Dynamo 節點的預設行為:
「最長清單」演算法會保持連接輸入,重複使用元素,直到所有串流結束為止:
最後,「笛卡兒積」方法會產生所有可能的連接:
您可以看到,可以採用不同方法在這組點之間繪製直線。在節點的中心按一下右鍵,然後選擇「交織」功能表,可以找到「交織」選項。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
為了示範下面的交織作業,我們將使用此基準檔案來定義最短清單、最長清單及笛卡兒積。
我們將變更 Point.ByCoordinates 的交織,但不會變更上述圖表的任何其他內容。
選擇 最短清單 做為交織選項 (也是預設選項),我們會得到一條由五個點組成的基本對角線。五個點是較短清單的長度,因此最短清單交織會在到達一個清單的結尾後停止。
如果將交織變更為 最長清單,我們會得到一條垂直延伸的對角線。運用與概念圖相同的方法,含 5 個項目的清單中的最後一個項目將重複,以達到較長清單的長度。
如果將交織變更為 笛卡兒積,我們會得到各個清單之間的每種組合,產生一個 5x10 的點格線。這個資料結構等同於上面的概念圖顯示的笛卡兒積,只是現在資料是一個清單的清單。如果連接 polycurve,我們可以看到每個清單都由其 X 值定義,因此產生一列垂直線。
進一步深入探討,接下來我們在階層中加入更多層。資料結構的擴展範圍遠超二維清單的清單。由於在 Dynamo 中清單是其本身的項目,因此我們可以建立維度儘可能多的資料。
我們在此將使用的類比是俄羅斯套娃。可將每個清單視為包含多個項目的一個容器。每個清單都有自己的性質,也可將每個清單視為自己的物件。
一組俄羅斯套娃 (相片由 Zeta 拍攝) 可類比為 n 維清單。每層代表一個清單,每個清單包含其內部的項目。在 Dynamo 的案例中,每個容器內部可以有多個容器 (表示每個清單的項目)。
很難以視覺方式解釋 n 維清單,但我們在本章設置了一些練習,以著重說明使用超過二維的清單。
對映可能是 Dynamo 中資料管理最複雜的部分,在使用複雜的清單階層時尤其重要。透過以下的一系列練習,我們將展示在資料變成多維時,何時使用對映與組合。
上一節提供了 List.Map 與 List.Combine 的初步介紹。在以下最後一個練習中,我們將對複雜的資料結構使用這些節點。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
此練習是一系列三個練習中的第一個,著重講解匯入的幾何圖形。在這一系列練習中,每個部分的資料結構複雜性都有提升。
先從練習檔案資料夾中的 .sat 檔案開始。我們可以使用 File Path 節點擷取此檔案。
使用 Geometry.ImportFromSAT,將幾何圖形匯入為 Dynamo 預覽中的兩個曲面。
對於此練習,我們希望執行簡單作業,並使用其中一個曲面。
接下來選取索引 1 以擷取上方的曲面。我們使用 List.GetItemAtIndex 節點執行此作業。
關閉 Geometry.ImportFromSAT 預覽的幾何圖形預覽。
下一步是將曲面分割為點的格線。
1.使用 Code Block,插入以下兩行程式碼:
0..1..#10;
0..1..#5;
2.使用 Surface.PointAtParameter,將兩個 Code Block 的值連接至 u 與 v。將此節點的 交織 變更為 「笛卡兒積」。
3.輸出顯示了資料結構,在 Dynamo 預覽中也可以看到資料結構。
接下來,使用上一步的「點」沿曲面產生十條曲線。
為了查看資料結構的組織方式,接下來將 NurbsCurve.ByPoints 連接至 Surface.PointAtParameter 的輸出。
您現在可以關閉 List.GetItemAtIndex 節點的預覽,以便看到更清楚的結果。
對於清單的清單,基本 List.Transpose 會翻轉欄與列。
將 List.Transpose 的輸出連接至 NurbsCurve.ByPoints,現在曲面上有五條曲線處於水平狀態。
您可以關閉上一步 NurbsCurve.ByPoints 節點的預覽,得到與影像相同的結果。
接下來提高複雜性。假設我們要對上一個練習中建立的曲線執行作業。我們可能希望讓這些曲線與另一個曲面相關,並在這些曲線之間執行斷面混成。這需要更多注意資料結構,但基本邏輯是相同的。
從上一個練習的步驟開始,使用 List.GetItemAtIndex 節點隔離所匯入幾何圖形的上方曲面。
使用 Surface.Offset,將曲面偏移值 10。
使用上一個練習中的相同方式,定義包含以下兩行程式碼的 Code Block:
0..1..#10;
0..1..#5;
將這些輸出連接至兩個 Surface.PointAtParameter 節點 (每個節點的 交織 設定為 「笛卡兒積」 )。其中一個節點連接至原始曲面,而另一個連接至偏移曲面。
關閉這些曲面的預覽。
與上一個練習中相同,將輸出連接至兩個 NurbsCurve.ByPoints 節點。結果會顯示與兩個曲面對應的曲線。
使用 List.Create,可以將兩組曲線合併至一個清單的清單中。
請注意輸出包含兩個清單,每個清單包含十個項目,表示每個清單連接一組 Nurbs 曲線。
透過執行 Surface.ByLoft,我們能以視覺方式瞭解該資料結構。節點會對每個子清單中的所有曲線執行斷面混成。
關閉上一步 Surface.ByLoft 節點的預覽。
記住,使用 List.Transpose,我們將翻轉所有欄與列。此節點會將各包含十條曲線的兩個清單轉換為各包含兩條曲線的十個清單。現在,我們的每條 NURBS 曲線都與另一個曲面上的相鄰曲線相關。
使用 Surface.ByLoft,我們將產生稜紋結構。
接下來,我們將示範實現此結果的替代程序
在開始之前,請關閉上一步的 Surface.ByLoft 預覽,以避免混淆。
List.Transpose 的替代方法是 List.Combine。此作業會對每個子清單使用 「結合器」。
在此案例中,我們將 List.Create 用作 「結合器」,它將建立包含子清單中所有項目的清單。
使用 Surface.ByLoft 節點,我們將取得與上一步驟中相同的曲面。在此案例中,轉置更易於使用,但是在資料結構變得更複雜時,List.Combine 更可靠。
後退幾個步驟,如果我們要切換稜紋結構中曲線的方位,需要在連接至 NurbsCurve.ByPoints 之前,使用 List.Transpose。這將翻轉欄與列,產生 5 個水平肋。
現在,我們要更進一步。在本練習中,我們將使用兩個匯入的曲面建立複雜的資料階層。我們的目標仍是使用相同的基本邏輯完全相同的作業。
從上一個練習中所匯入的檔案開始。
與上一個練習中相同,使用 Surface.Offset 節點以偏移值 10。
請注意,輸出顯示我們已使用偏移節點建立了兩個曲面。
使用上一個練習中的相同方式,定義包含以下兩行程式碼的 Code Block:
0..1..#20;
0..1..#20;
將這些輸出連接至兩個 Surface.PointAtParameter 節點 (每個節點的交織設定為 「笛卡兒積」 )。其中一個節點連接至原始曲面,而另一個連接至偏移曲面。
與上一個練習中相同,將輸出連接至兩個 NurbsCurve.ByPoints 節點。
查看 NurbsCurve.ByPoints 的輸出,請注意這是包含兩個清單的清單,較上一個練習更複雜。資料由基本曲面進行分類,因此我們將另一個層加入至構建的資料。
請注意,Surface.PointAtParameter 節點中的狀況變得更複雜。在此案例中,將產生清單的清單的清單。
在繼續之前,請先關閉既有曲面的預覽。
使用 List.Create 節點,將多條 Nurbs 曲線合併為一個資料結構,建立清單的清單的清單。
透過連接 Surface.ByLoft 節點,將取得原始曲面的某個版本,因為每個曲面都位於自己從原始資料結構建立的清單中。
在上一個練習中,我們可以使用 List.Transpose 建立稜紋結構。在本練習中,此方法將無效。轉置應該用於二維清單,而由於我們使用的是三維清單,因此「翻轉欄與列」的作業無法輕鬆執行。請記住,清單是物件,因此 List.Transpose 會翻轉無子清單的清單,但不會翻轉 NURBS 曲線與階層中下一層級內的一個清單。
List.Combine 在本練習中更有效。面對更複雜的資料結構時,我們會使用 List.Map 與 List.Combine 節點。
將 List.Create 用作 「結合器」 會建立更有效的資料結構。
資料結構仍需要在階層中的下一層級進行轉置。若要執行此作業,我們將使用 List.Map。此工作類似於 List.Combine,只是使用一個輸入清單,而不是至少兩個。
我們將套用至 List.Map 的函數是 List.Transpose,它將翻轉主要清單中子清單的欄與列。
最後,我們可以使用正確的資料階層對 Nurbs 曲線進行斷面混成,從而產生稜紋結構。
我們使用 Surface.Thicken 節點,使用如圖所示的輸入設定,對幾何圖形加入一些深度。
加入一個支撐這兩個結構的曲面會很好,因此請加入另一個 Surface.ByLoft 節點,並使用較早步驟中的第一個 NurbsCurve.ByPoints 輸出做為輸入。
預覽變得雜亂時,請在每個節點上按一下右鍵,然後取消勾選「預覽」來關閉這些節點的預覽,以更清楚地查看結果。
增厚這些所選曲面,我們的連接即可完成。
這並不是最舒服的搖椅,但是會取得大量資料。
最後一步,我們將反轉帶條紋部分的方向。在上一個練習中使用轉置時,我們曾執行過與此類似的作業。
由於階層中還有一層,因此我們需要搭配使用 List.Map 與 List.Tranpose 函數來變更 Nurbs 曲線的方向。
我們希望提高踏板數量,因此可以將 Code Block 變更為
0..1..#20;
0..1..#30;
第一個版本的搖椅造型優美,因此我們的第二個模型將作為運動設備提供在野外的休息功能。
接下來在階層中再加入一層。我們以最初範例中的一副紙牌為例,如果製作容納多副紙牌的盒子,那麼現在盒子就代表各副紙牌的清單,而每副紙牌代表紙牌的清單。這是清單的清單。為了說明本節內容,我們進行類比,以下影像包含多疊硬幣,每疊包含多個一美分硬幣。
相片由 Dori 拍攝。
我們可以對清單的清單執行哪些查詢?這將存取既有性質。
有幾種硬幣類型?2.
硬幣類型值?1 美分和 25 美分。
25 美分硬幣的材料是什麼?75% 的銅與 25% 的鎳。
一美分硬幣的材料是什麼?97.5% 的鋅與 2.5% 的銅。
我們可以對清單的清單執行哪些動作?這會根據指定的作業變更清單的清單。
選取特定的一疊 25 美分硬幣或一美分硬幣。
選取特定的一枚 25 美分硬幣或一美分硬幣。
重新排列各疊 25 美分硬幣與一美分硬幣。
攪亂各疊硬幣。
再說一次,對於上述每項作業,Dynamo 都有類比節點。由於我們使用的是抽象資料,而不是實際物件,因此需要採用一組規則以管理資料階層上下移動的方式。
處理清單的清單時,資料分層放置且非常複雜,但是您可藉此執行某些良好的參數式作業。在以下課程中,我們將分類講解基礎知識,並討論更多作業。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
本節將瞭解的基本概念:Dynamo 將清單視為其本身的物件。此由上而下的階層在開發時,考慮到以物件為導向的程式設計。Dynamo 並非使用類似於 List.GetItemAtIndex 的指令選取子元素,而是選取資料結構中的主要清單索引。項目可以是另一個清單。接下來我們使用範例影像進行分解說明:
我們使用 Code Block 定義了兩個範圍:
0..2; 0..3;
這些範圍連接至 Point.ByCoordinates 節點,交織設定為 「笛卡兒積」。這會建立點的格線,也會傳回清單的清單作為輸出。
請注意,Watch 節點可產生 3 個清單,每個清單中包含 4 個項目。
使用 List.GetItemAtIndex 時,透過索引 0,Dynamo 會選取第一個清單及其所有內容。其他程式可能會在資料結構中選取每個清單的第一個項目,但 Dynamo 在處理資料時,採用由上而下的階層。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
平坦化會移除資料結構中的所有資料層。若您的作業不需要資料階層,這會很有用,但是存在風險,因為它會移除資訊。以下範例將展示對資料清單進行平坦化的結果。
在 Code Block 中插入一行程式碼以定義範圍:
-250..-150..#4;
透過將 Code Block 插入 Point.ByCoordinates 節點的 x 與 y 輸入,我們將交織設定為 「笛卡兒積」 以取得點的格線。
Watch 節點顯示我們有一個清單的清單。
PolyCurve.ByPoints 節點將參考每個清單,並建立各自的 polycurve。請注意,在 Dynamo 預覽中有四個 polycurve,分別代表格線的每一列。
透過在 polycurve 節點前插入 平坦化,我們建立了一個所有點的清單。PolyCurve.ByPoints 節點會參考清單來建立一條曲線,由於所有點都在一個清單上,因此我們將得到通過整個清單中所有點的一條曲折 polycurve。
此外,還提供對隔離層的資料進行平坦化的選項。使用 List.Flatten 節點,您可以定義從階層頂部進行平坦化的資料層數量。如果您對運用複雜的資料結構感到吃力,而這些資料結構不一定與您的工作流程相關,則該工具確實非常有用。其他選項會將平坦化節點用作 List.Map 中的函數。我們將在下面詳細討論 List.Map。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
執行參數式塑型時,有時您也會想要對既有清單修改資料結構。有許多節點可用於實現此功能,細分是最基本的版本。使用細分,我們可以將清單分割為包含一定數量項目的子清單。
「細分」指令可根據指定的清單長度分割清單。在某種程度上,細分與平坦化恰恰相反:細分不是移除資料結構,而是在其中加入新層。對於諸如以下範例等幾何圖形作業,此工具很有用。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.Map/Combine 會對輸入清單套用一個設定好的函數,但下一階層的清單。組合與對映相同,只是組合可以有多個輸入對應於給定函數的輸入。
注意:此練習使用舊版本的 Dynamo 建立。大部分 List.Map 功能已透過增加 List@Level 功能解決。如需更多資訊,請參閱以下的 List@Level。
我們回顧上一節的 List.Count 節點來快速介紹。
List.Count 節點會對清單中的所有項目進行計數。我們將使用此節點示範 List.Map 的運作方式。
在 Code Block 中插入兩行程式碼:
-50..50..#Nx; -50..50..#Ny;
輸入此程式碼後,Code Block 會建立 Nx 與 Ny 兩個輸入。
使用兩個 Integer Slider 連接至 Code Block 以定義 Nx 與 Ny 值。
將 Code Block 每一行分別連接至 Point.ByCoordinates 節點的 X 與 Y 輸入。在節點上按一下右鍵,選取「交織」,然後選擇 「笛卡兒積」。這會建立點的格線。由於我們定義的範圍是從 -50 到 50,因此將跨越預設的 Dynamo 格線。
Watch 節點會顯示已建立的點。請注意資料結構。我們已建立一個清單的清單。每個清單都代表格線的一列點。
將 List.Count 節點連接至上一步驟中 Watch 節點的輸出。
將 Watch 節點連接至 List.Count 輸出。
請注意,List.Count 節點提供的值為 5。這等於 Code Block 中定義的「Nx」變數。為何會發生這種情況?
首先,Point.ByCoordinates 節點使用「x」輸入作為建立清單的主要輸入。若 Nx 為 5 且 Ny 為 3,我們會得到一個 5 個清單的清單,每個清單有 3 個項目。
因為 Dynamo 單獨只把清單視為對象,因此 List.Count 節點是套用到階層中的主要清單。結果值為 5,即主要清單中的清單數量。
使用 List.Map 節點,我們進到階層的下一層,並在此層級執行 function。
請注意,List.Count 節點沒有輸入。它是當作一個函數,因此會將 List.Count 節點套用至階層中下一層級的每個清單。List.Count 的空白輸入對應於 List.Map 的清單輸入。
現在 List.Count 的結果提供一個 5 個項目的清單,每個項目的值為 3。這代表每個子清單的長度。
注意:此練習使用舊版本的 Dynamo 建立。大部分 List.Map 功能已透過增加 List@Level 功能解決。如需更多資訊,請參閱以下的 List@Level。
在本練習中,我們將使用 List.Combine 示範如何對不同物件清單中套用函數。
首先設定兩個點清單。
使用 Sequence 節點產生 10 個值,每個值都有 10 個步長增量。
將結果連接至 Point.ByCoordinates 節點的 x 輸入。這會在 Dynamo 中建立一個點清單。
在工作區中增加第二個 Point.ByCoordinates 節點,使用相同的 Sequence 輸出做為其 x 輸入,但使用 Interger Slider 做為其 y 輸入,並將其值設定為 31 (可以是任何值,只要不與第一組點重疊即可),讓兩組點不會彼此重疊。
接下來,我們使用 List.Combine 對 2 個單獨清單中的物件套用函數。在此範例中,是一個簡單的繪製線條函數。
在工作區中加入 List.Combine,連接 2 組點做為其 list0 與 list1 輸入。
使用 Line.ByStartPointEndPoint 做為 List.Combine 的輸入函數。
完成後,2 組點會透過 Line.ByStartPointEndPoint 函數配對,並在 Dynamo 中傳回 10 條線。
請參閱 n 維清單中的練習,以查看使用 List.Combine 的另一個範例。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
比 List.Map 更好的是,List@Level 功能可讓您在節點的輸入埠直接選取要使用的清單層級。此功能可套用至節點的任何輸入,您可藉此較其他方法更快更輕鬆地存取清單的層級。您只需向節點告知要用作輸入的清單層級,節點會執行其餘作業。
在本練習中,我們將使用 List@Level 功能隔離特定層級的資料。
我們將從簡單的 3D 點格線開始。
格線是使用 X、Y 與 Z 的範圍建構而成,我們知道資料的結構包含 3 層:X 清單、Y 清單及 Z 清單。
這些層處於不同的層級。預覽標示圈底部指出了層級。清單的層級欄對應於上面的清單資料,可協助識別工作所在的層級。
清單層級以反轉順序排列,因此最低層級的資料始終位於「L1」。這有助於確保圖表按計劃工作,即使上游發生變更,也是如此。
若要使用 List@Level 函數,請按一下「>」。在此功能表中,您會看到兩個勾選方塊。
使用層級 - 這會啟用 List@Level 功能。按一下此選項後,您就能在當中點按,然後選取希望節點使用的輸入清單層級。透過此功能表,您就能按一下向上或向下,快速試用不同的層級選項。
保留清單結構 - 如果啟用,您可以選擇保留該輸入的層級結構。有時,您可能會特意將資料組織到子清單中。勾選此選項,可以保持清單組織不變,確保不會遺失任何資訊。
使用簡單的 3D 格線,我們可以切換清單層級,以存取與視覺化清單結構。清單層級與索引的每個組合都會從原始的 3D 點集傳回一組不同的點。
透過 DesignScript 中的「@L2」,我們可以只選取層級 2 的清單。層級 2 的清單 (索引為 0) 只會包括第一組 Y 點,只傳回 XZ 格線。
如果將層級篩選變更為「L1」,我們可以看到第一個清單層級內的所有內容。層級 1 的清單 (索引為 0) 會以一個展開清單包括所有 3D 點。
如果我們嘗試改成「L3」並執行相同作業,只會看到第三個清單層級的點。層級 3 的清單 (索引為 0) 只會包括第一組 Z 點,只傳回 XY 格線。
如果我們嘗試改成「L4」並執行相同作業,只會看到第三個清單層級的點。層級 4 的清單 (索引為 0) 只會包括第一組 X 點,只傳回 YZ 格線。
雖然我們也可以使用 List.Map 建立此特定範例,但是 List@Level 能夠大幅簡化互動方式,讓存取節點資料更輕鬆。請看下面 List.Map 與 List@Level 方法的比較:
雖然使用兩種方法都可以存取相同的點,但是使用 List@Level 方法可以在單一節點內輕鬆切換不同資料層。
若要使用 List.Map 存取點格線,我們需要一起使用 List.GetItemAtIndex 節點和 List.Map。如果我們要下移每個清單層級,都必須額外使用一個 List.Map 節點。視清單的複雜性而定,您可能需要在圖表中加入大量 List.Map 節點,才能存取適當層級的資訊。
在此範例中,List.GetItemAtIndex 節點搭配 List.Map 節點,與 List.GetItemAtIndex (選取「@L3」) 傳回相同清單結構的相同一組點。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
轉置是處理清單的清單時的基本功能。正如在試算表程式中,轉置會翻轉資料結構的欄與列。我們將使用以下的基本矩陣示範這一點,在之後的一節中,我們將示範如何使用轉置建立幾何關係。
接下來刪除上一個練習中的 List.Count 節點,而改用某些幾何圖形以查看資料的構建方式。
將 PolyCurve.ByPoints 從 Point.ByCoordinates 連接至 Watch 節點的輸出。
輸出顯示 5 條 PolyCurve,我們可以在 Dynamo 預覽中看到這些曲線。Dynamo 節點將尋找點清單 (在此案例中是點清單的清單),並根據點清單建立單一 polycurve。實質上,每個清單都已轉換為資料結構中的曲線。
List.Transpose 節點會切換所有項目,以及清單的清單中的所有清單。這似乎很複雜,但其邏輯與 Microsoft Excel 中的轉置相同:切換資料結構中的欄與列。
請注意摘要結果:轉置會將清單結構從 5 個清單 (每個含 3 個項目) 變更為 3 個清單 (每個含 5 個項目)。
請注意幾何圖形結果:使用 PolyCurve.ByPoints,會在原始曲線的垂直方向產生 3 條 PolyCurve。
程式碼區塊速寫使用「[]」定義清單。與 List.Create 節點相比,這是更快速更流暢的清單建立方式。在程式碼區塊和 DesignScript 中會更詳細地討論程式碼區塊。參考以下影像,請注意使用程式碼區塊如何定義具有多個表示式的清單。
程式碼區塊速寫使用「[]」是一個快速輕鬆的方式,可從複雜的資料結構中選取所需的特定項目。在程式碼區塊和 DesignScript 一章會更詳細地討論程式碼區塊。參考以下影像,請注意使用程式碼區塊如何查詢具有多種資料類型的清單。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
此練習將使用上一個練習中建立的一些邏輯以編輯曲面。我們在這裡的目標非常直觀,但資料結構導覽較為複雜。我們要透過移動控制點來連接曲面。
先從上述節點的字串開始。我們將建立跨越預設 Dynamo 格線的基本曲面。
使用 Code Block,插入這兩行程式碼,然後分別連接到 Surface.PointAtParameter 的 u 與 v 輸入:
-50..50..#3;
-50..50..#5;
請確保將 Surface.PointAtParameter 的「交織」設定為 「笛卡兒積」。
Watch 節點顯示我們有一個 3 個清單的清單,每個清單有 5 個項目。
在這一步,我們要查詢所建立格線內的中心點。為了執行此作業,我們將選取中間清單內的中間點。很合理,對嗎?
為了確認這是否為正確的點,也可以在 Watch 節點項目中到處按一下,以確認我們針對的是正確的點。
使用 Code Block,我們將編寫一行基本程式碼來查詢清單的清單:
points[1][2];
使用 Geometry.Translate,我們將選取的點沿 Z 方向上移 20 個單位。
我們也使用 List.GetItemAtIndex 節點選取中間列的點。注意:與上一個步驟類似,我們也可以透過 Code Block,使用
points[1];
這一行查詢清單
到目前為止,我們已成功查詢到中心點,並將其上移。現在,我們需要將移動的該點重新插入原始資料結構。
首先,我們要更換上一步驟中所隔離清單的項目。
使用 List.ReplaceItemAtIndex,我們將運用索引 2,將中間項目更換為連接至移動點的更換項目 (Geometry.Translate)。
輸出顯示出我們已將移動點輸入至清單的中間項目。
現在,我們已修改清單,需要將此清單重新插入原始資料結構:清單的清單。
採用相同的邏輯,使用 List.ReplaceItemAtIndex 將中間清單更換為我們修改後的清單。
請注意,對這兩個節點定義索引的 Code Block 為 1 與 2,這與 Code Block (points[1][2]) 中的原始查詢相符。
透過選取位於 索引 1 的清單,我們可以在 Dynamo 預覽中看到亮顯的資料結構。我們已成功將移動點合併至原始資料結構中。
有許多方式可以使用這組點建立曲面。在此案例中,我們將對曲線進行斷面混成,以建立曲面。
建立 NurbsCurve.ByPoints 節點,並連接新資料結構以建立三條 nurbs 曲線。
將 Surface.ByLoft 連接至 NurbsCurve.ByPoints 的輸出。現在我們已修改曲面。我們可以變更幾何圖形的原始 Z 值。平移並查看幾何圖形更新!
現在我們已建立清單,接下來討論可以對清單執行哪些作業。將清單想像為一副紙牌。這副紙牌是清單,而其中每張紙牌都代表一個項目。
相片由 Christian Gidlöf 拍攝
我們可以對清單執行哪些查詢?這將存取既有性質。
這副紙牌有多少張?52 張。
有幾種花色?4 種。
用哪種材料製成?紙。
長度是多少?3.5" 或 89mm。
寬度是多少?2.5" 或 64mm。
我們可以對清單執行哪些動作?這會根據指定的作業變更清單。
我們可以重新洗牌。
我們可以根據點數對紙牌排序。
我們可以根據花色對紙牌排序。
我們可以拆分紙牌。
我們可以雙手各握一部分紙牌。
我們可以選取其中特定的某張牌。
以上列示的所有作業都有類似的 Dynamo 節點,供您使用一般資料的清單。以下課程將展示我們可以對清單執行的一些基本作業。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
以下影像是基礎圖表,我們在兩個圓之間繪製線以表示基本清單作業。我們將探究如何管理清單內的資料,並透過以下清單動作示範視覺結果。
首先使用一個 Code Block,值為
500;
插入 Point.ByCoordinates 節點的 x 輸入。
將上一步驟的節點插入 Plane.ByOriginNormal 節點的 origin 輸入。
使用 Circle.ByPlaneRadius 節點,將上一步驟的節點插入 plane 輸入。
使用 Code Block,為 radius 指定
50;
的值。這是我們要建立的第一個圓。使用 Geometry.Translate 節點,在 Z 方向將圓上移 100 個單位。
使用 Code Block 節點,透過以下程式碼定義 10 個 0 和 1 之間的數字:
0..1..#10;
將上一步驟的 Code Block 插入兩個 Curve.PointAtParameter 節點的 param 輸入。將 Circle.ByPlaneRadius 插入頂部節點的 curve 輸入,將 Geometry.Translate 插入下方節點的 curve 輸入。
使用 Line.ByStartPointEndPoint,連接兩個 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 與第二個 Line.ByStartPointEndPoint 之間插入 List.Reverse 節點
使用 Watch3D 節點可預覽兩個不同的結果。第一個節點顯示無反轉清單的結果。線垂直連接至相鄰的點。但是,反轉清單會以另一個清單中的相反順序連接所有點。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.ShiftIndices 是建立扭轉或螺旋樣式或任何其他類似資料處理的良好工具。此節點會將清單中的項目移位指定數量的索引。
採用對反轉清單的相同程序,將 List.ShiftIndices 插入 Curve.PointAtParameter 與 Line.ByStartPointEndPoint。
使用 Code Block,指定值「1」將清單移位一個索引。
請注意,變更很小,但下方 Watch3D 節點中所有的線在連接至其他組點時已移位一個索引。
將 Code Block 變更為較大的值 (例如 30),我們發現對角線有顯著不同。在此範例中,此移位的作用類似於相機的光圈,對原始圓柱形產生了扭轉。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.FilterByBooleanMask 將根據一系列布林值或者「True」或「False」值移除某些項目。
為了建立一系列「True」或「False」值,我們需要多做一些工作...
使用 Code Block,採用以下語法定義表示式:
0..List.Count(list);
。將 Curve.PointAtParameter 節點連接至 list 輸入。我們將在程式碼區塊一章中更詳細地講解此設置,但此案例中的程式碼行將產生代表 Curve.PointAtParameter 節點每個索引的清單。使用 _ % _ ** (模數)** 節點,將 Code Block 的輸出連接至 x 輸入,將值 4 連接至 y 輸入。這會產生索引清單除以 4 時的餘數。模數在建立樣式時是非常有用的節點。4 的所有可能餘數包括:0、1、2、3。
從 %** (模數)** 節點,我們知道值 0 表示索引可由 4 整除 (0、4、8 等)。使用 == 節點,我們可以測試餘數的值是否為 0,以測試是否能整除。
Watch 節點顯示此狀況:True/False 樣式為:true,false,false,false...。
使用此 True/False 樣式,連接至兩個 List.FilterByBooleanMask 節點的 mask 輸入。
將 Curve.PointAtParameter 節點連接至 List.FilterByBooleanMask 的每個 list 輸入。
Filter.ByBooleanMask 的輸出為 in 與 out。in 表示遮罩值為 true 的值,而 out 表示遮罩值為 false 的值。透過將 in 輸出插入 Line.ByStartPointEndPoint 節點的 startPoint 與 endPoint 輸入,我們建立出經過篩選的線清單。
Watch3D 節點顯示出線比點少。我們只篩選了 True 值,因此只選取了 25% 的節點。
字典代表與另外一組資料 (稱為鍵) 相關的資料集合。字典可讓您搜尋資料、刪除資料,以及將資料插入集合。
基本上,我們可以將字典想成是一種查詢內容相當聰明的方法。
雖然字典功能在 Dynamo 中已經存在好一段時間,但是 Dynamo 2.0 引入了新的方式來管理此資料類型。
Dynamo 2.0 公開各種字典節點供我們使用。這包括 建立、動作和查詢 節點。
Dictionary.ByKeysValues
將使用提供的值和鍵建立字典。(項目數目會是最短的清單輸入)
Dictionary.Components
將產生輸入字典的元件。(這是建立節點的反轉過程)。
Dictionary.RemoveKeys
將產生新的字典物件但移除輸入鍵。
Dictionary.SetValueAtKeys
將根據輸入鍵與值產生新字典,以取代對應鍵處的目前值。
Dictionary.ValueAtKey
會傳回輸入鍵處的值。
Dictionary.Count
會告訴您字典中有多少個鍵值對。
Dictionary.Keys
會傳回字典中目前儲存哪些鍵。
Dictionary.Values
會傳回字典中目前儲存哪些值。
字典的整體相關資料是處理索引和清單的舊方法的重要替代方法。
Dynamo 2.0 不只為字典引入先前討論的節點,程式碼區塊中也同樣有針對字典的新功能!
您可以使用類似於下方的語法,或節點的 DesignScript 式表現法。
由於字典在 Dynamo 中是一種物件類型,因此我們可以對其執行以下動作。
維持這類互動在將 Revit 資料與字串建立關係時會特別有用。接著,我們來看看一些 Revit 使用情況。
Dynamo 2.0 引入將字典資料類型與清單資料類型分開的概念。此變更可能會對您如何在工作流程中建立和使用資料造成一些重大變更。在 2.0 版之前,字典和清單合併成一種資料類型。簡單來說,清單實際上是有整數鍵的字典。
字典是一種由鍵 - 值對的集合所組成的資料類型,其中每個鍵在每個集合中都是唯一的。字典沒有順序,基本上您可以使用鍵值而不是清單中的索引值「查詢」內容。在 Dynamo 2.0 中,鍵只能是字串。
清單是一種由有序值的集合所組成的資料類型。在 Dynamo 中,清單使用整數做為索引值。
將字典與清單分開,是為了讓字典成為頭等物件,您可以使用它們快速輕鬆地儲存和查詢值,無需記住索引值或在整個工作流程中維護嚴格的清單結構。在使用者測試期間,我們看到當使用字典而不是數個 GetItemAtIndex
節點時,很明顯縮小了圖表大小。
語法 發生了變化,改變您在程式碼區塊中初始化和使用字典與清單的方式。
字典使用以下語法 {key:value}
清單使用以下語法 [value,value,value]
資源庫引入了 新節點,以協助您建立、修改和查詢字典。
在 1.x 版的程式碼區塊中建立的清單,在載入腳本時會自動移轉成使用方括號 [ ]
而不是大括號 { }
的新清單語法 \
在電腦科學中,字典 (像是清單) 是物件的集合。清單有特定的順序,而字典則是 沒有順序 的集合。字典不依賴有順序的數字 (索引),而是使用 鍵。
在下面的影像中,我們示範字典的可能使用案例。字典通常是用來讓兩組可能沒有直接關聯的資料建立關係。在我們的範例中,我們要將西班牙版本的某個字連接到英文版本,以供稍後進行查詢。
建置字典以關聯兩個資料。
取得具有給定索引的值。
您是否曾想要依據 Revit 包含的資料片段查看其中的一些內容?
如果您完成了類似下列作業,就可能達到這個目的。
在下面的影像中,我們收集 Revit 模型中的所有房間、取得所需房間的索引 (依房間號碼),最後取得索引處的房間。
收集模型中所有的房間。
要尋找的房間號碼。
得到房間號碼,並尋找其所在的索引。
得到索引處的房間。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
現在讓我們使用字典重新創造這個構想。首先我們必須收集 Revit 模型中所有的房間。
我們選擇我們想要使用的 Revit 品類 (在本案例中,我們使用房間)。
我們告訴 Dynamo 收集所有這些元素
我們要使用的資料是房間號碼。
現在,我們要使用給定的鍵和元素建立字典。
Dictionary.ByKeysValues 節點會在給定適當輸入的狀況下建立字典。
Keys
必須是字串,而values
可以是各種物件類型。
最後,我們現在可以從字典中使用房間號碼擷取房間。
String
是我們要用來從字典中查詢物件的鍵。Dictionary.ValueAtKey 現在會從字典中取得物件。
使用同樣的字典邏輯,我們也可以使用群組的物件建立字典。如果我們想要查詢給定樓層的所有房間,可以修改上面的圖表,如下所示。
我們現在不使用房間號碼做為鍵,而是使用參數值 (在此案例中,我們將使用樓層)。
現在,我們可以依據房間所在的樓層將房間分組。
有了依樓層分組的元素,我們現在可以使用共用鍵 (唯一鍵) 做為字典的鍵,使用房間的清單做為元素。
最後,使用 Revit 模型中的樓層,我們可以在字典中查詢哪些房間位於該樓層。
Dictionary.ValueAtKey
會採用樓層名稱,然後傳回該樓層的房間物件。
使用字典的時機非常多。將 Revit 中的 BIM 資料與元素本身建立關係,就可以產生各種使用情況。
Dynamo 在其節點庫中儲存了許多開箱即用的功能。對於這些經常使用的常式或要與社群共用的特殊圖表,自訂節點和套件是進一步延伸 Dynamo 很好的方式。
原始影像由 提供
接著,我們必須決定要使用哪些鍵來查詢此資料。(在一節可以找到鍵的相關資訊)。
建立一些自訂節點後,下一步是以套件方式開始組織和發佈它們 - 這是一個很便利的方式來儲存您的節點並與 Dynamo 社群分享。
我們剛剛建立了自訂節點並將其套用至 Dynamo 圖形中的特定程序。我們非常喜歡此節點,因此,我們要將其保留在我們的 Dynamo 資源庫以在其他圖形中進行參考。若要執行此作業,我們將在本端發佈此節點。此程序與發佈套件的程序類似,我們將在下一個章節中進行詳細討論。
透過在本端發佈節點,當您開啟一個新的階段作業時該節點將可在 Dynamo 資源庫中存取。如果不發佈節點,參照自訂節點的 Dynamo 圖表也必須在其資料夾中具有該自訂節點 (或必須使用 「檔案」>「匯入資源庫」 將自訂節點匯入 Dynamo 中)。
在 Dynamo Sandbox 2.17 版及更新版本中,只要自訂節點和套件沒有主 API 相依性,即可加以發佈。在較舊版中,只有 Dynamo for Revit 和 Dynamo for Civil 3D 中可發佈自訂節點和套件。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
讓我們繼續瞭解在前一個部份中建立的自訂節點。開啟 PointsToSurface 自訂節點後,我們會在 Dynamo 自訂節點編輯器中看到圖表。您也可以在「Dynamo 圖表編輯器」中按兩下自訂節點來開啟。
若要在本端發佈自訂節點,只需在圖元區上按一下右鍵,然後選取 「發佈此自訂節點...」
參照上圖填寫相關資訊,並選取 「本端發佈」。請注意,「群組」欄位定義可從 Dynamo 功能表存取的主要元素。
選擇資料夾,以容納所有您打算在本端發佈的自訂節點。Dynamo 每次載入時都會檢查此資料夾,因此請確認該資料夾位於固定位置。導覽至此資料夾,然後選擇 「選擇資料夾」。Dynamo 節點現已在本端發佈,每次您載入程式時,該節點都會在您的 Dynamo 資源庫中!
若要查看自訂節點的資料夾位置,請前往 「Dynamo」>「偏好」>「套件設定」>「節點和套件路徑」。
在此視窗中,我們看到路徑清單。
Documents\DynamoCustomNodes... 是本端發佈之自訂節點的位置。
AppData\Roaming\Dynamo... 是線上安裝的 Dynamo 套件的預設位置。
您可能想要在清單中將本端資料夾路徑的順序下移,只要按一下路徑名稱左側的向下箭頭即可。頂層資料夾是套件安裝的預設路徑。因此,透過將預設 Dynamo 套件安裝路徑保留為預設資料夾,線上套件將與本端發佈的節點分離。
我們已切換路徑名稱的順序,以將 Dynamo 的預設路徑作為套件的安裝位置。
導覽至此本端資料夾,我們可以在 「.dyf」 資料夾中找到原始自訂節點,.dyf 是 Dynamo 自訂節點檔案的副檔名。我們可以編輯此資料夾中的檔案,節點將在使用者介面中更新。我們還可以新增更多節點至主要的 DynamoCustomNode 資料夾,Dynamo 會在重新啟動時將其新增到您的資源庫!
Dynamo 現在每次都會將「PointsToSurface」載入到 Dynamo 資源庫的「DynamoPrimer」群組中。
Dynamo 為廣泛的視覺程式設計任務提供許多核心節點。有時,一個更快、更有序或更輕鬆的共享解決方法是建置您自己的節點。這些節點可以在不同專案中重複使用,讓您的圖表更清楚整潔,這些節點也可以推送至 Package Manager 並與全球的 Dynamo 社群分享。
自訂節點的構成方式是在「Dynamo 自訂節點」中嵌套其他節點和自訂節點, 我們可以將「Dynamo 自訂節點」從概念上理解為容器。當在圖中執行此容器節點時,將執行其所有內部節點以允許您重複使用和共用一個有用的節點。
當您在圖中有多個自訂節點副本時,您可以透過編輯基礎自訂節點來更新所有副本。這容許您透過採用工作流程或設計中可能發生的任何變更來順暢地更新您的圖形。
雖然有爭議,但是一般認為自訂節點的最佳功能是其工作共用功能。如果「經驗豐富的使用者」建立了複雜的 Dynamo 圖形,並將其傳遞給不太熟悉 Dynamo 的新使用者,則他/她可壓縮圖形為最基本的內容以進行設計互動。可開啟自訂節點以編輯內部圖形,但「容器」可以保持簡單。使用此程序,自訂節點允許 Dynamo 使用者設計簡潔、直觀的圖表。
有多種方法可在 Dynamo 中建置自訂節點。在本章的範例中,我們將直接從 Dynamo 使用者介面建立自訂節點。如果您是程式設計人員且您對 C# 或「零接觸」格式感興趣,您可以參考 Dynamo Wiki 上的這一頁做更深入的瞭解。
讓我們跳至自訂節點環境,並建立一個簡單的節點來計算百分比。自訂節點環境不同於 Dynamo 圖形環境,但其互動根本相同。在此基礎上,讓我們建立第一個自訂節點!
若要從頭開始建立自訂節點,請啟動 Dynamo,然後選取「自訂節點」,或在圖元區鍵入 Ctrl + Shift + N。
在「自訂節點性質」對話方塊中指定名稱、描述和品類。
名稱: Percentage
描述:計算一個值相對於另一個值的百分比。
品類: Math.Functions
這將開啟一個具有黃色背景的圖元區,表示您正在自訂節點內工作。在此畫布上,您可以存取所有核心 Dynamo 節點,以及 Input 和 Output 節點,其標示資料流進和流出自訂節點。您可以在「Input」>「Basic」中找到它們。
Input: Input 節點在自訂節點上建立輸入埠。Input 節點的語法為 input_name : datatype = default_value(選擇性)。
Output: 類似於 Input,將在自訂節點上建立和命名輸出埠。請考慮對輸入埠和輸出埠新增自訂註解,以提示輸入和輸出類型。在建立自訂節點一節將會更詳細討論此問題。
您可以將此自訂節點儲存為 .dyf (而非標準 .dyn) 檔案,它將會自動新增至您的階段作業和將來的階段作業中。您將在資源庫的「Add-ons」區段中找到自訂節點。
現在,我們建立了第一個自訂節點,下一部分將深入瞭解自訂節點功能以及如何發佈一般工作流程。在以下部分中,我們將瞭解如何開發可將幾何圖形從一個平面轉移至另一個平面的自訂節點。
Dynamo 提供大量即裝即用的功能,並維護了豐富的套件資源庫,可顯著擴充 Dynamo 的功能。套件是自訂節點或其他功能的集合。Dynamo Package Manager 是一個入口網站,可讓社群下載已在線上發佈的套件。這些工具集由協力廠商開發,可擴充 Dynamo 的核心功能,任何人都能存取,按一下按鈕即可下載。
開放原始碼專案 (例如 Dynamo) 在此類型的社群參與下蓬勃發展。使用專屬的協力廠商開發人員,Dynamo 可以將其適用範圍延伸到一系列產業的工作流程中。因此,Dynamo 團隊齊心協力簡化套件的開發與發佈 (在後續各節中將更詳細地討論這一點)。
最簡易的套件安裝方式是使用 Dynamo 介面中的「套件」功能表選項。現在,讓我們直接開始安裝套件。在此簡單範例中,我們將安裝某個常見套件,在格線上建立四邊形板。
在 Dynamo 中,前往 「套件」>「Package Manager...」
在搜尋列中,我們搜尋「quads from rectangular grid」。片刻之後,您應該會看到符合此搜尋查詢的所有套件。我們要選取具有相符名稱的第一個套件。
按一下「安裝」,將此套件加入至您的資源庫,系統請您確認時,請接受。完成!
請注意,Dynamo 資源庫中現在有另一個群組稱為「buildz」。此名稱是指套件的開發人員,此群組中已放置自訂節點。我們可以立即開始使用。
使用 Code Block 可快速定義矩形格線,將結果輸出至 Polygon.ByPoints 節點,然後輸出至 Surface.ByPatch 節點,以檢視您剛剛建立的矩形板清單。
上述範例著重針對具有一個自訂節點的套件,不過您可以使用相同程序下載具有多個自訂節點的套件並支援資料檔案。現在使用更全面的套件 DynamoUnfold 示範。
如同上述範例,首先請選取 「套件」>「Package Manager...」。
這次我們要搜尋 「DynamoUnfold」,這是一個字,沒有空格。當我們看到套件時,按一下「安裝」下載,將 DynamoUnfold 加入您的 Dynamo 資源庫。
在 Dynamo 資源庫中,我們有一個 DynamoUnfold 群組,當中有多個品類和自訂節點。
現在,我們看一下套件的檔案結構。
請先前往「套件」>「Package Manager」>「已安裝的套件」。
然後按一下「展示根目錄」,以開啟此套件的根資料夾。
這會將我們帶到套件的根目錄。請注意,我們有 3 個資料夾和 1 個檔案。
bin 資料夾包含 .dll 檔案。此 Dynamo 套件使用 Zero-Touch 進行開發,因此自訂節點保留在此資料夾中。
dyf 資料夾包含自訂節點。此套件不是使用 Dynamo 自訂節點進行開發,所以此套件的此資料夾是空的。
extra 資料夾包含所有其他檔案 (包括範例檔案)。
pkg 檔案是定義套件設定的基本文字檔案。現在我們可以忽略該檔案。
開啟「extra」資料夾,我們可以看到隨安裝而下載的一系列範例檔案。並非所有套件都有範例檔案,但此若套件有範例檔案,您可以在此處找到這些檔案。
接下來開啟「SphereUnfold」。
開啟檔案並按一下求解器上的「執行」後,就會看到一個展開的圓球!諸如此類的範例檔案有助於學習如何使用新的 Dynamo 套件。
!
在「Package Manager」中,您可以使用「搜尋套件」頁籤中的排序和篩選選項來瀏覽套件。該頁籤提供數種篩選,包含主程式、狀態 (新的、已棄用或取消棄用),以及套件是否具有相依性。
透過排序套件,您可以找出高評等或下載次數最多的套件,或尋找最近更新的套件。
您也可以按一下「檢視詳細資料」,針對每個套件取得更多詳細資料。這會開啟 Package Manager 中的側面板,您可以在其中尋找資訊,例如版本管理和相依性、網站或儲存庫 URL、授權資訊等。
探索 Dynamo 套件的另一種方式是探索 Dynamo Package Manager 網站。您可以在這裡找到套件和作者排行榜的統計資料。您也可以從 Dynamo Package Manager 下載套件檔案,但是從 Dynamo 直接執行會更順暢。
如果您想要查看套件檔案的儲存位置,請在頂端導覽中按一下「Dynamo」>「偏好」>「套件設定」>「節點和套件檔案位置」。您可以在這裡找到您目前的根資料夾目錄。
套件預設安裝在與以下資料夾路徑類似的位置:C:/Users/[使用者名稱]/AppData/Roaming/Dynamo/[Dynamo 版本]。
Dynamo 社群在不斷成長與發展。透過不時地探索 Dynamo Package Manager,您會發現一些激動人心的新開發功能。在以下各節,我們將從終端使用者的視角到建立您自己的 Dynamo 套件,更深入地查看套件。
Dynamo 提供自訂節點的多種不同建立方法。您可以從頭開始建置自訂節點、從既有圖表建置自訂節點,或使用 C# 明確建置自訂節點。在本節中,我們將討論在 Dynamo 使用者介面內透過既有圖表建置自訂節點。此方法非常適用於清理工作區,以及封裝一系列節點以供在其他位置重複使用。
在以下影像中,我們將使用 UV 座標在曲面之間對映點。我們將使用此概念建立對 XY 平面中的曲線進行參考的面板化曲面。在此,我們將建立四邊形面板以進行面板化,但運用相同邏輯,我們可以使用 UV 對映建立多種面板。這是開發自訂節點的好機會,因為我們在此圖表或在其他 Dynamo 工作流程中,可以更輕鬆地重複使用類似程序。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
接下來先建立我們希望巢狀插入到自訂節點中的圖表。在此範例中,我們將建立使用 UV 座標將多邊形從基準曲面對映至目標曲面的圖表。我們會經常使用此 UV 對映程序,因此該程序是建立自訂節點的良好備用程序。如需曲面和 UV 空間的更多資訊,請參閱曲面頁面。從上面下載的 .zip 檔案中,完整的圖表為 UVmapping_Custom-Node.dyn。
Code Block: 使用此行建立範圍介於 -45 到 45 之間的 10 個數字
45..45..#10;
Point.ByCoordinates: 將 Code Block 的輸出連接至「x」與「y」輸入,並將交織設定為交互參考。現在應該已建立點的格線。
Plane.ByOriginNormal: 將 Point 輸出連接至 origin 輸入,以便在每個點處建立平面。將使用預設的法線向量 (0,0,1)。
Rectangle.ByWidthLength: 將上一步中的平面連接至 plane 輸入,並使用 Code Block 以值 10 指定寬度與長度。
現在應該能看到矩形的格線。接下來使用 UV 座標將這些矩形對映到目標曲面。
Polygon.Points: 將上一步中的 Rectangle.ByWidthLength 輸出連接至 polygon 輸入,以擷取每個矩形的角點。這些是將要對映到目標曲面的點。
Rectangle.ByWidthLength: 使用 Code Block 以值 100 指定矩形的長度與寬度。這將是基準曲面的邊界。
Surface.ByPatch: 將上一步中的 Rectangle.ByWidthLength 連接至 closedCurve 輸入,以建立基準曲面。
Surface.UVParameterAtPoint: 連接 Polygon.Points 節點的 Point 輸出與 Surface.ByPatch 節點的 Surface 輸出,以傳回每個點處的 UV 參數。
現在,我們已建立基準曲面與一組 UV 座標,可以匯入目標曲面並在曲面之間對映點。
File Path: 選取要匯入的曲面的檔案路徑。檔案類型應是 .SAT。按一下 「瀏覽...」 按鈕,導覽至上面所下載 .zip 檔案中的 UVmapping_srf.sat 檔案。
Geometry.ImportFromSAT: 連接檔案路徑以匯入曲面。您在幾何圖形預覽中應該能看到匯入的曲面。
UV: 將 UV 參數輸出連接至 UV.U 與 UV.V 節點。
Surface.PointAtParameter: 連接匯入的曲面以及 u 與 v 座標。現在,您應該能看到目標曲面上 3D 點的格線。
最後一步是使用 3D 點來建構矩形曲面修補。
PolyCurve.ByPoints: 連接曲面上的點以建構通過這些點的 PolyCurve。
Boolean: 在工作區中加入 Boolean,將其連接至 connectLastToFirst 輸入,並切換至「True」以封閉 polycurve。現在,您應該能看到對映到曲面的矩形。
Surface.ByPatch: 將 polycurve 連接至 closedCurve 輸入,以建構曲面修補。
現在選取要巢狀插入至自訂節點的節點,同時考慮希望採用的節點輸入與輸出。我們希望自訂節點盡可能靈活,因此該自訂節點應該能對映任何多邊形,而不僅僅是矩形。
選取以下節點 (從 Polygon.Points 開始),在工作區上按一下右鍵,然後選取「建立自訂節點」。
在「自訂節點性質」對話方塊中,指定自訂節點的名稱、描述及品類。
名稱:MapPolygonsToSurface
描述:將多邊形從基礎曲面對映至目標曲面
附加元件品類:Geometry.Curve
自訂節點已顯著清理工作區。請注意,已根據原始節點命名輸入與輸出。接下來編輯自訂節點,以便讓名稱更具描述性。
按兩下「自訂節點」以對其進行編輯。這將開啟工作區,並以黃色背景表示節點內部。
Input: 將輸入名稱變更為 baseSurface 與 targetSurface。
Output: 為對映的多邊形加入其他輸出。
儲存自訂節點,然後返回首頁工作區。請注意 MapPolygonsToSurface 節點反映我們剛剛所做的變更。
我們也可以在自訂註解中加入內容,以提高自訂節點的堅實性。註解有助於提示輸入與輸出類型,或說明節點的功能。使用者將游標懸停在自訂節點的輸入或輸出上方時,將顯示註釋。
按兩下「自訂節點」以對其進行編輯。這會重新開啟黃色背景工作區。
開始編輯 Input Code Block。若要開始註解,請在註解文字之前鍵入「//」。鍵入有助於說明節點的任何內容 - 在此我們將描述 targetSurface。
接下來還要設定輸入類型等於某個值,以設定 inputSurface 的預設值。在此,我們將預設值設定為原始 Surface.ByPatch 設定。
也可以將註解套用到 Output。
編輯 Output Code Block 中的文字。在註解文字前鍵入「//」。在此,我們將加入更深入的描述,以說明 Polygons 與 surfacePatches 輸出。
將游標懸停在自訂節點輸入上方可查看註解。
設定 inputSurface 的預設值後,我們也可以執行定義,而不提供曲面輸入。
在 DynamoUnfold 旁邊,選取選項功能表 。
雖然 Dynamo 最初是以 Revit 為基礎建置,但此視覺程式設計工具的多功能已不限用於 Revit。Dynamo 也整合到 Civil 3D 中,讓使用者能夠為土木基礎建設專案建立功能強大的自動化例行程式工作。這是一個非常有用的工具,可以處理從一般工作到最複雜設計工作流程的所有事物,最終可協助您節省時間、最佳化設計,並做出更好的設計決策。Dynamo 提供專用於 Civil 3D 的一整套節點,以及來自繁榮社群的協力廠商資源庫。
Primer 的本章將重點介紹 Dynamo for Civil 3D,從基礎知識開始,並探討更進階的主題。
雖然 Dynamo 是一個設計來匯入各種程式的彈性環境,但是它最初建立的目的是與 Revit 搭配使用。視覺程式為建築資訊模型 (BIM) 提供功能強大的選項。Dynamo 提供專用於 Revit 的一整套節點,以及來自繁榮 AEC 社群的協力廠商資源庫。本章著重於在 Revit 中使用 Dynamo 的基礎知識。
Dynamo Mesh Toolkit 可提供工具,以匯入外部檔案格式的網格、根據 Dynamo 幾何圖形物件建立網格,並根據網格的頂點與索引手動建置網格。資源庫還提供工具來修改網格、修復網格,或萃取水平切片,以用於加工。
Dynamo Mesh Toolkit 是 Autodesk 持續進行網格研究的一部分,因此在未來的幾年將繼續成長。該工具箱將頻繁推出新方法,請隨時與 Dynamo 團隊聯繫以提供註解、錯誤以及新功能的建議。
下面的練習演示了使用 Mesh Toolkit 可執行的一些基本網格作業。在此練習中,我們將網格與一系列的平面相交,如果使用實體執行此作業,則運算成本很高。與實體不同,網格具有一組「解析度」,不以數學方式定義,而是以拓樸方式定義,我們可根據要執行的作業來定義此解析度。有關網格與實體關係的詳細資訊,您可以參考此手冊的用於計算設計的幾何圖形一章。有關 Mesh Toolkit 的更詳細資訊,您可以參考 Dynamo Wiki 頁面。我們利用下面的練習來瞭解此套件。
在 Dynamo 中,前往頂部功能表列中的「套件」>「Package Manager...」。在搜尋欄位中,鍵入 MeshToolkit (全部一個字,無空格)。按一下「安裝」,系統請您確認時,請接受,即可開始下載。非常簡單!
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
在此範例中,我們將瞭解 Mesh Toolkit 的 Intersect 節點。我們將匯入網格並將其與一系列輸入平面相交以建立切片。這是準備模型以使用鐳射切割、水刀切割或數控機床進行加工的起點。
首先,在 Dynamo 中開啟 Mesh-Toolkit_Intersect-Mesh.dyn。
檔案路徑: 找到要匯入的網格檔案 (stanford_bunny_tri.obj)。支援的檔案類型為 .mix 和 .obj
Mesh.ImportFile: 連接檔案路徑以匯入網格
Point.ByCoordinates: 建構一個點 - 這將是弧的中心。
Arc.ByCenterPointRadiusAngle: 在該點週圍建構一個弧。這條曲線將用來定位一系列平面。 __設定如下: __
radius: 40, startAngle: -90, endAngle:0
建立一系列沿著弧轉向的平面。
Code Block:建立 25 個介於 0 和 1 之間的數字。
Curve.PointAtParameter: 將弧連接到 curve 輸入並將 Code Block 輸出連接至 param 輸入以擷取出一系列沿著曲線的點。
Curve.TangentAtParameter: 連接與前一個節點相同的輸入。
Plane.ByOriginNormal: 將點連接至 origin 輸入並將 vector 連接至 normal 輸入,在每個點建立一系列平面。
接下來,我們將使用這些平面與網格相交。
Mesh.Intersect: 將這些平面與匯入的網格相交,建立一系列 PolyCurve 輪廓線。在節點上按一下右鍵,並將交織設定為最長
PolyCurve.Curves: 將 PolyCurve 切斷為曲線段。
Curve.EndPoint: 擷取每條曲線的端點。
NurbsCurve.ByPoints: 使用點來建構 NURBS 曲線。使用設定為 True 的 Boolean 節點,以封閉曲線。
在繼續之前,請關閉某些節點 (例如:Mesh.ImportFile、Curve.EndPoint、Plane.ByOriginNormal 以及 Arc.ByCenterPointRadiusAngle) 的預覽,以更清楚地查看結果。
Surface.ByPatch: 為每條輪廓線建構曲面修補,以便建立網格的「切片」。
新增第二組切片,產生格子/蛋盒的效果。
您可能會發現與一個差不多的實體相比,網格相交作業的計算速度更快。例如本練習中示範的工作流程非常適合用於網格。
在先前各節中,我們詳細瞭解了如何使用自訂節點與範例檔案設置 MapToSurface 套件。但是,如何發佈已在本端開發的套件呢?此案例研究將示範如何從本端資料夾的一組檔案發佈套件。
有許多方式可以發佈套件。以下是建議的程序:本端發佈、本端開發,然後線上發佈。我們從包含套件中所有檔案的資料夾開始。
在對發佈 MapToSurface 套件進行瞭解之前,若您已在上一課程中安裝該套件,請將其解除安裝,以便不會使用相同的套件。
首先,請前往「套件」>「套件管理員」>「已安裝的套件」頁籤,然後按一下「MapToSurface」旁的垂直圓點功能表 >「刪除」。
然後重新啟動 Dynamo。重新開啟後,若查看 「管理套件」 視窗,會發現其中應該不再包含 MapToSurface。現在我們準備好重新開始!
在 Dynamo Sandbox 2.17 版及更新版本中,只要自訂節點和套件沒有主 API 相依性,即可加以發佈。在較舊版中,只有 Dynamo for Revit 和 Dynamo for Civil 3D 中可發佈自訂節點和套件。
在下方的連結按一下,下載範例檔案。
附錄中提供完整的範例檔案清單。
這是為套件首次提交的檔案,我們已將所有範例檔案與自訂節點置於一個資料夾中。準備好此資料夾後,我們就準備好上傳到 Dynamo Package Manager。
此資料夾包含五個自訂節點 (.dyf)。
此資料夾還包含五個範例檔案 (.dyn) 與一個匯入的向量檔案 (.svg)。這些檔案將作為介紹練習,用以向使用者示範如何使用自訂節點。
在 Dynamo 中,首先按一下 「套件」>「Package Manager」>「發佈新套件」 頁籤。
在 「發佈套件」 頁籤中,填寫視窗左側的相關欄位。
接下來,我們將加入套件檔案。您可以選取「加入目錄」(1),逐個加入檔案,或加入整個資料夾。若要加入非 .dyf 的檔案,請務必在瀏覽器視窗中將檔案類型變更為 「所有檔案 (.)」。請注意,我們會加入所有檔案,不會區分該檔案是自訂節點檔案 (.dyf) 或範例檔案 (.dyn)。發佈套件時,Dynamo 會將這些項目分類。
選取 MapToSurface 資料夾後,Package Manager 會顯示資料夾內容。如果您上傳您自己的套件,且套件的資料夾結構複雜,而您不希望 Dynamo 變更資料夾結構,則可以啟用「保留資料夾結構」切換開關。此選項適用於進階使用者,如果您的套件並非以特定方式刻意設定,最好不要開啟此切換開關,讓 Dynamo 視需要組織檔案。按一下「下一步」以繼續。
發佈前,您可以在這裡預覽 Dynamo 組織套件檔案的方式。按一下「完成」以繼續。
按一下「本端發佈」(1)來進行發佈。若您跟著這裡的說明操作,請確定您按的是 「本端發佈」,而不是 「線上發佈」,避免 Package Manager 中有多個重複的套件。
發佈後,在「DynamoPrimer」群組或 Dynamo 資源庫下應該會顯示自訂節點。
現在,我們看一下根目錄,以瞭解 Dynamo 如何格式化我們剛剛建立的套件。前往「已安裝的套件」頁籤 > 按一下「MapToSurface」旁的垂直圓點功能表 > 選取「展示根目錄」,即可查看根目錄。
請注意,根目錄位於套件的本端位置 (請記住,我們在「本端」發佈套件)。Dynamo 目前參考此資料夾以讀取自訂節點。因此,請務必使用本端發佈功能,將資料夾發佈到永久的資料夾位置 (即不是您的桌面)。以下將分解講述 Dynamo 套件資料夾。
bin 資料夾包含使用 C# 或 Zero-Touch 資源庫建立的 .dll 檔案。我們沒有為此套件建立任何內容,所以此範例的此資料夾為空白。
dyf 資料夾包含自訂節點。開啟此資料夾將顯示此套件的所有自訂節點 (.dyf 檔案)。
extra 資料夾包含所有其他檔案。這些檔案可能是 Dynamo 檔案 (.dyn),也可能是所需的任何其他檔案 (.svg、.xls、.jpeg、.sat 等)。
pkg 檔案是定義套件設定的基本文字檔案。它是 Dynamo 中自動建立的檔案,但是如果您希望取得詳細資料,可以編輯該檔案。
注意:除非您要真的發佈自己的套件,否則請勿繼續執行此步驟!
準備好發佈後,在「套件」>「Package Manager」>「已安裝的套件」視窗中,選取要發佈之套件右側的按鈕,然後選擇「發佈」。
如果您要更新已發佈的套件,請選擇「發佈版本」,Dynamo 將根據該套件根目錄中的新檔案,線上更新您的套件。非常簡單!
若要更新已發佈套件根資料夾中的檔案,您也可以在 「我的套件」 頁籤中選取 「發佈版本...」,以發佈新版本的套件。這是一個很順暢的方式,可以對內容進行必要更新以及與社群分享。只有當您是套件的維護者時,才能使用 「發佈版本」。
適用於 Revit 的 Dynamo 使用圖形演算法編輯器的資料和邏輯環境來延伸建築資訊模型。其靈活性以及功能強大的 Revit 資料庫,為 BIM 提供了新視角。
本章的重點在於 BIM 的 Dynamo 工作流程。各小節主要基於練習,因為直接開始處理專案是熟悉 BIM 圖形算法編輯器的最佳方法。但是,首先讓我們來瞭解程式的開頭。
隨著 Revit 和 Dynamo 兩者持續開發,您可能會發現,您使用的 Revit 版本與安裝在您電腦上的適用於 Revit 的 Dynamo 版本不相容。以下概述哪些版本的適用於 Revit 的 Dynamo 與 Revit 相容。
2013
2014
2015
2016
2017
2018
2019
2020+
2.1.0 - Revit 2020+ 現在包含 Dynamo,而且會像 Revit 一樣收到更新。
N/A
在專注投入的開發人員團隊和充滿熱情的社群的努力下,專案從一開始的微不足道獲得了長足的發展。
Dynamo 最初建立的目的是為了簡化 Revit 中的 AEC 工作流程。雖然 Revit 為每個專案建立了功能強大的資料庫,但對於普通使用者來說,在介面約束外存取此資訊可能很困難。Revit 提供了全面的 API (應用程式介面),讓協力廠商開發人員可建立自訂工具。雖然程式設計人員已使用此 API 多年,但並非所有人都能使用文字撰寫腳本。Dynamo 的目標是透過可訪問的圖形算法編輯器使 Revit 資料可供所有人存取。
將核心 Dynamo 節點與自訂 Revit 節點搭配使用,使用者可以大幅擴充參數式工作流程,以獲得互通性、製作文件、分析和產生。使用 Dynamo,繁瑣的工作流程可以自動化,設計探索領域可蓬勃發展。
在 Revit 專案或族群編輯器中,導覽至「增益集」,然後按一下「Dynamo」。*
*Dynamo 只會在開啟它的檔案中執行。
在 Revit 中開啟 Dynamo 時,會有一個稱為「Revit」的新品類。這是使用者介面的全面新增組件,其中提供了專用於 Revit 工作流程的節點。*
*使用 Revit 特定的節點族群,Dynamo 圖表就只能在於適用於 Revit 的 Dynamo 中開啟時運作。例如,如果在 Dynamo Sandbox 中開啟適用於 Revit 的 Dynamo 圖表,則 Revit 節點將會遺失。
由於 Revit 是功能強大的專案管理平台,Dynamo 中的參數式作業可能會很複雜且計算速度緩慢。若 Dynamo 花費很長時間來計算節點,您可能要在開發圖表時,使用「凍結」節點功能以暫停執行 Revit 作業。
您可以在節點和線路一節閱讀有關凍結節點的更多資訊。
由於 Dynamo 最初是為 AEC 建立,其大型且不斷成長的社區是一個向行業專家學習和連線至行業專家的很棒資源。Dynamo 的社群由樂於分享和創造的建築師、工程師、程式設計人員及設計師組成。
Dynamo 是不斷發展的開放程式碼專案,而且有大量的開發工作都與 Revit 相關。如果您是新使用者,可造訪「討論論壇」並開始發問!如果您是程式設計人員並想要參與 Dynamo 開發,可造訪 Github 儲存庫。另外,協力廠商資源庫的絕佳資源是 Dynamo Package Manager。許多這些套件都是在 AEC 基礎上開發的,本章中我們將瞭解用於平板化的協力廠商套件。
Dynamo 也會積極更新部落格。請閱讀最新的貼文以瞭解最新的開發工作!
Dynamo 提供了多種套件建立方式,供個人使用或與 Dynamo 社群分享。在以下案例研究中,我們將瞭解如何透過解構既有的套件以設置套件。此案例研究以上一章的課程為基礎,會提供一組自訂節點,以便在 Dynamo 曲面之間依 UV 座標對映幾何圖形。
我們將使用的範例套件會演示曲面之間點的 UV 對映。我們已在此手冊的建立自訂節點一節中建置了工具的基礎內容。以下檔案將示範我們如何利用 UV 對映的概念,以及如何為可發佈資源庫開發一組工具。
在此影像中,我們將使用 UV 座標在曲面之間對映點。套件以此概念為基礎,但具有更複雜的幾何圖形。
在上一章中,我們探索了根據 XY 平面中定義的曲線在 Dynamo 中將曲面面板化的方式。此案例研究將針對幾何圖形的更多標註延伸這些概念。我們會將此套件安裝為已建置的套件,以演示其開發方式。在下一節,我們將示範此套件的發佈方式。
在 Dynamo 中,按一下「套件」>「Package Manager」,然後搜尋套件「MapToSurface」(全部一個字,無空格)。按一下「安裝」以開始下載,並將套件加入您的資源庫。
安裝後,「Add-ons」>「DynamoPrimer」區段下應該會顯示自訂節點。
現在已安裝套件,接下來瞭解其設置方式。
我們將建立的套件會使用已建置供參考的五個自訂節點。接下來瞭解每個節點的行為。某些自訂節點會建置其他自訂節點,圖表的配置可供其他使用者以簡單的方式進行瞭解。
這是具有五個自訂節點的簡單套件。在以下步驟中,我們將簡要討論每個自訂節點的設置。
這是一個基本自訂節點,是其他所有對映節點的基礎。簡言之,節點會將來源曲面 UV 座標的點對映至目標曲面 UV 座標的位置。由於點是最基本的幾何圖形,以此為基礎會建置更複雜的幾何圖形,因此我們可以使用此邏輯在曲面之間對映 2D 甚至 3D 幾何圖形。
只需使用這裡的多邊形,即可示範將對映點從 1D 幾何圖形延伸至 2D 幾何圖形的邏輯。請注意,我們已將 PointsToSurface 節點巢狀插入此自訂節點中。使用此方式,我們可以將每個多邊形的點對映到曲面,然後從這些對映的點重新產生多邊形。透過保持正確的資料結構 (點清單的清單),我們可以在多邊形精簡為一組點後保持多邊形的獨立性。
這裡套用的邏輯與 PolygonsToSurface 節點中相同。但不是對映多邊形點,而是對映 NURBS 曲線的控制點。
OffsetPointsToSurface
此節點稍微複雜一些,但概念很簡單:此節點與 PointsToSurface 節點類似,可在曲面之間對映點。但是,它也會考慮到不在原始來源曲面上的點,會取得這些點距最近 UV 參數的距離,並將此距離對映到對應 UV 座標處的目標曲面法線。如果查看範例檔案,會比較有感覺。
這個簡單節點會建立一個參數式曲面,從來源格線對映到範例檔案中的波浪曲面。
範例檔案可在套件的根資料夾中找到。按一下「Package Manager」>「安裝的套件」頁籤。
按一下「MapToSurface」旁的垂直圓點功能表 >「展示根目錄」。
接著開啟 「extra」 資料夾,此資料夾包含套件中不是自訂節點的所有檔案。這是 Dynamo 套件的範例檔案 (若存在) 的儲存位置。以下螢幕擷取畫面討論每個範例檔案中示範的概念。
此範例檔案示範如何根據矩形的格線使用 PointsToSurface 將曲面平板化。這看起來應該很熟悉,因為我們在上一章示範了類似的工作流程。
此練習檔案使用類似的工作流程,展示在從一個曲面將圓 (或表示圓的多邊形) 對映到另一個曲面的設置。此練習檔案使用 PolygonsToSurface 節點。
此範例檔案使用「NurbsCrvToSurface」節點,因此複雜性更高。會將目標曲面偏移指定的距離,並將 NURBS 曲線對映至原始目標曲面與偏移曲面。由此對對映的兩條曲線執行斷面混成以建立曲面,然後增厚該曲面。產生的這個實體具有代表目標曲面法線的波浪線。
此範例檔案示範如何將褶狀的 PolySurface 從來源曲面對映到目標曲面。來源曲面與目標曲面分別是跨越格線的矩形曲面與旋轉曲面。
來源 PolySurface 從來源曲面對映到目標曲面。
由於自訂節點可以對映不同類型的曲線,因此這最後一個檔案參考從 Illustrator 匯出的 SVG 檔案,並將匯入的曲線對映到目標曲面。
剖析整個 .svg 檔案的語法,將曲線從 .xml 格式轉換為 Dynamo polycurve。
將匯入的曲線對映到目標曲面。我們可藉此以明確方式 (點選) 在 Illustrator 中設計一個平板化物件,匯入至 Dynamo,然後套用到目標曲面。
「Zero-Touch 匯入」是指匯入 C# 資源庫所使用的一個簡易點選方法。Dynamo 將讀取 .dll 檔案的公開方法,並將其轉換為 Dynamo 節點。您可以使用 Zero-Touch 開發自己的自訂節點與套件,並將外部資源庫匯入 Dynamo 環境。
.dll 檔
Dynamo 節點
使用 Zero-Touch,您可以實際匯入不一定是為 Dynamo 開發的資源庫,並建立一組新節點。目前的 Zero-Touch 功能展示出 Dynamo 專案的跨平台能力。
在 Dynamo 中,建立新檔案,然後選取 「檔案」>「匯入資源庫...」
接下來,找到 dll 檔。
在快顯視窗中,導覽至 AForge 安裝的「Release」資料夾。該資料夾可能位於類似如下的資料夾中:C:\Program Files (x86)\AForge.NET\Framework\Release。
AForge.Imaging.dll: 在此案例研究中,我們只希望使用 AForge 資源庫中的這個檔案。選取此 .dll,然後按一下 「開啟」。
回到 Dynamo,您應該會看到資源庫中已加入 AForge 節點群組。現在,可以從我們的視覺程式存取 AForge 影像資源庫!
在下方的連結按一下,下載範例檔案。
附錄中提供完整的範例檔案清單。
現在已匯入資源庫,我們將從這第一個簡易練習 (01-EdgeDetection.dyn) 開始。我們將對範例影像執行某些基本影像處理,以展示 AForge 影像如何進行篩選。我們將使用 Watch Image 節點展示結果,並在 Dynamo 中套用與 Photoshop 中類似的篩選。
File Path 節點僅提供我們所選影像的路徑字串。接下來,我們需要在 Dynamo 中將其轉換為可用的影像檔。
使用 File From Path,在 Dynamo 環境中將檔案路徑項目轉換為影像。
將 File Path 節點連接至 File.FromPath 節點。
為了將此檔案轉換為影像,我們將使用 Image.ReadFromFile 節點。
最後,我們來查看結果!將 Watch Image 節點放在圖元區上,並連接至 Image.ReadFromFile。我們尚未使用 AForge,但已成功將影像匯入 Dynamo。
在 AForge.Imaging.AForge.Filters (「導覽」功能表中) 下,您會發現有許多可用的篩選。我們現在將使用這些篩選的其中之一,以根據閾值對影像執行去飽和度。
將三個滑棒放至圖元區,然後將其範圍變更為 0 到 1,將其步長值變更為 0.01。
在圖元區加入 Grayscale.Grayscale 節點。這是 AForge 篩選,會將灰階篩選套用至影像。從步驟 1 將這三個滑棒連接至 cr、cg 和 cb。將頂部與底部滑棒的值變更為 1,將中間滑棒的值變更為 0。
若要套用灰階篩選,我們需要對影像採取某項動作。為此,我們使用 BaseFilter.Apply。將影像連接至影像輸入,並將 Grayscale.Grayscale 連接至 baseFilter 輸入。
插入 Watch Image 節點,我們得到一個去飽和度的影像。
我們可以控制如何根據紅、綠、藍的閾值對此影像執行去飽和度。這些閾值由 Grayscale.Grayscale 節點的輸入定義。請注意,影像看起來非常暗,這是因為我們的滑棒中將綠色的值設定為 0。
將頂部與底部滑棒的值變更為 0,將中間滑棒的值變更為 1。這樣即可取得更清晰的去飽和度影像。
接下來我們使用去飽和度影像,並對其套用其他篩選。去飽和度影像具有一定的對比度,因此我們要測試某些邊緣偵測。
在圖元區加入 SobelEdgeDetector.SobelEdgeDetector 節點。
將此節點連接至 BaseUsingCopyPartialFilter.Apply,並將去飽和度影像連接至此節點的影像輸入。
Sobel 邊偵測器已在新影像中亮顯邊。
拉近後,邊偵測器已顯示標示圈的外框 (以像素為單位)。AForge 資源庫的工具可利用與此類似的結果並建立 Dynamo 幾何圖形。我們將在下一個練習中探索該功能。
現在我們已介紹了一些基本影像處理,接下來使用影像來驅動 Dynamo 幾何圖形!在本練習中,基本上我們的目的是使用 AForge 與 Dynamo 執行影像的 「即時追蹤」。我們將使用簡易的作業從參考影像中擷取矩形,不過 AForge 中提供了執行更複雜作業的工具。我們將使用下載練習檔案中的 02-RectangleCreation.dyn。
使用 File Path 節點,導覽至練習資料夾中的 grid.jpg。
連接上述其餘的一系列節點,以顯示路線參數式格線。
在圖元區加入 BlobCounter,接著我們需要採取某種方式來處理影像 (類似於上一個練習的 BaseFilter.Apply 工具)。
很遺憾,「處理影像」節點不會立刻顯示在 Dynamo 資源庫中。這是因為函數可能沒有顯示在 AForge 原始程式碼中。若要修正此問題,我們需要尋找因應措施。
在圖元區加入 Python 節點,然後在 Python 節點中加入下列程式碼。此程式碼將匯入 AForge 資源庫,然後處理匯入的影像。
將影像輸出連接至 Python 節點輸入,Python 節點將產生 AForge.Imaging.BlobCounter 結果。
將 Python 指令碼的輸出連接至 BlobCounterBase.GetObjectRectangles。這會讀取影像中的物件,並根據閾值從像素空間萃取量化的矩形。
在圖元區加入另一個 Python 節點,連接至 GetObjectRectangles,然後輸入以下程式碼。這將建立經過組織的 Dynamo 物件清單。
轉置上一步 Python 節點的輸出。這會建立 4 個清單,分別代表每個矩形的 X、Y、寬度及高度。
使用 Code Block 將資料排列為適合 Rectangle.ByCornerPoints 節點的結構 (程式碼如下)。
我們現在有一系列形,代表影像中的白色正方形。透過程式設計,我們已實現與 Illustrator 中的即時追蹤 (大致) 類似的功能!
不過還需要清理一下。拉近後,可以看到有一些不需要的小矩形。
接下來要編寫程式碼,除去不需要的矩形。
在 GetObjectRectangles 節點與另一個 Python 節點之間插入一個 Python 節點。節點的程式碼位於下方,會移除小於指定大小的所有矩形。
消除多餘的矩形後,只是為了好玩,我們將從矩形建立曲面,並根據矩形的面積依距離擠出矩形。
最後,將 both_sides 輸入變更為 false,會產生一個方向的擠出。將產生的此結果浸入樹脂,將產生造型極為奇特的桌子。
我們先前對編輯基本建築量體進行瞭解時,希望一次編輯大量元素,以更深入地探究 Dynamo/Revit 連結。大規模自訂變得更加複雜,因為資料結構需要更高級的清單作業。但是,此作業所遵循的基本原則在本質上並無不同。接下來針對一組自適應元件瞭解分析的某些因素。
假設我們已建立一系列自適應元件,希望根據其點位置來編輯參數。例如,點可以驅動與元素面積相關的厚度參數。或者,點可以驅動與全年日曬相關的不透明度參數。藉由 Dynamo,可以使用一些簡單的步驟將分析連接至參數,我們將在以下練習中探究基本版本。
使用 AdaptiveComponent.Locations 節點查詢所選自適應元件的自適應點。這可讓我們使用提取出的 Revit 元素進行分析。
透過萃取自適應元件的點位置,我們可以對該元素執行一系列分析。藉由四點自適應元件,您可以針對諸如指定面板等物件研究平面的偏差。
使用重新對映將一組資料對映到參數範圍。這是參數式模型中使用的基本工具,我們將在以下練習中展示該工具。
使用 Dynamo,自適應元件的點位置可用於建立每個元素的最佳擬合平面。我們也可以在 Revit 檔案中查詢日光位置,研究平面相對於日光的方位,並與其他自適應元件進行比較。在以下的練習中,我們將建立由演算法控制的屋頂,以設置該功能。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
此練習將詳細說明上一節中示範的技巧。在此案例中,我們將使用 Revit 元素定義參數式曲面,同時實體化四點自適應元件,然後根據太陽方位對其進行編輯。
先選取兩條邊與 「Select Edge」 節點。兩條邊是中庭的長跨距。
使用 List.Create 節點將兩條邊合併到一個清單中。
使用 Surface.ByLoft 在兩條邊之間建立曲面。
使用 Code Block,定義從 0 至 1 的範圍 (包含均勻分佈的 10 個值):
0..1..#10;
將 Code Block 插入 Surface.PointAtParameter 節點的 u 與 v 輸入,並將 Surface.ByLoft 節點插入 surface 輸入。在節點上按一下右鍵,將 交織 變更為 「笛卡兒積」。這將在曲面上產生點的網格。
此點網格可作為以參數式方式定義之曲面的控制點。我們希望萃取其中每個點的 u 與 v 位置,以便能將其插入至參數式公式,並保留相同的資料結構。我們可以查詢剛剛建立點的參數位置,以執行此作業。
在圖元區加入 Surface.ParameterAtPoint 節點,連接輸入,如上所示。
使用 UV.U 節點查詢這些參數的 u 值。
使用 UV.V 節點查詢這些參數的 v 值。
輸出會顯示每個曲面點的對應 u 與 v 值。現在我們已取得所需範圍,每個值都介於 0 與 1 之間,並具有正確的資料結構,我們已準備好套用參數式演算法。
在圖元區加入 Code Block,然後輸入程式碼:
Math.Sin(u*180)*Math.Sin(v*180)*w;
。這是一個參數式函數,可從平面建立正弦凸塊。將 UV.U 連接至 u 輸入,將 UV.V 連接至 v 輸入。
w 輸入表示形狀的 幅度,因此我們為其連接 Number Slider。
現在,我們有一個由演算法定義的值清單。接下來使用此值清單在 +Z 方向將點上移。使用 Geometry.Translate,將 Code Block 插入 zTranslation,並將 Surface.PointAtParameter 插入 geometry 輸入。您應該會看到新的點顯示在 Dynamo 預覽中。
最後,我們使用 NurbsSurface.ByPoints 節點建立曲面,將上一步驟中的節點插入 points 輸入。我們建立了自己的參數式曲面。自由拖曳滑棒,觀看凸塊的收縮與膨脹。
使用參數式曲面,我們要定義將其面板化的方式,以排列四點自適應元件。Dynamo 沒有即裝即用的曲面平板化功能,因此我們可以尋找社群是否有實用的 Dynamo 套件。
移至 「套件」>「搜尋套件...」
搜尋 LunchBox,並安裝 LunchBox for Dynamo。對於諸如此類的幾何圖形作業,這是非常有用的一組工具。
下載之後,您現在可以完整存取 LunchBox 套件。搜尋 Quad Grid,然後選取 LunchBox Quad Grid By Face。將參數式曲面插入至 surface 輸入,並將 U 與 V 分割份數設定為 15。您在 Dynamo 預覽中應該會看到一個有四邊形平板的曲面。
如果您對其設置感到好奇,可以按兩下 Lunch Box 節點,並查看其內容。
返回 Revit,接下來快速查看我們將在這裡使用的自適應元件。無需沿其作業,但這是我們將要實體化的屋頂面板。它是四點自適應元件,是 ETFE 系統的粗略表示。中心空心的鎖點框與稱為 ApertureRatio 的參數有關。
我們將在 Revit 中實體化大量幾何圖形,因此請確保將 Dynamo 求解器調整為 「手動」。
在圖元區加入 Family Types 節點,然後選取 「ROOF-PANEL-4PT」。
在圖元區加入 AdaptiveComponent.ByPoints 節點,將 Panel Pts 從 LunchBox Quad Grid by Face 輸出連接至 points 輸入。將 Family Types 節點連接至 familySymbol 輸入。
按一下 「執行」。建立幾何圖形時,Revit 需要_考慮_一段時間。若花費太長時間,請將 Code Block 的「15」 減少為較小的數字。這將減少屋頂上面板的數量。
注意:若 Dynamo 花費很長時間來計算節點,您可能要在開發圖表時,使用「凍結」節點功能以暫停所執行的 Revit 作業。如需有關凍結節點的更多資訊,請參閱〈實體〉一章中的〈凍結〉一節。
返回 Revit,我們已在屋頂上建立一系列面板。
拉近,我們可以更近地查看其曲面品質。
從上一步繼續執行,接下來更進一步,根據其日曬時間驅動每個面板的孔徑。拉近至 Revit,選取一個面板,可以看到在性質列中,有一個名為 Aperture Ratio 的參數。設置族群,讓孔徑的範圍大致介於 0.05 到 0.45 之間。
如果打開太陽路徑,可以在 Revit 中看到目前的太陽位置。
我們可以使用 SunSettings.Current 節點參考此太陽位置。
將太陽設定插入 Sunsetting.SunDirection 以取得太陽向量。
從用於建立自適應元件的 Panel Pts 中,使用 Plane.ByBestFitThroughPoints 近似元件的平面。
查詢此平面的 法向。
使用 內積 計算太陽方位。內積是一個決定兩個向量平行程度的公式。我們將取得每個自適應元件的平面法向,並與太陽向量進行比較,以粗略模擬太陽方位。
採用結果的 絕對值。這可確保在平面法向指向相反方向時,內積是準確的。
按一下 「執行」 。
看看 內積 ,我們產生了許多數字。我們希望使用其相對分佈,但需要將這些數字縮攏到我們想要編輯的 Aperture Ratio 參數的適當範圍內。
Math.RemapRange 是執行此作業的強大工具。它採用輸入清單,並將邊界重新對映到兩個目標值。
在 Code Block 中,將目標值定義為 0.15 與 0.45。
按一下 「執行」 。
將重新對映的值連接至 Element.SetParameterByName 節點。
將字串 Aperture Ratio 連接至 parameterName 輸入。
將 adaptive components 連接至 element 輸入。
按一下 「執行」 。
返回 Revit,透過距離,我們可以瞭解太陽方位對 ETFE 面板孔徑產生的影響。
拉近,我們可以看到在面向日光時,ETFE 面板更為封閉。此時我們的目標是減少日曬帶來的過熱。如果我們根據日曬而希望讓更多光線進入,只需在 Math.RemapRange 上切換範圍即可。
在參數層級編輯參數是 Dynamo 的一項強大功能。例如,高生產力的演算法或模擬結果可用於驅動該元素陣列的參數。如此一來,同一族群的一組實體在您的 Revit 專案中就可以有自訂性質。
實體參數定義屋頂曲面上的嵌板孔徑,開口率的範圍是 0.1 至 0.4。
以類型為基礎的參數將套用到曲面上的每個元素,因為它們的族群類型相同。例如,每片嵌板的材料可以由以類型為基礎的參數驅動。
如果您先前已設置 Revit 族群,請記住,必須指定參數類型 (字串、數字、標註等)。 從 Dynamo 指定參數時,請確保使用正確的資料類型。
您也可以搭配使用 Dynamo 與 Revit 族群性質中定義的參數式約束。
做為在 Revit 中對參數的快速檢閱,我們還記得存在類型參數與實體參數。兩者都可以在 Dynamo 中進行編輯,但我們在以下練習中將使用實體參數。
自 0.8 版起,Dynamo 基本上不使用單位。Dynamo 藉此可保持抽象的視覺程式設計環境。與 Revit 標註互動的 Dynamo 節點將參考 Revit 專案的單位。例如,若您在 Dynamo 中設定 Revit 中的長度參數,則在 Dynamo 中該值的數字將對應於 Revit 專案中的預設單位。以下的練習以公尺為單位。
為了快速轉換單位,我們使用 「Convert Between Units」 節點。此工具使用方便,可即時轉換長度、面積與體積單位。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
以下的練習以公尺為單位。
此練習的重點是在 Dynamo 中編輯 Revit 元素而不執行幾何作業。在此我們不匯入 Dynamo 幾何圖形,只編輯 Revit 專案中的參數。此練習是基本練習,對於更高級的 Revit 使用者,請注意這些是量體的實體參數,但可以將相同的邏輯套用至元素陣列,以實現大規模的自訂。僅使用「Element.SetParameterByName」節點即可完成此練習。
先從本節的範例 Revit 檔案開始。我們已移除上一節的結構元素與自適應桁架。在本練習中,我們將重點瞭解 Revit 中的參數式骨架以及 Dynamo 中的操控。
在 Revit 的量體中選取建築,我們將在性質面板中看到實體參數的陣列。
在 Dynamo 中,我們可以選取目標元素來擷取參數。
使用 「Select Model Element」 節點選取建築量體。
使用 「Element.Parameters」 節點,我們可以查詢此量體的所有參數。這包括類型參數與實體參數。
參考 Element.Parameters 節點,以尋找目標參數。或者,我們可以檢視上一步的性質面板,以選擇希望編輯的的參數名稱。在此案例中,我們將尋找對建築量體上的大型幾何移動有影響的參數。
我們將使用 Element.SetParameterByName 節點變更 Revit 元素
使用 Code Block 定義參數清單,每個項目周圍加上引號以表示是一個字串。我們也可以使用 List.Create 節點,搭配一系列 「字串」 節點連接至多個輸入,但使用 Code Block 更快、更輕鬆。請確保字串與 Revit 中的名稱完全相符 (包含大小寫):
{"BldgWidth","BldgLength","BldgHeight", "AtriumOffset", "InsideOffset","LiftUp"};
我們還希望指定每個參數的值。在圖元區中加入六個 「Integer Slider」 ,並更名為清單中的對應參數。此外,按照以上影像設定每個滑棒的值。從上到下依序為:62、92、25、22、8、12
使用與參數名稱具有相同長度的清單定義另一個 Code Block。在此案例中,我們命名的變數 (沒有引號) 會建立 Code Block 的輸入。將 滑棒 插入每個各自的輸入:
{bw,bl,bh,ao,io,lu};
將 Code Block 連接至 「Element.SetParameterByName」* 值輸入。勾選「自動執行」後,我們會自動看到結果。
*此示範使用實體參數,而不是類型參數。
正如在 Revit 中一樣,其中許多參數彼此依賴。當然,存在可能導致幾何圖形中斷的組合。我們可以使用參數性質中定義的公式來解決此問題,也可以使用 Dynamo 中的數學運算來設置類似邏輯 (如果您希望在此練習基礎上進行拓展,這是另一項難題)。
此組合會為建築量體產生很酷的新設計:100、92、100、25、13、51
接下來,我們來看看如何使用類似流程編輯正面。
複製圖表,然後著重瞭解容納桁架系統的正面釉面玻璃。在此範例中,我們隔離四個參數:
{"DblSkin_SouthOffset","DblSkin_MidOffset","DblSkin_NorthOffset","Facade Bend Location"};
此外,我們將建立 Number Slider,並將其更名為適當的參數。前三個滑棒從上到下應重新對映至範圍 [0,10],而最後一個滑棒 「Facade Bend Location」 應重新對映至範圍 [0,1]。這些值從上到下在開始時應採用以下值 (雖然這些是隨機值):2.68、2.64、2.29、0.5
定義新的 Code Block 並連接滑棒:
{so,mo,no,fbl};
透過變更此部分圖表中的 滑棒,我們可以大幅提升正面釉面玻璃的重要性:9.98、10.0、9.71、0.31
您可以在 Dynamo 中建立具有完整參數式控制的一系列 Revit 元素。藉由 Dynamo 中的 Revit 節點,可以將元素從一般幾何圖形匯入至特定的品類類型 (例如牆與地板)。在本節中,我們將著重講解使用自適應元件以參數式方式匯入彈性元素。
自適應元件是非常適用於生產應用的彈性族群品類。在實體化之後,您可以建立由自適應點的基本位置驅動的複雜幾何元素。
以下是族群編輯器中一個三點自適應元件的範例。這將產生由每個自適應點的位置定義的桁架。在以下練習中,我們將使用此元件在正面產生一系列桁架。
自適應元件是採用互通性最佳實務的良好範例。我們可以定義基本自適應點,以建立一系列自適應元件。此外,若將此資料傳輸至其他程式,我們可以將幾何圖形精簡為簡單的資料。使用程式 (例如 Excel) 執行匯入與匯出將遵循類似的邏輯。
假設正面顧問希望瞭解桁架元素的位置,而無需剖析完全連接的幾何圖形。在準備製造時,顧問可以參考自適應點的位置,以便在諸如 Inventor 等程式中重新產生幾何圖形。
藉由我們將在以下練習中設置的工作流程,我們可以存取所有此類資料,同時建立用於建立 Revit 元素的定義。透過此程序,我們可以將概念化、記錄與製造合併為順暢的工作流程。此作業會建立更智慧、更高效的程序以實現互通性。
將參數式 Dynamo 幾何圖形匯入至 Revit 的另一種方法是使用 DirectShape。總之,DirectShape 元素與相關類別支援在 Revit 文件中儲存外部建立的幾何造型。幾何圖形可以包括封閉實體或網格。DirectShape 主要用於在未提供足夠的資訊以建立「真實」的 Revit 元素時,匯入其他資料格式 (例如 IFC 或 STEP) 的造型。與 IFC 與 STEP 工作流程類似,DirectShape 功能可以成功將 Dynamo 建立的幾何圖形匯入 Revit 專案中作為真實的元素。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
從本節的範例檔案開始 (或繼續使用上一節課的 Revit 檔案),我們會看到同一個 Revit 量體。
這是開啟的檔案。
這是我們使用 Dynamo 建立的桁架系統,並採用智慧方式將其連結至 Revit 量體。
我們此前使用的是 「Select Model Element」 與 「Select Face」 節點,現在我們在幾何圖形階層中更進一步,使用 「Select Edge」。將 Dynamo 求解器設定為 「自動」 執行後,圖表會根據 Revit 檔案中的變更而持續更新。我們將選取的邊已動態連結至 Revit 元素拓樸。只要拓樸* 沒有變更,Revit 與 Dynamo 之間的關聯就會保持連結狀態。
選取釉面玻璃正面最頂端的曲線。它跨越建築的完整長度。如果您無法選取邊,請記住將游標懸停在邊上,然後按一下 「Tab」 鍵,直到所需的邊亮顯為止,由此在 Revit 中選擇供選取的物件。
使用兩個 「Select Edge」 節點,選取表示正面中央處外角的每條邊。
在 Revit 中對正面底部的邊執行相同程序。
Watch 節點顯示出我們現在已在 Dynamo 中建立線。這會自動轉換為 Dynamo 幾何圖形,因為邊本身不是 Revit 元素。這些曲線是我們在正面對自適應桁架進行實體化將使用的參考。
*為了讓拓樸保持一致,我們將參考未額外加入面或邊的模型。雖然參數可變更其造型,但是其建置方式保持一致。
我們需要先接合曲線,並將其合併至一個清單。這樣我們可以將曲線 「分組」 以執行幾何圖形作業。
建立正面中央兩條曲線的清單。
將 List.Create 元件插入 Polycurve.ByJoinedCurves 節點,以便將兩條曲線接合為 polycurve。
建立正面底部兩條曲線的清單。
將 List.Create 元件插入 Polycurve.ByJoinedCurves 節點,以便將兩條曲線接合為 polycurve。
最後,將三條主要曲線 (一條直線與兩條 PolyCurve) 接合到一個清單中。
我們希望利用頂部曲線,它是直線,並能呈現正面的完整跨度。我們將沿這條線建立平面,與我們在清單中歸為一組的一組曲線相交。
運用 Code Block,使用以下語法定義範圍:
0..1..#numberOfTrusses;
將 Integer Slider 插入 Code Block 的輸入。您可能已猜到,這會代表桁架的數量。請注意,滑棒控制從 0 到 1 定義的範圍內的項目數量。
將 Code Block 插入 「Curve.PlaneAtParameter」 節點的 param 輸入,將頂部的邊插入 curve 輸入。這會產生十個平面,均勻分佈在正面的跨度內。
平面是抽象的幾何圖形,表示無限的二維空間。平面非常適合描述等高與相交,正如我們在此步驟中的設置所示。
使用 Geometry.Intersect 節點 (將交織設為笛卡兒積),將 Curve.PlaneAtParameter 插入 Geometry.Intersect 節點的 entity 輸入。將主要 List.Create 節點插入 geometry 輸入。現在,我們可以在 Dynamo 視埠中看到表示每條曲線與定義的平面相交的點。
請注意,輸出是清單的清單的清單。我們為達到目的而使用的清單過多。在此,我們希望進行局部平坦化。我們需要對清單更進一步,對結果執行平坦化。為了執行此作業,我們使用 List.Map 作業,如手冊的清單一章中的討論所示。
將 Geometry.Intersect 節點插入 List.Map 的清單輸入。
將 Flatten 節點插入 List.Map 的 f(x) 輸入。結果將產生 3 個清單,每個清單都包含與桁架數量相等的計數。
我們需要變更此資料。如果我們希望實體化桁架,必須使用與族群中所定義的數量相同的自適應點。這是三點自適應元件,因此我們希望使用的不是各包含 10 個項目 (numberOfTrusses) 的三個清單,而是各包含三個項目的 10 個清單。這樣我們可以建立 10 個自適應元件。
將 List.Map 插入 List.Transpose 節點。現在我們已取得所需的資料輸出。
若要確認資料正確無誤,請在圖元區中加入 Polygon.ByPoints 節點,然後再次查看 Dynamo 預覽。
我們以同樣的方式建立了多邊形,並對自適應元件進行排列。
在圖元區加入 AdaptiveComponent.ByPoints 節點,將 List.Transpose 節點插入 points 輸入。
使用 Family Types 節點,選取 「AdaptiveTruss」 族群,並將其插入 AdaptiveComponent.ByPoints 節點的 FamilyType 輸入。
在 Revit 中,我們現在建立了十個均勻分佈在正面跨度範圍內的桁架。
「調整」圖表,透過變更滑棒將 numberOfTrusses 提高為 30。桁架很多,這並非很現實,但是參數式連結的確有效。驗證後,將 numberOfTrusses 設定為 15。
在最終測試中,透過在 Revit 內選取量體並編輯實體參數,我們可以變更建築的形狀,並看到桁架與之相符。請記住,必須開啟此 Dynamo 圖表,才能看到此更新,一旦該圖表關閉,連結將中斷。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
首先,開啟本課程的範例檔案 ARCH-DirectShape-BaseFile.rvt。
在 3D 視圖中,我們可以看到上一課的建築量體。
沿著中庭的邊是一條參考曲線,我們會將其用作在 Dynamo 中參考的曲線。
沿著中庭的相對一邊是另一條參考曲線,我們也會在 Dynamo 中對其進行參考。
為了在 Dynamo 中參考幾何圖形,我們將對 Revit 中的每個成員使用 Select Model Element。在 Revit 中選取量體,並使用 Element.Faces 將幾何圖形匯入 Dynamo,現在 Dynamo 預覽中應該可以看到量體。
使用 Select Model Element 與 CurveElement.Curve 將一條參考曲線匯入 Dynamo。
使用 Select Model Element 與 CurveElement.Curve 將另一條參考曲線匯入 Dynamo。
結構由三個主要參數驅動,分別是 Diagonal Shift、Camber 與 Radius。
進行縮放,特寫查看此圖表的參數。我們可以調整這些參數,以得到不同的幾何圖形輸出。
將 DirectShape.ByGeometry 節點置於圖元區上,我們可以看到它有四個輸入:geometry、category、material 和 name。
幾何圖形是將要從圖表的幾何圖形建立部分建立的實體
使用下拉式 Categories 節點選擇品類輸入。在此案例中,我們將使用「Structural Framing」。
透過以上的一系列節點選取材料輸入 (雖然在此案例中定義為「預設」會更簡單)。
執行 Dynamo 後,返回 Revit,專案中的屋頂上已存在匯入的幾何圖形。這是結構框架元素,而不是一般模型。Dynamo 的參數式連結保持不變。
編輯文件的參數將遵循先前諸節學習的課程。在本節中,我們將瞭解編輯參數,這些參數不會影響元素的幾何性質,而是會準備供記錄的 Revit 檔案。
在以下練習中,我們將使用平面節點的基本偏差,以建立供記錄的 Revit 圖紙。在以參數式方式定義的屋頂結構上,每個面板都有不同的偏差值,我們希望使用顏色以及安排自適應點來指定值的範圍,以便交給正面顧問、工程師或承包商。
平面節點的偏差將計算一組四個點與各點之間最佳擬合平面的距離。這是快速輕鬆的建構研究方式。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
從本節的 Revit 檔案開始 (或繼續使用上一節課的檔案)。此檔案的屋頂上具有一系列 ETFE 面板。我們在此練習中會參考這些面板。
在圖元區加入 Family Types 節點,然後選擇 「ROOF-PANEL-4PT」。
將此節點插入 All Elements of Family Type 節點,以便將 Revit 的所有元素匯入 Dynamo。
使用 AdaptiveComponent.Locations 節點查詢每個元件的自適應點位置。
使用 Polygon.ByPoints 節點從這四點建立多邊形。請注意,現在我們已在 Dynamo 中建立抽象版本的面板化系統,而無需匯入 Revit 元素的完整幾何圖形。
使用 Polygon.PlaneDeviation 節點計算平面偏差。
就像上一個練習一樣,只是為了好玩,接下來我們根據平面偏差設定每個面板的孔徑比。
在圖元區加入 Element.SetParameterByName 節點,並將自適應元件連接至 element 輸入。將名為 「Aperture Ratio」 的 Code Block 連接至 parameterName 輸入。
我們無法將偏差結果直接連接至值輸入,因為需要將值重新對映到參數範圍。
使用 Math.RemapRange,透過在 Code Block 中輸入
0.15; 0.45;
,將偏差值重新對映到從 0.15 到 0.45 之間的範圍。將這些結果重新插入 Element.SetParameterByName 的 value 輸入。
回到 Revit,我們會 稍微 理解曲面上孔徑的變更。
拉近時,可以更清晰地看到封閉面板向曲面的轉角加重。開放轉角朝向頂部。轉角代表偏差較大的區域,而凸度具有最小的曲率,因此這合乎邏輯。
設定孔徑比不會清楚展示屋頂上面板的偏差,我們還要變更實際元素的幾何圖形。假設我們只希望從製造可行性的觀點研究偏差。根據記錄的偏差範圍對面板上色會很有幫助。我們可以透過以下一系列步驟,採用與上述步驟非常相似的程序來達成。
移除 Element.SetParameterByName 及其輸入節點,並加入 Element.OverrideColorInView。
在圖元區加入 Color Range 節點,並插入 Element.OverrideColorInView 的 color 輸入。我們仍必須將偏差值連接至顏色範圍,以建立漸層。
將游標懸停在 value 輸入上,我們可以看到輸入的值必須介於 0 與 1 之間,才能將顏色對映至每個值。我們需要將偏差值重新對映到此範圍。
使用 Math.RemapRange,將平面偏差值重新對映到從 0 到 1 之間的範圍 (注意:您也可以使用 MapTo 節點來定義來源範圍)。
將結果插入 Color Range 節點。
請注意,我們的輸出是一系列顏色,而不是一系列數字。
如果您要設定為「手動」,請按一下 「執行」 。從現在起,您應該能設定為「自動」。
返回 Revit,我們可以看到更清晰的漸層,該漸層根據顏色範圍表示平面偏差。如果我們希望自訂顏色會怎樣呢?請注意,最小偏差值以紅色表示,這似乎與我們的預期相反。我們希望以紅色表示最大偏差,以更冷的顏色表示最小偏差。接下來回到 Dynamo 並修正此問題。
使用 Code Block,在不同的兩行程式碼中加入兩個數字:
0;
與255;
。將適合的值插入兩個 Color.ByARGB 節點,以建立紅色與藍色。
使用這兩種顏色建立清單。
將此清單插入 Color Range 的 colors 輸入,然後查看自訂顏色範圍更新。
回到 Revit,現在我們可以更深刻理解轉角的最大偏差區域。請記住,此節點用於在視圖中取代顏色,因此如果一組圖面中包含著重於特定類型分析的特定圖紙,該節點會很有幫助。
在 Revit 中選取一個 ETFE 面板,我們可以看到有四個實體參數,分別是 XYZ1、XYZ2、XYZ3 與 XYZ4。這些參數在建立之後都是空白的。這些是需要值的文字參數。我們將使用 Dynamo 將自適應點位置寫入每個參數。這有助於在需要將幾何圖形傳送給正面顧問的工程師時實現互通性。
在範例圖紙中,我們建立了一個很大的空白明細表。XYZ 參數是 Revit 檔案中的共用參數,我們可藉此將其加入明細表中。
拉近,XYZ 參數都尚未填寫。前兩個參數由 Revit 負責。
為了寫入這些值,我們將執行複雜的清單作業。圖表本身很簡單,但概念很大程度上依賴於〈清單〉一章中討論的清單對映。
使用兩個節點選取所有自適應元件。
使用 AdaptiveComponent.Locations 擷取每個點的位置。
將這些點轉換為字串。請記住,該參數是文字參數,因此我們需要輸入正確的資料類型。
建立包含四個字串的清單,這四個字串定義要變更的參數:XYZ1、XYZ2、XYZ3 與 XYZ4。
將此清單插入 Element.SetParameterByName 的 parameterName 輸入。
將 Element.SetParameterByName 連接至 List.Combine 的 combinator 輸入。將 adaptive components 連接至 list1。將物件的 String 連接至 list2。
我們在此列出對映,因為要為每個元素寫入四個值,這會建立複雜的資料結構。List.Combine 節點會定義資料階層中下一層級的作業。這是為什麼 Element.SetParameterByName 的 element 和 value 輸入皆留空。List.Combine 會根據連接順序,將其輸入的子清單連接至 Element.SetParameterByName 的空白輸入。
在 Revit 中選取面板,現在我們可以看到每個參數都具有字串值。實際上,我們可以建立更簡單的點 (X,Y,Z) 寫入格式。在 Dynamo 中使用字串作業即可實現該功能,但這裡我們略過此內容,而繼續討論本章內容。
已填寫參數的範例明細表視圖。
現在,每個 ETFE 面板都具有針對每個自適應點而寫入的 XYZ 座標,表示用於製作的每個面板的轉角。
Revit 是資料豐富的環境。這能為我們提供許多選取功能,而不僅僅是「點選」。我們可以查詢 Revit 資料庫,並將 Revit 元素動態連結至 Dynamo 幾何圖形,同時執行參數式作業。
使用者介面中的 Revit 資源庫提供「Selection」品類,藉此可採用許多方式選取幾何圖形。
若要正確選取 Revit 元素,請務必全面理解 Revit 元素階層。要選取專案中所有的牆嗎?請依品類選取。要選取中世紀現代大廳中的每把 Eames 椅子嗎?請依族群選取。
我們來快速複習 Revit 階層。
記得生物學的分類法嗎?界、門、綱、目、科、屬、種?Revit 元素的分類方式與此類似。在基本層級,可將 Revit 階層分為不同的品類、族群、類型*及例證。例證是個別模型元素 (具有唯一的 ID),而品類可定義一般群組 (例如「牆」或「地板」)。以此方式組織 Revit 資料庫後,我們可以選取一個元素,然後根據階層中的指定層級選擇所有類似元素。
*Revit 中類型的定義與程式設計中的類型不同。在 Revit 中,類型是指階層的分支,而非「資料類型」。
以下三個影像分別展示了 Dynamo 中 Revit 元素選取的主要品類。這些工具十分適合互相搭配使用,在後續練習中會研究其中部分工具。
點選 是直接選取 Revit 元素最簡單的方式。您可以選取完整的模型元素,也可以選取其拓樸的一部分 (例如一個面或一條邊)。這會與該 Revit 物件保持動態連結,因此在 Revit 檔案更新其位置或參數時,參考的 Dynamo 元素在圖表中也將更新。
下拉式功能表 會建立 Revit 專案中所有可存取元素的清單。您可以使用下拉式功能表參考視圖中不一定可見的 Revit 元素。這是非常強大的工具,可用於在 Revit 專案或族群編輯器中查詢既有元素或建立新元素。
![](../.gitbook/assets/selecting _database_navigation_with_dynamo_nodes_02.png)
您也可以依 _Revit 階層_中的特定層級選取 Revit 元素。這是一個功能強大的選項,可自訂大型資料陣列,以準備進行記錄或生產實體化及客製化。
記住以上三個影像,接下來深入練習,練習會選取基本 Revit 專案中的元素,為我們將在本章其餘各節建立的參數式應用程式做好準備。
在下方的連結按一下,下載範例檔案。
附錄中提供完整的範例檔案清單。
在此範例 Revit 檔案中,包含一個簡單建築的三種元素類型。我們會以此為例,在 Revit 階層的環境中選取 Revit 元素。
建築量體
樑 (結構框架)
桁架 (自適應元件)
根據 Revit 專案視圖中目前存在的元素,我們可以做出哪些結論?若要選取適當的元素,我們需要在階層中下移多遠?處理大型專案時,這無疑會變為更複雜的工作。有許多選項可供使用,選取元素時可依據品類、層級、族群、例證等。
由於我們使用基本設置,因此我們在「Categories」下拉式節點中選擇 「Mass」 來選取建築量體。您可以在「Revit」>「Selection」頁籤中找到。
「Mass」品類的輸出是品類自身。我們需要選取元素。為了執行此作業,我們使用 All Elements of Category 節點。
此時請注意,我們在 Dynamo 中看不到任何幾何圖形。我們已選取 Revit 元素,但尚未將該元素轉換為 Dynamo 幾何圖形。這是重要的區分。選取大量元素時,不建議在 Dynamo 中預覽所有元素,因為這樣會拖慢所有作業的速度。Dynamo 這個工具無需執行幾何運算,即可管理 Revit 專案。本章的下一節會進一步說明該功能。
在此案例中,我們將使用簡單的幾何圖形,因此希望將幾何圖形引入 Dynamo 預覽。上面 Watch 節點中的「BldgMass」旁有一個綠色數字。這代表該元素的 ID,可看出我們目前在處理 Revit 元素,而不是 Dynamo 幾何圖形。下一步是將此 Revit 元素轉換為 Dynamo 中的幾何圖形。
使用 Element.Faces 節點,可取得一份曲面清單,代表 Revit 量體的每一個面。我們現在可以在 Dynamo 視埠中看到幾何圖形,可以開始參考用於參數式作業的面。
以下是替代方法。在此案例中,我們不是透過 Revit 階層選取 (「All Elements of Category」),而是選擇在 Revit 中明確選取幾何圖形。
使用 Select Model Element 節點,按一下「選取」(或 「變更」) 按鈕。在 Revit 視埠中,選取所需的元素。在此案例中,我們將選取建築量體,
我們可以使用 Element.Geometry 選取完整量體作為一個實體幾何圖形,而非 Element.Faces。這會選取該量體內包含的所有幾何圖形。
我們可以使用 Geometry.Explode 再次得到曲面清單。這兩個節點的運作方式與 Element.Faces 相同,但是提供其他選項用於探究 Revit 元素的幾何圖形。
使用一些基本清單作業,我們可以查詢感興趣的面。
首先,將前面選取的元素輸出至 Element.Faces 節點。
接著,使用 List.Count 節點顯示出我們正在處理量體中的 23 個曲面。
參考此數量,我們將 Integer Slider 的最大值變更為 「22」 。
使用 List.GetItemAtIndex,我們輸入清單和 Integer Slider 以提供 index。在選取的值之間滑動,到達 index 9 時停止,如此就隔離了支撐桁架的主要正面。
上一個步驟稍顯繁瑣。使用 Select Face 節點可以更快執行此作業。藉此可以隔離 Revit 專案中並非元素本身的面。互動方式與 Select Model Element 相同,只是選取的是曲面,而不是完整的元素。
假設我們要隔離建築的主要正面牆。我們可以使用 Select Faces 節點執行此作業。請按一下「選取」按鈕,然後在 Revit 中選取四個主要正面。
選取四面牆後,務必在 Revit 中按一下「完成」按鈕。
現在,這些面已匯入 Dynamo 成為曲面。
現在,我們看看中庭上方的樑。
使用 Select Model Element 節點,選取其中一根樑。
將樑元素插入 Element.Geometry 節點,現在可在 Dynamo 視埠中看到樑。
可以使用 Watch3D 節點拉近幾何圖形 (若未在 Watch 3D 中看到樑,請按一下右鍵,然後按一下「縮放至佈滿」)。
Revit/Dynamo 工作流程中可能經常會遇到以下問題:如何選取一個元素並取得所有類似元素?由於選取的 Revit 元素包含其所有階層資訊,因此我們可以查詢其族群類型,並選取該類型的所有元素。
將樑元素插入 Element.ElementType 節點。
Watch 節點顯示現在輸出是族群符號,而不是 Revit 元素。
Element.ElementType 是個簡單的查詢,因此我們在程式碼區塊執行時可以像使用
x.ElementType;
一樣輕鬆,並得到相同結果。
為了選取其餘的樑,需使用 All Elements of Family Type 節點。
Watch 節點顯示我們已選取五個 Revit 元素。
我們也可以將所有這五個元素轉換為 Dynamo 幾何圖形。
是否不論何種情況,若要匯入 500 根樑,所有曲面都需要執行所需的參數運算?還是其實可以擷取樑的基本資訊,並使用基本幾何圖形執行生成工作?在逐步瞭解本章內容的過程中,需要隨時考慮這個問題。例如,我們接下來看看桁架系統。
使用相同的節點圖表,選取桁架元素而不是樑元素。執行此作業之前,刪除上一步驟中的 Element.Geometry。
接下來,我們準備從桁架族群類型擷取一些基本資訊。
在 Watch 節點中,可以看到我們從 Revit 中選取的自適應元件清單。我們希望擷取基本資訊,因此從自適應點開始。
將 All Elements of Family Type 節點插入 AdaptiveComponent.Location 節點。這會產生一個清單的清單,其中每個清單都包含三點,表示自適應點的位置。
若連接 Polygon.ByPoints 節點,即會傳回 polycurve,可以在 Dynamo 視埠中看到。透過此方法,我們看到了一個元素的幾何圖形,並提取了其餘一系列元素 (數量可能多於此範例) 的幾何圖形。
秘訣:若在 Dynamo 中按一下 Revit 元素的綠色數字,Revit 視埠將縮放至該元素。
/
/
/
本節將示範如何使用 Zero-Touch 匯入協力廠商的資源庫。如需有關開發自己 Zero-Touch 資源庫的資訊,請參考 。
Zero-touch 套件是使用者定義之自訂節點的良好補充。下表列出使用 C# 資源庫的一些套件。如需有關套件的更多詳細資訊,請造訪附錄中的。
在本案例研究中,我們將展示如何匯入 外部 .dll 資源庫。AForge 是功能強大的資源庫,提供從影像處理到人工智慧的一系列功能。我們將參考 AForge 的影像類別執行以下的一些影像處理練習。
我們從下載 AForge 開始。在 上,選取 [Download Installer (下載安裝程式)],並在下載完成後進行安裝。
若要匯入影像,請在圖元區加入 File Path 節點,並從練習資料夾 (相片來源:) 中選取「soapbubbles.jpg」。
在下一步,我們將參考影像中的白色正方形,並將其轉換為實際的 Dynamo 幾何圖形。AForge 具有許多功能強大的電腦視覺工具,這裡我們要使用其中一種很重要的資源庫工具,名為 。
後續步驟會展現一些熟練使用 的技巧。不必學會這些,也能處理 Dynamo 工作。這比較算是用來示範 Dynamo 環境的靈活度,可搭配多種外部資源庫使用。
以上是基本範例,但這裡描述的概念可以轉變成令人興奮的真實應用。電腦視覺可用於許多程序。這裡列示一些範例:條碼讀取器、透視配合、及。如需此練習相關的更多 AForge 進階主題,請完整閱讀。
在探索編輯參數的廣泛應用時,您可能希望在 Revit 中使用 Dynamo 編輯大量元素。這是_運算量極大的_作業,即作業可能很慢。若您要編輯大量元素,可能需要在開發圖表時,使用「凍結」節點功能以暫停執行 Revit 作業。如需有關凍結節點的更多資訊,請參閱〈實體〉一章中的一節。
以下將講解 Dynamo 如何參考用於建立 Revit 元素的資料。為了產生多個自適應元件,我們定義了清單的清單,其中每個清單都包含三點,表示自適應元件的每個點。在 Dynamo 中管理資料結構時,我們將記住這一點。
我們來逐步進行,將 Dynamo 幾何圖形作為 DirectShape 匯入 Revit 專案。使用此方法,我們可以指定所匯入幾何圖形的品類、材料與名稱等所有內容,同時保持 Dynamo 圖表的參數式連結。
拉遠並平移至範例圖表中的右側,可以看到大型節點群組,這些是幾何圖形作業,將產生 Dynamo 預覽中可見的格架屋頂結構。這些節點是使用手冊的中討論的 將節點轉換為程式碼 功能產生。
如果有 500 根樑會怎樣呢?將所有這些元素轉換為 Dynamo 幾何圖形會非常慢。若 Dynamo 花費很長時間來計算節點,您可能要在開發圖表時,使用「凍結」節點功能以暫停執行 Revit 作業。如需有關凍結節點的更多資訊,請參閱〈實體〉一章中的一節。
一段時間後,您可能會發現自己不只需要基礎知識,還需要更深入瞭解 Dynamo 的內部運作。本節中的頁面將提供您在 Dynamo for Civil 3D 中解鎖進階功能的藍圖,以便您可以將圖表提升到下一個層次。
標誌/影像
名稱
典型住宅開發的工程設計涉及使用數個地下公共設施,例如污水管、雨水排水、飲用水或其他。此範例將示範如何使用 Dynamo 繪製從分佈主線到指定基地 (即宗地) 的服務連接。每個基地通常都需要連接服務,這使得放置所有服務的工作相當繁瑣。Dynamo 可以自動精確繪製必要的幾何圖形,並提供可做調整以符合本端代理標準的彈性輸入,來加快流程。
使用 Select Object 節點供使用者輸入
使用座標系統
使用幾何作業,例如 Geometry.DistanceTo 和 Geometry.ClosestPointTo
建立圖塊參考
控制物件併入設定
此圖表將在 Civil 3D 2020 及更高版本上執行。
首先,下載以下範例檔案,然後開啟 DWG 檔案和 Dynamo 圖表。
以下是此圖表中的邏輯概觀。
取得分佈主線的曲線幾何圖形
取得使用者所選界址線的曲線幾何圖形,如有必要可反轉
產生服務計量器的插入點
取得分佈主線最接近服務計量器位置的點
在模型空間中建立圖塊參考和線
我們開始吧!
我們的第一步是讓分佈主線的幾何圖形進入 Dynamo。我們要取得特定圖層上的所有物件,並接合在一起成為 Dynamo PolyCurve,而不是選取個別的線或聚合線。
如果您不熟悉 Dynamo 曲線幾何圖形,請查看曲線一節。
接下來,我們需要讓所選界址線的幾何圖形進入 Dynamo,以便我們可以使用它。適合進行此工作的工具是 Select Object 節點,可讓圖表的使用者在 Civil 3D 中點選特定物件。
我們還需要處理可能發生的潛在問題。界址線有起點和終點,這表示它有方向。為了讓圖表產生一致的結果,我們需要所有界址線的方向都一致。我們可以直接在圖表邏輯中說明此條件,這可以讓圖表更具彈性。
取得界址線的起點和終點。
測量每個點到分佈主線的距離,然後計算出哪個距離比較大。
想要的結果是,線的起點最接近分佈主線。如果不是如此,我們就反轉界址線的方向。否則,我們只需傳回原始界址線。
現在要來找出服務計量器的放置位置。放置通常由本端代理需求決定,因此我們只要提供可變更以滿足各種條件的輸入值。我們將使用沿界址線的座標系統做為建立點的參考。這可讓您非常輕鬆地定義相對於界址線的偏移,而不論其方位為何。
如果您不熟悉座標系統,請查看向量、平面和座標系統一節。
現在,我們需要取得分佈主線最接近服務計量器位置的點。這可讓我們在模型空間中繪製服務連接,以便能永遠與分佈主線互垂。Geometry.ClosestPointTo 節點是理想的解決方案。
這是分佈主線 PolyCurve
這些是服務計量器插入點
最後一步是在模型空間中實際建立物件。我們將使用先前產生的插入點來建立圖塊參考,然後使用分佈主線上的點來繪製連到服務連接的線。
當您執行圖表時,您應該會在模型空間中看到新的圖塊參考和服務連接線。請嘗試變更某些輸入,您會看到所有內容都會自動更新!
您可能會發現,在為一條界址線放置物件後,選取不同的界址線會導致物件被「移動」。
這是 Dynamo 的預設行為,在許多情況下非常有用。但是,您可能要依序放置多個服務連接,讓 Dynamo 在每次執行時建立新物件,而不是修改原始物件。您可以變更物件併入設定來控制此行為。
請查看物件併入一節,以取得更多資訊。
變更此設定將強制 Dynamo「忘記」每次執行時所建立的物件。以下是在關閉物件併入的情況下,使用 Dynamo 播放器執行圖表的範例。
如果您不熟悉 Dynamo 播放器,請查看 Dynamo 播放器一節。
以下是一些如何擴充此圖表功能的構想。
同時放置 多個服務連接,而不是選取每條界址線。
將輸入調整為改放置 污水管清掃口,而不是供水服務計量器。
加入開關,以允許在界址線的特定一側 (而非兩側) 放置單一服務連接。
道路、鐵路、土地、公共事業、測量、GIS...
土木基礎建設除了包括上述所有事物,還有更多!本節包含數個實用且相關的範例圖表,可協助您掌握 Dynamo 並充分發揮 Dynamo for Civil 3D 的潛能。每個圖表都包含建立該圖表時所用邏輯的詳細描述,您不僅可以 使用 圖表,還可以 瞭解 圖表。
此外,這些範例內含經過時間測試、可建置功能強大圖表的最佳實踐。在您進行範例時,我們建議您也要熟悉最佳實踐一節,以獲得更多如何建置功能強大、靈活且可維護的圖表的構想。
Dynamo 其中一種相當適合的使用案例,便是沿廊道模型動態放置離散物件。物件通常需要放置在與廊道上插入的組合無關的位置,這是一個非常冗長乏味而需手動完成的工作。當廊道的水平或垂直幾何圖形發生變更時,會導致需重複處理大量工作。
從外部檔案 (在此範例中為 Excel) 讀取資料
以字典組織資料
使用座標系統控制位置/比例/旋轉
放置圖塊參考
在 Dynamo 中視覺化幾何圖形
此圖表將在 Civil 3D 2020 及更高版本上執行。
首先,下載以下範例檔案,然後開啟 DWG 檔案和 Dynamo 圖表。
Excel 檔案與 Dynamo 圖表最好儲存在同一個目錄中。
以下是此圖表中的邏輯概觀。
讀取 Excel 檔案,將資料匯入至 Dynamo
從指定的廊道基準線取得地勢線
沿廊道地勢線在所需樁號處產生座標系統
使用座標系統在模型空間中放置圖塊參考
我們開始吧!
在此範例圖表中,我們使用 Excel 檔案來儲存 Dynamo 將用於放置燈柱圖塊參考的資料。表格看起來像下面這樣。
使用 Dynamo 從外部檔案 (例如 Excel 檔案) 讀取資料是種很好的策略,尤其是當需要與其他團隊成員共用資料時。
Excel 資料會像下面這樣匯入至 Dynamo。
我們現在有了資料,需要依欄 (Corridor、Baseline、PointCode 等) 把資料分開,以便在圖表的其餘部分使用。執行此作業的常見方法之一,是使用 List.GetItemAtIndex 節點並指定所需的每一欄索引號碼。例如,Corridor 欄是在索引 0,Baseline 欄是在索引 1 等等。
看起來沒問題,對吧?但是這個方法有一個潛在的問題。如果 Excel 檔案中欄的順序在將來發生變更,該怎麼辦?或是兩欄之間加入新的一欄?如此一來,圖表將無法正常運作而需要更新。我們可以將資料放入 字典,將 Excel 欄標題做為 鍵,其餘資料做為 值,讓圖表能繼續使用。
如果您不熟悉字典,請查看Dynamo 中的字典一節。
這可讓圖表變得更具彈性,因為它允許變更 Excel 中欄的順序。只要欄標題保持不變,您就可以使用其_鍵_ (即欄標題) 從字典中擷取資料,這是我們接下來要執行的作業。
我們現在已匯入 Excel 資料並準備好了,接下來我們開始使用它從 Civil 3D 取得有關廊道模型的一些資訊。
依名稱選取廊道模型。
取得廊道內的特定基準線。
透過基準線的點代碼取得基準線內的地勢線。
我們現在要沿廊道地勢線,在 Excel 檔案中指定的樁號值處產生座標系統。這些座標系統將用於定義燈柱圖塊參考的位置、旋轉和比例。
如果您不熟悉座標系統,請查看向量、平面和座標系統一節。
請注意,在此處使用程式碼區塊 (Code Block) 是為了根據座標系統在基準線哪一側來旋轉座標系統。您也可以使用幾個節點來達成這個目標,但這是一個很好的範例,說明撰寫出來更容易。
如果您不熟悉程式碼區塊,請查看程式碼區塊和 DesignScript一節。
我們快完成了!我們有實際放置圖塊參考所需的所有資訊。首先,使用 Excel 檔案中的 BlockName 欄取得圖塊定義。
從這裡,最後一步是建立圖塊參考。
當您執行圖表時,您應該會看到新的圖塊參考沿廊道展示在模型空間中。以下是最酷的部分 - 如果圖表的執行模式設定為「自動」,而且您編輯了 Excel 檔案,圖塊參考會自動更新!
您可以在使用者介面一節閱讀有關圖表執行模式的更多資訊。
以下是使用 Dynamo 播放器執行圖表的範例。
如果您不熟悉 Dynamo 播放器,請查看 Dynamo 播放器一節。
在 Dynamo 中視覺化廊道幾何圖形,有助於提供情境脈絡。此特定模型已在模型空間中萃取出廊道實體,因此我們將這些實體帶入 Dynamo。
但還有其他事情需要考慮。實體相對而言是「比較重」的幾何圖形類型,這表示此作業將減慢圖表速度。如果有一個簡單的方式可以 選擇 是否要檢視實體會更好。一種明顯的解決方法是拔掉 Corridor.GetSolids 節點,但這會對所有下游節點產生警告,而這看起來會有點雜亂。這時就是 ScopeIf 節點真正發揮功能的時候了。
請注意 Object.Geometry 節點底部有一條灰色列。這表示節點預覽已關閉 (在節點上按一下右鍵可存取),這樣 GeometryColor.ByGeometryColor 就可以避免為了背景預覽的顯示優先順序而與其他幾何圖形「競爭」。
ScopeIf 節點基本上可讓您選擇性地執行一條完整的節點分支。如果 test 輸入為 false,則連接至 ScopeIf 節點的每個節點都不會執行。
以下是 Dynamo 背景預覽的結果。
以下是一些如何擴充此圖表功能的構想。
在 Excel 檔案中新增 旋轉 一欄,就可以使用它驅動座標系統的旋轉。
在 Excel 檔案中新增 水平或垂直偏移,就可以視需要讓燈柱偏離廊道地勢線。
直接在 Dynamo 中 中使用起點樁號和典型間距產生樁號值,而不使用內含樁號值的 Excel 檔案。
您現在對整個圖像有一點瞭解,我們直接在 Civil 3D 中建置您的第一個 Dynamo 圖表!
這是一個簡單的範例,旨在示範基本的 Dynamo 功能。建議您在新的空白 Civil 3D 文件中完成所有步驟。
首先在 Civil 3D 中開啟一個空白文件。開啟後,導覽到 Civil 3D 功能區的 「管理」 頁籤,並尋找 「視覺程式設計」 面板。
按一下 「Dynamo」 按鈕,這會在單獨的視窗中啟動 Dynamo。
Dynamo 與 Dynamo 播放器有何差異?
Dynamo 是您用來建置和執行圖表的工具。Dynamo 播放器是一種無需在 Dynamo 中開啟圖表即可執行圖表的簡易方式。
當您準備好試用時,請前往 Dynamo 播放器一節。
開啟 Dynamo 後,您會看到開始畫面。按一下 「新建」 開啟空白工作區。
範例呢?
Dynamo for Civil 3D 隨附一些預先建置的圖表,可協助您激發更多有關如何使用 Dynamo 的想法。我們建議您有時候可以查看這些內容,以及 Primer 中的範例工作流程。
您現在應該會看到一個空白工作區。我們來看看 Dynamo 的運作!以下是我們的目標:
很簡單,對吧?但在開始之前,我們需要先討論一些基本知識。
Dynamo 圖表的核心建置圖塊稱為節點。節點就像一台小機器 - 您將資料放入其中,它對該資料執行某些作業,然後輸出結果。Dynamo for Civil 3D 有一個節點資源庫,您可以用線路將節點連接在一起形成圖表,圖表能做的事情比單獨任何一個節點所能做的更多、更好。
好,我們來建立圖表。以下是我們需要的所有節點的清單。
您可以在資源庫的搜尋列中鍵入這些節點的名稱,或在圖元區的任意位置按一下右鍵並在其中搜尋,以尋找這些節點。
如何知道要使用哪些節點?以及在何處找到它們?
資源庫中的節點會根據作用分成不同邏輯品類。請參閱節點資源庫一節,以取得更深入的導覽。
以下是您的最終圖表的外觀。
我們總結一下到目前為止完成的工作:
我們選擇要使用的文件。在此範例 (以及許多範例) 中,我們想要在 Civil 3D 中使用作用中的文件。
我們定義建立文字物件的目標圖塊 (在此範例中為模型空間)。
我們使用 String 節點指定應放置文字的圖層。
我們使用 Point.ByCoordinates 節點建立一點,以定義應放置文字的位置。
我們使用兩個 Number Slider 節點定義文字插入點的 X 座標和 Y 座標。
我們使用另一個 String 節點定義文字物件的內容。
最後,我們建立了文字物件。
我們來看看新圖表的結果!
回到 Civil 3D,確保已選取 「模型」 頁籤。您應該會看到 Dynamo 建立的新文字物件。
如果您沒看到文字,可能需要執行 ZOOM -> EXTENTS 指令以縮放至右側位置。
好酷!現在來更新一下文字。
回到 Dynamo 圖表中,繼續變更一些輸入值,例如文字字串、插入點座標等。您應該會看到文字在 Civil 3D 中自動更新。另請注意,如果您拔掉其中一個輸入埠,文字就會移除。如果將所有內容重新插入,則會再次建立文字。
為什麼 Dynamo 不在每次執行圖表時插入新的文字物件?
Dynamo 預設會「記住」它建立的物件。如果您變更節點輸入值,Civil 3D 中的物件會更新,而不是建立全新物件。您可以在物件併入一節閱讀有關此行為的更多資訊。
此範例只是一個您可以使用 Dynamo for Civil 3D 執行何種作業的入門。請繼續閱讀以瞭解更多資訊!
我們先前提到,節點是 Dynamo 圖表的核心建置圖塊,在資源庫中被組織為邏輯群組。在 Dynamo for Civil 3D 中,資源庫中有兩個品類 (也就是層架),包含用於處理 AutoCAD 和 Civil 3D 物件 (例如定線、縱斷面、廊道、圖塊參考等) 的專用節點。資源庫的其餘部分包含本質上比較通用的節點,在所有「類型」的 Dynamo (例如,適用於 Revit 的 Dynamo、Dynamo Sandbox 等) 之間都一致。
請查看資源庫一節,進一步瞭解會如何在核心 Dynamo 資源庫中排列節點。
用於處理 AutoCAD 和 Civil 3D 物件的特定節點
一般用途節點
您可以單獨安裝的協力廠商套件中的節點
如果使用 AutoCAD 和 Civil 3D 層架下的節點,您的 Dynamo 圖表就只能在 Dynamo for Civil 3D 中運作。如果 Dynamo for Civil 3D 圖表在其他位置開啟 (例如在適用於 Revit 的 Dynamo 中),這些節點上會標示警告,而且不會執行。
為什麼 AutoCAD 和 Civil 3D 有兩個獨立層架?
這種排列方式是為了將原生 AutoCAD 物件 (直線、聚合線、圖塊參考等) 的節點和 Civil 3D 物件 (定線、廊道、地形等) 的節點區分開來。從技術角度來看,AutoCAD 和 Civil 3D 是兩個獨立的項目 - AutoCAD 是基礎應用程式,Civil 3D 則建置在其上。
若要使用 AutoCAD 和 Civil 3D 節點,請務必確實瞭解每個層架內的物件階層。記得生物學的分類法嗎?界、門、綱、目、科、屬、種?AutoCAD 和 Civil 3D 物件以類似方式分類。我們來瀏覽一些範例。
我們以定線為例。
假設您的目標是變更定線的名稱。下一個您要加入的節點是 CivilObject.SetName 節點。
一開始,這看起來可能不太直覺。CivilObject 是什麼?為什麼資源庫沒有 Alignment.SetName 節點?答案與 可重複使用性 和 簡易性 有關。請思考一下,無論物件是定線、廊道、縱斷面還是其他物件,變更 Civil 3D 物件名稱的過程都相同。因此,與其讓重複節點基本上都執行相同的作業 (例如 Alignment.SetName、Corridor.SetName、Profile.SetName 等),不如將該功能收闔為單一節點。這正是 CivilObject.SetName 的功能!
另一種考量的方式是 關係。定線和廊道都是一種 Civil 物件,就像蘋果和梨一樣都是水果。Civil 物件節點適用於任何類型的 Civil 物件,就像您想要使用一種削皮刀就可以削蘋果和削梨一樣。如果你為每種水果都買一個單獨的削皮刀,你的廚房會變得很混亂!從這個意義上來說,Dynamo 節點資源庫與您的廚房相似。
現在,我們更進一步。假設您要變更定線的圖層。您要使用的節點是 Object.SetLayer 節點。
為什麼沒有名為 CivilObject.SetLayer 的節點?我們先前討論的可重複使用性和簡易性原則同樣適用於此處。圖層 性質是 AutoCAD 中任何可繪製或插入的物件 (例如直線、聚合線、文字、圖塊參考等) 共有的性質。Civil 3D 物件 (例如定線和廊道) 位於同一品類下,因此適用於物件的任何節點也可用於任何 Civil 物件。
Dynamo for Civil 3D 為處理土木基礎建設專案的工程師和設計師提供 視覺程式設計 範例。您可以將 Dynamo 視為是 Civil 3D 使用者的某種數位多功能工具,無論處理何種工作,都有適合的工具。您可以使用其直覺式介面建立功能強大且可自訂的例行程式,無需撰寫任何一行程式碼。您不需要 成為 程式設計師就能使用 Dynamo,但您必須能夠以程式設計師的邏輯 思考。本章搭配 Primer 中其他章節,可協助您建立邏輯技能,讓您能夠運用計算設計的思維來處理任何工作。
Dynamo 是在 Civil 3D 2020 中首次引入,從那時候開始就一直持續發展。一開始是透過軟體更新單獨安裝,現在已經與所有版本的 Civil 3D 搭售。根據您使用的 Civil 3D 版本,您可能會發現 Dynamo 介面與本章中所看到的範例略有不同。這是因為 Civil 3D 2023 的介面經過重大改版。
建議您查看 Dynamo 部落格,以取得有關 Dynamo 開發的最新資訊。下表總結 Dynamo for Civil 3D 存在期間的關鍵里程碑。
2024.1
2.18
2024
2.17
Dynamo 播放器使用者介面更新
2023.2
2.15
2023
2.13
Dynamo 使用者介面更新
2022.1
2.12
加入物件併入資料儲存設定
加入控制物件併入的新節點
2022
2.10
包含在 Civil 3D 主要安裝內容中
從 IronPython 轉換到 Python.NET
2021
2.5
2020.2
2.4
2020 Update 2
2.4
加入新節點
2020.1
2.2
2020
2.1
初始版本
Dynamo for Civil 3D 包含功能非常強大的機制,可「記住」每個節點建立的物件。此機制稱為物件併入,它可讓 Dynamo 圖表在每次在同一個文件中執行時產生一致的結果。雖然在許多情況下這非常理想,但有時候,您可能想要對 Dynamo 的行為有更多控制。本節將協助您瞭解物件併入如何運作,以及如何利用此機制。
考慮這個在模型空間中的目前圖層上建立圓的圖表。
請注意半徑變更時所發生的情況。
這是物件併入處於作用中的情況。Dynamo 的預設行為是_修改_圓的半徑,而不是每次半徑輸入變更時就建立一個新的圓。這是因為每次執行圖表時,Object.ByGeometry 節點會「記住」它建立了這個_特定的_圓。此外,Dynamo 會儲存此資訊,以便下次您開啟 Civil 3D 文件並執行圖表時,圖表就會有完全相同的行為。
我們來看一個您要變更 Dynamo 預設物件併入行為的範例。假設您要建置一個將文字放在圓中央的圖表。但是,您使用此圖表的目的是,可以一直重複執行圖表,而每次執行時無論選取哪個圓,都可以放置新的文字。這是圖表的外觀。
但是,以下是實際上選取不同圓時所發生的情況。
進行這項變更後,我們會得到我們想要的行為。
Dynamo for Civil 3D 允許透過 「Dynamo」 功能表中的 「併入資料儲存」 設定,修改預設的物件併入行為。
請注意,「併入資料儲存」選項在 Civil 3D 2022.1 及更高版本中提供。
預設會啟用所有選項。以下是每個選項的功能摘要。
啟用此選項後,Dynamo 會「忘記」上次執行圖表時建立的物件。因此,圖表可在任何情況下在任何圖面中執行,並且每次都會建立新物件。
使用時機
當您希望 Dynamo「忘記」先前執行時所做的所有動作,並且每次都建立新物件時,請使用此選項。
此選項表示在儲存物件併入中繼資料時,會將其序列化至圖表 (.dyn 檔)。如果您關閉/重新開啟圖表,並在相同圖面中執行該圖表,則所有作業應與您之前離開圖表時相同。如果您在不同圖面中執行圖表,則將從圖表中移除併入資料,並建立新物件。這表示如果您開啟原始圖面並再次執行圖表,將建立除舊物件之外的新物件。
使用時機
如果您希望 Dynamo「記住」上次在特定圖面中執行時建立的物件,請使用此選項。
此選項最適合 特定圖面 與 Dynamo 圖表之間可以維持 1:1 關係的情況。選項 1 和 3 較適合設計為在多個圖面上執行的圖表。
這與選項 2 類似,不同之處在於物件併入資料是在圖面中而不是在圖表 (.dyn 檔) 中序列化。如果您關閉/重新開啟圖表,並在相同圖面中執行該圖表,則所有作業應與您之前離開圖表時相同。如果您在不同圖面中執行圖表,則併入資料仍會保留在原始圖面中,因為併入資料是儲存在圖面中而不是圖表中。
使用時機
如果您要在多個圖面中使用同一個圖表,並讓 Dynamo「記住」它在每個圖面中所做的動作,請使用此選項。
使用此選項時首先需要注意,透過 Dynamo 主介面執行圖表時,這不會影響圖表與圖面的互動方式。此選項_只_在使用 Dynamo 播放器執行圖表時適用。
如果您使用 Dynamo 主介面執行圖表,然後關閉主介面並使用 Dynamo 播放器執行同一個圖表,則會在之前建立的物件之上建立新物件。但是,Dynamo 播放器執行圖表一次後,就會序列化圖面中的物件併入資料。因此,如果您透過 Dynamo 播放器執行圖表多次,它會更新物件而不是建立新物件。如果您在不同圖面上透過 Dynamo 播放器執行圖表,則併入資料仍會保留在原始圖面中,因為併入資料是儲存在圖面中而不是圖表中。
使用時機
如果您要在多個圖面中使用 Dynamo 播放器執行圖表,並「記住」它在每個圖面中所做的動作,請使用此選項。
對於許多從測量現場到完成工作的流程而言,在 Civil 3D 中使用 COGO 點和點群組是核心要素。Dynamo 在資料管理方面非常出色,我們將在此範例中示範一個可能的使用案例。
使用清單
使用 List.GroupByKey 節點將類似物件分組
在 Dynamo 播放器中展示自訂輸出
此圖表將在 Civil 3D 2020 及更高版本上執行。
首先,下載以下範例檔案,然後開啟 DWG 檔案和 Dynamo 圖表。
以下是此圖表中的邏輯概觀。
取得文件中所有的 COGO 點
依描述將 COGO 點分組
建立點群組
將摘要輸出至 Dynamo 播放器
我們開始吧!
第一步是取得文件中所有的點群組,然後取得每個群組內的所有 COGO 點。這會產生一個 巢狀清單,也就是「清單的清單」,如果稍後使用 List.Flatten 節點將所有內容向下展開為單一清單,會更容易處理。
我們現在已有全部的 COGO 點,需要根據其描述分為多個群組。這正是 List.GroupByKey 節點所做的工作。它基本上會將共用相同鍵的所有項目分組在一起。
辛苦的工作已經完成!最後一步是從分組的 COGO 點建立新的 Civil 3D 點群組。
當您執行圖表時,Dynamo 背景預覽中沒有任何內容可供查看,因為我們沒有處理任何幾何圖形。因此,查看圖表是否正確執行的唯一方法是檢查「工具區」,或查看節點輸出預覽。但是,如果我們使用 Dynamo 播放器執行圖表,則可以透過輸出已建立的點群組摘要,提供更多有關圖表結果的回饋。您只需在節點上按一下右鍵,然後設定為 「是輸出」 即可。在此範例中,我們使用更名過的 Watch 節點來檢視結果。
以下是使用 Dynamo 播放器執行圖表的範例。
以下是一些如何擴充此圖表功能的構想。
將點群組修改為根據 完整描述,而非原始描述。
將點分組,分組時依據您選擇的其他某些 預先定義的品類 (例如,「地面快照」、「碑界」等)。
為某些群組中的點自動建立不規則三角網地形。
在管網中加入管和結構時,Civil 3D 會使用樣板自動指定名稱。這在一開始放置時通常足以應付,但是隨著設計逐漸發展,名稱在未來必然會有所變化。此外,我們可能需要許多不同的命名模式,例如在管路中從最下游的結構開始按順序命名結構,或按照與本端代理的資料架構一致的命名模式來命名結構。此範例將示範如何使用 Dynamo 定義任何類型的命名策略,並且以一致的方式套用。
使用邊界框
使用 List.FilterByBoolMask 節點篩選資料
使用 List.SortByKey 節點排序資料
產生和修改文字字串
此圖表將在 Civil 3D 2020 及更高版本上執行。
首先,下載以下範例檔案,然後開啟 DWG 檔案和 Dynamo 圖表。
以下是此圖表中的邏輯概觀。
依圖層選取結構
取得結構位置
依偏移篩選結構,然後依樁號排序
產生新名稱
更名結構
我們開始吧!
我們首先需要選取要使用的所有結構。我們會透過只選取特定圖層上的所有物件來執行此作業,這表示我們可以從不同的管網 (假設共用相同圖層) 選取結構。
此節點可確保我們不會意外擷取任何不想要但可能與結構共用相同圖層的物件類型。
我們現在有了結構,我們需要找出它們在空間中的位置,以便可以根據位置對結構排序。為了執行此作業,我們將利用每個物件的邊界框。物件的邊界框是完全包含物件幾何實際範圍的最小方塊。透過計算邊界框的中心,我們可以得到結構很近似的插入點。
我們將使用這些點來取得結構相對於所選定線的樁號和偏移。
從這裡開始,事情會變得有點棘手。在此階段,我們有一個大型清單,列出我們指定的圖層上的所有結構,並選擇了要沿其排序結構的定線。問題是清單中可能有我們不想更名的結構。例如,這類結構可能不是我們感興趣的特定管路。
選取的定線
要更名的結構
應忽略的結構
因此,我們需要篩選結構清單,這樣就不用考慮那些與該定線之間大於特定偏移的結構。這最適合使用 List.FilterByBoolMask 節點完成。篩選結構清單後,我們使用 List.SortByKey 節點,依其樁號值排序。
檢查結構的偏移是否小於門檻值
將任何空值取代為 false
篩選結構和樁號的清單
依樁號排序結構
我們要做的最後一項工作,是為結構建立新名稱。我們將使用的格式為 <alignment name>-STRC-<number>
。這裡還有額外幾個節點,是需要時以額外的零填補數字 (例如,「01」而不是「1」)。
最後也是同樣重要的,我們更名結構。
以下是使用 Dynamo 播放器執行圖表的範例。
利用 Dynamo 的 3D 背景預覽來視覺化圖表的中間輸出,而不是只顯示最終結果,會很有幫助。我們可以做一件簡單的事情,就是顯示結構的邊界框。此外,此特定資料集在文件中有廊道,因此我們可以將廊道地勢線幾何圖形帶入 Dynamo,為結構在空間中的位置提供一些情境脈絡。如果圖表是用在沒有任何廊道的資料集,則這些節點就不會執行任何作業。
現在,我們可以更清楚瞭解透過偏移篩選結構的流程如何運作。
以下是一些如何擴充此圖表功能的構想。
根據結構 最接近的定線 (而不是選取特定定線) 更名結構。
除了更名結構外,還 更名管。
根據結構的管路 設定圖層。
制定運動包絡線以供間隙驗證,是軌道設計的重要一環。Dynamo 可用來產生包絡線的實體,而不是建立和管理複雜的廊道次組合來執行工作。
使用廊道地勢線
在座標系統之間轉換幾何圖形
透過斷面混成建立實體
使用交織設定控制節點行為
此圖表將在 Civil 3D 2020 及更高版本上執行。
首先,下載以下範例檔案,然後開啟 DWG 檔案和 Dynamo 圖表。
以下是此圖表中的邏輯概觀。
從指定的廊道基準線取得地勢線
沿廊道地勢線以所需間距產生座標系統
將縱斷面圖塊幾何圖形轉換至座標系統
在輪廓之間斷面混成實體
在 Civil 3D 中建立實體
我們開始吧!
我們的第一步是取得廊道資料。我們將依名稱選取廊道模型,取得廊道內的特定基準線,然後依其點代碼取得基準線內的地勢線。
我們現在要沿廊道地勢線,在指定的起點樁號和終點樁號之間產生座標系統。這些座標系統將用於將車輛縱斷面圖塊幾何圖形與廊道對齊。
請注意節點右下角的小 XXX。這表示節點的交織設定已設定為_笛卡兒積_,如此才能在兩條地勢線的相同樁號值處產生座標系統。
現在,我們需要以某種方式沿地勢線建立一系列車輛縱斷面。我們將使用 Geometry.Transform 節點,從車輛縱斷面圖塊定義來轉換幾何圖形。這是一個難以理解的概念,因此在我們查看節點之前,這裡有一個圖表顯示將要發生的情況。
因此,我們基本上是從_單一_圖塊定義中取得 Dynamo 幾何圖形,然後移動/旋轉它,同時沿地勢線建立一個陣列。好酷的東西!以下是節點序列的外觀。
這會從文件中取得圖塊定義。
這些節點會取得圖塊內物件的 Dynamo 幾何圖形。
這些節點基本上是定義我們要從中轉換幾何圖形的_來源_座標系統。
最後,此節點會實際執行轉換幾何圖形的工作。
請注意此節點上_最長的_交織。
以下是我們在 Dynamo 中得到的結果。
好消息!辛苦的工作已經完成。我們現在只需在輪廓之間產生實體。這可以透過 Solid.ByLoft 節點輕鬆完成。
以下是結果。請記住,這些是 Dynamo 實體 - 我們仍需要在 Civil 3D 中建立它們。
我們的最後一步是將產生的實體輸出至模型空間。我們也為它們塗上顏色,比較容易看清楚。
以下是使用 Dynamo 播放器執行圖表的範例。
以下是一些如何擴充此圖表功能的構想。
加入針對每條軌道分別使用 不同樁號範圍 的功能。
將實體分割 為可單獨分析衝突的較小區段。
請檢查包絡線實體是否 與圖徵相交,並為發生衝突的實體著色。
雖然 Dynamo 作為工具的功能非常強大,但它不僅僅只有節點和線路,還能以文字形式撰寫程式碼。有兩種方法可以達到這個目的:
使用程式碼區塊撰寫 DesignScript
使用 Python 節點撰寫 Python
本節會重點介紹如何在 Civil 3D 環境中運用 Python,以善加活用 AutoCAD 和 Civil 3D .NET API。
請查看 一節,以取得有關在 Dynamo 中使用 Python 的更多一般資訊。
AutoCAD 和 Civil 3D 兩者都有數個可用的 API,可讓像您這樣的開發人員透過自訂功能延伸核心產品。在 Dynamo 環境中,相關的是 Managed .NET API。以下連結對於瞭解 API 的結構及其運作方式非常重要。
(英文)
(英文)
(英文)
(英文)
在您進行本節時,可能會有一些您不熟悉的概念,例如資料庫、交易、方法、性質等等。這當中的許多概念是使用 .NET API 的核心,並非專屬於 Dynamo 或 Python。詳細討論這些內容超出 Primer 本節的範圍,因此我們建議您經常參考上述連結以取得更多資訊。
當您第一次編輯新的 Python 節點時,會預先填入樣板程式碼讓您開始使用。以下是樣板的分解,其中包含有關每個圖塊的說明。
匯入
sys
和clr
模組,Python 解譯器必須有這兩個模組才能正常運作。尤其是clr
模組,可讓 .NET 名稱空間基本上被視為 Python 套件。載入標準組合 (即 DLL),以搭配 AutoCAD 和 Civil 3D 的 Managed .NET API 使用。
加入標準 AutoCAD 和 Civil 3D 名稱空間的參考。這些參考分別相當於 C# 的
using
指示詞或 VB.NET 的Imports
指示詞。使用名為
IN
的預先定義清單可存取節點的輸入埠。您可以使用埠的索引號碼存取特定埠的資料,例如dataInFirstPort = IN[0]
。取得作用中的文件和編輯器。
鎖住文件並啟動資料庫交易。
將大部分指令碼邏輯放在這裡。
將這一行取消註解,即可在主要工作完成後提交交易。
如果您要輸出節點中的任何資料,請在指令碼結尾將資料指定給
OUT
變數。
想要自訂?
您可以編輯 C:\ProgramData\Autodesk\C3D <version>\Dynamo
中的 PythonTemplate.py
檔案,修改預設的 Python 樣板。
接下來我們透過一個範例來示範在 Dynamo for Civil 3D 中撰寫 Python 指令碼的一些基本概念。
以下是您可在此練習中參考的範例檔案。
以下是此圖表中的邏輯概觀。
檢閱 Civil 3D API 文件
依圖層名稱選取文件中所有的集水區
「拆開」Dynamo 物件以存取內部的 Civil 3D API 成員
從 AutoCAD 點建立 Dynamo 點
從點建立 PolyCurve
我們開始吧!
現在,我們可以開始建置圖表邏輯。首先,取得文件中所有集水區的清單。有一些節點可以進行,因此我們不需要在 Python 指令碼中包含這項作業。使用節點可讓其他人 (比起在 Python 指令碼中放入大量程式碼) 更容易閱讀圖表,也可以讓 Python 指令碼只專注在一件事:傳回集水區的邊界點。
請注意,All Objects on Layer 節點的輸出是一個 CivilObject 的清單。這是因為 Dynamo for Civil 3D 目前沒有任何節點可處理集水區,因此我們需要透過 Python 存取 API。
根據經驗法則,使用 InternalObjectId
性質取得物件 ID,然後在交易中存取包裝後的物件通常比較安全。這是因為 InternalDBObject
性質會傳回非處於可寫入狀態的 AutoCAD DBObject。
以下是存取內部集水區物件並取得其邊界點的完整 Python 指令碼。亮顯的行表示從預設樣板程式碼修改/增加的行。
按一下指令碼中加底線的文字,可查看每一行的說明。
根據經驗法則,最好是將大部分指令碼邏輯內容放在交易內。這可確保安全地存取指令碼讀取/寫入的物件。在許多情況下,忽略交易可能會導致嚴重錯誤。
在此階段,Python 指令碼應該會輸出一個 Dynamo 點清單,您可以在背景預覽中看到這些點。最後一步只是從這些點建立 PolyCurve。請注意,您也可以直接在 Python 指令碼中完成這一步,但我們刻意將它放在指令碼外的節點中,這樣可以看得更清楚。這是最終圖表的外觀。
這是最終的 Dynamo 幾何圖形。
在收尾前,我們在這裡快速地總結。根據您使用的 Civil 3D 版本,Python 節點的規劃可能會有所不同。在 Civil 3D 2020 和 2021 中,Dynamo 使用一個稱為 IronPython 的工具,在 .NET 物件與 Python 指令碼之間移動資料。但是,在 Civil 3D 2022 中,Dynamo 已轉變為使用標準原生的 Python 解譯器 (也稱為 CPython),而不是使用 Python 3。這項轉換的優點包括可存取常見的新式資源庫和新的平台功能、基本維護和安全性修補。
這一行會從 Dynamo 幾何圖形資源庫取得我們需要的特定類別。請注意,我們在這裡指定 import Point as DynPoint
,而不是 import *
,因為後者會導致命名衝突。
我們在這裡明確指定哪個輸入埠包含需要的資料,而不是預設的 IN
,後者指的是所有輸入的整個清單。
將供水服務計量器圖塊參考放置在距界址線的指定偏移處,並為與分佈主線互垂的每個服務連接繪製一條線。
任務完成!
在 Excel 檔案中指定的樁號值處,沿廊道放置燈柱圖塊參考。
任務完成!
建置一個將文字插入模型空間的 Dynamo 圖表。
任務完成!
看起來每次執行圖表後,文字就會刪除再重新建立。實際上,文字的位置是根據選取的圓做了_修改_。所以它是相同的文字,只是位置不同!為了每次都能建立新文字,我們需要修改 Dynamo 的物件併入設定為不要保留併入資料 (請參閱下面的)。
如果您不熟悉 Dynamo 播放器,請查看 一節。
為每個唯一的 COGO 點描述建立點群組。
如果您不熟悉使用清單,請查看一節。
如果您不熟悉 Dynamo 播放器,請查看 一節。
任務完成!
根據定線的樁號標示,按順序更名管網結構。
如果您不熟悉使用清單,請查看一節。
如果您不熟悉 Dynamo 播放器,請查看 一節。
任務完成!
使用車輛縱斷面圖塊沿廊道產生間隙包絡線 3D 實體。
如果您不熟悉座標系統,請查看一節。
如果您不熟悉節點交織,請查看一節。
如果您不熟悉 Dynamo 播放器,請查看 一節。
任務完成!
取得圖面中所有集水區的邊界幾何圖形。
在開始建置圖表和撰寫程式碼之前,最好先查看 Civil 3D API 文件,瞭解 API 可提供哪些內容。在此案例中,,將傳回集水區的邊界點。請注意,此性質會傳回 Point3dCollection
物件,但 Dynamo 不會知道該如何處理這個物件。換言之,我們無法從 Point3dCollection
建立 PolyCurve,因此最終我們需要將所有內容轉換為 Dynamo 點。我們稍後會再說明。
進一步瞭解之前,先需要簡單討論一個重要概念。在一節,我們討論了 Object 與 CivilObject 的關聯方式。再更詳細一點,Dynamo Object 是 AutoCAD Entity 的一個包裝函式。同樣地,Dynamo CivilObject 是 Civil 3D Entity 的一個包裝函式。您可以存取物件的 InternalDBObject
或 InternalObjectId
性質來「拆開」物件。
任務完成!
您可以在 閱讀更多有關此項轉換,以及如何升級舊式指令碼的資訊。如果您想要繼續使用 IronPython,只需使用 Dynamo Package Manager 安裝 DynamoIronPython2.7 套件。
Object Autodesk.AutoCAD.DynamoNodes.Object
Entity Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
Entity Autodesk.Civil.DatabaseServices.Entity
Dynamo 是 AEC 領域開始撰寫程式碼的絕佳之門。您可以從以下各節開始撰寫程式碼:
Dynamo 播放器提供一個在 Civil 3D 中執行 Dynamo 圖表的簡化方式。建立圖表後,您不需要任何 Dynamo 專業知識就可以使用播放器並執行圖表。您可以很輕鬆將圖表分享給對節點和線路的細節不感興趣的其他使用者。
如需在 Civil 3D 中使用 Dynamo 播放器的更多資訊,請參閱 Civil 3D 說明網站上提供的文件。
Dynamo 套件是由協力廠商開發的工具集,旨在擴大 Dynamo 的核心功能。所有使用者都可以存取這些套件,只要按一下按鈕即可下載。
請參閱套件一節,以取得有關如何開始使用套件的更多資訊。
以下是一些最常用套件的清單,這些套件可將您的 Dynamo for Civil 3D 圖表提升到更高層次。
Civil 3D Toolkit 是一個 Dynamo for Civil 3D 套件,透過大量額外節點顯著增強 Dynamo 的功能。
Camber 是一個開放原始碼的 Dynamo for Civil 3D 套件,包含數百個用於處理標示、外部參考、資料捷徑、型式等等的節點。
CivilConnection 是一個開放原始碼的適用於 Revit 的 Dynamo 套件,可讓您在 Civil 3D、Dynamo 和 Revit 之間交換資訊。
Arkance Systems Nodes 是一個 Dynamo for Civil 3D 套件,當中有各種有用的節點,可處理標註、表格、視圖、鑽孔控制等等。
程式碼區塊是 DesignScript 中的深層視窗,是 Dynamo 程式設計語言的核心。DesignScript 可用於從頭開始進行建置以支援探索式設計工作流程,它是一個可讀且簡要的語言,可為較小的位元碼提供即時意見以也可以用於大型且複雜的互動。DesignScript 還形成在後台驅動 Dynamo 大多數方面之引擎的基礎。因為幾乎 Dynamo 節點的所有功能和互動都與指令碼撰寫語言有一對一的關係,所以有獨特的機會以流暢方式在節點式互動與指令碼撰寫之間轉換。
對於初學者,節點可以自動轉換為文字語法,以協助學習 DesignScript,或單純只是為了縮小較大的圖表部分。使用稱為「要編碼的節點」的流程即可達成。在 DesignScript 語法一節會說明更多詳細資訊。經驗更豐富的使用者可以使用程式碼區塊,建立既有功能以及使用許多標準編碼範例的使用者編寫關係的自訂組合。對於初學者和進階使用者之間的使用者,提供了大量的捷徑和程式碼片段可加快您的設計。雖然術語「程式碼區塊」可能會讓非程式設計師覺得有點難以理解,但它其實很容易使用,而且功能強大。初學者可以在進行最少編碼的情況下使用程式碼區塊,進階使用者可定義在 Dynamo 定義的其他位置可進行呼叫的指令碼型定義。
簡而言之,程式碼區塊是視覺指令碼撰寫環境中的文字指令碼撰寫介面。它們可以用作數字、字串、公式和其他資料類型。程式碼區塊是專為 Dynamo 設計的,因此可以在程式碼區塊中定義任意變數,且這些變數會自動新增至節點的輸入:
程式碼區塊可讓使用者靈活決定如何指定輸入。下面提供了幾種不同方式來使用座標建立基本點 (10,5,0):
在您進一步瞭解資源庫中可用的函數後,您可能甚至會發現,鍵入「Point.ByCoordinates」的速度比在資源庫中搜尋和找出正確的節點更快。例如當您鍵入 Point. 時,Dynamo 會顯示一個可能函數的清單以套用到點。這可使得指令碼撰寫更直覺,並協助學習如何在 Dynamo 中套用函數。
您可以透過 Core>Input>Actions>Code Block 找到程式碼區塊。但更快的方式是在圖元區按兩下,程式碼區塊就會出現。此節點因為經常使用,所以被賦予完整的按兩下權限。
程式碼區塊對於資料類型也可以很靈活。使用者可以快速定義數字、字串和公式,程式碼區塊將提供所需的輸出。
在以下圖像中,您可以看到以「舊」的方式進行的作業有點冗長,使用者在介面中搜尋所需的節點,將節點新增至畫布,然後輸入資料。使用程式碼區塊時,使用者可以按兩下畫布以拉取節點,然後使用基本語法鍵入正確資料類型。
number、string 和 formula 節點是 Dynamo 節點的三個範例,與 Code Block 相比可以說是舊式節點。
舊式
程式碼區塊
程式碼區塊是 Dynamo 中的獨有功能,用於動態連接視覺程式設計環境與文字型環境。程式碼區塊可存取所有 Dynamo 節點,並可以在一個節點定義整個圖形。請仔細閱讀本章,因為程式碼區塊是 Dynamo 中的基礎建置材料。
可以在程式碼塊中建立函數,然後在 Dynamo 定義中的其他位置重新呼叫函數。此作業會在參數式檔案中建立另一個控制層,可視為自訂節點的文字版本。在此案例中,「父系」程式碼區塊可隨時存取,可在圖表中的任何位置找到。無需使用線路!
第一行包含關鍵字「def」,然後依次是函數名稱與輸入的名稱 (在括號中)。大括號定義函數的本體。使用「return =」傳回值。定義函數的程式碼區塊沒有輸入或輸出埠,因為會從其他程式碼區塊呼叫。
使用同一檔案中的其他程式碼區塊,只需提供名稱與相同數量的引數即可呼叫函數。其工作方式類似於資源庫中的現成節點。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
在本練習中,我們將進行根據輸入點清單建立圓球的一般定義。這些圓球的半徑由每個點的 Z 性質驅動。
接下來先建立介於 0 到 100 之間的一系列十個值。將這些值插入 Point.ByCoordinates 節點,以建立對角線。
建立 Code Block 並介紹我們的定義。
使用以下程式碼行:
inputPt 是我們為了表示驅動函數的點而提供的名稱。到現在為止,函數不會執行任何作業,但我們將在後續步驟中建置此函數。
加入 Code Block 函數後,我們加上註解和 sphereRadius 變數,它會查詢每個點的 Z 位置。請記住,inputPt.Z 是一個方法,不需要括號。這是 查詢 既有元素的性質,因此不需要任何輸入:
現在,我們呼叫在另一個 Code Block 中建立的函數。如果在圖元區上按兩下以建立新的 Code Block,然後鍵入 sphereB,我們發現 Dynamo 建議使用我們定義的 sphereByZ 函數。您的函數已加入 intellisense 資源庫!太酷了。
現在,我們呼叫函數,並建立一個稱為 Pt 的變數以插入先前步驟中建立的點:
我們看到輸出全部都是空值。為何會發生這種情況?定義函數時,我們會計算 sphereRadius 變數,但沒有定義函數應 傳回 哪些項目做為 輸出。我們可以在下一步修正此問題。
我們需要在 sphereByZ 函數中加入
return = sphereRadius;
行定義函數的輸出,這是重要的步驟。現在,我們可以看到程式碼區塊的輸出提供每個點的 Z 座標。
現在,我們要編輯 父系 函數以建立實際的圓球。
我們首先使用以下程式碼行定義圓球:
sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);
接下來,我們將傳回值變更為 sphere,而不是 sphereRadius:
return = sphere;
這會在 Dynamo 預覽中產生一些巨大的圓球!
1.若要調整這些圓球的大小,我們加入圓規來更新圓球半徑值:
sphereRadius = inputPt.Z/20;
現在,我們可以看到分開的圓球,並開始了解半徑與 Z 值之間的關係。
在 Point.ByCoordinates 節點上,透過將交織從「最短清單」變更為「笛卡兒積」,我們建立點的格線。sphereByZ 函數仍完全有效,因此所有點會建立半徑以 Z 值為基礎的圓球。
為了進行測試,我們將原始數字清單插入 Point.ByCoordinates 的 X 輸入。我們現在有一個立方塊的圓球。
注意:如果在您的電腦上需要花很長時間執行此計算,請嘗試將 #10 變更為諸如 #5 等數字。
請記住,我們建立的 sphereByZ 函數是一般函數,因此可以回顧先前課程中的螺旋線,並對其套用函數。
最後一步:運用使用者定義的參數驅動半徑比。若要執行,我們需要為函數建立新輸入,並使用參數取代除數 20。
將 sphereByZ 定義更新為:
在輸入
sphereByZ(Pt,ratio);
中加入 ratio 變數以更新子系 Code Block。將滑棒插入新建立的 Code Block 輸入,並根據半徑比變更半徑的大小。
在本節中,您將會學習一系列如何使用 DesignScript 建立幾何圖形的課程。請將範例 DesignScript 複製到 Dynamo 程式碼區塊逐步進行。
您可能發現 Dynamo 中節點名稱有一個常見現象:每個節點都使用 . 語法而不含空格。這是因為每個節點頂部的文字都表示指令碼撰寫的實際語法,而 . (或 點標記法 ) 將元素與我們可能呼叫的方法分開。這樣可以從視覺指令碼輕鬆轉換為文字型指令碼。
如果將點標記法做一般的類比,在 Dynamo 中如何處理一個參數式蘋果呢?以下是我們在決定吃蘋果之前先對蘋果執行的一些方法。(注意:這些方法不是實際的 Dynamo 方法)。
我不知道您覺得如何,但根據以上表格的輸出來判斷,這似乎是一個美味的蘋果。我認為我會執行 Apple.eat()。
記住蘋果的類比,我們來看看 Point.ByCoordinates,並示範如何使用程式碼區塊建立一個點。
在 Dynamo 中,程式碼區塊 語法 Point.ByCoordinates(0,10);
產生的結果與 Point.ByCoordinates 節點相同,只是我們可以使用一個節點來建立點。比起將不同節點連接至 X 與 Y,此方法更有效率。
在程式碼區塊中使用 Point.ByCoordinates,我們就是以內建節點 (X,Y) 的順序指定輸入。
您可以透過 Code Block 呼叫資源庫中的任何一般節點,只要該節點不是特殊的 「使用者介面」節點 (具有特殊的使用者介面功能) 即可。例如,您可以呼叫 Circle.ByCenterPointRadius,但是呼叫 Watch 3D 節點意義不大。
一般節點 (資源庫中的大多數節點) 通常分為三種類型。您會發現資源庫在組織時也考慮到了這些品類。在 Code Block 中呼叫時,對這三種類型方法 (或節點) 的處理方式不同。
建立 - 建立 (或建構) 項目
動作 - 對某項目執行動作
查詢 - 取得既有項目的性質
「建立」品類將從零開始建構幾何圖形。我們在程式碼區塊中以從左至右的順序輸入值。這些輸入的順序與節點中從上到下的輸入順序相同。
將 Line.ByStartPointEndPoint 節點與程式碼區塊中對應的語法做比較,可以獲得相同結果。
動作是您對該類型的物件執行的行為。Dynamo 使用許多程式語言中通用的 點標記法 對物件套用動作。確定物件後,輸入點,後接動作名稱。動作類型方法的輸入將放置在括號中,類似於建立類型的方法,只是您不必指定對應節點上看到的第一個輸入。我們改為指定執行動作時所依據的元素:
Point.Add 節點是動作類型節點,因此語法稍有不同。
輸入是 (1) point 以及要加上去的 (2) vector。在 Code Block 中,我們已將點 (物件) 命名為 pt。為了將命名為 vec 的向量加入 pt,我們會編寫 pt.Add(vec) 或採用「物件, 點, 動作」的格式。加入動作僅有一個輸入,也就是 Point.Add 節點的所有輸入減去第一個輸入。Point.Add 節點的第一個輸入是點本身。
查詢類型的方法會取得物件的性質。由於物件本身就是輸入,因此您不必指定任何輸入。不需要使用括號。
節點的交織與程式碼區塊的交織稍有不同。如果是節點,使用者會在節點上按一下右鍵,然後選取要執行的交織選項。如果是程式碼區塊,使用者對於資料的建構方式會有更多的控制。程式碼區塊速寫方法使用 複製指南 設定幾個一維清單應採用的配對方式。角括號 <> 中的數字定義所產生巢狀清單的階層:<1>、<2>、<3> 等。
在此範例中,我們使用速寫來定義兩個範圍 (本章的下一節將講述速寫的更多內容)。簡單來說,
0..1;
相當於{0,1}
,-3..-7
相當於{-3,-4,-5,-6,-7}
。結果將產生包含 2 個 x 值與 5 個 y 值的清單。如果我們不對這些不相符的清單使用複製指南,則會得到包含兩個點的清單,這是長度最短的清單。使用複製指南,我們可以找出 2 個座標與 5 個座標所有可能的組合 (即笛卡兒積)。使用語法 Point.ByCoordinates
(x_vals<1>,y_vals<2>);
,可以得到 兩個 清單,每個清單有 五個 項目。使用語法 Point.ByCoordinates
(x_vals<2>,y_vals<1>);
,可以得到 五個 清單,每個清單有 兩個 項目。
使用此標記法,我們也可以指定哪個清單佔優勢:2 個清單 (各包含 5 個項目) 還是 5 個清單 (各包含 2 個項目)。在此範例中,若變更複製指南的順序,結果將在格線中產生一列點清單或一欄點清單。
以上程式碼區塊方法可能花一點時間才能習慣,而 Dynamo 中提供稱為「要編碼的節點」功能,可以讓程序更輕鬆。若要使用此功能,請在 Dynamo 圖表中選取一系列節點,在圖元區上按一下右鍵,然後選取「要編碼的節點」。Dynamo 會將這些節點及所有輸入與輸出濃縮到一個程式碼區塊中!這不僅是一個強大的工具可學習程式碼區塊,也能讓您處理更高效的參數式 Dynamo 圖表。我們將使用「要編碼的節點」結束以下練習,因此請勿錯過。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
為了展示程式碼區塊的強大功能,我們要將既有的牽引欄位定義轉換為程式碼區塊形式。使用既有定義可示範程式碼區塊與視覺指令碼如何具有相關性,有助於學習 DesignScript 語法。
先重新建立以上影像中的定義 (或開啟範例檔案)。
請注意,Point.ByCoordinates 的交織已設定為 「笛卡兒積」。
格線中的每個點都會根據其與參考點的距離而沿著 Z 方向上移。
重新建立並增厚曲面,同時在幾何圖形上建立相對於距參考點距離的凸度。
從頭開始,我們先定義參考點:Point.ByCoordinates
(x,y,0);
我們使用的 Point.ByCoordinates 語法與參考點節點上方指定的語法相同。將變數 x 與 y 插入 Code Block,以便我們可以使用滑棒動態更新這些內容。
在 Code Block 的輸入加入一些 滑棒,範圍從 -50 到 50。這樣我們可以跨越整個預設 Dynamo 格線。
在 Code Block 的第二行,我們定義速寫以取代數字序列節點:
coordsXY = (-50..50..#11);
我們將在下一節詳細討論此內容。現在,請注意此速寫相當於視覺指令碼中的 Number Sequence 節點。
現在,我們將從 coordsXY 序列建立點的格線。為了執行此作業,我們要使用 Point.ByCoordinates 語法,但還需要使用我們在視覺指令碼中採用的方式,創造一個清單的 笛卡兒積。為了執行此作業,我們鍵入行:
gridPts = Point.ByCoordinates(coordsXY<1>,coordsXY<2>,0);
角括號表示笛卡兒積參考。請注意,在 Watch3D 節點中,我們有一個橫越 Dynamo 格線的點格線。
現在講解困難的部分:我們希望根據點距參考點的距離,將這些點的格線上移。首先,我們呼叫這一組新點 transPts。由於平移是針對既有元素的動作,因此我們不用
Geometry.Translate...
,而是使用gridPts.Translate
從圖元區上的實際節點,我們可以看到有三個輸入。要平移的 geometry 已經宣告,因為我們正對該元素執行動作 (使用 gridPts.Translate)。其餘兩個輸入將插入函數 direction 與 distance 的括號內。
direction 很簡單,我們使用
Vector.ZAxis()
垂直移動。參考點與每個格線點之間的距離仍需要計算,因此我們使用相同方式對參考點執行此動作:
refPt.DistanceTo(gridPts)
程式碼的最後一行得出平移後的點:
transPts=gridPts.Translate(Vector.ZAxis(),refPt.DistanceTo(gridPts));
我們現在已經有資料結構適當的點格線,可以建立 Nurbs 曲面。我們使用
srf = NurbsSurface.ByControlPoints(transPts);
建構曲面
最後,為了對取面增加一些深度,我們使用
solid = srf.Thicken(5);
建構實體。在此案例中,我們在程式碼中將曲面變厚了 5 個單位,不過也可以將其宣告為變數 (例如將其稱為 thickness),然後使用滑棒控制該值。
只需按一下按鈕,「要編碼的節點」功能即可自動執行我們剛剛完成的整個練習。這不僅在建立自訂定義及可重複使用的程式碼區塊時很有威力,也是瞭解如何在 Dynamo 中編寫指令碼非常有用的工具。
先使用練習的步驟 1 中使用的既有視覺指令碼。選取所有節點,在圖元區上按一下右鍵,然後選取 「要編碼的節點」。非常簡單。
Dynamo 已自動建立文字版本的視覺圖表、交織與全部項目。在您的視覺指令碼上試試看,體驗程式碼區塊的強大功能!
程式碼區塊有一些基本的速寫方法,簡言之,這些方法可以 顯著 降低資料管理的難度。以下我們將分類講解基本知識,並討論如何使用此速寫來建立與查詢資料。
資料類型
標準 Dynamo
Code Block 對等項
數字
字串
序列
範圍
取得索引處的項目
建立清單
連接字串
條件陳述式
節點
Code Block 對等項
附註
任何運算子 (+、&&、>=、Not... 等等)
+、&&、>=、!... 等等
請注意,「Not」變成「!」,但節點稱為「Not」以便與「階乘」區分
Boolean True
true;
請注意小寫
Boolean False
false;
請注意小寫
定義範圍與序列的方法可以精簡為基本速寫。使用以下影像作為「..」語法的指南,以使用程式碼區塊定義一系列數值資料。瞭解此標記法後,建立數值資料就會非常有效率:
在此範例中,數字範圍由定義
beginning..end..step-size;
的基本 Code Block 語法所取代。以數字方式表示,我們得到:0..10..1;
請注意,語法
0..10..1;
相當於0..10;
步長大小 1 是速寫標記法的預設值。因此0..10;
將產生從 0 到 10 且步長大小為 1 的序列。序列 範例很類似,只是我們使用「#」來說明希望清單包含 15 個值,而非清單中的值不超過 15。在此範例中,我們將定義:
beginning..#ofSteps..step-size:
序列的實際語法為0..#15..2
使用上一步的 #,現在將其放在語法的 step-size 部分。現在,我們產生一個從 beginning 到 end 的 數字範圍,step-size 標記將許多值均勻分佈在這兩個值之間:
beginning..end..#ofSteps
藉由建立進階範圍,我們能以簡單方式使用清單的清單。在以下範例中,我們將隔離變數與主要範圍標記,並建立該清單的另一個範圍。
1.建立巢狀範圍,對含與不含「#」的標記進行比較。套用基本範圍內的相同邏輯,只是變得稍複雜一些。
2.可以在主要範圍內的任何位置定義子範圍,請注意我們可以有兩個子範圍。
3.透過控制範圍內的「end」值,我們可以建立長度不同的多個範圍。
比較以上兩個速寫,並嘗試剖析 子範圍 與 # 標記如何產生結果輸出,來作為邏輯練習。
除了使用速寫建立清單外,我們也可以快速建立清單。這些清單可以包含多種元素類型,也可以進行查詢 (請記住,清單本身就是物件)。總而言之,使用程式碼區塊,您將使用括號 (方括號) 建立清單和查詢清單中的項目:
1.使用字串快速建立清單,並使用項目索引查詢清單。
2.使用變數建立清單,並使用範圍速寫標記查詢清單。
使用巢狀清單進行管理是類似的程序。請注意清單順序,並使用多組方括號呼叫:
1.定義清單的清單。
2.使用單邊括號查詢清單。
3.使用雙邊括號查詢項目。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
在本練習中,我們將靈活運用新的速寫技能,以建立由範圍與公式定義的炫酷蛋殼曲面。在本練習中,請注意我們如何搭配使用程式碼區塊與既有 Dynamo 節點:我們對處理大量資料的工作使用程式碼區塊,而以視覺方式配置 Dynamo 節點以實現定義的易讀性。
首先,透過連接以上節點以建立曲面。不是使用數字節點來定義寬度與長度,而是按兩下圖元區,然後在程式碼區塊中輸入 100;
。
在 Code Block 中輸入
0..1..#50
,定義介於 0 至 1 之間且分為 50 份的範圍。將該範圍連接至 Surface.PointAtParameter,這會在曲面內為 u 與 v 指定介於 0 與 1 之間的值。請記得在 Surface.PointAtParameter 節點上按一下右鍵,將「交織」變更為「笛卡兒積」。
在此步驟中,我們使用第一個函數在 Z 方向將點的格線上移。此格線將根據基本函數驅動產生的曲面。如以下影像所示新增節點
我們不使用公式節點,而是使用包含
(0..Math.Sin(x*360)..#50)*5;
這一行的 Code Block。為了快速詳細說明這一點,我們將定義內含公式的範圍。此公式是正弦函數。正弦函數會接收 Dynamo 中輸入的角度,因此為了取得完整的正弦波形,我們將 x 值 (這是 0 到 1 的範圍輸入) 乘以 360。接下來,我們希望份數與每列的控制格線點數量相同,所以使用 #50 定義五十份。最後,乘數 5 只是為了增加平移的振幅,方便我們在 Dynamo 預覽中查看效果。
雖然上一個 Code Block 運作地很好,但它並非完全是參數式方法。我們要動態驅動其參數,因此我們將上一步的程式碼行取代為
(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;
。藉此我們能根據輸入定義這些值。
透過變更滑棒 (範圍從 0 到 10),我們得到一些有趣的結果。
透過對數字範圍執行轉置,我們反轉窗簾波浪的方向:
transposeList = List.Transpose(sineList);
加入 sineList 與 tranposeList 後會得到一個扭曲的蛋殼曲面:
eggShellList = sineList+transposeList;
變更下面指定的滑棒值,將此演算法「變平靜」。
最後,我們使用程式碼區塊查詢資料的隔離部分。若要重新產生具有特定範圍點的曲面,請在 Geometry.Translate 與 NurbsSurface.ByPoints 節點之間加入以上程式碼區塊。這包括文字行:sineStrips[0..15..1];
。這將選取前 16 列的點 (從 50 個點中)。重新建立曲面,我們可以看到已產生點格線的隔離部分。
在最後一個步驟中,為了讓此 Code Block 的參數式程度更高,我們使用範圍從 0 至 1 的滑棒來驅動該查詢。我們使用這一行程式碼執行此作業:
sineStrips[0..((List.Count(sineStrips)-1)*u)];
。這可能有些混亂,但使用該行程式碼可以快速運用介於 0 和 1 之間的乘數來擴充清單長度。
若使用滑棒值 0.53
,會建立一個剛好通過格線中點的曲面。
與預期一致,使用滑棒值 1
時,會從完整的點格線建立一個曲面。
查看視覺圖表,我們可以亮顯程式碼區塊,並查看其中的每項函數。
1.第一個 Code Block 取代 Number 節點。
2.第二個 Code Block 取代 Number Range 節點。
3.第三個 Code Block 取代 Formula 節點 (以及 List.Transpose、List.Count 與 Number Range)。
4 種。第四個 Code Block 查詢清單的清單,取代 List.GetItemAtIndex 節點。
蘋果的顏色是什麼?
Apple.color
紅色
蘋果成熟了嗎?
Apple.isRipe
true
蘋果有多重?
Apple.weight
6 盎司。
蘋果來自何處?
Apple.parent
樹
蘋果建立哪些項目?
Apple.children
種子
這個蘋果是本地生長的嗎?
Apple.distanceFromOrchard
60 英里。
雖然 Dynamo 能夠建立各種複雜幾何形狀,但是簡單的幾何基本型是構成任何計算設計的骨架:無論是以最終設計的形式直接表示,或是用來做為產生更複雜幾何圖形的鷹架。
雖然 CoordinateSystem 嚴格來說不算是一個幾何圖形,但卻是建構幾何圖形的一個重要工具。一個 CoordinateSystem 物件可以同時追蹤位置和幾何的轉換,例如旋轉、切變和調整比例。
建立一個中心點位於 x=0,y=0,z=0 的 CoordinateSystem (沒有旋轉、調整比例或切變轉換),只需要呼叫 Identity 建構函式:
具有幾何轉換的 CoordinateSystem 超出本章節的範圍,不過有另一個建構函式 CoordinateSystem.ByOriginVectors 可以讓您在特定的點建立座標系統:
最簡單的幾何基本型是一個點 (Point),代表三維空間中的一個零維位置。如先前所述,在特定座標系統中建立一個點有幾種不同的方式:Point.ByCoordinates 以指定的 x、y、z 座標建立一個點;Point.ByCartesianCoordinates 在特定座標系統中以指定的 x、y、z 座標建立一個點;Point.ByCylindricalCoordinates 在有半徑、旋轉角度和高度的圓柱上建立一個點;Point.BySphericalCoordinates 在有半徑和兩個旋轉角度的圓球上建立一個點。
本範例會顯示在各種座標系統建立的點:
下一個較高維度的 Dynamo 基本型是線段,代表兩個端點之間有無限個點。使用 Line.ByStartPointEndPoint 建構函式明確指出兩個邊界點,或使用 Line.ByStartPointDirectionLength 建構函式指定起點、方向和沿著該方向的長度,可以建立直線。
Dynamo 有幾個物件,代表三維的幾何基本型的最基本類型:使用 Cuboid.ByLengths 建立的立方體 (Cuboid);使用 Cone.ByPointsRadius 和 Cone.ByPointsRadii 建立的圓錐 (Cone);使用 Cylinder.ByRadiusHeight 建立的圓柱 (Cylinder);以及使用 Sphere.ByCenterPointRadius 建立的圓球 (Sphere)。
Dynamo 標準幾何圖形資源庫中最簡單的幾何圖形物件是一個點。所有幾何圖形都是使用稱作建構函式的特殊函數建立的,每個建構函式都會傳回一個該特定幾何圖形類型的新實體。在 Dynamo 中,建構函式以物件類型的名稱 (在此案例中為 Point) 為開頭,後接建構的方法。若要建立一個以 x、y、z 直角座標指定的三維點,請使用 ByCoordinates 建構函式:
Dynamo 中的建構函式通常以「By」字首指定,呼叫這些函數會傳回該類型新建立的物件。這個新建立的物件以等號左邊命名的變數儲存。
大多數物件都有許多不同的建構函式,我們可以使用 BySphericalCoordinates 建構函式,指定圓球的半徑、第一個旋轉角度和第二個旋轉角度 (以度為單位指定) 建立一個圓球上的點:
點可以用來建構更高維度的幾何圖形,例如直線。我們可以使用 ByStartPointEndPoint 建構函式在兩個點之間建立一個 Line 物件:
同樣的,直線也可以用來建立更高維度的曲面幾何圖形,例如使用 Loft 建構函式,用一系列直線或曲線,在這之間內插一個曲面。
曲面也可以用來建立更高維度的實體幾何圖形,例如把曲面加厚指定的距離。許多物件都會附加稱為方法的函數,程式設計師可以對該特定物件執行指令。所有幾何圖形都通用的方法包括 Translate 和 Rotate,分別將幾何圖形平移 (移動) 和旋轉指定的量。曲面有一個 Thicken 方法,它採用一個單一的數字輸入,指定曲面的新厚度。
Intersection 指令可以從較高維度的物件萃取出較低維度的幾何圖形。在建立、萃取和重新建立幾何圖形的循環過程中,萃取出的較低維度幾何圖形可以形成較高維度幾何圖形的基礎。在此範例中,我們使用產生的實體 (Solid) 來建立一個曲面 (Surface),並使用曲面 (Surface) 來建立一條曲線 (Curve)。
在 Dynamo 中有兩種基本方法可以建立自由形式的曲線:指定一些點,讓 Dynamo 在這些點之間插出一條平滑的曲線,另一個比較低階的方法是指定某個次數的曲線的基本控制點。如果設計師很清楚知道要產生的線條形狀,或如果設計有一些特定的約束讓曲線可以或無法通過,內插的曲線會很好用。透過控制點指定的曲線實際上是一系列的直線段,演算法會將這些線段平滑產生一條最終的曲線形狀。如果是要探索各種不同平滑程度的曲線形狀,或者當曲線段之間的平滑連續性很重要時,透過控制點指定曲線就很好用。
若要建立內插的曲線,只要將一些點傳入 NurbsCurve.ByPoints 方法即可。
產生的曲線會分別與每個輸入點相交,從第一個點開始,在最後一個點結束。這裡可以使用一個選擇性的週期性參數,用來建立一條週期性的封閉曲線。Dynamo 會自動填入缺少的線段,因此不需要複製終點 (與起點相同)。
NurbsCurve 以幾乎相同的方式產生,輸入點代表直線段的端點,第二個參數稱為次數,指定平滑化曲線的量和類型。* 1 次的曲線沒有平滑化;它是一條聚合線。
2 次的曲線會平滑化讓曲線相交,而且會與聚合線線段的中點相切:
Dynamo 支援最高到 20 次的 NURBS (非均勻的有理 B 雲形線) 曲線,以下腳本說明增加平滑程度對曲線造型的影響:
請注意,至少要比曲線的次數多一個控制點。
透過控制頂點來建構曲線的另一個好處是,能夠在個別的曲線段之間維持相切。只要萃取出最後兩個控制點之間的方向,然後讓後續曲線的前兩個控制點繼續沿著此方向即可。以下範例會建立兩條獨立的 NURBS 曲線,不過這兩條曲線如一條曲線般平滑:
*這是一個非常簡化的 NURBS 曲線幾何圖形說明,如需更準確更詳細的討論,請參閱參考資料中的 Pottmann, et al, 2007。
透過在三維空間中明確指出 x、y、z 座標,可以建立某些幾何圖形物件。但是,我們更常對物件本身或對其基本的 CoordinateSystem 使用幾何轉換,將幾何圖形移動到最終位置。
最簡單的幾何轉換是平移,亦即將一個物件沿著 x、y、z 方向移動指定的單位數。
在 Dynamo 中,雖然可以在物件名稱的結尾附加 .Translate 方法平移所有物件,但是還有更複雜的轉換需要將物件從一個基本的 CoordinateSystem 轉換到新的 CoordinateSystem。例如,若要讓物件繞 x 軸旋轉 45 度,我們要使用 .Transform 方法,將物件從其既有無旋轉的 CoordinateSystem,轉換到一個已經繞 x 軸旋轉 45 度的 CoordinateSystem:
除了平移和旋轉,也可以用調整比例或切變方式建立 CoordinateSystem。CoordinateSystem 可以使用 .Scale 方法調整比例:
在 CoordinateSystem 建構函式中輸入非正交的向量可以建立切變的 CoordinateSystem。
比起旋轉和平移,調整比例和切變是相對比較複雜的幾何轉換,所以並非每個 Dynamo 物件都能經過這些轉換。下表概述哪些 Dynamo 物件可以有非等比例調整的 CoordinateSystem,以及切變的 CoordinateSystem。
Arc
否
否
NurbsCurve
是
是
NurbsSurface
否
否
Circle
否
否
Line
是
是
Plane
否
否
Point
是
是
Polygon
否
否
Solid
否
否
Surface
否
否
Text
否
否
計算設計中的物件很少會以其最終的位置和形狀明確建立,幾乎都是以既有的幾何圖形為基礎,將它們經過平移、旋轉,或以其他任何方式放在適當位置。向量數學是一種以幾何搭建鷹架的方式,對幾何圖形提供方向和方位,並且將整個 3D 空間的移動概念化而不提供視覺表現法。
從最基礎來說,一個向量代表 3D 空間中的一個位置,而且通常視為從位置 (0,0,0) 到該位置的一個箭頭終點。向量可以使用 ByCoordinates 建構函式建立,採用新建立的向量物件的 x、y、z 位置。請注意,向量物件不是幾何物件,不會出現在 Dynamo 視窗中。但是在主控台視窗中可以列印出新建立或修改過的向量的相關資訊:
向量物件定義了一組數學運算,讓您可以在 3D 空間中相加、相減、相乘,或以其他任何方式移動物件,就像您在 1D 空間中的數線上移動實數一樣。
向量相加是定義為兩個向量的分量總和,可以視為是兩個分量的向量箭頭以尖端接著尾端的方式放置而得到的向量。 向量相加是使用 Add 方法執行,以左圖表示。
同樣的,兩個向量物件可以使用 Subtract 方法相減。向量相減可以視為是從第一個向量到第二個向量的方向。
向量相乘可以視為將一個向量的終點沿著自己的方向移動給定的比例係數。
如果要調整一個向量的大小,讓產生的向量長度完全等於調整的量,就經常會這樣做。只要先將一個向量正規化,也就是將向量的長度設定為等於 1,就可以輕鬆達成目標。
c 還是指向與 (1, 2, 3) 相同的方向,但是現在長度等於 5。
向量數學中還有其他兩個與 1D 數學無關的方法,分別是外積和內積。外積是一種從兩個既有向量產生一個與這兩個向量成正交 (90 度) 的向量的方法。例如,x 軸和 y 軸的外積是 z 軸,不過兩個輸入向量不必然要互相正交。外積向量是透過 Cross 方法計算。
向量數學另外一個更進階的函數是內積。二個向量的內積是一個與兩個向量之間的角度有關但不是完全相同的一個實數 (不是 Vector 物件)。內積一個有用的性質是,如果兩個向量互相垂直,則兩個向量之間的內積將為 0。內積使用 Dot 方法計算。
Intersect、Trim 和 SelectTrim 主要是用在較低維度的幾何圖形 (例如點、曲線和曲面)。而立體幾何圖形則有額外的一組方法,可以透過類似 Trim 的方法減去材料,然後將元素合併在一起形成較大的元素,在建構幾何圖形後修改形狀。
Union 方法使用兩個實體物件,從兩個物件都涵蓋到的空間建立單一實體物件。物件之間重疊的空間會合併成最終的形狀。此範例將一個圓球和一個立方體合併成一個單一的立體圓球-立方塊造型:
Difference 方法與 Trim 類似,從基準實體減去輸入工具實體的內容。在此範例中,我們從一個圓球切掉一個小凹口:
Intersect 方法傳回兩個實體輸入之間重疊的實體。在以下範例中,Difference 已變成 Intersect,產生的實體是一開始切掉不見的空洞:
Python 是使用廣泛的程式設計語言,其備受青睞與其語法樣式有很大關係。Python 的可讀性很高,因此較許多其他語言更容易瞭解。Python 支援模組與套件,可嵌入至既有應用程式中。如需如何正常使用 Python 的資訊, 上的 頁面是良好的資源。
計算設計中經常會使用曲線和曲面做為後續建構幾何圖形的基礎。為了讓這個早期的幾何圖形能夠做為後期幾何圖形的基礎,腳本必須要能夠萃取品質,例如物件整個區域的位置和方位。曲線與曲面兩種都支援這類萃取,這就是所謂的參數化。
一條曲線上所有的點都可以視為在 0 到 1 的範圍內具有唯一的參數。如果我們根據幾個控制點或內插點建立 NurbsCurve,第一個點的參數會是 0,最後一個點的參數會是 1。我們無法事先知道所有中間點的確切參數是多少,這聽起來像是很嚴重的限制,不過透過一系列的公用程式函數,這個狀況會減輕許多。曲面的參數化與曲線類似,但是有兩個分別稱為 u 和 v 的參數,而不是一個。如果我們要建立一個包含以下幾點的曲面:
p1 會有 u = 0 v = 0 的參數,p9 會有 u = 1 v = 1 的參數。
決定用來產生曲線的點時,參數化並不是特別好用,它的主要用途是決定由 NurbsCurve 和 NurbsSurface 建構函式所產生的中間點的位置。
曲線 (Curve) 有一個 PointAtParameter 方法,採用 0 到 1 之間的一個雙精確度引數,並傳回位於該參數的 Point 物件。例如,此腳本會找出參數 0、.1、.2、.3、.4、.5、.6、.7、.8、.9 和 1 的點 (Point):
同樣的,曲面 (Surface) 有一個 PointAtParameter 方法,採用兩個引數:產生的點的 u 和 v 參數。
在萃取曲線和曲面上的各個點時雖然很好用,但是腳本通常需要知道位於某個參數的特定幾何特性,例如曲線或曲面是朝向哪個方向。CoordinateSystemAtParameter 方法不只會找出位置,也會找出位於曲線或曲面的參數處有方向的 CoordinateSystem。例如,以下腳本會沿著一個迴轉的曲面 (Surface) 萃取出有方向的 CoordinateSystem,並使用 CoordinateSystem 的方位產生插在曲面法線方向上的線條:
如先前所述,參數化在整個曲線或曲面的長度不一定都是均勻的,這表示參數 0.5 不一定會永遠對應到曲線或曲面的中點,0.25 不一定會永遠對應到曲線或曲面四分之一的點。若要避開這種限制,曲線還有另外一組參數化指令,可讓您沿著曲線找出位於特定長度的點。
到目前為止,許多範例都將重點放在從較低維度的物件建構較高維度的幾何圖形。交集的方法允許這種較高維度的幾何圖形產生較低維度的物件,而修剪和選取修剪的指令則允許腳本在建立幾何圖形後大幅修改幾何形狀。
Dynamo 針對所有幾何圖形都定義了 Intersect 方法,表示理論上,任何幾何圖形部分都可以與其他任何幾何圖形部分相交。某些交集本來就沒有意義,例如牽涉到點 (Point) 的交集,因為產生的物件永遠都是輸入點本身。下表概述物件之間其他可能的交集組合。下表概述各種交集運算的結果:
下面這個非常簡單的範例示範一個平面與一個 NurbsSurface 的交集。交集產生一個 NurbsCurve 陣列,可以像任何其他 NurbsCurve 一樣使用這個陣列。
Trim 方法與 Intersect 方法非常類似之處在於幾乎是針對每個幾何圖形定義。不過,Trim 的限制遠比 Intersect 還多。
請注意,Trim 方法一定要有「選取」點,這個點決定要捨棄哪個幾何圖形,要保留哪些部份。Dynamo 會找出並捨棄最接近選取點且經過修剪的幾何圖形。
NurbsCurve 的二維類比是 NurbsSurface,就像自由形式的 NurbsCurve,您可以使用兩種基本方法建構 NurbsSurface:一個是輸入一組基準點,讓 Dynamo 在這些點之間內插,另一個是明確指定曲面的控制點。就像自由形式的曲線,如果設計師很清楚知道要產生的曲面形狀,或如果設計需要曲面通過約束點,內插的曲面會很好用。相反地,如果是要探索各種平滑程度的設計,透過控制點建立的曲面就比較有用。
若要建立內插的曲面,只要產生一些近似曲面形狀的二維點即可。這些點必須是矩形,亦即不是鋸齒狀。NurbsSurface.ByPoints 方法會從這些點建構一個曲面。
指定曲面的基本控制點,也可以建立自由形式的 NurbsSurface。就像 NurbsCurve 一樣,控制點可以視為是代表一個有直線段的四邊形網格,這會根據曲面的次數,平滑化成最終的曲面形狀。若要使用控制點來建立 NurbsSurface,請在 NurbsSurface.ByPoints 中包含另外兩個參數,指出基本曲線在曲面兩個方向的次數。
我們可以增加 NurbsSurface 的次數,來變更產生的曲面幾何圖形:
就像我們可以在一組輸入點之間內插來建立 Surface,也可以在一組基準曲線之間內插來建立 Surface。這稱為斷面混成。使用 Surface.ByLoft 建構函式可以建立斷面混成的曲線,一組輸入曲線是唯一的參數。
迴轉的曲面是另外一種曲面類型,環繞一個中心軸掃掠一條基準曲線可以建立這種曲面。如果內插曲面是內插曲線的二維類比,則迴轉的曲面就是圓和弧的二維類比。
迴轉的曲面是由基準曲線 (代表曲面的「邊緣」)、軸原點 (曲面的基準點)、軸方向 (中央「核心」方向)、掃掠起始角度和掃掠結束角度指定。這些是用來做為 Surface.Revolve 建構函式的輸入。
以下 Python 指令碼會為多個範例產生點陣列。請將這些指令碼貼至 Python Script 節點,如下所示:
python_points_1
python_points_2
python_points_3
python_points_4
python_points_5
使用: Point
Curve
Plane
Surface
Solid
對: Curve
是
否
否
否
否
Polygon
-
否
是
否
否
Surface
-
是
是
是
是
Solid
-
-
是
是
是
現在我們已經示範了如何在 Dynamo 中使用 Python 指令碼,接下來瞭解將 Revit 資源庫連接至指令碼撰寫環境。請記住,我們使用以下程式碼區塊的前四行匯入了 Python 標準和 Dynamo 核心節點。若要匯入 Revit 節點、Revit 元素及 Revit 文件管理員,我們只需再加入幾行程式碼:
這會提供 Revit API 的存取權,以及適用於 Revit 工作的自訂指令碼。透過合併視覺程式設計程序與 Revit API 指令碼,將大幅改進協同合作與工具開發。例如,BIM 管理員與線路圖設計者可以針對同一圖表進行合作。透過這種協同合作,他們可以改善模型的設計與執行。
Dynamo 專案的潛在宗旨是拓寬平台的實作範圍。隨著 Dynamo 加入更多程式至事項表,使用者可以從 Python 指令碼撰寫環境存取平台特定 API。雖然在本節中只是對 Revit 進行案例研究,但我們可以預期在將來的更多章節中,會針對在其他平台撰寫指令碼提供全面的自學課程。此外,現在還可以存取許多 IronPython 資源庫,您可以將這些資源庫匯入 Dynamo!
以下範例示範使用 Python 從 Dynamo 實作 Revit 特定作業的方式。若要更詳細地檢閱 Python 與 Dynamo 及 Revit 之間的關係,請參閱Dynamo Wiki 頁面。Python 與 Revit 的另一項有用資源是 Revit Python Shell 專案。
建立新的 Revit 專案。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
在以下練習中,我們將探索 Dynamo for Revit 中的基本 Python 指令碼。此練習重點是處理 Revit 檔案及元素,以及 Revit 與 Dynamo 之間的通訊。
這是對連結至 Dynamo 階段作業的 Revit 檔案擷取 doc、uiapp 及 app 的現成方法。先前使用 Revit API 的程式設計人員可能會注意到觀看清單中的項目。如果對這些項目不熟悉,沒有問題,我們會在以下練習中使用其他範例。
以下將講述在 Dynamo 中如何匯入 Revit 服務及擷取文件資料。
看一下 Dynamo 中的 Python 節點。您也可以從下方找到程式碼:
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
在本練習中,我們將在 Revit 內使用 Dynamo Python 節點建立簡單的模型曲線。
首先,在 Revit 中建立新的概念量體族群。
開啟 「概念量體」資料夾,然後使用 公制量體.rft 樣板檔。
在 Revit 中,使用鍵盤快速鍵 un
帶出「專案單位」設定,將長度單位變更為公尺。
啟動 Dynamo,然後建立以下影像中的一組節點。我們先在 Revit 中從 Dynamo 節點建立兩個參考點。
建立 Code Block,提供
"0;"
的值將此值插入 ReferencePoint.ByCoordinates 節點做為 X、Y 與 Z 輸入。
建立三個滑棒,讓其範圍介於 -100 與 100 之間,且步長大小為 1。
將每個滑棒連接至 ReferencePoint.ByCoordinates 節點。
在工作區中加入 Python 節點,按一下節點上的「+」按鈕以加入另一個輸入,然後將兩個參考點插入每個輸入。開啟 Python 節點。
看一下 Dynamo 中的 Python 節點。在下方尋找完整的程式碼。
System.Array:Revit 需要一個系統陣列做為輸入 (而非 Python 清單)。這只是又一行程式碼,但注意引數類型將有助於在 Revit 中進行 Python 程式設計。
我們已在 Dynamo 中使用 Python 建立以直線連接的兩個參考點。接下來在下一個練習中更進一步。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
此練習仍很簡單,但講述了在 Revit 與 Dynamo 之間連接資料與幾何圖形的主題。我們從開啟 Revit-StructuralFraming.rvt 開始。開啟後,啟動 Dynamo,並開啟檔案 Revit-StructuralFraming.dyn。
此 Revit 檔案是一個非常基本的檔案。兩條參考曲線:一條繪製在 Level 1 上,另一條繪製在 Level 2 上。我們要將這些曲線匯入 Dynamo 並保持即時連結。
在此檔案中,我們將一組節點插入 Python 節點的五個輸入。
Select Model Element 節點: 按一下每個節點的選取按鈕,然後選取 Revit 中的對應曲線。
Code Block: 使用語法
0..1..#x;
, 將介於 0 與 20 之間的整數滑棒連接至 x 輸入。此作業會指定在兩條曲線之間繪製的樑數量。Structural Framing Types: 在此我們將從下拉式功能表中選擇預設的 W12x26 樑。
Levels: 選取「Level 1」。
此 Python 程式碼稍多一些,但程式碼中的註解描述程序的狀況
在 Revit 中,我們有一個跨越兩條曲線的樑陣列做為結構元素。注意:這不是真實範例...結構元素是用做從 Dynamo 所建立原生 Revit 例證的範例。
在 Dynamo 中也可以看到結果。Watch3D 節點中的樑是指從 Revit 元素查詢的幾何圖形。
請注意,我們有一套連續的程序,將資料從 Revit 環境轉換到 Dynamo 環境。總之,程序的工作方式如下:
選取 Revit 元素
將 Revit 元素轉換為 Dynamo 曲線
將 Dynamo 曲線分割為一系列 Dynamo 點
使用兩條曲線之間的 Dynamo 點建立 Dynamo 線
透過參考 Dynamo 線建立 Revit 樑
透過查詢 Revit 樑的幾何圖形,輸出 Dynamo 曲面
這聽上去可能有點笨拙,但指令碼可讓該作業非常簡單,只需在 Revit 中編輯曲線並重新執行解析器即可 (雖然在執行此作業時,您可能不得不刪除先前的樑)。這是因為我們是以 Python 放置樑,因此破壞了 OOTB 節點所擁有的關聯。
在 Revit 中更新參考曲線後,我們得到一個新的樑陣列。
與:
Surface
Curve
Plane
Solid
Surface
Curve
Point
Point、Curve
Surface
Curve
Point
Point
Point
Curve
Plane
Curve
Point
Curve
Curve
Solid
Surface
Curve
Curve
Solid
在 Dynamo 2.0 中,我們可以在第一次開啟 Python 視窗時,指定要使用的預設樣板 (.py extension)
。這是一個大家期待已久的功能,因為可以加快在 Dynamo 中使用 Python 的速度。使用樣板,可以讓我們在想要開發自訂 Python 指令碼時,有預設的匯入值可以隨時開始。
此樣板的位置位於 Dynamo 安裝的 APPDATA
位置。
這通常如下所示 ( %appdata%\Dynamo\Dynamo Core\{version}\ )
。
若要使用此功能,我們必須在 DynamoSettings.xml
檔案中加入下列一行。(以記事本編輯)
我們會在當中看到 <PythonTemplateFilePath />
,可以直接將它替換為以下內容:
注意:請使用您的使用者名稱替換 CURRENTUSER
接下來,我們需要建置一個樣板,當中含有我們要使用的內建功能。在此範例中,我們嵌入 Revit 相關的匯入,和一些在處理 Revit 時的其他典型項目。
您可以開啟一份空白的記事本文件,在當中貼上以下程式碼:
完成後,請在 APPDATA
位置將此檔案儲存為 PythonTemplate.py
。
定義 Python 樣板之後,每當放置了 Python 節點,Dynamo 都會尋找這裡。如果找不到,看起來就會是預設的 Python 視窗。
如果發現 Python 樣板 (例如我們的 Revit),您會看到您內建的所有預設項目。
您可以在下列位置找到有關此絕佳額外功能 (由 Radu Gidei 提供) 的其他資訊。https://github.com/DynamoDS/Dynamo/pull/8122
手冊的此部分是以「最佳實踐」日誌的理念組織的。它揭示了我們透過經驗和研究所得的多種策略,最有利於品質參數式工作流程。作為設計師與程式設計師,我們的品質指標主要包括我們工具的可維護性、可靠性、可用性和效率。雖然這些最佳實踐有視覺或文字指令碼撰寫的特定範例,但是原則適用於所有程式設計環境,並可以提供許多計算工作流程。
為什麼要在 Dynamo 的視覺程式設計環境中使用文字程式設計?視覺程式設計有許多優點。您可藉此在直覺的視覺介面中建立程式,不必學習特殊語法。但是,視覺程式可能會變得雜亂,有時會缺少功能。例如,Python 為編寫條件陳述式 (if/then) 及迴圈提供更容易達到目標的方法。Python 是功能強大的工具,可以延伸 Dynamo 的功能,您可藉此使用幾行簡潔的程式碼來取代許多節點。
視覺程式:
文字程式:
與程式碼區塊類似,Python 節點是視覺程式設計環境中的指令碼撰寫介面。Python 節點位於資源庫中的「Script」>「Editor」>「Python Script」下。
按兩下節點會開啟 Python Script 編輯器 (您也可以在節點上按一下右鍵,然後選取 「編輯...」 )。您會發現頂部有一些模板文字,目的是協助您參考您會需要的資源庫。輸入儲存於 IN 陣列中。為 OUT 變數指定值,值就會傳回到 Dynamo 中
藉由 Autodesk.DesignScript.Geometry 資源庫,您可以使用與程式碼區塊類似的點標記法。如需有關 Dynamo 語法的更多資訊,請參閱 https://github.com/DynamoDS/DynamoPrimerNew/blob/master-cht/coding-in-dynamo/7_code-blocks-and-design-script/7-2_design-script-syntax.md 以及 DesignScript 指南 (若要下載此 PDF 文件,請在連結上按一下右鍵,然後選擇「另存連結為...」)。鍵入幾何圖形類型 (例如「Point.」) 將顯示建立和查詢點的方法清單。
這些方法包括建構函式 (例如 ByCoordinates)、動作 (例如 Add) 以及查詢 (例如 X、Y、Z 座標)。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
在此範例中,我們將編寫從實體模組建立樣式的 Python 指令碼,然後將其轉換為自訂節點。首先,使用 Dynamo 節點建立實體模組。
Rectangle.ByWidthLength: 建立將做為實體基礎的矩形。
Surface.ByPatch: 將矩形連接至 closedCurve 輸入以建立底部曲面。
Geometry.Translate: 將矩形連接至 geometry 輸入以將其上移,使用程式碼區塊指定實體的基礎厚度。
Polygon.Points: 查詢平移的矩形以擷取角點。
Geometry.Translate: 使用程式碼區塊建立對應到四個點的四個值清單,同時將實體的一個角點上移。
Polygon.ByPoints: 使用平移的點重新建構頂部多邊形。
Surface.ByPatch: 連接多邊形以建立頂部曲面。
現在我們已建立頂部與底部曲面,接下來在兩個輪廓之間進行斷面混成,以建立實體的側面。
List.Create: 將底部矩形與頂部多邊形連接至索引輸入。
Surface.ByLoft: 對兩個輪廓進行斷面混成,以建立實體的側面。
List.Create: 將頂部、側面與底部的曲面連接至索引輸入,以建立曲面清單。
Solid.ByJoinedSurfaces: 接合曲面以建立實體模組。
現在我們已建立實體,接下來將 Python Script 節點放入工作區。
若要在節點中加入其他輸入,請按一下節點上的「+」圖示。輸入命名為 IN[0]、IN[1] 等等,以指出它們代表清單中的項目。
我們先定義輸入與輸出。按兩下節點以開啟 python 編輯器。請依照下面的程式碼,在編輯器中修改程式碼。
在我們進行練習時,此程式碼會更容易理解。接下來,我們需要考慮需要哪些資訊以排列實體模組。首先,我們需要知道實體的標註,以確定平移距離。由於存在邊界框錯誤,我們不得不使用邊曲線幾何圖形來建立邊界框。
看一下 Dynamo 中的 Python 節點。請注意,我們使用的語法與 Dynamo 節點標題中的語法相同。查看下面加上註解的程式碼。
由於我們將平移並旋轉實體模組,因此接下來使用 Geometry.Transform 作業。看一下 Geometry.Transform 節點,我們知道需要來源座標系統與目標座標系統,以平移實體。來源是實體的關聯座標系統,而目標是所排列每個模組的不同座標系統。這表示我們必須循環使用 x 值與 y 值,以便每次以不同方式平移座標系統。
按一下「執行」,然後儲存程式碼。將 Python 節點與既有的指令碼連接,如下所示。
將 Solid.ByJoinedSurfaces 的輸出連接為 Python 節點的第一個輸入,並使用 Code Block 定義其他輸入。
建立 Topology.Edges 節點,並使用 Python 節點的輸出做為其輸入。
最後,建立 Edge.CurveGeometry 節點,並使用 Topology.Edges 的輸出做為其輸入。
請嘗試變更種子值以建立不同的樣式。您也可以變更實體模組本身的參數,以取得不同的效果。
現在我們已建立有用的 Python 指令碼,接下來將其另存成自訂節點。選取 Python Script 節點,在「工作區」上按一下右鍵,然後選取「建立自訂節點」。
指定名稱、描述與品類。
這會開啟一個新的工作區,可從中編輯自訂節點。
Input: 變更輸入名稱以更具描述性,然後加入資料類型及預設值。
Output: 變更輸出名稱
將節點儲存為 .dyf 檔案,您應該會看到自訂節點反映我們剛才所做的變更。
在此章節之前,本手冊已涵蓋如何實施 Dynamo 的強大視覺腳本撰寫功能。充分瞭解這些功能是重要的基礎,以及建置功能強大的視覺程式的第一步。當我們實際使用視覺程式、將其與同事共享、疑難排解錯誤或測試限制時,我們將需要處理其他問題。如果其他使用者將使用您的程式,或您預期六個月後將會打開它,程式則需要有直接、清晰的圖形和邏輯。Dynamo 有多個工具可管理程式的複雜性,本章將提供有關何時使用它們的準則。
當您開發 Dynamo 圖表和測試您的想法時,它的大小和複雜性可快速增加。建立可運作的程式和建立簡單的程式同樣重要。圖表不僅更快且更有預測性地執行,您與其他使用者亦將瞭解其邏輯。以下幾種方法可協助您闡明圖表的邏輯。
建置程式時,透過群組可以建立功能不同的部分
群組可讓您四處移動程式的大塊部分,同時維持模組性與一致性
您可以變更群組的顏色來區分群組執行的內容 (輸入與函數)
您可以使用群組開始組織圖表,以簡化自訂節點的建立
此程式中的顏色用於識別每個群組的目的。此策略可用於建立任何您開發的圖形標準或樣板裡的架構。
函數群組 (藍色)
輸入群組 (橘色)
腳本群組 (綠色)
若要瞭解如何使用群組,請參閱管理您的程式。
有時,您可以使用 Code Block,以快於搜尋的方式輸入數字或節點方法 (Point.ByCoordinates、Number、String、Formula)
如果您要在 DesignScript 定義自訂函數以減少圖表中的節點數量,Code Block 就非常好用
1 和 2 均執行相同的功能。寫入數行程式碼遠遠比搜尋並加入每個個別節點更快。Code block 也會更精確。
使用 Code Block 撰寫的 DesignScript
節點中的相等程式
若要瞭解如何使用 Code Block,請參閱什麼是 Code Block。
您可以使用「將節點轉換為程式碼」減低圖表的複雜性,它會收集簡單的節點,並在一個 Code Block 裡寫入與其對應的 DesignScript。
「將節點轉換為程式碼」可以濃縮程式碼,而不會減低程式的清晰度
以下是使用「將節點轉換為程式碼」的優點:
輕鬆地將程式碼濃縮為仍可編輯的元件
可以簡化圖表的重要部分
如果不會對「小型程式」進行頻密的編輯,它將會很有用處
適合用來整合其他程式碼區塊功能,例如函數
以下是使用「將節點轉換為程式碼」的缺點:
一般命名使其不易辨認
其他使用者比較難以瞭解
較難返回視覺程式版本
既有的程式
從「將節點轉換為程式碼」建立的 Code Block
若要瞭解如何使用「將節點轉換為程式碼」,請參閱 DesignScript 語法。
使用 List@Level 可以協助您取代可能會佔用大量圖元區空間的 List.Map 和 List.Combine 節點,降低圖表的複雜性。
List@Level 是比 List.Map/List.Combine 更快建構節點邏輯的方法,可讓您直接從節點的輸入埠存取清單中任何層級的資料。
我們可以為 CountTrue 的 list 輸入啟用 List@Level,來確認 BoundingBox.Contains 在哪些清單中傳回多少 True 值。List@Level 可讓使用者決定輸入將在哪個層級取得資料。使用 List@Level 更為彈性、有效,強烈建議您以它來取代涉及 List.Map 和 List.Combine 的其他方式。
計算 List Level 2 的 true 值
計算 List Level 3 的 true 值
若要瞭解如何使用 List@Level,請參閱清單的清單。
除了使圖表更為簡單和高效外,您亦應致力於維持它的清晰度。即使您盡最大的努力讓圖表擁有直覺式的邏輯分組,關係仍然可能不會立即顯現。在群組裡加入簡單的註記或更名滑棒可以幫助您或其他使用者避免不必要的混淆或橫跨圖表的麻煩。以下幾種方法可協助確保圖表內和圖表間的一致性。
為減少您在完成建構圖表的後續工作,您應該嘗試時常對齊節點以確保節點配置易於辨認
如果其他人要處理您的圖表,您應該確保節點線路的配置在傳輸前能夠輕鬆地流動
為了協助您對齊,請使用「清理節點配置」功能自動對齊圖表,即使它未能如您自己手動對齊般精確
未排列過的圖表
對齊的圖表
若要瞭解如何使用「節點對齊」,請參閱管理您的程式。
將輸入更名可協助他人輕鬆瞭解您的圖表,尤其當他們插入的內容不在螢幕上顯示時
更名節點而非輸入時請小心。 另一種替代方法是從節點叢集建立自訂節點並對其進行更名;這會讓人瞭解它包含其他內容
操控曲面的輸入
建築參數的輸入
排水模擬腳本的輸入
若要更名節點,請在其名稱上按一下右鍵,然後選擇「更名節點...」。
如果圖表需要節點無法表達的普通語言說明,您應該加入註釋
如果節點太多,或群組太大或太複雜,而無法輕鬆瞭解,您應該加入註釋
描述傳回原始轉換距離的程式部分的註釋
描述將這些值對映至正弦波形的程式碼的註釋
若要瞭解如何加入註釋,請參閱管理您的程式。
建置視覺指令碼時,請務必確認所傳回的與您所預期的相符。並非所有錯誤或問題都會導致程式立即失敗,尤其是可能會影響下游較遠處的 null 或零值。指令碼撰寫策略中,對文字指令碼撰寫的討論也會提及此策略。以下練習將有助於確保您獲得預期的內容。
建立程式時,使用 Watch 或「預覽標示圈」確認關鍵輸出傳回您預期的內容
Watch 節點用於比較:
原始轉換距離
通過正弦方程式的值
若要瞭解如何使用 Watch,請參閱資源庫。
即使您獨立工作,其他使用者亦很有可能會開啟您的程式。他們應該可以快速瞭解程式需要,以及使用程式的輸入與輸出執行作業。如果開發自訂節點是為了與 Dynamo 社群共用和用於其他人的程式,這點尤其重要。這些做法能夠產生強大、可重複使用的程式和節點。
若要確保易讀和可調整,您應該嘗試儘量減少輸入與輸出
在圖元區加入任何節點之前,您應該嘗試先建立邏輯能運作的粗略大綱,來策劃您要如何建置邏輯。當您建立粗略的大綱時,您應該持續記錄指令碼要新增哪些輸入和輸出。
如果您有想要嵌入到圖表中的特定選項或條件,您應該使用「預置」以快速存取。
您也可以使用「預置」,在執行時間較長的圖表中快取特定的滑棒值來降低複雜性。
若要瞭解如何使用「預置」,請參閱使用預置管理您的資料。
如果您的程式可以收集到單一容器中,您應該使用自訂節點。
當圖表的一部分經常在其他程式中重複使用,您應該使用自訂節點。
如果您想要與 Dynamo 社群分享功能,您應該使用自訂節點。
將點平移程式收集成一個自訂節點,可以建立一個功能強大、獨特、可攜式和更易於瞭解的程式。清晰地命名輸入埠將協助其他使用者瞭解如何使用節點。請記得為每個輸入加入描述和所需的資料類型。
既有牽引程式
收集此程式 PointGrid 的自訂節點
若要瞭解如何使用自訂節點,請參閱自訂節點簡介。
您可以建立樣板來建立視覺圖表的圖形標準,以確保協同合作者使用標準化的方式瞭解圖表
建立樣板時,您可以標準化群組顏色和字體大小,為工作流程類型或資料動作分類。
建立樣板時,您甚至可以標準化您想要如何在圖表中為前端與後端工作流程之間的差異進行標示、著色或設計型式。
程式的使用者介面 (前端) 包括專案名稱、輸入滑棒和匯入幾何圖形。
程式的後端。
群組顏色品類 (一般設計、輸入、Python 指令碼、匯入的幾何圖形)。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
現在我們已建立多個最佳作法,讓我們將它們套用至一個快速建置的程式。雖然程式成功產生屋頂,但圖表的狀態是作者的思維導圖。它缺少任何組織或有關使用它的說明。我們將逐步瞭解組織、描述和分析程式的最佳實踐,以便其他使用者可以瞭解如何使用它。
程式正常運作,但圖表缺乏組織。
我們先決定程式傳回的資料和幾何圖形。
瞭解資料會在何時發生重大變化,對於建立邏輯劃分或模組性非常重要。請嘗試利用 Watch 節點來檢查程式的其餘部分,看看您是否可以先決定群組,然後才移至下一個步驟。
這個有數學方程式的 Code Block 似乎是程式的關鍵部分。Watch 節點會顯示方程式傳回平移距離的清單。
此區域的目的並不明顯。BoundingBox.Contains 在清單層級 L2 的 True 值排列,且 List.FilterByBoolMask 的存在,表示我們正在對點格線的一部分進行取樣。
一旦我們瞭解程式的元素部分,就可將其分組。
群組可讓使用者從視覺上區分程式的各個部分。
匯入 3D 敷地模型
根據正弦方程式轉換點網格
點網格的範例部分
建立建築屋頂的曲面
建立玻璃帷幕牆
建立群組後,對齊節點以建立圖表的視覺連續性。
視覺連續性可協助使用者查看程式流程和節點之間的隱含關係。
透過加入另一層圖形改進來使程式更容易存取。加入註釋以描述程式中特定區域的運作方式、為輸入自訂名稱,以及對不同類型的群組指定顏色。
這些圖形改進可讓使用者瞭解更多有關程式的執行。不同的群組顏色有助於區分輸入與函數。
註釋
輸入的描述性名稱
在開始壓縮程式之前,讓我們先尋找關鍵位置引入 Python 指令碼排水模擬器。將第一個已調整比例的屋頂曲面的輸出插入各自的腳本輸入。
我們選擇現在將腳本整合到程式,以便可以在原始、單一的屋頂曲面執行排水模擬。指定的曲面無法被預覽,但它可讓我們不必選取倒角 Polysurface 的頂部表面。
腳本輸入的來源幾何圖形
Python 節點
輸入滑棒
打開/關閉開關
一切就緒,我們來簡化圖表。
使用「將節點轉換為程式碼」和「自訂節點」濃縮程式,已經大幅減少圖表的大小。建立屋頂曲面和牆的群組已轉換為程式碼,因為它們特定於此程式。點轉換群組包含在自訂節點中,並且可以用於其他程式。在範例檔案中,從轉換點群組建立您的自訂節點。
包含「轉換點網格」群組的自訂節點
使用「將節點轉換為程式碼」壓縮「建立建築屋頂曲面和帷幕牆」群組
最後一步是建立典型屋頂形狀的預置。
這些輸入是屋頂形狀的主要驅動因素,將協助使用者發現程式的潛能。
我們的程式有兩個預置視圖。
屋頂排水模式提供使用者以解析分式檢視各個預置。
使用 DesignScript、Python 和 ZeroTouch (C#) 在視覺指令碼撰寫環境中進行文字指令碼撰寫,可建立功能強大的視覺關係。使用者可以在相同的工作區內執行以下所有作業:顯示如輸入滑棒等的元素、將大型作業壓縮並輸入至 DesignScript,以及透過 Python 或 C# 存取功能強大的工具和資源庫。如果有效管理,結合這些策略可為整體程式增添極大的自訂成份、透明度和效率。以下是一組準則,協助您利用文字指令碼擴充您的視覺指令碼。
與視覺程式設計相比,文字指令碼更能建立較高複雜性的關係,但兩者的功能也明顯重疊。這是合理的,因為節點是預先封裝的程式碼,而我們或許可以將整個 Dynamo 程式寫入 DesignScript 或 Python。但是,由於節點介面和線路建立直覺的圖形資訊流程,因此我們仍然使用視覺指令碼。瞭解文字指令碼比視覺指令碼優異的地方,可以幫助您瞭解應何時使用它,而又同時保留節點和線路的直覺本質。以下是有關何時撰寫指令碼和使用哪種語言的準則。
在以下情況使用文字指令碼:
迴圈
遞迴
存取外部資源庫
選擇語言:
迴圈
遞迴
濃縮節點
外部資源庫
速寫
DesignScript
是
是
是
否
是
Python
是
是
局部
是
否
ZeroTouch (C#)
否
否
否
是
否
請參閱指令碼撰寫參考以瞭解每個 Dynamo 資源庫可讓您存取的功能清單。
當使用 Dynamo 撰寫指令碼時,在這個必然參數式的環境中適宜組織您的程式碼,使其與它將處於的節點和線路的架構相對。請將包含您文字指令碼的節點當做為程式中的任何其他節點,它有一些特定輸入、函數和預期的輸出。這讓節點內部的程式碼獲得一小組可讓您工作的變數,從而獲得一個清晰的參數式系統。以下是如何將程式碼更充分整合到視覺程式中的一些指導方針。
識別外部變數:
嘗試決定在您的設計問題中的給定參數,以便您可以直接使用該資料建置模型。
撰寫程式碼之前,請先識別變數:
最小組輸入
預期的輸出
常數
撰寫程式碼之前已建立多個變數。
我們將模擬降雨的曲面。
我們所需的雨滴 (代理程式) 數量。
我們希望的降雨路程。
在沿著最陡峭的路徑下降與穿過曲面之間切換。
Python 節點與其輸入數量。
讓傳回的曲線變為藍色的 Code Block。
設計內部關係:
參數化允許對某些參數或變數進行編輯,以操控或變更方程式或系統的最終結果。
只要指令碼中的實體都是邏輯性相關,請嘗試將它們定義為對方的函數。如果使用此方法,當其中一個實體被修改,另一個就可以按比例更新。
只顯示關鍵參數來最小化輸入的數量:
如果一組參數可從多個父系參數推導而來,就只顯示父系參數為指令碼輸入。這會降低指令碼介面的複雜性,進而提高可用性。
來自 Python 節點中範例的程式碼「模組」。
輸入。
指令碼內部的變數。
使用這些輸入和變數執行其函數的迴圈。
秘訣:強調程序,如同您強調解決方案一樣。
當您在指令碼中使用多種方式表達同一件事,重複的表現方法在某些時刻可能會不一致,因而發生維護變得麻煩、分解困難和內部矛盾的情況。
「DRY」原則是「系統中的每個知識都必須有單一、清晰和權威性的表現法」:
若成功應用此原則,指令碼中所有相關的元素都是可預測且一致地改變,所有不相關的元素彼此之間不會有邏輯性的後果。
秘訣:在指令碼中複製實體前 (例如上述範例中的常數),先檢查是否可以改為連結至來源。
當您的程式碼變得更長、「構想」變得更複雜,或總體演算法變得更難以辨認。追蹤特定作業的發生 (及在哪裡發生)、尋找錯誤、整合其他程式碼和指定開發工作時將會變得更因難。若要避免這些麻煩,應該將程式碼撰寫成模組型態,這是根據執行的工作來拆分程式碼的組織策略。以下是透過模組化方式讓您的指令碼更容易管理的一些秘訣。
將程式碼撰寫成模組型態:
「模組」是執行特定工作的一組程式碼,類似於工作區的 Dynamo 節點。
這可以是任何需要在視覺上從相鄰程式碼分離的內容 (函數、類別、一組輸入,或您要匯入的資源庫)。
以模組開發程式碼這一方法利用節點的視覺和直覺特性,以及只有文字指令碼可以辦到的複雜關係。
這些迴圈呼叫一個名為「代理程式」的類別,我們將在練習中開發。
定義每個代理程式起點的程式碼模組。
更新代理程式的程式碼模組。
為代理程式的路徑繪製一條軌跡的程式碼模組。
找出重複使用的程式碼:
如果您發現您的程式碼在不同的地方做同樣 (或非常類似) 的事情,應尋找方法把它叢集為可呼叫的函數。
「管理員」函數控制程式流程,主要包含對處理低階詳細資料 (例如在結構之間移動資料) 的「工作者」函數的呼叫。
此範例使用根據中心點的 Z 值所設定的半徑和顏色建立圓球。
兩個「工作者」父系函數:一個根據中心點的 Z 值以半徑建立圓球,一個根據中心點的 Z 值顯示顏色。
結合兩個工作者函數的「管理員」父系函數。呼叫此父系函數時將一同呼叫包含在其內的兩個函數。
只顯示需要顯示的東西:
模組介面表示模組提供與所需的元素。
定義好單位之間的介面時,每個單位的詳細設計可以分別繼續。
可分離性/可取代性:
模組並不知道彼此的存在。
模組化的一般形式:
群組程式碼:
函數:
類別:
在 Dynamo 開發文字指令碼時,應時常確定您實際建立的內容與您的預期相符。這確保在意外事件 (語法錯誤、邏輯差異、值錯誤、異常輸出等) 一出現就可以快速發現並處理,而非最後才一次處理。因為文字指令碼位於圖元區的節點內部,它們已經整合到視覺程式的資料流。這會讓指令碼的連續監視變得十分簡單:包括分配要輸出的資料、執行程式,以及使用 Watch 節點計算流出指令碼的內容。以下是在建構指令碼時不斷檢查它們的一些秘訣。
建構時同時進行測試:
每當您完成一堆功能時:
回頭檢查您的程式碼。
好好地審視它。協同合作者是否能瞭解此作業?我是否需要執行此作業?此函數是否可以更有效率地完成?我是否建立了不必要的複本或相依性?
進行快速測試,以確定它傳回「有意義」的資料。
指定指令碼中最近使用的資料為輸出,當指令碼更新時,節點永遠會輸出相關的資料:
檢查實體的所有邊以曲線方式傳回,以建立一個邊界框。
檢查已將計數輸入成功轉換為範圍。
確認此迴圈的座標系統已正確平移和旋轉。
預期「極端情形」:
撰寫指令碼時,將您的輸入參數設定為其指定範圍的最小值和最大值,以檢查程式在極端情形下是否仍能正常運作。
即使程式在極端情形下仍能正常運作,請檢查其是否正在傳回非預期的 null/空白/零值。
有時候,反映指令碼某些基本問題的錯誤只會在這些極端情形下出現。
瞭解錯誤的成因,然後決定是否需要進行內部的修正,或是需要重新定義某個參數範圍以避免此問題。
秘訣:永遠假定使用者將使用他/她會看到的每一個輸入值的每個組合。這樣有助於避免不必要的意外。
除錯是從指令碼中消除「錯誤」的過程。錯誤可能是誤差、低效率、不精確,或任何非預期的結果。解決錯誤可以是簡單地修正拼錯的變數名稱,或者是指令碼中更普遍的結構問題。在理想狀態下,建置指令碼時同時調整它可以幫助及早發現這些潛在問題,但這不能保證指令碼沒有錯誤。以下是對上述幾個最佳實踐的回顧,以協助您有系統地解決錯誤。
使用 Watch 標示圈:
將程式碼指定給 OUT 變數,檢查程式碼不同位置傳回的資料,類似於調整程式的概念。
撰寫有意義的註釋:
如果清楚說明了預期結果,程式碼的模組將會更容易除錯。
這通常會產生大量註解和空白行,但除錯時將事情分解成可管理的部分會很有用。
利用程式碼的模組性:
問題的根源可以追溯到某些模組。
一旦識別錯誤的模組,修正問題就會較為簡單。
如果必須修改程式,就可以更輕鬆地變更開發成為模組的程式碼:
您可以將新的或已除錯的模組插入既有的程式,確信程式的其餘部分不會改變。
在 Python 節點的範例檔案中除錯。
當指定 xDist 和 yDist 為 OUT 時,我們可以看到輸入幾何圖形會傳回一個大於自己的邊界框。
輸入幾何圖形的邊的曲線會傳回合適的邊界框和 xDist 和 yDist 的正確距離。
我們為解決 xDist 和 yDist 值的問題而插入的「模組」程式碼。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
請記住文字指令碼的最佳實踐,我們撰寫一個降雨模擬的指令碼。雖然我們可以在圖表策略中將最佳實踐套用至缺乏條理的視覺程式,但要將最佳實踐套用至文字指令碼則難得多。在文字指令碼中建立的邏輯關係不太明顯,並且幾乎無法在混亂的程式碼中解開。文字指令碼的強大功能意味著需要更多的組織。我們會檢視每個步驟並套用最佳實踐。
我們的指令碼已套用至牽引點變形的曲面。
我們首先需要匯入必要的 Dynamo 資源庫。首先執行此作業可取得 Python 中對 Dynamo 功能的整體存取。
我們需要將想使用的所有資源庫匯入此處。
接下來,我們需要定義指令碼的輸入和輸出,它將顯示為節點的輸入埠。這些外部輸入是指令碼的基礎,以及建立參數式環境的關鍵。
我們需要定義對應 Python 指令碼中變數的輸入,並決定所需的輸出:
我們想要沿著走的曲面。
我們想要走動的代理程式數目。
允許代理程式採取的最大步數。
以最短路徑漫遊或橫過曲面的選項。
Python 節點的輸入識別碼與腳本中的輸入對應 (IN[0], IN[1])。
輸出曲線可使用不同的顏色顯示。
現在,讓我們採用模組化的做法,並建立指令碼的本體。模擬從多個起點沿著曲面走最短路徑是一項很重要的工作,這需要多個函數。我們可以將程式碼收集成單一類別 (代理程式) 來將程式碼模組化,而不需要在整個指令碼中呼叫不同的函數。此類別的不同函數 (或稱「模組」) 可以使用不同的變數呼叫,或甚至可重複用於其他指令碼。
我們必須為代理程式定義一個類別 (或稱藍圖),讓它每走一步後都會選擇最陡的方向沿著曲面繼續前進:
名稱。
所有代理程式共用的全域屬性。
每個代理程式獨有的例證屬性。
行走一步的函數。
將每步位置編入軌跡清單的函數。
我們來定義代理程式的起點位置來加以初始化。這是一個很好的機會去調整指令碼,確保代理程式類別有作用。
我們需要將所有我們要觀察它沿著曲面走的代理程式實體化,並定義其初始屬性:
新的空白軌跡清單。
代理程式在曲面上開始路程的位置。
我們已指定代理程式清單為輸出,查看指令碼會傳回什麼。傳回的代理程式數目正確,但稍後我們需要再次調整指令碼,以確認傳回的幾何圖形。
在每一步更新每個代理程式。然後,我們需要為每個代理程式及每一步輸入巢狀迴路,並且在軌跡清單中更新和記錄位置。在每一步,我們也要確保代理程式始終能夠在曲面上保持行走以允許其下降。如果滿足該條件,我們就結束代理程式的路程。
現在我們的代理程式已完全更新,我們來傳回代表它們的幾何圖形。當所有代理程式都達到它們的下降限制或最大步數時,我們將建立一條穿過軌跡清單中各點的 polycurve,並輸出 polycurve 軌跡。
尋找最陡路徑的指令碼。
在基本曲面上模擬降雨的預置。
代理程式可切換為穿過基本曲面,而不是尋找最陡的路徑。
完整的 Python 文字指令碼。
使用視覺程式設計流程可能是一個功能強大的創意活動,但很快,程式流和關鍵使用者輸入就可被工作區的複雜度和/或配置遮蔽。讓我們先檢閱一些有關管理程式的最佳實務。
當我們在工作區新增更多節點時,我們可能要重新組織節點的配置以使其更加清楚明瞭。透過選取多個節點,然後對工作區按一下右鍵,會顯示快顯視窗,其中包括 「對齊選項」 功能表,以及在 X 和 Y 方向的對正和分配選項。
選取多個節點
對工作區按一下右鍵。
使用 「對齊選項」 選項
具有一些經驗後,我們可以透過檢閱節點名稱並遵循程序流來「讀取」視覺程式。對經驗不一的使用者而言,放入純語言標籤和描述也是很好的做法。Dynamo 有 「註釋」 節點,該節點提供一個可編輯文字欄位來進行註釋。我們可以用兩種方式在工作區新增註釋:
瀏覽至「編輯」功能表 >「建立註釋」
使用鍵盤快速鍵 Ctrl + W
將註釋新增至工作區時,會蹦現一個文字欄位可讓我們編輯註釋中的文字。建立之後,我們可以按兩下「註釋」節點或按一下右鍵來編輯註釋。
當我們的視覺程式變得很大時,識別要執行的較重要步驟會很有幫助。我們可以將比較大的一組節點亮顯成一個群組,使用背景為彩色的一個矩形和一個標題加以標示。有三種方式可以選取多個節點來形成群組:
瀏覽至「編輯」功能表 >「建立群組」
使用鍵盤快速鍵 Ctrl + G
在「工作區」上按一下右鍵並選取「建立群組 」
建立群組後,我們可以編輯其設定,例如標題和顏色。
秘訣:使用註釋和群組是標註檔案並提高可讀性的有效方法。
以下是加入「註釋」和「群組」的程式範例:
註釋:「格線參數」
註釋:「格線點」
群組:「建立點格線」
群組:「建立牽引點」
註釋:「校正距離值」
註釋:「可變的圓格線」
此參考頁面延伸〈指令碼撰寫策略〉中涵蓋的最佳實踐,提供更多有關程式碼資源庫、標示和型式設定的詳細資料。我們將使用 Python 來說明以下的概念,但相同的原則適用於 Python 和 C# (Zerotouch) (但不同的語法)。
標準資源庫位於 Dynamo 外部,存在於 Python 和 C# (Zerotouch) 等程式設計語言。Dynamo 還具有自己的一組資源庫,直接對應其節點架構,可讓使用者在程式碼中建置任何利用節點和線路來建置的內容。以下指南包含每個 Dynamo 資源庫允許存取的內容以及何時使用標準的資源庫。
標準資源庫和 Dynamo 資源庫
Python 和 C# 的標準資源庫可用於在 Dynamo 環境中建置進階資料和流動結構。
Dynamo 資源庫直接對應用於建立幾何圖形和其他 Dynamo 物件的節點架構。
Dynamo 資源庫
ProtoGeometry*
功能:弧、邊界框、圓形、圓錐體、座標系統、立方體、曲線、圓柱邊、邊緣、橢圓、橢圓弧、面、幾何圖形、螺旋線、索引群組、線、網格、Nurbs 曲線、Nurbs 曲面、平面、點、多邊形、矩形、實體、圓球、曲面、拓樸、T 雲形線、UV、向量、頂點。
如何匯入:import Autodesk.DesignScript.Geometry
``
DSCoreNodes
功能:顏色、顏色範圍 2D、日期時間、時間跨距、IO、公式、邏輯、清單、數學、四元樹狀目錄、字串、螺紋。
如何匯入:import DSCore
鑲嵌
功能:凸面關聯線,Delaunay、Voronoi。
如何匯入:import Tessellation
DSOffice
功能:Excel。
如何匯入:import DSOffice
*注意:透過 Python 或 C# 使用 ProtoGeometry 時,您建立的是不受管理的物件,而這需要手動管理記憶體 - 請參閱以下一節:不受管理的物件,以取得更多資訊。
撰寫指令碼時,我們持續使用識別碼來表示變數、類型、函數和其他圖元等。透過此系統的符號表現法,在建築演算法時我們可以方便地使用標示的方式參考資訊,而標示通常由一系列的字元組成。有效地進行命名至關重要,可讓其他人及將來的自己輕鬆閱讀並瞭解所撰寫的程式碼!以下是在指令碼中進行命名時需謹記的一些秘訣:
可以使用縮寫,但請加入註釋以解釋縮寫:
避免多餘的標示:
變數名稱使用正邏輯而不是負邏輯:
偏好「反轉標記法」:
在結構而言比較合理。
別名應用在縮短太長且經常重複的鏈:
使用別名可能很快會產生非常混亂且不標準的程式。
只使用必要的文字:
「所有事物都應該盡可能簡單,但不要太過於簡單。」– 愛因斯坦 (Albert Einstein)
一般來說,程式設計有多種方法,因此您的「個人型式」的指令碼是無數個您選擇作出 (或不作出) 的小決定的結果。而您的程式碼的可讀性和可維護性碼是其內部一致性以及其遵循一般風格慣例的直接結果。基本原則是,在兩個位置看起來相同的程式碼亦應該擁有相同的工作方式。以下是撰寫清楚一致的程式碼的一些秘訣。
命名慣例:(為程式碼的每種實體選擇以下其中一種慣例,而且不要更改!)
變數、函數、方法、套件、模組:
lower_case_with_underscores
類別和例外情況:
CapWords
受保護的方法和內部函數:
_single_leading_underscore(self, ...)
私用方法:
__double_leading_underscore(self, ...)
常數:
ALL_CAPS_WITH_UNDERSCORES
秘訣:除非是非常短的區塊,可直接從上下文清楚看出涵義,否則請避免使用一個字母的變數 (例如 l、O、I)。
使用空白行:
用兩個空白行包圍頂層函數與類別定義。
類別中的方式定義被一個空白行包圍。
可以 (斟酌) 使用額外的空白行,來分隔有相關函數的群組。
在下列位置避免出現多餘的空格:
在括弧、方括弧或大括弧內:
在逗號、分號或冒號前:
在開始函數呼叫的引數清單之左括弧前:
在開始索引或切割之左括弧前:
務必在這些二進位運算子的兩側加入一個空格:
Watch 一行長度:
別擔心,有 ~ 79 個字元。
限制所需編輯器視窗寬度可以同時開啟多個檔案,並且適合使用在相鄰的欄顯示兩個版本的程式碼檢閱工具。
長的程式碼行可以使用括弧讓表示式換行而斷開成多行:
避免明顯和多餘的註釋:
有時更少的註釋使程式碼更容易閱讀,尤其是如果它強制您改用有意義的符號名稱。
採用好的程式碼習慣可減少依賴註釋:
秘訣:註釋告知您「為什麼」,程式碼告知您「如何」。
出庫使用開放原始碼:
開放原始碼專案由大量開發人員協同合作建置。這些專案需要保持高度的程式碼可讀性,以便團隊可以盡可能地有效工作。因此,最好瀏覽這些專案的原始程式碼,以觀察這些開發人員的工作。
改善慣例:
詢問自己,每個慣例是否能回應目前工作的需求。
功能/效率有否受到影響?
請造訪這些 Wiki 頁面,以取得有關為 Zerotouch 寫入 C# 及貢獻 Dynamo 的指導:
不受管理的物件:
您只需要處置不傳入圖表或儲存參考的不受管理的資源。在本節其餘部分,我們會將這些物件稱為 中間幾何圖形。您可以在以下的程式碼範例中查看有關此類別物件的範例。此 zero touch C# 函數 singleCube 會傳回一個立方塊,但在執行期間會額外建立 10000 個立方塊。我們可以假設這額外的幾何圖形是用作一些中間建構幾何圖形。
此 zero touch 功能很有可能會讓 Dynamo 當機。 雖然我們建立了 10000 個實體,但只儲存其中一個並傳回這一個。我們應該改為處置所有中間立方塊,除了我們傳回的那一個。我們不希望處置我們傳回的內容,因為它將擴展至圖表和被其他節點使用。
固定的程式碼的外觀將如下所示:
通常,您只需要處置幾何圖形 (例如 Surfaces
、Curves
和 Solids
)。為了安全起見,您可以處置所有幾何圖形類型 (Vectors
、Points
、CoordinateSystems
)。
此 Wiki 包含一些記錄和測試程式碼的一般程式碼撰寫標準:
此 Wiki 特別包含資源庫、品類、節點名稱、埠名稱和縮寫的命名標準:
從 Python 或 C# 使用 Dynamo 的幾何圖形資源庫 (ProtoGeometry) 時,您建立的幾何圖形物件不會受虛擬機器管理,而且許多物件的記憶體都需要手動進行清理。若要清理原生或不受管理的物件,您可以使用 Dispose 方法或 using 關鍵字。請參閱此 Wiki 項目的概述:。