Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 37

MDULO DOCE

Programacin en Visual Basic orientada a AutoCAD 14 (VBA)


DOCE.1. INTRODUCCIN
En este MDULO vamos a estudiar una nueva caracterstica muy importante a la hora de realizar programas para AutoCAD 14, la cual es la programacin en Visual Basic. AutoCAD 14proporciona una nueva interfaz de desarrollo en Visual Basic, uno de los lenguajes de programacin ms potentes que existen y que se est convirtiendo en un estndar a la hora de realizar programas en entorno Windows. Si el desarrollador dispone de una versin de Visual Basic instalada en su ordenador podr crear programas en este leguaje que, tras compilarlos, podrn correr bajo AutoCAD, siempre que sigan una normas bsicas para manejar los objetos del programa. Sin embargo esto no es imprescindible, ya que el propio AutoCAD 14 implementa un mdulo VBA (Visual Basic for Aplications), el cual dispone de la sintaxis completa del leguaje (en su versin 5.0), un depurador y un entorno de desarrollo integrado. De esta forma es totalmente factible crear un programa e irlo probando mientras se va depurando en una sesin de AutoCAD. El objetivo de este MDULO no es explicar a fondo el lenguaje de programacin Visual Basic, ya que para ello se necesitara como mnimo un curso completo, y existen muchos y muy buenos; por ello, eso escapa a las pretensiones de este curso. Al lector se le suponen ya unos conocimientos medios o avanzados de programacin en dicho lenguaje y simplemente habr de actualizarse al manejo de los objetos incluidos en AutoCAD 14 para Visual Basic.

DOCE.2. Visual Basic Y ActiveX Automation


