Dibujar Autocad

18
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador PROGRAMACION DE AUTOCAD CON VBA. Se trata de una programación orientada a objetos y conducida por eventos. El usuario realiza acciones sobre dichos objetos. Según el objeto y la acción de que se trate se ejecutara la rutina asociada. Las aplicaciones contienen una colección de bloques de instrucciones a los que se denomina procedimientos que se pueden agrupar en módulos. La estructura completa se muestra en la figura 1: Métodos Propiedades Procedimientos Eventos Sentencias Sentencias Módulo Objeto Figura 1: Estructura general de una aplicación orientada a objetos Las aplicaciones VBA se realizan mediante el editor VBA que se encuentra en el menú Herramientas, Macro, Editor Visual Basic. Mediante Alt+F11 se puede ir del editor VBA a Autocad y viceversa. La interfaz del editor VBA es la siguiente: 1.1 DEFINICIONES Aplicación o Programa: Conjunto de bloques de instrucciones y de objetos de control que realizan una función o tarea. Se divide en módulos. Módulo: Pueden ser de tres clases: Formulario: Ventanas que sirven de interfaz de la aplicación. Contiene controles, eventos, declaraciones de variables y procedimientos. Estándar: Contiene declaraciones de variables y procedimientos. Clase: Contiene definiciones de nuevos objetos con sus métodos y propiedades. Procedimiento: Conjunto de instrucciones que forman el código. Pueden ser subrutinas o funciones. Objeto: Cada uno de los elementos sobre los que actúa el programa. Se agrupan por clases: Objetos del sistema: objetos especiales del sistema operativo (Err, Printer, Debug, etc.). Objetos de formulario: Contiene el propio formulario y todos los controles contenidos en él. Objetos de Autocad: Objetos de dibujo, tablas de símbolos, objetos no gráficos y preferencias. Evento: Código que se ejecuta cada vez que se realiza una acción sobre un objeto: clic, doble clic, arrastrar, cargar, modificar, etc. Propiedad: Atributos de los objetos: nombre, color, fuente, posición, etc. Método: Función que realiza una acción sobre un objeto. Así por ejemplo Add, Close o GetFormat para los objetos de formulario o AddCircle, Move, Copy o GetAngle para los objetos de AutoCAD. 1.2 EL EDITOR VBA: En la figura 2 se muestran los componentes típicos de la interfaz: Barra de Menús Barra de herramientas estándar: Contiene los botones con las herramientas mas comunes. Ventana Project: Estructura en árbol con la informaron referente al proyecto actual: Objetos, Formularios y Módulos Ventana UserForm (Código) contiene el código correspondiente al formulario UserForm Ventana UseForm (UserForm) contiene el formulario y los controles de UserForm. Ventana Propiedades: Muestra las propiedades del objeto seleccionado. Cuadro de herramientas: Contiene los controles con los que se diseñan los formularios. 1.3 APLICACIONES EN VBA Están compuestas de módulos, como mínimo uno, pudiendo tener varios de cada uno de los tres tipos posibles. Dichos módulos contienen el código de la aplicación, formado por declaraciones de variables u objetos, procedimientos y eventos (solo en formularios o en el objeto ThisDrawing). El objeto ThisDrawing es el documento de Autocad asociado con el proyecto, que puede llevar código como cualquier otro modulo, declaraciones, eventos y procedimientos. Práctica 9 Pág: 1

Transcript of Dibujar Autocad

Page 1: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

PROGRAMACION DE AUTOCAD CON VBA. Se trata de una programación orientada a objetos y conducida por eventos. El usuario realiza acciones sobre dichos objetos. Según el objeto y la acción de que se trate se ejecutara la rutina asociada. Las aplicaciones contienen una colección de bloques de instrucciones a los que se denomina procedimientos que se pueden agrupar en módulos. La estructura completa se muestra en la figura 1:

Métodos

Propiedades Procedimientos

Eventos

Sentencias

Sentencias

Módulo Objeto

Figura 1: Estructura general de una aplicación orientada a objetos Las aplicaciones VBA se realizan mediante el editor VBA que se encuentra en el menú Herramientas, Macro, Editor Visual Basic. Mediante Alt+F11 se puede ir del editor VBA a Autocad y viceversa. La interfaz del editor VBA es la siguiente: 1.1 DEFINICIONES Aplicación o Programa: Conjunto de bloques de instrucciones y de objetos de control que realizan una función o tarea. Se divide en módulos. Módulo: Pueden ser de tres clases:

Formulario: Ventanas que sirven de interfaz de la aplicación. Contiene controles, eventos, declaraciones de variables y procedimientos.

Estándar: Contiene declaraciones de variables y procedimientos. Clase: Contiene definiciones de nuevos objetos con sus métodos y propiedades.

Procedimiento: Conjunto de instrucciones que forman el código. Pueden ser subrutinas o funciones. Objeto: Cada uno de los elementos sobre los que actúa el programa. Se agrupan por clases:

• Objetos del sistema: objetos especiales del sistema operativo (Err, Printer, Debug, etc.). • Objetos de formulario: Contiene el propio formulario y todos los controles contenidos en él. • Objetos de Autocad: Objetos de dibujo, tablas de símbolos, objetos no gráficos y

preferencias. Evento: Código que se ejecuta cada vez que se realiza una acción sobre un objeto: clic, doble clic, arrastrar, cargar, modificar, etc. Propiedad: Atributos de los objetos: nombre, color, fuente, posición, etc. Método: Función que realiza una acción sobre un objeto. Así por ejemplo Add, Close o GetFormat para los objetos de formulario o AddCircle, Move, Copy o GetAngle para los objetos de AutoCAD. 1.2 EL EDITOR VBA: En la figura 2 se muestran los componentes típicos de la interfaz:

Barra de Menús Barra de herramientas estándar: Contiene los botones con las herramientas mas comunes. Ventana Project: Estructura en árbol con la informaron referente al proyecto actual: Objetos,

Formularios y Módulos Ventana UserForm (Código) contiene el código correspondiente al formulario UserForm Ventana UseForm (UserForm) contiene el formulario y los controles de UserForm. Ventana Propiedades: Muestra las propiedades del objeto seleccionado.

Cuadro de herramientas: Contiene los controles con los que se diseñan los formularios.

1.3 APLICACIONES EN VBA Están compuestas de módulos, como mínimo uno, pudiendo tener varios de cada uno de los tres tipos posibles. Dichos módulos contienen el código de la aplicación, formado por declaraciones de variables u objetos, procedimientos y eventos (solo en formularios o en el objeto ThisDrawing). El objeto ThisDrawing es el documento de Autocad asociado con el proyecto, que puede llevar código como cualquier otro modulo, declaraciones, eventos y procedimientos.

