Python 是使用廣泛的程式設計語言,其備受青睞與其語法樣式有很大關係。Python 的可讀性很高,因此較許多其他語言更容易瞭解。Python 支援模組與套件,可嵌入至既有應用程式中。如需如何正常使用 Python 的資訊,Python.org 上的Getting Started 頁面是良好的資源。
現在我們已經示範了如何在 Dynamo 中使用 Python 指令碼,接下來瞭解將 Revit 資源庫連接至指令碼撰寫環境。請記住,我們使用以下程式碼區塊的前四行匯入了 Python 標準和 Dynamo 核心節點。若要匯入 Revit 節點、Revit 元素及 Revit 文件管理員,我們只需再加入幾行程式碼:
這會提供 Revit API 的存取權,以及適用於 Revit 工作的自訂指令碼。透過合併視覺程式設計程序與 Revit API 指令碼,將大幅改進協同合作與工具開發。例如,BIM 管理員與線路圖設計者可以針對同一圖表進行合作。透過這種協同合作,他們可以改善模型的設計與執行。
建立新的 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 中更新參考曲線後,我們得到一個新的樑陣列。
Dynamo 專案的潛在宗旨是拓寬平台的實作範圍。隨著 Dynamo 加入更多程式至事項表,使用者可以從 Python 指令碼撰寫環境存取平台特定 API。雖然在本節中只是對 Revit 進行案例研究,但我們可以預期在將來的更多章節中,會針對在其他平台撰寫指令碼提供全面的自學課程。此外,現在還可以存取許多 資源庫,您可以將這些資源庫匯入 Dynamo!
以下範例示範使用 Python 從 Dynamo 實作 Revit 特定作業的方式。若要更詳細地檢閱 Python 與 Dynamo 及 Revit 之間的關係,請參閱。Python 與 Revit 的另一項有用資源是 專案。
為什麼要在 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 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