Editar

Órdenes en Python del repositorio ComandosDigi3DPython

El repositorio público ComandosDigi3DPython contiene guiones de Python que Digi3D.AI ejecuta como órdenes. Cada archivo .py es una orden independiente. Los guiones usan el módulo digi3d, que solo existe dentro de Digi3D.AI.

La rama main contiene la versión para Digi3D.AI. La rama Digi3D.NET contiene la versión para las versiones anteriores a Digi3D.AI y no funciona en Digi3D.AI.

Descargar los guiones

Elige una de estas formas:

  • Descarga un archivo: abre el archivo en GitHub y pulsa Download raw file.

  • Descarga el repositorio completo: en la página del repositorio, pulsa Code y después Download ZIP.

  • Clona el repositorio con git:

    git clone https://github.com/digi21/ComandosDigi3DPython.git
    

Dónde se copian los archivos

Cuando escribes en la línea de comandos un nombre que no corresponde a ninguna orden de Digi3D.AI, Digi3D.AI busca un archivo con ese nombre y la extensión .py. Lo busca en estas carpetas, por este orden, y ejecuta el primero que encuentra:

  1. La carpeta del archivo de dibujo activo.
  2. El directorio de macroinstrucciones. Si están activados los proyectos y el proyecto tiene un directorio de macroinstrucciones, Digi3D.AI usa el del proyecto.
  3. La carpeta C:\digi\.
  4. La carpeta del ejecutable de Digi3D.AI.

Copia los archivos .py en el directorio de macroinstrucciones para que estén disponibles con cualquier archivo de dibujo.

La pestaña Macroinstrucciones de la tabla de códigos guarda listas de órdenes, no código Python. Digi3D.AI ejecuta cada línea de una macroinstrucción como una orden. Para que una macroinstrucción ejecute uno de estos guiones, escribe en ella el nombre de la orden, por ejemplo FILTRAR=020124 020123 1, y deja el archivo .py en una de las carpetas anteriores.

Cómo se ejecuta una orden

  • Escribe en la línea de comandos el nombre del archivo sin la extensión .py. El sistema de archivos de Windows no distingue mayúsculas de minúsculas, así que FILTRAR ejecuta filtrar.py.
  • Si la orden recibe parámetros, escribe = después del nombre y los parámetros separados por espacios: FILTRAR=020124 020123 1.
  • La orden PYTHON ejecuta un guion por su nombre de archivo: PYTHON=filtrar.py 020124 020123 1.

Si una orden de la ventana de dibujo tiene el mismo nombre que el archivo, Digi3D.AI ejecuta esa orden y no el guion. Las órdenes de la ventana fotogramétrica se buscan después del archivo .py: si existe el guion, Digi3D.AI ejecuta el guion.

Los parámetros llegan al guion en la variable global argv, una tupla de cadenas. Digi3D.AI separa los parámetros por espacios, tabuladores y signos =, así que un parámetro no puede contener espacios. La página Cómo ejecutar guiones describe estas formas de ejecución y el panel de Guiones Python.

Los guiones que no usan argv también se pueden pegar en el panel Guion Python y ejecutar desde él.

Órdenes del repositorio

Archivo Orden Parámetros
borra_atr.py BORRA_ATR Ninguno
crea_tareas_con_areas_inferior_a_valor.py CREA_TAREAS_CON_AREAS_INFERIOR_A_VALOR Ninguno
crear_tramos_para_unir_curvas.py CREAR_TRAMOS_PARA_UNIR_CURVAS Ninguno
dibuja_texto_extraido_callejero_catastro.py DIBUJA_TEXTO_EXTRAIDO_CALLEJERO_CATASTRO Ninguno. Orden interactiva
dibuja_texto_extraido_servicio_mapas_azure.py DIBUJA_TEXTO_EXTRAIDO_SERVICIO_MAPAS_AZURE Ninguno. Orden interactiva
elimina_curvas_por_equidistancia.py ELIMINA_CURVAS_POR_EQUIDISTANCIA Códigos y equidistancia
filtrar.py FILTRAR Código de maestra, código de fina, equidistancia
redondea_z.py REDONDEA_Z Código de maestra, código de fina
renomcod_manteniendo_atributos.py RENOMCOD_MANTENIENDO_ATRIBUTOS Código origen, código destino
transforma_complejo_a_punto.py TRANSFORMA_COMPLEJO_A_PUNTO Ninguno. Los códigos están escritos en el guion

