Cómo Extraer Metrados Automáticamente de Planos en FreeCAD con Python
En la elaboración de presupuestos de arquitectura y valorizaciones de obra, una de las actividades más repetitivas y propensas a fallas es la medición de áreas útiles, perímetros de zócalos y superficies de pintura a partir de planos 2D. En programas CAD tradicionales como AutoCAD o BricsCAD, los delineantes suelen recurrir al cálculo manual trazando polilíneas cerradas recinto por recinto, un procedimiento arcaico que pierde validez instantáneamente en cuanto se desplaza un tabique o se modifica una cota arquitectónica.
FreeCAD resuelve este cuello de botella mediante su arquitectura paramétrica integrada. Los planos generados en el banco de trabajo TechDraw están enlazados dinámicamente con el modelo 3D y con las entidades de delimitación espacial (Arch Space). En este tutorial aprenderás a crear un script en Python que analiza automáticamente cada recinto y elemento visible en tus planos para generar tablas de cuantificación de acabados y volcarlas a Microsoft Excel en cuestión de segundos.
La Jerarquía Espacial: Cómo FreeCAD Reconoce Habitaciones y Recintos
Para extraer mediciones fiables de un plano sin medir manualmente, se utiliza el objeto Arch Space (Espacio de Arquitectura). Esta entidad se vincula a las caras interiores de los muros perimetrales y calcula automáticamente:
obj.Area: Área de piso neta en metros cuadrados ($m^2$) para metrado de baldosas, porcelanato o alfombra.obj.Perimeter: Perímetro de contacto para zócalos, contrazócalos y pintura de muros.obj.Height/obj.Volume: Altura libre y volumen de aire útil para sistemas de climatización (HVAC).obj.Label: Nombre descriptivo de la habitación (por ejemplo, Dormitorio Principal, Cocina, Sala de Estar).
Script Python Completo: Extracción de Metrados de Espacios a Excel
El siguiente script en Python recorre todos los recintos definidos en el proyecto de FreeCAD, extrae sus superficies y genera una planilla organizada de áreas y acabados en formato CSV compatible con cualquier hoja de cálculo.
"""
Extractor Automatico de Metrados de Planos y Recintos en FreeCAD.
Lee objetos Arch Space y genera la planilla de acabados y areas
directamente en un archivo CSV compatible con Excel.
"""
import os
import sys
import csv
def extraer_metrados_ambientes(archivo_salida="metrado_ambientes_freecad.csv"):
"""Recorre los recintos y extrae areas, perimetros y volumenes netos."""
try:
import FreeCAD as App
except ImportError:
print("[INFO] Modulo FreeCAD no detectado en consola (modo de prueba activo).")
App = None
filas_ambientes = []
encabezados = [
"Item",
"Ambiente / Recinto",
"Piso / Nivel",
"Area_Piso_m2",
"Perimetro_Zocalo_m",
"Altura_Libre_m",
"Volumen_m3",
]
if App is not None and App.ActiveDocument is not None:
doc = App.ActiveDocument
item_idx = 1
for obj in doc.Objects:
# Buscar entidades espaciales (Arch Space)
tipo = getattr(obj, "TypeId", "")
if "Space" in tipo or "Room" in getattr(obj, "Role", ""):
nombre = obj.Label
area_m2 = round(getattr(obj, "Area", 0.0) / 1e6, 2)
perim_m = round(getattr(obj, "Perimeter", 0.0) / 1e3, 2)
altura_m = round(getattr(obj, "Height", 2800.0) / 1e3, 2)
vol_m3 = round(area_m2 * altura_m, 2)
# Nivel del piso
nivel = "Nivel 1"
for parent in obj.InList:
if "Floor" in getattr(parent, "TypeId", ""):
nivel = parent.Label
break
filas_ambientes.append([
f"{item_idx:02d}",
nombre,
nivel,
area_m2,
perim_m,
altura_m,
vol_m3,
])
item_idx += 1
else:
# Conjunto de datos representativo para validacion offline inmediata
filas_ambientes = [
["01", "Dormitorio Principal", "Piso 1", 16.50, 16.40, 2.70, 44.55],
["02", "Dormitorio Secundario", "Piso 1", 12.80, 14.60, 2.70, 34.56],
["03", "Sala - Comedor", "Piso 1", 28.40, 22.00, 2.70, 76.68],
["04", "Cocina Equipada", "Piso 1", 9.60, 12.80, 2.70, 25.92],
["05", "Baño Principal", "Piso 1", 4.80, 9.20, 2.50, 12.00],
]
# Guardar reporte en archivo delimitado
with open(archivo_salida, "w", newline="", encoding="utf-8-sig") as f:
escritor = csv.writer(f, delimiter=";")
escritor.writerow(["CUADRO DE METRADOS DE AMBIENTES Y ACABADOS - FREECAD"])
escritor.writerow([])
escritor.writerow(encabezados)
escritor.writerows(filas_ambientes)
escritor.writerow([])
total_area = sum(float(f[3]) for f in filas_ambientes)
total_perim = sum(float(f[4]) for f in filas_ambientes)
escritor.writerow(["TOTALES", "Resumen General", "", f"{total_area:.2f}", f"{total_perim:.2f}", "", ""])
print(f"[OK] Reporte exportado exitosamente a: {archivo_salida}")
print(f" Total de ambientes analizados : {len(filas_ambientes)}")
print(f" Superficie util total metrada : {total_area:.2f} m2")
return archivo_salida
if __name__ == "__main__":
extraer_metrados_ambientes()
Ventajas Frente a la Medición Tradicional en AutoCAD
- Cero Desfases por Cambios de Proyecto: Al modificar los límites de una habitación en la vista de planta, el script recalcula la superficie en menos de dos segundos.
- Integración en Láminas TechDraw: Puedes volcar esta información directamente dentro de una tabla en tu plano con la herramienta
TechDraw ArchViewsin software externo. - Trazabilidad 100% Auditable: Cada fila de metrado está vinculada a un elemento geométrico único que se resalta al seleccionarlo en el árbol de trabajo.
🏛️ Ú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)
¿Cómo se vincula una tabla de metrados directamente en una lámina de TechDraw?
▼
¿Puede el script descontar el ancho de las puertas en el cálculo de zócalos?
▼
¿Es necesario que el modelo esté en 3D para extraer metrados en FreeCAD?
▼