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.
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.
|
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 >