Transformar complejos en puntos
Archivo: transforma_complejo_a_punto.py · orden TRANSFORMA_COMPLEJO_A_PUNTO con uno o varios
parámetros: los códigos de las geometrías a transformar.
Convierte las geometrías de tipo Complejo cuyo primer código es uno de los indicados en geometrías de tipo Punto, situadas en el centro de la caja envolvente del complejo. Se desarrolló para corregir archivos DGN que se habían importado con los puntos como complejos.
Cómo se usa
Escribe en la línea de comandos el nombre de la orden y uno o varios códigos separados por espacios. Por
ejemplo, para transformar los complejos de los códigos BAI_VEG_03_PT y VEG_03_PT:
TRANSFORMA_COMPLEJO_A_PUNTO=BAI_VEG_03_PT VEG_03_PT
Si no se indica ningún código, la orden emite el sonido de error y muestra un cuadro con el motivo y la forma de uso.
El código
import digi3d
USO = 'TRANSFORMA_COMPLEJO_A_PUNTO=[código] [código...]'
vista = digi3d.current_view()
def error(mensaje):
"""Emite el sonido de error y muestra el mensaje con la forma de uso de la orden."""
digi3d.music(digi3d.MusicType.Error)
digi3d.show_info('{}\n\nUso: {}'.format(mensaje, USO))
def transforma_complejo_a_punto(codigo):
eliminar = list(filter(lambda g: not g.deleted and type(g) is digi3d.Complex and g.codes[0].code == codigo, vista))
for entidad in eliminar:
centro = ((entidad.min[0] + entidad.max[0])/2, (entidad.min[1] + entidad.max[1])/2, (entidad.min[2] + entidad.max[2])/2)
punto = digi3d.Point(centro, entidad.codes, 0, (1.0, 1.0, 1.0))
vista.add(punto)
vista.delete(entidad)
if len(argv) == 0:
error('Falta el código de las geometrías a transformar.')
else:
for codigo in argv:
transforma_complejo_a_punto(codigo)
vista.redraw()
Cómo funciona
digi3d.current_view()devuelve la ventana de dibujo activa.- Parámetros: cada elemento de
argves un código. Siargvestá vacío, la funciónerroremite el sonido de error y muestra el motivo y la forma de uso condigi3d.show_info. Si no, el guion llama atransforma_complejo_a_puntouna vez por código y redibuja la ventana al final. - Selección con
filter:transforma_complejo_a_puntorecorrevista(todas las geometrías cargadas) y se queda con las que cumplen tres condiciones: que no estén borradas (not g.deleted), que sean complejos (type(g) is digi3d.Complex) y que su primer código sea el código indicado (g.codes[0].code == codigo).g.codeses la lista de códigos de la geometría;.codees la cadena del código.- El
filterse envuelve enlist(...)porque el bucle añade y borra geometrías, y la vista no se debe modificar mientras unfilterla recorre de forma perezosa.list()materializa la selección antes de modificar la vista.
- Centro del complejo:
entidad.minyentidad.maxson las coordenadas mínima y máxima de la caja envolvente; su punto medio es el centro. - Crear el punto:
digi3d.Point(coordenadas, códigos, rotación, escala). El guion pasaentidad.codespara que el punto tenga los mismos códigos que el complejo. vista.add(punto)añade el punto yvista.delete(entidad)elimina el complejo original.vista.redraw()regenera la ventana para mostrar los cambios.
Véase también
- Point · Complex
- DrawingView —
add,delete,redraw