Los dos artículos anterioresexaminaban la capacidad de Visual LISP para acceder a las propiedades y métodosde los objetos ActiveX. Ahora utilizaremos las funciones en ellos desarrolladas(CadXpress 61 y 62) para crear un programa Visual LISP dotado de una interfazgráfica de usuario programada en DCL. AntecedentesEn el número 61 describíamos la manera de acceder a una hojade cálculo EXCEL desde AutoCAD y llenar los campos de una tabla con los datosde una lista de asociación LISP. En el siguiente número examinamos una función capaz deextraer la información de los atributos y otros datos asociados a lasreferencias de bloque. Contamos con que el lector ya dispondrá de las siguientesfunciones organizadas en dos archivos:
Los artículos mencionados incluyen además funcionesdiseñadas con el objeto de probar el funcionamiento de los programas. De una deesas funciones podemos ahora prescindir, la función TablaCirculos. Otra la utilizaremos con pequeñasmodificaciones:
A estos dos archivos añadiremos en esta entrega el archivocon la definición del Cuadro de Diálogo y otro con las funciones Visual LISPnecesarias 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 unacasilla de lista ( Los otros componentes del diálogo son los botones de Aceptary 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 lafunción Una vez valorada Llenar la Casilla de ListaEn caso de que todo marche bien, se procederá a llenar lacasilla de lista con los nombres de los bloques encontrados en el dibujo. Paraobtener 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 mapcarque aplica la función
Figura 3. Función CargaDialogo Esto se logra aplicando unafunción
Si ListaNombresdevolviera una lista vacía en lugar de llenar la casilla de lista sepresentarí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 laacción que desencadenará cada componente del Diálogo. La casilla de listatendrá una acción propia asignada mediante
El argumento $valueque se pasa a la función
El valor devuelto que es de tipo Se revisa entonces si el segundo término del par punteado esigual a Figura 4. Función CompruebaAtributos. Debemos señalar que además de esta acción que corresponde alevento de un clic del ratón, esta casilla tendrá también asignada laacción del botón Aceptar que se lanzará a partir del doble clicsobre una de sus líneas, tal como se define en el código DCL: La acción para la tecla Aceptar se define en lafunción ExtrATT a la que se pasacomo argumento el índice de la línea resaltada, que se obtiene esta vezmediante la función
Figura 5. Función ExtrATT La función El botón Cancelar no tiene otra acción asignada queregistrar 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 giraen torno a la lista de nombres de bloques AutoCAD en sí mismo constituye un objeto, el objetoAplicación. Es a partir de este objeto que se podrá llegar a todos loscomponentes que integran el dibujo. Los objetos que se incluyen en laaplicación se cuentan por centenares. De ahí que sea necesario estructurarlosde 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ónDocumentos. El Documento Activo es uno de los miembros de esaColección. A su vez el Documento Activo contiene una serie de Colecciones deObjetos. Las Colecciones de ObjetosUna colección se define comoun conjunto ordenado de elementos de información sobre los que podemos operarcomo una estructura de carácter unitario. Desde el punto de vista delprogramador AutoLISP, una colección es en gran medida como una lista. Aunquelas colecciones no tienen que contener necesariamente el mismo tipo de datopara cada uno de sus miembros, las colecciones de AutoCAD tienden a componersede 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á lasiguiente: · 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 lacolección. Los dos primeros pasos se resumen en la siguiente línea decódigo:
Esta línea de código no forma parte de una de las funcionesdefinidas. Aparecen de manera independiente al principio del archivo ExtrATT.LSP (ver Figura 7) junto conla llamada a Figura 7. Funciones de Inicialización. La referencia al objeto Documento Activo se guarda en lavariable global
Visual LISP suministra
De cada uno de los objetos que componen la colección y querecuperamos secuencialmente, podemos obtener la propiedad "Name", es decir su nombre:
Figura 8. Función ListaNombres. Pero no todos los objetos recuperados a partir de lacolección Otro aspecto que nos interesa comprobar ahora es si lasDefiniciones de Bloque restantes incluyen Definiciones de Atributos[4].Para ello será necesario examinar, una a una, las Definiciones de Bloqueencontradas. Una Definición de Bloque es también una Colección. En estecaso integrada por entidades entre las cuales pueden encontrarse Definicionesde Atributo. La función Figura 9. Función TieneAtributos. Implantar un nuevo Comando AutoCADPara terminar, sería conveniente crear un nombre para esteprograma que permitiera llamarlo desde la línea de comandos. En AutoLISP lohacíamos definiendo una función cuyo nombre estuviera precedido por
Ahora bastará teclear ATREXen la línea de comandos para acceder al programa. Recordemos que para probarlo debemos cargar todos losarchivos que componen el proyecto:ListaExcel.LSP, LeeAttribX.LSP y ExtrATT.LSP. ConclusionesCon lo publicado en este número completamos lo que sería elcódigo para una aplicación de utilidad evidente. Más adelante abordaremos losprocedimientos para crear un proyecto que nos ayude a gestionar los diversosarchivos, los aspectos a tener en cuenta para su compilación y el procesomediante el cual podemos convertir todo esto en una aplicación ejecutable VLX. [1] Listas de dos términos deltipo 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ónentre Definición de Atributo y Referencia de Atributo que hacíamos en nuestroartículo anterior (CadXpress 62). |
AutoCAD: Visual LISP > Apuntes para un Curso... > Programación de Aplicaciones Gráficas > 4. Visual LISP Avanzado >