Chia sẽ BCDD lên mạng xã hội nhé !

Bài viết giải thích chi tiết nhất về code python Dynamo mẫu từ BCDD.

1. Boilerplate Code

Dưới đây là đoạn Python code mẫu mà rất nhiều người sử dụng. Bạn có thể copy hết rồi từ từ lọc ra những dòng code không cần thiết ứng với mỗi python script của mình. Việc lọc ra bớt những dòng code không liên quan sẽ giúp file chạy nhanh hơn.

import clr
import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib')

clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager 
from RevitServices.Transactions import TransactionManager 

TransactionManager.Instance.EnsureInTransaction(doc)
#made to the Revit document's database.
TransactionManager.Instance.TransactionTaskDone()

clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")

import Autodesk 
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication 
app = uiapp.Application 
uidoc = uiapp.ActiveUIDocument

2. Import Mô-đun

import clr
import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib')

Import clr là import mô-đun “Common Language Runtime”. Mô-đun này dùng để làm việc với các thư viện trên nền tảng .NET. Tức là clr giúp liên kết với các thư viện không được viết bằng python (.NET) vào môi trường python.

sys là một thư viện Python cơ bản – ở đây, BCDD sử dụng nó để tải trong các thư viện IronPython tiêu chuẩn

3. Assembly và Namespace phổ biến

Tham chiếu đến các assembly phổ biến và import các namespace tương ứng.

Dùng phương thức AddReference() (nằm trong mô-đun clr) để tham chiếu đến các thư viện chạy trên nền tảng .NET sau đó import các namespace tương ứng theo cú pháp:

clr.AddReference('Assembly')
from Namespace import *

3.1 Thư viện Geometry

Assembly ProtoGeometry

clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

Dòng code 1 dùng để tham chiếu đến ProtoGeometry dll (một assembly). Từ đó namespace “Autodesk.DesignScript.Geometry” của assembly: “ProtoGeometry” đã sẵn sàng để sử dụng. 

Tiến hành, import toàn bộ geometry từ namespace “Autodesk.DesignScript.Geometry” từ dòng code thứ 2 (import * có nghĩa là import toàn bộ mọi thứ có trong Autodesk.DesignScript.Geometry).

Để tối ưu chương trình cũng như tránh xung đột giữa các namespace thì có thể thay thế * bằng các classes cần thiết cách nhau bởi dấu “,”. Ví dụ như sau:

from Autodesk.DesignScript.Geometry import Bounding Box, Coordinate System, Vector

Tuy nhiên, nếu bạn đang ở giai đoạn đầu tập code thì cũng không nên cầu toàn quá vì nó sẽ làm giảm tốc độ học hỏi của bạn, thậm chí gây nản rồi bỏ cuộc nếu mãi không tìm ra câu trả lời cho câu hỏi “tại sao?”. Cứ import tất cả nếu bạn chưa chắc chắn nhé, sau đó khi chương trình chạy rồi thì mình tối ưu sau cũng được.

Bảng dưới đây là các assembly và namespace được sử dụng phổ biến khi làm việc với Python Dynamo

Assembly RevitNodes

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

Tham chiếu đến Assembly “RevitNodes” sau đó import hai namespace là Revit.Elements và Revit.GeometryConversion. 

Dùng để import các nodes trong Dynamo có liên quan đến Revit và conversion giữa Dynamo và Revit Geometry.

Chỉ khi nào làm việc với geometry thì mới tham chiếu đến ProtoGeometry và RevitNodes rồi import các namespace tương ứng

3.2 Transactions

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager 
from RevitServices.Transactions import TransactionManager 

Tham chiếu đến Assembly “RevitServices” sau đó import namespace RevitServices rồi từ đó tiến hành import DocumentManager và TransactionManager. Lần lượt dùng để kích hoạt Revit Document, và quản lý sự thay đổi trên Revit Database.  

TransactionManager.Instance.EnsureInTransaction(doc)
#made to the Revit document's database.
TransactionManager.Instance.TransactionTaskDone()

Cứ mỗi lần người dùng muốn can thiệp vào Revit Database để sửa đổi. Ví dụ như edit cái cửa thì lệnh edit cửa phải nằm trong một transactions, tức là nằm giữa hai dòng code trên. Dòng 1 là mở transactions và dòng 3 để đóng transactions xác thực việc edit.

3.3 Revit API

clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")

import Autodesk 
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *

Tham chiếu đến RevitAPI và RevitAPIUI Assembly và import các chức năng từ namespace Autodesk.Revit.DB và Autodesk.Revit.UI

Tới đây thì tổng kết lại một xíu, trước khi làm gì thì làm chúng ta nên import clr trước. Sau khi đã import clr thì chúng ta mới có thể sử dụng phương thức AddReference() để tham chiếu đến các assembly như RevitAPI, RevitAPIUI, RevitNodes, RevitServices…sau đó thì chúng ta mới có thể import các namespace như Revit, Autodesk.Revit.DB…từ các assemly trên để sử dụng. Từ các namespace này chúng ta mới tiến hành import các classes và từ các classes chúng ta sử dụng các method() và properties cho các dòng code của chúng ta.

4. Revit Document/Application

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication 
app = uiapp.Application 
uidoc = uiapp.ActiveUIDocument

Các đối tượng cấp cao nhất trong RevitAPI là document và application. Chúng được đại diện bởi các classes: Document, UIDocument, Application và UIApplication.

Các biến doc, uiapp, app, uidoc lần lượt đại diện cho Revit document hiện hành, Revit UI document hiện hành, cửa sổ Revit đang mở và Revit UI application đang mở. Nói chung thì các dòng code này là không thể thiếu khi bạn muốn chỉnh sửa Revit Document.

Bạn có thể mở nhiều Revit document (views/sheets…) cùng một lúc (bao gồm cả family), vì vậy bạn cần chỉ định document mà bạn đang hướng tới. Tương tự bạn cũng có thể mở nhiều app Revit cùng một lúc nên cần chỉ định rõ Revit nào là Revit hiện hành. UI class là giao diện người dùng (user interface) như các window hiện lên trong Revit.

Nếu thấy bài viết này hữu ích, hãy cân nhắc việc ủng hộ BCDD tại đây

Bài viết do admin 1 Nghia Nguyen và cộng sự BCDD biên soạn.