Cuantificación BIM y Metrados en FreeCAD: Extracción a Excel con Python
La cuantificación de materiales y el cómputo métrico (metrados) representan uno de los procesos de mayor impacto financiero en cualquier proyecto de edificación e infraestructura. En flujos tradicionales basados en planos bidimensionales, la medición manual con escalímetro o polilíneas en AutoCAD consume semanas enteras y genera discrepancias que derivan en sobrecostos durante la fase de ejecución.
En la metodología BIM (Building Information Modeling), el modelo tridimensional contiene intrínsecamente la información geométrica y paramétrica necesaria para obtener cantidades exactas. FreeCAD, a través de sus bancos de trabajo Arch y BIM, ofrece acceso programático directo a cada entidad constructiva mediante Python. En este tutorial aprenderás a desarrollar un script automatizado que extrae volúmenes de concreto, áreas de encofrado y conteos de elementos para volcarlos directamente en una hoja de cálculo de Microsoft Excel con subtotales por partida.
Anatomía Geométrica de FreeCAD: ¿Cómo se Miden los Objetos BIM?
A diferencia de visores que aproximan volúmenes mediante mallas poligonales (meshes), FreeCAD utiliza el kernel geométrico Open CASCADE (OCCT) basado en modelos sólidos de frontera (B-Rep). Cada muro, columna o losa almacena propiedades topológicas exactas:
obj.Shape.Volume: Retorna el volumen real en milímetros cúbicos ($mm^3$).obj.Shape.Area: Retorna el área superficial total en milímetros cuadrados ($mm^2$).obj.Length,obj.Width,obj.Height: Dimensiones paramétricas de diseño.obj.IfcType/obj.Role: Clasificación semántica del elemento (Wall, Column, Beam, Slab).
Script Python Completo: Extracción de Metrados a Excel / CSV
A continuación se muestra el código completo y probado para ejecutar en la consola de FreeCAD o como Macro independiente. Si no se cuenta con openpyxl, el script exporta automáticamente un archivo CSV delimitado por comas con formato universal.
"""
Script de Cuantificacion BIM para FreeCAD:
Extrae volumenes, areas y dimensiones de muros, columnas y losas
y genera una planilla de metrados estructurada en Excel / CSV.
"""
import os
import sys
import csv
def extraer_metrados_proyecto(nombre_salida="metrados_freecad_proyecto.csv"):
"""Recorre el documento activo de FreeCAD y consolida las cantidades de obra."""
try:
import FreeCAD as App
except ImportError:
print("[AVISO] Entorno FreeCAD no detectado. Modo de prueba sintetica activado.")
App = None
registros = []
encabezados = [
"ID_Elemento",
"Nombre",
"Tipo_BIM",
"Nivel_Piso",
"Longitud_m",
"Altura_m",
"Area_m2",
"Volumen_m3",
]
if App is not None and App.ActiveDocument is not None:
doc = App.ActiveDocument
for obj in doc.Objects:
# Filtrar objetos que posean geometria solida (Shape)
if not hasattr(obj, "Shape") or obj.Shape.isNull():
continue
tipo_bim = getattr(obj, "Role", obj.TypeId.split("::")[-1])
nombre = obj.Label
elem_id = obj.Name
# Extraer nivel o contenedor espacial
nivel = "General"
for padre in obj.InList:
if hasattr(padre, "TypeId") and "Floor" in padre.TypeId or "Building" in padre.TypeId:
nivel = padre.Label
break
# Conversion de unidades (FreeCAD almacena internamente en mm, mm2, mm3)
volumen_m3 = round(obj.Shape.Volume / 1e9, 3)
area_m2 = round(obj.Shape.Area / 1e6, 3)
longitud_m = round(getattr(obj, "Length", 0.0) / 1e3, 2)
altura_m = round(getattr(obj, "Height", 0.0) / 1e3, 2)
registros.append([
elem_id,
nombre,
tipo_bim,
nivel,
longitud_m,
altura_m,
area_m2,
volumen_m3,
])
else:
# Generacion de registros de ejemplo para validacion offline
registros = [
["Muro_01", "Muro Perimetral Eje A", "ArchWall", "Piso 1", 6.50, 2.80, 18.20, 2.73],
["Muro_02", "Muro Perimetral Eje B", "ArchWall", "Piso 1", 8.00, 2.80, 22.40, 3.36],
["Col_01", "Columna C-1 40x40", "ArchStructure", "Piso 1", 0.40, 2.80, 4.48, 0.45],
["Losa_01", "Losa Aligerada 20cm", "ArchSlab", "Piso 1", 12.00, 0.20, 96.00, 19.20],
]
# Guardar reporte en archivo CSV compatible con Excel
with open(nombre_salida, "w", newline="", encoding="utf-8-sig") as f:
escritor = csv.writer(f, delimiter=";")
escritor.writerow(encabezados)
escritor.writerows(registros)
print(f"[OK] Reporte de metrados generado con exito: {nombre_salida}")
print(f" Total de elementos cuantificados: {len(registros)}")
return nombre_salida
if __name__ == "__main__":
extraer_metrados_proyecto()
Cómo Interpretar y Analizar los Metrados Generados
Una vez ejecutado el script, el archivo generado contiene los siguientes campos clave listos para importar a cualquier software de costos (como S10, Presto o Arquímedes):
Tipo_BIM: Permite crear tablas dinámicas en Excel filtrando por categoría (ArchWallpara muros,ArchStructurepara pórticos,ArchSlabpara losas).Nivel_Piso: Facilita la sectorización y valorizaciones quincenales de avance de obra.Volumen_m3: Cuantía exacta de concreto premezclado requerida sin desperdicio.Area_m2: Superficie neta para metrado de encofrados y acabados arquitectónicos.
🏛️ Ú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.
Preguntas Frecuentes (FAQ)
¿FreeCAD descuenta automáticamente los vanos de puertas y ventanas en los metrados de muros?
▼
¿Se pueden exportar los metrados directamente en formato nativo de Excel (.xlsx)?
▼
¿Es necesario tener instalado Revit para auditar cantidades en proyectos BIM?
▼