Práctica 9 Pág: 1

Page 2: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Figura 2 El editor VBA (IDEVBA)

Modulo de Formulario: Sirven de interfaz con el usuario. Contienen objetos gráficos denominados controles (botones, cuadros de texto, listas, etc.) mediante los que se puede mostrar e introducir información. Además también contienen código: definiciones de variables, de procedimientos y de eventos. Los eventos se autoejecutan al detectarse acciones sobre los controles como por ejemplo, al hacer clic sobre un botón. Modulo estándar: Contiene código únicamente: definiciones de variables y procedimientos. Estas definiciones son publicas (pueden ser utilizadas en cualquier modulo), mientras que las definiciones de un modulo formulario son privadas para ese modulo. Modulo clase: Se emplea únicamente para crear nuevos tipos objetos con sus propiedades y sus métodos. VBA emplea este tipo de módulos para definir los objetos que son propios de Autocad y que no existen en Visual Basic. La programación en VBA esta guiada por eventos. Esto significa que son los propios objetos y controles, junto con las intervenciones del usuario los que dirigen la ejecución. El código de la aplicación se encuentra repartido por los distintos módulos. Para acceder a la ventana de código hay varias opciones:

1. En la ventana Proyecto pulsar el botón derecho sobre algún objeto de los que componen la aplicación y elegir Ver Código.

2. En el menú desplegadle elegir Ver y luego Código 3. Hacer doble clic sobre un objeto de la ventana Proyecto 4. Pulsar F7.

Al acceder a la ventana de código aparecen dos listas desplegables. La de la izquierda para seleccionar el objeto y la de la derecha para seleccionar el evento al que se va a asociar el código que se introduzca. Por ejemplo, en el código de se puede elegir AcadDocument y ObjectErased para acceder a la rutina AcadDocument_ObjectErased que se ejecutara cada vez que se borre un objeto del dibujo actual. En todos los módulos aparece en la lista de la izquierda el elemento General y al elegirlo aparece en la derecha el elemento Declaraciones. En esta sección es donde deben definirse las variables y procedimientos que se van a usar en todo el modulo.

Práctica 9 Pág: 2

Page 3: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

En el menú de edición aparecen las típicas opciones (cortar, pegar, etc.) y además hay cinco herramientas que resultan muy útiles:

Lista de propiedades y métodos: del objeto con el que se esta trabando. Lista de constantes: que se pueden asignar al valor de una propiedad. Información rápida: ayuda sobre la sintaxis del elemento que se esta escribiendo. Información de parámetros: sintaxis de los parámetros de la función que se esta escribiendo. Palabra completa: termina de escribir la palabra que se ha empezado.

Comentarios: Se indican poniendo un apóstrofe delante del texto. Pueden estar al principio o en medio de una línea. Constantes: Se indican con la palabra reservada Const delante del identificador. Opcionalmente se puede escribir su tipo después de As

Const PI As Double = 3,141592 Variables: Se definen con Dim. As indica el tipo

Dim Apellido As String Los nombres de variables deben comenzar con una letra y pueden tener hasta 255 caracteres. VBA dispone de los tipos de datos habituales (enteros, reales, boléanos, strings,..) y además de toda una serie de tipos de datos específicos llamados tipos de objetos que permiten definir variables para contener elementos como entidades de dibujo, objetos gráficos de formulario (cuadros de texto, botones..), objetos HTML, OLE, etc. La estructura de objetos de VBA se muestran en la figura 3

Figura 3: Modelo de datos y estructura de objetos de VBA

Práctica 9 Pág: 3

Page 4: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

2. EJERCICIO DE INTRODUCCIÓN Extraído del Manual del desarrollador de ActiveX y VBA Capítulo 1 Una vez introducidos los conceptos básicos de la programación en AutoCAD VBA, podemos intentar crear un sencillo ejemplo de "Hola a todos". En este ejercicio creará un dibujo de AutoCAD, le añadirá una línea de texto y lo guardará, todo ello desde VBA.

1. Abre el IDE de VBA desde la línea de comando de AutoCAD: Comando:VBAIDE

o pulsando Alt+F11

2. Abre la ventana de código seleccionando la opción Código de del menú Ver en el IDEVBA.

3. Para crear un procedimiento nuevo en el proyecto, elige la opción Procedimiento en el menú Insertar en el IDE de VBA.

4. Cuando se solicite información del procedimiento, escribe un nombre, por ejemplo, Hola_a_todos. Asegúrate de que el tipo seleccionado sea Procedimiento y el ámbito Público.

5. Elige Aceptar.

6. Escribe el código siguiente (que abre un dibujo nuevo) entre las líneas Public Sub Hola_a_todos() y End Sub.

ThisDrawing.Application.Documents.Add

7. Escribe el código siguiente (que crea la cadena de texto y define el punto donde se inserta) inmediatamente después del código introducido en el paso 6.

Dim insPoint(0 To 2) As Double 'Declare insertion point Dim textHeight As Double 'Declare text height Dim textStr As String 'Declare text string Dim textObj As AcadText 'Declare text object insPoint(0) = 2 'Set insertion point x coordinate insPoint(1) = 4 'Set insertion point y coordinate insPoint(2) = 0 'Set insertion point z coordinate textHeight = 1 'Set text height to 1.0 textStr = "Hello World!" 'Set the text string 'Create Text object Set textObj = ThisDrawing.ModelSpace.AddText (textStr, insPoint, textHeight)

8. Escribe el código que guarda el dibujo después del código introducido en el paso 6. ThisDrawing.SaveAs("Hello.dwg")

9. Para ejecutarlo elige la opción Ejecutar Sub/UserForm en el menú Ejecutar del IDE de VBA.

Cuando termine la ejecución del programa, pon la aplicación de AutoCAD en primer plano. Ahora podrás ver el texto 'Hola a todos' en el dibujo. Se habrá creado un nuevo dibujo cuyo nombre debe ser Hello.dwg.

3. COMANDOS DE AUTOCAD VBA • VBAIDE: Abre el IDE de VBA. Permite editar, ejecutar y depurar programas de forma interactiva.

Aunque sólo se llama al IDE de VBA mientras se ejecuta AutoCAD, es posible minimizarlo, abrirlo y cerrarlo con independencia de la ventana de aplicación de AutoCAD.

• VBACARGAR: Carga un proyecto VBA en la sesión actual de AutoCAD. • VBAEJECUTAR: Ejecuta una macro de VBA desde el cuadro de diálogo Macros o desde la línea

