1. Foor Loop
For loop được sử dụng để truyền tuần tự. Cùng tìm hiểu qua ví dụ sau:
Ví dụ 1
Từ Dynamo chúng ta tạo 2 list là: tên dự án và tên bộ môn từ Code Block và node List Create. Từ đây sẽ viết 2 vòng lặp trong python script để ghép tên dự án và tên bộ môn lại với nhau.
building_names = IN[0]
discipline_names = IN[1]
Outlist = list()
for bn in building_names:
for dn in discipline_names:
Outlist.append(bn + "_" + dn)
OUT = Outlist
BCDD tạo 2 biến building_names và discipline_names lần lượt là input của tên dự án và tên bộ môn. Sau đó gán một list rỗng cho biến Outlist.
Chạy vòng lặp for cho list tên dự án sau đó chạy tiếp một vòng lặp cho list tên bộ môn (vòng lặp 2 bên trong vòng lặp 1, tức là vòng lặp lồng nhau). Dùng phương thức (method) append để lần lượt ghép các giá trị trong hai biến building_names và discipline_names lại với nhau và thêm vào list rỗng đã gán cho biến Outlist.
Gán Outlist cho biến OUT để xuất giá trị đầu ra, chúng ta có kết quả như hình.
Ví dụ 2
Dùng Dynamo để đặt family theo point. BCDD sẽ chạy 2 vòng lặp để đặt nhiều columns theo 2 phương X, Y và dùng Number Slider để tùy chỉnh số lượng.
Dưới đây là python code để đặt columns theo points. BCDD sẽ đi giải thích chi tiết.
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitNodes')
from Revit.Elements import *
famtype = IN[0]
level = IN[1]
pbc = Point.ByCoordinates(0,0,0)
output = []
x_range = IN[2]
y_range = IN[3]
for x in x_range:
for y in y_range:
pbc = Point.ByCoordinates(x,y,0)
col = FamilyInstance.ByPointAndLevel(famtype,pbc,level)
output.append(col)
OUT = output
Trước tiên chúng ta phải có boilerplate code. Tuy nhiên trong bài toán này BCDD đã loại bỏ hết những dòng code không liên quan nên boilreplate code chỉ còn tinh gọn như sau.
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitNodes')
from Revit.Elements import *
Import clr để có thể tham chiếu đến các assembly như ProtoGeometry và RevitNodes. Ở bài toán này chúng ta cần làm việc với points nên phải cần class point từ namespace Autodesk.DesignScript của assembly ProtoGeometry.
Giả sử BCDD bỏ đi dòng code số 2 hoặc/và 3 thì sẽ nhận được lỗi sau đây:
Muốn đặt columns lên points thì phải load columns family từ Revit nên cần class FamilyInstance từ namespace Revit.Elements
Giả sử BCDD bỏ đi dòng code số 4 hoặc/và 5 thì sẽ nhận được lỗi sau đây:
Tiếp theo chúng ta đi gán các biến đầu vào. Ở đây có 4 biến đầu vào, 1 biến (output) gán với list rỗng và biến pbc gán cho point.
Bốn biến đầu vào lần lượt là family type, level, tọa độ x và tọa độ y
famtype = IN[0]
level = IN[1]
pbc = Point.ByCoordinates(0,0,0)
output = []
x_range = IN[2]
y_range = IN[3]
Tạo points, đặt columns lên points
for x in x_range:
for y in y_range:
pbc = Point.ByCoordinates(x,y,0)
col = FamilyInstance.ByPointAndLevel(famtype,pbc,level)
output.append(col)
Duyệt hai vòng lặp ta có được rất nhiều point. Có family type, có point, có level chúng ta đặt được family.
Cứ mỗi lần duyệt x, y ta có một point từ đó đặt được một column. Sau đó thêm column đó vào output bằng phương thức append()
Trả về các columns (family) dưới dạng một list qua biến OUT
OUT = output
Hoàn thành Dynamo scripts
Dùng node Element.Geometry để lấy tất cả geometry ra Dynamo từ python scripts
Highlight các columns trong Dynamo (cho vui :)))))
Python code trong python script
Các cột được tạo bên Revit từ file Dynamo.
Nếu thấy bài viết này hữu ích, hãy cân nhắc việc follow BCDD tại đây
Bài viết do admin 1 Nghia Nguyen và cộng sự biên soạn.