Cómo Extraer Propiedades y Mediciones de IFC a Excel con Python

Cómo Extraer Propiedades y Mediciones de IFC a Excel con Python

En la coordinación y gestión de proyectos bajo estándares OpenBIM, el formato IFC (Industry Foundation Classes) se consolida como el vehículo universal para el intercambio de información entre diferentes disciplinas y plataformas (Revit, Archicad, Tekla, Allplan, FreeCAD). Sin embargo, cuando los responsables de costos, presupuestos o aseguramiento de calidad intentan exportar los datos contenidos en el modelo IFC a hojas de cálculo convencionales, frecuentemente se enfrentan a un problema frustrante: las herramientas comerciales básicas exportan tablas planas incompletas donde faltan los parámetros constructivos críticos, los códigos de clasificación y las cantidades base de obra (Base Quantities).

Contenido relacionado:  Cómo Usar IA para Automatizar Planos Estructurales Paso a Paso

La causa de este inconveniente radica en la propia arquitectura del esquema IFC: la información no se encuentra asociada como atributos planos, sino estructurada mediante relaciones semánticas complejas denominadas conjuntos de propiedades (Property Sets o Psets) y conjuntos de cantidades (Quantity Sets o Qto). En esta guía técnica aprenderás cómo utilizar Python y la biblioteca de código abierto IfcOpenShell para extraer de forma exhaustiva, estructurada y automatizada cualquier propiedad y medición hacia Microsoft Excel.


Anatomía Semántica del Estándar IFC: Psets vs QTOs

Para extraer información con precisión matemática, es fundamental distinguir los dos tipos de contenedores de datos que conviven en cualquier entidad constructiva (como un IfcWall o una IfcColumn):

  1. Property Sets (Psets): Contienen metadatos alfanuméricos, parámetros descriptivos y criterios normativos (por ejemplo, Pset_WallCommon.LoadBearing para saber si es muro de carga, o Pset_WallCommon.FireRating para resistencia al fuego).
  2. Quantity Sets (Qto): Almacenan mediciones métricas exactas calculadas por el software de autoría bajo el estándar de BuildingSMART (por ejemplo, Qto_WallBaseQuantities.NetSideArea para área neta de tarrajeo, o Qto_WallBaseQuantities.NetVolume para volumen de concreto).

Script Python Completo: Extractor Universal de Psets y QTOs a Excel / CSV

El siguiente código utiliza el submódulo oficial ifcopenshell.util.element para acceder a todas las propiedades y cantidades asociadas a cada elemento constructivo, volcándolas en una matriz organizada lista para análisis en Excel.

"""
Extractor Universal de Propiedades (Psets) y Mediciones (QTO) de IFC a Excel / CSV.
Utiliza IfcOpenShell para consultar relaciones semanticas complejas.
Requiere: pip install ifcopenshell
"""

import os
import sys
import csv


