Volver al blog BIM e IFC
Herramientas y comparativas · 2026-06-03 · 8 min
Leer conjuntos de propiedades IFC en Python con IfcOpenShell
Necesitas extraer datos de propiedades de un IFC —cantidades, clasificaciones, Psets personalizados— y llevarlos a una hoja de cálculo, una base de datos o una comprobación de calidad. Con IfcOpenShell se hace en pocas líneas de Python. Aquí tienes el recetario práctico, incluido el atajo get_psets que todo el mundo desearía haber encontrado antes.
Leer conjuntos de propiedades IFC en Python con IfcOpenShell — IFC Viewer Online article cover
Tarde o temprano, todo desarrollador que trabaja cerca del BIM necesita extraer datos de un IFC: cantidades de elementos para una medición, clasificaciones para un registro, conjuntos de propiedades personalizados para una regla de control de calidad. IfcOpenShell es la librería de código abierto que hace esto manejable en Python. Este es el camino práctico: la forma manual para entenderlo, y el atajo de una línea para cuando solo necesitas los datos.
Abrir el archivo y encontrar elementos
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 forma manual (entender la estructura)
Los conjuntos de propiedades no se almacenan directamente en el elemento: cuelgan de él a través de una relación. El IsDefinedBy de un elemento contiene relaciones IfcRelDefinesByProperties, cada una apuntando a un conjunto de propiedades (el RelatingPropertyDefinition). Dentro del conjunto, HasProperties lista las propiedades individuales, la mayoría de las cuales son IfcPropertySingleValue con un Name y 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}")
El atajo: get_psets()
Merece la pena entender el recorrido manual una vez, pero para el trabajo real usa la utilidad: ifcopenshell.util.element.get_psets() devuelve todos los conjuntos de propiedades de un elemento como un diccionario plano —los nombres de Pset como claves, diccionarios de propiedades como valores—. Es mucho menos propenso a errores que recorrer las relaciones 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)
Exportar todos los elementos a una tabla
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])
Dónde termina la lectura y empieza la visualización
Python es ideal para la extracción por lotes y el control de calidad automatizado dentro de un pipeline. Pero cuando quieres echar un vistazo rápido a los conjuntos de propiedades de un elemento concreto —o entregar el archivo a alguien que no programa—, un visor que muestre los Psets de cada elemento al hacer clic es el camino más rápido. Ambos se complementan: automatiza las comprobaciones masivas mediante script e inspecciona visualmente los casos límite.
Inspecciona los Psets visualmente
Abre el dúplex y haz clic en cualquier elemento para ver todos sus conjuntos de propiedades: los mismos datos que devuelve get_psets(), sin escribir ni una línea de código.
IFC2x3 · 2.4 MB
Abrir el visor IFC interactivo
Leer conjuntos de propiedades IFC en Python con IfcOpenShell