digi21.io.ifc
Módulo: digi21.io
Lee y escribe modelos de edificio IFC
(.ifc). El exportador solo escribe caras de edificios, que convierte en muros y forjados.
import digi21.io.ifc as ifc
open
open(path, digitab=None) -> DrawingFile
| Argumento | Tipo | Descripción |
|---|---|---|
path |
str |
Ruta del archivo .ifc. |
digitab |
DigiTab | Tabla de códigos (opcional). Si no se indica, se usa una vacía. |
Devuelve un DrawingFile. Cada elemento del modelo se lee como un
Complex con el código de su clase IFC (IfcWall, IfcSlab…) cuyas
líneas son las aristas del sólido. Si path no existe, lanza FileNotFoundError.
La biblioteca de IFC escribe en la salida estándar una línea como
messageCallback not set. Lost message: Detected IFC version: IFC4X1 al leer el archivo.
create
create(path, digitab=None, crs="") -> DrawingWriter
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
path |
str |
— | Ruta del archivo .ifc. Si existe, se sustituye. |
digitab |
DigiTab | None |
Tabla de códigos. Si no se indica, se usa una vacía. |
crs |
str |
"" |
Opcional. El exportador declara un sistema local fijo. |
El formato no tiene parámetros en la orden PARAMETROS_IMPORTACION.
Qué escribe el exportador:
- Solo caras: líneas o polígonos de más de tres vértices cuyos códigos son
LIMEXTseguido de las componentes x, y y z de su normal. Rechaza cualquier otra geometría, ywarningslo explica. - Una cara cuya normal tiene una z menor que 0,1 es un muro (
IfcWall); el resto, un forjado (IfcSlab). Las dos se extruyen 0,3 m a lo largo de la normal. - Una geometría no repite códigos, así que las componentes iguales de la normal se escriben con
textos distintos:
["LIMEXT", "1", "0", "0.0"]. - Escribe el modelo al cerrar el escritor.
Excepciones de create: ValueError si crs no es válido; FileNotFoundError si la carpeta de
path no existe.
Ejemplos
Los ejemplos de esta página se han ejecutado con Python 3.12; la salida que se muestra es la real.
Crear un modelo con un muro y un forjado
import digi21.io.ifc as ifc
from digi21.base import Line, Polygon
# Cada cara lleva el código LIMEXT seguido de las componentes x, y, z de su normal. Los códigos de una
# geometría no se repiten, así que las componentes iguales se escriben distintas: "0" y "0.0".
muro = Polygon(["LIMEXT", "1", "0", "0.0"], [(10, 0, 0), (10, 5, 0), (10, 5, 3), (10, 0, 3), (10, 0, 0)])
forjado = Polygon(["LIMEXT", "0", "0.0", "1"], [(0, 0, 3), (10, 0, 3), (10, 5, 3), (0, 5, 3), (0, 0, 3)])
with ifc.create("edificio.ifc") as writer:
writer.add(muro)
writer.add(forjado)
print(writer.add(Line(["040645"], [(0, 0, 0), (10, 0, 0)])))
print(writer.written, "escritas,", writer.rejected, "rechazadas")
print(writer.warnings)
False
2 escritas, 1 rechazadas
['IFC only stores faces whose codes are LIMEXT followed by the x, y and z components of their normal.']
Leer y contar por clase IFC
import collections
import digi21.io.ifc as ifc
conteo = collections.Counter()
for geometry in ifc.open("edificio.ifc"):
conteo[(geometry.codes[0].code, type(geometry).__name__, len(geometry))] += 1
for (codigo, tipo, lineas), n in sorted(conteo.items()):
print(codigo, tipo, lineas, "líneas:", n)
messageCallback not set. Lost message: Detected IFC version: IFC4X1
IfcSlab Complex 2 líneas: 1
IfcWall Complex 2 líneas: 1
Convertir las caras de un archivo BinDouble a IFC
import digi21.io.bindouble as bind
import digi21.io.ifc as ifc
origen = bind.open("edificio.bind")
with ifc.create("edificio-convertido.ifc") as writer:
for geometry in origen:
if geometry.code_count == 4 and geometry.codes[0].code == "LIMEXT":
writer.add(geometry)
print(writer.written, "caras escritas")
3 caras escritas
edificio.bind tiene tres caras con el código LIMEXT (dos muros y un forjado) y una línea con otro
código, que el filtro descarta antes de llamar a add.
Véase también
- digi21.io — índice de módulos y lo que tienen en común.
- Complex
- DrawingFile y DrawingWriter
- Formato IFC