Dibujar Autocad
Dibujar Autocad
Dibujar Autocad
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 Aplicacin o Programa: Conjunto de bloques de instrucciones y de objetos de control que realizan una funcin o tarea. Se divide en mdulos. Mdulo: Pueden ser de tres clases: Formulario: Ventanas que sirven de interfaz de la aplicacin. Contiene controles, eventos, declaraciones de variables y procedimientos. Estndar: Contiene declaraciones de variables y procedimientos. Clase: Contiene definiciones de nuevos objetos con sus mtodos y propiedades. Procedimiento: Conjunto de instrucciones que forman el cdigo. Pueden ser subrutinas o funciones. Objeto: Cada uno de los elementos sobre los que acta 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 smbolos, objetos no grficos y preferencias. Evento: Cdigo que se ejecuta cada vez que se realiza una accin sobre un objeto: clic, doble clic, arrastrar, cargar, modificar, etc. Propiedad: Atributos de los objetos: nombre, color, fuente, posicin, etc. Mtodo: Funcin que realiza una accin 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 tpicos de la interfaz: Barra de Mens Barra de herramientas estndar: Contiene los botones con las herramientas mas comunes. Ventana Project: Estructura en rbol con la informaron referente al proyecto actual: Objetos, Formularios y Mdulos Ventana UserForm (Cdigo) contiene el cdigo 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 disean los formularios. 1.3 APLICACIONES EN VBA Estn compuestas de mdulos, como mnimo uno, pudiendo tener varios de cada uno de los tres tipos posibles. Dichos mdulos contienen el cdigo de la aplicacin, 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 cdigo como cualquier otro modulo, declaraciones, eventos y procedimientos.
Prctica 9
Pg: 1
Universitat Jaume I
Modulo de Formulario: Sirven de interfaz con el usuario. Contienen objetos grficos denominados controles (botones, cuadros de texto, listas, etc.) mediante los que se puede mostrar e introducir informacin. Adems tambin contienen cdigo: 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 botn. Modulo estndar: Contiene cdigo 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 mtodos. VBA emplea este tipo de mdulos para definir los objetos que son propios de Autocad y que no existen en Visual Basic. La programacin 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 ejecucin. El cdigo de la aplicacin se encuentra repartido por los distintos mdulos. Para acceder a la ventana de cdigo hay varias opciones: 1. En la ventana Proyecto pulsar el botn derecho sobre algn objeto de los que componen la aplicacin y elegir Ver Cdigo. 2. En el men desplegadle elegir Ver y luego Cdigo 3. Hacer doble clic sobre un objeto de la ventana Proyecto 4. Pulsar F7. Al acceder a la ventana de cdigo 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 cdigo que se introduzca. Por ejemplo, en el cdigo 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 mdulos aparece en la lista de la izquierda el elemento General y al elegirlo aparece en la derecha el elemento Declaraciones. En esta seccin es donde deben definirse las variables y procedimientos que se van a usar en todo el modulo.
Prctica 9
Pg: 2
Universitat Jaume I
En el men de edicin aparecen las tpicas opciones (cortar, pegar, etc.) y adems hay cinco herramientas que resultan muy tiles: Lista de propiedades y mtodos: del objeto con el que se esta trabando. Lista de constantes: que se pueden asignar al valor de una propiedad. Informacin rpida: ayuda sobre la sintaxis del elemento que se esta escribiendo. Informacin de parmetros: sintaxis de los parmetros de la funcin que se esta escribiendo. Palabra completa: termina de escribir la palabra que se ha empezado. Comentarios: Se indican poniendo un apstrofe delante del texto. Pueden estar al principio o en medio de una lnea. Constantes: Se indican con la palabra reservada Const delante del identificador. Opcionalmente se puede escribir su tipo despus 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, bolanos, strings,..) y adems de toda una serie de tipos de datos especficos llamados tipos de objetos que permiten definir variables para contener elementos como entidades de dibujo, objetos grficos de formulario (cuadros de texto, botones..), objetos HTML, OLE, etc. La estructura de objetos de VBA se muestran en la figura 3
Prctica 9
Pg: 3
Universitat Jaume I
2. EJERCICIO DE INTRODUCCIN
Extrado del Manual del desarrollador de ActiveX y VBA Captulo 1 Una vez introducidos los conceptos bsicos de la programacin en AutoCAD VBA, podemos intentar crear un sencillo ejemplo de "Hola a todos". En este ejercicio crear un dibujo de AutoCAD, le aadir una lnea de texto y lo guardar, todo ello desde VBA. 1. Abre el IDE de VBA desde la lnea de comando de AutoCAD: Comando:VBAIDE o pulsando Alt+F11 2. Abre la ventana de cdigo seleccionando la opcin Cdigo de del men Ver en el IDEVBA. 3. Para crear un procedimiento nuevo en el proyecto, elige la opcin Procedimiento en el men Insertar en el IDE de VBA. 4. Cuando se solicite informacin del procedimiento, escribe un nombre, por ejemplo, Hola_a_todos. Asegrate de que el tipo seleccionado sea Procedimiento y el mbito Pblico. 5. Elige Aceptar. 6. Escribe el cdigo siguiente (que abre un dibujo nuevo) entre las lneas Public Sub Hola_a_todos() y End Sub. ThisDrawing.Application.Documents.Add 7. Escribe el cdigo siguiente (que crea la cadena de texto y define el punto donde se inserta) inmediatamente despus del cdigo 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 cdigo que guarda el dibujo despus del cdigo introducido en el paso 6. ThisDrawing.SaveAs("Hello.dwg") 9. Para ejecutarlo elige la opcin Ejecutar Sub/UserForm en el men Ejecutar del IDE de VBA. Cuando termine la ejecucin del programa, pon la aplicacin de AutoCAD en primer plano. Ahora podrs ver el texto 'Hola a todos' en el dibujo. Se habr creado un nuevo dibujo cuyo nombre debe ser Hello.dwg.
Prctica 9
Pg: 4
Universitat Jaume I
5. UTILIZACIN DE EVENTOS
Los eventos son notificaciones o mensajes que AutoCAD enva para informarle del estado actual de la sesin 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 informacin, podra 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 captulo 7 del Manual del desarrollador de ActiveX y VBA se amplia la informacin sobre: Descripcin de los eventos de AutoCAD Directrices para escribir controladores de eventos Control de eventos de aplicacin Control de eventos de documento Control de eventos de objeto
Prctica 9
Pg: 5
Universitat Jaume I
Definicin del objetivo El objetivo de este ejercicio consiste en desarrollar una macro nueva para AutoCAD que dibuje un camino de jardn y lo rellene con baldosas circulares de hormign. 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 nmero. Radio de las baldosas: El usuario introduce un nmero. Intervalo entre las baldosas: El usuario introduce un nmero. En primer lugar, la macro solicita al usuario que escriba el punto inicial y el punto final para especificar la lnea de centro del camino. A continuacin, 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 lnea central del camino resulta ms fcil visualizar la mitad de la anchura. Escritura de la primera funcin Esta macro se va a desarrollar por medio de una serie de funciones y subrutinas. Muchas de estas subrutinas requieren la manipulacin de ngulos. Dado que ActiveX mide los ngulos en radianes pero la mayora de los usuarios mide los ngulos en grados, empiece por definir una funcin para convertir grados en radianes. Si an no est abierto el entorno de desarrollo de VBA, bralo escribiendo el comando VBAIDE. En VBA, seleccione en el men Ver la opcin Cdigo, o pulse F7 para abrir la ventana Cdigo. Si hay algn procedimiento en dicha ventana, brralo. Conversin de grados a radianes Escriba el cdigo siguiente en la ventana Cdigo: 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 cdigo. 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 continuacin se va a definir una funcin llamada dtr (convertir grados en radianes). Esta funcin 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 lnea 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 funcin 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. Clculo de la distancia entre dos puntos A continuacin, aada una funcin para calcular la distancia entre puntos. Aada las lneas de cdigo siguientes despus de la funcin 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
Prctica 9
Pg: 6
Universitat Jaume I
Obtencin de los datos Esta macro pregunta al usuario dnde desea dibujar el camino, su anchura, el tamao de las baldosas de hormign y el intervalo entre ellas. Ahora va a definir una funcin que solicita esta informacin al usuario y calcula varios nmeros para su uso en el resto de la macro. En esta subrutina se van a utilizar los mtodos de introduccin 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. Declaracin de variables globales En el IDE de VBA, escriba el cdigo siguiente en la ventana de cdigo, inmediatamente despus de la lnea 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 Cdigo. Se trata de los cuadros de lista Objeto y Procedimiento, que actualmente presentan, respectivamente, los trminos (General) y (Declaraciones). Estas listas presentan la seccin actual del cdigo con el que se est trabajando, y permiten pasar rpidamente a una seccin distinta con slo seleccionar un elemento de la lista. La seccin (Declaraciones) es el lugar adecuado para declarar variables que se van a utilizar en ms de una subrutina. Observe la lnea Option Explicit que se encuentra en la parte superior de la seccin (Declaraciones). Cuando aparece la instruccin Option Explicit en un mdulo es necesario declarar de forma explcita las variables por medio de una instruccin 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 instruccin 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 confusin del cdigo en que no est claro el alcance de la variable. Solicitud de datos de usuario La subrutina gpuser solicita al usuario toda la informacin necesaria para la construccin del camino de jardn. Aada las lneas de cdigo siguientes despus de la funcin 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
Prctica 9
Pg: 7
Universitat Jaume I
plength = distance(sp, ep) angp90 = pangle + dtr(90) angm90 = pangle - dtr(90) End Sub Acaba de definir una funcin llamada gpuser. No requiere argumentos y solicita al usuario que escriba la informacin deseada. La lnea 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 seccin (Declaraciones) del cdigo. La lnea siguiente, varRet = ThisDrawing.Utility.GetPoint( , "Start point of path: "), llama al mtodo GetPoint. El guin bajo al final de una lnea indica a VBAIDE que contine leyendo la lnea siguiente como si se tratara de la misma. Es innecesario. Se puede eliminar colocando todo el cdigo en una lnea. No obstante, esto hace ms fciles de leer las lneas de cdigo largas. Para acceder al mtodo GetPoint se debe pasar antes por el objeto ThisDrawing, que representa el dibujo actual. Despus de ThisDrawing se coloca un punto (.), que significa que se va a acceder a algo que se encuentra dentro de ese objeto. Despus 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 mtodo al que se est llamando. El mtodo GetPoint tiene dos parmetros. El primero es opcional, y no se va a utilizar. Djelo en blanco y coloque una coma para marcar su posicin. El segundo parmetro es la solicitud, que tambin es opcional. Para este parmetro 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 lneas 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 mtodo 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 mtodo GetDistance tiene dos parmetros. El primero es un punto de base. Para este valor se proporciona el punto inicial. El segundo parmetro es la solicitud, y tiene como valor una cadena que solicita al usuario que introduzca los datos adecuados. El aspecto ms interesante del mtodo GetDistance es que puede devolver un valor introducido en la lnea 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 ms 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 mtodo 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 funcin distance introducida antes. Por ltimo, se calcula y se guarda el ngulo del camino ms y menos 90 grados en angp90 y angm90, respectivamente. En la ilustracin se muestra cmo las variables obtenidas por gpuser especifican las dimensiones del camino.
Prctica 9
Pg: 8
Universitat Jaume I
Trazado del contorno del camino Ahora que ha obtenido la posicin y la anchura del camino, puede dibujar el contorno. Aada el cdigo siguiente a continuacin 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 mtodo AddLightweightPolyline. Este mtodo tiene un parmetro: una matriz de puntos que componen la polilnea. Debe encontrar todos los puntos que componen el objeto de polilnea y organizarlos en una matriz, en el mismo orden en que deban trazarse. Para esta polilnea, los puntos que se necesitan son las esquinas del camino. Para encontrarlas, utilice el mtodo PolarPoint. Este mtodo 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 rectngulo 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 mtodo PolarPoint se desplazan a las posiciones primera y ltima de la matriz de puntos. Las dems 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 mtodo 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 mtodo AddLightweightPolyline. Observe que se llama a este mtodo desde el objeto ModelSpace. Si se ejecutara esta macro tambin se observara que la polilnea no es an visible en AutoCAD. No ser visible hasta que se actualice la presentacin, cosa que se har ms adelante. Dibujo de las baldosas Ahora que ha desarrollado y la subrutina de introduccin 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 geometra. En el IDE de VBA, escriba el cdigo siguiente en la ventana de cdigo, despus 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
Prctica 9
Pg: 9
Universitat Jaume I
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 ilustracin. 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 segn la distancia indicada por el segundo argumento. Las baldosas se desfasan en filas alternas para cubrir ms espacio y lograr un aspecto ms agradable.
Prctica 9
Pg: 10
Universitat Jaume I
La subrutina drow localiza la posicin de la primera fila utilizando el mtodo PolarPoint para desplazarse por el camino la distancia indicada en el primer argumento. A continuacin, vuelve a emplear PolarPoint para desplazarse en sentido perpendicular al camino a fin de obtener el desfase. A continuacin, la subrutina utiliza la instruccin While para continuar dibujando crculos hasta llegar al borde del camino. El mtodo PolarPoint de la primera instruccin While pasa a la posicin de la siguiente baldosa, avanzando la distancia correspondiente al radio de dos baldosas (trad) y un intervalo entre baldosas (tspac). A continuacin, un segundo bucle while dibuja las baldosas de la fila de la otra direccin 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 tringulos equilteros, como se muestra en la figura anterior. Los lados de los tringulos son iguales a dos veces el radio de la baldosa ms el intervalo entre ellas. Por tanto, segn la trigonometra, 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 instruccin If se emplea en drawtiles para desfasar filas alternas. En este caso, si el desfase es igual a cero, defnalo 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, defnalo en 0. Esto alterna el desfase de las filas de la forma deseada. Guarde el archivo. Creacin de una subrutina ejecutable gardenpath En VBA, escriba el cdigo siguiente en la ventana Cdigo, despus 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 continuacin se utiliza el mtodo GetVariable para obtener los valores actuales de las variables de sistema BLIPMODE y CMDECHO y estos valores se guardan como sblip y scmde. Despus, la subrutina utiliza el mtodo SetVariable para asignar el valor 0 a estas variables de sistema, desactivando as las marcas auxiliares y la reproduccin de comandos. A continuacin se dibuja el camino por medio de las subrutinas drawout y drawtiles. Por ltimo se utiliza el mtodo 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 mdulo distinto al actual. Dado que la subrutina gardenpath debe estar a disposicin del usuario, se debe omitir la palabra clave Private. Comprobacin del cdigo Ahora ejecute la macro recorriendo el cdigo paso a paso. En el men Herr. de AutoCAD, elija Macro Macros. En el cuadro de dilogo Macros, seleccione ThisDrawing.gardenpath y pulse el botn Entrar. El entorno de desarrollo de VBA aparece en primer plano, con la primera lnea de la macro gardenpath resaltada. Se trata de la lnea de cdigo que se va a ejecutar en primer lugar. Para ejecutarla, pulse F8. La siguiente lnea de cdigo que se va a ejecutar es la subrutina gpuser. Para pasar a la subrutina gpuser vuelva a pulsar F8.
Prctica 9
Pg: 11
Universitat Jaume I
Ahora se encuentra al principio de la rutina gpuser. Si pulsa de nuevo F8 resaltar el primer mtodo GetPoint. Antes de ejecutar esta lnea, 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 mtodo GetPoint. Observar que desaparece el texto resaltado y no se presenta ms cdigo. Esto se debe a que el mtodo 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 lnea de comando. Indique un punto. El control vuelve a la macro. Regrese al entorno de desarrollo de VBA. Ahora ver que la lnea siguiente a la llamada a GetPoint est resaltada. Siga recorriendo el cdigo, pulsando F8. Recuerde volver a la ventana de AutoCAD cuando deba introducir informacin. Ejecucin de la macro No es necesario recorrer el cdigo 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 ejecucin 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 jardn como se muestra en la figura. Puede experimentar con la macro gardenpath introduciendo los distintos valores por medio del ratn y el teclado.
Adicin de una interfaz de cuadro de dilogo El entorno de desarrollo integrado de VBA se puede utilizar para aadir cuadros de dilogo a la macro de VBA. La macro gardenpath acepta entradas en la lnea de comando. Es muy fcil aadir una interfaz de cuadro de dilogo a esta macro. Los cuadros de dilogo 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 aadir algunas caractersticas adicionales. Una de ellas es una funcin que permite a los usuarios especificar la forma de las baldosas del camino. Empiece por copiar la versin 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. Creacin del cuadro de dilogo Los cuadros de dilogo se crean en VBA por medio de formularios. El cuadro de dilogo que va a crear contendr dos casillas de opcin (si se selecciona una, se anula la seleccin de la otra) para elegir la forma de las baldosas: crculo o polgono. Tambin contendr tres casillas de edicin para la introduccin de los siguientes valores numricos: el radio de las baldosas, el intervalo entre las baldosas y el nmero de lados (ste ltimo slo estar disponible si se selecciona el botn de opcin Polygon).
Prctica 9
Pg: 12
Universitat Jaume I
Para crear un cuadro de dilogo desde el entorno de desarrollo de VBA: 1- Abra un formulario nuevo, seleccionando en el men Insertar la opcin UserForm. Este comando abre dos ventanas. La primera es un cuadro de herramientas que contiene todos los controles disponibles para la creacin del cuadro de dilogo. 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 arrstrelos al formulario. Debe colocar dos botones de opcin ( ), tres etiquetas ( ), tres cuadros de texto ( ) y dos botones de comando ( ), como se muestra en la siguiente ilustracin:
3- Cierre el cuadro de herramientas. Para definir las propiedades de los controles de los botones de opcin 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
Prctica 9
Pg: 13
Universitat Jaume I
Para definir las propiedades de los controles de los cuadros de edicin 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 posicin 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 cdigo asociado al formulario, resalte gpDialog en la ventana Proyecto del IDE de VBA. En la ventana Proyecto, haga clic en el botn Ver cdigo ( ) o pulse F7. Se abre la ventana de cdigo del formulario. Dado que an no ha escrito ningn cdigo para el formulario, esta ventana est en blanco. Puede volver a presentar el formulario haciendo clic en el botn Ver objeto de la ventana Proyecto o pulsando MAYUS+F7. Ahora, resalte ThisDrawing en la ventana Proyecto. De nuevo, puede mostrar el cdigo pulsando el botn Ver cdigo. En esta ventana aparece todo el cdigo que ya se ha introducido. La ventana Proyecto sirve para recorrer el cdigo e identificar dnde se est trabajando en la actualidad.
Prctica 9
Pg: 14
Universitat Jaume I
Actualizacin del cdigo ya escrito Ahora que ha creado un cuadro de dilogo puede introducir el cdigo que lo haga funcionar, pero antes debe actualizar el cdigo que ya ha introducido. El cdigo de ThisDrawing debe estar abierto. Actualizacin de variables globales para utilizarlas en un cuadro de dilogo Actualice o aada las lneas siguientes de la seccin (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 pblicas en vez de privadas. Las variables privadas slo estn disponibles dentro del mdulo en el que estn definidas. Esto era lo conveniente antes, pero ahora el cdigo del formulario necesita acceder a estas variables, por lo que se deben hacer pblicas. Adems se han aadido dos nuevas variables, tsides y tshape. Estas variables contienen el nmero de lados de las baldosas poligonales y la forma de baldosa elegida por el usuario: crculo o polgono. Actualizacin de la subrutina gpuser para utilizarla en un cuadro de dilogo Vaya a la subrutina gpuser. Elimine las dos lneas que obtienen el radio de las baldosas y el intervalo entre baldosas. Esta informacin va a proceder del formulario. Suprimir trad = ThisDrawing.Utility.GetDistance(sp, "Radius of tiles: ") tspac = ThisDrawing.Utility.GetDistance(sp, "Spacing between tiles: ") Aada las lneas que cargan y muestran el formulario. Aada las siguientes lneas 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 continuacin debe aadir una subrutina que dibuje las baldosas circulares o poligonales. Aada las siguientes lneas al final del archivo de cdigo: 'Draw the tile with the designated shape Sub DrawShape(pltile) Dim angleSegment As Double Dim currentAngle As Double Dim angleInRadians As Double
Prctica 9
Pg: 15
Universitat Jaume I
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 instruccin Select Case para asignar el control del programa segn el tipo de forma que se va a dibujar. La variable tshape se utiliza para determinar el tipo de forma. Actualizacin de la subrutina drow para dibujar una baldosa con la forma adecuada A continuacin, vaya a la subrutina drow. En los dos lugares en los que aparece la siguiente lnea: Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad) Actualice estas lneas para asignarles el siguiente texto: DrawShape (pltile) ' Updated Adicin de cdigo al cuadro de dilogo Ahora debe quitar el cdigo de creacin de baldosas circulares y llamar a la subrutina DrawShape para dibujar la forma adecuada. Adicin de controladores de eventos a los botones de opcin Abra la ventana Cdigo de gpDialog. Aada las lneas de cdigo siguientes despus de la instruccin 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 opcin que se crearon antes, aunque se les ha aadido "_Click". Estas subrutinas son especiales, porque se ejecutan automticamente 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 Cdigo. Abra el cuadro Objeto y observe la lista desplegable. Ver una lista de todos los controles aadidos al formulario, ordenados por orden alfabtico segn su propiedad Name.
Prctica 9
Pg: 16
Universitat Jaume I
A continuacin, coloque el cursor en la lnea 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 opcin gp_poly. Las dos subrutinas agregadas hace un momento responden al evento Click. Tambin se puede aadir cdigo que responda al procedimiento de evento DblClick, ejecutndose automticamente cuando el usuario haga doble clic en el control. Se puede aadir cdigo para cualquiera de los eventos de la lista. Estas subrutinas son los controladores de eventos. Observe el cdigo introducido para estos dos controladores de eventos. El primero de ellos responde al evento Click del control gp_poly de casilla de opcin. La primera lnea de cdigo activa el cuadro de texto correspondiente al nmero de lados. Este cuadro de texto slo est disponible para los polgonos, por lo que se activa nicamente si se selecciona el control Polygon. La siguiente lnea de cdigo establece la variable tshape en Polygon. El segundo controlador de eventos responde al evento Click del control gp_circ de casilla de opcin. Este controlador desactiva el cuadro de edicin de texto correspondiente al nmero de lados y establece la variable tshape en Circle. Adicin de controladores de eventos para el botn Aceptar Ahora, aada el siguiente controlador de eventos para el botn 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 efecta 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 nmero de lados del polgono 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 funcin CInt de Visual Basic. Despus 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 botn Aceptar el controlador de sucesos vuelve a comprobar el valor.
Prctica 9
Pg: 17
Universitat Jaume I
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 funcin CDbl. Tambin se verifican estos valores para comprobar que son positivos. Despus de obtener y verificar los valores, la instruccin gpDialog.Hide oculta el formulario y devuelve el control a la subrutina que lo abri. Adicin de controladores de eventos para el botn Cancelar Ahora, aada el siguiente controlador de eventos para el botn 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 aadir los valores iniciales del formulario. Existe un evento llamado Initialize aplicable al formulario. Se ejecuta cuando se carga el formulario. Adicin de controladores de eventos para la inicializacin del formulario: Aada el siguiente controlador de eventos para la inicializacin 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 cdigo establece los valores iniciales del formulario y de la variable tsides. El valor de tsides debe ser un nmero positivo mayor de 3, incluso si el usuario selecciona un crculo. Para entender esto, observe la subrutina DrawShape introducida anteriormente. En ella hay una variable llamada points que se define a partir del nmero de lados del polgono. 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 vlido para tsides. El usuario puede modificarlo a voluntad durante la ejecucin de la macro. Ahora puede ejecutar la macro.
Prctica 9
Pg: 18