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 deAutoCAD están organizados en forma de una listade asociación, es decir, una lista de listas, donde lainformación guardada en cada sublista se identifica mediante uncódigo numérico (entero) que aparece como el primertérmino (CAR) cada sublista. El significado de cada códigocoincide en términos generales con los códigos que identificanlos datos contenidos en los archivos del formato de fichero DXF utilizado parala transferencia de dibujos AutoCAD a otras aplicaciones. Para el desarrollo dela siguiente función basta saber que los valores que corresponden a lascoordenadas X e Y de cada vértice aparecen en sucesivas sublistasidentificadas mediante el código de asociación 10. La coordenadaZ aparece en una única sublista (ya que debe ser la misma para todos losvértices) identificada mediante el código 38. La funciónrecursiva descrita a continuación será llamada desde otrafunción que permita seleccionar un objeto del dibujo, compruebe acontinuación que se trata de la entidad deseada (del tipo"LWPOLYLINE"), extraiga del objeto gráfico seleccionado lacorrespondiente lista de asociación y la pase, junto con el valor de laelevación, como argumentos a la función recursiva deextracción VertPoly.

Función ExtraeVertices:

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

Una sublista determinada se puede encontrar mediante la funciónASSOC, pero en este caso, las sublistas que guardan las coordenadas de losvértices todas poseen el código 10. Por este motivo, seránecesario recorrer toda la lista, término a término paraencontrar todos los valores de coordenadas correspondientes a losvértices. Estos valores son sólo de las coordenadas X e Y. La Zse encuentra en una lista asociada al código 38. Habrá queextraer este valor inicialmente y luego agregarlo a cada uno de losvértices. Esto se hará utilizando la función APPEND enlugar de CONS, de manera que se añada el valor de Z en la terceraposición y no al principio de la lista. La funcióndevolverá una lista de listas, estas últimas cada una de tresvalores, 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 sermejorado. Este programa está redactado de manera tal que ninguna de suspartes pudiera reutilizarse en otros futuros programas. Un enfoque máseficaz consistiría en analizar qué procesos de caráctermás general intervienen en la solución y programarlos comofunciones utilitarias que se incorporen como nuevas herramientas al lenguaje.Más adelante, y después de estudiar algunos otros procedimientosy técnicas, intentaremos precisamente esto, cómo abordar de unamanera más eficaz la solución a este programa.


Inicio |Índice |Continuar...