PythonCommand

Módulo: digi3d

Esta clase es la base para crear órdenes interactivas en Python. Crea una clase derivada y redefine los manejadores de eventos (movimiento del ratón, dato, reset, tentativo, selección…). Inicia la orden con DrawingView.add_command.

Constructores

PythonCommand()
PythonCommand(name)
Argumento Tipo Descripción
name str Nombre de la orden (opcional).

Propiedades

Propiedad Tipo Descripción
view DrawingView Vista en la que se está ejecutando la orden.

Métodos

Método Devuelve Descripción
new_transaction() — Crea una nueva transacción de deshacer (UNDO).
select_geometry(coordinates, filter=None) bool Selecciona la geometría más próxima a coordinates, igual que el pedal de tentativo, y la entrega en on_geometry_selected. Devuelve False si la selección no ha podido empezar. Consulta Seleccionar una geometría.

Eventos

Redefine en la clase derivada los manejadores de los eventos a los que tenga que reaccionar la orden. Los manejadores de los eventos de pedales, movimiento y teclado devuelven True si la orden ha procesado el evento; en ese caso Digi3D.AI no hace nada más con él.

Evento Cuándo lo llama Digi3D.AI
on_set_focus() Al iniciar la orden y cada vez que vuelve a ser la orden activa.
on_lost_focus() Cuando se apila otra orden sobre la orden actual.
on_data_down(coordinates) Al pulsar el botón o el pedal de dato.
on_data_up(coordinates) Al soltar el botón o el pedal de dato.
on_data_dbl_clk(coordinates) Al hacer doble clic con el botón de dato.
on_reset_down(coordinates) Al pulsar el botón o el pedal de reset.
on_reset_up(coordinates) Al soltar el botón o el pedal de reset.
on_snap_down(coordinates) Al pulsar el botón o el pedal de tentativo.
on_snap_up(coordinates) Al soltar el botón o el pedal de tentativo.
on_move(coordinates, button) Al mover el cursor.
on_key_down(key) Al pulsar una tecla.
on_geometry_selected(geometry, coordinates, first_vertex, second_vertex) Cuando seleccionas una geometría con el pedal de tentativo o la orden la selecciona con select_geometry. No devuelve nada.
on_geometries_selected(geometries) Cuando una orden de selección múltiple o un panel entrega varias geometrías a la orden. Consulta Selección múltiple. No devuelve nada.

coordinates es una tupla (x, y, z) con coordenadas terreno.

Seleccionar una geometría

select_geometry(coordinates, filter=None) busca la geometría más próxima a coordinates igual que el pedal de tentativo. Si encuentra una, Digi3D.AI llama al evento on_geometry_selected de la orden:

  • Sin la verificación de tentativo (variable VER, o view.verify_snap en DrawingView), la llamada se produce antes de que select_geometry termine.
  • Con la verificación activada, Digi3D.AI muestra la geometría encontrada y espera a que confirmes la geometría con un dato. Digi3D.AI llama a on_geometry_selected al confirmar la geometría.

Si no encuentra ninguna geometría, Digi3D.AI emite el sonido de error y no llama al evento.

select_geometry no selecciona nada y devuelve False en estos casos:

  • Ya hay un tentativo en curso, por ejemplo uno que espera tu verificación.
  • El modo de búsqueda activo busca intersecciones. Ese modo lanza la orden INTERSECCION, que no admite el filtro.
Argumento Tipo Descripción
coordinates tuple Coordenadas (x, y, z) en las que se busca la geometría. Normalmente, las que recibe on_data_down o on_data_up.
filter función o None Función que recibe una geometría y devuelve True si se puede seleccionar. Con None se pueden seleccionar puntos, líneas, textos y polígonos. Con una función, la función decide también sobre los complejos. Si la función lanza una excepción, Digi3D.AI escribe el error con print y descarta esa geometría.

on_geometry_selected recibe estos argumentos:

