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.
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.
|
AutoCAD: Visual LISP > Apuntes para un Curso... > Programación de Aplicaciones Gráficas > 2. Técnicas Fundamentales > 2.4. Funciones Recursivas e Iterativas > 2.4.1. Funciones Recursivas >