Snippet pyRevit: Kiểm tra Parameter tồn tại trước khi ghi giá trị
Ghi parameter hàng loạt thường fail vì một lý do rất tầm thường: vài element không có parameter đó. Script crash ở element thứ 847 trên 2.000, và model của bạn bị cập nhật nửa vời trong một transaction đang mở.
Guard Clause
def set_param_safe(element, param_name, value):
param = element.LookupParameter(param_name)
if param is None or param.IsReadOnly:
return False
param.Set(value)
return True
Dùng trong batch run
from pyrevit import revit, DB
elements = DB.FilteredElementCollector(revit.doc)\
.OfCategory(DB.BuiltInCategory.OST_DuctTerminal)\
.WhereElementIsNotElementType()\
.ToElements()
skipped = []
with revit.Transaction('Update AHU zone tags'):
for el in elements:
if not set_param_safe(el, 'TBT_Zone', 'AHU-01'):
skipped.append(el.Id.IntegerValue)
if skipped:
print('Bo qua {} elements: {}'.format(len(skipped), skipped[:20]))
Tại sao không dùng try/except?
try/except trần che mất lý do tại sao ghi thất bại — parameter read-only, parameter không tồn tại, hay sai storage type đều trông giống nhau. Check tường minh chỉ tốn một dòng và cho bạn danh sách element bị bỏ qua để gửi cho modeler phụ trách.
Một cái bẫy nữa
LookupParameter trả về parameter đầu tiên trùng tên. Nếu family có cả instance parameter và type parameter cùng tên TBT_Zone, bạn có thể ghi nhầm. Đặt prefix shared parameter theo bộ môn (TBT_) và không bao giờ đặt trùng tên giữa instance và type.