Argumento Tipo Descripción
geometry Geometry Geometría seleccionada. Es la geometría del dibujo y es de solo lectura: para cambiarla, borra la original con view.delete y añade un clon con view.add.
coordinates tuple Coordenadas (x, y, z) del punto de la geometría más próximo a la selección. Con la variable FIJAZ activada, z es la coordenada Z activa.
first_vertex int Índice del primer vértice del segmento seleccionado.
second_vertex int Índice del segundo vértice del segmento seleccionado. Si es igual a first_vertex, la selección está sobre ese vértice.

Si la orden define on_geometry_selected, Digi3D.AI también le entrega las geometrías que llegan a la orden activa por otros caminos, entre ellos:

  • el pedal de tentativo;
  • las órdenes SELECCIONA_ULTIMO y SELECCIONA_INDICE;
  • la opción Enviar selección a la orden activa del menú contextual del editor de base de datos y del panel de resultados de la búsqueda, que entrega la primera geometría seleccionada si la orden no define on_geometries_selected;
  • las tareas del panel de tareas que lanzan una orden sobre una geometría.

Si la orden no define on_geometry_selected, Digi3D.AI la trata como una orden que no selecciona geometrías: el pedal de tentativo llama a on_data_down con esas mismas coordenadas, y los demás caminos no le entregan nada.

import digi3d

class MostrarCodigos(digi3d.PythonCommand):
    def on_data_up(self, coordinates):
        self.select_geometry(coordinates)
        return True

    def on_geometry_selected(self, geometry, coordinates, first_vertex, second_vertex):
        print([codigo.code for codigo in geometry.codes])

digi3d.current_view().add_command(MostrarCodigos("Mostrar códigos"))

El ejemplo Prefijar los códigos de la geometría seleccionada usa filter para descartar las geometrías de los archivos de referencia.

Selección múltiple

Una orden que define on_geometries_selected(geometries) admite selección múltiple. Mientras está activa, estas órdenes y opciones le entregan la lista de geometrías seleccionadas:

  • las órdenes de selección, como SELECCIONA_VENTANA, SELECCIONA_COD o SELECCIONA_POLIGONO;
  • la opción Enviar selección a la orden activa del menú contextual del editor de base de datos y del panel de resultados de la búsqueda, que entrega todas las geometrías seleccionadas.
Argumento Tipo Descripción
geometries list de Geometry Geometrías seleccionadas. Son las geometrías del dibujo y son de solo lectura, como en on_geometry_selected. Pueden ser de cualquier archivo cargado, incluidos los archivos de referencia: la orden decide cuáles trata comparando su propiedad file con view.drawing_file.

Si la orden no define on_geometries_selected, Digi3D.AI la trata como una orden que no admite selección múltiple: las órdenes de selección muestran el aviso de que la orden activa no la admite y no se inician.

Con la variable BORRADOS activada, la lista puede incluir geometrías borradas. Descártalas con la propiedad deleted: si la orden las borra otra vez, un UNDO las vuelve a mostrar. El editor de base de datos puede entregar la misma geometría dos veces, una por cada código enlazado al registro seleccionado.

Todos los cambios que hace la orden antes de llamar a new_transaction() se deshacen con un solo UNDO. view.delete y view.add aceptan listas, pero sus versiones de lista no ejecutan los controles de calidad ni avisan a las extensiones. Para que las funciones ejecuten los controles de calidad y avisen a las extensiones, llama a cada función con cada geometría, o sustituye cada geometría con view.replace:

import digi3d

class Borrar(digi3d.PythonCommand):
    def on_geometries_selected(self, geometries):
        ruta = self.view.drawing_file.path
        for g in geometries:
            if not g.deleted and g.file is not None and g.file.path == ruta:
                self.view.delete(g)
        self.view.redraw()
        self.new_transaction()

digi3d.current_view().add_command(Borrar("Borrar la selección"))

Ejemplo

import digi3d

class MiOrden(digi3d.PythonCommand):
    def on_data_down(self, coordinates):
        self.new_transaction()
        self.view.add(digi3d.Point(coordinates, codes=["PUNTO"]))

digi3d.current_view().add_command(MiOrden("Insertar puntos"))

Véase también