Los dos artículos anteriores examinaban la capacidad de Visual LISP para acceder a las propiedades y métodos de los objetos ActiveX. Ahora utilizaremos las funciones en ellos desarrolladas (CadXpress 61 y 62) para crear un programa Visual LISP dotado de una interfaz gráfica de usuario programada en DCL. AntecedentesEn el número 61 describíamos la manera de acceder a una hoja de cálculo EXCEL desde AutoCAD y llenar los campos de una tabla con los datos de una lista de asociación LISP. En el siguiente número examinamos una función capaz de extraer la información de los atributos y otros datos asociados a las referencias de bloque. Contamos con que el lector ya dispondrá de las siguientes funciones organizadas en dos archivos:
Los artículos mencionados incluyen además funciones diseñadas con el objeto de probar el funcionamiento de los programas. De una de esas funciones podemos ahora prescindir, la función TablaCirculos. Otra la utilizaremos con pequeñas modificaciones:
A estos dos archivos añadiremos en esta entrega el archivo con la definición del Cuadro de Diálogo y otro con las funciones Visual LISP necesarias para gestionarlo y que explicaremos más abajo:
El Cuadro de DiálogoEl cuadro de diálogo propuesto (ver Figura 1) es muy simple, aunque sirve perfectamente a los fines que nos proponemos.
El componente principal del Cuadro de diálogo lo es una
casilla de lista ( Los otros componentes del diálogo son los botones de Aceptar
y Cancelar que provienen del componente predefinido Figura 2. Código de la Definición del Cuadro de diálogo. Gestión del Cuadro de DiálogoLa operación de Cuadro de Diálogo se asegura a partir de la
función Una vez valorada Llenar la Casilla de ListaEn caso de que todo marche bien, se procederá a llenar la
casilla de lista con los nombres de los bloques encontrados en el dibujo. Para
obtener estos nombres se llama a la función El procedimiento para llenar una lista DCL es el habitual: ·
Una llamada a la función
·
Una invocación de la función mapcar
que aplica la función
![]() Figura 3. Función CargaDialogo Esto se logra aplicando una
función
Si ListaNombres
devolviera una lista vacía en lugar de llenar la casilla de lista se
presentaría un mensaje de error en el componente
·
El proceso de escritura en la lista concluye con la llamada a Estableciendo las acciones de los componentesUna vez llena la casilla de lista se procede a asignar la
acción que desencadenará cada componente del Diálogo. La casilla de lista
tendrá una acción propia asignada mediante
El argumento $value
que se pasa a la función
El valor devuelto que es de tipo Se revisa entonces si el segundo término del par punteado es
igual a
Figura 4. Función CompruebaAtributos. Debemos señalar que además de esta acción que corresponde al
evento de un clic del ratón, esta casilla tendrá también asignada la
acción del botón Aceptar que se lanzará a partir del doble clic
sobre una de sus líneas, tal como se define en el código DCL: La acción para la tecla Aceptar se define en la
función ExtrATT a la que se pasa
como argumento el índice de la línea resaltada, que se obtiene esta vez
mediante la función
![]() Figura 5. Función ExtrATT La función El botón Cancelar no tiene otra acción asignada que registrar la posición del cuadro de diálogo al cerrarse. Figura 6. Función SelBloque. Creando la lista de BloquesComo hemos visto, toda la funcionalidad de este Diálogo gira
en torno a la lista de nombres de bloques AutoCAD en sí mismo constituye un objeto, el objeto Aplicación. Es a partir de este objeto que se podrá llegar a todos los componentes que integran el dibujo. Los objetos que se incluyen en la aplicación se cuentan por centenares. De ahí que sea necesario estructurarlos de alguna manera. Esa manera de estructurarlos es a partir de Colecciones. Todos los dibujos abiertos en una misma sesión de trabajo componen la Colección Documentos. El Documento Activo es uno de los miembros de esa Colección. A su vez el Documento Activo contiene una serie de Colecciones de Objetos. Las Colecciones de ObjetosUna colección se define como un conjunto ordenado de elementos de información sobre los que podemos operar como una estructura de carácter unitario. Desde el punto de vista del programador AutoLISP, una colección es en gran medida como una lista. Aunque las colecciones no tienen que contener necesariamente el mismo tipo de dato para cada uno de sus miembros, las colecciones de AutoCAD tienden a componerse de referencias a objetos de tipo similar. Por ejemplo, la Colección "Blocks" contiene sólo objetos Bloque y la Colección "TextStyles" contiene sólo objetos Estilo de Texto[2]. La vía para obtener la colección "BLOCKS" será la siguiente: · Obtener el objeto Aplicación AutoCAD · Obtener su objeto Documento Activo · Obtener del Documento Activo la Colección "BLOCKS" · Extraer los nombres de los objetos que integran la colección. Los dos primeros pasos se resumen en la siguiente línea de código:
Esta línea de código no forma parte de una de las funciones
definidas. Aparecen de manera independiente al principio del archivo ExtrATT.LSP (ver Figura 7) junto con
la llamada a Figura 7. Funciones de Inicialización. La referencia al objeto Documento Activo se guarda en la
variable global
Visual LISP suministra
De cada uno de los objetos que componen la colección y que recuperamos secuencialmente, podemos obtener la propiedad "Name", es decir su nombre:
Figura 8. Función ListaNombres. Pero no todos los objetos recuperados a partir de la
colección Otro aspecto que nos interesa comprobar ahora es si las
Definiciones de Bloque restantes incluyen Definiciones de Atributos[4].
Para ello será necesario examinar, una a una, las Definiciones de Bloque
encontradas. Una Definición de Bloque es también una Colección. En este
caso integrada por entidades entre las cuales pueden encontrarse Definiciones
de Atributo. La función Figura 9. Función TieneAtributos. Implantar un nuevo Comando AutoCADPara terminar, sería conveniente crear un nombre para este
programa que permitiera llamarlo desde la línea de comandos. En AutoLISP lo
hacíamos definiendo una función cuyo nombre estuviera precedido por
Ahora bastará teclear ATREX en la línea de comandos para acceder al programa. Recordemos que para probarlo debemos cargar todos los archivos que componen el proyecto: ListaExcel.LSP, LeeAttribX.LSP y ExtrATT.LSP. ConclusionesCon lo publicado en este número completamos lo que sería el código para una aplicación de utilidad evidente. Más adelante abordaremos los procedimientos para crear un proyecto que nos ayude a gestionar los diversos archivos, los aspectos a tener en cuenta para su compilación y el proceso mediante el cual podemos convertir todo esto en una aplicación ejecutable VLX. [1] Listas de dos términos del
tipo que se obtiene al aplicar la función cons sobre dos átomos: [2] Gibb, J.W. y Kramer, B. AutoCAD VBA Programming: tools and techniques. Miller-Freeman, 1999. Pág. 83. Traducción libre de R. Togores. [3] Sobre [4] Recordemos la distinción entre Definición de Atributo y Referencia de Atributo que hacíamos en nuestro artículo anterior (CadXpress 62). |