def extraer_datos_ifc_a_tabla(ruta_ifc="modelo_edificio.ifc", archivo_salida="propiedades_ifc_exportadas.csv"):
    """Extrae atributos, psets y cantidades de elementos constructivos a un archivo CSV."""
    print(f"--- Procesando archivo IFC: {ruta_ifc} ---")

    registros = []
    encabezados = [
        "GlobalId",
        "Tipo_IFC",
        "Nombre",
        "Nivel_Piso",
        "Es_Carga",
        "Longitud_m",
        "Area_Neta_m2",
        "Volumen_Neto_m3",
    ]

    if not os.path.exists(ruta_ifc):
        print(f"[INFO] Archivo '{ruta_ifc}' no encontrado en ruta local. Generando datos demostrativos.")
        registros = [
            ["2X4aBc123D", "IfcWall", "Muro Exterior 20cm", "Piso 1", "True", 6.00, 16.80, 3.36],
            ["2X4aBc124E", "IfcWall", "Tabique Drywall 10cm", "Piso 1", "False", 4.50, 12.60, 1.26],
            ["3Y5bCd225F", "IfcColumn", "Columna Circular C-1", "Piso 1", "True", 0.50, 4.71, 0.59],
            ["4Z6cDe326G", "IfcSlab", "Losa Maciza E=15cm", "Piso 1", "True", 12.00, 72.00, 10.80],
            ["5A7dEf427H", "IfcBeam", "Viga Peraltada VP-1", "Piso 1", "True", 6.00, 7.20, 0.90],
        ]
    else:
        try:
            import ifcopenshell
            import ifcopenshell.util.element as elem_util

            modelo = ifcopenshell.open(ruta_ifc)
            # Clases constructivas clave a inspeccionar
            clases = ["IfcWall", "IfcColumn", "IfcBeam", "IfcSlab"]

            for clase in clases:
                elementos = modelo.by_type(clase)
                for el in elementos:
                    guid = el.GlobalId
                    nombre = getattr(el, "Name", "Sin Nombre")

                    # Nivel espacial
                    nivel_obj = elem_util.get_container(el)
                    nivel = nivel_obj.Name if nivel_obj else "General"

                    # Obtener todos los Psets y QTOs como diccionarios limpios
                    psets = elem_util.get_psets(el)

                    # Extraer propiedades comunes
                    es_carga = "N/A"
                    for pset_name, props in psets.items():
                        if "Common" in pset_name and "LoadBearing" in props:
                            es_carga = str(props["LoadBearing"])
                            break

                    # Extraer cantidades base
                    longitud = 0.0
                    area = 0.0
                    volumen = 0.0
                    for qto_name, quantities in psets.items():
                        if "Quantity" in qto_name or "BaseQuantities" in qto_name:
                            longitud = quantities.get("Length", quantities.get("GrossFootprintArea", 0.0))
                            area = quantities.get("NetSideArea", quantities.get("NetArea", quantities.get("GrossSideArea", 0.0)))
                            volumen = quantities.get("NetVolume", quantities.get("GrossVolume", 0.0))

                    registros.append([
                        guid,
                        clase,
                        nombre,
                        nivel,
                        es_carga,
                        round(float(longitud), 2) if isinstance(longitud, (int, float)) else 0.0,
                        round(float(area), 2) if isinstance(area, (int, float)) else 0.0,
                        round(float(volumen), 2) if isinstance(volumen, (int, float)) else 0.0,
                    ])
        except Exception as e:
            print(f"[ERROR] Error al procesar modelo IFC: {e}")
            return None

    # Guardar en archivo CSV estructurado
    with open(archivo_salida, "w", newline="", encoding="utf-8-sig") as f:
        escritor = csv.writer(f, delimiter=";")
        escritor.writerow(["REPORTE DE PROPIEDADES Y MEDICIONES IFC - OPENBIM"])
        escritor.writerow([])
        escritor.writerow(encabezados)
        escritor.writerows(registros)

    print(f"[OK] Archivo exportado exitosamente: {archivo_salida}")
    print(f"     Total de elementos analizados: {len(registros)}")
    return archivo_salida


if __name__ == "__main__":
    extraer_datos_ifc_a_tabla()

Cómo Procesar el Archivo en Excel para Presupuestos

  1. Importación con Codificación UTF-8: Abre Excel, ve a Datos -> Obtener datos -> Desde archivo de texto/CSV y selecciona delimitador punto y coma (;).
  2. Tablas Dinámicas por Categoría: Inserta una tabla dinámica seleccionando el campo Tipo_IFC en filas y la suma de Volumen_Neto_m3 y Area_Neta_m2 en valores.
  3. Filtro Estructural por Condición de Carga: Utiliza la columna Es_Carga para segregar muros portantes de tabiques de separación interior para cotización diferenciada.
Contenido relacionado:  Cómo Importar Puntos CSV a FreeCAD con Python Paso a Paso

🏛️ Únete al Ecosistema Maestro BIM

Accede a mi repositorio personal de ingeniería OpenBIM. Obtén de inmediato todos los manuales y archivos base (.FCStd y Blender) de Vivienda, Estructuras, Sketcher y Python. Tu acceso es vitalicio e incluye todas las futuras actualizaciones (como Instalaciones y Macros) sin costo adicional.
Asegura tu entrada hoy antes de la próxima subida por actualización de contenidos.

👉 Acceder al Ecosistema Maestro


Preguntas Frecuentes (FAQ)

¿Qué función de IfcOpenShell permite extraer todas las propiedades de un elemento?
▼
La función recomendada es ifcopenshell.util.element.get_psets(elemento), la cual compila de manera automática todos los Property Sets y Quantity Sets en un diccionario nativo de Python.
¿Por qué algunas mediciones en archivos IFC aparecen con valor cero en Excel?
▼
Ocurre habitualmente cuando el modelo original se exportó sin activar la opción de cantidades base (Base Quantities) en el software de autoría, como Revit o Archicad.
¿Funciona este método con esquemas IFC2x3 e IFC4 indistintamente?
▼
Sí. La biblioteca IfcOpenShell maneja de forma transparente tanto esquemas IFC2x3 como IFC4 e IFC4.3, adaptando las consultas relacionales automáticamente.


Deja un comentario

CONSTRUYE MEJOR - Herramientas Digitales para construcción
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.