Todos los guiones usan nombres que existen en la API actual del módulo digi3d. Cada sección enlaza a la página de ejemplo que explica el código completo.

BORRA_ATR

Elimina el enlace a base de datos de todas las geometrías del dibujo. Para cada geometría, el guion crea un clon cuyos códigos son códigos nuevos con el mismo nombre y sin tabla ni registro, añade los clones y borra las geometrías originales. El guion recorre también las geometrías borradas.

clon = entidad.clone()
codes = []
for codigo in entidad.codes:
    codes.append(digi3d.FeatureCode(codigo.code))
clon.codes = tuple(codes)

Explicación completa: Borrar el enlace a base de datos.

CREA_TAREAS_CON_AREAS_INFERIOR_A_VALOR

Añade al panel de tareas una tarea por cada polígono o línea cerrada en planta cuya área, en valor absoluto, es menor que 100. El título de la tarea es el área con tres decimales. Al hacer doble clic en la tarea, la ventana de dibujo se desplaza al centro de la caja envolvente de la geometría. El límite de 100 está escrito en el guion.

if abs(g.area) >= 100:
    continue
...
tarea = digi3d.TaskGotoCoordinates((x, y, z), titulo, "")
digi3d.add_task(tarea)

Explicación completa: Crear tareas con áreas pequeñas.

CREAR_TRAMOS_PARA_UNIR_CURVAS

Compara cada par de geometrías no borradas cuyo primer código es 020123. El guion descarta el par si la Z del primer vértice es distinta o si algún extremo de una geometría coincide con algún extremo de la otra. Si no lo descarta, prueba las combinaciones de extremos en este orden: origen-origen, origen-fin, fin-origen y fin-fin. Con la primera combinación cuyos extremos están a menos de 10 unidades en planta, crea una línea de dos vértices que une esos extremos, con los códigos de la primera geometría. La distancia se calcula con la calculadora geográfica de la ventana de dibujo. Al terminar, si ha creado algún tramo, el guion muestra un globo con el número de tramos y emite el sonido de fin; si no ha creado ninguno, muestra el globo «No se ha añadido nada» y emite el sonido de error. El código 020123 y la distancia 10 están escritos en el guion.

if calculadora.calculate_distance_2d(coordenada_origen_a, coordenada_origen_b) < distancia:
    return [coordenada_origen_a, coordenada_origen_b]
...
linea_anadir = digi3d.Line(curva_a.codes, par_coordenadas)

Explicación completa: Unir curvas de nivel cercanas.

DIBUJA_TEXTO_EXTRAIDO_CALLEJERO_CATASTRO

Orden interactiva. Cada vez que pulsas el botón de dato, la orden envía las coordenadas del punto al servicio web de consulta por coordenadas del Catastro de España e inserta en el punto un texto con el campo ldt de la respuesta, que contiene la calle y el número del inmueble. Cada texto queda en una transacción propia, así que cada UNDO deshace un texto.

El guion solo crea la orden si el código EPSG horizontal de la ventana de dibujo es uno de estos: 4230, 4326, 4258, 32627, 32628, 32629, 32630, 32631, 25829, 25830, 25831, 23029, 23030, 23031. Si no lo es, el guion escribe un mensaje en el panel de resultados. Si el servicio responde con un error, el guion escribe el error en el panel de resultados, emite el sonido de error y muestra un cuadro de mensaje.

class DibujaTextoExtraidoCallejeroCatastro(digi3d.PythonCommand):
    def on_data_down(self, coordenadas):
        calle = self.obten_nombre_calle_servidor_catastro(coordenadas)
        if calle is None:
            return
        self.view.add(digi3d.Text(calle, coordenadas))
        self.view.redraw()
        self.new_transaction()
        return True

Explicación completa: Texto del callejero del Catastro.

DIBUJA_TEXTO_EXTRAIDO_SERVICIO_MAPAS_AZURE

Orden interactiva. El primer dato fija el punto de inserción: la orden convierte el punto a coordenadas geográficas con view.to_geo y consulta el nombre de la calle al servicio de búsqueda inversa de Azure Maps. El segundo dato fija la orientación: la orden inserta un texto con el nombre de la calle, girado el ángulo que forman los dos puntos.

