Código
Leer una cantidad simple de un archivo IFC
Usa IfcOpenShell para leer una cantidad ya almacenada en un elemento — y para detectar cuándo el archivo no tiene ningún conjunto de cantidades. El takeoff derivado de geometría es otro problema.
IFC puede llevar cantidades que alguien ya almacenó en un elemento (IfcElementQuantity / conjuntos Qto). Eso no es lo mismo que calcular una cubicación a partir de la geometría, y no sustituye un presupuesto de cantidades firmado en la oficina. Este tutorial lee lo que hay en el archivo, convierte valores relacionados con longitud con la unidad del proyecto y falla en voz alta cuando falta la cantidad.
No pegues esquema EXPRESS ni tablas con copyright de buildingSMART en un notebook. Usa la librería y la documentación del esquema en la fuente.
Detecta primero
IfcOpenShell es un proyecto independiente de código abierto. Instálalo en tu entorno. Este sitio no lo empaqueta.
def require_ifcopenshell():
try:
import ifcopenshell
import ifcopenshell.util.element as element_util
import ifcopenshell.util.unit as unit_util
except ImportError as exc:
raise SystemExit(
"IfcOpenShell is not importable in this interpreter. "
"Install ifcopenshell in the same environment you use for BIM scripts. "
"This tutorial does not bundle IFC tooling."
) from exc
return ifcopenshell, element_util, unit_util
Requisitos previos
- Python 3 e IfcOpenShell importable (paso de detección)
- Un archivo IFC que tú hayas exportado (este artículo no envía un modelo)
- El hábito de conversión de unidades: un real crudo de IFC no es «metros» hasta que aplicas la unidad del proyecto
Qué significa aquí «una cantidad simple»
Leemos cantidades unidas por las relaciones habituales de IFC y expuestas por ifcopenshell.util.element.get_psets(..., qtos_only=True). Nombres típicos que puedes ver en exportaciones IFC4 incluyen conjuntos como cantidades base de viga — si el exportador las escribió. Muchos archivos tienen mapas Qto vacíos. Eso es un resultado válido, no un bug de la librería.
No hacemos:
- triangular el sólido e integrar el volumen como «la» cantidad
- copiar tablas de clasificación ni extractos de esquema
- inventar un volumen cuando falta el Qto
Implementación
Pasa la ruta en la línea de comandos. Imprime la escala de longitud a metros SI y luego lista cada IfcBeam (cae a IfcWall si el archivo no tiene vigas) con sus conjuntos de cantidades.
import sys
ifcopenshell, element_util, unit_util = require_ifcopenshell()
if len(sys.argv) < 2:
raise SystemExit("usage: python read_qto.py path/to/model.ifc")
path = sys.argv[1]
model = ifcopenshell.open(path)
length_to_si = unit_util.calculate_unit_scale(model)
print(f"project length unit → metres, scale = {length_to_si}")
products = model.by_type("IfcBeam") or model.by_type("IfcWall")
if not products:
raise SystemExit("no IfcBeam or IfcWall in this file")
missing_qto = 0
for product in products[:20]:
name = product.Name or "(unnamed)"
gid = product.GlobalId
qtos = element_util.get_psets(product, qtos_only=True) or {}
print(f"{gid} {name}")
if not qtos:
missing_qto += 1
print(" (no quantity sets)")
continue
for qset_name, values in qtos.items():
print(f" {qset_name}:")
for key, raw in values.items():
if key == "id":
continue
print(f" {key} = {raw!r}")
print(f"elements inspected = {min(len(products), 20)}")
print(f"elements with no Qto = {missing_qto}")
Si necesitas una longitud en metros y el valor está almacenado como un real de longitud del proyecto, multiplica por length_to_si. Área y volumen necesitan la escala a la segunda y tercera potencia. Aplicar la escala de longitud una sola vez a un volumen es un error de unidades — la misma familia que mezclar mm y m en un script de viga.
get_psets también devuelve conjuntos de propiedades que no son cantidades. Este script pide qtos_only=True para que no trates un IfcPropertySingleValue con nombre de cantidad como un Qto.
Validación
- Corre el script en un archivo que sepas que tiene Qto (tu propia exportación con cantidades activadas) y en uno que no. La segunda corrida debería reportar Qto faltante, no un número fabricado.
- Contrasta
calculate_unit_scalecon la unidad de longitud del proyecto que fijaste en la herramienta de autoría (metros frente a milímetros es la bifurcación habitual). Si la herramienta dijo milímetros y la escala no es 1e-3, para e inspeccionaIfcUnitAssignment. - Elige un elemento. Compara el volumen o la longitud impresos con la misma cantidad en la interfaz nativa BIM. Si discrepan, no creas en ninguno a ciegas: los exportadores remapean nombres, omiten Qto o guardan valores derivados de geometría bajo otro conjunto.
- Confirma que no multiplicaste un volumen por
length_to_sisolo una vez. Un desajuste de 1e3 o 1e9 es casi siempre el exponente de la escala de unidades.
Errores habituales
- Asumir que todo archivo IFC4 tiene
Qto_*BaseQuantities. Muchos modelos de coordinación las omiten. - Tratar
NetVolumedel software A como comparable aGrossVolumedel software B sin leer ambos nombres. - Usar el volumen de la caja envolvente de geometría como sustituto cuando falta el Qto, y luego etiquetarlo como cantidad IFC.
- Abrir el archivo con un IfcOpenShell distinto del que probaste — los ayudantes de esquema cambian entre versiones mayores.
Limitaciones
- Esto es una lectura de cantidades almacenadas. No es un motor de cubicación, no es una cascada de costos y no es una afirmación de que la cantidad IFC coincida con las reglas de medición de obra.
- Las unidades de área y volumen deben seguir las dimensiones de la unidad del proyecto. Algunos archivos mezclan longitud SI con área no SI; inspecciona las unidades en lugar de asumir una sola escala.
- Tipos de elemento, nombres Qto y diferencias IFC2x3 frente a IFC4 son mayores que esta página. La documentación oficial del esquema está en buildingSMART. No extraigas texto de esquema con copyright al artículo.
ifcopenshell.opendebe recibir una ruta que tengas permiso de leer. Este tutorial no descarga modelos.
Contexto profesional
Una cantidad en IFC es evidencia de lo que escribió el exportador, no de lo que se construyó. Para medición contractual, las reglas vigentes, el método de medición y el registro firmado viven fuera del archivo. Usa este script para ver la carga útil, y luego valida contra el modelo nativo y el procedimiento de la oficina.
Referencias
- Documentación de IfcOpenShell y ayudantes
util.element/util.unit. https://docs.ifcopenshell.org/ - buildingSMART International. Documentación de esquema IFC y de conjuntos de cantidades (léela en la fuente; no reproduzcas tablas aquí).
- Trampas de escala de unidades: el tutorial compañero
unit-conversion-pitfalls-civil-scripts.