BDX
intermediate·3 phút đọc·

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.

Nhận tips mới qua email

Checklist, code snippet và quy trình BIM. Không spam.