Antes de usarla, edita el guion y sustituye el valor de SUBSCRIPTION_KEY por la clave de tu cuenta de Azure Maps.

SUBSCRIPTION_KEY = 'Introduce aquí el subscription key de tu servicio de mapas de azure'
...
rotacion = self.view.geographic_calculator.calculate_trigonometric_angle(self.origen, coordenadas)
texto = digi3d.Text(self.calle, self.origen, rotation=rotacion)

Explicación completa: Texto del callejero de Azure Maps.

ELIMINA_CURVAS_POR_EQUIDISTANCIA

Borra las geometrías que tienen alguno de los códigos indicados y cuya Z del primer vértice es múltiplo de la equidistancia. Todos los parámetros excepto el último son códigos; el último es la equidistancia.

ELIMINA_CURVAS_POR_EQUIDISTANCIA=020123 020124 5

Si faltan parámetros, si ninguna geometría tiene los códigos o si ninguna cumple la condición, la orden emite el sonido de error y lanza una excepción con el motivo.

códigosEntidadesAModificar = set(argv[0:-1])
equidistancia = float(argv[-1])
...
z = entidad[0][2]
return 0 == z % equidistancia

Explicación completa: Eliminar curvas por equidistancia.

FILTRAR

Reproduce el programa FILTRAR de Digi para MS-DOS. Trabaja con las geometrías no borradas que tienen el código de maestra o el de fina:

  1. Borra las geometrías cuya Z del primer vértice no es múltiplo de la equidistancia.
  2. Asigna el código de maestra a las geometrías cuya Z es múltiplo de cinco veces la equidistancia.
  3. Asigna el código de fina al resto.
FILTRAR=020124 020123 1

Los parámetros son el código de maestra, el código de fina y la equidistancia. La orden redondea la Z a tres decimales antes de comparar. Para cambiar el código, la orden añade un clon y borra la geometría original. El clon tiene un único código, el nuevo, sin tabla ni registro: la orden no conserva los demás códigos de la geometría.

def es_curva_fina_o_maestra(coordenada_z, equidistancia, decimalesPrecision, factorEscala):
    return abs((round(coordenada_z, decimalesPrecision) * factorEscala) % (equidistancia * factorEscala)) < 1e-5

Explicación completa: Filtrar curvas (finas y maestras).

REDONDEA_Z

Redondea a entero con la función round de Python la Z de todos los vértices de las geometrías no borradas que tienen el código de maestra o el de fina. Por cada geometría, la orden añade una línea nueva con los mismos códigos y las coordenadas redondeadas, y borra la original.

REDONDEA_Z=020124 020123
coordenadas.append((coordenada[0], coordenada[1], round(coordenada[2])))
clon = digi3d.Line(curva.codes, coordenadas)

La geometría nueva es siempre una línea, aunque la original sea de otro tipo. round redondea los valores terminados en ,5 al entero par: 2,5 pasa a 2 y 3,5 pasa a 4.

Explicación completa: Redondear la cota Z de las curvas.

RENOMCOD_MANTENIENDO_ATRIBUTOS

Cambia el código origen por el código destino en todas las geometrías que tienen el código origen. El código nuevo conserva la tabla y el registro del código sustituido. Los demás códigos de la geometría no cambian.

RENOMCOD_MANTENIENDO_ATRIBUTOS=A B

El comentario del guion indica que el archivo de dibujo se abra sin conexión a una base de datos.

nuevo = digi3d.FeatureCode(códigoDestino)
nuevo.table = código.table
nuevo.id = código.id

Explicación completa: Renombrar un código manteniendo sus atributos.

TRANSFORMA_COMPLEJO_A_PUNTO

Sustituye cada geometría de tipo complejo, no borrada, cuyo primer código es BAI_VEG_03_PT o VEG_03_PT por un punto situado en el centro de su caja envolvente, con los mismos códigos. Para usarlo con otros códigos, edita las dos últimas llamadas del guion.

punto = digi3d.Point(centro, entidad.codes, 0, (1.0, 1.0, 1.0))
vista.add(punto)
vista.delete(entidad)
...
transforma_complejo_a_punto('BAI_VEG_03_PT')
transforma_complejo_a_punto('VEG_03_PT')

Explicación completa: Transformar complejos en puntos.

Véase también