de comando de AutoCAD. • VBADESCARGAR: Descarga un proyecto VBA de la sesión actual de AutoCAD. Si el proyecto

VBA está modificado, pero no se ha guardado, se pregunta al usuario si desea guardarlo en el cuadro de diálogo Guardar proyecto (o el equivalente de la línea de comando).

• VBADMIN: Muestra el Administrador de VBA, donde puede ver, crear, cargar, cerrar, incrustar y extraer proyectos.

• VBAENUN: Ejecuta una declaración de VBA desde la línea de comando de AutoCAD.

Práctica 9 Pág: 4

Page 5: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

4. CREACIÓN Y EDICIÓN DE ENTIDADES DE AUTOCAD En AutoCAD puede crear una variada gama de objetos, tan sencillos como una línea o un círculo, o tan complejos como curvas spline, elipses y sombreados asociativos. En general, los objetos se añaden al espacio modelo mediante uno de los métodos Add. También puede crear objetos en el espacio papel o en un bloque. Una vez creado un objeto, puede cambiar su capa, color y tipo de línea. También puede añadirle texto para incluir anotaciones. En el capítulo 4 del Manual del desarrollador de ActiveX y VBA se amplia la información sobre:

Creación de objetos Edición de objetos Uso de capas, colores y tipos de línea Añadir texto a los dibujos

5. UTILIZACIÓN DE EVENTOS Los eventos son notificaciones o mensajes que AutoCAD envía para informarle del estado actual de la sesión o para alertarle de que ha sucedido algo. Por ejemplo, al abrir un dibujo se activa el evento BeginOpen. Este evento contiene el nombre del dibujo de AutoCAD que se ha abierto. Cuando se cierra un dibujo se activa otro evento. Con esta información, podría escribir una subrutina o controlador de eventos que utilice los eventos para realizar el seguimiento del tiempo que un usuario trabaja en un dibujo determinado.

En el capítulo 7 del Manual del desarrollador de ActiveX y VBA se amplia la información sobre:

Descripción de los eventos de AutoCAD Directrices para escribir controladores de eventos Control de eventos de aplicación Control de eventos de documento Control de eventos de objeto

6. DESARROLLO DE APLICACIONES CON VBA Existen muchas tareas de programación para las que no basta con trabajar con el modelo de objetos ActiveX de AutoCAD En este capítulo se proporciona una breve presentación general de la creación de cuadros de diálogo, la rutina de control de errores, el control del foco de la ventana y la distribución de aplicaciones. Recuerde que la documentación de Microsoft para VBA contiene más información sobre estos temas.

Más terminología de VBA Utilización de formularios en VBA Gestión de errores Protección de los módulos de código de VBA Ejecución de macros de VBA desde un menú o una barra de herramientas Carga automática de proyectos de VBA Ejecución automática de una macro de VBA Apertura automática del entorno de desarrollo de VBA al cargar un proyecto Utilización de un estado de cero documentos Distribución de aplicaciones

7. EJERCICIO GUIADO: DISEÑO CAMINO DE JARDÍN Extraído del Manual del desarrollador de ActiveX y VBA Capítulo 13. En este ejercicio se muestra cómo añadir una macro nueva a AutoCAD, se explica cómo funcionan ActiveX y Visual Basic for Applications (VBA) y se enseña la manera de sacar el mayor partido posible a estas tecnologías. El aprendizaje está concebido para la arquitectura paisajística, pero los conceptos que se aprenderán serán de gran importancia independientemente del campo en que se apliquen. Este ejercicio está diseñado para usuarios con experiencia en AutoCAD que empiezan a utilizar la programación en VBA.

Práctica 9 Pág: 5

Page 6: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Definición del objetivo El objetivo de este ejercicio consiste en desarrollar una macro nueva para AutoCAD que dibuje un camino de jardín y lo rellene con baldosas circulares de hormigón. La nueva macro contará con la siguiente secuencia de comandos:

Comando: gardenpath Punto inicial del camino: El usuario determina el punto inicial. Punto final del camino: El usuario determina el punto final. Anchura media del camino: El usuario introduce un número. Radio de las baldosas: El usuario introduce un número. Intervalo entre las baldosas: El usuario introduce un número.

En primer lugar, la macro solicita al usuario que escriba el punto inicial y el punto final para especificar la línea de centro del camino. A continuación, pide al usuario que introduzca la mitad de la anchura del camino y el radio de las baldosas circulares. Por último, se introduce el intervalo entre baldosas. Se especifica la mitad de la anchura del camino en lugar de la anchura completa porque desde la línea central del camino resulta más fácil visualizar la mitad de la anchura. Escritura de la primera función Esta macro se va a desarrollar por medio de una serie de funciones y subrutinas. Muchas de estas subrutinas requieren la manipulación de ángulos. Dado que ActiveX mide los ángulos en radianes pero la mayoría de los usuarios mide los ángulos en grados, empiece por definir una función para convertir grados en radianes. Si aún no está abierto el entorno de desarrollo de VBA, ábralo escribiendo el comando VBAIDE. En VBA, seleccione en el menú Ver la opción Código, o pulse F7 para abrir la ventana Código. Si hay algún procedimiento en dicha ventana, bórralo. Conversión de grados a radianes Escriba el código siguiente en la ventana Código:

Option Explicit Const pi = 3.14159 ' Convert angle in degrees to radians Function dtr(a As Double) As Double dtr = (a / 180) * pi End Function

Observe el código. En primer lugar, la constante pi está definida con un valor 3.14159. Esto permite utilizar la palabra pi en vez de tener que escribir 3.14159 cada vez que se necesita utilizar este valor. A continuación se va a definir una función llamada dtr (convertir grados en radianes). Esta función acepta un solo argumento, a, que es el ángulo en grados. El resultado se obtiene dividiendo los grados por 180 y multiplicando el cociente por pi. La línea que comienza por una comilla simple es un comentario; VBA pasa por alto todo el texto que se encuentra precedido por este signo. Ahora puede utilizar esta función en otras subrutinas del proyecto. Éste es un buen momento para guardar el trabajo. Seleccione el comando Archivo Guardar. El nombre predeterminado del proyecto es project.dvb, pero puede modificarlo si lo desea. Asigne al proyecto el nombre gardenpath.dvb. Cálculo de la distancia entre dos puntos A continuación, añada una función para calcular la distancia entre puntos. Añada las líneas de código siguientes después de la función dtr:

