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

Bài viết này BCDD sẽ chuyển đổi một Dynamo script kinh điển sang Python Dynamo node. Đó là script để get parameters và set parameters. Let’s get started !

1. Dynamo Script

Lấy tất cả dầm kết cấu trong mô hình (có 4 cây =.=)

Lấy ra chiều dài của các dầm kết cấu ấy

Sau đó là lấy giá trị length của các dầm kết cấu và chuyển sang “Comments” parameter

Chúng ta đã có script hoàn chỉnh và giờ thì sẽ chuyển đổi sang Python Dynamo .

2.Python Dynamo

2.1 Import thư viện

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

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

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

doc = DocumentManager.Instance.CurrentDBDocument

uiapp = DocumentManager.Instance.CurrentUIApplication
uidoc = uiapp.ActiveUIDocument

BCDD đã giải thích khá chi tiết về thư viện trong Python Dynamo ở bài viết trước rồi. Đọc giả có thể đọc lại để hiểu thêm.

Xem bài viết: Boilerplate Code Python Dynamo

2.2 Filter Element Collector

Để lấy tất cả dầm kết cấu trong mô hình bằng Python Dynamo thì chúng ta cần dùng đến FilteredElementCollector và phương thức OfClass(). Bạn đọc tham khảo bài viết về FilteredElementCollector để hiểu rõ hơn.

filter_beams = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralFraming).WhereElementIsNotElementType()

Run thử nó ra cái gì. Và kết quả không làm ta thất vọng.

Dòng code trên tương đương với Dynamo bên dưới.

2.3 Get Parameters

Có được danh sách các dầm rồi thì giờ tiến hành chạy vòng lặp for. Chúng ta sử dụng phương thức LookupParameter() để lấy giá trị trong parameters.

for beam in filter_beams:
	copyParameter = beam.LookupParameter("Length")

Chạy thử nó ra cái gì.

Kết quả không như mong muốn. Cái chúng ta cần là length của mấy cái dầm mà. Để lấy được length của các dầm chúng ta cần phải biết các giá trị trong tham số length là kiểu dữ liệu gì. Dùng Dynamo để check thử thì kết  quả như sau.

Zoom đến node cuối cùng lên một xíu để thấy kết quả.

Vậy kiểu dữ liệu của length là Double. Để lấy dữ liệu Double StorageType chúng ta sử dụng phương thức AsDouble().

Nếu kiểu dữ liệu là integers, string hay element ids chúng ta sẽ lần lượt sử dụng các phương thức AsInteger(), AsString(), AsElementId() vân vân và mây mây.

ParameterValue = UnitUtils.ConvertFromInternalUnits(copyParameter.AsDouble(),DisplayUnitType.DUT_MILLIMETERS)

Do đơn vị trong Python Dynamo là imperial nên chúng ta phải chuyển đổi sang metric bằng cách dùng phương thức ConvertFromInternalUnits()

Run thử xem thì thấy khá ok.

2.4 Set Parameters

Tương tự dùng phương thức LookupParameter để lấy Comments và gán biến cho nó. Sau đó tiến hành set parameter.

Vì Comments parameter là kiểu dữ liệu String mà length thì ở kiểu dữ liệu Double như đã điều tra ở trên. Cho nên phải đổi kiểu dữ liệu cho length từ Double sang String (hay giang hồ hay gọi là cast dữ liệu) bằng cú pháp đơn giản str(kieu du lieu double)

Còn một lưu ý nửa, việc chúng ta set dữ liệu cho tham số Comments là đang can thiệp vào Revit database cho nên chúng ta phải thực hiện lệnh set parameter trong một transactions

pasteParameter = beam.LookupParameter("Comments")
	
	TransactionManager.Instance.EnsureInTransaction(doc)
	pasteParameter.Set(str(ParameterValue))
	TransactionManager.Instance.TransactionTaskDone()

Tới đây thì chạy được rồi.

Full Code để get, set parameters trong Python Dynamo

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.

Xem thêm bài viết: