2.4.1.1 Extracción de los vértices de una LWPOLYLINE

Los datos que sirven para definir cada una de los objetos gráficos de AutoCAD están organizados en forma de una lista de asociación, es decir, una lista de listas, donde la información guardada en cada sublista se identifica mediante un código numérico (entero) que aparece como el primer término (CAR) cada sublista. El significado de cada código coincide en términos generales con los códigos que identifican los datos contenidos en los archivos del formato de fichero DXF utilizado para la transferencia de dibujos AutoCAD a otras aplicaciones. Para el desarrollo de la siguiente función basta saber que los valores que corresponden a las coordenadas X e Y de cada vértice aparecen en sucesivas sublistas identificadas mediante el código de asociación 10. La coordenada Z aparece en una única sublista (ya que debe ser la misma para todos los vértices) identificada mediante el código 38. La función recursiva descrita a continuación será llamada desde otra función que permita seleccionar un objeto del dibujo, compruebe a continuación que se trata de la entidad deseada (del tipo "LWPOLYLINE"), extraiga del objeto gráfico seleccionado la correspondiente lista de asociación y la pase, junto con el valor de la elevación, como argumentos a la función recursiva de extracción VertPoly.

Función ExtraeVertices:

Existen varias formas para seleccionar objetos del dibujo. Utilizaremos en este caso la función ENTSEL que pide al usuario designar un objeto en el dibujo y devuelve una lista con el nombre de entidad y la lista de coordenadas XYZ del punto que ocupaba el cursor en el momento de hacer la designación. Este segundo dato no nos es necesario, por lo que anidamos la función ENTSEL dentro de una función CAR. El nombre de entidad que obtenemos de esta manera es en realidad un puntero al archivo temporal que crea AutoCAD al abrir un dibujo. Utilizando dicho puntero podemos localizar la definición interna del objeto gráfico designado en pantalla y extraerla mediante la función ENTGET: (entget (car (entsel)))

Una sublista determinada se puede encontrar mediante la función ASSOC, pero en este caso, las sublistas que guardan las coordenadas de los vértices todas poseen el código 10. Por este motivo, será necesario recorrer toda la lista, término a término para encontrar todos los valores de coordenadas correspondientes a los vértices. Estos valores son sólo de las coordenadas X e Y. La Z se encuentra en una lista asociada al código 38. Habrá que extraer este valor inicialmente y luego agregarlo a cada uno de los vértices. Esto se hará utilizando la función APPEND en lugar de CONS, de manera que se añada el valor de Z en la tercera posición y no al principio de la lista. La función devolverá una lista de listas, estas últimas cada una de tres valores, correspondiendo a la X,Y,Z de cada vértice.

;;;Extracción de los vértices de una LWPOLYLINE
;;;Función recursiva:
;;;Recorre la lista y extrae el valor de los códigos 10
;;;Estas listas de asociación sólo incluyen los valores
;;;de las coordenadas X e Y, el valor de Z para toda la
;;;polilínea está asociado al código 38 este valor así
;;;como la lista de entidad se extraen en una función
;;;inicial que además sirve para declarar como variables
;;;locales las que almacenan la lista definitoria de la
;;;entidad y la lista de vértices.
;;;Esta función devuelve la lista de vértices, que se
;;;puede asignar a una variable mediante setq:
;;; (setq vertlis (ExtraeVertices))
;;;(c) Reinaldo Togores, Santander, Julio 1999.

(defun VertPoly (lista elevacion / )
(cond
((null lista) nil) ;función de salida
((equal (caar lista) 10) ;si se trata de un vértice
(cons ;la función append permite incluir la
;coordenada Z en la posición correcta
(append (cdr (car lista))(list elevacion))
(VertPoly (cdr lista) elevacion) ;y continúa la recursión
)
)
(t (VertPoly (cdr lista) elevacion)) ;si no es un vértice
) ;_ fin de cond
) ;_ fin de defun

(defun ExtraeVertices ( / lista_entidad)
(if
(equal
(cdr (assoc 0 (setq lista_entidad (entget (car (entsel))))))
"LWPOLYLINE"
)
(VertPoly lista_entidad (cdr (assoc 38 lista_entidad)))
(alert "La entidad seleccionada no es una LWPOLYLINE")
) ;_ fin de if
) ;_ fin de defun

Sin duda este código cumplirá su cometido, pero puede ser mejorado. Este programa está redactado de manera tal que ninguna de sus partes pudiera reutilizarse en otros futuros programas. Un enfoque más eficaz consistiría en analizar qué procesos de carácter más general intervienen en la solución y programarlos como funciones utilitarias que se incorporen como nuevas herramientas al lenguaje. Más adelante, y después de estudiar algunos otros procedimientos y técnicas, intentaremos precisamente esto, cómo abordar de una manera más eficaz la solución a este programa.


Inicio | Índice | Continuar...