' Calculate distance between two points Function distance(sp As Variant, ep As Variant) As Double Dim x As Double Dim y As Double Dim z As Double x = sp(0) - ep(0) y = sp(1) - ep(1) z = sp(2) - ep(2) distance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2)) End Function

Práctica 9 Pág: 6

Page 7: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Obtención de los datos Esta macro pregunta al usuario dónde desea dibujar el camino, su anchura, el tamaño de las baldosas de hormigón y el intervalo entre ellas. Ahora va a definir una función que solicita esta información al usuario y calcula varios números para su uso en el resto de la macro. En esta subrutina se van a utilizar los métodos de introducción de datos por parte del usuario que se encuentran en el objeto Utility. La siguiente subrutina utiliza varias variables globales. Todas las variables globales deben estar declaradas para que la subrutina pueda acceder a ellas. Declaración de variables globales En el IDE de VBA, escriba el código siguiente en la ventana de código, inmediatamente después de la línea Const pi = 3.14159:

' Variables used to store garden path parameters Private sp(0 To 2) As Double Private ep(0 To 2) As Double Private hwidth As Double Private trad As Double Private tspac As Double Private pangle As Double Private plength As Double Private totalwidth As Double Private angp90 As Double Private angm90 As Double

Observe ahora las dos listas desplegables de la parte superior de la ventana Código. Se trata de los cuadros de lista Objeto y Procedimiento, que actualmente presentan, respectivamente, los términos (General) y (Declaraciones). Estas listas presentan la sección actual del código con el que se está trabajando, y permiten pasar rápidamente a una sección distinta con sólo seleccionar un elemento de la lista. La sección (Declaraciones) es el lugar adecuado para declarar variables que se van a utilizar en más de una subrutina. Observe la línea Option Explicit que se encuentra en la parte superior de la sección (Declaraciones). Cuando aparece la instrucción Option Explicit en un módulo es necesario declarar de forma explícita las variables por medio de una instrucción Dim, Private, Public, ReDim o Static. Si se intenta utilizar un nombre de variable sin declarar se produce un error. Si no se utiliza la instrucción Option Explicit, todas las variables sin declarar son del tipo Variant, excepto si se indica otro tipo. Se recomienda utilizar siempre Option Explicit para evitar la escritura incorrecta de los nombres de variables y para evitar la confusión del código en que no está claro el alcance de la variable. Solicitud de datos de usuario La subrutina gpuser solicita al usuario toda la información necesaria para la construcción del camino de jardín. Añada las líneas de código siguientes después de la función distance:

' Acquire information for garden path Private Sub gpuser() Dim varRet As Variant varRet = ThisDrawing.Utility.GetPoint( , "Start point of path: ") sp(0) = varRet(0) sp(1) = varRet(1) sp(2) = varRet(2) varRet = ThisDrawing.Utility.GetPoint( , "Endpoint of path: ") ep(0) = varRet(0) ep(1) = varRet(1) ep(2) = varRet(2) hwidth = ThisDrawing.Utility.GetDistance(sp, "Half width of path: ") trad = ThisDrawing.Utility.GetDistance(sp, "Radius of tiles: ") tspac = ThisDrawing.Utility.GetDistance(sp, "Spacing between tiles: ") pangle = ThisDrawing.Utility.AngleFromXAxis( sp, ep) totalwidth = 2 * hwidth

Práctica 9 Pág: 7

Page 8: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

plength = distance(sp, ep) angp90 = pangle + dtr(90) angm90 = pangle - dtr(90) End Sub

Acaba de definir una función llamada gpuser. No requiere argumentos y solicita al usuario que escriba la información deseada. La línea Dim varRet As Variant declara únicamente la variable varRet. Dado que esta variable se utiliza únicamente en esta subrutina, se puede declarar aquí localmente, en vez de colocarla en la sección (Declaraciones) del código. La línea siguiente, varRet = ThisDrawing.Utility.GetPoint( , "Start point of path: "), llama al método GetPoint. El guión bajo al final de una línea indica a VBAIDE que continúe leyendo la línea siguiente como si se tratara de la misma. Es innecesario. Se puede eliminar colocando todo el código en una línea. No obstante, esto hace más fáciles de leer las líneas de código largas. Para acceder al método GetPoint se debe pasar antes por el objeto ThisDrawing, que representa el dibujo actual. Después de ThisDrawing se coloca un punto (.), que significa que se va a acceder a algo que se encuentra dentro de ese objeto. Después del punto se escribe Utility y otro punto. De nuevo, se va a acceder a algo que se encuentra dentro del objeto Utility. Por último, escriba GetPoint, que es el nombre del método al que se está llamando. El método GetPoint tiene dos parámetros. El primero es opcional, y no se va a utilizar. Déjelo en blanco y coloque una coma para marcar su posición. El segundo parámetro es la solicitud, que también es opcional. Para este parámetro se ha introducido una cadena de caracteres que solicita al usuario que introduzca el punto inicial. El punto que introduce el usuario se coloca en la variable varRet. Las tres líneas siguientes de la subrutina copian el punto que devuelve el usuario en la matriz sp. El punto final se devuelve de la misma forma. El método GetDistance se utiliza para obtener la mitad de la anchura del camino (hwidth), el radio de las baldosas (trad) y el intervalo entre baldosas (tspac). El método GetDistance tiene dos parámetros. El primero es un punto de base. Para este valor se proporciona el punto inicial. El segundo parámetro es la solicitud, y tiene como valor una cadena que solicita al usuario que introduzca los datos adecuados. El aspecto más interesante del método GetDistance es que puede devolver un valor introducido en la línea de comando o la distancia entre un punto seleccionado en AutoCAD y el punto inicial. La subrutina pasa a calcular una serie de variables que se utiliza más adelante en la macro. El valor de la variable pangle es el ángulo comprendido entre el punto inicial y el final, que se encuentra con el método AngleFromXAxis. La anchura del camino se obtiene multiplicando por dos la mitad de la anchura. La variable plength se define como la longitud del camino y se encuentra por medio de la función distance introducida antes. Por último, se calcula y se guarda el ángulo del camino más y menos 90 grados en angp90 y angm90, respectivamente. En la ilustración se muestra cómo las variables obtenidas por gpuser especifican las dimensiones del camino.

Práctica 9 Pág: 8

Page 9: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Trazado del contorno del camino Ahora que ha obtenido la posición y la anchura del camino, puede dibujar el contorno. Añada el código siguiente a continuación de la subrutina gpuser:

' Draw outline of path Private Sub drawout() Dim points(0 To 9) As Double Dim pline As AcadLWPolyline Dim varRet As Variant varRet = ThisDrawing.Utility.PolarPoint( sp, angm90, hwidth) points(0) = varRet(0) points(1) = varRet(1) points(8) = varRet(0) points(9) = varRet(1) varRet = ThisDrawing.Utility.PolarPoint(varRet, pangle, plength) points(2) = varRet(0) points(3) = varRet(1) varRet = ThisDrawing.Utility.PolarPoint(varRet, angp90, totalwidth) points(4) = varRet(0) points(5) = varRet(1) varRet = ThisDrawing.Utility.PolarPoint(varRet, pangle + dtr(180), plength) points(6) = varRet(0) points(7) = varRet(1) Set pline = ThisDrawing.ModelSpace.AddLightWeightPolyline(points) End Sub

Esta subrutina dibuja el contorno del camino utilizando el método AddLightweightPolyline. Este método tiene un parámetro: una matriz de puntos que componen la polilínea. Debe encontrar todos los puntos que componen el objeto de polilínea y organizarlos en una matriz, en el mismo orden en que deban trazarse. Para esta polilínea, los puntos que se necesitan son las esquinas del camino. Para encontrarlas, utilice el método PolarPoint. Este método busca un punto con un ángulo y una distancia respecto al punto base determinados. Empiece por el punto inicial (sp) y busque la primera esquina del camino, en sentido contrario a las agujas del reloj. Esta esquina se encuentra a una distancia de la mitad de la anchura del camino (hwidth) y a -90 grados del ángulo del camino. Dado que se desea dibujar un rectángulo cerrado para el camino, este punto es el primero y el último de la matriz. Por tanto, las coordenadas X e Y que devuelve el método PolarPoint se desplazan a las posiciones primera y última de la matriz de puntos. Las demás esquinas del camino se buscan de la misma forma, utilizando la longitud y la anchura del camino (plength y width) y el ángulo del camino. Cada vez que se llama al método PolarPoint, las coordenadas devueltas (varRet) se copian en la matriz de puntos. Cuando se han identificado las cuatro esquinas en la matriz de puntos, se llama al método AddLightweightPolyline. Observe que se llama a este método desde el objeto ModelSpace. Si se ejecutara esta macro también se observaría que la polilínea no es aún visible en AutoCAD. No será visible hasta que se actualice la presentación, cosa que se hará más adelante. Dibujo de las baldosas Ahora que ha desarrollado y la subrutina de introducción de datos por parte del usuario y la que dibuja el contorno, está listo para rellenar el camino con las baldosas circulares. Esta tarea requiere el uso de la geometría. En el IDE de VBA, escriba el código siguiente en la ventana de código, después de la subrutina drawout:

' Place one row of tiles the given distance along path and possibly offset it Private Sub drow(pd As Double, offset As Double) Dim pfirst(0 To 2) As Double Dim pctile(0 To 2) As Double Dim pltile(0 To 2) As Double

Práctica 9 Pág: 9

Page 10: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Dim cir As AcadCircle Dim varRet As Variant varRet = ThisDrawing.Utility.PolarPoint(sp, pangle, pd) pfirst(0) = varRet(0) pfirst(1) = varRet(1) pfirst(2) = varRet(2) varRet = ThisDrawing.Utility.PolarPoint(pfirst, angp90, offset) pctile(0) = varRet(0) pctile(1) = varRet(1) pctile(2) = varRet(2) pltile(0) = pctile(0) pltile(1) = pctile(1) pltile(2) = pctile(2) Do While distance(pfirst, pltile) < (hwidth - trad) Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad) varRet = ThisDrawing.Utility.PolarPoint(pltile, angp90, (tspac + trad + trad)) pltile(0) = varRet(0) pltile(1) = varRet(1) pltile(2) = varRet(2) Loop varRet = ThisDrawing.Utility.PolarPoint(pctile, angm90, tspac + trad + trad) pltile(0) = varRet(0) pltile(1) = varRet(1) pltile(2) = varRet(2) Do While distance(pfirst, pltile) < (hwidth - trad) Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad) varRet = ThisDrawing.Utility.PolarPoint(pltile, angm90, (tspac + trad + trad)) pltile(0) = varRet(0) pltile(1) = varRet(1) pltile(2) = varRet(2) Loop End Sub ' Draw the rows of tiles Private Sub drawtiles() Dim pdist As Double Dim offset As Double pdist = trad + tspac offset = 0 Do While pdist <= (plength - trad) drow pdist, offset pdist = pdist + ((tspac + trad + trad) * Sin(dtr(60))) If offset = 0 Then offset = (tspac + trad + trad) * Cos(dtr(60)) Else offset = 0 End If Loop End Sub

Para comprender el funcionamiento de estas subrutinas, consulte la siguiente ilustración. La subrutina drow dibuja una fila de baldosas a lo largo del camino, a la distancia especificada en su primer argumento, desfasando la fila en sentido perpendicular al camino según la distancia indicada por el segundo argumento. Las baldosas se desfasan en filas alternas para cubrir más espacio y lograr un aspecto más agradable.

Práctica 9 Pág: 10

Page 11: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

La subrutina drow localiza la posición de la primera fila utilizando el método PolarPoint para desplazarse por el camino la distancia indicada en el primer argumento. A continuación, vuelve a emplear PolarPoint para desplazarse en sentido perpendicular al camino a fin de obtener el desfase. A continuación, la subrutina utiliza la instrucción While para continuar dibujando círculos hasta llegar al borde del camino. El método PolarPoint de la primera instrucción While pasa a la posición de la siguiente baldosa, avanzando la distancia correspondiente al radio de dos baldosas (trad) y un intervalo entre baldosas (tspac). A continuación, un segundo bucle while dibuja las baldosas de la fila de la otra dirección hasta que encuentra el otro extremo del camino. La subrutina drawtiles llama repetidamente a drow para dibujar todas las filas de baldosas. La subrutina del bucle While avanza por el camino, llamando a drow para cada fila. Las baldosas de las filas adyacentes forman triángulos equiláteros, como se muestra en la figura anterior. Los lados de los triángulos son iguales a dos veces el radio de la baldosa más el intervalo entre ellas. Por tanto, según la trigonometría, la distancia entre las filas del camino es el seno de 60 grados multiplicado por esta cantidad, y el desfase de las filas impares es el coseno de 60 grados multiplicado por esta cantidad. La instrucción If se emplea en drawtiles para desfasar filas alternas. En este caso, si el desfase es igual a cero, defínalo como el intervalo entre los centros de las baldosas multiplicado por el coseno de 60, tal como se ha explicado anteriormente. Si no es igual a cero, defínalo en 0. Esto alterna el desfase de las filas de la forma deseada. Guarde el archivo. Creación de una subrutina ejecutable gardenpath En VBA, escriba el código siguiente en la ventana Código, después de la subrutina drawtiles:

