Torna al blog BIM e IFC
Strumenti e confronti · 2026-06-03 · 8 min
Leggere i set di proprietà IFC in Python con IfcOpenShell
Devi estrarre i dati delle proprietà da un IFC — quantità, classificazioni, Pset personalizzati — e portarli in un foglio di calcolo, un database o un controllo di QA. Con IfcOpenShell bastano poche righe di Python. Ecco il ricettario pratico, incluso il metodo rapido get_psets che tutti avrebbero voluto scoprire per primo.
Leggere i set di proprietà IFC in Python con IfcOpenShell — IFC Viewer Online article cover
Prima o poi ogni sviluppatore che lavora vicino al BIM deve estrarre dati da un IFC: quantità degli elementi per un computo, classificazioni per un registro, set di proprietà personalizzati per una regola di QA. IfcOpenShell è la libreria open source che rende questo compito gestibile in Python. Questo è il percorso pratico — il modo manuale per capire come funziona, e la scorciatoia in una riga per quando serve solo il dato.
Apri il file e trova gli elementi
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")
Il modo manuale (capire la struttura)
I set di proprietà non sono memorizzati direttamente sull'elemento — vi sono agganciati tramite una relazione. L'IsDefinedBy di un elemento contiene relazioni IfcRelDefinesByProperties, ciascuna delle quali punta a un set di proprietà (il RelatingPropertyDefinition). All'interno del set, HasProperties elenca le singole proprietà, la maggior parte delle quali sono IfcPropertySingleValue con un Name e 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 scorciatoia: get_psets()
Vale la pena capire una volta l'attraversamento manuale, ma per il lavoro reale usa l'utility: ifcopenshell.util.element.get_psets() restituisce ogni set di proprietà di un elemento come un semplice dizionario — i nomi dei Pset come chiavi, i dizionari di proprietà come valori. È molto meno soggetto a errori rispetto a percorrere le relazioni a mano.
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)
Esporta ogni elemento in una tabella
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])
Dove finisce la lettura e inizia la visualizzazione
Python è ideale per l'estrazione in batch e per la QA automatizzata in una pipeline. Ma quando vuoi dare un'occhiata ai set di proprietà di un elemento specifico — o consegnare il file a qualcuno che non scrive codice — un viewer che mostra i Pset per elemento al clic è la strada più veloce. I due approcci si completano a vicenda: scripta i controlli di massa, ispeziona visivamente i casi limite.
Ispeziona i Pset visivamente
Apri il duplex e clicca su qualsiasi elemento per vedere i suoi set di proprietà completi — gli stessi dati restituiti da get_psets(), senza scrivere una riga di codice.
IFC2x3 · 2.4 MB
Apri il visualizzatore IFC interattivo
Leggere i set di proprietà IFC in Python con IfcOpenShell