一段時間後,您可能會發現自己不只需要基礎知識,還需要更深入瞭解 Dynamo 的內部運作。本節中的頁面將提供您在 Dynamo for Civil 3D 中解鎖進階功能的藍圖,以便您可以將圖表提升到下一個層次。
雖然 Dynamo 作為視覺程式設計工具的功能非常強大,但它不僅僅只有節點和線路,還能以文字形式撰寫程式碼。有兩種方法可以達到這個目的:
使用程式碼區塊撰寫 DesignScript
使用 Python 節點撰寫 Python
本節會重點介紹如何在 Civil 3D 環境中運用 Python,以善加活用 AutoCAD 和 Civil 3D .NET API。
請查看 Python 一節,以取得有關在 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
我們開始吧!
在開始建置圖表和撰寫程式碼之前,最好先查看 Civil 3D API 文件,瞭解 API 可提供哪些內容。在此案例中,集水區類別中有一個性質,將傳回集水區的邊界點。請注意,此性質會傳回 Point3dCollection
物件,但 Dynamo 不會知道該如何處理這個物件。換言之,我們無法從 Point3dCollection
建立 PolyCurve,因此最終我們需要將所有內容轉換為 Dynamo 點。我們稍後會再說明。
現在,我們可以開始建置圖表邏輯。首先,取得文件中所有集水區的清單。有一些節點可以進行,因此我們不需要在 Python 指令碼中包含這項作業。使用節點可讓其他人 (比起在 Python 指令碼中放入大量程式碼) 更容易閱讀圖表,也可以讓 Python 指令碼只專注在一件事:傳回集水區的邊界點。
請注意,All Objects on Layer 節點的輸出是一個 CivilObject 的清單。這是因為 Dynamo for Civil 3D 目前沒有任何節點可處理集水區,因此我們需要透過 Python 存取 API。
進一步瞭解之前,先需要簡單討論一個重要概念。在節點資源庫一節,我們討論了 Object 與 CivilObject 的關聯方式。再更詳細一點,Dynamo Object 是 AutoCAD Entity 的一個包裝函式。同樣地,Dynamo CivilObject 是 Civil 3D Entity 的一個包裝函式。您可以存取物件的 InternalDBObject
或 InternalObjectId
性質來「拆開」物件。
根據經驗法則,使用 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 部落格閱讀更多有關此項轉換,以及如何升級舊式指令碼的資訊。如果您想要繼續使用 IronPython,只需使用 Dynamo Package Manager 安裝 DynamoIronPython2.7 套件。
這一行會從 Dynamo 幾何圖形資源庫取得我們需要的特定類別。請注意,我們在這裡指定 import Point as DynPoint
,而不是 import *
,因為後者會導致命名衝突。
我們在這裡明確指定哪個輸入埠包含需要的資料,而不是預設的 IN
,後者指的是所有輸入的整個清單。
取得圖面中所有集水區的邊界幾何圖形。
Dynamo 類型 | 包裝 |
---|---|
任務完成!
Object Autodesk.AutoCAD.DynamoNodes.Object
Entity Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
Entity Autodesk.Civil.DatabaseServices.Entity
Dynamo for Civil 3D 包含功能非常強大的機制,可「記住」每個節點建立的物件。此機制稱為物件併入,它可讓 Dynamo 圖表在每次在同一個文件中執行時產生一致的結果。雖然在許多情況下這非常理想,但有時候,您可能想要對 Dynamo 的行為有更多控制。本節將協助您瞭解物件併入如何運作,以及如何利用此機制。
考慮這個在模型空間中的目前圖層上建立圓的圖表。
請注意半徑變更時所發生的情況。
這是物件併入處於作用中的情況。Dynamo 的預設行為是_修改_圓的半徑,而不是每次半徑輸入變更時就建立一個新的圓。這是因為每次執行圖表時,Object.ByGeometry 節點會「記住」它建立了這個_特定的_圓。此外,Dynamo 會儲存此資訊,以便下次您開啟 Civil 3D 文件並執行圖表時,圖表就會有完全相同的行為。
我們來看一個您要變更 Dynamo 預設物件併入行為的範例。假設您要建置一個將文字放在圓中央的圖表。但是,您使用此圖表的目的是,可以一直重複執行圖表,而每次執行時無論選取哪個圓,都可以放置新的文字。這是圖表的外觀。
但是,以下是實際上選取不同圓時所發生的情況。
看起來每次執行圖表後,文字就會刪除再重新建立。實際上,文字的位置是根據選取的圓做了_修改_。所以它是相同的文字,只是位置不同!為了每次都能建立新文字,我們需要修改 Dynamo 的物件併入設定為不要保留併入資料 (請參閱下面的#binding-settings)。
進行這項變更後,我們會得到我們想要的行為。
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 播放器執行圖表多次,它會更新物件而不是建立新物件。如果您在不同圖面上透過 Dynamo 播放器執行圖表,則併入資料仍會保留在原始圖面中,因為併入資料是儲存在圖面中而不是圖表中。
使用時機
如果您要在多個圖面中使用 Dynamo 播放器執行圖表,並「記住」它在每個圖面中所做的動作,請使用此選項。