Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
無論經驗程度為何,Dynamo 平台專為所有使用者成為貢獻者而設計。針對不同的能力和技能程度有幾種開發選項,每種能力和技能程度的優缺點視目標而定。下面我們將概述不同的選項,以及如何選擇。
三種開發環境:Visual Studio、Python 編輯器和 Code Block DesignScript
Dynamo 的開發選項主要分為兩個類別:為 Dynamo,以及 在 Dynamo。這兩個類別可視為:「在」Dynamo 表示使用 Dynamo IDE 建立要在 Dynamo 中使用的內容;「為」Dynamo 表示使用外部工具建立要匯入 Dynamo 中進行使用的內容。雖然本指南著重在 為 Dynamo 的開發,但下面會描述所有程序的資源。
這些節點允許最高程度的自訂。許多套件都使用此方法建置,因此要對 Dynamo 的原始碼做出貢獻也需要此方法。本指南將涵蓋建置這些節點的程序。
Zero-Touch 節點
NodeModel 衍生的節點
延伸
Primer 在匯入 Zero-Touch 資源庫提供了指南。
下面的討論使用 Visual Studio 當作 Zero-Touch 和 NodeModel 節點的開發環境。
Visual Studio 介面,以及我們將開發的專案
雖然這些程序都在視覺程式設計工作區中,相對而言也簡單易懂,但它們都是自訂 Dynamo 的可行選項。Primer 廣泛涵蓋這些內容,並在指令碼撰寫策略一章中提供撰寫指令碼的秘訣和最佳實踐。
Code Block 可在視覺程式設計環境中顯示 DesignScript,提供靈活的文字腳本和節點工作流程。Code Block 中的函數可被工作區中的任何內容呼叫。
下載 Code Block 範例 (按一下右鍵後另存),或在 Primer 中查看詳細的逐步解說。
「自訂節點」是節點集合 (甚至整個圖表) 的容器。是收集常用常式並與社群分享的有效方式。
下載自訂節點範例 (按一下右鍵後另存),或在 Primer 中查看詳細的逐步解說。
「Python 節點」是視覺程式設計工作區中的腳本撰寫介面,與 Code Block 類似。Autodesk.DesignScript 資源庫使用與 DesignScript 類似的點標記法。
下載 Python 節點範例 (按一下右鍵後另存),或在 Primer 中查看詳細的逐步解說。
在 Dynamo 工作區中開發是一個能立即得到回饋的強大工具。
在 Dynamo 工作區中使用 Python 節點開發
Dynamo 的開發選項已設計為可解決自訂需求的複雜性。無論目標是以 Python 撰寫遞迴指令碼,還是建置一個完全自訂的節點使用者介面,都有一些選項可實作只包含啟動和執行所需的程式碼。
Dynamo 中的 Code Block、Python 節點和自訂節點
這些是在 Dynamo 視覺程式設計環境中撰寫程式碼的簡單選項。Dynamo 視覺程式設計工作區可讓您存取 Python、DesignScript,並且能在自訂節點內包含多個節點。
使用這些方法,我們可以:
開始撰寫 Python 或 DesignScript,幾乎不用進行設定。
將 Python 資源庫匯入 Dynamo。
將 Code Block、Python 節點和自訂節點做為套件的一部分與 Dynamo 社群分享。
Zero-Touch 節點
「Zero-Touch」是指匯入 C# 資源庫所使用的一個簡易點選方法。Dynamo 將讀取 .dll
檔案的公開方法,並將其轉換為 Dynamo 節點。您可以使用 Zero-Touch 開發自己的自訂節點與套件
使用此方法,我們可以:
匯入不一定是針對 Dynamo 開發的資源庫,並自動建立一組新節點,例如 Primer 中的 A-Forge 範例
撰寫 C# 方法,並輕鬆使用這些方法做為 Dynamo 中的節點
將 C# 資源庫以節點方式透過套件與 Dynamo 社群分享
NodeModel 衍生的節點
這些節點更深入 Dynamo 結構。它們以 NodeModel
類別為基礎,並以 C# 撰寫。雖然此方法提供最大的靈活性和功能,但節點的絕大多數層面必須明確定義,且函數必須位於單獨的組合中。
使用此方法,我們可以:
使用滑棒、影像、顏色等建立完全可自訂的節點使用者介面 (例如 ColorRange 節點)
存取並影響 Dynamo 圖元區中發生的結果
自訂交織
載入 Dynamo 中成為套件
由於 Dynamo 會定期更新,因此可能會變更套件所使用的 API 部分。追蹤這些變更非常重要,以確保既有套件能持續正常運作。
Dynamo Github Wiki 會追蹤 API 變更。這包括對 DynamoCore、資源庫和工作區的變更。
一個即將實施的重大變更範例是,在 2.0 版中從 XML 檔案格式轉換為 JSON 檔案格式。NodeModel 衍生的節點現在需要 JSON 建構函式,否則無法在 Dynamo 2.0 中開啟。
Dynamo 的 API 文件目前涵蓋核心功能:http://dynamods.github.io/DynamoAPI
請注意要上傳到 Package Manager 的套件中是否包含 .dll。如果套件作者未建立 .dll,他們必須具有分享該 .dll 的權限。
如果套件包含二進位檔案,則必須在使用者下載包含二進位檔案的套件時加以提示。
在撰寫本文時,Dynamo 主要使用 WPF (Windows Presentation Foundation) 來呈現其 UI。WPF 是一個複雜而強大的 XAML/繫結型系統。由於 Dynamo 具有複雜的 UI,因此很容易發生 UI 當機、記憶體洩漏,或者以降低效能的方式將圖表執行與 UI 更新包裹在一起。
請參閱 Dynamo 效能考慮事項 Wiki 頁面,該頁面將協助您避免發生一些變更 Dynamo 程式碼的常見錯誤。
在 Visual Studio 專案啟動並執行時,我們將逐步瞭解如何建置一個自訂節點來建立一個矩形的儲存格網格。雖然我們可以使用幾個標準節點建立此節點,但它是一個實用的工具,可以輕鬆包含在 Zero-Touch 節點中。與網格線相反,儲存格可以繞其中心點調整比例、查詢其角落頂點,或建置到面中。
本範例將介紹建立 Zero-Touch 節點時要注意的一些功能和概念。建置自訂節點並加入 Dynamo 後,請務必檢閱「深入瞭解 Zero-Touch」頁面,以更深入地查看預設輸入值、傳回多個值、文件、物件、使用 Dynamo 幾何圖形類型,以及移轉。
若要開始建置網格節點,請建立新的 Visual Studio 類別資源庫專案。請參閱「入門」頁面,以取得如何設定專案的深入逐步解說。
選擇「
Class Library
」做為專案類型將專案命名為
CustomNodes
由於我們要建立幾何圖形,因此需要參考適當的 NuGet 套件。從 NuGet 套件管理員安裝 ZeroTouchLibrary 套件。using Autodesk.DesignScript.Geometry;
陳述式需要此套件。
瀏覽 ZeroTouchLibrary 套件
我們將在 Dynamo Studio 的目前建置 (1.3) 中使用此節點。選取與此相符的套件版本。
請注意,我們也已將類別檔案更名為
Grids.cs
接下來,我們需要建立 RectangularGrid 方法將位於的命名空間和類別。節點會根據方法名稱和類別名稱在 Dynamo 中命名。我們還不需要將此內容複製到 Visual Studio。
Autodesk.DesignScript.Geometry;
參考 ZeroTouchLibrary 套件中的 ProtoGeometry.dll。建立清單需要System.Collections.Generic
現在,我們可以加入繪製矩形的方法。類別檔案應如下所示,可複製到 Visual Studio。
如果專案看起來與此類似,請繼續並嘗試建置 .dll
。
選擇「建置」>「建置方案」
檢查專案的 bin
資料夾是否有 .dll
。如果建置成功,我們可以將 .dll
加入 Dynamo。
Dynamo 資源庫中的自訂 RectangularGrids 節點
圖元區上的自訂節點
將
.dll
加入 Dynamo 的「加入」按鈕
在以上範例中,我們建立了一個相當簡單的節點,此節點除了 RectangularGrids
方法外沒有定義太多其他內容。但是,我們也許需要建立輸入埠的工具提示,或為節點提供類似標準 Dynamo 節點的摘要。將這些功能加入自訂節點,可以讓使用者更輕鬆地使用這些節點,尤其是當使用者想要在資源庫中搜尋這些節點時。
預設輸入值
xCount 輸入的工具提示
RectangularGrid 節點需要某些基本功能。在以下程式碼中,我們加入了輸入埠和輸出埠的描述、摘要和預設輸入值。
對方法參數指定值來提供輸入預設值:RectangularGrid(int xCount = 10, int yCount = 10)
建立輸入和輸出的工具提示、搜尋關鍵字,以及 XML 文件前面有 ///
的摘要。
若要加入工具提示,專案目錄中需要一個 xml 檔案。透過啟用選項,Visual Studio 可以自動產生 .xml
。
在此啟用 XML 文件檔案並指定檔案路徑。這會產生 XML 檔案。
這樣就可以了!我們建立了一個有幾項標準功能的新節點。下一章〈Zero-Touch 基礎知識〉會更詳細介紹 Zero-Touch 節點開發及需要注意的問題。
在開始開發之前,為新專案建立堅實的基礎非常重要。Dynamo 開發人員社群中有幾個專案樣板非常適合開始,但瞭解如何從頭開始一個專案更有價值。從頭開始建立一個專案可以更深入地瞭解開發過程。
Visual Studio 是一個功能強大的 IDE,我們可在其中建立專案、新增參考、建置 .dlls
和除錯。建立新專案時,Visual Studio 也會建立一個「方案」,這是組織專案的結構。多個專案可以在單一方案中,也可以一起建置。若要建立 ZeroTouch 節點,我們需要啟動新的 Visual Studio 專案,然後在當中撰寫 C# 類別資源庫並建置 .dll
。
Visual Studio 中的「新增專案」視窗
首先開啟 Visual Studio 並建立新專案:「
File > New > Project
」選擇「
Class Library
」專案樣板為專案命名 (我們已將專案命名為 MyCustomNode)
設定專案的檔案路徑。在此範例中,我們讓它保留在預設位置
選取「
Ok
」
Visual Studio 會自動建立 C# 檔案並開啟。我們應為其指定適當的名稱、設定工作區,然後以此乘法方法更換預設程式碼。
從「
View
」開啟「方案總管」和「輸出」視窗。在右側的「方案總管」中,將
Class1.cs
檔案更名為SampleFunctions.cs
。為乘法函數加入上述程式碼。我們稍後會介紹 Dynamo 如何讀取您的 C# 類別。
「方案總管」:您可以從這裡存取專案中的所有內容。
「輸出」視窗:我們稍後需要此視窗,以查看建置是否成功。
下一步是建置專案,但在那之前,需要檢查一些設定。首先,請確定在「平台目標」選取了「Any CPU
」或「x64
」,且「專案屬性」中未勾選「Prefer 32-bit
」。
選取「
Project > "ProjectName" Properties
」開啟專案屬性選取「
Build
」頁面從下拉式功能表中選取「
Any CPU
」或「x64
」確保未勾選「
Prefer 32-bit
」
現在我們可以建置專案來建立 .dll
。若要執行,請從「Build
」功能表中選取「Build Solution
」,或使用捷徑 CTRL+SHIFT+B
。
選取「
Build > Build Solution
」您可以查看「輸出」視窗,判斷專案是否成功建置
如果專案已成功建置,則專案的 bin
資料夾中會有一個名為 MyCustomNode
的 .dll
。在此範例中,我們將專案的檔案路徑保留為 Visual Studio 的預設路徑:c:\users\username\documents\visual studio 2015\Projects
。我們來看看專案的檔案結構。
bin
資料夾包含從 Visual Studio 建置的.dll
。Visual Studio 專案檔。
類別檔案。
由於我們的方案組態已設定為「
Debug
」,因此將在bin\Debug
中建立.dll
。
現在我們可以開啟 Dynamo 並匯入 .dll
。使用「加入」功能,瀏覽至專案的 bin
位置,然後選取要開啟的 .dll
。
選取「加入」按鈕以匯入
.dll
瀏覽至專案位置。我們的專案位於 Visual Studio 的預設檔案路徑:
C:\Users\username\Documents\Visual Studio 2015\Projects\MyCustomNode
選取要匯入的
MyCustomNode.dll
按一下「
Open
」以載入.dll
如果在名為 MyCustomNode
的資源庫中建立了品類,則表示已成功匯入 .dll!但是,Dynamo 建立了兩個節點,而我們只想要一個節點。在下一節中,我們將說明發生這個狀況的原因,以及 Dynamo 如何讀取 .dll。
Dynamo 資源庫中的 MyCustomNode。「資源庫」品類由
.dll
名稱決定。圖元區上的 SampleFunctions.MultiplyByTwo。
Dynamo 載入 .dll 時,會將所有公用靜態方法顯示為節點。建構函式、方法和性質將分別轉換為「建立」、「動作」和「查詢」節點。在乘法範例中,MultiplyByTwo()
方法會變成 Dynamo 中的「動作」節點。這是因為節點已根據其方法和類別命名。
輸入根據方法的參數名稱命名為
inputNumber
。輸出預設命名為
double
,因為這是要傳回的資料類型。節點命名為
SampleFunctions.MultiplyByTwo
,因為這些是類別名稱和方法名稱。
在以上範例中,多建立一個 SampleFunctions
建立節點是因為我們未明確提供建構函式,因此自動建立了一個建構函式。我們可以在 SampleFunctions
類別中建立一個空的私用建構函式來避免發生這個情況。
Dynamo 已將我們的方法匯入為「建立」節點
乘法節點非常簡單,不需要參考 Dynamo。例如,如果我們要存取任何 Dynamo 功能來建立幾何圖形,則需要參考 Dynamo NuGet 套件。
ZeroTouchLibrary - 用於為 Dynamo 建置 zero touch 節點資源庫的套件,包含以下資源庫:DynamoUnits.dll、ProtoGeometry.dll
WpfUILibrary - 用於為 Dynamo 建置具有 WPF 自訂使用者介面之節點資源庫的套件,包含以下資源庫:DynamoCoreWpf.dll、CoreNodeModels.dll、CoreNodeModelWpf.dll
DynamoServices - 適用於 Dynamo 的 DynamoServices 資源庫
Core - Dynamo 的單位與系統測試基礎架構,包含以下資源庫:DSIronPython.dll、DynamoApplications.dll、DynamoCore.dll、DynamoInstallDetective.dll、DynamoUtilities.dll、ProtoCore.dll、VMDataBridge.dll
Tests - Dynamo 的單位與系統測試基礎架構,包含以下資源庫:DynamoCoreTests.dll、SystemTestServices.dll、TestServices.dll
DynamoCoreNodes - 用於為 Dynamo 建置核心節點的套件,包含以下資源庫:Analysis.dll、GeometryColor.dll、DSCoreNodes.dll
若要在 Visual Studio 專案中參考這些套件,請從上面連結的 NuGet 下載套件並手動參考 .dll,或使用 Visual Studio 中的 NuGet 套件管理員。首先,我們可以逐步瞭解如何在 Visual Studio 中使用 NuGet 安裝這些套件。
選取「
Tools > NuGet Package Manager > Manage NuGet Packages for Solution...
」開啟 NuGet 套件管理員
這是 NuGet 套件管理員。此視窗顯示已為專案安裝的套件,也可讓使用者瀏覽其他套件。如果發行了新版本的 DynamoServices 套件,則可從此處更新套件或回復至舊版。
選取「瀏覽」並搜尋 DynamoVisualProgramming 以顯示 Dynamo 套件。
Dynamo 套件。選取一個套件會顯示套件的目前版本和內容描述。
選取您需要的套件版本,然後按一下「安裝」。這會為您正在處理的特定專案安裝套件。由於我們使用的是 Dynamo 的最新穩定版本 1.3 版,因此請選擇對應的套件版本。
若要手動加入從瀏覽器下載的套件,請從「方案總管」開啟「參考管理員」,然後瀏覽套件。
以右鍵按一下「
References
」,然後選取「Add Reference
」。選取「
Browse
」以瀏覽至套件位置。
現在 Visual Studio 已正確設定,我們也已成功將 .dll
加入 Dynamo,因此,我們已經有堅實的基礎可以讓概念繼續發揮。這只是開始,請繼續跟進,進一步瞭解如何建立自訂節點。
瞭解如何建立 Zero-Touch 專案後,我們可以逐步瀏覽 Dynamo Github 上的 ZeroTouchEssentials 範例,更深入地瞭解建立節點的詳細資訊。
許多 Dynamo 的標準節點本質上是 Zero-Touch 節點,如上面大多數的 Math、Color 和 DateTime 節點。
若要開始,請從 https://github.com/DynamoDS/ZeroTouchEssentials 下載 ZeroTouchEssentials 專案
在 Visual Studio 中,開啟 ZeroTouchEssentials.sln
方案檔並建置方案。
ZeroTouchEssentials.cs
檔案包含我們要匯入至 Dynamo 的所有方法。
開啟 Dynamo 並匯入 ZeroTouchEssentials.dll
,以取得我們要在以下範例中參考的節點。
程式碼範例是從 ZeroTouchEssentials.cs 提取,通常與其相符。為了簡潔已移除 XML 文件,每個程式碼範例都會建立其上方影像中的節點。
Dynamo 支援定義節點上輸入埠的預設值。如果埠沒有連接,則會對節點提供這些預設值。預設值使用在《C# 程式設計手冊》中指定可選引數的 C# 機制表示。預設值以下列方式指定:
將方法參數設定為預設值:inputNumber = 2.0
將游標懸停在節點輸入埠上時,會出現預設值
傳回多個值比建立多個輸入要複雜一些,因此需要使用字典傳回。字典的項目會成為節點輸出端的埠。透過以下方式可以建立多個傳回埠:
加入 using System.Collections.Generic;
以使用 Dictionary<>
。
加入 using Autodesk.DesignScript.Runtime;
以使用 MultiReturn
屬性。這會參考 DynamoServices NuGet 套件中的「DynamoServices.dll」。
在方法中加入 [MultiReturn(new[] { "string1", "string2", ... more strings here })]
屬性。字串會參考字典中的鍵,並成為輸出埠名稱。
從函數傳回 Dictionary<>
,其中的鍵與屬性中的參數名稱相符:return new Dictionary<string, object>
請參閱 ZeroTouchEssentials.cs 中的此程式碼範例
傳回多個輸出的節點。
請注意,現在有兩個輸出埠,根據我們為字典的鍵輸入的字串進行命名。
最佳實踐是在 Dynamo 節點中加入文件,描述節點的功能、輸入、輸出、搜尋標籤等。這可以透過 XML 文件標籤完成。透過以下方式可以建立 XML 文件:
前面有三條斜線的任何註解文字都會視為文件
例如:/// Documentation text and XML goes here
三條斜線後,在 Dynamo 匯入 .dll 時將讀取的方法上方建立 XML 標籤
例如:/// <summary>...</summary>
在 Visual Studio 中選取「Project > [Project] Properties > Build > Output
」並勾選「Documentation file
」以啟用 XML 文件
Visual Studio 將在指定位置產生 XML 檔案
標籤類型如下:
/// <summary>...</summary>
是節點的主文件,會以工具提示的形式出現在左側搜尋列中的節點上
/// <param name="inputName">...</param>
將建立特定輸入參數的文件
/// <returns>...</returns>
將建立輸出參數的文件
/// <returns name = "outputName">...</returns>
將建立多個輸出參數的文件
/// <search>...</search>
將根據逗號分隔清單將您的節點與搜尋結果比對。例如,如果我們建立細分網格的節點,我們可能要加入標籤,例如「網格」、「細分」和「catmull-clark」。
以下是包含輸入和輸出描述的範例節點,以及將顯示在資源庫中的摘要。
請參閱 ZeroTouchEssentials.cs 中的此程式碼範例
請注意,此範例節點的程式碼包含:
節點摘要
輸入描述
輸出描述
節點描述簡短描述節點的功能和輸出。在 Dynamo 中,節點描述會出現在兩個位置:
在節點工具提示中
在文件瀏覽器中
請按照這些準則,在撰寫或更新節點描述時,可確保一致性並幫助節省時間。
概述
描述應該是一到兩句話。如果需要更多資訊,請將其放在文件瀏覽器的「深入資訊」下。
句子大小寫 (將句子的第一個單字和任何專有名詞大寫)。句尾不用句點。
語言應盡可清楚、簡單。在第一次提到首字母縮寫字時加以定義,除非連非專業使用者也知道這些縮寫字。
一律以清楚明瞭為優先考量,即使可能偏離這些準則亦同。
指南
以第三人稱動詞開始描述。
範例:判定 (Determines) 一個幾何圖形物件是否與另一個幾何圖形物件相交
不要以第二人稱動詞或任何名詞開頭。
範例:判定 (Determine) 一個幾何圖形物件是否與另一個幾何圖形物件相交
使用「傳回 (Returns)」、「建立 (Creates)」或其他描述性動詞代替「取得 (Gets)」。
範例:傳回 (Returns) 曲面的 Nurbs 表現法
不要使用「取得」(Get 或 Gets)。它不太具體,可能會有幾種不同的翻譯。
範例:取得 (Gets) 曲面的 Nurbs 表現法
提到輸入時,請使用「給定 (given)」或「輸入 (input)」,而不要使用「指定 (specified)」或其他任何詞彙。盡可能省略「給定 (given)」或「輸入 (input)」,以簡化描述並減少字數。
範例:刪除給定 (given) 的檔案
範例:將一條曲線沿著給定 (given) 的投影方向投影到給定 (given) 的基礎幾何圖形上
如果不是直接提到輸入,可以使用「指定 (specified)」。
範例:將文字內容寫入由給定路徑指定 (specified) 的檔案
提到輸入時,為了確保一致性,請不要使用「指定 (specified)」或除了「給定 (given)」或「輸入 (input)」以外的其他任何詞彙。不要在同一個描述中混合「給定 (given)」和「輸入 (input)」,除非為了清楚起見需要。
範例:刪除指定 (specified) 的檔案
範例:將一條輸入 (input) 曲線沿著給定 (given) 的投影方向投影到指定 (specified) 的基礎幾何圖形上
第一次提到輸入時,請使用「一個 (a 或 an)」。為清楚起見,請根據需要使用「給定 (the given)」或「輸入 (the input)」,而不是一個 (a 或 an)。
範例:沿著路徑曲線掃掠一條 (a) 曲線
第一次提到輸入時,不要使用「這 (this)」。
範例:沿著路徑曲線掃掠這條 (this) 曲線
第一次提到節點運算目標的輸出或其他名詞時,請使用「一個 (a 或 an)」。只有在與「輸入 (input)」或「給定 (given)」搭配使用時,才使用「這 (the)」。
範例:複製一個 (a) 檔案
範例:複製給定 (given) 的檔案
第一次提到節點運算目標的輸出或其他名詞時,請不要單獨使用「這個 (the)」。
範例:複製這個 (the) 檔案
將句子的第一個單字和任何專有名詞 (例如名稱和傳統上大寫的名詞) 大寫。
範例:傳回兩個邊界框 (BoundingBoxe) 的交點
除非為了清楚起見需要,否則請不要將常見的幾何圖形物件和概念大寫。
範例:繞著給定的平面 (Plane) 非等比例調整
將布林 (Boolean) 大寫。提到布林的輸出時,請將 True 和 False 大寫。
範例:如果兩個值不同,則傳回 True
範例:根據布林 (Boolean) 參數,將字串轉換為全部大寫或全部小寫的字元
不要將布林 (Boolean) 小寫。提到布林的輸出時,請不要將 True 和 False 小寫。
範例:如果兩個值不同,則傳回 true
範例:根據布林 (boolean) 參數,將字串轉換為全部大寫的字元或全部小寫的字元
節點的警告和錯誤會提醒使用者圖表有問題。通知使用者問題的方式,是在節點上方顯示圖示和展開的文字標示圈,來干擾正常的圖表運作。節點錯誤和警告的嚴重性可能有所不同:某些圖表還是能在有警告的情況下充分執行,但某些圖表卻可能無法獲得預期的結果。無論如何,節點的錯誤和警告都是重要的工具,可讓使用者隨時掌握圖表的問題。
如需在寫入或更新節點警告和錯誤訊息時確保一致性並協助節省時間的準則,請參閱內容模式:節點的警告與錯誤 Wiki 頁面。
Dynamo 沒有 new
關鍵字,因此需要使用靜態建構方法建構物件。透過以下方式可以建構物件:
除非另有要求,否則將建構函式設為內部的 internal ZeroTouchEssentials()
使用靜態方法建構物件,例如 public static ZeroTouchEssentials ByTwoDoubles(a, b)
注意事項:Dynamo 使用「By」字首指出靜態方法是建構函式,雖然這是選擇性的,但使用「By」可協助您的資源庫更符合既有的 Dynamo 型式。
請參閱 ZeroTouchEssentials.cs 中的此程式碼範例
匯入 ZeroTouchEssentials dll 後,資源庫中將會有 ZeroTouchEssentials 節點。使用 ByTwoDoubles
節點可以建立此物件。
Dynamo 資源庫可以使用原生 Dynamo 幾何圖形類型做為輸入,並建立新幾何圖形做為輸出。透過以下方式可以建立幾何圖形類型:
在專案中的 C# 檔案頂端包括 using Autodesk.DesignScript.Geometry;
參考「ProtoGeometry.dll」,並將 ZeroTouchLibrary NuGet 套件加入專案。
重要事項: 管理未從函數傳回的幾何圖形資源,請參閱下方的〈Dispose/using 陳述式〉一節。
注意事項:Dynamo 幾何圖形物件的使用方式與任何其他傳入函數的物件相同。
請參閱 ZeroTouchEssentials.cs 中的此程式碼範例
取得曲線長度後加倍的節點。
此節點接受曲線幾何圖形類型做為輸入。
除非您使用 Dynamo 2.5 版或更高版本,否則必須手動管理未從函數傳回的幾何圖形資源。在 Dynamo 2.5 和更高版本中,幾何圖形資源由系統內部處理,但是,如果您的使用案例較複雜,或者您必須在決定性時間減少消耗記憶體,您可能仍需要手動處置幾何圖形。Dynamo 引擎將處理從函數傳回的任何幾何圖形資源。透過以下方式可以手動處理未傳回的幾何圖形資源:
使用手動的 Dispose 呼叫:
發佈較新版本的資源庫時,節點名稱可能會變更。在移轉檔案中可以指定名稱變更,以便在更新時,以舊版資源庫建置的圖表可以持續正常運作。透過以下方式可以實作移轉:
使用以下格式,在與 .dll
相同的資料夾中建立 .xml
檔案:「BaseDLName」.Migrations.xml
在 .xml
中,建立單一 <migrations>...</migrations>
元素
在 migrations 元素內,為每個名稱變更建立 <priorNameHint>...</priorNameHint>
元素
對每個名稱變更,提供 <oldName>...</oldName>
和 <newName>...</newName>
元素
按一下右鍵,然後選取「
Add > New Item
」選擇「
XML File
」對於此專案,我們將移轉檔案命名為
ZeroTouchEssentials.Migrations.xml
此範例程式碼告訴 Dynamo,任何名為 GetClosestPoint
的節點現在都命名為 ClosestPointTo
。
請參閱 ProtoGeometry.Migrations.xml 中的此程式碼範例
Zero-Touch 目前不支援使用泛型。可以使用泛型,但不能在直接匯入且未設定類型的程式碼中使用。無法顯示屬於泛型且未設定類型的方法、性質或類別。
在以下範例中,不會匯入類型為 T
的 Zero-Touch 節點。如果將剩餘的資源庫匯入至 Dynamo,則會發生缺少類型的例外狀況。
在此範例中設定類型的情況下使用泛型類型,將匯入至 Dynamo。
本部分包含將圖表、套件和資源庫移轉至 Dynamo 3.x 時,可能會遇到之問題相關資訊。
Dynamo 3.0 為主要版本,某些 API 已變更或移除。其中可能會影響 Dynamo 3.x 開發人員或使用者的最大變更是改為使用 .NET8。
Dotnet/.NET 是執行階段,支援編寫 Dynamo 時使用的 C# 語言。此項目及 Autodesk 生態系統中的其他項目已更新為使用此執行階段的新版本。
由於 Dynamo 3.x 現在於 .NET8 執行階段上執行,因此針對 Dynamo 2.x 建置的套件 (使用 .NET48) 不保證可在 Dynamo 3.x 中運作。嘗試在 Dynamo 3.x 中下載從低於 3.0 的 Dynamo 版本發佈的套件時,您會收到警告,指出套件來自舊版 Dynamo。
這不表示套件無法運作。這只是警告您可能有相容性問題。一般而言,建議您檢查是否有專為 Dynamo 3.x 建置的較新版本。
載入套件時,您也可能會在 Dynamo 記錄檔中看到此類警告。如果所有一切都正常運作,即可忽略警告。
針對 Dynamo 3.x 建置的套件 (使用.Net8) 在 Dynamo 2.x上很可能無法運作。若使用舊版,下載為更新版 Dynamo 建置的套件時,您也會看到警告。
我們已經具備 ZeroTouch 的基礎知識,本節將深入探討自訂 Dynamo 節點來增強功能和使用者體驗的優點。透過增加警告訊息、資訊訊息和自訂圖示等功能,您可以建立更直覺、資訊量更大、視覺上更吸引人的節點。這些自訂功能不僅能協助使用者瞭解潛在的問題或最佳化其工作流程,還能讓您的節點脫穎而出,成為專業且容易使用的工具。
自訂節點是一種絕佳方式,能確保您的解決方案清晰、可靠,專門為滿足特定專案需求而量身打造。
在 Dynamo 中,OnLogWarningMessage
方法提供一種將警告訊息直接記錄到 Dynamo 主控台的方法。這是一項強大的功能,尤其是對於 Zero Touch 節點,因為它允許開發人員在輸入或參數出現可能導致非預期行為的問題時提醒使用者。本指南將教您如何在任何 Zero Touch 節點中實施 OnLogWarningMessage
。
OnLogWarningMessage
的實施步驟OnLogWarningMessage
屬於 DynamoServices
名稱空間,因此請先將其加入專案檔。
在加入警告訊息之前,請考慮方法中的邏輯:
哪些條件可能會導致不正確或意外的結果?
方法是否需要特定的輸入值或參數才能正確運作?
要檢查的條件範例:
超出範圍值 (例如 if (inputValue < 0)
)。
空值或空集合 (例如 if (list == null || list.Count == 0)
)。
資料類型不相符 (例如,檔案類型不受支援時)。
OnLogWarningMessage
記錄警告在偵測到可能導致問題的位置進行 OnLogWarningMessage
呼叫。當滿足條件時,記錄一則警告訊息,向使用者提供明確的指導意見。
OnLogWarningMessage
的語法OnLogWarningMessage
的範例實施為了實際示範 OnLogWarningMessage
,下面是您在建置 Zero Touch 節點時可能會遇到的不同情境。
在此範例中,我們將以上一個「Zero-Touch 案例研究 - 網格節點」中建立的自訂節點為基礎;一個名為 RectangularGrid
的方法會根據 xCount
和 yCount
輸入產生矩形格線。我們將逐步測試某個輸入是否無效,然後使用 OnLogWarningMessage
記錄警告並停止處理。
使用 OnLogWarningMessage
進行輸入驗證
根據 xCount
和 yCount
產生格線時。在繼續操作之前,您希望確保兩個值都是正整數。
在本範例中:
條件:如果 xCount
或 yCount
小於或等於零。
訊息:"Grid count values must be positive integers."
如果使用者輸入零或負值,將在 Dynamo 中顯示警告,以協助他們瞭解預期的輸入。
現在我們知道運作方式,可以將其實施到 Grids 範例節點中:
範例 2:檢查空值或空集合
如果您的方法需要一個點清單,但使用者傳入空白或空值清單,您可以使用 OnLogWarningMessage
通知他們有這個問題。
在本範例中:
條件:如果 points
清單為空值或包含少於三個點。
訊息:"Point list cannot be null or have fewer than three points."
這會警告使用者,他們需要傳入至少包含三個點的有效清單才能形成一個多邊形。
範例 3:驗證檔案類型相容性
如果是處理檔案路徑的節點,您可能希望確保只允許某些檔案類型。如果偵測到不支援的檔案類型,則記錄警告。
在本範例中:
條件:如果檔案路徑不是以「.csv」結尾。
訊息:"Only CSV files are supported."
這會警告使用者,確保他們傳入的是 CSV 檔,有助於防止出現與檔案格式不相容相關的問題。
OnLogInfoMessage
新增資訊訊息在 Dynamo 中,DynamoServices
名稱空間中的 OnLogInfoMessage
可讓開發人員將資訊訊息直接記錄到 Dynamo 的主控台。這有助於確認運算成功、傳達進度或提供有關節點動作的其他見解。本指南將教您如何在任何 Zero Touch 節點中加入 OnLogInfoMessage
,以增強回饋並改善使用者體驗。
OnLogInfoMessage
的實施步驟OnLogInfoMessage
屬於 DynamoServices
名稱空間,因此請先將其加入專案檔。
在加入資訊訊息之前,請考慮方法的用途:
動作完成後,要確認哪些資訊有用?
方法中是否有使用者可能想要瞭解的關鍵步驟或里程碑?
有用的確認範例:
完成訊息 (例如,當網格或模型完全建立好時)。
已處理資料的詳細資料 (例如,「已成功處理 10 個項目」)。
執行摘要 (例如,過程中使用的參數)。
OnLogInfoMessage
記錄資訊訊息在方法中有意義的點進行 OnLogInfoMessage
呼叫。發生關鍵步驟或完成動作時,記錄一則資訊訊息,向使用者更新發生的情況。
OnLogInfoMessage
的語法OnLogInfoMessage
的範例實施以下是幾個不同情境,示範如何在 Zero Touch 節點中使用 OnLogInfoMessage
。
在此範例中,我們將以上一個「Zero-Touch 案例研究 - 網格節點」中建立的自訂節點為基礎;一個名為 RectangularGrid
的方法會根據 xCount
和 yCount
輸入產生矩形格線。我們將逐步測試某個輸入是否無效,然後在節點完成其執行時使用 OnLogInfoMessage
提供資訊。
使用 OnLogInfoMessage
進行輸入驗證
根據 xCount
和 yCount
產生格線時。產生網格後,您希望透過記錄網格尺寸的資訊訊息來確認其建立完成。
在本範例中:
條件:網格建立程序已經完成。
訊息:"Successfully created a grid with dimensions {xCount}x{yCount}."
此訊息將通知使用者,網格已依指定方式建立,協助他們確認節點如預期般運作。
現在我們知道運作方式,可以將其實施到 Grids 範例節點中:
如果要建立處理點清單的節點,可能需要記錄成功處理的點數。這對於大型資料集非常有用。
在本範例中:
條件:迴圈完成後,顯示已處理項目的計數。
訊息:"6 points were processed successfully."
此訊息將協助使用者瞭解處理結果,並確認所有點都已處理。
在某些情況下,確認節點用於完成動作的輸入參數會很有用。例如,如果您的節點將資料匯出到某個檔案,則記錄檔名和路徑可以讓使用者放心使用了正確的檔案。
在本範例中:
條件:匯出程序成功完成。
訊息:"Data exported successfully to {filePath}."
此訊息向使用者確認匯出已完成,並顯示確切的檔案路徑,可協助避免檔案位置混淆。
從歷史上看,套件作者如何在 Dynamo 中為其節點提供文件一直存在限制。自訂節點的作者受到限制,只允許在節點的工具提示中顯示簡短描述,或只允許在套件中加入大量註解的範例圖表。
Dynamo 現在為套件作者提供一套改進的系統,讓您可以為自訂節點提供更好、更清楚的文件。這種新方法利用友善的 Markdown 語言進行文字撰寫,並使用「文件瀏覽器」視圖延伸功能在 Dynamo 中顯示 Markdown。使用 Markdown 為套件作者在記錄自訂節點時提供多種新的可能性。
Markdown 是一種輕量標記語言,可用於格式化純文字文件。Markdown 自 2004 年創造出來後,其受歡迎程度日益增加,現在已經是世界上其中一種最受歡迎的標記語言。
在節點中新增文件非常容易。您可以將文件加到所有類型的自訂節點,包括:
現成的 Dynamo 節點
自訂節點 (.dyf) - 現成和/或其他套件節點的集合。
自訂 C# 套件節點 (也稱為 Zerotouch。這些自訂節點看起來像現成節點)
NodeModel 節點 (包含特殊使用者介面功能 (如下拉式清單或選取按鈕) 的節點)
具有自訂使用者介面的 NodeModel 節點 (包含獨特的使用者介面功能 (如節點上有圖形) 的節點)
請按照以下幾個步驟,讓 Markdown 檔案顯示在 Dynamo 內。
Dynamo 使用「文件瀏覽器」視圖延伸來顯示節點文件。若要開啟節點文件,請在節點上按一下右鍵,然後選取「說明」。這會開啟「文件瀏覽器」,並顯示與該節點關聯的 Markdown (如果有)。
「文件瀏覽器」中顯示的文件由兩個部分組成。第一個是「Node Info
」部分,這是由節點中提取的資訊自動產生而成,例如輸入/輸出、節點品類、節點名稱/名稱空間和節點簡短描述。第二部分展示自訂節點文件,這是用來記錄節點的 Markdown 檔案。
若要將文件檔案加到 Dynamo 中的節點,請在套件目錄中建立一個名為 /doc
的新資料夾。載入套件後,Dynamo 會掃描此目錄,並取得當中所有的 文件 Markdown 檔案。
為了確保 Dynamo 知道當要求時要為特定節點開啟哪個檔案,Markdown 檔案的命名必須依照特定格式。您的 Markdown 檔案應該根據其記錄的節點名稱空間來命名。如果您不確定節點的名稱空間為何,請查看「Node Info
」部分,當您在節點上按「Help
」時,在節點名稱下會看到所選節點的完整名稱空間。
此名稱空間應該是該特定節點的 Markdown 檔案名稱。例如,上圖中 CustomNodeExample
的名稱空間是 TestPackage.TestCategory.CustomNodeExample
,因此此節點的 Markdown 檔案應命名為 TestPackage.TestCategory.CustomNodeExample.md
在節點多載 (節點的名稱相同但輸入不同) 的特殊情況下,您必須在節點名稱空間之後的 ()
加上輸入名稱。例如,內建節點 Geometry.Translate
有多個多載。在此案例中,我們會將以下節點的 Markdown 檔案命名為:Autodesk.DesignScript.Geometry.Geometry.Translate(geometry,direction).md
Autodesk.DesignScript.Geometry.Geometry.Translate(geometry,direction,distance).md
為了方便修改文件檔案,「文件瀏覽器」對開啟的文件檔案實作一個「檔案監看器」。您可以對 Markdown 檔案進行變更,在 Dynamo 中會立即看到修改的內容。
在 Dynamo 開啟時,也可以新增文件檔案。只要在 /doc
資料夾中新增一個 Markdown 檔案,其名稱對應到其記錄的節點即可。
Dynamo 中 Zero Touch 節點的自訂圖示,可讓您的節點在視覺上與眾不同,也更容易在資源庫中辨識。透過增加自訂圖示,您可以讓節點脫穎而出,讓使用者在清單中快速識別。
本指南將向您展示如何將圖示加入 Zero Touch 節點。
首先,為您的 Zero Touch 節點建立一個 Visual Studio 類別程式庫 (.NET Framework) 專案。如果您還沒有專案,請參閱入門一節,以取得建立專案的逐步指示。
請確保您至少有一個功能性的 Zero Touch 節點,因為只能將圖示加到既有節點中。如需指導意見,請參閱 Zero Touch 案例研究 - 網格節點。
建立自訂圖示:
設計圖示:使用影像編輯器為節點建立簡單清晰的圖示。
影像規格:
小圖示:32x32 像素 (用於資源庫的側邊欄和節點本身)。
大圖示:128x128 像素 (將游標懸停在資源庫中的節點上時用於節點性質)。
檔案命名慣例:
檔名必須符合以下格式,才能將其與正確的節點關聯:
<ProjectName>.<ClassName>.<MethodName>.Small.png
(用於小圖示)。
<ProjectName>.<ClassName>.<MethodName>.Large.png
(用於大圖示)。
範例:如果您的專案是 ZeroTouchNodeIcons
,您的類別是 Grids
,且您的方法是 RectangularGrid
,則檔案將命名為:
ZeroTouchNodeIcons.Grids.RectangularGrid.Small.png
ZeroTouchNodeIcons.Grids.RectangularGrid.Large.png
秘訣:對所有圖示使用一致的設計主題,可賦予專業的觀感。
若要將圖示嵌入 .dll
中,請建立一個資源檔:
新增資源檔:
在**「方案總管」**中以右鍵按一下您的專案。
移至**「新增」>「新項目」,然後選取「資源檔」**。
將檔案命名為 <ProjectName>Images.resx
。例如 ZeroTouchNodeIconsImages.resx
。
清除自訂工具屬性:
在**「方案總管」**中選取資源檔。
在**「屬性」**面板中,透過移除 ResXFileCodeGenerator
值來清除「Custom Tool
」欄位。
注意:如果沒有清除「自訂工具」欄位,會導致 Visual Studio 將資源名稱中的句點轉換為底線。請在建置之前,確認您的資源名稱是以句點 (而不是底線) 分隔類別名稱。
使用**「受控資源編輯器 (舊版)」**開啟資源檔:
如果使用 Visual Studio 17.11 或更高版本,請以右鍵按一下資源檔,選擇**「開啟方式」,然後選取「受控資源編輯器 (舊版)」**。
如果使用 17.11 之前的 Visual Studio 版本,請按兩下資源檔以使用「資源編輯器」開啟 (在您的 Visual Studio 版本中,此編輯器尚未成為舊版)。
新增您的影像:
將影像檔拖放到編輯器中,或使用**「新增現有檔案」**選項。
更新持續性:
在「資源編輯器」中選取影像 (如果在「方案總管」中選取影像,此動作將沒有作用),將**「屬性」面板中的「持續性」**屬性變更為「Embedded in .resx
」。這可確保影像包含在 .dll
中。
如果您的專案還不是 SDK 型 (嵌入資源需要),請加以轉換:
從 Visual Studio 的**「延伸模組」>「管理延伸模組」**功能表安裝 .NET Upgrade Assistant
延伸模組。
在**「方案總管」中的專案上按一下右鍵,然後選取「升級」>「將專案轉換為 SDK 型」**。
等待轉換完成。
卸載專案:
在**「方案總管」中的專案上按一下右鍵,然後選取「卸載專案」**。
編輯 .csproj
檔案:
在 </ItemGroup>
和 </Project>
之間加入以下 <Target>
元素:
將 ZeroTouchNodeIcons
的所有例證取代為您的專案名稱。
重新載入專案:
在已卸載的專案上按一下右鍵,然後選取**「重新載入專案」**。
建置專案:
新增建置後指令碼後,在 Visual Studio 中建置專案。
檢查輸出檔案:
確保您的 .dll
和 .customization.dll
位於 bin
資料夾中。
將 .dll
加入 Dynamo:
在 Dynamo 中,使用「匯入資源庫」按鈕將 .dll 匯入到 Dynamo。
您的自訂節點現在應該會與其各自的圖示一起顯示。
如果您能輕鬆地以 Python 撰寫指令碼,也想要從標準 Dynamo Python 節點獲得更多功能,我們可以使用 Zero-Touch 建立自己的指令碼。我們先從一個簡單的範例開始,我們將一個 Python 指令碼做為字串傳入執行指令碼並傳回結果的 Zero-Touch 節點。此案例研究以「入門」區段中的逐步解說和範例為基礎,如果您是初次建立 Zero-Touch 節點,請參閱這些內容。
將執行 Python 指令碼字串的 Zero-Touch 節點
此節點依賴一個 IronPython 指令碼引擎例證。若要執行,我們需要參考一些其他組合。請遵循以下步驟,在 Visual Studio 中設定基本樣板:
建立新的 Visual Studio 類別專案
在位於 C:\Program Files (x86)\IronPython 2.7\IronPython.dll
的 IronPython.dll
中加入參考
在位於 C:\Program Files (x86)\IronPython 2.7\Platforms\Net40\Microsoft.Scripting.dll
的 Microsoft.Scripting.dll
中加入參考
在您的類別中包括 IronPython.Hosting
和Microsoft.Scripting.Hosting
兩個 using
陳述式
加入一個空的私用建構函式,以防止額外的節點隨著我們的套件被加到 Dynamo 資源庫
建立一個採用單一字串做為輸入參數的新方法
在此方法中,我們將實體化新的 Python 引擎,並建立空的指令碼範圍。您可以將此範圍想像為 Python 解譯器例證內的全域變數
接下來,在引擎呼叫 Execute
,並傳入輸入字串和範圍做為參數
最後,在範圍呼叫 GetVariable
,並從包含您嘗試傳回之值的 Python 指令碼傳入變數名稱,來擷取並傳回指令碼的結果。(請參閱以下範例,以取得進一步的詳細資料)
以下程式碼提供上述步驟的範例。建置方案會在專案的 bin 資料夾中建立一個新的 .dll
。現在,此 .dll
可匯入至 Dynamo 做為套件的一部分,或瀏覽至「File < Import Library...
」
標準 Python 節點的一個限制是它們只有單一輸出埠,因此,如果我們希望傳回多個物件,則必須建構清單並擷取其中的每個物件。如果我們修改上述範例以傳回字典,就可以加入任意數目的輸出埠。請參閱〈深入瞭解 Zero-Touch〉中的〈傳回多個值〉一節,以取得有關字典的更多詳細資料。
此節點可讓我們傳回立方體的體積及其形心。
接下來使用以下步驟修改先前的範例:
從 NuGet 套件管理員加入 DynamoServices.dll
的參考
除了先前的組合,還包括 System.Collections.Generic
和 Autodesk.DesignScript.Runtime
修改方法的傳回類型,以傳回包含輸出的字典
每個輸出都必須從範圍中單獨擷取 (請考慮為較大的輸出集設定簡單迴路)
我們也在範例 Python 指令碼中加入其他輸出變數 (output2
)。請記住,這些變數可以使用任何合法的 Python 命名慣例,在此範例中是為了清楚起見,所以只使用 output。
Dynamo 2.0 一個是重大版本,某些 API 已變更或移除。影響節點和套件作者其中一項最大的改變是我們改用 JSON 檔案格式。
一般而言,Zero Touch 節點的作者幾乎不需要完成什麼工作,就能在 2.0 中執行他們的套件。
直接從 NodeModel 衍生的使用者介面節點和節點則要付出較多的工作,才能在 2.x 中執行。
延伸的作者也可能需要進行一些潛在的變更 - 取決於他們在延伸中使用多少 Dynamo 核心 API。
請勿將 Dynamo 或 Dynamo Revit .dll 與套件一起封裝。這些 dll 將由 Dynamo 載入。如果您組合的版本與使用者載入的版本不同 (例如您散發 dynamo core 1.3,但使用者在 dynamo 2.0 上執行套件),將會發生神秘的執行時期錯誤。這包括 dll,例如 DynamoCore.dll
、DynamoServices.dll
、DSCodeNodes.dll
、ProtoGeometry.dll
如果可以避免,請勿將 newtonsoft.json.net
與套件一起封裝並散發。此 dll 也將由 Dynamo 2.x 載入。可能會發生與上述相同的問題。
如果可以避免,請勿將 CEFSharp
與套件一起封裝並散發。此 dll 也將由 Dynamo 2.x 載入。可能會發生與上述相同的問題。
如果您需要控制相依性的版本,一般而言請避免與 dynamo 或 revit 共用相依性。
開啟圖表時,某些節點有多個埠具有相同名稱,但圖表在儲存時看起來正常。此問題可能有幾種原因。
常見的根本原因是,節點是使用重新建立埠的建構函式建立的。應該使用載入埠的建構函式。這些建構函式通常會標記 [JsonConstructor]
請參閱下方範例
這可能是因為:
沒有相符的 [JsonConstructor]
,或未從 JSON .dyn 傳入 Inports
和 Outports
。
同時將兩個版本的 JSON.net 載入到同一個程序中,會導致 .net 執行時期失敗,因此無法正確使用 [JsonConstructor]
屬性來標記建構函式。
與目前 Dynamo 版本不同的 DynamoServices.dll 與套件一起封裝,導致 .net 執行時期無法識別 [MultiReturn]
屬性,因此以各種屬性標記的 zero touch 節點無法套用這些屬性。您可能會發現節點傳回單一字典輸出,而不是多個埠。
在主控台中載入帶有某些錯誤的圖表時,節點會完全遺失。
如果還原序列化因某些原因失敗,則可能會發生此情況。最好只序列化您需要的性質。我們可以對您不需要載入或儲存的複雜性質使用 [JsonIgnore]
加以忽略。例如 function pointer, delegate, action,
或 event
等性質。這些性質不應該序列化,因為它們通常無法還原序列化而導致執行時期錯誤。
已知問題:
註解將轉換為區塊註解,而不是行註解。
簡短類型名稱將取代為完整名稱。例如,如果您在再次載入自訂節點時未指定類型,您會看到 var[]..[]
- 因為這是預設類型。
在 Dynamo 2.0 中,清單和字典類型已經分開,用於建立清單和字典的語法也已經變更。清單使用 []
初始化,字典則是使用 {}
。
如果您先前使用 DefaultArgument
屬性標記 Zero Touch 節點上的參數,並使用清單語法預設為特定清單 (例如 someFunc([DefaultArgument("{0,1,2}")])
),此作業將不再有效,您需要修改 DesignScript 片段對清單使用新的初始化語法。
如上所述,請勿將 Dynamo dll 與您的套件 (DynamoCore
、DynamoServices
等) 一起散發。
NodeModel 節點需要最多工作才能更新到 Dynamo 2.x。除了用於實體化節點類型新例證的正規 nodeModel 建構函式外,進階一點,您還需要實作只用於從 json 載入節點的建構函式。若要區分這些建構函式,請使用來自 newtonsoft.Json.net 的屬性 [JsonConstructor]
標記載入時間建構函式。
更新衍生自 NodeModel
基準類別 (或其他 Dynamo 核心基準類別,例如 DSDropDownBase
) 的節點時,最常見的變更是需要將 JSON 建構函式加入您的類別。
您原始的無參數建構函式仍會處理初始化在 Dynamo 中建立的新節點 (例如,透過資源庫)。必須有 JSON 建構函式,才能初始化從儲存的 .dyn 或 .dyf 檔案還原序列化 (已載入) 的節點。
JSON 建構函式與基本建構函式不同,因為它有 inPorts
和 outPorts
的 PortModel
參數,由 JSON 載入邏輯提供。此處不需要呼叫註冊節點的埠,因為資料存在於 .dyn 檔案中。JSON 建構函式的範例如下所示:
using Newtonsoft.Json; //New dependency for Json
………
[JsonConstructor] //Attribute required to identity the Json constructor
//Minimum constructor implementation. Note that the base method invocation must also be present.
FooNode(IEnumerable<PortModel> inPorts, IEnumerable<PortModel> outPorts) : base(inPorts, outPorts) { }
此語法 :base(Inports,outPorts){}
呼叫基本 nodeModel
建構函式,並將還原序列化的埠傳入。
類別建構函式中牽涉到已序列化至 .dyn 檔案之特定資料初始化而存在的任何特殊邏輯 (例如設定埠註冊、交織策略等),在此建構函式中都不需要重複,因為這些值可以從 JSON 中讀取。
這是 nodeModels 的 JSON 建構函式與非 JSON 建構函式之間的主要差異。JSON 建構函式是從檔案載入時呼叫,並傳入載入的資料。但是,在 JSON 建構函式中必須複製其他使用者邏輯 (例如,初始化節點的事件處理常式或附加)。
[JsonProperty(PropertyName = "InputValue")]
public DSColor DsColor {...
注意事項
如果您建立自己的 JSON.net 轉換器類別,Dynamo 目前沒有機制可讓您將其插入載入方法和儲存方法,因此即使您使用 [JsonConverter]
屬性標記類別,也可能不會使用它 - 您可以改為直接在 setter 或 getter 中呼叫轉換器。//TODO 需要確認此限制。歡迎提出任何證據。
[JsonProperty("MeasurementType"), JsonConverter(typeof(StringEnumConverter))]
public ConversionMetricUnit SelectedMetricConversion{...
如上所述,過去曾使用 SerializeCore
和 DeserializeCore
方法將節點儲存並載入至 xml .dyn 檔案。此外,這些方法也用來儲存和載入節點狀態以用於退回/重做,**現在也還是!**如果您要為 nodeModel 使用者介面節點實作複雜的退回/重做功能,則需要實作這些方法,並序列化為以這些方法的參數提供的 XML 文件物件。除了複雜的使用者介面節點,這應該是很少見的使用案例。
受 2.0 API 變更影響的 nodeModel 節點中,一個常見情況是節點建構函式中的埠註冊。查看 Dynamo 或 DynamoSamples 儲存庫中的範例,您先前會發現使用 InPortData.Add()
或 OutPortData.Add()
方法。先前在 Dynamo API 中,InPortData
和 OutPortData
公用性質已標記為棄用。在 2.0 中,這些性質已移除。開發人員現在應使用 InPorts.Add()
和 OutPorts.Add()
方法。此外,這兩種 Add()
方法的簽章略有不同:
InPortData.Add(new PortData("Port Name", "Port Description")); //Old version valid in 1.3 but now deprecated
與
InPorts.Add(new PortModel(PortType.Input, this, new PortData("Port Name", "Port Description"))); //Recommended 2.0
接下來逐步解說將 1.3 使用者介面節點升級到 Dynamo 2.x。
我們只需對此 nodeModel
類別加入一個 jsonConstructor 處理埠的載入,就能在 2.0 中正確載入和儲存。我們只是在基本建構函式上傳入埠,此實作為空的。
注意事項:請勿在 JsonConstructor 中呼叫 RegisterPorts()
或其某些變體 - 這會在您的節點類別上使用輸入和輸出參數屬性來建構新的埠!我們不想要這個結果,因為我們要使用傳入建構函式的已載入埠。
以下是使用者介面節點更複雜的建構函式:
當我們加入 JSON 建構函式以從檔案載入此節點時,必須重新建立其中的某些邏輯,但請注意,我們不包括建立埠、設定交織或設定性質預設值的程式碼,這些程式碼可從檔案載入。
請注意,已序列化為 JSON 的其他公用性質 (例如 ButtonText
和 WindowText
) 將不會以明確參數加到建構函式中 - JSON.net 會使用這些性質的 setter 自動設定這些性質。
以 NodeModel 為基礎的節點提供的靈活性和功能比 Zero-Touch 節點要大得多。在此範例中,我們將加入一個可隨機顯示矩形大小的整合滑棒,將 Zero-Touch 網格節點提升到下一個層次。
滑棒會相對於儲存格的大小調整比例,因此使用者不必為滑棒提供正確範圍。
在 Dynamo 較高的層次,有兩個部分可以建立模型-視圖關係:
NodeModel
類別建立節點的核心邏輯 (「模型」)
INodeViewCustomization
類別自訂檢視 NodeModel
的方式 (「視圖」)
NodeModel 物件已經有一個關聯的視圖-模型 (NodeViewModel),因此我們只需將焦點放在模型上,以及自訂使用者介面的視圖。
NodeModel 節點與 Zero-Touch 節點有幾項顯著差異,我們將在此範例中進行介紹。在跳至使用者介面自訂之前,我們先建置 NodeModel 邏輯。
1.建立專案結構:
NodeModel 節點只能呼叫函數,因此我們需要將 NodeModel 和函數分到不同的資源庫。對 Dynamo 套件執行此作業的標準方式是為每個套件建立單獨的專案。首先,建立新的方案以包含專案。
選取「
File > New > Project
」選取「
Other Project Types
」以顯示方案選項選取「
Blank Solution
」將方案命名為
CustomNodeModel
選取「
Ok
」
在方案中建立兩個 C# 類別資源庫專案:一個用於函數,一個用於實作 NodeModel 介面。
在「方案」上按一下右鍵,然後選取「
Add > New Project
」選擇「類別庫」
將其命名為
CustomNodeModel
按一下「
Ok
」重複此程序,加入另一個名為
CustomNodeModelFunctions
的專案
接下來,我們需要將自動建立的類別資源庫更名,並在 CustomNodeModel
專案中加入一個資源庫。GridNodeModel
類別實作抽象 NodeModel 類別,GridNodeView
用於自訂視圖,GridFunction
包含我們需要呼叫的任何函數。
在
CustomNodeModel
專案上按一下右鍵,選取「Add > New Item...
」並選擇「Class
」,以加入其他類別。在
CustomNodeModel
專案中,我們需要GridNodeModel.cs
和GridNodeView.cs
類別在
CustomNodeModelFunction
專案中,我們需要GridFunctions.cs
類別
在類別中加入任何程式碼之前,請先為此專案加入必要的套件。CustomNodeModel
需要 ZeroTouchLibrary 和 WpfUILibrary,CustomNodeModelFunction
只需要 ZeroTouchLibrary。WpfUILibrary 將用於我們稍後執行的使用者介面自訂,ZeroTouchLibrary 將用於建立幾何圖形。可以個別為專案加入套件。由於這些套件具有相依性,因此將自動安裝 Core 和 DynamoServices。
在專案上按一下右鍵,然後選取「
Manage NuGet Packages
」只會為該專案安裝必要的套件
Visual Studio 會複製我們參考建置目錄的 NuGet 套件。這可以設定為 False,讓套件中沒有任何不必要的檔案。
選取 Dynamo NuGet 套件
將
Copy Local
設定為 False
2.繼承 NodeModel 類別
如前所述,NodeModel 節點與 ZeroTouch 節點不同的主要層面是對 NodeModel
類別的實作。NodeModel 節點需要此類別中的幾個函數,我們可以透過在類別名稱後加入 :NodeModel
來取得這些函數。
將以下程式碼複製到 GridNodeModel.cs
。
這與 Zero-Touch 節點不同。我們來瞭解每個部分在做什麼。
指定節點屬性,如名稱、品類、InPort/OutPort 名稱、InPort/OutPort 類型、描述。
public class GridNodeModel : NodeModel
是從 Dynamo.Graph.Nodes
繼承 NodeModel
類別的類別。
public GridNodeModel() { RegisterAllPorts(); }
是註冊節點輸入和輸出的建構函式。
BuildOutputAst()
傳回 AST (抽象語法樹),這是從 NodeModel 節點傳回資料必要的結構。
AstFactory.BuildFunctionCall()
從 GridFunctions.cs
呼叫 RectangularGrid 函數。
new Func<int, int, double, List<Rectangle>>(GridFunction.RectangularGrid)
指定函數及其參數。
new List<AssociativeNode> { inputAstNodes[0], inputAstNodes[1], sliderValue });
將節點輸入對映至函數參數
如果輸入埠未連接,AstFactory.BuildNullNode()
會建置空節點。這可避免在節點上顯示警告。
RaisePropertyChanged("SliderValue")
在滑棒值變更時通知使用者介面
var sliderValue = AstFactory.BuildDoubleNode(SliderValue)
在 AST 中建置表示滑棒值的節點
在 functionCall 變數 new List<AssociativeNode> { inputAstNodes[0], sliderValue });
中將輸入變更為 sliderValue
變數
3.呼叫函數
CustomNodeModelFunction
專案將建置到與 CustomNodeModel
分開的組合中,以便能被呼叫。
將以下程式碼複製到 GridFunction.cs
。
此函數類別與 Zero-Touch 網格案例研究非常類似,但有一項差異:
[IsVisibleInDynamoLibrary(false)]
讓 Dynamo 看不到下列方法和類別,因為已經從 CustomNodeModel
呼叫函數。
正如我們加入 NuGet 套件的參考一樣,CustomNodeModel
需要參考 CustomNodeModelFunction
才能呼叫函數。
CustomNodeModel 的 using 陳述式將處於非作用中狀態,直到我們參考該函數
在
CustomNodeModel
上按一下右鍵,然後選取「Add > Reference
」選擇「
Projects > Solution
」勾選
CustomNodeModelFunction
按一下「
Ok
」
4.自訂視圖
若要建立滑棒,我們需要透過實作 INodeViewCustomization
介面來自訂使用者介面。
將以下程式碼複製到 GridNodeView.cs
public class CustomNodeModelView : INodeViewCustomization<GridNodeModel>
定義自訂使用者介面必要的函數。
設定專案結構後,請使用 Visual Studio 的設計環境建置使用者控制項,並在 .xaml
檔案中定義其參數。從工具方塊中,將滑棒加入 <Grid>...</Grid>
。
在
CustomNodeModel
上按一下右鍵,然後選取「Add > New Item
」選取「
WPF
」將使用者控制項命名為
Slider
按一下「
Add
」
將以下程式碼複製到 Slider.xaml
滑棒控制項的參數定義在 .xaml
檔案中。Minimum 和 Maximum 屬性定義此滑棒的數值範圍。
在 <Grid>...</Grid>
內,我們可以從 Visual Studio 工具箱放置不同的使用者控制項
建立 Slider.xaml
檔案時,Visual Studio 會自動建立一個名為 Slider.xaml.cs
的 C# 檔案以初始化滑棒。變更此檔案中的名稱空間。
名稱空間應為 CustomNodeModel.CustomNodeModel
GridNodeModel.cs
定義滑棒計算邏輯。
5.設定為套件
在建置專案之前,最後一步是加入 pkg.json
檔案,讓 Dynamo 可以讀取套件。
在
CustomNodeModel
上按一下右鍵,然後選取「Add > New Item
」選取「
Web
」選取
JSON File
將檔案命名為
pkg.json
按一下「
Add
」
將以下程式碼複製到 pkg.json
"name":
決定 Dynamo 資源庫中套件及其群組的名稱
"keywords":
提供搜尋 Dynamo 資源庫的搜尋術語
"node_libraries": []
是與套件關聯的資源庫
最後一步是建置方案,並發佈為 Dynamo 套件。請參閱〈套件部署〉一章,以瞭解如何在線上發佈之前建立本端套件,以及如何直接從 Visual Studio 建置套件。
您可以在中閱讀更多相關資訊。
開始製作 Markdown 檔案很容易 - 您只需要一個簡單的文字編輯器 (例如記事本),就可以開始。但是,有比使用記事本更容易撰寫 Markdown 的方法。有幾個線上編輯器,例如 ,可讓您在撰寫時即時看到變更。另一種編輯 Markdown 檔案的常用方式,是使用程式碼編輯器,例如 。
Markdown 非常靈活,可以提供足夠的功能來輕鬆建立良好的文件 - 這包括:增加媒體檔 (如影像或影片),建立具有不同內容形式的表格,當然還有簡單的文字格式化功能,例如讓文字變成粗體或斜體。在撰寫 Markdown 文件時,可以獲得上述所有功能,甚至是更多功能。如需更多資訊,請查看本指南中的。
Python 指令碼傳回變數 output
,這表示我們在 Python 指令碼中需要一個 output
變數。請使用此範例指令碼測試 Dynamo 中的節點。如果您曾在 Dynamo 中使用過 Python 節點,以下內容應該看起來很熟悉。如需更多資訊,請參閱 。
什麼是 COM 類型?-
Dynamo 將類型對等項委派給 .NET (dotnet) 執行階段。例如,來自不同組合且具有相同名稱和名稱空間的 2 個類型將不會視為對等項,Dynamo 在載入衝突的組合時將產生錯誤。至於互通性類型,Dynamo 將使用 檢查互通性類型是否為對等項
一些套件已使用嵌入式互通性類型建立 (例如 CivilConnection)。載入 2 個包含不是對等項的嵌入式互通性組合的套件 (定義不同版本) 將導致 package load error
。因此,我們建議套件作者對互通性類型使用動態繫結 (也稱為後期繫結) (也介紹了解決方法)。
自訂節點名稱和品類名稱在 library.js 中的同一層級如果相同,會導致非預期的行為。 - 請避免對品類和節點使用相同的名稱。
建構函式中的參數名稱通常應與 JSON 性質的名稱相符,但是如果您使用 [JsonProperty] 屬性取代序列化的名稱,則此對映會更複雜。
在 DynamoSamples 儲存庫 -> 、 或 中可以找到範例
先前,開發人員可以透過 SerializeCore
和 DeserializeCore
方法將特定模型資料序列化和還原序列化為 xml 文件。這些方法仍存在於 API 中,但在未來版本的 Dynamo 中將棄用 (在可找到範例)。現在實作 JSON.NET,NodeModel 衍生類別的 public
性質可以直接序列化為 .dyn 檔案。JSON.Net 提供多個屬性,可控制如何序列化性質。
在 Dynamo 儲存庫中的可以找到指定 PropertyName
的此範例。
在 Dynamo 儲存庫中的可以找到一個範例,指定將性質轉換為字串的序列化方法。
不用於序列化的 public
性質需要加入 [JsonIgnore]
屬性。節點儲存為 .dyn 檔案後,可確保序列化機制忽略此資料,再次開啟圖表時,不會導致非預期的結果。在 Dynamo 儲存庫中的可以找到此內容的範例。
在 Dynamo 儲存庫 -> 或 中可以找到轉換的程式碼範例
受 2.0 API 變更影響的其他常見使用案例與 BuildAst()
方法中常用的方法有關,該方法可根據埠連接器是否存在決定節點行為。先前 HasConnectedInput(index)
是用於驗證連接的埠狀態。開發人員現在應使用 InPorts[0].IsConnected
性質檢查埠連接狀態。在 Dynamo 儲存庫中的 可以找到此內容的範例。
此範例加入負載很低的 JSON 建構函式。但如果我們需要執行一些更複雜的建構邏輯,例如設定一些接聽程式以在建構函式內處理事件,該怎麼辦。下一個範例是從
取得,在本文件上方的 。JsonConstructors Section
有連結。
Dynamo 以 (MVVM) 軟體架構模式為基礎,讓使用者介面與後端保持獨立。建立 ZeroTouch 節點時,Dynamo 會在節點的資料與其使用者介面之間繫結資料。若要建立自訂使用者介面,我們必須加入資料繫結邏輯。
出於各種原因,您會透過指令行控制 Dynamo,這些原因可能包括:
自動執行多個 Dynamo
測試 Dynamo 圖表 (使用 DynamoSandbox 時也要查看 -c)
以特定順序執行一系列 Dynamo 圖表
撰寫執行多個指令行執行的批次檔
撰寫另一個程式來控制和自動執行 Dynamo 圖表,並且運用這些計算結果做一些特別的事情
指令行介面 (DynamoCLI) 是對 DynamoSandbox 的補充內容。它是一個 DOS/終端機指令行公用程式,設計來提供指令行引數方便執行 Dynamo。在一開始的實作中,它無法獨立執行,必須從 Dynamo 二進位檔所在的資料夾執行,因為它依賴與沙箱相同的核心 DLL。無法與其他 Dynamo 建置版本互通。
有四種方式可以執行 CLI:從 DOS 命令提示執行、從 DOS 批次檔執行,以及以 Windows 桌面捷徑執行 (其路徑修改為包括指定的指令行旗標)。DOS 檔規格可以是完整的或相對的,也支援對映的磁碟機和 URL 語法。它也可以使用 Mono 建置,並在 Linux 或 Mac 上從終端機執行。
公用程式支援 Dynamo 套件,但是您無法載入自訂節點 (dyf),只能載入獨立圖表 (dyn)。
在初步測試中,CLI 公用程式支援本土化的 Windows 版本,而且可以使用大寫的 Ascii 字元指定 filespec 引數。
可透過 DynamoCLI.exe 應用程式存取 CLI。此應用程式允許使用者或其他應用程式使用指令字串叫用 DynamoCLI.exe 與 Dynamo 演算模型互動。看起來可能會像下面這樣:
此指令會告訴 Dynamo 開啟 C:\someReallyCoolDynamoFile.Dyn 的指定檔案,而不繪製任何使用者介面,然後執行它。圖表執行完成後,Dynamo 就結束。
2.1 版中的新功能:DynamoWPFCLI.exe應用程式。此應用程式透過加入「幾何圖形 (-g)」選項支援 DynamoCLI.exe 應用程式支援的所有功能。DynamoWPFCLI.exe 應用程式僅限 Windows。
與 DynamoCLI 互動的首選方式是透過指令提示介面。
目前,您需要從安裝位置的 [Dynamo 版本] 資料夾內執行 DynamoCLI。CLI 需要存取與 Dynamo 相同的 .dll,因此不應移動。
您應該能夠執行目前在 Dynamo 中開啟的圖表,但這可能會導致意外的副作用。
所有檔案路徑都完全遵守 DOS 規範,因此相對路徑和完整路徑應該都能運作,但請務必將路徑放在引號 "C:path\to\file.dyn" 中
DynamoCLI 是新功能,目前不斷在變化:目前 CLI 只會載入一小組標準 Dynamo 資源庫,如果圖表未正確執行,請注意這一點。此處指定這些資源庫
目前不提供 std 輸出,如果未遇到錯誤,CLI 將在執行完成後直接結束。
-o
:您可以用無頭模式開啟 Dynamo 指向將執行圖表的 .dyn。
-v
:可在 Dynamo 以無頭模式執行 (當我們使用 -o
打開檔案) 時使用,此旗標會反覆運算圖表中的所有節點,並將輸出值傾印到簡單的 XML 檔中。由於 --ServiceMode
旗標可能會強制 Dynamo 執行多個圖表演算,因此輸出檔案會保留發生的每個演算值。
XML 輸出檔的格式如下:
-g
:可在 Dynamo 以無頭模式執行 (當我們使用 -o
開啟檔案) 時使用,此旗標會產生圖表,然後將產生的幾何圖形傾印到 JSON 檔中。
JSON 幾何圖形檔案的格式如下:
-h
:使用此旗標可取得可能選項的清單
-i 旗標可使用多次來匯入多個您嘗試開啟的圖表需要執行的組合。
-l 旗標可用來在不同地區設定下執行 Dynamo。但通常而言,地區設定不會影響圖表結果
--GeometryPath 旗標可用來將 DynamoSandbox 或 CLI 指向一組特定的 ASM 二進位檔案 - 使用方式如下
或者
-k 旗標可用來維持 Dynamo 程序執行,直到載入的延伸將其關閉。
--HostName 旗標可用來識別與主體關聯的 Dynamo 變體。
或者
-s 旗標可用來識別 Dynamo 主體分析階段作業 ID
-p 旗標可用來識別 Dynamo 主體分析父系 ID
要讓套件達到想要的配置,取決於您要納入套件中的節點類型。NodeModel 衍生的節點、ZeroTouch 節點和自訂節點,定義分類方式的程序都略有不同。您可以在同一個套件中混合使用這些節點類型,但需要結合使用下面概述的策略。
NodeModel 資源庫預設會根據類別結構進行整理。
節點將位於附加元件的以下位置:
您也可以在類別上或在建構函式中使用 NodeCategory 屬性來取代該品類,如下所示。
節點現在將位於附加元件中的以下位置:
ZeroTouch 資源庫預設也會根據類別結構進行整理。
節點將位於附加元件的以下位置:
您也可以使用 Dynamo 自訂 XML 檔案取代類別結構位置。
XML 檔案必須相應地命名,並放入套件的 extra
資料夾中
PackageName_DynamoCustomization.xml
自訂節點是根據建立節點期間 (使用新的「自訂節點」對話方塊) 中指定的 Category Name
來進行整理。
警告!
在節點名稱或品類中使用點符號,將會產生額外的巢狀子品類。.
將用作分隔符號來決定其他階層。這是 Dynamo 2.0 資源庫中的新行為。
之後可在 .dyf 檔案 (XML 或 JSON) 中更新品類名稱
當套件作者決定在新版本中更名先前存在的節點時,他們應該提供方法來移轉包含舊名稱節點的圖表。可以透過以下方式完成...
ZeroTouch 節點使用套件 bin
資料夾中的 Namespace.Migrations.XML
檔案,例如:
MyZeroTouchLib.MyNodes.SayHello
變為 MyZeroTouchLib.MyNodes.SayHelloRENAMED
NodeModel 衍生的節點在類別上使用 AlsoKnownAs
屬性,例如:
SampleLibraryUI.Examples.DropDownExample
變為 SampleLibraryUI.Examples.DropDownExampleRENAMED
套件是儲存節點並與 Dynamo 社群分享節點一個很便利的方式。套件可以包含從在 Dynamo 工作區中建立的自訂節點到 NodeModel 衍生的節點等所有內容。套件的發佈和安裝是透過 Package Manager 進行。除了此頁面,Primer 也提供套件的一般指南。
Dynamo Package Manager 是一種可從 Dynamo 或網頁瀏覽器存取的軟體登錄 (類似於 npm)。Package Manager 包括安裝、發佈、更新和檢視套件。與 npm 一樣,它維護不同版本的套件。它也能協助管理專案的相依性。
在瀏覽器中,搜尋套件並檢視統計資訊:https://dynamopackages.com/
在 Dynamo 中,Package Manager 包括安裝、發佈和更新套件。
線上搜尋套件:
Packages > Search for a Package...
檢視/編輯安裝的套件:
Packages > Manage Packages...
發佈新套件:
Packages > Publish New Package...
套件的發佈是透過 Dynamo 內的 Package Manager 進行。建議的程序是在本端發佈、測試套件,然後線上發佈與社群分享。使用 NodeModel 案例研究,我們將逐步完成必要步驟,將 RectangularGrid 節點以套件方式本端發佈,然後線上發佈。
啟動 Dynamo,然後選取「Packages > Publish New Package...
」以開啟「Publish a Package
」視窗。
選取「
Add file...
」瀏覽要加入套件的檔案從 NodeModel 案例研究中選取兩個
.dll
檔案選取「
Ok
」
將檔案加入套件內容後,為套件指定名稱、描述和版本。使用 Dynamo 發佈套件會自動建立一個 pkg.json
檔案。
一個準備好要發佈的套件。
提供名稱、描述和版本等必要資訊。
按一下「本端發佈」,然後選取 Dynamo 的套件資料夾:
AppData\Roaming\Dynamo\Dynamo Core\1.3\packages
讓節點能在 Core 當中使用。在套件準備好分享之前,請永遠在本端發佈。
發佈套件後,在 Dynamo 資源庫的 CustomNodeModel
品類下就能使用節點。
我們剛剛在 Dynamo 資源庫中建立的套件
套件一旦準備好線上發佈,請開啟 Package Manager,選擇「Publish
」,然後選擇「Publish Online
」。
若要查看 Dynamo 如何格式化套件,請按一下「CustomNodeModel」右側的三個垂直點,然後選擇「展示根目錄」
在「發佈 Dynamo 套件」視窗中,選取「
Publish
」,然後選取「Publish Online
」。若要刪除套件,請選取「
Delete
」。
更新套件的程序與發佈類似。開啟 Package Manager,然後對需要更新的套件選取「Publish Version...
」,並輸入一個更高的版本。
選取「
Publish Version
」以使用根目錄中的新檔案更新既有套件,然後選擇在本端還是線上發佈。
Package Manager 網路用戶端可讓使用者搜尋和檢視套件資料,包括版本控制、下載統計資訊和其他相關資訊。此外,套件作者還可以直接透過網路用戶端登入以更新其套件詳細資料,例如相容性資訊。
如需有關這些功能的更多資訊,請參閱此處的部落格文章:https://dynamobim.org/discover-the-new-dynamo-package-management-experience/。
透過此連結 https://dynamopackages.com/ 可以存取 Package Manager 網路用戶端
更新套件詳細資料
作者可以按照以下步驟編輯其套件描述、網站連結和儲存庫連結:
在**「我的套件」下選取套件,然後按一下「編輯套件詳細資料」**。
使用各自的欄位增加或修改**「網站」和「儲存庫」**連結。
依需要更新**「套件描述」**。
按一下**「儲存變更」**套用更新。
注意: 由於伺服器更新需要一些時間,因此更新內容最多可能需要 15 分鐘,才能在 Dynamo 內的 Package Manager 中重新整理。我們正努力減少這種延誤。
編輯已發佈套件版本的相容性資訊
對於先前發佈的套件版本,可以透過回溯方式更新相容性資訊。請依以下步驟執行:
步驟 1:
按一下要更新的套件版本。
**「相依於」**清單將自動填入套件所相依的套件。
按一下**「相容性」旁邊的鉛筆圖示,開啟「編輯相容性資訊」**工作流程。
步驟 2:
請按照以下流程圖並參考下表,協助您瞭解哪種選項最適合您的套件。
我們來使用一些範例來逐步解說一些情境:
範例套件 #1 - Civil Connection:此套件與 Revit 和 Civil 3D 兩者都有 API 相依性,且不包括核心節點的集合 (例如:幾何函數、數學函數和/或清單管理)。因此,在此案例中,理想的選擇是選項 1。套件在與版本範圍和/或個別版本清單相符的 Revit 和 Civil 3D 中會顯示為「相容」。
範例套件 #2 - Rhythm:此套件是 Revit 特定節點的集合,以及核心節點的集合。在此案例中,套件有主體相依性。但也包括可在 Dynamo Core 中運作的核心節點。因此,在此案例中,理想的選擇是選項 2。套件在與版本範圍和/或個別版本清單相符的 Revit 和 Dynamo Core (也稱為 Dynamo Sandbox) 環境中會顯示為「相容」。
範例套件 #3 - Mesh Toolkit:此套件是一個 Dynamo Core 套件,是沒有主體相依性的幾何節點集合。因此,在此案例中,理想的選擇是選項 3。套件在與版本範圍和/或個別版本清單相符的 Dynamo 和所有主體環境中會顯示為「相容」。
根據選取的選項,將會彈出 Dynamo 和/或主體特定的欄位,如下圖所示。
GeometryPrimitiveConverter.cs
中的方法DynamoRevit 程式碼資源庫中的 GeometryPrimitiveConverter 類別提供各種方法,在 Revit 和 Dynamo 幾何類型之間進行轉換。在與 Revit 模型互動的 Dynamo 腳本中處理幾何圖形時,這些方法非常有用。
GeometryPrimitiveConverter.cs
中的方法可分為四個主要品類:
Proto 轉換為 Revit 類型:將 Dynamo (Proto) 類型轉換為 Revit 類型的方法。
Revit 轉換為 Proto 類型:將 Revit 類型轉換為 Dynamo (Proto) 類型的方法。
度與弳度:在度與弳度之間轉換的方法。
X 與 UZ:處理取得互垂向量的方法。
從 Dynamo 座標系統和兩個定義點 (最小值和最大值) 建立 Revit BoundingBoxXYZ。
public static Autodesk.Revit.DB.BoundingBoxXYZ ToRevitBoundingBox( Autodesk.DesignScript.Geometry.CoordinateSystem cs, Autodesk.DesignScript.Geometry.Point minPoint, Autodesk.DesignScript.Geometry.Point maxPoint, bool convertUnits = true)
將 Dynamo BoundingBox 轉換為 Revit BoundingBoxXYZ。
convertUnits 旗標 (預設為 True) 決定座標是否應從 Dynamo 的單位系統轉換為 Revit 的內部單位。
public static Autodesk.Revit.DB.BoundingBoxXYZ ToRevitType(this Autodesk.DesignScript.Geometry.BoundingBox bb, bool convertUnits = true)
將 Dynamo Point 轉換為 Revit XYZ。
convertUnits 旗標 (預設為 True) 會視需要轉換座標。
public static Autodesk.Revit.DB.XYZ ToRevitType(this Autodesk.DesignScript.Geometry.Point pt, bool convertUnits = true)
將 Dynamo Vector 轉換為 Revit XYZ。
請注意,convertUnits 旗標預設為 False,因為向量表示方向和大小,這通常不需要單位轉換。轉換可能會影響向量的方向和長度。
public static Autodesk.Revit.DB.XYZ ToRevitType(this Vector vec, bool convertUnits = false)
將 Dynamo Point 轉換為 Revit XYZ。
public static Autodesk.Revit.DB.XYZ ToXyz(this Autodesk.DesignScript.Geometry.Point pt, bool convertUnits = true)
將 Dynamo Vector 轉換為 Revit XYZ。
請注意,convertUnits 旗標預設為 False,因為向量表示方向和大小,這通常不需要單位轉換。轉換可能會影響向量的方向和長度。
public static Autodesk.Revit.DB.XYZ ToXyz(this Vector vec, bool convertUnits = false)
將 Dynamo CoordinateSystem 轉換為 Revit Transform。
public static Autodesk.Revit.DB.Transform ToTransform(this CoordinateSystem cs, bool convertUnits = true)
將 Dynamo Plane 轉換為 Revit Plane。
public static Autodesk.Revit.DB.Plane ToPlane(this Autodesk.DesignScript.Geometry.Plane plane, bool convertUnits = true)
將 Dynamo Point 物件的集合轉換為 Revit XYZ 集合。
傳回 XYZ 清單。public static List<XYZ> ToXyzs(this List<Autodesk.DesignScript.Geometry.Point> list, bool convertUnits = true)
傳回 XYZ 的陣列。public static XYZ[] ToXyzs(this Autodesk.DesignScript.Geometry.Point[] list, bool convertUnits = true)
將 Dynamo Vector 物件的陣列轉換為 Revit XYZ 向量的陣列。
public static XYZ[] ToXyzs(this Autodesk.DesignScript.Geometry.Vector[] list, bool convertUnits = false)
將倍精度值的陣列轉換為 Revit 的 DoubleArray。
public static DoubleArray ToDoubleArray(this double[] list)
將每個內部陣列都表示一對值 (U 和 V) 的二維陣列 (double[][]) 轉換為 Revit UV 物件的陣列。
internal static Autodesk.Revit.DB.UV[] ToUvs(this double[][] uvArr)
將每個內部陣列都表示一對值 (U 和 V) 的二維陣列 (double[][]) 轉換為 Dynamo UV 物件的陣列。
internal static Autodesk.DesignScript.Geometry.UV[] ToDSUvs(this double[][] uvArr)
此範例示範使用 .ToXyz (Point) 方法將 Dynamo Point.ByCoordinates 快速簡單轉換為 Revit XYZ 的方法。
將 Revit BoundingBoxXYZ 轉換為 Dynamo BoundingBox。
public static Autodesk.DesignScript.Geometry.BoundingBox ToProtoType(this Autodesk.Revit.DB.BoundingBoxXYZ xyz, bool convertUnits = true)
將 Revit XYZ 轉換為 Dynamo Point。
public static Autodesk.DesignScript.Geometry.Point ToPoint(this XYZ xyz, bool convertUnits = true)
將 Revit Point 轉換為 Dynamo Point。
public static Autodesk.DesignScript.Geometry.Point ToProtoType(this Autodesk.Revit.DB.Point point, bool convertUnits = true)
將 Revit XYZ 轉換為 Dynamo Vector。
public static Vector ToVector(this XYZ xyz, bool convertUnits = false)
將 Revit UV 轉換為 Dynamo UV。
public static Autodesk.DesignScript.Geometry.UV ToProtoType(this Autodesk.Revit.DB.UV uv)
將 Revit Plane 轉換為 Dynamo Plane。
public static Autodesk.DesignScript.Geometry.Plane ToPlane(this Autodesk.Revit.DB.Plane plane, bool convertUnits = true)
將 Revit Transform 轉換為 Dynamo CoordinateSystem。
public static CoordinateSystem ToCoordinateSystem(this Transform t, bool convertUnits = true)
將 Revit XYZ 點清單轉換為 Dynamo Point 清單。
public static List<Autodesk.DesignScript.Geometry.Point> ToPoints(this List<XYZ> list, bool convertUnits = true)
此範例示範使用 .ToPoint (XYZ) 方法將 Revit XYZ 快速簡單轉換為 Dynamo Point 的方法。
將度轉換為弳度。
public static double ToRadians(this double degrees) { return degrees * Math.PI / 180.0; }
將弳度轉換為度。
public static double ToDegrees(this double degrees) { return degrees * 180.0 / Math.PI; }
此範例示範使用 .ToRadians 方法將度快速簡單轉換為弳度的方法。
此方法會傳回與給定 XYZ
向量互垂的 XYZ
向量。
public static XYZ GetPerpendicular(this XYZ xyz)
此方法會傳回與給定 Dynamo Vector
互垂的 Dynamo Vector
。
public static Vector GetPerpendicular(this Vector vector)
此範例示範使用 .GetPerpendicular 方法快速簡單取得與輸入向量互垂之向量的方法。
延伸是 Dynamo 生態系統中功能強大的開發工具。這些工具可讓開發人員根據 Dynamo 的互動和邏輯驅動自訂功能。延伸可以分為兩個主要品類:延伸和視圖延伸。如同字面意思,視圖延伸架構可讓您透過註冊自訂功能表項目的方式來延伸 Dynamo 使用者介面。一般延伸則以非常相似的方式 (除了使用者介面之外) 運作。例如,我們可以建置一個延伸,將特定資訊記錄到 Dynamo 主控台。此情況不需要自訂使用者介面,因此也可以使用延伸完成。
按照 DynamoSamples Github 儲存庫的 SampleViewExtension 範例,我們將逐步瞭解建立簡單的共存式視窗即時在圖表中顯示作用中節點所需的步驟。視圖延伸會要求我們為視窗建立使用者介面,並將值與視圖模型繫結。
按照 Github 儲存庫中 SampleViewExtension 範例而開發的視圖延伸視窗。
雖然我們將從頭開始建置範例,但您也可以下載並建置 DynamoSamples 儲存庫做為參考。
DynamoSamples 儲存庫:https://github.com/DynamoDS/DynamoSamples
此逐步解說將明確參考在
DynamoSamples/src/
中名為 SampleViewExtension 的專案。
視圖延伸有三個基本部分:
一個組合,其中包含實作 IViewExtension
的類別,以及建立視圖模型的類別
一個 .xml
檔案,告訴 Dynamo 在執行時期應在何處尋找此組合,以及延伸的類型
一個 .xaml
檔案,將資料與圖形顯示繫結,並決定視窗的外觀
1.建立專案結構
首先,建立一個名為 SampleViewExtension
的新 Class Library
專案。
選取「
File > New > Project
」建立新專案選取「
Class Library
」將專案命名為
SampleViewExtension
選取「
Ok
」
在此專案中,我們需要兩個類別。一個類別將實作 IViewExtension
,另一個類別將實作 NotificationObject.
。IViewExtension
包含有關如何部署、載入、參考和處置延伸的所有資訊。NotificationObject
提供 Dynamo 和 IDisposable
中發生變更的通知。發生變更時,計數將相應更新。
名為
SampleViewExtension.cs
的類別檔案,將實作IViewExtension
名為
SampleWindowViewMode.cs
的類別檔案,將實作NotificationObject
若要使用 IViewExtension
,我們需要 WpfUILibrary NuGet 套件。安裝此套件會自動安裝 Core、Services 和 ZeroTouchLibrary 等套件。
選取 WpfUILibrary
選取「
Install
」以安裝所有相依套件
2.實作 IViewExtension 類別
從 IViewExtension
類別,我們將決定 Dynamo 啟動時、載入延伸時,以 及Dynamo 關閉時會發生什麼情況。在 SampleViewExtension.cs
類別檔案中,加入以下程式碼:
SampleViewExtension
類別建立可點選的功能表項目,以開啟視窗並連接至視圖模型和視窗。
public class SampleViewExtension : IViewExtension
SampleViewExtension
從 IViewExtension
介面繼承,提供建立功能表項目所需的一切。
sampleMenuItem = new MenuItem { Header = "Show View Extension Sample Window" };
建立 MenuItem,並加入「View
」功能表。
功能表項目
sampleMenuItem.Click += (sender, args)
觸發在按一下功能表項目時將開啟新視窗的事件
MainGrid = { DataContext = viewModel }
參考我們將建立的 .xaml
檔案中的 Main Grid
,設定視窗中主格線的資料內容
Owner = p.DynamoWindow
將彈出視窗的擁有者設定為 Dynamo。這表示新視窗依賴於 Dynamo,因此動作 (例如最小化、最大化和還原 Dynamo) 將導致新視窗遵循此相同行為
window.Show();
顯示已設定其他視窗性質的視窗
3.實作視圖模型
現在,我們已建立視窗的某些基本參數,我們將加入回應各種 Dynamo 相關事件的邏輯,並指示使用者介面根據這些事件進行更新。將以下程式碼複製到 SampleWindowViewModel.cs
類別檔案:
此視圖模型類別實作會監聽 CurrentWorkspaceModel
,並在節點加入工作區或從工作區中移除時觸發事件。這會引發性質變更,通知使用者介面或已繫結的元素,資料已變更而需要更新。呼叫 ActiveNodeTypes
getter,這會在內部呼叫其他協助函數 getNodeTypes()
。此函數會逐一查看圖元區上所有作用中的節點,填入包含這些節點名稱的字串,然後將此字串傳回 .xaml 檔案中的繫結,以顯示在快顯視窗中。
定義延伸的核心邏輯後,我們現在將使用 .xaml
檔案指定視窗的外觀詳細資料。我們只需要一個簡單的視窗,透過 TextBlock
Text
中的 ActiveNodeTypes
性質繫結顯示字串。
在專案上按一下右鍵,然後選取「
Add > New Item...
」選取我們將做變更以建立視窗的「使用者控制項」樣板
將新檔案命名為
SampleWindow.xaml
選取「
Add
」
在視窗 .xaml
程式碼中,我們需要將 SelectedNodesText
繫結到文字區塊。將以下程式碼加入 SampleWindow.xaml
:
Text="{Binding ActiveNodeTypes}"
將 SampleWindowViewModel.cs
中 ActiveNodeTypes
的性質值繫結到視窗中的 TextBlock
Text
值。
我們現在要初始化 .xaml C# 支援檔案 SampleWindow.xaml.cs
中的範例視窗。將以下程式碼加入 SampleWindow.xaml
:
視圖延伸現在已準備好建置並加到 Dynamo 中。Dynamo 需要 xml
檔案,才能將輸出 .dll
註冊為延伸。
在專案上按一下右鍵,然後選取「
Add > New Item...
」選取 XML 檔案
將檔案命名為
SampleViewExtension_ViewExtensionDefinition.xml
選取「
Add
」
檔名會遵循 Dynamo 標準,以參考如下的延伸組合:"extensionName"_ViewExtensionDefinition.xml
在 xml
檔案中,加入以下程式碼,以告訴 Dynamo 在何處尋找延伸組合:
在此範例中,我們將組合建置到預設的 Visual Studio 專案資料夾。將 <AssemblyPath>...</AssemblyPath>
目標取代為組合位置。
最後一步是將 SampleViewExtension_ViewExtensionDefinition.xml
檔案複製到 Dynamo 位於 Dynamo Core 安裝目錄 C:\Program Files\Dynamo\Dynamo Core\1.3\viewExtensions
中的視圖延伸資料夾。請務必注意,extensions
和 viewExtensions
是不同的資料夾。將 xml
檔案放在不正確的資料夾中,可能會導致在執行時期無法正確載入。
我們複製到 Dynamo 的視圖延伸資料夾中的
.xml
檔案
這是視圖延伸的基本簡介。如需更複雜的案例研究,請參閱 Github 上的開放原始碼專案 DynaShape 套件。該套件使用可在 Dynamo 模型視圖中進行即時編輯的視圖延伸。
從 Dynamo 論壇 https://forum.dynamobim.com/t/dynashape-published/11666 可下載 DynamoShape 的套件安裝程式
從 Github https://github.com/LongNguyenP/DynaShape 可以複製原始程式碼
您已經找到 Dynamo 視覺程式設計語言的整合文件。
本指南將探討如何在應用程式中主控 Dynamo 的各種面向,讓使用者能夠使用視覺程式設計與應用程式互動。
內容:
本簡介 重點概述本指南涵蓋的內容,以及關於 Dynamo 的所有內容。
Dynamo 自訂進入點 如何建立 DynamoModel 以及如何開始。
元素繫結和追蹤 使用 Dynamo 的追蹤機制,將圖表中的節點繫結至主體中的結果。
Dynamo Revit Selection 節點 如何實作節點,讓使用者選取主體中的物件或資料,並將其作為輸入傳入 Dynamo 圖表。
Dynamo 內建套件概述 什麼是 Dynamo 標準資源庫,以及如何使用底層機制透過整合方式遞送套件。
一些用語:
我們將在這些文件中交替使用 Dynamo 腳本、圖表和程式這幾個詞彙,來指稱使用者在 Dynamo 中建立的程式碼。
https://github.com/DynamoDS/DynamoRevit/blob/master/src/DynamoRevit/DynamoRevit.cs#L534
DynamoModel
是主控 Dynamo 之某個應用程式的進入點 - 它代表的是一個 Dynamo 應用程式。模型是頂層根物件,此物件會參考組成 Dynamo 應用程式和 DesignScript 虛擬機器的其他重要資料結構和物件。
建構 DynamoModel
時,會使用規劃物件來設定上面的一般參數。
本文件中的範例取材自 DynamoRevit 實作,Revit 在此整合中主控 DynamoModel
作為增益集。(適用於 Revit 的外掛程式架構)。載入此增益集時,它會啟動一個 DynamoModel
,然後使用 DynamoView
和 DynamoViewModel
向使用者顯示。
Dynamo 是一種 C# .NET 專案,若要在應用程式的程序中使用它,您必須能夠主控和執行 .NET 程式碼。
DynamoCore 是一個跨平台的計算引擎和核心模型集合,可使用 .NET 或 Mono (在未來的 .NET Core 中) 建置。但 DynamoCoreWPF 包含 Dynamo 僅限 Windows 的 UI 元件,無法在其他平台編譯。
若要初始化 DynamoModel
,整合者必須在主體程式碼中的某個位置執行這些步驟。
D4R 中的清單目前只包含 Revit\SDA\bin\ICSharpCode.AvalonEdit.dll.
這樣做是為了避免 Dynamo 與 Revit 之間的資源庫版本發生衝突。例如,當 AvalonEdit
發生衝突時,Code Block 的功能可能會被完全破壞。此問題已在 Dynamo 1.1.x https://github.com/DynamoDS/Dynamo/issues/7130 中進行回報,也可手動重現。如果整合者發現主體函數和 Dynamo 之間發生資源庫衝突,建議首先執行此作業。有時必須執行此作業,來阻止其他外掛程式或主體應用程式本身載入與共用相依性不相容的版本。更好的解決方式是讓版本一致來解決版本衝突 - 或者如果可能,在主體的 app.config 中使用 .net 繫結重新導向。
ASM 是建置 Dynamo 的基礎 ADSK 幾何圖形資源庫。
LibG 是包裝 ASM 幾何圖形核心的 .Net 人性化包裝函式。libG 與 ASM 共用其版本控制配置 - 它使用與 ASM 相同的主要和次要版本號碼,來指出它是特定 ASM 版本的對應包裝函式。如果給定 ASM 版本,對應的 libG 版本應該相同。在大多數情況下,LibG 應該可以搭配特定主要版本的所有 ASM 版本運作。例如 LibG 223,應該能夠載入任何 ASM 223 版本。
Dynamo Sandbox 設計的目的是為了能夠使用多個 ASM 版本,為了達到這個目的,會將多個 libG 版本捆綁在一起並隨核心一起遞送。Dynamo Shape Manager 中提供內建功能,可搜尋 ASM 隨附的 Autodesk 產品,因此 Dynamo 可以從這些產品載入 ASM,讓幾何圖形節點無需明確載入至主體應用程式即可運作。目前存在的產品清單為:
Dynamo 會搜尋 Windows 登錄,尋找此清單中的 Autodesk 產品是否已安裝在使用者的電腦上 (如果已安裝其中任何一個),接著會搜尋 ASM 二進位檔,取得版本並尋找 Dynamo 中對應的 libG 版本。
找到 ASM 版本後,以下 ShapeManager API 將挑選要載入的對應 libG 預載程式位置。如果有確切符合的版本,則會使用該版本,否則會載入最接近的較低版次,但主要版本相同的 libG。
例如,如果 Dynamo 與有較新版 ASM 建置版本 225.3.0 的 Revit 開發建置版本整合,Dynamo 會嘗試使用 libG 225.3.0 (如果有),否則會嘗試使用小於其首選的最接近主要版本,即 225.0.0。
public static string GetLibGPreloaderLocation(Version asmVersion, string dynRootFolder)
Revit 是 ASM 產品搜尋清單中的第一個項目,這表示預設情況下,DynamoSandbox.exe
會先嘗試從 Revit 載入 ASM,我們仍需要確保整合的 D4R 工作階段作業會從目前 Revit 主體載入 ASM:例如,如果使用者電腦同時有 R2018 和 R2020,則從 R2020 啟動 D4R 時,D4R 應使用 R2020 的 ASM 225,而不是 R2018 的 ASM 223。整合者需要實作類似下列內容的呼叫,以強制載入其指定的版本。
我們最近增加 DynamoSandbox.exe
和 DynamoCLI.exe
載入特定 ASM 版本的功能。若要略過正常的登錄搜尋行為,您可以使用 �gp
旗標強制 Dynamo 從特定路徑載入 ASM。
DynamoSandbox.exe -gp �somePath/To/ASMDirectory/�
使用 StartupConfiguration 的方式是作為參數傳入來初始化 DynamoModel,這表示它包含您想要如何自訂 Dynamo 階段作業設定的幾乎所有定義。根據以下性質的設定方式,Dynamo 整合可能會因不同的整合者而異。例如,不同的整合者可能會設定不同的 python 樣板路徑,或顯示的數值格式。
包括以下內容:
DynamoCorePath // 載入 DynamoCore 二進位檔所在的位置
DynamoHostPath // Dynamo 整合二進位檔所在的位置
GeometryFactoryPath // 載入的 libG 二進位檔所在的位置
PathResolver //協助解析各種檔案的物件
PreloadLibraryPaths // 預載節點二進位檔 (例如 DSOffice.dll) 所在的位置
AdditionalNodeDirectories // 其他節點二進位檔所在的位置
AdditionalResolutionPaths // 載入資源庫時可能需要的其他相依性的額外組合解決方案路徑
UserDataRootFolder // 使用者資料資料夾,例如 "AppData\Roaming\Dynamo\Dynamo Revit"
CommonDataRootFolder // 用於儲存自訂定義、範例等的預設資料夾。
Context // 整合者主體名稱 + 版本 (Revit<BuildNum>)
SchedulerThread // 實作 ISchedulerThread
的整合者排程器執行緒 - 對於大多數整合者而言,這是主要 UI 執行緒或可存取其 API 的任何執行緒。
StartInTestMode // 目前階段作業是否為測試自動化階段作業 - 修改一堆 Dynamo 行為 - 除非您正在撰寫測試,否則請不要使用。
AuthProvider // 整合者的 IAuthProvider 實作,例如 RevitOxygenProvider 實作是在 Greg.dll - 用於 packageManager 上傳整合。
預設偏好設定路徑由 PathManager.PreferenceFilePath
(例如 "AppData\\Roaming\\Dynamo\\Dynamo Revit\\2.5\\DynamoSettings.xml"
) 管理。整合者可以決定是否也要將自訂的偏好設定檔案遞送到需要與路徑管理員一致的位置。以下是序列化的偏好設定性質:
IsFirstRun // 表示是否是第一次執行此版本的 Dynamo,例如用於判斷是否需要顯示 GA 選擇加入/退出訊息。也會用於判斷在啟動新的 Dynamo 版本時,是否需要移轉舊式 Dynamo 偏好設定,讓使用者獲得一致的體驗
IsUsageReportingApproved // 指出使用情況報告是否已核准
IsAnalyticsReportingApproved // 指出分析報告是否已核准
LibraryWidth // Dynamo 左側資源庫面板的寬度。
ConsoleHeight // 主控台顯示的高度
ShowPreviewBubbles // 指出是否應顯示預覽標示圈
ShowConnector // 指出是否顯示連接器
ConnectorType // 指出連接器類型:Bezier 或 Polyline (聚合線)
BackgroundPreviews // 指出指定背景預覽的作用中狀態
RenderPrecision // 彩現精確度等級 - 越低表示會產生三角形數越少的網格。越高表示會在背景預覽中產生越平滑的幾何圖形。128 對於預覽幾何圖形是一個很適合可靠的數字。
ShowEdges // 指出是否將彩現曲面和實體邊
ShowDetailedLayout // 未使用
WindowX、WindowY // Dynamo 視窗的最後 X、Y 座標
WindowW、WindowH // Dynamo 視窗的最後寬度、高度
UseHardwareAcceleration // Dynamo 是否應使用硬體加速 (如果支援)
NumberFormat // 用於在預覽標示圈 toString() 中顯示數字的小數精確度。
MaxNumRecentFiles // 要儲存的最近檔案路徑最大數目
RecentFiles // 最近開啟的檔案路徑清單,修改此設定會直接影響 Dynamo 開始頁面中的最近使用檔案清單
BackupFiles // 備份檔案路徑清單
CustomPackageFolders // 包含 zero-touch 二進位檔和目錄路徑的資料夾清單,系統會掃描這些資料夾中是否有套件和自訂節點。
PackageDirectoriesToUninstall // Package Manager 用來判斷哪些套件被標記為刪除的套件清單。在 Dynamo 啟動期間會刪除這些路徑 (如果可以)。
PythonTemplateFilePath // 建立新的 PythonScript 節點時用作起始樣板的 Python (.py) 檔案路徑 - 可用來設定自訂 Python 樣板以進行整合。
BackupInterval // 指出自動儲存圖表的時間長度 (以毫秒為單位)
BackupFilesCount // 指出要進行的備份數量
PackageDownloadTouAccepted // 指出使用者是否已接受使用條款從 Package Manager 下載套件
OpenFileInManualExecutionMode // 指出「開啟檔案」對話方塊中「以手動模式開啟」勾選方塊的預設狀態
NamespacesToExcludeFromLibrary // 指出哪些名稱空間 (如果有) 不應顯示在 Dynamo 節點資源庫中。字串格式:"[資源庫名稱]:[完整名稱空間]"
序列化偏好設定的範例:
Extensions // 實作 IExtension 的延伸清單,如果為空值,Dynamo 將從預設路徑 (Dynamo 資料夾下的 extensions
資料夾) 載入延伸
IsHeadless // 指出 Dynamo 是否在沒有 UI 的情況下啟動,供分析之用。
UpdateManager // 整合者的 UpdateManager 實作,請參閱上面的描述
ProcessMode // 相當於 TaskProcessMode,如果在測試模式下為 Synchronous (同步),否則為 Asynchronous (非同步) - 這會控制排程器的行為。單一執行緒的環境也可能將此設定為同步。
使用目標 StartConfiguration 啟動 DynamoModel
當 StartConfig 傳入以啟動 DynamoModel
後,DynamoCore 會監督實際的細節,確保 Dynamo 階段作業使用指定的詳細資料正確初始化。DynamoModel
初始化後,個別整合者還需要執行一些設定後的步驟,例如,在 D4R 中訂閱事件以監視 Revit 主體交易或文件更新、Python 節點自訂等。
若要初始化 DynamoViewModel
和 DynamoView
,您需要先建構 DynamoViewModel
- 使用 DynamoViewModel.Start
靜態方法可以完成。請參閱以下內容:
DynamoViewModel.StartConfiguration
的選項比模型的規劃少得多。這些選項通常不需要加以說明 - 除非您正在撰寫測試案例,否則可以忽略 CommandFilePath
。
Watch3DViewModel
參數控制背景預覽和 watch3d 節點如何顯示 3D 幾何圖形。如果要實作必要的介面,可以使用您自己的實作。
若要建構 DynamoView
,只需要 DynamoViewModel
。View 是一個視窗控制項,可以使用 WPF 來顯示。
DynamoSandbox.exe 是一個開發環境,用來測試、使用和試驗 DynamoCore。這個範例很適合用來瞭解如何載入和設置 DynamoCore
和 DynamoCoreWPF
元件。此處可以看到一些進入點
追蹤 是 Dynamo 核心中的一種機制,能夠將資料序列化至 .dyn (dynamo 檔案)。最重要的是,此資料會輸入到 Dynamo 圖表中節點的呼叫點 (Callsite)。
在磁碟中開啟 Dynamo 圖表時,其中儲存的追蹤資料會與圖表的節點重新建立關聯。
追蹤機制:
在 Dynamo 中實作元素繫結
追蹤機制可用於確保物件重新繫結到它們建立的幾何圖形
Callsite 和追蹤機制會處理提供永久的 GUID,節點實作程式可使用此 GUID 重新連結
Callsite
可執行檔包含多個 Callsite。這些 Callsite 用於將執行作業分派到需要分派的各個位置:
C# 資源庫
內建方法
DesignScript 函數
自訂節點 (DS 函數)
TraceSerializer
將 ISerializable
和[Serializable]
標記的類別序列化為追蹤。
將資料的序列化和還原序列化處理到追蹤中。
TraceBinder 控制將還原序列化的資料繫結到執行階段類型。(建立真實類別的例證)
追蹤資料會序列化到 .dyn 檔案中名為 Bindings 的性質內。這是一個 callsite-id -> 資料的陣列。callsite 是在 designscript 虛擬機器中呼叫節點的特定位置/例證。值得一提的是,Dynamo 圖表中的節點可能會被呼叫多次,因此可能會為單一節點例證建立多個 callsite。
不 建議依賴序列化的 base64 編碼資料的格式。
由於函數執行而想要儲存任意資料的原因有很多,但在這種情況下,開發追蹤是為了解決使用者在建置和反覆運算於主體應用程式中建立元素的軟體程式時經常遇到的特定問題。
這是我們稱為 Element Binding
的問題,構想如下:
當使用者開發和執行 Dynamo 圖表時,他們可能會在主體應用程式模型中產生新元素。以我們的例子來說,假設使用者有一個小程式,在建築模型中產生 100 扇門。這些門的數量和位置由他們的程式控制。
使用者第一次執行程式時,會產生這 100 扇門。
之後,當使用者修改程式的輸入並重新執行時 - 他們的程式會 (在沒有元素繫結的情況下) 建立 100 扇新門,舊門會和新門一起在模型中。
由於 Dynamo 是一個即時程式設計環境,且具有 "Automatic"
執行模式 (圖表的變更會觸發新的執行),因此很快就會讓具有許多程式執行結果的模型變得雜亂。
我們發現這通常不是使用者期望的結果,而是啟用元素繫結後,圖表之前執行的結果會進行清理、刪除或修改。執行哪一種動作 (刪除或修改) 則取決於主體 API 的靈活性。啟用元素繫結後,在執行使用者的 Dynamo 程式第 2 次、第 3 次或甚至第 50 次後,模型中只會有 100 扇門。
這不僅僅只是需要能夠將資料序列化到 .dyn 檔案 - 您會在下面看到,DynamoRevit 中有一些基於追蹤建置的機制,可以支援這些重新繫結的工作流程。
現在來說明 Revit 等主體的元素繫結的其他重要使用案例。因為啟用元素繫結後建立的元素會嘗試保留既有的元素 ID (修改既有元素),所以 Dynamo 程式執行後,在主體應用程式中基於這些元素建置的邏輯仍會留存。例如:
回到我們的建築模型範例。
我們先執行一個停用元素繫結的範例 - 這次使用者有一個程式會產生一些建築牆。
他們執行程式,在主體應用程式中產生一些牆。然後他們離開 Dynamo 圖表,使用一般 Revit 工具,將一些窗戶放入這些牆。窗戶會繫結到這些特定的牆,成為 Revit 模型的一部分。
使用者開始回到 Dynamo 並再次執行圖表 - 現在,就像我們上一個範例,他們有兩組牆。第一組牆有窗戶,但新牆沒有。
如果啟用了元素繫結,我們可以在沒有 Dynamo 的情況下,保留在主體應用程式中手動完成的既有工作。例如,如果在使用者第二次執行程式時啟用了繫結,則會修改牆而不是刪除牆,並且會保留在主體應用程式中所做的下游變更。模型會包含有窗戶的牆,而不是兩組不同狀態的牆。
追蹤是 Dynamo 核心中的一種機制 - 它會利用資料呼叫點的靜態變數,將您的資料對應到圖表中函數的呼叫點,如上所述。
它還可讓您在寫入 zero touch Dynamo 節點時,將任意資料序列化至 .dyn 檔案。通常不建議這樣做,因為這意味著可能可轉移的 zero touch 程式碼現在會依賴 Dynamo 核心。
不要依賴 .dyn 檔案中資料的序列化格式 - 請改用 [Serializable] 屬性和介面
另一方面,ElementBinding 是建置在追蹤 API 之上,並實作在 Dynamo 整合 (DynamoRevit、Dynamo4Civil 等) 中。
建議您瞭解追蹤 API 的一些粗略知識,包括:
您可以在以下範例中看到這些內容
若要與 Dynamo 從既有檔案載入或正在產生的追蹤資料進行互動,您可以查看:
DynamoSamples 儲存庫中提供一個直接使用追蹤的 Dynamo 節點範例
該處的類別摘要解釋追蹤的相關要點:
此範例直接使用 DynamoCore 中的追蹤 API,每當特定節點執行時就儲存某些資料。在這種情況下,字典扮演主體應用程式模型的角色,就像 Revit 的模型資料庫一樣。
粗略的設置是:
將靜態 util 類別 TraceExampleWrapper
作為節點匯入 Dynamo。它包含建立 TraceExampleItem
的單一方法 ByString
- 這些是包含 description
性質的一般 .NET 物件。
每個 TraceExampleItem
都序列化為以 TraceableId
表示的追蹤 - 這只是一個包含 IntId
(標記為 [Serializeable]
) 的類別,因此可以使用 SOAP
格式化程式進行序列化。請參閱此處,以取得有關可序列化屬性的更多資訊
您也必須實作此處定義的 ISerializable
介面
此類別是針對我們希望儲存到追蹤中的每個 TraceExampleItem
而建立、經過序列化、base64 編碼,並在圖表儲存時儲存到磁碟,讓繫結可以重新建立關聯,即使之後基於既有元素字典重新開啟圖表時也是如此。在此範例中無法運作得很好,因為字典並不像 Revit 文件一樣持久。
最後,方程式的最後一部分是 TraceableObjectManager
,類似於 DynamoRevit
中的 ElementBinder
- 它管理主體文件模型中的物件與我們在 Dynamo 追蹤中儲存的資料之間的關係。
使用者第一次執行包含 TraceExampleWrapper.ByString
節點的圖表時,會使用新 ID 建立新的 TraceableId
,TraceExampleItem
會儲存在對應至該新 ID 的字典中,我們會在追蹤中儲存 TraceableID
。
下次執行圖表時,我們會尋找追蹤,找到儲存在該處的 ID,找到對應到該 ID 的物件,然後傳回該物件!我們是修改既有的物件而不是建立全新的物件。
連續兩次執行建立單一 TraceExampleItem
的圖表,流程會像這樣:
下一個範例以更真實的 DynamoRevit 節點使用案例說明相同的想法。
在 Dynamo 的最新版本中,TLS (執行緒本端儲存) 使用已取代為靜態成員使用。
我們快速看一下為 DynamoRevit 實作使用元素繫結的節點時會如何,這類似上面給定牆建立範例中使用的節點類型。
上面的程式碼說明牆元素的範例建構函式 - 在 Dynamo 中會從某個節點 (如 Wall.byParams
) 呼叫此建構函式
建構函數執行與元素繫結相關的重要階段是:
使用 elementBinder
檢查是否有任何之前建立的物件在之前的執行中繫結到此 Callsite。ElementBinder.GetElementFromTrace<Autodesk.Revit.DB.Wall>
如果是,則嘗試修改該面牆而不是建立新牆。
否則建立新牆。
刪除我們剛剛從追蹤中擷取的舊元素,然後加入我們的新元素,讓我們將來可以尋找此元素:
目前,每個序列化追蹤物件都是使用 SOAP xml 格式進行序列化 - 這非常詳細,並且重複了很多資訊。然後資料會經過 base64 編碼兩次 - 這在序列化或還原序列化方面效率不高。如果內部格式不是基於此而建立,將來可以改進這一點。同樣地,我們再說一遍,不要依賴靜態序列化資料的格式。
有一些使用案例不需要元素繫結。例如一個使用案例是,一位資深 Dynamo 使用者在開發一個程式,要執行多次以產生隨機分組元素。程式的目的就是每次執行程式時都要額外建立元素。如果沒有停止元素繫結運作的解決方法,這個使用案例就不容易達成。也許可以在整合層級就停用 elementBinding- 但這可能應該是核心 Dynamo 功能。目前還不清楚此功能應該引入的層級:節點層級?Callsite 層級?整個 Dynamo 工作階段?工作區?等等。
這些節點通常可讓使用者以某種方式描述他們希望參考的一組作用中 Revit 文件。使用者參考 Revit 元素的方式有許多種 (如下所述),節點的結果輸出可能是 Revit 元素包裝函式 (DynamoRevit 包裝函式),也可能是某些 Dynamo 幾何圖形 (從 Revit 幾何圖形轉換)。在其他主體整合的環境中進行考量時,瞭解這些輸出類型之間的差異會很有用。
概括來說,說明這些節點概念的一個好方法是將節點當作函數,此函數會接受元素 ID,然後傳回指向該元素的指標,或表示該元素的某個幾何圖形。
DynamoRevit 中有多個 �Selection�
節點,我們可以將這些節點至少分為兩組:
使用者點選 UI:
此品類中的範例 DynamoRevit
節點是 SelectModelElement
、SelectElementFace
這些節點可讓使用者切換到 Revit UI 環境,然後選取一個元素或一組元素,程式會擷取這些元素的 ID,然後執行某個轉換函數 - 可以是建立包裝函式,或是從元素擷取並轉換幾何圖形。執行的轉換取決於使用者選擇的節點類型。
文件查詢:
此品類中的範例節點是 AllElementsOfClass
、AllElementsOfCategory
這些節點可讓使用者在整個文件中查詢一組元素,這些節點通常會傳回指向基礎 Revit 元素的包裝函式。這些包裝函式是 DynamoRevit 體驗不可或缺的一部分,允許使用更進階的功能 (例如元素繫結),並允許 Dynamo 整合者挑選哪些主體 API 會以節點的形式公開給使用者。
使用者使用 SelectModelElement
選取一面 Revit 牆 - 一個 Dynamo 牆包裝函式傳回到圖表中 (在節點的預覽標示圈中可見)
使用者放置 Element.Geometry 節點,並將 SelectModelElement
輸出連接到此新節點 - 使用 libG API 擷取包裝後的牆的幾何圖形,並轉換為 Dynamo 幾何圖形。
使用者將圖表切換到自動執行模式。
使用者在 Revit 中修改原始牆。
圖表自動重新執行,因為 Revit 文件引發某些元素已更新的事件,Selection 節點監看此事件,並看到它所選取元素的 ID 已修改。
D4C 中的工作流程與上述針對 Revit 的描述非常類似,以下是 D4C 中兩組典型的 Selection 節點:
由於 DynamoRevit
中的 Selection 節點實作文件修改更新程式,因此很容易建置無限迴圈:請想像一個節點監看所有元素的文件,然後在此節點下游的某個位置建立新元素。此程式在執行時會觸發迴圈。DynamoRevit
會嘗試使用交易 ID 以各種方式擷取這些案例,並避免在元素建構函式輸入未變更時修改文件。
如果在主體應用程式中修改所選元素時啟動圖表的自動執行,則需要考慮這一點!
DynamoRevit
中的 Selection 節點是在參考 WPF 的 RevitUINodes.dll
專案中實作 (這可能不是問題),但取決於您的目標平台。
透過從一般 SelectionBase
類型 SelectionBase<TSelection, TResult>
和一組最少的成員數繼承來實作 Selection 節點:
實作 BuildOutputAST
方法 - 此方法在節點要執行時需要傳回一個 AST,這會在將來某個時間點執行。如果是 Selection 節點,它應該從元素 ID 傳回元素或幾何圖形。https://github.com/DynamoDS/DynamoRevit/blob/master/src/Libraries/RevitNodesUI/Selection.cs#L280
實作 BuildOutputAST
是實作 NodeModel
/ UI 節點最困難的一個部分。最好將盡可能多的邏輯放入 C# 函數中,並簡單地將 AST 函數呼叫節點嵌入到 AST 中。請注意,這裡的 node
是抽象語法樹中的 AST 節點,而不是 Dynamo 圖表中的節點。
序列化 -
因為這些是明確的 NodeModel
衍生類型 (不是 ZeroTouch),所以它們還需要實作一個 [JsonConstructor],在從 .dyn 檔案還原序列化節點期間使用。
主體的元素參考應儲存至 .dyn 檔案,以便在使用者開啟包含此節點的圖表時,仍會設定其選取。Dynamo 中的 NodeModel 節點會使用 json.net 進行序列化,任何公用性質都將使用 Json.net 自動序列化 - 請使用 [JsonIgnore] 屬性只序列化必要的性質。
文件查詢節點稍微簡單一些,因為它們不需要將參考儲存到任何元素 ID,請參閱下面瞭解 ElementQueryBase
類別和衍生類別的實作。執行時,這些節點會呼叫 Revit API 並查詢基礎文件中的元素,並執行前面提到的轉換,轉換成幾何圖形或 Revit 元素包裝函式。
內建套件機制旨在透過利用 PackageLoader
和 PackageManager
延伸實作的 Dynamo 套件載入功能,將更多節點內容與 Dynamo Core 綁定,而不延伸核心本身。
在本文件中,我們將交互使用「內建套件」和「Dynamo 內建套件」詞彙來表示相同的內容。
套件必須具有簽章的二進位進入點,否則不會載入。
請盡可能避免這些套件中出現重大變更。這表示套件內容應該經過自動測試。
語義版本控制,建議使用語義版本控制架構對套件進行版本控制,並在套件描述或文件中傳達給使用者。
自動化測試!請參閱上文,如果使用「內建套件」機制包含套件,對使用者而言它就是產品的一部分,應該像產品一樣進行測試。
高層次的潤飾:圖示、節點文件、本地化的內容。
請勿遞送您或您的團隊無法維護的套件。
請勿以這種方式遞送第三方套件 (參閱上文)。
基本上,您應該要能夠對套件有完整的控制權、進行修復、持續更新,並根據 Dynamo 和產品中的最新變更進行測試。您也需要能夠對其進行簽章。
我們打算讓 Built-In Packages
成為核心功能,即使沒有 Package Manager 的存取權,所有使用者也都能存取這一組套件。目前支援此功能的底層機制是,直接在 Dynamo 核心目錄 (相對於 DynamoCore.dll) 增加一個預設的套件載入位置。
由於某些限制,ADSK Dynamo 用戶端和整合者可以使用此位置來散發其整合特定套件。(例如,Dynamo Formit 整合需要自訂的 Dynamo Formit 套件)。
由於核心和主體特定套件兩者的底層載入機制相同,因此有必要確保以這種方式散發的套件,不會導致使用者混淆核心的 Built-In Packages
套件和只能在單一主體產品中使用的整合特定套件。我們建議,為了避免使用者混淆,請與 Dynamo 團隊討論後再引入主體特定套件。
由於 Built-In Packages
中包含的套件將提供給更多客戶,我們對此也會做出更嚴格的保證 (參閱上文),因此這些套件應該經過本地化。
對於要納入 Built-In Packages
的內部 ADSK 套件 - 因為套件不一定需要發佈到 Package Manager,所以目前無法將本地化內容發佈到 Package Manager 的限制並不是阻礙因素。
使用的權宜辦法是,手動建立 (甚至發佈) 套件,並在套件的 /bin 資料夾中包含文化子目錄。
首先在套件 /bin
資料夾下手動建立所需的文化特定子目錄。
如果基於某些原因,也必須將套件發佈到 Package Manager,您必須先發佈缺少這些文化子目錄的套件版本,然後使用 DynamoUI publish package version
發佈新版本的套件。在 Dynamo 中上傳新版本的作業,不能刪除您使用 Windows 檔案總管手動加入的 /bin
下的資料夾和檔案。在 Dynamo 中的套件上傳程序未來將會更新,以便處理本地化檔案的需求。
如果這些文化子目錄與節點/延伸二進位檔位於相同目錄,.net 執行階段載入這些子目錄時就不會發生任何問題。
如需資源組合和 .resx 檔案的更多資訊,請參閱:https://docs.microsoft.com/en-us/dotnet/framework/resources/creating-resource-files-for-desktop-apps。
您可能要使用 Visual Studio 建立 .resx
檔案並進行編譯。對於給定的組合 xyz.dll
- 產生的資源將會編譯為新的組合 xyz.resources.dll
- 如上所述,此組合的位置和名稱非常重要。
產生的 xyz.resources.dll
應位於以下位置:package\bin\culture\xyz.resources.dll
。
若要存取套件中的本地化字串,可以使用 ResourceManager,但是參考已加入 .resx
檔案的組合中的 Properties.Resources.YourLocalizedResourceName
應該更簡單。例如,請參閱:
https://github.com/DynamoDS/Dynamo/blob/master/src/Libraries/CoreNodes/List.cs#L457 瞭解一則本地化錯誤訊息的範例
或 https://github.com/DynamoDS/Dynamo/blob/master/src/Libraries/CoreNodeModels/ColorRange.cs#L19 瞭解一個本地化 Dynamo 特定 NodeDescription 屬性字串的範例。
通常,當 Dynamo 從套件載入節點時,會將這些節點放在節點資源庫的 Addons
區段。為了充份將內建套件節點與其他內建內容整合,我們加入了讓內建套件作者提供部分 layout specification
檔案的功能,以協助將新節點放入 default
資源庫區段中正確的頂層品類。
例如,以下配置規格 json 檔案 (如果在路徑 package/extra/layoutspecs.json
中找到) 會將 path
指定的節點放入 default
區段的 Revit
品類 (即主要的內建節點區段)。
請注意,從內建套件匯入的節點,如果被視為與配置規格中包含的路徑相符時,這些節點會加上 bltinpkg://
字首。
這些複雜的配置修改內容沒有經過充份測試或支援,載入此特定配置規格的目的是為了整個套件名稱空間移到特定主體品類 (如 Revit
或 Formit
) 下。
Dynamo 延伸可以部署到 Package Manager,就像一般 Dynamo 節點資源庫一樣。如果安裝的套件包含視圖延伸,在 Dynamo 載入的執行時期會載入該延伸。您可以查看 Dynamo 主控台,以確認延伸已正確載入。
延伸套件的結構與一般套件的結構相同,其中包含...
假設您已建置延伸,您 (至少) 會有一個 .NET 組合和一個資訊清單檔案。組合應包含實作 IViewExtension
或 IExtension
的類別。資訊清單 .XML 檔案會告訴 Dynamo 要實體化哪個類別,以啟動您的延伸。為了讓 Package Manager 能正確找到延伸,資訊清單檔案應準確對應組合位置和命名。
將任何組合檔放在 bin
資料夾中,將資訊清單檔案放在 extra
資料夾中。此資料夾中也可以放置任何其他資產。
範例資訊清單 .XML 檔案:
一旦您有包含上述子目錄的資料夾,即可推送 (上傳) 到 Package Manager。需要注意的一點是,您目前無法從 Dynamo Sandbox 發佈套件。這表示您需要使用 Dynamo Revit。在 Dynamo Revit 內瀏覽到「套件」=>「發佈新套件」。這會提示使用者登入要與套件關聯的 Autodesk 帳戶。
此時,您應該會在一般的發佈套件視窗中,您將在其中輸入有關套件/延伸的所有必要欄位。還有一個非常重要的額外步驟,您必須確保沒有任何組合檔被標記為節點資源庫。您可以在已匯入的檔案 (上面建立的套件資料夾) 上按一下右鍵確認。此時會顯示一個關聯式功能表,讓您勾選 (或取消勾選) 此選項。應取消勾選所有延伸組合。
在公開發佈之前,請您務必先在本端發佈,以確保所有內容都如預期般運作。確認之後,您就可以選取「發佈」讓套件上線。
若要確認套件已成功上傳,您應該能夠透過在發佈步驟指定的名稱和關鍵字搜尋到套件。最後,請務必注意,您需要重新啟動 Dynamo,相同的延伸才能正常運作。這些延伸通常需要指定 Dynamo 啟動時的參數。
如果您正在開發要發佈為 Dynamo 套件的組合,可以將專案規劃為群組所有必要資產,並將這些資產放在與套件相容的目錄結構中。這可讓專案以套件方式進行快速測試,並模擬使用者的體驗。
有兩種方法可以在 Visual Studio 中建置套件:
透過「專案設定」對話方塊,使用 xcopy 或 Python 指令碼複製必要檔案,加入建置後事件
在 .csproj
檔案中使用「AfterBuild」建置目標,來建立檔案和目錄複製工作
「AfterBuild」是這些類型作業 (以及本指南中介紹的作業) 的偏好方法,因為它不依賴在建置電腦上可能無法使用的檔案複製。
在儲存庫中設定目錄結構,讓原始碼檔案與套件檔案分開。使用 CustomNodeModel 案例研究,將 Visual Studio 專案及所有關聯的檔案放到新的 src
資料夾中。您將會在此資料夾中儲存專案產生的所有套件。資料夾結構現在應如下所示:
將專案檔移到新的
src
資料夾
我們需要確保目標已加到
CustomNodeModel.csproj
檔案 (而不是另一個專案檔) 中,而且專案沒有任何既有的「建置後」設定。
在
</Project>
結束標籤前放置 AfterBuild 目標。
<ItemGroup>
區段中定義了許多變數來表示特定檔案類型。例如,Dll
變數表示輸出目錄中其副檔名為 .dll
的所有檔案。
Copy
工作是將所有 .dll
檔案複製到目錄,具體來說是要建置到的套件資料夾。
Dynamo 套件通常會有 dyf
和 extra
資料夾,分別給 Dynamo 自訂節點和其他資產 (例如影像) 使用。若要建立這些資料夾,我們需要使用 MakeDir
工作。如果資料夾不存在,此工作會建立一個。您可以手動將檔案加到此資料夾中。
如果您建置專案,現在專案資料夾在先前建立的 src
資料夾旁邊應該會有一個 packages
資料夾。packages
目錄內有一個資料夾,其中包含套件所需的所有內容。我們也需要將 pkg.json
檔案複製到套件資料夾,讓 Dynamo 知道要載入套件。
AfterBuild 目標建立的新套件資料夾
專案既有的 src 資料夾
從 AfterBuild 目標建立的
dyf
和extra
資料夾手動複製
pkg.json
檔案。
現在,您可以使用 Dynamo 的 Package Manager 發佈套件,或直接將套件複製到 Dynamo 的套件目錄:<user>\AppData\Roaming\Dynamo\1.3\packages
。
由於原始碼檔案位於不同的資料夾,因此請在 Visual Studio 的 CustomNodeModel.csproj
檔案加入 AfterBuild
目標。這會將必要的檔案複製到新的套件資料夾中。在文字編輯器 (我們使用 ) 中開啟 CustomNodeModel.csproj
檔案,在 </Project>
結束標籤之前放置建置目標。此 AfterBuild 目標會將所有 .dll、.pbd、.xml 和 .config 檔案複製到新的 bin 資料夾中,並建立 dyf 和 extra 資料夾。