Crear un archivo de dibujo

Cada módulo de digi21.io tiene, además de open, una función create que crea un archivo de dibujo y devuelve un DrawingWriter. Con él se escriben geometrías creadas desde Python o leídas de otro archivo, así que sirve tanto para generar un dibujo desde cero como para convertir un archivo de un formato a otro.

Módulo Formato
digi21.io.bindouble BinDouble (.bind)
digi21.io.bin Bin (.bin)
digi21.io.asciidigi ASCII Digi (.asc)
digi21.io.dgn MicroStation DGN (.dgn)
digi21.io.dwg AutoCAD DWG (.dwg)
digi21.io.dxf AutoCAD DXF (.dxf)

Hay más módulos (GeoJSON, KML, SVG, WKT, GeoPackage, SHP, PDF, GeoMedia, PostGIS, IFC y VEC) con sus propias páginas de ejemplo; este tema usa los seis de la tabla.

Los parámetros de cada formato (precisión, versión de AutoCAD, plantilla…) están en la página de su módulo, en el índice de digi21.io.

Crear un archivo BIN desde cero

import digi21.io.bin as bin_
from digi21.base import Line, Point, Polygon, Text

with bin_.create("parcelas.bin", crs="EPSG:25830") as writer:
    writer.add(Point((500010.0, 4400010.0, 650.0), ["VERT"]))
    writer.add(Line(["LINDE"], [(500000, 4400000, 650), (500100, 4400000, 652), (500100, 4400080, 655)]))
    writer.add(Polygon(["PARC"], [(500000, 4400000, 650), (500100, 4400000, 652),
                                  (500100, 4400080, 655), (500000, 4400000, 650)]))
    writer.add(Text("Parcela 12", (500050, 4400040, 653), ["ROTULO"], text_height=2.5))

print(writer.written, "entidades escritas en", writer.path)
4 entidades escritas en parcelas.bin
  • crs es el sistema de coordenadas del archivo, como "EPSG:<código>" o como WKT. Es obligatorio en los seis formatos de la tabla, que lo guardan. El formato BIN lo escribe en parcelas.prj.
  • El bloque with cierra el escritor al terminar. El archivo no está completo hasta que se cierra; sin with, llama a writer.close().
  • El formato BIN guarda los códigos con 6 caracteres como máximo.

Para comprobarlo, se lee con open:

for geometry in bin_.open("parcelas.bin"):
    print(type(geometry).__name__, [c.code for c in geometry.codes], len(geometry), "vértices")
Point ['VERT'] 1 vértices
Line ['LINDE'] 3 vértices
Polygon ['PARC'] 4 vértices
Text ['ROTULO'] 1 vértices

Convertir un archivo BIN a DXF

Se abre el origen con open y se pasa cada geometría al escritor del formato de destino. El sistema de coordenadas se copia con DrawingFile.crs:

import digi21.io.bin as bin_
import digi21.io.dxf as dxf

origen = bin_.open("parcelas.bin")
with dxf.create("parcelas.dxf", crs=origen.crs, version=7) as writer:
    for geometry in origen:
        if not writer.add(geometry):
            print("No se ha escrito:", type(geometry).__name__, [c.code for c in geometry.codes])

print(f"{writer.written} entidades escritas, {writer.rejected} rechazadas")
4 entidades escritas, 0 rechazadas

add devuelve False cuando la geometría no se escribe. Aquí se escriben todas: el exportador de DXF escribe el polígono como un sombreado (HATCH). version=7 escribe un DXF de AutoCAD 2013.

Revisar los avisos del exportador

El exportador informa de lo que ha hecho con cada código en warnings:

for aviso in writer.warnings:
    print(aviso)
No se han localizado parámetros para traducir a DWG/DXF entidades con el código: "(desconocido)". Las entidades con este código se almacenarán en la capa: "(desconocido)".
No se localizó ninguna entrada para traducir el código: VERT. La entidad se ha almacenado en la capa 'VERT'.
No se localizó ninguna entrada para traducir el código: LINDE. La entidad se ha almacenado en la capa 'LINDE'.
No se localizó ninguna entrada para traducir el código: PARC. La entidad se ha almacenado en la capa 'PARC'.
No se localizó ninguna entrada para traducir el código: ROTULO. La entidad se ha almacenado en la capa 'ROTULO'.

Sin tabla de códigos, cada código va a una capa con su nombre. Para asignar capas, colores y niveles, pasa una DigiTab a create:

import digi21.base as base
import digi21.io.bin as bin_
import digi21.io.dxf as dxf

digitab = base.DigiTab.load("Digi.tab.xml")
origen = bin_.open("parcelas.bin", digitab)
with dxf.create("parcelas.dxf", digitab, crs=origen.crs) as writer:
    for geometry in origen:
        writer.add(geometry)

Con DGN, una geometría cuyo código no tiene traducción DGN en la tabla se escribe en un nivel con el nombre del código y con los parámetros por defecto, y warnings lo indica. Para que DGN reciba la traducción de la tabla, importa digi21.io.dgn antes de DigiTab.load (ver digi21.io.dgn).

Errores

Los parámetros incorrectos lanzan ValueError; por ejemplo, olvidar crs:

import digi21.io.dxf as dxf

try:
    dxf.create("sin-src.dxf")
except ValueError as error:
    print(error)
crs is required: this format stores the coordinate reference system. Pass a WKT string or 'EPSG:<code>'.

Los errores del exportador llegan como RuntimeError con su mensaje.

Exportar el dibujo activo desde Digi3D.AI

Un guion del panel de Python puede exportar el dibujo que está abierto en Digi3D.AI con la orden EXPORTAR:

import digi3d

view = digi3d.current_view()
view.run_command("PARAMETROS_IMPORTACION=.dxf 7 0 1 0")
view.run_command(r"EXPORTAR=C:\trabajos\parcelas.dxf")

Sin la orden PARAMETROS_IMPORTACION, EXPORTAR abre el cuadro de diálogo de parámetros del formato y espera a que el usuario lo acepte. Los valores son los mismos que los parámetros de create, en el orden de la página de cada formato en Importadores y exportadores. EXPORTAR también puede abrir un cuadro de diálogo si no consigue transformar las coordenadas del dibujo al sistema del archivo de destino. Este ejemplo no se ha ejecutado.

Véase también