กลับไปยังบล็อก BIM และ IFC
เครื่องมือและการเปรียบเทียบ · 2026-06-03 · 8 นาที
อ่านชุดคุณสมบัติ (Property Set) ของ IFC ด้วย Python และ IfcOpenShell
คุณต้องการดึงข้อมูลคุณสมบัติออกจากไฟล์ IFC ไม่ว่าจะเป็นปริมาณ การจำแนกประเภท หรือ Pset ที่กำหนดเอง เพื่อนำไปใส่สเปรดชีต ฐานข้อมูล หรือการตรวจ QA IfcOpenShell ทำให้งานนี้เหลือโค้ด Python เพียงไม่กี่บรรทัด นี่คือสูตรโค้ดที่ใช้ได้จริง รวมถึงทางลัด get_psets ที่ใคร ๆ ก็อยากรู้จักตั้งแต่แรก
อ่านชุดคุณสมบัติ (Property Set) ของ IFC ด้วย Python และ IfcOpenShell — IFC Viewer Online article cover
ไม่ช้าก็เร็ว นักพัฒนาทุกคนที่ทำงานเกี่ยวข้องกับ BIM ต้องดึงข้อมูลออกจากไฟล์ IFC ไม่ว่าจะเป็นปริมาณขององค์ประกอบสำหรับการถอดปริมาณ (takeoff) การจำแนกประเภทสำหรับทะเบียนรายการ หรือชุดคุณสมบัติ (property set) ที่กำหนดเองสำหรับกฎ QA IfcOpenShell คือไลบรารีโอเพนซอร์สที่ทำให้งานนี้จัดการได้ใน Python บทความนี้คือเส้นทางเชิงปฏิบัติ ทั้งวิธีทำด้วยมือเพื่อให้เข้าใจโครงสร้าง และทางลัดบรรทัดเดียวสำหรับเวลาที่คุณแค่ต้องการข้อมูล
เปิดไฟล์และค้นหาองค์ประกอบ
import ifcopenshell
model = ifcopenshell.open("model.ifc")
# All walls in the file
walls = model.by_type("IfcWall")
print(f"{len(walls)} walls")
# A single element by its GlobalId
el = model.by_guid("3LYa_FRDj3zhLfyYoQv6Jr")
วิธีทำด้วยมือ (เพื่อเข้าใจโครงสร้าง)
ชุดคุณสมบัติไม่ได้เก็บไว้ที่องค์ประกอบโดยตรง แต่ผูกอยู่กับองค์ประกอบผ่านความสัมพันธ์ (relationship) โดย IsDefinedBy ขององค์ประกอบจะเก็บความสัมพันธ์ IfcRelDefinesByProperties ซึ่งแต่ละรายการชี้ไปยังชุดคุณสมบัติหนึ่งชุด (RelatingPropertyDefinition) ภายในชุดนั้น HasProperties จะเก็บรายการคุณสมบัติแต่ละตัว ซึ่งส่วนใหญ่เป็น IfcPropertySingleValue ที่มี Name และ NominalValue
wall = walls[0]
for rel in wall.IsDefinedBy:
if rel.is_a("IfcRelDefinesByProperties"):
pset = rel.RelatingPropertyDefinition
if pset.is_a("IfcPropertySet"):
print(pset.Name) # e.g. "Pset_WallCommon"
for prop in pset.HasProperties:
if prop.is_a("IfcPropertySingleValue") and prop.NominalValue:
print(f" {prop.Name} = {prop.NominalValue.wrappedValue}")
ทางลัด: get_psets()
การไล่ดูด้วยมือคุ้มค่าที่จะทำความเข้าใจสักครั้ง แต่สำหรับงานจริงให้ใช้ยูทิลิตี ifcopenshell.util.element.get_psets() ซึ่งคืนค่าชุดคุณสมบัติทั้งหมดขององค์ประกอบเป็นดิกชันนารี (dictionary) ธรรมดา โดยมีชื่อ Pset เป็นคีย์และดิกชันนารีของคุณสมบัติเป็นค่า วิธีนี้ผิดพลาดได้ยากกว่าการไล่ตามความสัมพันธ์เองมาก
import ifcopenshell.util.element as ue
psets = ue.get_psets(wall)
# {'Pset_WallCommon': {'IsExternal': True, 'FireRating': 'REI 60', 'id': 1234}, ...}
fire_rating = psets.get("Pset_WallCommon", {}).get("FireRating")
# Quantities only (areas, volumes, lengths)
qtos = ue.get_psets(wall, qtos_only=True)
ส่งออกทุกองค์ประกอบเป็นตาราง
import csv
import ifcopenshell.util.element as ue
with open("elements.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["GlobalId", "Class", "Name", "Pset", "Property", "Value"])
for el in model.by_type("IfcBuildingElement"):
for pset_name, props in ue.get_psets(el).items():
for key, value in props.items():
if key == "id":
continue
writer.writerow([el.GlobalId, el.is_a(), el.Name, pset_name, key, value])
จุดที่การอ่านสิ้นสุด และการดูเริ่มต้น
Python เหมาะอย่างยิ่งสำหรับการดึงข้อมูลเป็นชุด (batch) และ QA อัตโนมัติในไปป์ไลน์ แต่เมื่อคุณต้องการดูชุดคุณสมบัติขององค์ประกอบใดองค์ประกอบหนึ่งด้วยตาตัวเอง หรือต้องส่งไฟล์ให้คนที่ไม่ได้เขียนโค้ด โปรแกรมดูที่แสดง Pset ขององค์ประกอบเมื่อคลิกจะเป็นทางที่เร็วกว่า ทั้งสองอย่างเสริมกัน คือเขียนสคริปต์สำหรับการตรวจจำนวนมาก แล้วตรวจดูกรณีพิเศษ (edge case) ด้วยตา
ตรวจดู Pset ด้วยภาพ
เปิดโมเดลบ้านแฝด (duplex) แล้วคลิกองค์ประกอบใดก็ได้ เพื่อดูชุดคุณสมบัติทั้งหมด ซึ่งเป็นข้อมูลเดียวกับที่ get_psets() คืนค่า โดยไม่ต้องเขียนโค้ดเลย
IFC2x3 · 2.4 MB
เปิดโปรแกรมดู IFC แบบอินเทอร์แอกทีฟ
อ่านชุดคุณสมบัติ (Property Set) ของ IFC ด้วย Python และ IfcOpenShell