使用視覺程式設計流程可能是一個功能強大的創意活動,但很快,程式流和關鍵使用者輸入就可被工作區的複雜度和/或配置遮蔽。讓我們先檢閱一些有關管理程式的最佳實務。
當我們在工作區新增更多節點時,我們可能要重新組織節點的配置以使其更加清楚明瞭。透過選取多個節點,然後對工作區按一下右鍵,會顯示快顯視窗,其中包括 「對齊選項」 功能表,以及在 X 和 Y 方向的對正和分配選項。
選取多個節點
對工作區按一下右鍵。
使用 「對齊選項」 選項
具有一些經驗後,我們可以透過檢閱節點名稱並遵循程序流來「讀取」視覺程式。對經驗不一的使用者而言,放入純語言標籤和描述也是很好的做法。Dynamo 有 「註釋」 節點,該節點提供一個可編輯文字欄位來進行註釋。我們可以用兩種方式在工作區新增註釋:
瀏覽至「編輯」功能表 >「建立註釋」
使用鍵盤快速鍵 Ctrl + W
將註釋新增至工作區時,會蹦現一個文字欄位可讓我們編輯註釋中的文字。建立之後,我們可以按兩下「註釋」節點或按一下右鍵來編輯註釋。
當我們的視覺程式變得很大時,識別要執行的較重要步驟會很有幫助。我們可以將比較大的一組節點亮顯成一個群組,使用背景為彩色的一個矩形和一個標題加以標示。有三種方式可以選取多個節點來形成群組:
瀏覽至「編輯」功能表 >「建立群組」
使用鍵盤快速鍵 Ctrl + G
在「工作區」上按一下右鍵並選取「建立群組 」
建立群組後,我們可以編輯其設定,例如標題和顏色。
秘訣:使用註釋和群組是標註檔案並提高可讀性的有效方法。
以下是加入「註釋」和「群組」的程式範例:
註釋:「格線參數」
註釋:「格線點」
群組:「建立點格線」
群組:「建立牽引點」
註釋:「校正距離值」
註釋:「可變的圓格線」
在此章節之前,本手冊已涵蓋如何實施 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 節點
輸入滑棒
打開/關閉開關
一切就緒,我們來簡化圖表。
使用「將節點轉換為程式碼」和「自訂節點」濃縮程式,已經大幅減少圖表的大小。建立屋頂曲面和牆的群組已轉換為程式碼,因為它們特定於此程式。點轉換群組包含在自訂節點中,並且可以用於其他程式。在範例檔案中,從轉換點群組建立您的自訂節點。
包含「轉換點網格」群組的自訂節點
使用「將節點轉換為程式碼」壓縮「建立建築屋頂曲面和帷幕牆」群組
最後一步是建立典型屋頂形狀的預置。
這些輸入是屋頂形狀的主要驅動因素,將協助使用者發現程式的潛能。
我們的程式有兩個預置視圖。
屋頂排水模式提供使用者以解析分式檢視各個預置。
手冊的此部分是以「最佳實踐」日誌的理念組織的。它揭示了我們透過經驗和研究所得的多種策略,最有利於品質參數式工作流程。作為設計師與程式設計師,我們的品質指標主要包括我們工具的可維護性、可靠性、可用性和效率。雖然這些最佳實踐有視覺或文字指令碼撰寫的特定範例,但是原則適用於所有程式設計環境,並可以提供許多計算工作流程。
此參考頁面延伸〈指令碼撰寫策略〉中涵蓋的最佳實踐,提供更多有關程式碼資源庫、標示和型式設定的詳細資料。我們將使用 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
)。
使用 DesignScript、Python 和 ZeroTouch (C#) 在視覺指令碼撰寫環境中進行文字指令碼撰寫,可建立功能強大的視覺關係。使用者可以在相同的工作區內執行以下所有作業:顯示如輸入滑棒等的元素、將大型作業壓縮並輸入至 DesignScript,以及透過 Python 或 C# 存取功能強大的工具和資源庫。如果有效管理,結合這些策略可為整體程式增添極大的自訂成份、透明度和效率。以下是一組準則,協助您利用文字指令碼擴充您的視覺指令碼。
與視覺程式設計相比,文字指令碼更能建立較高複雜性的關係,但兩者的功能也明顯重疊。這是合理的,因為節點是預先封裝的程式碼,而我們或許可以將整個 Dynamo 程式寫入 DesignScript 或 Python。但是,由於節點介面和線路建立直覺的圖形資訊流程,因此我們仍然使用視覺指令碼。瞭解文字指令碼比視覺指令碼優異的地方,可以幫助您瞭解應何時使用它,而又同時保留節點和線路的直覺本質。以下是有關何時撰寫指令碼和使用哪種語言的準則。
在以下情況使用文字指令碼:
迴圈
遞迴
存取外部資源庫
選擇語言:
當使用 Dynamo 撰寫指令碼時,在這個必然參數式的環境中適宜組織您的程式碼,使其與它將處於的節點和線路的架構相對。請將包含您文字指令碼的節點當做為程式中的任何其他節點,它有一些特定輸入、函數和預期的輸出。這讓節點內部的程式碼獲得一小組可讓您工作的變數,從而獲得一個清晰的參數式系統。以下是如何將程式碼更充分整合到視覺程式中的一些指導方針。
識別外部變數:
嘗試決定在您的設計問題中的給定參數,以便您可以直接使用該資料建置模型。
撰寫程式碼之前,請先識別變數:
最小組輸入
預期的輸出
常數
撰寫程式碼之前已建立多個變數。
我們將模擬降雨的曲面。
我們所需的雨滴 (代理程式) 數量。
我們希望的降雨路程。
在沿著最陡峭的路徑下降與穿過曲面之間切換。
Python 節點與其輸入數量。
讓傳回的曲線變為藍色的 Code Block。
設計內部關係:
參數化允許對某些參數或變數進行編輯,以操控或變更方程式或系統的最終結果。
只要指令碼中的實體都是邏輯性相關,請嘗試將它們定義為對方的函數。如果使用此方法,當其中一個實體被修改,另一個就可以按比例更新。
只顯示關鍵參數來最小化輸入的數量:
如果一組參數可從多個父系參數推導而來,就只顯示父系參數為指令碼輸入。這會降低指令碼介面的複雜性,進而提高可用性。
輸入。
指令碼內部的變數。
使用這些輸入和變數執行其函數的迴圈。
秘訣:強調程序,如同您強調解決方案一樣。
當您在指令碼中使用多種方式表達同一件事,重複的表現方法在某些時刻可能會不一致,因而發生維護變得麻煩、分解困難和內部矛盾的情況。
「DRY」原則是「系統中的每個知識都必須有單一、清晰和權威性的表現法」:
若成功應用此原則,指令碼中所有相關的元素都是可預測且一致地改變,所有不相關的元素彼此之間不會有邏輯性的後果。
秘訣:在指令碼中複製實體前 (例如上述範例中的常數),先檢查是否可以改為連結至來源。
當您的程式碼變得更長、「構想」變得更複雜,或總體演算法變得更難以辨認。追蹤特定作業的發生 (及在哪裡發生)、尋找錯誤、整合其他程式碼和指定開發工作時將會變得更因難。若要避免這些麻煩,應該將程式碼撰寫成模組型態,這是根據執行的工作來拆分程式碼的組織策略。以下是透過模組化方式讓您的指令碼更容易管理的一些秘訣。
將程式碼撰寫成模組型態:
「模組」是執行特定工作的一組程式碼,類似於工作區的 Dynamo 節點。
這可以是任何需要在視覺上從相鄰程式碼分離的內容 (函數、類別、一組輸入,或您要匯入的資源庫)。
以模組開發程式碼這一方法利用節點的視覺和直覺特性,以及只有文字指令碼可以辦到的複雜關係。
這些迴圈呼叫一個名為「代理程式」的類別,我們將在練習中開發。
定義每個代理程式起點的程式碼模組。
更新代理程式的程式碼模組。
為代理程式的路徑繪製一條軌跡的程式碼模組。
找出重複使用的程式碼:
如果您發現您的程式碼在不同的地方做同樣 (或非常類似) 的事情,應尋找方法把它叢集為可呼叫的函數。
「管理員」函數控制程式流程,主要包含對處理低階詳細資料 (例如在結構之間移動資料) 的「工作者」函數的呼叫。
此範例使用根據中心點的 Z 值所設定的半徑和顏色建立圓球。
兩個「工作者」父系函數:一個根據中心點的 Z 值以半徑建立圓球,一個根據中心點的 Z 值顯示顏色。
結合兩個工作者函數的「管理員」父系函數。呼叫此父系函數時將一同呼叫包含在其內的兩個函數。
只顯示需要顯示的東西:
模組介面表示模組提供與所需的元素。
定義好單位之間的介面時,每個單位的詳細設計可以分別繼續。
可分離性/可取代性:
模組並不知道彼此的存在。
模組化的一般形式:
群組程式碼:
函數:
類別:
在 Dynamo 開發文字指令碼時,應時常確定您實際建立的內容與您的預期相符。這確保在意外事件 (語法錯誤、邏輯差異、值錯誤、異常輸出等) 一出現就可以快速發現並處理,而非最後才一次處理。因為文字指令碼位於圖元區的節點內部,它們已經整合到視覺程式的資料流。這會讓指令碼的連續監視變得十分簡單:包括分配要輸出的資料、執行程式,以及使用 Watch 節點計算流出指令碼的內容。以下是在建構指令碼時不斷檢查它們的一些秘訣。
建構時同時進行測試:
每當您完成一堆功能時:
回頭檢查您的程式碼。
好好地審視它。協同合作者是否能瞭解此作業?我是否需要執行此作業?此函數是否可以更有效率地完成?我是否建立了不必要的複本或相依性?
進行快速測試,以確定它傳回「有意義」的資料。
指定指令碼中最近使用的資料為輸出,當指令碼更新時,節點永遠會輸出相關的資料:
檢查實體的所有邊以曲線方式傳回,以建立一個邊界框。
檢查已將計數輸入成功轉換為範圍。
確認此迴圈的座標系統已正確平移和旋轉。
預期「極端情形」:
撰寫指令碼時,將您的輸入參數設定為其指定範圍的最小值和最大值,以檢查程式在極端情形下是否仍能正常運作。
即使程式在極端情形下仍能正常運作,請檢查其是否正在傳回非預期的 null/空白/零值。
有時候,反映指令碼某些基本問題的錯誤只會在這些極端情形下出現。
瞭解錯誤的成因,然後決定是否需要進行內部的修正,或是需要重新定義某個參數範圍以避免此問題。
秘訣:永遠假定使用者將使用他/她會看到的每一個輸入值的每個組合。這樣有助於避免不必要的意外。
除錯是從指令碼中消除「錯誤」的過程。錯誤可能是誤差、低效率、不精確,或任何非預期的結果。解決錯誤可以是簡單地修正拼錯的變數名稱,或者是指令碼中更普遍的結構問題。在理想狀態下,建置指令碼時同時調整它可以幫助及早發現這些潛在問題,但這不能保證指令碼沒有錯誤。以下是對上述幾個最佳實踐的回顧,以協助您有系統地解決錯誤。
使用 Watch 標示圈:
將程式碼指定給 OUT 變數,檢查程式碼不同位置傳回的資料,類似於調整程式的概念。
撰寫有意義的註釋:
如果清楚說明了預期結果,程式碼的模組將會更容易除錯。
這通常會產生大量註解和空白行,但除錯時將事情分解成可管理的部分會很有用。
利用程式碼的模組性:
問題的根源可以追溯到某些模組。
一旦識別錯誤的模組,修正問題就會較為簡單。
如果必須修改程式,就可以更輕鬆地變更開發成為模組的程式碼:
您可以將新的或已除錯的模組插入既有的程式,確信程式的其餘部分不會改變。
當指定 xDist 和 yDist 為 OUT 時,我們可以看到輸入幾何圖形會傳回一個大於自己的邊界框。
輸入幾何圖形的邊的曲線會傳回合適的邊界框和 xDist 和 yDist 的正確距離。
我們為解決 xDist 和 yDist 值的問題而插入的「模組」程式碼。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
請記住文字指令碼的最佳實踐,我們撰寫一個降雨模擬的指令碼。雖然我們可以在圖表策略中將最佳實踐套用至缺乏條理的視覺程式,但要將最佳實踐套用至文字指令碼則難得多。在文字指令碼中建立的邏輯關係不太明顯,並且幾乎無法在混亂的程式碼中解開。文字指令碼的強大功能意味著需要更多的組織。我們會檢視每個步驟並套用最佳實踐。
我們的指令碼已套用至牽引點變形的曲面。
我們首先需要匯入必要的 Dynamo 資源庫。首先執行此作業可取得 Python 中對 Dynamo 功能的整體存取。
我們需要將想使用的所有資源庫匯入此處。
接下來,我們需要定義指令碼的輸入和輸出,它將顯示為節點的輸入埠。這些外部輸入是指令碼的基礎,以及建立參數式環境的關鍵。
我們需要定義對應 Python 指令碼中變數的輸入,並決定所需的輸出:
我們想要沿著走的曲面。
我們想要走動的代理程式數目。
允許代理程式採取的最大步數。
以最短路徑漫遊或橫過曲面的選項。
Python 節點的輸入識別碼與腳本中的輸入對應 (IN[0], IN[1])。
輸出曲線可使用不同的顏色顯示。
現在,讓我們採用模組化的做法,並建立指令碼的本體。模擬從多個起點沿著曲面走最短路徑是一項很重要的工作,這需要多個函數。我們可以將程式碼收集成單一類別 (代理程式) 來將程式碼模組化,而不需要在整個指令碼中呼叫不同的函數。此類別的不同函數 (或稱「模組」) 可以使用不同的變數呼叫,或甚至可重複用於其他指令碼。
我們必須為代理程式定義一個類別 (或稱藍圖),讓它每走一步後都會選擇最陡的方向沿著曲面繼續前進:
名稱。
所有代理程式共用的全域屬性。
每個代理程式獨有的例證屬性。
行走一步的函數。
將每步位置編入軌跡清單的函數。
我們來定義代理程式的起點位置來加以初始化。這是一個很好的機會去調整指令碼,確保代理程式類別有作用。
我們需要將所有我們要觀察它沿著曲面走的代理程式實體化,並定義其初始屬性:
新的空白軌跡清單。
代理程式在曲面上開始路程的位置。
我們已指定代理程式清單為輸出,查看指令碼會傳回什麼。傳回的代理程式數目正確,但稍後我們需要再次調整指令碼,以確認傳回的幾何圖形。
在每一步更新每個代理程式。然後,我們需要為每個代理程式及每一步輸入巢狀迴路,並且在軌跡清單中更新和記錄位置。在每一步,我們也要確保代理程式始終能夠在曲面上保持行走以允許其下降。如果滿足該條件,我們就結束代理程式的路程。
現在我們的代理程式已完全更新,我們來傳回代表它們的幾何圖形。當所有代理程式都達到它們的下降限制或最大步數時,我們將建立一條穿過軌跡清單中各點的 polycurve,並輸出 polycurve 軌跡。
尋找最陡路徑的指令碼。
在基本曲面上模擬降雨的預置。
代理程式可切換為穿過基本曲面,而不是尋找最陡的路徑。
完整的 Python 文字指令碼。
此 Wiki 包含一些記錄和測試程式碼的一般程式碼撰寫標準:
此 Wiki 特別包含資源庫、品類、節點名稱、埠名稱和縮寫的命名標準:
從 Python 或 C# 使用 Dynamo 的幾何圖形資源庫 (ProtoGeometry) 時,您建立的幾何圖形物件不會受虛擬機器管理,而且許多物件的記憶體都需要手動進行清理。若要清理原生或不受管理的物件,您可以使用 Dispose 方法或 using 關鍵字。請參閱此 Wiki 項目的概述:。
請參閱以瞭解每個 Dynamo 資源庫可讓您存取的功能清單。
來自 中範例的程式碼「模組」。
在 的範例檔案中除錯。
迴圈 | 遞迴 | 濃縮節點 | 外部資源庫 | 速寫 |
DesignScript | 是 | 是 | 是 | 否 | 是 |
Python | 是 | 是 | 局部 | 是 | 否 |
ZeroTouch (C#) | 否 | 否 | 否 | 是 | 否 |