' Execute command, calling constituent functions Sub gardenpath() Dim sblip As Variant Dim scmde As Variant gpuser sblip = ThisDrawing.GetVariable("blipmode") scmde = ThisDrawing.GetVariable("cmdecho") ThisDrawing.SetVariable "blipmode", 0 ThisDrawing.SetVariable "cmdecho", 0 drawout drawtiles ThisDrawing.SetVariable "blipmode", sblip ThisDrawing.SetVariable "cmdecho", scmde End Sub

La subrutina path llama a gpuser para obtener los datos necesarios. A continuación se utiliza el método GetVariable para obtener los valores actuales de las variables de sistema BLIPMODE y CMDECHO y estos valores se guardan como sblip y scmde. Después, la subrutina utiliza el método SetVariable para asignar el valor 0 a estas variables de sistema, desactivando así las marcas auxiliares y la reproducción de comandos. A continuación se dibuja el camino por medio de las subrutinas drawout y drawtiles. Por último se utiliza el método SetVariable para devolver a las variables de sistema sus valores originales. Puede observar que ésta es la única subrutina introducida que no empieza con la palabra clave Private, que impide que se llame a la subrutina desde un módulo distinto al actual. Dado que la subrutina gardenpath debe estar a disposición del usuario, se debe omitir la palabra clave Private. Comprobación del código Ahora ejecute la macro recorriendo el código paso a paso. En el menú Herr. de AutoCAD, elija Macro Macros. En el cuadro de diálogo Macros, seleccione ThisDrawing.gardenpath y pulse el botón Entrar. El entorno de desarrollo de VBA aparece en primer plano, con la primera línea de la macro gardenpath resaltada. Se trata de la línea de código que se va a ejecutar en primer lugar. Para ejecutarla, pulse F8. La siguiente línea de código que se va a ejecutar es la subrutina gpuser. Para pasar a la subrutina gpuser vuelva a pulsar F8.

Práctica 9 Pág: 11

Page 12: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Ahora se encuentra al principio de la rutina gpuser. Si pulsa de nuevo F8 resaltará el primer método GetPoint. Antes de ejecutar esta línea, seleccione Ver Ventana Locales. Esta ventana aparecerá en la parte inferior del entorno de VBA. Mientras la macro se ejecuta, todas las variables locales y sus valores se presentan en la ventana Locales. Pulse ahora F8 para ejecutar el método GetPoint. Observará que desaparece el texto resaltado y no se presenta más código. Esto se debe a que el método GetPoint está esperando a que el usuario introduzca un punto en AutoCAD. Vuelva a la ventana de AutoCAD. Verá la solicitud establecida en la llamada a GetPoint de la línea de comando. Indique un punto. El control vuelve a la macro. Regrese al entorno de desarrollo de VBA. Ahora verá que la línea siguiente a la llamada a GetPoint está resaltada. Siga recorriendo el código, pulsando F8. Recuerde volver a la ventana de AutoCAD cuando deba introducir información. Ejecución de la macro No es necesario recorrer el código paso a paso siempre que se ejecute la macro. Puede ejecutar la macro desde la ventana Macros elija Ejecutar en vez de Entrar. Esto permite ver el transcurso de la ejecución tal y como se presentará ante el usuario. Ejecute la macro desde AutoCAD e introduzca los siguientes valores:

Herramientas Macros Ejecutar: ThisDrawing.gardenpath Punto inicial del camino: 2, 2 Punto final del camino: 9, 8 Mitad de la anchura del camino: 2 Radio de las baldosas: .2 Intervalo entre las baldosas: .1

En este ejemplo se debe dibujar un camino de jardín como se muestra en la figura. Puede experimentar con la macro gardenpath introduciendo los distintos valores por medio del ratón y el teclado. Adición de una interfaz de cuadro de diálogo El entorno de desarrollo integrado de VBA se puede utilizar para añadir cuadros de diálogo a la macro de VBA. La macro gardenpath acepta entradas en la línea de comando. Es muy fácil añadir una interfaz de cuadro de diálogo a esta macro. Los cuadros de diálogo resultan útiles para permitir que los usuarios elijan entre varias opciones. Dado que la macro gardenpath tiene muy pocas opciones de momento, ahora va a añadir algunas características adicionales. Una de ellas es una función que permite a los usuarios especificar la forma de las baldosas del camino. Empiece por copiar la versión completa de gardenpath.dvb en otro archivo, gpdialog.dvb.

1. Guarde el proyecto actual en el entorno de VBA. 2. Con Guardar como de VBA, guarde el proyecto con el nombre gpdialog.dvb.

Creación del cuadro de diálogo Los cuadros de diálogo se crean en VBA por medio de formularios. El cuadro de diálogo que va a crear contendrá dos casillas de opción (si se selecciona una, se anula la selección de la otra) para elegir la forma de las baldosas: círculo o polígono. También contendrá tres casillas de edición para la introducción de los siguientes valores numéricos: el radio de las baldosas, el intervalo entre las baldosas y el número de lados (éste último sólo estará disponible si se selecciona el botón de opción Polygon).

Práctica 9 Pág: 12

Page 13: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Para crear un cuadro de diálogo desde el entorno de desarrollo de VBA: 1- Abra un formulario nuevo, seleccionando en el menú Insertar la opción UserForm. Este comando abre dos ventanas. La primera es un cuadro de herramientas que contiene todos los controles disponibles para la creación del cuadro de diálogo. La segunda es un formulario en blanco en el que se pueden colocar los controles de la forma deseada. 2- Seleccione uno a uno los siguientes controles del cuadro de herramientas y arrástrelos al formulario. Debe colocar dos botones de opción ( ), tres etiquetas ( ), tres cuadros de texto ( ) y dos botones de comando ( ), como se muestra en la siguiente ilustración:

3- Cierre el cuadro de herramientas. Para definir las propiedades de los controles de los botones de opción 1- En el formulario, seleccione el control OptionButton1. En la ventana Propiedades, cambie las siguientes propiedades de OptionButton1: (si esta ventana no está abierta, use Ver Ventana Propiedades):

(Name) = gp_poly Caption = Polygon ControlTipText = Polygon Tile Shape Accelerator = P

2- En el formulario, seleccione el control OptionButton2. En la ventana Propiedades, cambie las siguientes propiedades de OptionButton2:

(Name) = gp_circ Caption = Circle ControlTipText = Circle Tile Shape Accelerator = I

Para definir las propiedades de los controles de etiqueta 1- En el formulario, seleccione el control Label1. En la ventana Propiedades, cambie las siguientes propiedades de Label1:

(Name) = label_trad Caption = Radius of tiles TabStop = True

2- En el formulario, seleccione el control Label2. En la ventana Propiedades, cambie las siguientes propiedades de Label2:

(Name) = label_tspac Caption = Space between tiles TabStop = True

3- En el formulario, seleccione el control Label3. En la ventana Propiedades, cambie las siguientes propiedades de Label3:

(Name) = label_tsides Caption = Number of sides TabStop = True

Práctica 9 Pág: 13

Page 14: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Para definir las propiedades de los controles de los cuadros de edición de texto 1- En el formulario, seleccione el control TextBox1. En la ventana Propiedades, cambie las siguientes propiedades de TextBox1:

(Name) = gp_trad 2- En el formulario, seleccione el control TextBox2. En la ventana Propiedades, cambie las siguientes propiedades de TextBox2:

(Name) = gp_tspac 3- En el formulario, seleccione el control TextBox3. En la ventana Propiedades, cambie las siguientes propiedades de TextBox3:

(Name) = gp_tsides Para definir las propiedades de los botones de comando y de la ventana de formulario 1- En el formulario, seleccione el control CommandButton1. En la ventana Propiedades, cambie las siguientes propiedades de CommandButton1:

(Name) = accept Caption = Aceptar ControlTipText = Accept the options Accelerator = O Default = True

2- En el formulario, seleccione el control CommandButton2. En la ventana Propiedades, cambie las siguientes propiedades de CommandButton2:

(Name) = cancel Caption = Cancel ControlTipText = Cancel the operation Accelerator = C

3- En la ventana del formulario, seleccione el objeto UserForm1 haciendo clic en el fondo del formulario, fuera de los controles. En la ventana Propiedades, cambie la siguiente propiedad de UserForm1:

(Name) = gpDialog Caption = Garden Path

El formulario deberá presentar este aspecto. Uso de la ventana Proyecto para desplazarse por el proyecto Dedique un momento a orientarse en el entorno actual. Observe la ventana Proyecto del IDE de VBA. Puede ver el nombre y la posición del proyecto, una carpeta llamada AutoCAD Objetos y otra llamada Formularios. Si abre la carpeta AutoCAD Objetos verá el icono de dibujo de AutoCAD y el nombre ThisDrawing. Si abre la carpeta Formularios verá un icono de formulario con el nombre gpDialog. Éste es el formulario que acaba de crear. Para ver el código asociado al formulario, resalte gpDialog en la ventana Proyecto del IDE de VBA.

En la ventana Proyecto, haga clic en el botón Ver código ( ) o pulse F7. Se abre la ventana de código del formulario. Dado que aún no ha escrito ningún código para el formulario, esta ventana está en blanco. Puede volver a presentar el formulario haciendo clic en el botón Ver objeto de la ventana Proyecto o pulsando MAYUS+F7. Ahora, resalte ThisDrawing en la ventana Proyecto. De nuevo, puede mostrar el código pulsando el botón Ver código. En esta ventana aparece todo el código que ya se ha introducido. La ventana Proyecto sirve para recorrer el código e identificar dónde se está trabajando en la actualidad.

Práctica 9 Pág: 14

Page 15: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Actualización del código ya escrito Ahora que ha creado un cuadro de diálogo puede introducir el código que lo haga funcionar, pero antes debe actualizar el código que ya ha introducido. El código de ThisDrawing debe estar abierto. Actualización de variables globales para utilizarlas en un cuadro de diálogo Actualice o añada las líneas siguientes de la sección (Declaraciones):

Public trad As Double ' Updated Public tspac As Double ' Updated Public tsides As Integer ' Add Public tshape As String ' Add

De este modo, las definiciones de variable de trad y tspac se hacen públicas en vez de privadas. Las variables privadas sólo están disponibles dentro del módulo en el que están definidas. Esto era lo conveniente antes, pero ahora el código del formulario necesita acceder a estas variables, por lo que se deben hacer públicas. Además se han añadido dos nuevas variables, tsides y tshape. Estas variables contienen el número de lados de las baldosas poligonales y la forma de baldosa elegida por el usuario: círculo o polígono. Actualización de la subrutina gpuser para utilizarla en un cuadro de diálogo Vaya a la subrutina gpuser. Elimine las dos líneas que obtienen el radio de las baldosas y el intervalo entre baldosas. Esta información va a proceder del formulario. Suprimir

trad = ThisDrawing.Utility.GetDistance(sp, "Radius of tiles: ") tspac = ThisDrawing.Utility.GetDistance(sp, "Spacing between tiles: ")

Añada las líneas que cargan y muestran el formulario. Añada las siguientes líneas en el lugar de las que ha eliminado arriba:

Load gpDialog gpDialog.Show

La nueva subrutina gpuser presenta el siguiente aspecto:

' Acquire information for garden path Private Sub gpuser() Dim varRet As Variant varRet = ThisDrawing.Utility.GetPoint(,"Start point of path: ") sp(0) = varRet(0) sp(1) = varRet(1) sp(2) = varRet(2) varRet = ThisDrawing.Utility.GetPoint(, "Endpoint of path: ") ep(0) = varRet(0) ep(1) = varRet(1) ep(2) = varRet(2) hwidth = ThisDrawing.Utility.GetDistance(sp, "Half width of path: ") Load GPDialog GPDialog.Show pangle = ThisDrawing.Utility.AngleFromXAxis(sp, ep) totalwidth = 2 * hwidth plength = distance(sp, ep) angp90 = pangle + dtr(90) angm90 = pangle - dtr(90) End Sub

A continuación debe añadir una subrutina que dibuje las baldosas circulares o poligonales. Añada las siguientes líneas al final del archivo de código:

'Draw the tile with the designated shape Sub DrawShape(pltile) Dim angleSegment As Double Dim currentAngle As Double Dim angleInRadians As Double

Práctica 9 Pág: 15

Page 16: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Dim currentSide As Integer Dim varRet As Variant Dim aCircle As AcadCircle Dim aPolygon As AcadLWPolyline ReDim points(1 To tsides * 2) As Double 'Branch based on the type of shape to draw Select Case tshape Case "Circle" Set aCircle = ThisDrawing.ModelSpace.AddCircle(pltile, trad) Case "Polygon" angleSegment = 360 / tsides currentAngle = 0 For currentSide = 0 To (tsides - 1) angleInRadians = dtr(currentAngle) varRet = ThisDrawing.Utility.PolarPoint(pltile,angleInRadians, trad) points((currentSide * 2) + 1) = varRet(0) points((currentSide * 2) + 2) = varRet(1) currentAngle = currentAngle + angleSegment Next currentSide Set aPolygon = ThisDrawing.ModelSpace.AddLightWeightPolyline(points) aPolygon.Closed = True End Select End Sub