Visual Basic es la desembocadura de lo que en un principio se llam lenguaje BASIC (Beginner's All-purpose Symbolic Instruction Code, algo as como cdigo de instruccin simblica para todo propsito del principiante), que fue diseado para iniciados en EE.UU. en 1964. Fue una derivacin del lenguaje FORTRAN que se caracterizaba por su sencillez de manejo y curva de aprendizaje. Microsoft a lo largo de su historia ha venido proporcionando una serie de editores BASIC cuyos ms altos exponentes sin duda fueron GWBASIC y, sobre todo, QuickBASIC. Cuando apareci Windows como entorno las cosas comenzaron a cambiar: aparecen los lenguajes visuales. La programacin visual, conocida como

orientada a objetos y conducida por eventos, permite desarrollar aplicaciones para Windows de una manera sencilla e intuitiva. Visual Basic, a lo largo de su historia, ha ido creciendo en importancia y potencia, llegando en muchos momentos a no tener nada que envidiar a su ms temible competidor, probablemente el lenguaje visual ms potente que existe: Visual C++. Hoy en da, esta programacin orientada a objetos se sirve de una de las ltimas tecnologas de programacin, esto es ActiveX Automation. La tecnologa ActiveX, presente en las ltimas versiones de Windows, supera con creces al sistema anterior OLE, proporcionando una interfaz de programacin que permite manejar los objetos de una aplicacin desde fuera de la misma. La intercomunicacin ahora entre aplicaciones que manejen objetos ActiveX es total: nosotros seremos capaces desde un programa en Visual Basic de abrir una sesin de AutoCAD, aadir una serie de lneas a modo de tabla y, a continuacin abrir una sesin en Excel, por ejemplo, para leer determinados datos, operar con ellos y volver a AutoCAD para aadir los datos a la tabla. Y todo esto mediante letreros de dilogo, botones y dems componentes tpicos y sencillos de manejar de Microsoft Windows. Los objetos propios de una aplicacin son as expuestos a las dems aplicaciones como objetos Automation. En AutoCAD 14 son objetos Automation todos los objetos de dibujo, las denominadas tablas de smbolos como bloques, capas, estilos de cota, etc. y tambin las Preferencias. Las aplicaciones que proporcionan un entorno de programacin en el que los desarrolladores o usuarios pueden escribir macros y rutinas para acceder y controlar objetos ActiveX se denominan controladores de Automation. Estos controladores pueden ser aplicaciones de Windows como Word y Excel, o entornos de programacin como Visual Basic o Visual C++. Los objetos ActiveX exponen para su control dos conceptos especficos: mtodos y propiedades. Los mtodos son funciones que ejercen una accin sobre los objetos. Las propiedades son funciones que definen o devuelven informacin sobre el estado de un objeto. Las propiedades y mtodos dependen de cada tipo de objeto y se describen a travs de una biblioteca de tipos. Los desarrolladores o usuarios tienen a su disposicin un examinador de biblioteca de tipos, para saber en todo momento los mtodos y propiedades existentes. AutoCAD 14 dispone de sus propios objetos ActiveX para ser manejados desde un programa. La biblioteca de tipos donde se encuentran definidos los mtodos y propiedades a travs de los cuales expone AutoCAD sus objetos Automation se encuentra en el archivo ACAD.TLB. Las referencias se establecen desde el editor de VBA, desde el men Herramientas>Referencias..., activando la casilla AutoCAD Object Library. Los objetos de una aplicacin pueden usarse sin hacer referencia a la biblioteca de objetos, pero es preferible aadir dicha referencia por motivos de facilidad, fiabilidad y comprobacin. Es posible acceder a objetos Automation desde muchas aplicaciones de Windows. Estas aplicaciones pueden ser ejecutables independientes, archivos de bibliotecas de enlace dinmico.DLL y macros dentro de aplicaciones como Word y Excel. Mediante Automation resulta muy sencillo desarrollar y mantener una interfaz grfica de usuario. La interfaz puede ir desde un solo cuadro de dilogo o una barra de herramientas que mejore una aplicacin existente, hasta una aplicacin propia completa.

DOCE.2.1. La lnea de productos de Visual Basic


El lenguaje de programacin Visual Basic como tal est dividido en diferentes productos que el usuario adquiere segn sus propias necesidades. En lneas generales podemos dividir estos productos en tres grandes grupos: Visual Basic. Es la herramienta de ms alto nivel dentro de la gama. Posee todas las caractersticas del leguaje y est dividida en cuatro ediciones: Creacin de Controles (Control Creation), que permite nicamente que no es poco el desarrollo de controles ActiveX, por lo que no permite la creacin de aplicaciones autnomas; Estndar (Learning), con acceso de alta velocidad a bases de datos y que ya sirve para el desarrollo de aplicaciones; Profesional (Professional), con herramientas avanzadas para el diseo de aplicaciones profesionales; y Empresarial (Enterprise), con todas las herramientas disponibles para desarrolladores e investigadores. VBA (Visual Basic for Applications). Es una herramienta menos avanzada que la anterior y diseada para ser implementada en las distintas aplicaciones Windows y poder desarrollar programas para ellas. Incluye importantes implementaciones para macros y guiones, la casi completa sintaxis de programacin Visual Basic, un depurador y un entorno de desarrollo integrado. Es la incluida en AutoCAD 14. VBScript (Visual Basic Scripting Edition). Es la herramienta de inferior nivel. Contiene un subconjunto del lenguaje Visual Basic, pero sin acceso a sistema operativo ni a operaciones de entrada y salida de archivos. Se ha concebido fundamentalmente como herramienta de diseoscript para pginas Web de Internet en HTML (al estilo de JavaScript).

DOCE.3. EL MDULO VBA DE AutoCAD 14


Como ya se ha comentado, AutoCAD 14 proporciona un mdulo VBA que es una versin preview, sin embargo podramos decir que funciona completamente bien (en la versin 14.01 de AutoCADya se da una versin final del editor VBA). Este mdulo no se instala en la instalacin general del programa, sino que hay que hacerlo despus de ella. Para este menester deberemos acudir al directorio \VBAINST\ del CD-ROM de instalacin de AutoCAD 14, y ejecutar el archivoSETUP.EXE, que instalar el mdulo VBA. Una vez instalado, y tras quiz reiniciar el equipo mejor, aparecer un nuevo men desplegable enAutoCAD denominado VBA (entre Herr. y Dibujo). Este men dispone de las siguientes opciones: Run Macro (ejecutar macro) ejecuta una macro o rutina. Debe haberse cargado previamente algn proyecto con la opcin siguiente. El comando en lnea de comandos es VBARUN.

Load Project (cargar proyecto) permite cargar un nuevo proyecto (.DVB). Al cargar un proyecto existente, AutoCAD muestra el editor VBA con el contenido del proyecto (formularios, mdulos de cdigo...). El comando en lnea de comandos es VBALOAD. Unload Project (descargar proyecto) descarga un proyecto previamente cargado. El comando en lnea de comandos es VBAUNLOAD. Show VBA IDE (mostrar editor VBA) permite mostrar el editor de VBA. El comando en lnea de comandos es VBAIDE.
NOTA: En la versin 14.01 de AutoCAD se aade un men de persiana al men Herr. llamadoMacro.

El mdulo VBA de AutoCAD 14 es ligeramente distinto al entorno Visual Basic habitual, si es que estamos familiarizados con l. En principio, por defecto el Explorador de proyectos y la Ventana de Propiedades aparecen anclados a la izquierda, y no a la derecha. El Cuadro de herramientas no aparece por ningn lado, ya que slo se pone de manifiesto cuando estamos trabajando con un formulario. En general la estructura de mens y barra de herramientas es muy parecida, si bien existen ausencias sobre todo en VBA con respecto a Visual Basic, como por ejemplo la capacidad de incluir formularios MDI, de compilar proyectos o de abrir proyectos, entre otras. Esto ltimo se realiza desde el men desplegable de AutoCAD, y slo desde ah. Decir que el mdulo VBA nicamente puede ser abierto desde una sesin de AutoCAD, y no independientemente. Todas la nuevas caractersticas se irn aprendiendo a lo largo de este MDULO, por lo que no debemos preocuparnos si dominamos Visual Basic y creemos no sentirnos a gusto en VBA. Dado que, como hemos dicho, se suponen conocimientos previos por parte del lector, nos meteremos de lleno ya mismo con la programacin exclusivamente dirigida a AutoCAD 14.

DOCE.4. COMENZANDO CON VBA


Lo primero que quiz nos haya llamado la atencin es la entrada por defecto que aparece en el Explorador de proyectos: ThisDrawing, dentro de una carpeta llamada AutoCAD Objetos. El objeto ThisDrawing se refiere al documento actual activo de AutoCAD, y no puede ser eliminado. A l nos referiremos a la hora de gestionar objetos de AutoCAD, ya que siempre que hagamos algo ser evidentemente referenciado y ejecutado en el documento actual activo. Antes de comenzar a programar tenemos que asegurarnos para evitarnos problemas posteriores que la referencia a la librera de objetos de AutoCAD 14 (ACAD.TLB) est activada. Para ello acudiremos al mens Herramientas>Referencias....

La forma de programar en Visual Basic es muy personal, ya que hay gente que utiliza bastante los mdulos de cdigo y otra gente que incluye todo el cdigo en el propio formulario. En AutoCADnormalmente trabajaremos con un nico formulario (cuadro de dilogo) al estilo DCL + AutoLISP que realizar determinada funcin. Es por ello que se utilizarn muy poco los mdulos de cdigo (excepto para macros), y muchsimo menos los mdulos de clase. A los programadores avanzados les puede ser muy interesante el disponer de estas caractersticas en VBA.

DOCE.4.1. La plantilla de objetos


Los objetos ActiveX que proporciona AutoCAD 14 para su manejo desde programas VBA estn divididos segn una jerarqua que deberemos seguir a la hora de llamarlos o referirnos a ellos. La plantilla que se muestra a continuacin nos ser muy til a la hora de programar, ya que establece dicha jerarqua. En Visual Basic es factible aadir al entorno nuevos objetos creados por nosotros para luego ser utilizados. Lo que se ha hecho en VBA es precisamente eso. Estos objetos tienen sus propiedades y mtodos, al igual que los dems. Existen objetos de entidades individuales de dibujo (lneas, crculos, arcos...) con sus propiedades (color, capa, tipo de lnea...) y mtodos (copiar, mover, escalar). Tambin se han definido otros objetos no grficos como son el Espacio Modelo, el Espacio Papel y los bloques. Estos se consideran una coleccin de objetos de entidades individuales de dibujo y tienen tambin sus propiedades para, por ejemplo, saber cuntas entidades simples contienen, y sus mtodos para, por ejemplo, aadir nuevas entidades a la coleccin. El propio documento actual de AutoCAD est definido como un objeto y tiene sus propiedades (camino de acceso, lmites...) y mtodos (guardar, regenerar...). Dentro de l se encuentran los mencionados anteriormente, adems de otras colecciones como el conjunto de capas, de estilos de texto, etctera, cada una con propiedades y mtodos. Y todo ello est incluido en el objeto ms exterior, que es la aplicacin de AutoCAD. La plantilla que muestra toda la jerarqua se proporciona en el archivo siguiente para AutoCAD 14(PLANTILLA.DWG), comprimido en formato ZIP aqu --> PLANTILLA.ZIP.

DOCE.4.2. Empezar un programa


El primer paso que vamos a dar al realizar un programa en VBA ser casi siempre el mismo, y se refiere a la declaracin de las variables de objeto que sern necesarias para acceder a los distintos aspectos de AutoCAD.

Segn la plantilla de la pgina anterior, la propia aplicacin AutoCAD, el documento activo, el Espacio Modelo o el Espacio Papel, entre otros, son objetos que hemos de definir en un principio para luego poder referirnos a ellos a lo largo del programa fcilmente. Como objetos que son los declararemos como tales, as por ejemplo, la aplicacin en s la podramos declarar as (enGeneral_Declaraciones): AcadApp as Object el documento activo: AcadDoc as Object y el Espacio Modelo y Papel: AcadModel as Object y AcadPapel as Object Esto en s no tiene mucho sentido hasta que no le demos unos valores coherentes. Para ello utilizaremos el procedimiento UserForm_Initialize (si nuestro programa dispone de formulario; no es una macro), ya que habrn de tomar valores al iniciar el programa, as: Set Set Set Set AcadApp = AcadDoc = AcadModel AcadPapel GetObject(, "AutoCAD.Application") AcadApp.ActiveDocument = AcadDoc.ModelSpace = AcadDoc.PaperSpace

NOTA: Como sabemos, para aadir valores a variables del tipo Object, es necesario

utilizar la instruccin Set. Como vemos, la primera lnea es la que realmente hace referencia a la librera o biblioteca de objetos de AutoCAD. No se incluye el camino por encontrarse el archivo ACAD.TLB en el directorio principal de instalacin de AutoCAD, esto es, por estar en directorio de archivos de soporte. Sin embargo, la coma necesaria de la funcin GetObject que separa los dos parmetros es imprescindible incluirla. Las lneas restantes hacen referencia a los dems objetos que, como se ve, cuelgan todos del primero. El documento activo (ActiveDocument) cuelga directamente de la aplicacin AutoCAD, y tanto el Espacio Modelo (ModelSpace) como el Espacio Papel (PaperSpace) del documento actual. Esta jerarqua la podemos apreciar perfectamente en la plantilla anteriormente expuesta. Esta asignacin de objetos no es necesaria realizarla, ya que podemos referirnos a ellos con toda la secuencia de nombres. Pero parece lgico utilizar, por ejemplo, un nombre de variable comoAcadModel cada vez que nos tengamos que referirnos al Espacio Papel (que sern muchas veces), que utilizar la secuencia entera hasta ModelSpace.

Adems si trabajamos directamente en VBA podemos sustituir las llamadas al documento actual por ThisDrawing as: Set AcadDoc = ThisDrawing o incluso utilizar ThisDrawing posteriormente en las llamadas durante el programa. El problema de esto reside en que slo el VBA de AutoCAD sabe lo que es ThisDrawing. En el momento en que queramos abrir nuestro programa en un entorno Visual Basic externo para, por ejemplo compilarlo (que ya lo veremos), necesitaremos realizar las llamadas pertinentes a la librera de objetos, si no nunca funcionar. Es por ello que es mejor acostumbrarse a esta tcnica mucho ms verstil y elegante. Todo esto es necesario porque debemos decirle a VBA que vamos a trabajar con una aplicacin denominada AutoCAD, que utilizaremos el documento actual activo y, por ejemplo, su Espacio Modelo. A la hora de aadir un crculo, por ejemplo, deberemos indicar que ha de ser al Espacio Modelo del documento actual de AutoCAD, sobre todo si trabajamos con un Visual Basic externo o el archivo est ya compilado. Se emplea en estas declaraciones la funcin GetObject, cuya finalidad consiste en devolver una referencia al objeto que se le solicita, en nuestro caso a AutoCAD.Application, que engloba a todo el modelo de objetos. Para que esta funcin responda adecuadamente es necesario queAutoCAD est cargado y con un dibujo abierto (en la versin 14 no es posible cerrar un dibujo), que ser referenciado como ActiveDocument.

DOCE.5. Dibujo y representacin de entidades


A continuacin, bajo esta seccin, estudiaremos los diferentes mtodos que tenemos de aadir entidades individuales de dibujo mediante programas en VBA. La manera de dibujar entidades dice relacin a mtodos que pertenecen a las colecciones de Espacio Modelo, Espacio Papel y bloques (como se ve en la plantilla de objetos). Estas colecciones tambin tienen propiedades, pero eso lo veremos ms adelante.

DOCE.5.1. Lneas
NOTA IMPORTANTE DE SINTAXIS: La sintaxis que se utiliza en este MDULO es similar a la deMDULOS anteriores: instrucciones, funciones, mtodos, propiedades y dems trminos reservados como aparecen en el editor VBA una vez aceptados; los textos en cursiva son mnemotcnicos que han de ser sustituidos por su valor; los textos no en cursiva deben escribirse coma tales; las sintaxis en colores: mtodos en azul y propiedades en verde; en las listas las propiedades y mtodos de objetos nuevos (sin

explicar) en negrita, los ya explicados no; los listados de programas se muestran como aparecen en el editor; una barra vertical indica una dualidad de valores. La sintaxis del mtodo AddLine para dibujar lneas es la que sigue: Set ObjLnea = ObjColeccin.AddLine(DblPtoInicial, DblPtoFinal) Propiedades de los objetos de lnea: Application Color EndPoint EntityName EntityType Handle Layer Linetype LinetypeScale Normal ObjectID StartPoint Thickness Visible

Mtodos de los objetos de lnea: ArrayPolar ArrayRectangular Copy Erase GetBoundingBox GetXData Highlight IntersectWith Mirror Mirror3D Move Offset Rotate Rotate3D ScaleEntity SetXData TransformBy Update Los objetos grficos de dibujo hemos de declararlos previamente como tales. Para ello deberemos definir un nombre de variable que almacenar el objeto; es a lo que se refiere ObjLnea. Esta variable puede ser declarada como Object simplemente o como un objeto especial de VBA paraAutoCAD que representa el tipo de objeto que almacenar. Este objeto especial tiene diferentes nombres segn el objeto que almacene; su sintaxis podra definirse as: IAcadObjeto, es decir, primero la cadena fija IAcad y luego el nombre del objeto.

De esta manera, una variable que tuviera que guardar una lnea podra declararse como Object o como IAcadLine. La diferencia es que si la declaramos como Object podr almacenar cualquier objeto a lo largo del programa: una lnea, un crculo, un rayo, un texto... Si la declaramos comoIAcadLine esa variable nica y exclusivamente podr almacenar entidades de lnea de AutoCAD 14, una o varias a lo largo de la ejecucin, pero slo lneas. Es recomendable hacerlo con la primera opcin (Object), sino a veces hay problemas. Las entidades de AutoCAD, para ser dibujadas desde VBA, han de ser guardadas en una variable de objeto, por lo tanto con Set. Veremos casi al final de este MDULO que esto no es rigurosamente cierto. Por ahora lo haremos as. ObjColeccin se refiere a la coleccin donde se almacenar la lnea, es decir, si se dibujar en Espacio Modelo o Espacio Papel, o si formar parte de un bloque. Los puntos inicial y final de la lnea (DblPtoInicial y DblPtoFinal) deben ser agrupaciones de tres coordenadas (X, Y, y Z), por lo tanto han de definirse como matrices (arrays o tablas) de tres elementos, cada uno de ellos de tipo Double, generalmente. Para realizar nuestra primera prueba de dibujo de una lnea crearemos una macro que as lo haga. Una macro en VBA se crea y se aade automticamente al mdulo estndar de cdigo existente si existe, si no existe se crea una nuevo. La macro se ejecutar sin necesidad de letrero de dilogo. Para crear un macro VBA lo haremos desde el men Herramientas>Macros.... Esto abre un cuadro que permite introducir un nombre para la nueva macro (tambin se puede eliminar, editar o ejecutar una existente). Tras pulsar el botn Crear se aadir un nuevo procedimiento Sub al mdulo de cdigo existente (o se crear uno). Dicho procedimiento tendr el nombre de la macro. Para ejecutar una macro podemos hacerlo desde el mismo cuadro de creacin (eligiendo una) o desde el men de AutoCAD VBA>Run Macro..., esto ltimo arranca un cuadro de dilogo que permite elegir el mdulo estndar en cuestin donde se encuentra la macro y la macro por su nombre (en el caso de que hubiera varias dentro de un mismo mdulo). Creemos pues una macro llamada DibujoLnea. A continuacin aadiremos las siguientes lneas de cdigo:
NOTA: Cuidado con lo que va tras General_Declaraciones (siempre hasta la primera

lnea de divisin) y el resto (en estos casos se muestra el nombre de procedimiento Sub en el encabezado).
Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim ObjLnea As IAcadLine Dim PuntoInicial (1 To 3) As Double Dim PuntoFinal (1 To 3) As Double Sub DibujoLnea() Set AcadDoc = GetObject( ,"Autocad.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace PuntoInicial(1) = 100: PuntoInicial(2) = 100: PuntoInicial(3) = 0 PuntoFinal(1) = 200: PuntoFinal(2) = 200: PuntoFinal(3) = 0

Set ObjLnea = AcadModel.AddLine(PuntoInicial, PuntoFinal) End Sub

NOTA: Como en la mayora de los programas en Visual Basic se recomienda el uso

de Option Explicit para depurar errores en tiempo de corrida. Lo primero que hacemos en General_Declaraciones, tras Option Explicit que nos obliga a declarar todas las variables utilizadas, es definir o declarar las variables que vamos a usar. La que representa al documento actual y la del Espacio Modelo, como ya se haba explicado; la que contendr la lnea, como un objeto de lnea de AutoCAD; y las del punto inicial y final de la lnea, como matrices del tipo Double. En el cuerpo de la macro propiamente dicha se asigna su valor a cada variable, tanto a las de la aplicacin y el dibujo actual, como a los puntos inicial y final. Por fin se utiliza el mtodo explicado para dibujar la lnea en el Espacio Modelo. Solo habremos de correr la macro por alguno de los mtodos explicados para comprobar el resultado.
NOTA: Existen los correspondientes objetos IAcadModelSpace e IAcadDocument, pero

se recomienda la sintaxis utilizada en el ejemplo para estos objetos. La ventaja que lleva implcita el almacenamiento en una variable de objeto de la entidad dibujada, dice relacin a su posterior utilizacin para la aplicacin de propiedades. Ahora no es necesario (como hacamos en AutoLISP) acceder a la Base de Datos interna de AutoCAD para modificar las propiedades de un objeto, ya que dichas propiedades se relacionan directamente con sus objetos. As por ejemplo, si tras trazar la lnea del ejemplo anterior quisiramos cambiarla al color rojo, nicamente deberamos aadir la siguiente lnea al programa (tras Set ObjLnea...): ObjLnea.Color = 1 Color es una propiedad de la lnea (vase en la lista tras la sintaxis), por lo que lo nico que hacemos es cambiarle el valor como a cualquier otra propiedad en Visual Basic: indicando el objeto, seguido de un punto de separacin, la propiedad, un signo de igual y el nuevo valor. As de simple. Algunas propiedades se tratan de otra forma. A continuacin se explican a fondo cada una de las propiedades de los objetos de lnea. Se explican de manera ambigua, es decir, sin referirse a las lneas en s, ya que estas propiedades son comunes a muchos otros objetos VBA. Application. Obtiene el objeto Application de la entidad. Este objeto representa la aplicacin de AutoCAD. La sintaxis es: Set ObjAplicacin = ObjGrfico.Application siendo ObjAplicacin una variable definida como Object y ObjGrfico un objeto grfico. En el caso de nuestro ejemplo anterior de dibujo de una lnea, ObjGrfico sera la variable ObjLnea. Color. Obtiene y/o asigna el color de/a una entidad. El color se representa como un nmero entero de 0 a 256 (colores de AutoCAD). Tambin se pueden emplear algunas constantes predefinidas como:

AcByBlock AcByLayer AcCyan AcRed AcBlue AcYellow AcMagenta AcGreen AcWhite La sintaxis para esta propiedad es ObjGrfico.Color = IntNumColor Siendo IntNumColor el nmero de color o alguna de las constantes. Esta es la forma en que hemos cambiado el color a nuestra lnea en el ejemplo. Existe otra sintaxis para obtener el color de un objeto dibujado y guardado en una variable: IntNumColor = ObjGrfico.Color donde IntNumColor es ahora la variable (tipo Integer) que guardar el nmero de color yObjGrfico la variable (tipo Object) que almacena la lnea. En nuestro caso anterior la lnea estaba almacenada en ObjLnea (tipo IAcadLine). Si quisiramos objeter su color y guardarlo en una variable denominada NmeroColor habramos de hacer, por ejemplo: NmeroColor = ObjLine.Color Antes de esto, y si existe una instruccin Option Explicit, habremos de declarar la variableNmeroColor como Integer.
NOTA: Recordemos que el color 0 es PorBloque y el color 256 PorCapa.

EndPoint. Obtiene el punto final de un objeto arco, elipse o lnea y, en el caso de las lneas, tambin puede asignarse. As pues, la sintaxis para obtener el punto final de los objetos mencionados es: VarPtoFinal = ObjGrfico.EndPoint siendo VarPtoFinal una variable que almacena un punto. Estas variables de punto siempre han de definirse como Variant. En el caso de nuestra lnea podramos haber obtenido su punto final as, aunque esto no tiene mucho sentido (como con el color) porque ya sabemos su punto final; se lo hemos dado nosotros. Si lo que deseamos es asignar un punto final (slo para lneas) utilizaremos la siguiente sintaxis: ObjLnea.EndPoint = DblPtoFinal donde ObjLnea es una variable tipo objeto que contiene una lnea y DblPtoFinal es una variable que contiene un punto, es decir una matriz de tres valores tipo Double.

EntityName. Obtiene el nombre de un objeto. Este nombre es el que la clase a la que pertenece el objeto. En concreto se refiere al cdigo 100 en la definicin de la entidad en Base de Datos cuando accedamos con AutoLISP, y no al cdigo 0 que es el que utilizbamos nosotros para obtener el nombre de la entidad. La sintaxis de obtencin de un nombre es: StrNombre = ObjGrfico.EntityName donde ObjNombre es una variable de tipo String que guardar el nombre del objeto, yObjGrfico es la variable que guarda el objeto. Si en el ejemplo de nuestra lnea, y tras definir una variable llamada por ejemplo NombreLnea como String, escribiramos al final: NombreLnea = ObjLnea.EntityName

NombreLnea guardara la cadena AcDbLine, nombre de clase del objeto de entidad lnea. Cuando se pregunta por objetos de AutoCAD se puede emplear la siguiente propiedadEntityType. EntityType. Obtiene el tipo de entidad. ste ha de ser guardado en una variable de tipoInteger as: IntNumTipo = ObjGrfico.EntityType El nmero de tipo devuelto se corresponde con los expuestos en la siguiente tabla:

Tipo de entidad 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Descripcin AcDB3DFace AcDB3DPolyLine AcDB3DSolid AcDBArc AcDBAttribute AcDBAttributeReference AcDBBlockReference AcDBCircle AcDBDimAligned AcDBDimAngular AcDBDimDiametric AcDBDimOrdinate AcDBDimRadial AcDBDimRotated AcDBEllipse AcDBGroup AcDBHatch AcDBLeader AcDBLine AcDBMText AcDBPoint AcDBPolyline AcDBPolylineLight

24 25 26 27 28 29 30 31 32 33 34 35

AcDBPolyMesh AcDBPViewPort AcDBRaster AcDBRay AcDBRegion AcDBShape AcDBSolid AcDBSpline AcDBText AcDBTolerance AcDBTrace AcDBXLine

En nuestro ejemplo, una sentencia de este tipo nos devolvera en cdigo 19. Handle. Obtiene el rtulo o cdigo del objeto. Se trata de una cadena de texto que identifica el objeto durante toda la vida de ese objeto en el dibujo. Existe otra manera de identificar una entidad, mediante su ObjectID (visto ms adelante). Algunas funciones de ARX requieren unObjectID en lugar de Handle. Para los dems casos es preferible usar Handle. La sintaxis pues de esta propiedad es: StrRtulo = ObjGrfico.Handle StrRotulo es una cadena (String). Layer. Permite obtener y/o asignar la capa de/a un objeto. La sintaxis para asignar una capa a un objeto ya dibujado es: ObjGrfico.Layer = StrNombreCapa donde ObjGrfico es la variable que guarda el objeto y StrNomCapa una cadena de texto con el nombre de una capa existente. Si la capa no existe VBA proporciona un error de ejecucin. Para evitar eso habra que crearla previamente con un mtodo que veremos bastante ms adelante. En nuestro ejemplo de la lnea, si existiera una capa llamada CUERPO en el dibujo actual y hubisemos querido colocar o introducir dicha lnea en esa capa, habramos hecho: ObjLnea.Layer = "Cuerpo" La sintaxis para obtener la capa de un objeto es: StrNomCapa = ObjGrfico.Layer StrNomCapa habr de ser una variable del tipo String, es decir una cadena alfanumrica. Linetype. Permite obtener y/o asignar un tipo de lnea de/a una entidad de dibujo. Para asignar un tipo de lnea: ObjGrfico.Linetype = StrNombreTipoLnea siendo ObjGrfico el objeto en cuestin (como nuestra lnea en ObjLnea) y StrNomTipoLneauna cadena que especifica el nombre del tipo de lnea. Si ste no

est cargado se producir un error (cmo cargar tipos de lnea se ver ms adelante). Como tipos de lnea especiales se pueden indicar: ByLayer ByBlock Continuous Para obtener el tipo de lnea de un objeto: StrNomTipoLnea = ObjGrfico.Linetype StrNomTipoLnea ser una cadena (String). LinetypeScale. Obtiene y asigna la escala de tipo de lnea de/a un objeto. Para asignar: ObjGrfico.LinetypeScale = RealEscalaTipoLnea RealEscalaTipoLnea es el valor de la nueva escala. Para obtener: RealEscalaTipoLnea = ObjGrfico.LinetypeScale RealEscalaTipoLnea es una variable positiva y real del tipo Double. Normal. Obtiene y asigna la normal de/a una entidad. La normal es un vector unitario que indica la direccin Z en el SCE (Sistema de Coordenadas de la Entidad). El vector se almacena en una variable del tipo Variant, que recoger una matriz de tres elementos Double. Para asignar una normal: ObjGrfico.Normal = DblVector Para obtener una normal: VarVector = ObjGrfico.Normal ObjectID. Extrae el identificador interno de una entidad. Este nmero, devuelto en notacin decimal, se corresponde con el valor hexadecimal que apareca tras Entity name en la definicin de una entidad en Base de datos cuando accedamos con AutoLISP; el nmero del cdigo 1. Para obtenerlo: LngNmeroID = ObjGrfico.ObjectID Donde LngNmeroID es una variable que habr sido declarada como Long. StartPoint. Funciona igual que EndPoint pero para el punto inicial de lneas, arcos y elipses. En estos dos ltimo casos slo se puede obtener su valor; con las lneas se puede modificar. Para asignar un nuevo punto inicial a una lnea la sintaxis es:

ObjLnea.StartPoint = DblPtoInic Donde ObjLnea slo puede ser un objeto de lnea exclusivamente y DblPtoInic una variable que almacene un punto o una matriz de tres valores tipo Double. Para obtener el punto inicial de los objetos mencionados: VarPtoInic = ObjLnea.StartPoint VarPtoInic habr sido declarada como Variant. Thickness. Obtiene y/o asigna un valor que representa la altura en Z de un objeto 2D. Para asignar, la sintaxis es la siguiente: ObjGrfico.Thickness = DblAlturaObjeto y para obtener la elevacin de un objeto: DblAlturaObjeto = ObjGrfico.Thickness DblAlturaObjeto habr sido declarada como Double. Visible. Obtiene y/o asigna la visibilidad de/a una entidad. Esta propiedad es del tipo Boolean, por lo que sus resultados slo podrn ser True o False. Si queremos asignar un estado de visibilidad a un objeto utilizaremos la siguiente sintaxis: ObjGrfico.Visible = BooEstadoVis Por ejemplo, en el caso de la macro que dibujaba una lnea, si al final del cuerpo de la macro (antes de End Sub) escribiramos: ObjLnea.Visible = False y la ejecutramos, la lnea se habra dibujado, pero permanecera invisible. A veces puede ser interesante mantener objetos invisibles para mostrarlos en un momento dado. Si queremos extraer el estado de visibilidad de un objeto utilizaremos la sintaxis que sigue: BooEstadoVis = ObjGrfico.Visible donde BooEstadoVis habr sido declarado, como norma general, como Boolean. A parte de las propiedades, los nuevos objetos VBA para AutoCAD 14 tambin poseen mtodos. Veremos a continuacin todos los mtodos para las lneas uno por uno.
NOTA: Al igual que para las propiedades, los mtodos de los objetos son muchos de

ellos comunes, por lo que nos referiremos aqu a ellos como globales, no como particulares de la creacin de lneas.

ArrayPolar. Este mtodo crea una matriz polar del objeto indicado, especificando un centro, los grados abarcados y el nmero de objetos. La sintaxis de este mtodo es la siguiente: VarMatriz = ObjGrfico.ArrayPolar(IntNmero, Dblngulo, DblCentro) Donde VarMatriz ha de ser una variable declarada como Variant que guardar todos los objetos de la matriz o array. ObjGrfico es el objeto ya creado del que se realizar la matriz polar,IntNmero es el nmero de objetos de la matriz (Integer), Dblngulo los ngulos cubiertos en radianes (Double) y DblCentro el centro de la matriz (un punto de tres elementos Double). As, y retomando el ejemplo que hemos visto de dibujo de una lnea, vemoslo ampliado a continuacin:
Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim ObjLnea As Object Dim PuntoInicial (1 To 3) As Double Dim PuntoFinal (1 To 3) As Double Dim MatrizLin As Variant Dim PuntoBase (1 To 3) As Double Sub DibujoLnea() Set AcadDoc = GetObject( ,"Autocad.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace PuntoInicial(1) = 100: PuntoInicial(2) = 100: PuntoInicial(3) = 0 PuntoFinal(1) = 200: PuntoFinal(2) = 200: PuntoFinal(3) = 0 Set ObjLnea = AcadModel.AddLine(PuntoInicial, PuntoFinal) PuntoBase(1) = 10: PuntoBase(2) = 10: PuntoBase(3) = 0 MatrizLin = ObjLnea.ArrayPolar(10, 3.14159, PuntoBase) End Sub

En este nuevo ejemplo, a parte de lo anterior se declara la variable MatrizLin como Variant yPuntoBase como una tabla de tres valores Double. Despus se realiza la matriz (tras dar valores a PuntoBase). El nmero de elementos y los ngulos cubiertos pueden ser tambin variables, evidentemente declaradas como Integer y Double respectivamente. Podemos acceder a la tabla que guarda los objetos mediante ndices para obtener los propios objetos de la matriz. En el ejemplo anterior, nicamente deberemos aadir las siguientes dos lneas al listado (antes de End Sub): Dim Lnea6 As Object Set Lnea6 = MatrizLin(6) para guardar en la variable Lnea6 la sexta de las lneas de la matriz en este caso. Esta variable tiene que ser declarada como Object porque va a guardar un objeto. Adems el ndice habr de ser coherente con el nmero de objetos claro est, sino se produce un error de ejecucin en el mdulo VBA.

ArrayRectangular. Este mtodo crea una matriz polar de dos o tres dimensiones repitiendo el objeto al que se le aplica. Hay que indicar el nmero de filas, columnas y niveles, as como las distancias correspondientes, de la siguiente manera: VarMatriz = ObjGrfico.ArrayRectangular(IntNmFil, IntNumCol, IntNumNiv, DblDistFil, DblDistCol, DblDistNiv) Los nmeros de filas, columnas y niveles sern enteros (Integer) y las distancias lo ms lgico es que sean de doble precisin (Double). Las dems consideraciones, as como la manera de acceder a los objetos simples de la matriz, son las mismas que para ArrayPolar. Copy. Mtodo que copia la entidad a la que se aplica en la misma posicin que el objeto original. Su sintaxis es simplemente: Set ObjCopia = ObjGrfico.Copy ObjCopia ser un objeto, por lo que estar definido como tal. Para copiar la lnea sexta de la matriz del ltimo ejemplo, la cual habamos guardado en Lnea6, haramos por ejemplo: Dim Copia6 As Object Set Copia6 = Lnea6.Copy Para copiar un objeto y moverlo a su vez, utilizaremos primero este mtodo y luego el mtodoMove, que veremos despus. Erase. Elimina la entidad a la que se aplica el mtodo. Como en este caso no hemos de guardar objeto ni valor alguno en ninguna variable, podemos llamar al mtodo con Call, pero al no necesitar argumentos no hace falta. Su sintaxis es pues: ObjGrfico.Erase Para borrar por ejemplo la lnea sexta, del ejemplo que venimos manejando, guardada en Lnea6haremos: Lnea6.Erase GetBoundingBox. Este mtodo devuelve las coordenadas inferior izquierda y superior derecha de la caja de abarque del objeto al que se le aplique. Esta caja de abarque es el rectngulo que se ajusta al objeto abarcndolo por completo. La sintaxis de GetBoundingBox es: Call ObjGrfico.GetBoundingBox(VarInfIzq, VarSupDcha) La forma de trabajar este mtodo es un poco extraa. VarInfIzq y VarSupDcha han de ser forzosamente dos variables declaradas, antes de llamar al mtodo, como Variant. Al final de la ejecucin guardarn las coordenadas en cuestin. Si deseamos ahora utilizar esos puntos para por ejemplo dibujar una lnea, no podremos

utilizarlos como tales, sino que habremos de realizar un trasvase de variables e introducir los diferentes valores en una matriz de tres elementos. Veamos una ampliacin ms de nuestro ejemplo de la lnea:
Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim ObjLnea As Object Dim PuntoInicial (1 To 3) As Double Dim PuntoFinal (1 To 3) As Double Dim MatrizLin As Variant Dim PuntoBase (1 To 3) As Double Sub DibujoLnea() Set AcadDoc = GetObject( ,"Autocad.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace PuntoInicial(1) = 100: PuntoInicial(2) = 100: PuntoInicial(3) = 0 PuntoFinal(1) = 200: PuntoFinal(2) = 200: PuntoFinal(3) = 0 Set ObjLnea = AcadModel.AddLine(PuntoInicial, PuntoFinal) PuntoBase(1) = 10: PuntoBase(2) = 10: PuntoBase(3) = 0 MatrizLin = ObjLnea.ArrayPolar(10, 3.14159, PuntoBase) Dim Lnea6 As Object Set Lnea6 = MatrizLin(6) Dim EsqInfIzq As Variant Dim EsqSupDch As Variant Call Lnea6.GetBoundingBox(EsqInfIzq, EsqSupDch) Dim Pto1 (1 To 3) As Double Dim Pto2 (1 To 3) As Double Pto1(1) = EsqInfIzq(0): Pto1(2) = EsqInfIzq(1): Pto1(3) = EsqInfIzq(2) Pto2(1) = EsqSupDch(0): Pto2(2) = EsqSupDch (1): Pto2(3) = EsqSupDch(2) Set ObjLnea = AcadModel.AddLine(Pto1, Pto2) End Sub

Vase cmo se realiza el trasvase de variables. En el caso de las variables Pto1 y Pto2, las hemos definido con un rango de 1 a 3, sin embargo en EsqInfIzq y EsqSupDch se utiliza el rango 0 a 2, por lo que los ndices estn desfasados una unidad.
NOTA: Este mecanismo lo deberemos utilizar bastantes veces, como veremos.

Inexplicablemente los puntos guardados en variables Variant, que da la casualidad de que son las variables de salida de mtodos como este visto u otros ms importantes (como el equivalente al GETPOINT de AutoLISP, que ya estudiaremos), no pueden ser utilizados directamente para, por ejemplo, dibujar entidades. Aspecto que debe solucionarse. GetXData. Permite recuperar los datos extendidos de una entidad. Su sintaxis es la que sigue: Call ObjGrfico.GetXData(StrNomAplicacin, VarTipoXDato, VarValorXDato) Los datos extendidos no los crea AutoCAD sino una aplicacin AutoLISP o ADS. Si embargo, estos datos se almacenan en la base de datos con los restantes del dibujo.

StrNomAplicacin es el nombre de la aplicacin que ha creado los datos extendido; es una cadena (String). Si se especifica un cadena vaca se devuelven todos los datos extendidos de todas las aplicaciones. VarTipoXDato y VarValorXDato son obligatoriamente dos variables de salida definidas comoVariant antes de llamar al mtodo. Esta variables almacenarn un array de cdigos de tipo de datos y un array con el tipo de dato para cada cdigo respectivamente. Highlight. Asigna lo que se denomina puesta en relieve de una entidad, es decir, su resalte o designacin (lnea de trazos en lugar de continua). La sintaxis es la siguiente: ObjGrfico.Highlight(BooRelieve) BooRelieve es Boolean. El valor True hace que la entidad se resalte y False que no se resalte. A veces puede ser necesario realizar una regeneracin o utilizar el mtodo Update para que los resultados sean visibles. La mayora de las veces no hace falta. IntersectWith. Calcula todos los puntos de interseccin de dos entidades y los devuelve en forma de matriz de puntos. La sintaxis es: VarMatrizPtos = ObjGrfico1.IntersectWith(ObjGrfico2, OpcinExt) Se indican los objetos grficos con los que se desea calcular las intersecciones y una opcin de extensin cuyos valores son:
Opcin AcExtendNone AcExtendThisEntity AcExtendOtherEntity AcExtendBoth Descripcin No Se Se Se se prolonga ninguna entidad prolonga ObjGrfico1 prolonga ObjGrfico2 prolongan ambas entidades

El resultado es una matriz de valores de puntos tipo Variant. Si no hay puntos de interseccin, su valor es nulo. Mirror. Produce una simetra de la entidad en cuestin con respecto a un eje de siemetra que viene definido por dos puntos, ambos arrays de tres elementos tipo Double. El valor devuelto es un nuevo objeto simtrico al inicial (variable tipo Object). La sintaxis de este mtodo es: Set ObjSimtrico = ObjGrfico.Mirror(DblPto1, DblPto2) Los objetos no originales no son eliminados y, si deseramos hacerlo, deberamos utilizar el mtodoErase tras la ejecucin de la simetra.
NOTA: Recordemos la funcin de la variable MIRRTEXT a la hora de hacer simetras de textos. Veremos ms adelante cmo dar valores a variables de sistema de AutoCAD 14.

Veamos un ejemplo de este mtodo:


Option Explicit Dim Dim Dim Dim Dim Dim Dim AcadDoc As Object AcadModel As Object ObjLnea As Object PuntoInicial(1 To 3) As Double PuntoFinal(1 To 3) As Double PuntoSim(1 To 3) As Double SimLin As Object

Sub DibujoLnea() Set AcadDoc = GetObject(, "Autocad.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace PuntoInicial(1) = 100: PuntoInicial(2) = 100: PuntoInicial(3) = 0 PuntoFinal(1) = 200: PuntoFinal(2) = 200: PuntoFinal(3) = 0 Set ObjLnea = AcadModel.AddLine(PuntoInicial, PuntoFinal) PuntoSim(1) = 200: PuntoSim (2) = 100: PuntoSim (3) = 0 Set SimLin = ObjLnea.Mirror(PuntoFinal, PuntoSim) End Sub

En este ejemplo, tras dibujar una lnea se realiza una simetra de la misma, apoyndonos en un punto propio de la lnea origen y en otro recin creado. Mirror3D. De manera similar al mtodo anterior, Mirror3D produce una simetra tridimensional de un objeto con respecto a un plano definido por tres puntos. Los tipos de datos son iguales que en Mirror. Veamos la sintaxis de Mirror3D: Set ObjSimtrico3D = ObjGrfico.Mirror3D(DblPto1, DblPto2, DblPto3) Move. Se utiliza para desplazar un objeto apoyndose en un punto de base que se mover a otro punto indicado. Ambos puntos son matrices de tres elementos del tipo Double. Como no obtenemos ningn objeto, matriz de puntos o valor como devolucin, sino simplemente un desplazamiento, deberemos llamar al mtodo con Call. La sintaxis de este mtodo es: Call ObjGrfico.Move(DblPto1, DblPto2) Si en el ltimo ejemplo hubisemos querido desplazar el objeto simtrico, llevando el segundo punto del eje de simetra al ltimo punto de la primera lnea, habramos aadido el siguiente rengln tras la simetra: Call SimLin.Move(PuntoSim, PuntoFinal) Offset. Este mtodo crea un copia paralela o equidistante a un objeto y segn una distancia dada. La copia ser un matriz de objetos Variant; lo ms lgico es que la distancia sea una variable Double (si es variable y no se indica directamente un valor, claro est): VarEquidist = ObjGrfico.Offset(DblDistancia)

Para acceder posteriormente a cada objeto podemos utilizar la tcnica de las matrices. Rotate. Gira el objeto en cuestin con respecto a un punto base (tabla o array de tres elementos Double) y segn un ngulo indicado en radianes (Double). Su sintaxis es: Call ObjGrfico.Rotate(DblPtoBase, Dblngulo) Para girar, por poner un ejemplo, la simetra que hemos movido en el ejemplo anterior, aadiremos al cdigo del programa: Call SimLin.Rotate(PuntoFinal, (3.14159 / 2)) Rotate3D. Al igual que Rotate gira un entidad, esta vez en el espacio 3D y tomando como eje de giro el que determinan dos puntos. Los tipos de datos son los mismos. Su sintaxis es: Call ObjGrfico.Rotate3D(DblPto1, DblPto2, Dblngulo) ScaleEntity. Aplica un factor de escala al objeto con el cual est asociado y a partir de un punto base indicado. El tipo de dato de la escala depender de nuestra conveniencia, pero es lgico que sea Double. Su sintaxis es la que sigue: Call ObjGrfico.ScaleEntity(DblPtoBase, DblFactorEscala) SetXData. Permite asignar datos extendidos a una entidad. Se suministra un array Integer con el cdigo para cada tipo de dato y un array Variant con los datos, as: Call ObjGrfico.SetXData(IntTipoXDato, VarValorXDato) TransformBy. Mueve, escala y gira el objeto mediante una matriz de transformacin de 4 4. Los elementos de la matriz son de tipo Double y deben tener una disposicin concreta:
R00 R10 R20 0 R01 R11 R21 0 R02 R12 R22 0 T0 T1 T2 1

La rotacin se indica en la submatriz 33 que lleva la letra R, y en la columna marcada con T se indica la traslacin. Tambin en la submatriz de 33 es donde se indica el factor de escala. La sintaxis de TransformBy es: Call ObjGrfico.TransformBy(DblMatriz) Update. Actualiza el objeto al que se le aplica, que puede ser una entidad o incluso todo el dibujo. Su sintaxis es la que sigue: ObjGrfico.Update

Realizar una actualizacin del un objeto puede ser necesario en determinadas ocasiones en que una operacin en cuestin no produce el efecto deseado hasta que se actualiza. Si quisiramos por ejemplo actualizar la primera lnea dibujada del ejemplo que venimos manejando hasta ahora haramos: ObjLnea.Update Si lo que queremos es actualizar la aplicacin, habramos de definir un objeto as por ejemplo: Dim AcadApp As Object para darle un valor as: Set AcadApp = GetObject(, "AutoCAD.Application") y luego: AcadApp.Update En este caso declararamos el objeto de documento activo simplemente as: Set AcadDoc = AcadApp.ActiveDocument Despus de estudiar todas las propiedades y todos los mtodos del objeto de lnea, pasaremos ahora a ver los dems mtodos de las estas colecciones existentes para la creacin de objetos o entidades grficas de dibujo desde VBA. Muchas propiedades y/o mtodos son comunes a todos los objetos grficos, por lo que, de aqu en adelante, nicamente se expondrn aquellos que no se hayan visto ya. Es decir, iremos aprendiendo las caractersticas nuevas de cada objeto grfico sino se han visto con anterioridad en otro. An as, de cada objeto se proporcionan listadas todas sus propiedades y listados sus mtodos, resaltando en negrita los que se explican en la seccin en curso.

DOCE.5.2. Crculos
El mtodo AddCircle permite dibujar crculos en la coleccin de objetos de Espacio Modelo, Espacio Papel o formando parte de un bloque. Hay que indicar las coordenadas del punto del centro, que ser un matriz de tres elementos (coordenadas X, Y y Z) de tipo de dato Double, y el radio del crculo, que tambin ser Double. La sintaxis de AddCircle es: Set ObjCrculo = ObjColeccin.AddCircle(DblCentro, DblRadio) Propiedades de los objetos de crculo:

Application
Area Center

Color EntityName EntityType Handle Layer Linetype LinetypeScale Normal ObjectID


Radius

Thickness Visible Mtodos de los objetos de crculo: ArrayPolar ArrayRectangular Copy Erase GetBoundingBox GetXData Highlight IntersectWith Mirror Mirror3D Move Offset Rotate Rotate3D ScaleEntity SetXData TransformBy Update Como podemos observar, los mtodos son los mismos que para las lneas. En cuestin de propiedades desaparecen dos evidentemente (StartPoint y EndPoint) y aparecen Area, Radiusy Center, que son las que vamos a comentar a continuacin. Area. Obtiene el rea de una entidad cerrada (crculo, elipse, arco, polilnea, regin o spline). La variable que guarde el dato de salida habr sido declarado como Double. La sintaxis de esta propiedad es: Dblrea = ObjGrfico.Area Center. Obtiene y asigna el centro de la entidad. La sintaxis para asignar un nuevo centro es: ObjGrfico.Center = DblPtoCentro siendo DblPtoCentro un array de tres elementos Double que guarda las coordenadas X, Y y Z del nuevo centro. Para obtener el centro utilizaremos la sintaxis siguiente:

VarPtoCentro = ObjGrfico.Center donde VarPtoCentro ser una variable declarada como Variant que guardar las coordenadas del centro. Recordemos que para utilizar luego ests coordenadas, a la hora de suministrarlas como puntos de dibujo para objetos grficos, habr que realizar un trasvase de variables y guardarlas en una matriz o array de tres elementos tipo Double. Radius. Obtiene y asigna el radio de un crculo (o de un arco). El valor en cuestin, tanto uno nuevo para asignar como el que recoger una variable al obtener, ser del tipo Double. Por lo que si se utilizan variables (al obtener seguro, pero el asignar no es obligatorio) debern declararse como de doble precisin. La sintaxis para asignar un radio es: ObjGrfico.Radius = DblRadio y la sintaxis para obtener el radio de una entidad ya dibujada es: DblRadio = ObjGrfico.Radius

En el siguiente pequeo programa se crea un sencillo cuadro de dilogo (formulario en Visual Basic) que permite, mediante una serie de casillas de edicin y un botn de accin, dibujar un crculo en el Espacio Modelo o Espacio Papel, segn el botn excluyente que est activado. El cuadro de dilogo es el siguiente: El listado del cdigo es el que sigue:
Option Explicit Dim Dim Dim Dim Dim Dim AcadDoc As Object AcadModel As Object AcadPapel As Object DibujoEn As Object CrculoObj As Object PtoCentro(1 To 3) As Double

Dim Radio As Double Private Sub buttonDibujar_Click() PtoCentro(1) = Val(boxX.Text) PtoCentro(2) = Val(boxY.Text) PtoCentro(3) = Val(boxZ.Text) Radio = Val(boxRadio.Text) formPrincipal.Hide If optionModelo.Value = True Then Set DibujoEn = AcadModel Else Set DibujoEn = AcadPapel End If Set CrculoObj = DibujoEn.AddCircle(PtoCentro, Radio) End End Sub Private Sub UserForm_Initialize() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set AcadPapel = AcadDoc.PaperSpace End Sub

Como vemos, tras inicializar todas las variables se muestra el cuadro. La accin al pulsar el botnDibujar (buttonDibujar es su nombre) pasa por extraer los valores de las casillas de coordenadas (boxX, boxY y boxZ), pasarlos a valores numricos e introducirlos en la matriz que ser el punto centro del crculo. Tambin se realiza lo mismo con el radio (casilla boxRadio). Por ltimo se dibuja el crculo en el Espacio Modelo o en el Espacio Papel segn el valor de la variable de objetoDibujoEn, que lo que hace es almacenar un objeto u otro (Modelo o Papel) segn qu botn excluyente o de opcin est marcado (optionModelo u optionPapel).
NOTA: Se podran haber introducido tambin diversos controles de errores.

DOCE.5.3. Elipses
El mtodo AddEllipse permite dibujar elipses o arcos de elipse en la coleccin de objetos de Espacio Modelo, Espacio Papel o en la coleccin de bloques. La sintaxis de AddEllipse es: Set ObjElipse = ObjColeccin.AddElipse(DblCentro, DblPtoEjeMayor, DblRelacin) El centro ha de indicarse como una matriz de elementos Double (DblCentro); DblPtoEjeMayor es un punto (matriz de tres valores Double) en uno de los extremos del eje mayor, considerando las coordenadas en el SCO y relativas al centro; DblRelacin es un valor Double que es la relacin entre la medida del eje menor y del eje mayor (valor mximo igual a 1 se corresponde con un crculo).
Propiedades de los objetos de elipse:

Application Area Center Color


EndAngle EndParameter

EndPoint EntityName EntityType Handle Layer LineType LinetypeScale


MajorAxis MinorAxis

Normal ObjectID
RadiusRatio StartAngle StartParameter

StartPoint Visible Mtodos de los objetos de elipse: ArrayPolar ArrayRectangular Copy Erase GetBoundingBox GetXData Highlight IntersectWith Mirror Mirror3D Move Offset Rotate Rotate3D ScaleEntity SetXData TransformBy Update Los mtodos son los mismos que lo ya estudiados, pero hay propiedades nuevas. EndAngle. Obtiene y/o asigna el ngulo final en radianes de un objeto elipse (o arco). El ngulo se considera desde el cero trigonomtrico. Recorriendo el arco en el sentido antihorario, el primer extremo ser el punto inicial y el segundo extremo el final. Un crculo cerrado seran 6.28 radianes. La sintaxis para asignar un ngulo final a una elipse (o arco) ya dibujada ser pues: ObjGrfico.EndAngle = Dblngulo

y la sintaxis para obtener el ngulo de una entidad ya dibujada ser: Dblngulo = ObjGrfico.EndAngle Dblngulo es Double. EndParmeter. Slo aplicable a elipses, obtiene y asigna el parmetro final de una elipse (variable de tipo Double). Los parmetros inicial y final de una elipse se calculan segn la ecuacin P( ) = A cos ( ) + B sen ( ), donde A y B son la mitad del eje mayor y del menor respectivamente. El ngulo ser el inicial o final. Se pueden emplear los ngulos o los parmetros para crear una elipse. El parmetro final tiene un rango de 0 a 2 PI. Para asignar un parmetro final: ObjGrfico.EndParameter = DblParamFinal Para obtener un parmetro final: DblParamFinal = ObjGrfico.EndParameter MajorAxis. Slo aplicable a elipses, obtiene y asigna el punto extremo del eje mayor (es una matriz de tres elementos tipo Double). Sus coordenadas toman como origen el centro de la elipse y se miden en el SCO (Sistema de Coordenadas del Objeto). La sintaxis para asignar un punto extremo de eje mayor a una elipse es: ObjGrfico.MajorAxis = DblPtoEjeMayor Para obtener un punto extremo de eje mayor de una elipse, la sintaxis es: DblPtoEjemayor = ObjGrfico.MayorAxis MinorAxis. Enteramente similar a la propiedad anterior, pero obtiene el punto extremo del eje menor de una elipse. No se puede asignar un punto extremo de eje menor, nicamente obtener: DblPtoEjeMenor = ObjGrfico.MinorAxis RadiusRatio. Slo aplicable a elipses, define la relacin entre el tamao del eje menor de la elipse y el tamao del eje menor. La sintaxis para asignar una relacin: ObjGrfico.RadiusRatio = DblRelacin Para obtener la relacin de una elipse: DblRelacin = ObjGrfico.RadiusRatio El valor mximo admitido para la variable Double DblRelacin es 1, que significa que ambos ejes son iguales y por lo tanto se trata de un crculo.

StartAngle. Igual que EndAngle pero para el ngulo inicial. Para asignar uno: ObjGrfico.StartAngle = Dblngulo Para obtener uno: Dblngulo = ObjGrfico.StartAngle Dblngulo es Double. StartParmeter. Igual que EndParameter pero para el parmetro inicial. Para asignar uno: ObjGrfico.StartParameter = DblParamInicial Para obtener uno: DblParamInicial = ObjGrfico.StartParameter

DOCE.5.4. Arcos
El mtodo AddArc permite crear un arco de circunferencia que se dibuja desde el punto inicial al final en sentido contrario a las agujas del reloj. Estos puntos se calculan a partir de las propiedades StartAngle, EndAngle y Radius. Para crear un arco hay que indicar el centro (array de tres valores Double), el radio (Double), el ngulo inicial (Double) en radianes y el ngulo final (Double) tambin en radianes. La sintaxis deAddArc es: Set ObjArco = ObjColeccin.AddArc(DblCentro, DblRadio, DblngInic, DblngFin) Propiedades de los objetos de arco: Application Area Center Color EndAngle EndPoint EntityName EntityType Handle Layer LineType LinetypeScale Normal ObjectID Radius StartAngle

StartPoint Thickness Visible Mtodos de los objetos de arco: ArrayPolar ArrayRectangular Copy Erase GetBoundingBox GetXData Highlight IntersectWith Mirror Mirror3D Move Offset Rotate Rotate3D ScaleEntity SetXData TransformBy Update Todos los mtodos y propiedades de los arcos han sido ya explicados en las secciones anteriores.

DOCE.5.5. Puntos
Para aadir puntos como entidades grficas se utiliza el mtodo AddPoint, ya sea en cualquiera de las colecciones que lo poseen (Espacio Modelo, Papel o bloques). La manera es sencilla, ya que nicamente hay que suministrar al mtodo un punto que es, como siempre, una matriz o array de tres elementos (coordenadas X, Y y Z) de tipo de dato Double. La sintaxis para este mtodo es: Set ObjPunto = ObjColeccin.AddPoint(DblPunto) Propiedades de los objetos de punto: Application Color
Coordinates

EntityName EntityType Handle Layer LineType LinetypeScale

Normal ObjectID Thickness Visible Mtodos de los objetos de punto: ArrayPolar ArrayRectangular Copy Erase GetBoundingBox GetXData Highlight IntersectWith Mirror Mirror3D Move Rotate Rotate3D ScaleEntity SetXData TransformBy Update Los mtodos han sido ya estudiados y las propiedades se han visto todas excepto una nueva. Coordinates. Obtiene y/o asigna una matriz con las coordenadas de cada uno de los vrtices del objeto dado; en el caso del punto hay un nico vrtice. La variable que se asigna a estos vrtices (si la hubiera) se declara con una sentencia tipo Dim Vrtices (1 To n * 3) As Double, donde n es el nmero de vrtices o puntos. Para asignar una matriz de coordenadas a un objeto punto: ObjGrfico.Coordinates = DblMatrizVrtices Y para obtenerla: VarVrtices = ObjGrfico.Coordinates Donde VarVrtices es una variable declarada como Variant. Recordemos que si queremos utilizar despus las coordenadas habr que hacer un trasvase a una matriz de tres elementosDouble.

DOCE.5.6. Texto

El mtodo AddText permite aadir texto en una lnea al dibujo. Hemos de indicar la cadena de texto en cuestin (variable String), el punto de insercin en el SCU (matriz Double de tres valores) y la altura (Double). La sintaxis es pues que sigue: Set ObjTexto = ObjColeccin.AddText(StrTexto, DblPtoIns, DblAltura) Propiedades de los objetos de texto: Application Color EntityName EntityType Handle
Heigth HorizontalAlignment InsertionPoint

Layer LineType LinetypeScale Normal ObjectID


ObliqueAngle Rotation ScaleFactor StyleName TextAlignmentPoint TextGenerationFlag TextString

Thickness
VerticalAlignment

Visible Mtodos de los objetos de texto: ArrayPolar ArrayRectangular Copy Erase GetBoundingBox GetXData Highlight IntersectWith Mirror Mirror3D Move Rotate Rotate3D ScaleEntity SetXData TransformBy Update Los mtodos se han visto todos ya; las nuevas propiedades se estudian a continuacin.

Heigth. Obtiene y/o asigna la altura de un objeto. En el caso del texto se refiere a la altura de las letras maysculas. La sintaxis para asignar una altura a un objeto es: ObjGrfico.Heigth = DblAltura Y para obtenerla: DblAltura = ObjGrfico.Heigth Siendo DblAltura una variable declarada como Double. HorizontalAlignment. Obtiene o asigna la alineacin horizontal de y a los textos exclusivamente. Las sintaxis son: para asignar: ObjTexto.HorizontalAlignment = IntAlineacinH para obtener: IntAlineacinH = ObjTexto.HorizontalAlignment siendo los valores para IntAlineacinH del tipo Integer, aunque tambin se admiten las siguientes constantes: acHorizontalAlignmentLeft acHorizontalAlignmentCenter acHorizontalAlignmentRight acHorizontalAlignmentAligned acHorizontalAlignmentMiddle acHorizontalAlignmentFit InsertionPoint. Esta propiedad obtiene y asigna el punto de insercin de una entidad. El punto de insercin es una matriz de tres elementos Double, como cualquier otro punto: ObjGrfico.InsertionPoint = DblPtoIns Con esta sintaxis asignamos un nuevo punto de insercin a un objeto. Para extraer u obtener el punto de insercin de una entidad (ahora Variant) utilizaremos: VarPtoIns = ObjGrfico.InsertionPoint ObliqueAngle. Asigna y obtiene el ngulo de oblicuidad de un texto medido en radianes. Para valores positivos se produce una inclinacin a la derecha; los valores negativos se transforman en su equivalente positivo para almacenarlos, para ello se les suma 2PI. Para asignar un ngulo de oblicuidad: ObjTexto.ObliqueAngle = Dblngulo

Para obtener el ngulo de oblicuidad de un texto: Dblngulo = ObjTexto.ObliqueAngle Dblngulo es un variable de doble precisin Double. Rotation. Obtiene y/o asigna un ngulo de rotacin en radianes ( Double) para un texto, medido a partir del eje X y en sentido antihorario. Para asignar: ObjTexto.Rotation = Dblngulo Para obtener: Dblngulo = ObjTexto.Rotation ScaleFactor. Obtiene y/o asigna el factor de escala de anchura (Double) para una entidad de texto. Para asignar: ObjTexto.ScaleFactor = DblEscala Para obtener: DblEscala = ObjTexto.ScaleFactor StyleName. Obtiene y/o asigna el nombre (String) de estilo de texto (o acotacin) empleado para el objeto. El estilo deber estar definido en el dibujo, si no es as se producir un error. A definir un estilo desde VBA ya aprenderemos ms adelante. Si no se asigna estilo se asume por defecto el actual. Para asignar: ObjGrfico.StyleName = StrEstilo Para obtener: StrEstilo = ObjGrfico.StyleName TextAlignmentPoint. Obtiene y/o asigna la posicin del punto de alineacin del texto. Se trata pues de un array de tres elementos de tipo Double a la hora de asignar, y de una variableVariant a la hora de recoger los valores de un objeto texto. Para asignar pues: ObjTexto.TextAlignmentPoint = DblPtoAlineacin Para obtener:

VarPtoAlineacin = ObjTexto. TextAlignmentPoint TextGenerationFlag. Obtiene y/o asigna el tipo de generacin del texto. Es un valor Integerpero que posee tambin estas dos constantes: acTextFlagBackward acTextFlagUpsideDown para aplicar una generacin de "atrs hacia adelante" y de "arriba a abajo" respectivamente. Si se quieren aplicar los dos efectos se deben ejecutar dos instrucciones, una con cada valor. Para asignar pues: ObjTexto.TextGenerationFlag = IntGeneracin Para obtener: IntGeneracin = ObjTexto. TextGenerationFlag TextString. Obtiene y/o asigna la cadena de texto de una entidad texto. Se pueden incluir en la cadena (valor tipo String) los caracteres especiales de AutoCAD (los precedidos por %%). Para asignar una cadena la sintaxis es: ObjTexto.TextString = StrTexto Para obtener una cadena la sintaxis es: StrTexto = ObjTexto. TextString VerticalAlignment. Obtiene o asigna la alineacin vertical de y a los textos exclusivamente. Las sintaxis son: para asignar: ObjTexto.VerticalAlignment = IntAlineacinV para obtener: IntAlineacinV = ObjTexto. VerticalAlignment siendo los valores para IntAlineacinV del tipo Integer, aunque tambin se admiten las siguientes constantes: acVerticalAlignmentBaseline acVerticalAlignmentBottom acVerticalAlignmentMiddle acVerticalAlignmentTop

Veamos a continuacin un ejemplo de un programa que maneja textos. Primero mostraremos es cdigo del programa:
Option Explicit Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim AcadDoc As Object AcadModel As Object ObjTexto As Object PuntoIns(1 To 3) As Double TextoV As String ColorV As Integer: Dim CapaV As String: Dim TipoLinV As String EstiloV As String: Dim AlturaV As Double: Dim OblicuidadV As Double AlV As String AlH As String PI As Double

Private Sub Aceptar_Click() On Error Resume Next PuntoIns(1) = Val(X.Text) PuntoIns(2) = Val(Y.Text) PuntoIns(3) = Val(Z.Text) TextoV = Texto.Text Select Case LCase(Color.Text) Case "porcapa" ColorV = 256 Case "porbloque" ColorV = 0 Case Else ColorV = Val(Color) If ColorV < 0 Or ColorV > 256 Then MsgBox ("Color no vlido") Exit Sub End If End Select CapaV = Capa.Text TipoLinV = UCase(TipoLin.Text) EstiloV = UCase(Estilo.Text) AlturaV = Val(Altura.Text) OblicuidadV = (Val(Oblicuidad.Text) * 2 * PI) / 360 If AlDerecha.Value = True Then AlH = "acHorizontalAlignmentRight" If AlIzquierda.Value = True Then AlH = "acHorizontalAlignmentLeft" If AlCentro.Value = True Then AlH = "acHorizontalAlignmentCenter" If AlSuperior.Value = True Then AlV = "acVerticalAlignmentTop" If AlMitad.Value = True Then AlV = "acVerticalAlignmentMiddle" If AlLneaBase.Value = True Then AlV = "acVerticalAlignmentBaseLine" If AlInferior.Value = True Then AlV = "acVerticalAlignmentBottom" Set ObjTexto = AcadModel.AddText(TextoV, PuntoIns, AlturaV) ObjTexto.Color = ColorV ObjTexto.Layer = CapaV ObjTexto.Linetype = TipoLinV ObjTexto.StyleName = EstiloV ObjTexto.ObliqueAngle = OblicuidadV ObjTexto.HorizontalAlignment = AlH ObjTexto.VerticalAlignment = AlV End End Sub Private Sub Cancelar_Click() End End Sub

Private Sub UserForm_Initialize() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace PI = 3.14159 End Sub

Como vemos es bastante sencillo de entender, segn lo estudiado ya acerca de los textos. nicamente decir que estara un poco incompleto, ya que slo se controla como ejemplo que el usuario introduzca bien el nmero de color. Los dems controles (casillas vacas, estilos de texto existentes...) deberan introducirse para que el programa estuviera completo. NOTA: La manera de controlar si un estilo de texto existe, entre otros muchos controles, se estudiar ms adelante.

Veamos a continuacin el cuadro dilogo perteneciente a este cdigo:

NOTA: Recordemos poner a True la propiedad MultiLine de la casilla de edicin en la

que introducimos el texto.

También podría gustarte