digi21.io.bindouble

Módulo: digi21.io

Lee y escribe archivos BIN doble precisión (.bind), el formato binario de Digi3D.AI con coordenadas en coma flotante de doble precisión. El archivo guarda el sistema de coordenadas en su cabecera.

import digi21.io.bindouble as bind

open

open(path, digitab=None) -> DrawingFile
Argumento Tipo Descripción
path str Ruta del archivo .bind.
digitab DigiTab Tabla de códigos (opcional). Si no se indica, se usa una vacía.

Devuelve un DrawingFile. DrawingFile.crs es el sistema de coordenadas de la cabecera del archivo.

Si path no existe, lanza FileNotFoundError.

create

create(path, digitab=None, crs="", *, data_model="", connection_string="") -> DrawingWriter
Parámetro Tipo Por defecto Descripción
path str — Ruta del archivo .bind. Si existe, se sustituye.
digitab DigiTab None Tabla de códigos. Si no se indica, se usa una vacía.
crs str "" Sistema de coordenadas: un WKT o "EPSG:<código>". Obligatorio. Se guarda en la cabecera del archivo, no en un .prj.
data_model str "" Nombre del modelo de datos de la base de datos de atributos.
connection_string str "" Cadena de conexión de esa base de datos. Si está vacía, no se usa base de datos.

data_model y connection_string son los dos parámetros del formato en la orden PARAMETROS_IMPORTACION, y se pasan solo por nombre. Un valor con comillas dobles y simples a la vez lanza ValueError.

El exportador escribe todos los tipos de geometría de digi21.base: puntos, textos, líneas, polígonos y complejos.

Excepciones de create: ValueError si falta crs o 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. Los ejemplos que usan una base de datos de atributos (data_model y connection_string) no se han incluido.

Crear un archivo desde cero

import digi21.io.bindouble as bind
from digi21.base import Line, Point, Polygon, Text

with bind.create("parcelas.bind", 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

Este parcelas.bind es el archivo de origen de los ejemplos de conversión de las demás páginas de digi21.io.

Leer y contar por tipo y por código

import collections

import digi21.io.bindouble as bind

dibujo = bind.open("parcelas.bind")
print(dibujo.crs[:30])

conteo = collections.Counter()
for geometry in dibujo:
    conteo[(type(geometry).__name__, geometry.codes[0].code)] += 1

for (tipo, codigo), n in sorted(conteo.items()):
    print(f"{tipo:8} {codigo}: {n}")
PROJCS["ETRS89 / UTM zone 30N"
Line     040645: 1
Point    010123: 1
Polygon  020402: 1
Text     020402: 1

Convertir un archivo DXF a BinDouble

import digi21.io.bindouble as bind
import digi21.io.dxf as dxf

origen = dxf.open("plano.dxf")
with bind.create("plano.bind", crs=origen.crs) as writer:
    for geometry in origen:
        writer.add(geometry)

print(writer.written, "escritas,", writer.rejected, "rechazadas")
3 escritas, 0 rechazadas

plano.dxf tiene una línea, un punto y un texto, y su sistema de coordenadas en plano.prj.

El sistema de coordenadas va en la cabecera

import os

import digi21.io.bindouble as bind
from digi21.base import Point

with bind.create("sin-prj.bind", crs="EPSG:4258") as writer:
    writer.add(Point((-3.7038, 40.4168, 657.0), ["010123"]))

print(os.path.exists("sin-prj.prj"))
print(bind.open("sin-prj.bind").crs[:24])
False
GEOGCS["ETRS89",DATUM["E

Véase también