Esta subrutina utiliza una instrucción Select Case para asignar el control del programa según el tipo de forma que se va a dibujar. La variable tshape se utiliza para determinar el tipo de forma. Actualización de la subrutina drow para dibujar una baldosa con la forma adecuada A continuación, vaya a la subrutina drow. En los dos lugares en los que aparece la siguiente línea:

Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad) Actualice estas líneas para asignarles el siguiente texto:

DrawShape (pltile) ' Updated Adición de código al cuadro de diálogo Ahora debe quitar el código de creación de baldosas circulares y llamar a la subrutina DrawShape para dibujar la forma adecuada. Adición de controladores de eventos a los botones de opción Abra la ventana Código de gpDialog. Añada las líneas de código siguientes después de la instrucción Option Explicit:

Private Sub gp_poly_Click() gp_tsides.Enabled = True ThisDrawing.tshape = "Polygon" End Sub Private Sub gp_circ_Click() gp_tsides.Enabled = False ThisDrawing.tshape = "Circle" End Sub

Observe que las subrutinas, gp_poly_Click() y gp_circ_Click() se basan en el nombre de los dos controles de opción que se crearon antes, aunque se les ha añadido "_Click". Estas subrutinas son especiales, porque se ejecutan automáticamente cuando el usuario hace clic en el control que lleva su nombre. Observe los cuadros Objeto y Procedimiento, en la parte superior de la ventana Código. Abra el cuadro Objeto y observe la lista desplegable. Verá una lista de todos los controles añadidos al formulario, ordenados por orden alfabético según su propiedad Name.

Práctica 9 Pág: 16

Page 17: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

A continuación, coloque el cursor en la línea Private Sub gp_poly_Click() y abra el cuadro Procedimiento. Verá una lista de todos los procedimientos y eventos que se pueden asignar al control de opción gp_poly. Las dos subrutinas agregadas hace un momento responden al evento Click. También se puede añadir código que responda al procedimiento de evento DblClick, ejecutándose automáticamente cuando el usuario haga doble clic en el control. Se puede añadir código para cualquiera de los eventos de la lista. Estas subrutinas son los controladores de eventos. Observe el código introducido para estos dos controladores de eventos. El primero de ellos responde al evento Click del control gp_poly de casilla de opción. La primera línea de código activa el cuadro de texto correspondiente al número de lados. Este cuadro de texto sólo está disponible para los polígonos, por lo que se activa únicamente si se selecciona el control Polygon. La siguiente línea de código establece la variable tshape en Polygon. El segundo controlador de eventos responde al evento Click del control gp_circ de casilla de opción. Este controlador desactiva el cuadro de edición de texto correspondiente al número de lados y establece la variable tshape en Circle. Adición de controladores de eventos para el botón Aceptar Ahora, añada el siguiente controlador de eventos para el botón Aceptar:

Private Sub accept_Click() If ThisDrawing.tshape = "Polygon" Then ThisDrawing.tsides = CInt(gp_tsides.text) If (ThisDrawing.tsides < 3#) Or (ThisDrawing.tsides > 1024#) Then MsgBox "Enter a value between 3 and " & "1024 for the number of sides." Exit Sub End If End If ThisDrawing.trad = CDbl(gp_trad.text) ThisDrawing.tspac = CDbl(gp_tspac.text) If ThisDrawing.trad < 0# Then MsgBox "Enter a positive value for the radius." Exit Sub End If If (ThisDrawing.tspac < 0#) Then MsgBox "Enter a positive value for the spacing." Exit Sub End If GPDialog.Hide End Sub

Aquí es donde se efectúa realmente el trabajo del formulario. Este controlador de sucesos comprueba en primer lugar si se ha elegido la forma poligonal. Si es así, recupera el número de lados del polígono del control gp_tsides. El valor introducido por el usuario se almacena en la propiedad Text. Dado que se almacena como cadena de texto, se puede convertir en su equivalente en enteros por medio de la función CInt de Visual Basic. Después de obtener este valor, el controlador de sucesos comprueba el alcance del valor para asegurarse de que se encuentra comprendido entre 3 y 1024. Si no es así presenta un mensaje de error y deja de ejecutarse. El resultado es un mensaje que ofrece al usuario la oportunidad de modificar el valor. Cuando se vuelve a pulsar el botón Aceptar el controlador de sucesos vuelve a comprobar el valor.

Práctica 9 Pág: 17

Page 18: Dibujar Autocad

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

Los valores del radio y el espacio entre baldosas se obtienen de la misma forma, aunque son valores dobles y no enteros, y se obtienen por medio de la función CDbl. También se verifican estos valores para comprobar que son positivos. Después de obtener y verificar los valores, la instrucción gpDialog.Hide oculta el formulario y devuelve el control a la subrutina que lo abrió. Adición de controladores de eventos para el botón Cancelar Ahora, añada el siguiente controlador de eventos para el botón Cancelar:

Private Sub cancel_Click() Unload Me End End Sub

Este sencillo controlador de eventos descarga el formulario y pone fin a la macro. Lo único que queda por hacer es añadir los valores iniciales del formulario. Existe un evento llamado Initialize aplicable al formulario. Se ejecuta cuando se carga el formulario. Adición de controladores de eventos para la inicialización del formulario: Añada el siguiente controlador de eventos para la inicialización del formulario:

Private Sub UserForm_Initialize() gp_circ.Value = True gp_trad.Text = ".2" gp_tspac.Text = ".1" gp_tsides.Text = "5" gp_tsides.Enabled = False ThisDrawing.tsides = 5 End Sub

Este código establece los valores iniciales del formulario y de la variable tsides. El valor de tsides debe ser un número positivo mayor de 3, incluso si el usuario selecciona un círculo. Para entender esto, observe la subrutina DrawShape introducida anteriormente. En ella hay una variable llamada points que se define a partir del número de lados del polígono. Se asigna memoria a esta variable tanto si se solicita una forma poligonal como si no es así. Por tanto, es necesario definir un valor válido para tsides. El usuario puede modificarlo a voluntad durante la ejecución de la macro. Ahora puede ejecutar la macro.

Práctica 9 Pág: 18