Está en la página 1de 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 Sentencias Eventos

Módulo
Objeto

Propiedades Sentencias Procedimientos

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

También podría gustarte