Torna al blog BIM i IFC
Eines i comparatives · 2026-06-03 · 8 min
Llegir conjunts de propietats IFC en Python amb IfcOpenShell
Necessites treure dades de propietats d'un IFC — quantitats, classificacions, Psets personalitzats — cap a un full de càlcul, una base de dades o una comprovació de QA. IfcOpenShell ho redueix a unes quantes línies de Python. Aquí tens el receptari pràctic, incloent-hi la drecera get_psets que tothom voldria haver trobat abans.
Llegir conjunts de propietats IFC en Python amb IfcOpenShell — IFC Viewer Online article cover
Tard o d'hora, tot desenvolupador que treballa a prop del BIM necessita treure dades d'un IFC: quantitats d'elements per a un amidament, classificacions per a un registre, conjunts de propietats personalitzats per a una regla de QA. IfcOpenShell és la biblioteca de codi obert que ho fa viable en Python. Aquest és el camí pràctic — la manera manual per entendre-ho, i la drecera d'una línia per quan només necessites les dades.
Obre el fitxer i troba elements
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")
La manera manual (entén l'estructura)
Els conjunts de propietats no s'emmagatzemen directament a l'element — hi pengen a través d'una relació. L'IsDefinedBy d'un element conté relacions IfcRelDefinesByProperties, cadascuna apuntant a un conjunt de propietats (la RelatingPropertyDefinition). Dins del conjunt, HasProperties llista les propietats individuals, la majoria de les quals són IfcPropertySingleValue amb un Name i un 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}")
La drecera: get_psets()
Val la pena entendre el recorregut manual una vegada, però per a la feina real fes servir la utilitat: ifcopenshell.util.element.get_psets() retorna tots els conjunts de propietats d'un element com un diccionari pla — els noms de Pset com a claus, els diccionaris de propietats com a valors. És molt menys propens a errors que recórrer les relacions tu mateix.
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)
Exporta tots els elements a una taula
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])
On acaba la lectura i comença la visualització
Python és ideal per a l'extracció per lots i la QA automatitzada dins d'un pipeline. Però quan vols examinar a ull els conjunts de propietats d'un element concret — o passar el fitxer a algú que no programa — un visor que mostra els Psets per element en fer clic és el camí més ràpid. Totes dues coses es complementen: automatitza les comprovacions massives, inspecciona visualment els casos límit.
Inspecciona els Psets visualment
Obre el duplex i fes clic a qualsevol element per veure tots els seus conjunts de propietats — les mateixes dades que retorna get_psets(), sense escriure cap codi.
IFC2x3 · 2.4 MB
Obre el visor IFC interactiu
Llegir conjunts de propietats IFC en Python amb IfcOpenShell