digi21.io.dgn
Módulo: digi21.io
Lee y escribe archivos DGN
(.dgn) de MicroStation V8.
import digi21.io.dgn as dgn
Important
Importa digi21.io.dgn antes de cargar la tabla de códigos con DigiTab.load. La primera
tabla que se carga en el proceso solo recibe los elementos iodgn:transform si el módulo ya está
importado. Si se carga antes, todos los códigos se escriben con los parámetros por defecto, en un
nivel con el nombre del código (último ejemplo).
open
open(path, digitab=None) -> DrawingFile
| Argumento | Tipo | Descripción |
|---|---|---|
path |
str |
Ruta del archivo .dgn. |
digitab |
DigiTab | Tabla de códigos (opcional). Si no se indica, se usa una vacía. |
Devuelve un DrawingFile. Cada elemento tiene un solo código: el de su
nivel. El sistema de coordenadas sale del archivo .prj con el mismo nombre que el dibujo. Si path
no existe, lanza FileNotFoundError.
create
create(path, digitab=None, crs="", *, template="", code_criteria=0, use_cell_file=False,
cell_file="", transform_cell_levels=False, import_palette=True, use_dgn_colors=True,
import_cells_as_point=True, spline_increment=1.0, unknown_code_format="$(Level)",
resource_files="") -> DrawingWriter
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
path |
str |
— | Ruta del archivo .dgn. Si existe, se sustituye. |
digitab |
DigiTab | None |
Tabla de códigos. Da a cada código su nivel, color, estilo y grosor (elemento iodgn:transform). Si no se indica, se usa una vacía. |
crs |
str |
"" |
Sistema de coordenadas: un WKT o "EPSG:<código>". Obligatorio. Se escribe en un archivo .prj junto al dibujo. |
template |
str |
"" |
Archivo .dgn que se usa como semilla. Si está vacío, se crea un dibujo nuevo. |
code_criteria |
int |
0 |
Criterio para códigos, de 0 a 18 (0 es Nivel): posición en la lista Criterio para códigos del cuadro de diálogo del formato. Fuera de rango, ValueError. |
use_cell_file |
bool |
False |
Toma las células de un archivo de células de MicroStation. |
cell_file |
str |
"" |
Archivo .cel. Solo se usa si use_cell_file es True. |
transform_cell_levels |
bool |
False |
Asigna a cada elemento de la célula el nivel, el color, el estilo y el grosor del código. Solo se usa si use_cell_file es True. |
import_palette |
bool |
True |
Al abrir un archivo existente, importa su paleta. |
use_dgn_colors |
bool |
True |
Al leer, las entidades toman el color del archivo DGN. |
import_cells_as_point |
bool |
True |
Al leer, las células se convierten en puntos. |
spline_increment |
float |
1.0 |
Distancia entre vértices al convertir las splines en polilíneas al leer. |
unknown_code_format |
str |
"$(Level)" |
Nombre del código que se crea para los elementos sin traducción en la tabla de códigos. |
resource_files |
str |
"" |
Rutas de archivos de recursos de MicroStation separadas por punto y coma. |
Los parámetros a partir de template son los de la orden
PARAMETROS_IMPORTACION
para DGN, en el mismo orden, y se pasan solo por nombre. Su significado detallado está en la
página del formato.
Qué hace el exportador:
Escribe cada código en el nivel, con el color, el estilo y el grosor de su
iodgn:transform:<code name="040645" description="Árbol puntual" type="0" …> <io> <iodgn:transform export="1" level="040645" colorEntity="-1" styleEntity="-1" weightEntity="-1" fillColor="-1" color="1" style="0" weight="1" … />Una geometría cuyo código no tiene
iodgn:transformse escribe en un nivel con el nombre del código y con los parámetros por defecto, ywarningslo indica.Si
iodgn:transformdice que el código no se exporta (export="0"),adddevuelveFalse.Si junto al destino ya hay un
.prjcon el mismo nombre, lo conserva en lugar de escribircrs, ywarningslo avisa.
Excepciones de create: ValueError si falta crs, no es válido o code_criteria está fuera de
rango; 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.
Digi.tab.xml es una tabla de códigos con el iodgn:transform de los códigos 010123, 040645 y
020402.
Crear un archivo desde cero
import digi21.io.dgn as dgn
from digi21.base import DigiTab, Line, Point, Polygon, Text
# La tabla se carga después de importar el módulo: así recibe la traducción a DGN de cada código.
digitab = DigiTab.load("Digi.tab.xml")
with dgn.create("parcelas.dgn", digitab, crs="EPSG:25830") as writer:
writer.add(Point((500010.0, 4400010.0, 650.0), ["010123"]))
writer.add(Line(["040645"], [(500000, 4400000, 650), (500100, 4400000, 652), (500100, 4400080, 655)]))
writer.add(Polygon(["020402"], [(500000, 4400000, 650), (500100, 4400000, 652),
(500100, 4400080, 655), (500000, 4400000, 650)]))
writer.add(Text("Parcela 12", (500050, 4400040, 653), ["020402"], text_height=2.5))
print(writer.written, "escritas,", writer.rejected, "rechazadas")
4 escritas, 0 rechazadas
Leer y contar por nivel y por tipo
import collections
import digi21.io.dgn as dgn
from digi21.base import DigiTab
digitab = DigiTab.load("Digi.tab.xml")
conteo = collections.Counter()
for geometry in dgn.open("parcelas.dgn", digitab):
conteo[(geometry.codes[0].code, type(geometry).__name__)] += 1
for (codigo, tipo), n in sorted(conteo.items()):
print(codigo, tipo, n)
010123 Point 1
020402 Polygon 1
020402 Text 1
040645 Line 1
Convertir un archivo BinDouble a DGN
import digi21.io.bindouble as bind
import digi21.io.dgn as dgn
from digi21.base import DigiTab
digitab = DigiTab.load("Digi.tab.xml")
origen = bind.open("parcelas.bind", digitab)
with dgn.create("parcelas-convertido.dgn", digitab, crs=origen.crs) as writer:
for geometry in origen:
writer.add(geometry)
print(writer.written, "escritas,", writer.rejected, "rechazadas")
4 escritas, 0 rechazadas
parcelas.bind es el archivo que crea el primer ejemplo de digi21.io.bindouble.
Un código sin traducción a DGN
import digi21.io.dgn as dgn
from digi21.base import DigiTab, Line
digitab = DigiTab.load("Digi.tab.xml")
with dgn.create("sin-traduccion.dgn", digitab, crs="EPSG:25830") as writer:
print(writer.add(Line(["LINDE"], [(500000, 4400000, 650), (500100, 4400000, 652)])))
for aviso in writer.warnings:
print(aviso)
print([c.code for g in dgn.open("sin-traduccion.dgn") for c in g.codes])
True
Se ha almacenado en el archivo DGN una entidad con código desconocido: "LINDE". Se ha conservado dicho código en el archivo de dibujo.
Se ha creado el nivel: LINDE
['LINDE']
Los avisos del exportador salen en el idioma de la instalación.
La tabla cargada antes de importar el módulo
from digi21.base import DigiTab, Line
digitab = DigiTab.load("Digi.tab.xml") # antes de importar el módulo de DGN
import digi21.io.dgn as dgn
with dgn.create("orden.dgn", digitab, crs="EPSG:25830") as writer:
print(writer.add(Line(["040645"], [(500000, 4400000, 650), (500100, 4400000, 652)])))
print(writer.written, writer.rejected, writer.warnings)
True
1 0 ['No se han localizado parámetros para traducir a DGNv8 entidades con el código: "010123". Las entidades con este código se almacenarán en el nivel: "010123".', 'No se han localizado parámetros para traducir a DGNv8 entidades con el código: "040645". Las entidades con este código se almacenarán en el nivel: "040645".', 'No se han localizado parámetros para traducir a DGNv8 entidades con el código: "020402". Las entidades con este código se almacenarán en el nivel: "020402".', 'Se ha creado el nivel: 040645']
La geometría se escribe, pero sin el color, el estilo ni el grosor de la tabla.
Véase también
- digi21.io — índice de módulos y lo que tienen en común.
- DrawingFile y DrawingWriter
- Formato DGN