Vbasic 6
Vbasic 6
Contenido
DOCE.1. INTRODUCCIN ....................................................................................................................................... 4 DOCE.2. Visual Basic Y ActiveX Automation .......................................................................................................... 4 DOCE.2.1. La lnea de productos de Visual Basic ............................................................................................. 5 DOCE.3. EL MDULO VBA DE AutoCAD ................................................................................................................. 6 DOCE.4. COMENZANDO CON VBA ......................................................................................................................... 7 DOCE.4.1. La plantilla de objetos...................................................................................................................... 7 DOCE.4.2. Comenzar un programa ................................................................................................................... 9 DOCE.5. DIBUJO Y REPRESENTACIN DE ENTIDADES.......................................................................................... 10 DOCE.5.1. Lneas .............................................................................................................................................. 10 Propiedades de los objetos de lnea: ............................................................................................................ 10 Tipo de entidad Descripcin ........................................................................................................................ 14 Opcin Descripcin ...................................................................................................................................... 20 DOCE.5.2. Crculos ........................................................................................................................................... 23 DOCE.5.3. Elipses ............................................................................................................................................. 25 DOCE.5.4. Arcos ............................................................................................................................................... 27 DOCE.5.5. Puntos............................................................................................................................................. 27 DOCE.5.6. Texto en una lnea ......................................................................................................................... 28 DOCE.5.7. Objetos de polilnea ...................................................................................................................... 33 DOCE.5.7.1. Polilneas de antigua definicin .............................................................................................. 33 DOCE.5.7.2. Polilneas optimizadas ............................................................................................................ 36 DOCE.5.8. Polilneas 3D ................................................................................................................................... 36 DOCE.5.9. Rayos .............................................................................................................................................. 37 DOCE.5.10. Lneas auxiliares ........................................................................................................................... 37 DOCE.5.11. Trazos ........................................................................................................................................... 38 DOCE.5.12. Splines .......................................................................................................................................... 38 DOCE.5.13. Texto mltiple .............................................................................................................................. 43 DOCE.5.14. Regiones ....................................................................................................................................... 44 DOCE.5.15. Slidos 3D..................................................................................................................................... 46 DOCE.5.15.1. Prisma rectangular ................................................................................................................... 46 DOCE.5.15.2. Cono .......................................................................................................................................... 47 DOCE.5.15.3. Cilindro ...................................................................................................................................... 47 DOCE.5.15.4. Cono elptico ............................................................................................................................. 47 DOCE.5.15.5. Cilindro elptico ..................................................................................................................... 47 DOCE.5.15.6. Esfera ..................................................................................................................................... 47 DOCE.5.15.7. Toroide .................................................................................................................................. 48 DOCE.5.15.8. Cua....................................................................................................................................... 48
2 DOCE.5.15.9. Extrusin................................................................................................................................ 48 DOCE.5.15.10. Extrusin con camino ......................................................................................................... 48 DOCE.5.15.11. Revolucin .......................................................................................................................... 48 DOCE.5.15.12. Propiedades y mtodos de los slidos 3D......................................................................... 49 DOCE.5.16. Caras 3D ....................................................................................................................................... 50 DOCE.5.17. Mallas poligonales........................................................................................................................ 51 DOCE.5.18. Imgenes de trama ...................................................................................................................... 53 DOCE.5.19. Slidos 2D..................................................................................................................................... 56 DOCE.5.20. Formas .......................................................................................................................................... 56 DOCE.5.21. Acotacin, directrices y tolerancias............................................................................................. 57 DOCE.5.21.1. Cotas alineadas ..................................................................................................................... 57 DOCE.5.21.2. Cotas angulares ..................................................................................................................... 59 DOCE.5.21.3. Cotas diamtricas ................................................................................................................. 60 DOCE.5.21.4. Cotas por coordenadas ......................................................................................................... 61 DOCE.5.21.5. Cotas radiales ........................................................................................................................ 62 DOCE.5.21.6. Cotas giradas ......................................................................................................................... 62 DOCE.5.21.7. Directrices ............................................................................................................................. 63 DOCE.5.21.8. Tolerancias ............................................................................................................................ 64 DOCE.5.22. Sombreado ................................................................................................................................... 65 DOCE.5.23. Referencias a bloques.................................................................................................................. 70 DOCE.5.24. Atributos de bloques ................................................................................................................... 71 DOCE.5.24.1. Referencias de atributos ........................................................................................................... 71 DOCE.5.24.2. Objeto de atributo .................................................................................................................... 73 DOCE.6. LA APLICACIN AutoCAD ....................................................................................................................... 74 DOCE.7. EL DOCUMENTO ACTUAL ACTIVO.......................................................................................................... 78 Open PurgeAll Regen Save SaveAs Setvariable WBlock ......................................... 79 DOCE.8. LAS COLECCIONES Y SUS OBJETOS......................................................................................................... 90 DOCE.8.1. Coleccin de objetos de Espacio Modelo .................................................................................... 90 DOCE.8.2. Coleccin de objetos de Espacio Papel ........................................................................................ 92 DOCE.8.3. Coleccin de bloques y el objeto bloque ...................................................................................... 94 DOCE.8.4. Coleccin de diccionarios y el objeto diccionario ........................................................................... 95 DOCE.8.5. Coleccin de estilos de acotacin y el objeto estilo de acotacin.................................................. 97 DOCE.8.6. Coleccin de grupos y el objeto grupo ......................................................................................... 97 DOCE.8.7. Coleccin de capas y el objeto capa ............................................................................................... 98 DOCE.8.8. Coleccin de tipos de lnea y el objeto tipo de lnea .................................................................... 102 DOCE.8.9. Coleccin de aplicaciones registradas y el objeto aplicacin registrada ................................... 103 DOCE.8.10. Coleccin de conjuntos de seleccin y el objeto conjunto de seleccin ............................... 104 DOCE.8.11. Coleccin de estilos de texto y el objeto estilo de texto ......................................................... 107
3 DOCE.8.12. Coleccin de SCPs y el objeto SCP ............................................................................................ 109 DOCE.8.13. Coleccin de vistas y el objeto vista ......................................................................................... 110 DOCE.8.14. Coleccin de ventanas y el objeto ventana .............................................................................. 111 DOCE.8.14.1. Ventanas del Espacio Papel ................................................................................................ 116 DOCE.9. UTILIDADES VARIAS (EL OBJETO Utility) .............................................................................................. 118 DOCE.10. EL TRAZADO ....................................................................................................................................... 140 DOCE.11. EL OBJETO DE PREFERENCIAS ............................................................................................................ 147 DOCE.11.1. Preferencias de archivos ............................................................................................................ 148 DOCE.11.2. Preferencias de rendimiento ..................................................................................................... 153 DOCE.11.3. Preferencias de compatibilidad ................................................................................................. 156 DOCE.11.4. Preferencias generales .............................................................................................................. 158 DOCE.11.5. Preferencias de visualizacin .................................................................................................... 160 DOCE.11.6. Preferencia de dispositivo ......................................................................................................... 165 DOCE.11.7. Preferencia de perfil .................................................................................................................. 165 DOCE.11.8. Mtodos del objeto de preferencias ......................................................................................... 165 DOCE.12. ALGUNOS TRUCOS ActiveX Automation PARA AutoCAD .................................................................. 166 DOCE.12.1. Compilacin de programas con un compi- lador de Visual Basic externo ............................. 167 DOCE.12.1.1. Objeto de aplicacin en programas compilados ............................................................... 169 DOCE.12.2. Ejecucin de programas VBA desde Auto- LISP y en macros ................................................... 170 DOCE.12.3. Enviar cadenas a la lnea de comandos desde VBA ................................................................. 171 DOCE.13. COMO APUNTE FINAL ........................................................................................................................ 174 DOCE.FIN. EJERCICIOS PROPUESTOS ................................................................................................................. 174
5
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 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 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.
6
depurador y un entorno de desarrollo integrado. Es la incluida en AutoCA VBScript (Visual Basic Scripting Edition). Es la herramienta de inferior nivel. Contiene un subc onjunto 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 diseo script para pginas Web de Internet en HTML (al estilo de JavaScript).
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 como AcadModel cada vez que nos tengamos que referirnos al Espacio Papel (que sern muchas veces), que utilizar la secuencia entera hasta ModelSpace .
10
Adems si trabajamos directamente 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), necesitaremo s 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 trabaja mos 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 que AutoCAD est cargado y con un dibujo abierto (en la versin 14 no es posible cerrar un dibujo), que ser referenciado como ActiveDocument . en VBA podemos sustituir las llamadas al
DOCE.5.1. Lneas
NOTA IMPORTANTE DE SINTAXIS: La sintaxis que se utiliza en este MDULO es similar a la de MDULOS 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 text os no en cursiva deben escribirse coma tales; las sintaxis recuadradras: mtodos en blanco y propiedades con sombra; 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 )
11
Los objetos grficos de dibujo hemos de declararlos previamente como tales. Para ello deberemos definir un nombre de varia ble 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 para AutoCAD que representa el tipo de objeto que almacenar. Este objeto especial tiene diferentes no mbres 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 como IAcadLine esa variable nica y exclusivamente podr almacenar entidades de lnea de AutoCAD, 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 c rea 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 V BA >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 siguientes lneas de cdigo: llamada DibujoLnea. A continuacin aadiremos las
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 11
12
Dim Dim Dim Dim AcadModel As Object ObjLnea As IAcadLine PuntoInicial (1 To 3) As Double 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 (com o 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 va lor 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 c ada 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. 12
13
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: AcByBloc AcByLaye AcCyan k r AcMagent AcGreen AcWhite a 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 y ObjGrfico 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 variable NmeroColor 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 n o 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, y 13 AcRed AcBlue AcYell ow
14
ObjGrfico 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
lnea. NombreLnea guardara la cadena AcDbLine, nombre de clase del objeto de entidad Cuando se pregunta por objetos de AutoCAD se puede emplear la siguiente propiedad EntityType . EntityType. Obtiene el tipo de entidad. ste ha de ser guardado en una variable de tipo Integer 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 24 25 26 27 28 29 30 31 32 33 34 35
Descripcin
AcDB3DFace AcDB3DPolyLine AcDB3DSolid AcDBArc AcDBAttribute AcDBAttributeReference AcDBBlockReference AcDBCircle AcDBDimAligned AcDBDimAngular AcDBDimDiametric AcDBDimOrdinate AcDBDimRadial AcDBDimRotated AcDBEllipse AcDBGroup AcDBHatch AcDBLeader AcDBLine AcDBMText AcDBPoint AcDBPolyline AcDBPolylineLight 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. 14
15
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 identif icar una entidad, mediante su ObjectID (visto ms adelante). Algunas funciones de ARX requieren un ObjectID 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 c adena 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 alfanumrica. habr de ser una variable del tipo String, es decir una cadena
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 StrNomTipoLnea una 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: 15
16
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 a pareca 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 podr n ser True o False. Si queremos asignar un estado de visibilidad a un objeto utilizaremos la siguiente sintaxis: ObjGrfico.Visible = BooEstadoVis 16
17
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. sigue: Si queremos extraer el estado de vis ibilidad de un objeto utilizaremos la sintaxis que BooEstadoVis = ObjGrfico .Visible donde BooEstadoVis habr sido declarado, como norma general, como Boolean. A parte de las propiedades, los nuevos objetos VBA para AutoCAD 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 Dim Dim Dim Dim ObjLnea As Object PuntoInicial (1 To 3) As Double PuntoFinal (1 To 3) As Double MatrizLin As Variant 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
18
En este nuevo ejemplo, a parte de lo anterior se declara la variable MatrizLin como Variant y PuntoBase 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, DblDistFil, DblDistCol, DblDistNiv) IntNumCol , IntNumNiv,
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 mtodo Move, 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 va riable, 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 Lnea6 haremos: 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 18
19
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 Dim Dim Dim Dim ObjLnea As Object PuntoInicial (1 To 3) As Double PuntoFinal (1 To 3) As Double MatrizLin As Variant 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.19 Si
20
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 dat os extendidos de todas las aplicaciones. VarTipoXDato y VarValorXDato son obligatoriamente dos variables de salida definidas como Variant 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 punt os, 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 elimi nados y, si deseramos hacerlo, deberamos utilizar el mtodo Erase 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. Veamos un ejemplo de este mtodo: Option Explicit Dim AcadDoc As Object Dim AcadModel As Object 20
21
Dim Dim Dim Dim Dim 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 apoyndonos en un punto propio de la lnea origen y en otro recin creado. de la misma,
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 valo r, 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)) 21
22
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: R0 0 R1 0 R2 0 R0 1 R1 1 R2 1 0 R0 2 R1 2 R2 2 0 T 0 T 1 T 2 1
La rotacin se indica en la submatriz 3 3 que lleva la letra R, y en la columna marcada con T se indica la traslacin. Tambin en la submatriz de 3 3 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: 22
23
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 )
24
donde VarPtoCentro ser una variable declarada como Variant que guardar las coordenadas del centro. Recordemos que para utilizar luego ests coordenadas, a la ho ra 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 AcadDoc As Object Dim AcadModel As Object Dim AcadPapel As Object Dim DibujoEn As Object Dim CrculoObj As Object Dim 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
24
25
If optionModelo.Value = True Then Set DibujoEn = AcadModel Else Set DibujoEn = AcadPapel End If Set CrculoObj = DibujoEn.AddCircle(PtoCentro, End End Sub
Radio)
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 botn Dibujar (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 objeto DibujoEn, 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).
Los mtodos son los mismos que lo ya estudiados, pero hay propiedades nuevas. 25
26
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 26
27
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:
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 de AddArc es: Set ObjArco = ObjColeccin.AddArc(DblCentro , DblRadio, DblngInic, DblngFin )
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 manera27 es
28
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 )
Los mtodos han sido ya estudiados y las propiedades se han visto todas excepto un 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 elementos Double.
29
TextAlignmentPoi nt VerticalAlignmen t texto: Mtodos de los objetos de ArrayPolar GetBoundingB ox Mirror Rotate 3D Update Los mtodos ArrayRectangul ar GetXData Mirror3D ScaleEntity StyleName Thickness TextGenerationFlag Visible TextString
Heigth. Obtiene y/o asigna la altura de un ob jeto. 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 acHorizontalAlignmentRight acHorizontalAlignmentMiddle acHorizontalAlignmentCenter acHorizontalAlignmentAligned 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 as ignamos 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: 29
30
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 variable Variant 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 30
31
Integer pero 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 acVerticalAlignmentMiddle acVerticalAlignmentBottom 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
31
32
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
32
33
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 int roduzca 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.
34
A continuacin pasaremos a comentar las nuevas propiedades an no estudiadas. Closed. Obtiene o asigna el estado de apertura o cierre de una polilnea (o spline). Es un valor de tipo Boolean que puesto a True dice de la polilnea que est abierta; por el contrario a False, indica que la polilnea est cerrada. La sintaxis para asignar esta propiedad es: ObjGrfico.Closed = BooCerrada Y la sintaxis para obtener la propiedad: BooCerrada = ObjGrfico .Closed Type. Obtiene y/o asigna el tipo de adaptacin a curva o amoldamiento de superficie de una polilnea, malla o directriz. Para asignar un tipo: ObjGrfico.Type = IntTipo y para obtenerlo: IntTipo = ObjGrfico .Type IntTipo es una valor Integer y que, adems, admite las siguiente constantes:
Para polilneas: Tipo acSimplePoly acFitCurvePoly acQuadSplinePo ly acCubicSplinePoly Para mallas: Tipo acSimpleMesh acQuadSurfaceMes h acCubicSurfaceMe sh Descripcin Simple Amoldada a superficie B-spline cuadrtica Amoldada a superficie B-spline cbica Descripcin Simple Adaptada a curva B-spline cuadrtica B-spline cbica
34
35
acBezierSurfaceMesh Para directrices: Tipo acLineNoArrow acLineWithArrow acSplineNoArrow acSplineWithArr ow Y con respecto a los a continuacin. proporciona Descripcin Una lnea sin flecha Una lnea con flecha Una spline sin flecha Una spline con flecha nuevos mtodos expuestos, explicacin Amoldada a superficie Bezier
su
detallada se
AppendVertex. Se aplica exclusivamente a polilneas 2D, 3D y mallas poligonales. Este mtodo aade un vrtice adicional al final de dichas entidades. En el caso de las mallas se debe aadir realmente toda una fila de vrtices de la matriz M N de la superficie. La sintaxis es: ObjGrfico .AppendVertex( DblPunto ) siendo DblPunto un punto de tipo de dato Double. Explode. Descompone una entidad compuesta en las entidades simples que la forman. Estas entidades simples se obtienen en una matriz de objetos que habr sido definida como Variant. Despus, y como ya hemos hecho en otros casos, podemos acceder a dichos objetos especificando un ndice para la matriz. Su sintaxis es: VarMatrizObjetos = ObjGrfico .Explode GetBulge. Obtiene el valor de curvatura de un vrtice de la polilnea especificado por su ndice (se empieza a contar desde el 0, como primer vrtice). Sintaxis: DblCurvatura = ObjPolilnea .GetBulge(Intndice ) La curvatura ha de almacenarse en una variable Double; el ndice es evidentemente de tipo entero (Integer). GetWidth. Obtiene el grosor inicial y final (Double) del tramo que comienza en el vrtice especificado por su ndice (Integer). La sintaxis de este mtodo es un poco distinta, ya que se llama a l con Call y se pasan las variables como argumentos del mtodo: Call ObjPolilnea .GetWidth( Intndice, DblGrosorInic , DblGrosorFin )
SetBulge. Inversamente a GetBulge, SetBulge asigna un valor de curvatura a un vrtice. Los tipos de datos son los mismos que para aquel: ObjPolilnea .GetBulge(Intndice, DblCurvatura )
SetWidth. De manera contraria a GetWidth, SetWidth asigna el grosor inicial y final de un tramo especificado por su vrtice inicia l. Los tipos de datos los mismo que para GetWidth: Call ObjPolilnea .SetWidth( Intndice, DblGrosorInic , DblGrosorFin )
35
Las propiedades de estas polilneas son exactamente las mismas que las de las anteriores. Con respecto a los mtodos, se cambia AppendVertex por AddVertex . AddVertex. Se aplica nicamente a polilnea optimizadas. Aade un nuevo vrtice a la entidad, que habr de ser el punto final de un nuevo segmento de la polilnea. Se indica el ndice (Integer) con la posicin del vrtice a cont inuacin del cual se aadir uno nuevo (Double): ObjPolilnea14.AddVertex( Intndice, DblPunto)
NOTA: Para crear polilneas con tramos curvos o en arco, se crea la polilnea con segmentos rectos y, a continuacin, se aade la curvatura a los tramos que interese mediante el mtodo SetBulge.
DOCE.5.8. Polilneas 3D
Para crear polilneas 3D recurrimos al mtodo Add3DPoly, cuya sintaxis es: Set ObjPolilnea3D = ObjColeccin .Add3DPoly( DblMatrizVrtices )
37
DOCE.5.9. Rayos
El mtodo de creacin de rayos es AddRay: Set ObjRayo = ObjColeccin.AddRay(DblPtoPrimero, DblPtoSegundo )
Se explican las nuevas propiedades seguida mente. BasePoint. Asigna u obtiene el punto (Double) a travs del cual el rayo (o la lnea auxiliar) pasar. Para asignar un punto de base utilizaremos la sintaxis siguiente: ObjGrfico.BasePoint = DblPunto Para obtener el punto de base de un objeto rayo (o lnea auxiliar) dibujado: VarPunto = ObjGrfico .BasePoint DirectionVector. Especifica (obtiene y/o asigna) una direccin segn un vector de direccin. Para asignar: ObjGrfico.DirectionVector = DblVector Para obtener: VarVector = ObjGrfico.DirectionVector DblVector es una matriz de tres elementos Double.
38
LineType LinetypeScale ObjectID Visible
DOCE.5.11. Trazos
El mtodo de creacin de trazos es AddTrace: Set ObjTrazo = ObjColeccin .AddTrace(DblMatrizVrtices )
hemos de indicar una matriz Double con los valores de los vrtices o
DOCE.5.12. Splines
El mtodo de creacin de splines es AddSpline : Set ObjSpline = ObjColeccin .AddSpline( DblMatrizVrtices, DblTanIni , DblTanFin)
38
39
GetControlPoin t Highlight Move Rotate SetFitPoint Update GetFitPoint IntersectWith Offset Rotate3D SetWeight GetWeight Mirror PurgeFitData ScaleEntity SetXData GetXData Mirror3D Reverse SetControlPoi nt TransformBy
Como decimos, la manera de aadir splines a un dibujo es mediante el mtodo AddSpline, pasndole como argumentos una matriz Double con los puntos de cada vrtice (cada uno es una matriz de tres elementos Double), la tangente de inicio, que es un vector de direccin representado por un array de tres valores Double, y la tangente final, siendo esta tambin otro vector de direccin similar al anterior. Por ejemplo, un programa simple que dibujara una spline podra ser la siguiente macro: Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim DibujoSpl As Object Dim Vrtices(1 To 3 * 3) As Double Dim TanInicial(1 To 3) As Double Dim TanFinal(1 To 3) As Double Sub DibujaSpline() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Vrtices( 1) Vrtices( 2) Vrtices( 3) Vrtices( 4) Vrtices( 5) Vrtices( 6) Vrtices( 7) Vrtices( 8) = = = = = = = = 0 0 0 5 0 5 0 1 0 0 0 = 100: TanInicial(2) = 100: TanInicial(1) = 0 100: TanFinal(2) = 100: TanFinal(1) = 0 = AcadModel.AddSpline(Vrtices, TanInicial, TanFinal)
Existen multitud de nuevas propiedades y de nuevos mtodos que se pasarn a detallar a continuacin. Comencemos por las propiedades. Degree. Permite obtener la graduacin de la representacin polinomial de una spline. Su sintaxis es: IntValor = ObjSpline .Degree El valor es de slo lectura y ha de almacenarse en una variable declarada como Integer (nicamente puede ser un nmero entre 1 y 25, ambos inclusive). EndTangent. Esta propiedad permite asignar y/o extraer el valor de la tangente final de la spline, esto es, una matriz de tres elementos Double que es un vector de direccin. La sintaxis para asignar una tangente final es la que sigue: 39
40
ObjSpline .EndTangent = DblVector Para obtenerla: VarVector = ObjSpline .EndTangent FitTolerance. Obtiene el ajuste de tolerancia, o reajusta esta propiedad de las splines. Como hemos de saber, si el valor de la tolerancia es cero, la spline est obligada a pasar por los vrtices; si es mayor de cero, tiende a ellos pero no los toca. El valor de tolerancia no puede ser negativo. La sintaxis para usar esta propiedad para asignar un valor de tolerancia a una spline es: es: ObjSpline .FitTolerance = DblValorTolerancia Para obtenerlo: DblValorTolerancia = ObjSpline.FitTolerance La variable que guarde este valor habr de ser declarada como Double. IsRational. Obtiene la condicin de racionalidad de la spline dada, es decir, verdadero (True) o falso (False). La sintaxis es: BooRacional = ObjSpline .IsRational La variable que guarde este valor habr de ser declarada como Boolean. NumberOfControlPoints . Propiedad de slo lectura que devuelve el nmero de puntos de control de una spline: IntNumCtrl = ObjSpline.NumberOfControlPoints La variable que guarde este valor habr de ser declarada como Integer. Si en el ejemplo anterior aadimos las siguientes lneas: Dim NumControl As Integer NumControl = DibujoSpl.NumberOfControlPoints MsgBox (Str(NumControl)) Aparecer un cuadro de mensaje ( MsgBox) con el n mero de puntos de control de nuestra spline, en este caso 5 (podemos comprobarlo ejecutando el comando de AutoCAD EDITSPLINE, SPLINEDIT en ingls, y designando la spline en cuestin). NumberOfFitPoints. Parecida a la propiedad anterior, sta devuelve el nmero de puntos de ajuste de una spline, es decir, sus vrtices: IntNumAjst = ObjSpline.NumberOfFitPoints La variable que guarde este valor habr de ser declarada como Integer tambin. Si en al ejemplo anterior aadiramos tambin lo siguiente: Dim NumAjuste As Integer 40
41
NumAjuste = DibujoSpl.NumberOfFitPoints MsgBox (Str(NumAjuste)) Aparecer otro cuadro de mensaje con el nmero de puntos de ajuste de nuestra spline, en este caso 3. StartTangent. As como EndTangent trabaja con la tangente final, StartTangent permite asignar y/o extraer el valor de la tangente inicial de la spline, esto es, una matriz de tres elementos Double que es un vector de direccin. La sintaxis para asignar una tangente inicial es la que sigue: ObjSpline .StartTangent = DblVector Para obtenerla: VarVector = ObjSpline .StartTangent Y hasta aqu las nuevas propiedades de las splines. Pasemos ahora a ver los mtodos nuevos. AddFitPoint. Este mtodo nos permite aadir un nuevo punto de ajuste a una spline ya creada. Para ello deberemos proporcionar un ndice de posicin del nuevo vrtice y sus coordenadas. Veamos la sintaxis de este mtodo: Call ObjSpline.AddFitPoint( Intndice, DblPtoAjuste )
Donde Intndice es la posicin (Integer) en la que se insertar el nuevo vrtice y DblPtoAjuste las coordenadas del punto en cuestin (matriz de tres valores Double). Deberemos llamar al mtodo con Call. As por ejemplo, para aadir un nuevo punto inicial (ndice 1) a la spline de nuestro ejemplo, agregaramos a la macro:
Dim NuevoPunto(1 To 3) As Double NuevoPunto( = 2 1) 5 NuevoPunto( = 2 2) 5 NuevoPunto( = 0 1) Call DibujoSpl.AddFitPoint(1, NuevoPunto) Lo que har que se aada el nuevo punto. Dependiendo de la situacin puede ser necesario actualizar la spline con su mtodo Update. DeleteFitPoint. De manera contraria al mtodo anterior, DeleteFitPoint elimina un punto de ajuste o vrtice de una spline. Su sintaxis: Call ObjSpline .DeleteFitPoint( Intndice ) Como vemos en la sintaxis, nicamente hay que proporcionar como argumento el ndice correspondiente al vrtice que deseamos eliminar, que ser, si es una variable, de tipo Integer. ElevateOrder. Eleva el orden de un spline al orden proporcionado como argumento del mtodo: Call ObjSpline .ElevateOrder( Intndice) 41
42
El orden de una spline es igual a su graduacin polinomial ms uno, de ah que este valor slo pueda ser como mucho 26. GetControlPoint. Permite obtener las coordenadas del punto de control especificado por el ndice que se proporciona como argumento. La sintaxis de uso es: VarPuntoCtrl = ObjSpline .GetControlPoint( Intndice) Donde VarPuntoCrtl es una variable definida como Variant donde se guardarn las coordenadas del punto en cuestin. Como sabemos ya, si queremos utilizarlas posteriormente deberemos realizar un trasvase a una matriz de tres elementos Double. Intndice es el ndice Integer del punto de control del que queremos obtener sus coordenadas. GetFitPoint. Las mismas consideraciones que para el mtodo anterior pero a la hora de obtener las coordenadas de un punto de ajuste: VarPuntoAjst = ObjSpline .GetFitPoint( Intndice ) GetWeight. Este mtodo devuelve el peso del punto del control de una spline especificado por su ndice. La sintaxis de utilizacin es la que sigue: DblPeso = ObjSpline.GetWeight( Intndice ) DblPeso es una variable declarada como Double que almacenar el valor del peso del punto. Intndice como en los mtodos anteriores. PurgeFitData. Limpia los datos de ajuste de una spline. Su sintaxis: Call ObjSpline .PurgeFitData Reverse. Inv ierte la direccin de la curva spline (el vrtice inicial se convierte en el final):
42
43
Call ObjSpline .Reverse SetControlPoint. Permite asignar coordenadas al punto de control especificado por el ndice que se proporciona como argumento. La sintaxis de uso es: Call ObjSpline.SetControlPoint( Intndice, DblCoordenadas )
Donde Intndice (Integer) es el ndice que determina el punto de control y DblCoordenadas el array de tres elementos Double, que son las coordenadas del punto mencionado. SetFitPoint. Las mismas consideraciones que para el mtodo anterior pero a la hora de asignar las coordenadas a un punto de ajuste: Call ObjSpline.SetFitPoint( Intndice, DblCoordenadas )
SetWeight. Este mtodo asigna un peso al punto del control de una spline especific ado por su ndice. La sintaxis de utilizacin es la que sigue: Call ObjSpline.SetWeight( Intndice, DblPeso )
As como en el dibujo de textos en una lnea, DblPtoIns es una matriz o tabla de tres elementos Double que son las coordenadas del punto de insercin, y StrTexto es la cadena literal de texto (String) que se imprimir en pantalla. DblAnchura se refiere a la anchura de la caja de abarque del texto mltiple (es valor Double). Podemos apreciar que los textos mltiples disponen de tres nuevas propiedades an no vistas. Las vemos a continuacin (los mtodos estn todos estudiados). AtachmentPoint. Esta propiedad, exclusiva de textos mltiples, permite asignar u 43
44
obtener el tipo de justificacin de un texto mltiple con respecto a su caja de abarque o rectngulo de reborde. Su sintaxis a la hora de asignar es: ObjTextoM .AtachmentPoint = IntTipoJus Para obtener: IntTipoJus = ObjTextoM.AtachmentPoint IntTipoJus es un valor Integer que adems puede albergar las siguientes constantes: acAttachmentPointTopLeft acAttachmentPointTopRight acAttachmentPointMidCenter acAttachmentPointBottomLeft acAttachmentPointBottomRight acAttachmentPointTopCenter acAttachmentPointMidLeft acAttachmentPointMidRight acAttachmentPointBottomCenter
Refirindose todas ellas a las distintas justificaciones posibles del texto mltiple. DrawingDirection. Esta propiedad, tambin exclusiva de textos mltiples, permite asignar u obtener el tipo de orientacin de un texto mltiple. Su sintaxis para asignar es: ObjTextoM .DrawingDirection = IntTipoOr Para obtener: IntTipoOr = ObjTextoM .DrawingDirection IntTipoOr es un valor Integer que puede albergar las siguientes constantes: acLeftToRight acRightToLeft acTopToBottom acBottomToTop
Width. Dice referencia a la anchura del rectngulo de abarque de un objeto. Su sintaxis para asignar una anchura es: ObjGrfico.Width = DblAnchura La sintaxis para obtener una anchura es: DblAnchura = ObjGrfico .Width
DOCE.5.14. Regiones
El mtodo para la obtencin de regiones es AddRegion y su sintaxis es: Set ObjRegin = ObjColeccin .AddRegion( ObjListaObjetos )
44
45
LineType ObjectID ProductOfInerti a LinetypeScale Perimeter RadiiOfGyrati on MomentOfInertia PrincipalDirections Visible Normal PrincipalMoments
46
La variable que habr de guardarlo ser declarada como Variant. ProductOfInertia. Devuelve el producto de inercias (en X, Y y Z) de una regin (o slido). Su sintaxis es: VarProductoInercias = ObjGrfico. ProductOfInertia La variable que habr de guardarlo ser declarada como Variant. RadiiOfGyration. Permite obtener el radio de giro (en X, Y y Z) de una regin (o slido). Su sintaxis es: VarRadioGiro = ObjGrfico.RadiiOfGyration La variable que habr de guardarlo ser declarada como Variant. NOTA: Todos los clculos que se realizan al utilizar estas propiedades se efectan en el sistema de coordenadas actual. Veamos ahora el nuevo mtodo. Boolean. Permite realizar una operacin booleana (unin, diferencia o interseccin) entre el objeto al cual se le aplica y otro objeto, sea slido o regin. Su sintaxis es la que sigue: ObjGrfico3 = ObjGrfico1.Boolean(LngOperacin, ObjGrfico2 )
LngOperacin es un valor tipo Long que indica la operacin que se realizar entre ambos slidos. Admite las siguientes constantes: acUnion acIntersection acSubtraction
ObjGrfico2 es la entidad grfica de AutoCAD (regin o slido) existente con la cual se realizar la operacin booleana con el otro objeto (ObjGrfico1). Ambos objetos debern estar ya creado, evidentemente. ObjGrfico3 es el objeto grfico resultado. Ser una variable declarada como Object.
DOCE.5.15. Slidos 3D
La obtencin de slidos primitivos de AutoCAD requiere ms de un mtodo para su ejecucin. Veremos aqu todos y cada uno de ellos, adems de sus propiedades y mtodos, que son comunes a todos ellos. Las diferentes sintaxis de creacin de slidos, con su explicacin pertinente, se exponen a continuacin.
46
47
Los argumentos para este mtodo son el punto de origen (DblPtoOrg), el cual es el centro de la caja de abarque, no una esquina (es una matriz de tres elementos Double); la dimensin de longitud (Double); la dimensin de anchura (Double); y la dimensin de altura (Double).
DOCE.5.15.2. Cono
Set ObjCono = ObjColeccin.AddCone(DblPtoCentro , DblAltura, DblRadioBase )
Los argumentos para este mtodo son el centro, el cual es el centro de la caja de abarque, no el de la base (es una matriz de tres elementos Double); la altura del cono (Double); y el radio de la base (Double).
DOCE.5.15.3. Cilindro
Set ObjCilindro = ObjColeccin.AddCylinder( DblPtoCentro , DblAltura, DblRadio )
Los argumentos para este mtodo son el centro, el cual es el centro de la caja de abarque, no el de la base (es una matriz de tres elementos Double); la altura del cilindro (Double); y el radio (Double).
Los argumentos para este mtodo son el centro, el cual es el centro de la caja de abarque, no el de la base (es una matriz de tres elementos Double); el radio mayor de la elipse de la base (Double); el radio menor de la elipse de la base (Double); y la altura del cono elptico (Double).
Los argumentos para este mtodo son el centro, el cual es el centro de la caja de abarque, no el de la base (es una matriz de tres elementos Double); el radio mayor de la elipse de la base (Double); el radio menor de la elipse de la base (Double); y la altura del cilindro elptico (Double ).
DOCE.5.15.6. Esfera
Set ObjEsfera = ObjColeccin .AddSphere( DblPtoCentro , DblRadio )
Los argumentos para este mtodo son el centro, el cual es el centro de la caja de abarque, o sea el propio centro de la esfera (es una matriz de tres elementos Double); y el 47
48
radio de la esfera (Double).
DOCE.5.15.7. Toroide
Set ObjToroide = ObjColeccin .AddTorus(DblPtoCentro , DblRadToro , DblRadTub)
Los argumentos para este mtodo son el centro, el cual es el centro de la caja de abarque, o sea el propio centro del toroide o toro (es una matriz de tres elementos Double); el radio de toroide (Double); y el radio del tubo (Double).
DOCE.5.15.8. Cua
Set ObjCua = ObjColeccin.AddWedge( DblPtoCentro , DblLargo, DblAncho, DblAlto)
Los argumentos para este mtodo son el centro, el cual es el centro de la caja de abarque, no una esquina ni el centro de una cara (es una matriz de tres elementos Double); la dimensin de longitud (Double); la dimensin de anchura (Double); y la dimensi n de altura (Double).
DOCE.5.15.9. Extrusin
Set ObjExtrusin = ObjColeccin .AddExtrudedSolid( ObjPerfil, Dblngulo ) DblAltura ,
Con este mtodo podemos crear extrusiones de cualquier perfil que cumpla las normas necesarias para poder ser perfil de extrusin (igual que desde la interfaz de AutoCAD). La nica excepcin quiz es que dicho perfil habr de ser obligatoriamente una regin, no es lcito desde VBA utilizar una polilnea. Por ello todos los perfiles originales tendrn informacin de superficie, lo que har que AutoCAD cree slidos cerrados (con tapa) . ObjPerfil se refiere al objeto (Object) a partir del cual se crear la extrusin (una regin, como hemos dicho); DblAltura es la altura de extrusin a lo largo del eje Z (Double); Dblngulo es el ngulo de salida de la extrusin en radianes (Double).
Con este mtodo podemos crear extrusiones a lo largo de un camino de extrusin. ObjPerfil es el objeto (tipo Object) que ser el perfil que se extruir (ser una regin); ObjCamino es otro objeto (tipo Object tambin) que es el camino de extrusin (ser una polilnea, un crculo, una elipse, una spline o un arco, exclusivamente).
DOCE.5.15.11. Revolucin
Set ObjRevolucin = ObjColeccin .AddRevolvedSolid(ObjPerfil, DblDireccin , Dblngulo ) DblPtoInicial , 48
49
Con el mtodo AddRevolve creamos objetos de revolucin a partir de un perfil de revolucin. Se pasan como argumentos el objeto (Object), que ser perfil (slo una regin); el punto inicial del eje de revolucin (matriz de tres elementos Double); la direccin del eje de revolucin (matriz de tres elementos Double); y el nmero de ngulos cubiertos en radianes (Double).
Pasaremos ahora a comentar las que an no conocemos. Primero la nueva propiedad Volume. Volume. Esta propiedad de slo lectura y exclusiva de los slidos permite extraer el volumen de uno de ellos (tipo Double). Para esto utilizamos la sintaxis siguiente: DblVolumen = ObjSlido.Volume Veamo s ahora los nuevos mtodos CheckInterference, SectionSolid y SliceSolid. CheckInterference. Con este mtodo disponemos de la posibilidad de averiguar si existe interferencia entre dos slidos y, si as fuera y lo especificramos, crear un nuevo slido resultante. La sintaxis para su uso es: ObjSlido3 = ObjSlido1 .CheckInterference(ObjSlido2 , BooCrearNuevo )
ObjSlido2 es la entidad (tipo Object) con que se quiere comprobar la interferencia con ObjSlido1. BooCrearNuevo es un valor booleano (tipo Boolean), esto es True (verdadero) o False (falso), que especifica si se crear un slido con la interferencia (si existiera). ObjSlido3 es el slido resultante (tipo Object) si hubiera interferencia y BooCrearNuevo estuviera puesto a True. SectionSolid. Crea un regin, que es la seccin del slido al que se le aplica, determinada por un plano definido por tres puntos que se proporcionan como argumentos.
49
50
ObjSlido2 = ObjSlido1 .SectionSolid( DblPto1, DblPto2, DblPto3 )
ObjSlido2 es el objeto (tipo Object) resultante que ser un regin; DblPto1, DblPto2 y DblPto3 son los tres puntos (matriz de tres valores tipo Double) que definen el plano de seccin. SliceSolid. Produce un corte, en el slido al que se aplica, mediante un plano definido por tres puntos. ObjSlido2 = ObjSlido1 .SliceSolid( DblPto1, DblPto2, DblPto3, BooNeg )
ObjSlido2 es el objeto (tipo Object ) resultante que ser un slido; DblPto1, DblPto2 y DblPto3 son los tres puntos (matriz de tres valores tipo Double cada uno) que definen el plano de corte; BooNeg es una valor tipo Boolean (True o False) que determina si se devuelve o no el slido en la parte negativa del plano, o sea, que si se conserva la parte cortada en la zona negativa del plano o no. True conserva el slido completo, pero cortado; False elimina dicha parte.
DOCE.5.16. Caras 3D
El mtodo del que disponemos para la creacin de caras 3D es Add3DFace y su sintaxis es la sigue a continuacin: Set ObjCara3D = ObjColeccin .Add3DFace( DblPto1, DblPto2, DblPto3 , DblPto4 )
51
Intndice es el nmero de orden de la arista que se desea comprobar de la cara 3D. Ha de ser un valor entre 0 y 3, siendo 0 la primera arista y 3 la cuarta, si la hubiera. SetInvisibleEdge. Asigna un estado de visibilidad para una arista de una cara 3D, especificada por su ndice. Su sintaxis es: Call ObjCara3D.SetInvisibleEdge( Intndice, BooEstado)
El significado y tipo de dato para Intndice y BooEstado son los mismos que en el mtodo anterior.
Add3DMesh crea una malla tridimensional indicndole el nmero de vrtices en las direcciones M y N (con el mismo sentido que desde la interfaz grfica de AutoCAD), as como una matriz M N de los puntos en cuestin. Los valores de M y N son valores enteros (si son variables sern declaradas como Interger) entre 2 y 256. La matriz de vrtices contendr todos los puntos, los cuales requieren tres coordenadas tipo Double. Veamos un ejemplo (macro): Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim Vrtices(1 To 3 * 3) As Double Sub MallaDib() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadPapel = AcadDoc.PaperSpace Dim M As Integer, N As Integer Dim Malla as Object Dim Total As Integer M = 2 N = 2 Total = M * N 51
52
Dim Vrtices(1 To Total * 3) As Double Vrtices( = 0 1) Vrtices( = 0 2) Vrtices( = 0 3) Vrtices( = 2 4) Vrtices( = 0 5) Vrtices( = 0 6) Vrtices( = 0 7) Vrtices (8) = 20 Vrtices (9) = 0 Vrtic (1 = 2 es 0) 0 Vrtic (1 = 2 es 1) Vrtic (1 = 0 es 2) Set Malla = AcadPapel.Add3dMesh(M, N, Vrtices) End Sub Pasemos a la explicacin pertinente de propiedades y mtodos nuevos. Como siempre, primero las propiedades. MClose. Esta propiedad permite asignar u obtener la verificacin de cerramiento de la malla en la direccin M. La sintaxis que usaremos para asignar un cerramiento o apertura en est a direccin es: ObjMalla3D.MClose = BooVerCerramiento Y la sintaxis para obtener la propiedad: BooVerCerramiento = ObjMalla3D.MClose Siendo BooVerCerramiento una variable declarada como Boolean, la cual si guarda True significa que la malla est cerrada en M; si guarda False significa que est abierta en dicha direccin. MDensity. Esta propiedad permite asignar u obtener la densidad de la malla en la direccin M. La densidad es el nmero de vrtices (en este caso en M) que posee la malla despus de una operacin de ajuste de la misma. La sintaxis que usaremos para asignar una densidad en esta direccin es: ObjMalla3D.MDensity = IntDensidad Y la sintaxis para obtener la propiedad: IntDensidad = ObjMalla3D .MDensity Siendo IntDensidad una variable d eclarada como Integer. Por defecto este valor es igual a 6. MVertexCount. Esto es el nmero de vrtices de una malla poligonal en la direccin M cuando la propiedad Type es igual a acSimpleMesh (vase la seccin DOCE.5.7.1. , en el lugar en el que se muestran los valores de Type para las mallas). Y la sintaxis que utilizaremos para obtener este valor de slo lectura es: 52
53
IntNumVert = ObjMalla3D .MVertexCount Siendo IntNumVert una variable declarada como Integer. Este valor slo puede encontrarse entre 2 y 256. NClose. Lo mismo que para MClose pero en direccin N. NDensity. Lo mismo que para MDensity pero en direccin N. NVertexCount. Lo mismo que para MVertexCount pero en direccin N. NOTA: Vase la seccin DOCE.5.7.1. , donde se comenta la propiedad Type de las polilneas, para observar los valores de esta propiedad en las mallas.
Para poder introducir una imagen raster desde VBA necesitamos proporcionar el nombre y ruta completa del archivo de imagen (StrNombArch), que si es variable ser del tipo String; el punto de insercin (matriz de tres elementos Double); el factor de escala (Double), cuyo valor por defecto es 1, y habr de ser siempre positivo; y el ngulo de rotacin en radianes (Double). Los tipos de formatos grficos admitidos son los mismos que en la insercin de imgenes de trama desde la interfaz grfica. Veamos las nuevas propiedades. Brightness. Establece u obtiene el brillo de una imagen. Este valor es Integer y debe estar comprendido entre 0 y 100. Por defecto vale 50. La sintaxis que usaremos para asignar brillo es: ObjRaster .Brightness = IntBrillo 53
54
Y la sintaxis para obtener el brillo: IntBrillo = ObjRaster .Brightness ClippingEnabled. Habilita o no un contorno delimitador creado con el mtodo ClipBoundary (que veremos luego). Tambin se puede utilizar para devolver un valor booleano que nos informe de si cierta imagen posee o no esta propiedad activada. La sintaxis que usaremos para habilitar o no el contorno delimitador es: ObjRaster .ClippingEnabled = BooEstadoMarco Si hacemos esta propiedad igual a True el cont orno se habilita; con False se deshabilita. Y la sintaxis para obtener es: BooEstadoMarco = ObjRaster.ClippingEnabled BooEstadoMarco habr sido definida como Boolean. Contrast. Establece u obtiene el contraste de la imagen. Este valor Integer habr de estar entre 0 y 100. Por defecto es 50. La sintaxis que usaremos para asignar contraste es: ObjRaster .Contrast = IntContraste Y la sintaxis para obtener el contraste: IntContraste = ObjRaster .Contrast Fade. Establece u obtiene el difuminado de la imagen. Este valor Integer habr de estar entre 0 y 100. Por defecto es 0. La sintaxis que usaremos para asignar difuminado es: ObjRaster .Fade = IntDifuminado Y la sintaxis para obtener el difuminado existente en una imagen: IntDifuminado = ObjRaster .Fade ImageFile. Establece u obtiene el archivo de imagen de la insercin raster . La sintaxis que usaremos para asignar un nombre es: ObjRaster.ImageFile = StrNombArch Y la sintaxis para obtener el nombre de archivo de una imagen: StrNombArch = ObjRaster .ImageFile StrNombArch es una cadena declarada como String. 54
55
ImageVisibility. Establece u obtiene si la imagen es visible o no. La sintaxis que usaremos para asignar la condicin de visibilidad: ObjRaster .ImageVisibility = BooVisibilidad Y la sintaxis para obtener la condicin de visibilidad: BooVisibilidad = ObjRaster.ImageVisibility La variable que guarde este valor estar declarada como Boolean. Esta variable es booleana y adems puede contener las siguiente constantes: acOn acOff
Origin. Establece u obtiene el punto origen de un objeto (otros adems de imgenes de trama) en coordenadas del SCU. Utilizaremos la siguiente sintaxis para asignar un punto de origen: ObjGrfico.Origin = DblPtoOrigen Y podemos utilizar la siguiente para obtener el punto origen de un objeto que admita esta propiedad: VarPtoOrigen = ObjGrfico .Origin La variable que guarde este valor guardar un punto, es decir, ser una matriz de tres elementos Double para asignar o un variable Variant para recoger. Transparency. Establece u obtiene la condicin de transparencia para imgenes bitonales. Para establecer o asignar: ObjRaster .Trasparency = BooCondicinTransp Para obtener: BooCondicinTrans = ObjRaster.Transparency BooCondicinTrans es una variable del tipo Boolean que puede adquirir los siguientes valores constantes: acOn acOff
El nico mtodo nuevo se detalla ahora: ClipBoundary. Establece una serie de puntos que determinan un contorno delimitador para la imagen de trama. Su sintaxis es: Call ObjRaster .ClipBoundary( DblMatrizPtos ) donde DblMatrizPtos contiene los diferentes puntos (array de tres elementos Double).
55
56
NOTA: Recordemos que para hacer efectivo este contorno deberemos poner a True la propiedad ClippingEnabled del objeto de imagen de trama en cuestin.
DOCE.5.19. Slidos 2D
Para crear slidos 2D, esto es, polgonos de relleno slido (comando SOLIDO, SOLID en ingls, de AutoCAD), el mtodo de las colecciones de Espacio Modelo, Papel o de bloques que utilizamos es AddSolid. La sintaxis del mtodo AddSolid es la que sigue: Set ObjSlido2D = ObjColeccin.AddSolid( DblPto1, DblPto2, DblPto3, DblPto4)
DOCE.5.20. Formas
El siguiente mtodo permite aadir formas al dibujo. Para ello el archivo de formas contenedor correspondiente .SHX habr de estar cargado, lo que apre nderemos a hacer ms adelante. La sintaxis del mtodo AddShape es: Set ObjForma = ObjColeccin .AddShape( StrNombre, DblPtoIns, DblFacEscal, DblRot)
57
Rotate 3D Update ScaleEntity SetXData TransformBy
Veremos la nica propiedad nueva. Name. Obtiene y/o asigna el nombre del objeto en cuestin, en el caso que nos ocupa el de la forma (tambin en el de documento activo, aplicacin... que veremos ms adelante). La sintaxis para asignar es: Objeto.Name = StrNombre La sintaxis para obtener es: StrNombre = Objeto.Name Ejemplo: Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim Forma As Object Dim PtoIns(1 To 3) As Double Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace PtoIns(1) = 100: PtoIns(2) = 100: PtoIns(3) = 0 Set Forma = AcadModel.AddShape("box", PtoIns, 1, 0) MsgBox Forma.Name End Sub Esta macro inserta una forma llamada BOX (del archivo LTYPESHP.SHX) en el punto 100,100,0 del Espacio Modelo del dibujo actual. A continuacin muestra en un cuadro de mensaje el nombre (extrado con Name) de la forma insertada (Forma), que en este caso ser BOX. Como ya hemos comentado, el archivo LTYPESHP.SHX en este caso deber estar cargado.
58
Set ObjCotaAlineada = ObjColeccin.AddDimAligned( DblPtoLinExt1, DblPosTexto ) DblPtoLinExt2 ,
En las cotas alineadas, como debemos saber, la lnea de cota es paralela a la lnea que une los puntos de origen de las lneas de extensin o auxiliares. Las lneas de extensin comienzan en dos puntos (Double) que son los que indicaremos en la sintaxis de AddDimAligned como dos primeros argumentos. La posicin del texto, que tambin es el valor de un punto (matriz de tres elementos Double), indicar la longitud de las lneas auxiliares, teniendo en cuenta por supuesto la configuracin del estilo de acotacin actual. Veremos las cuatro nuevas propiedades. ExtLine1Point. Obtiene y/o asigna un punto para la primera lnea de extensin. La sintaxis para asignar es: ObjetoCotaAlineada.ExtLine1Point La sintaxis para obtener es: VarPunto1 = ObjetoCotaAlineada.ExtLine1Point Como siempre, para recoger un punto utilizaremos una variable Variant. Despus podremos acceder a cada valor unitario mediante ndices, como ya se explic. ExtLine2Point. Obtiene y/o asigna un punto para la segunda lnea de extensin. La sintaxis para asignar es: ObjetoCotaAlineada.ExtLine2Point La sintaxis para obtener es: VarPunto2 = ObjetoCotaAlineada.ExtLine2Point Las mismas consideraciones que para la propiedad anterior. TextPosition. Obtiene y/o asigna un punto para la posicin de l texto. La sintaxis para asignar es: ObjetoCota.TextPosition = DblPuntoTexto 58 = DblPunto2 = DblPunto1
59
La sintaxis para obtener es: VarPuntoTexto = ObjetoCota.TextPosition Como siempre, para recoger un punto utilizaremos una variable Variant. Despus podremos acceder a cada valor unitario mediante ndices, como ya explic. TextRotation. Obtiene y/o asigna el ngulo de rotacin en radianes del texto de cota. La sintaxis para asignar es: ObjetoCota.TextRotation = DblRotacin La sintaxis para obtener es: DblRotacin = ObjetoCota .TextRotation DblRotacin ha de ser un valor Double.
ArrayPolar ArrayRectangul Copy Erase GetBoundingB ar GetXData Highlig IntersectWi ox ht th Mirror Mirror3D Move Rotate Rotate ScaleEnti SetXDa Transform 3D ty ta By Update En el mtodo AddDimAngular primero se indica como argumento el centro del arco o el vrtice comn entre las dos lneas auxiliares (Double). Los dos siguientes argumentos especifican los puntos (tambin matriz de tre s elementos Double) por los que pasan las lneas de extensin o auxiliares. El ltimo argumento indica la posicin del texto; es tambin un punto (Double). Las cuatro nuevas propiedades a continuacin. ExtLine1EndPoint. Obtiene y/o asigna un punto fina l para la primera lnea de extensin. 59
60
La sintaxis para asignar es: ObjetoCotaAngular .ExtLine1EndPoint La sintaxis para obtener es: VarPuntoFinal1 = ObjetoCotaAngular.ExtLine1EndPoint ExtLine1StartPoint. Obtiene y/o asigna un punto inicial para la primera lnea de extensin. La sintaxis para asignar es: ObjetoCotaAngular .ExtLine1StartPoint La sintaxis para obtener es: VarPuntoInicial1 = ObjetoCotaAngular .ExtLine1StartPoint ExtLine2EndPoint. Obtiene y/o asigna un punto final para la segunda lnea de extensin. La sintaxis para asignar es: ObjetoCotaAngular .ExtLine2EndPoint La sintaxis para obtener es: VarPuntoFinal2 = ObjetoCotaAngular.ExtLine2EndPoint ExtLine2StartPoint. Obtiene y/o asigna un punto inicial para la segunda lnea de extensin. La sintaxis para asignar es: ObjetoCotaAngular .ExtLine2StartPoint La sintaxis para obtener es: VarPuntoInicial2 = ObjetoCotaAngular .ExtLine2StartPoint = DblPuntoInicial2 = DblPuntoFinal2 = DblPuntoInicial1 = DblPuntoFinal1
60
61
Visible
62
Update El mtodo AddDimOrdinate crea una cota de coordenadas. Hay que indicar un punto (Double) de definicin que ser el acotado, del que parte de lnea de cota. Despus se indica otro punto (Double) final para la lnea de cota. En este segundo punto ser donde se site el texto. Por ltimo, un valor Boolean que especifica si el valor del texto ser el del eje X o el del eje Y: True crea una cota de coordenadas mostrando el valor del eje X; False mostrando el valor de Y. Las propiedades y mtodos expuestos estn ya estudiados.
Al mtodo AddDimRadial hay que proporcionarle como argumentos el punto central (array de tres elementos Double) del arco o crculo que acotar, un punto ( array de tres elementos Double) de dicho arco o crculo por el que pasar la lnea de cota o directriz y una longitud (tipo de dato Double) para dicha directriz. Las propiedades y mtodos expuestos estn ya estudiados.
DblPtoLinExt1 es un valor que indica el punto (ma triz de tres elementos Double) de la primera lnea auxiliar o de extensin, es decir, uno de los extremos de la lnea que ser medida. DblPtoLinExt2 lo mismo que DblPtoLinExt1 pero para la segunda lnea auxiliar. DblPosLneaCota es tambin un punto (matriz de tres valores Double) que especifica la posicin de la lnea de cota y, por ende, la del texto (segn variables). Y DblRotacin es un valor Double que indica, en radianes, al ngulo de rotacin de la cota girada. Las propiedades y mtodos expuestos est n ya estudiados.
DOCE.5.21.7. Directrices
El mtodo AddLeader nos ofrece la posibilidad de agregar directrices de AutoCAD a nuestro dibujo actual. La sintaxis del mtodo es la que sigue: Set ObjDirectriz = ObjColeccin .AddLeader(DblMatrizPtos , ObjAnotacin, IntTipo)
DblMatrizPtos ha de ser una matriz de elementos de punto (ma triz tambin de tres elementos Double) que contenga los vrtices (cuntos sean) de la directriz. ObjAnotacin es un objeto (Object) que solamente puede ser de tolerancia (que enseguida veremos), de texto mltiple (ya estudiado) o de referencia a bloque. IntTipo es un valor entero que adems puede contener las constantes siguientes: AcLineNoArrow acLineWithArrow acSplineNoArrow acSplineWithArrow que ha de
El valor que se devuelve (ObjDirectriz) es un objeto de directriz almacenarse en una variable declara da evidentemente como Object. Ahora comentamos el mtodo Evaluate de los objetos de directriz. ObjGrfico .Evaluate
63
64
Este mtodo exclusivo de directrices y sombreados evala los objetos y, si fuera necesario, los actualizara. En el caso de las directrices se comprueba la relacin de la misma con su anotacin asociada. NOTA: Vase la seccin DOCE.5.7.1. , donde se comenta la propiedad polilneas, para observar los valores de esta propiedad en las directrices. Type de las
DOCE.5.21.8. Tolerancias
El mtodo AddTolerance permite crear objetos de tolerancia. La sintaxis del mtodo es la siguiente: Set ObjTolerancia = ObjColeccin .AddTolerance(StrTexto, DblPtoIns, DblVectDir)
A AddTolerance se le suministra como primer argumento una cadena ( String) de texto que ser la que se escriba en la tolerancia. Como segundo argumento un valor que es matriz de tres elementos Double; esto es un punto, que ser el punto de insercin de la tolerancia (del smbolo). Por ltimo, un vector de direccin (tres elementos Double) que especifican la direccin del smbolo de tolerancia. Las propiedades y mtodos expuestos estn ya estudiados. A continuacin veremos una macro de ejemplo la cual, tras dibujar un rectngulo con cuatro lneas y pasarlas a color azul (para luego distinguir las cotas), agrega tres cotas distintas: una alineada, otra angular y otra girada. A modo pues de ejemplo: Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim Dim Dim Dim Dim Dim Dim Lnea As Object PtoLin1(1 To 3) PtoLin2(1 To 3) PtoLin3(1 To 3) PtoLin4(1 To 3) Cota As Object PtoTexto(1 To 3)
As As As As
As Double
64
65
PtoLin1(1) = 10: PtoLin1(2) = 10: PtoLin1(3) = 0 PtoLin2(1) = 10: PtoLin2(2) = 20: PtoLin2(3) = 0 PtoLin3(1) = 40: PtoLin3(2) = 20: PtoLin3(3) = 0 PtoLin4(1) = 40: PtoLin4(2) = 10: PtoLin4(3) = 0 Set Lnea = AcadModel.AddLine(PtoLin1, PtoLin2) Lnea.Color = 5 Set Lnea = AcadModel.AddLine(PtoLin2, PtoLin3) Lnea.Color = 5 Set Lnea = AcadModel.AddLine(PtoLin3, PtoLin4) Lnea.Color = 5 Set Lnea = AcadModel.AddLine(PtoLin4, PtoLin1) Lnea.Color = 5 PtoTexto(1) = 25: PtoTexto(2) = 27: PtoTexto(3) = 0 Set Cota = AcadModel.AddDimAligned(PtoLin2, PtoLin3, PtoTexto) Dim PtoPasa1(1 To 3) As Double Dim PtoPasa2(1 To 3) As Double PtoPasa1(1) = 40: PtoPasa1(2) = 15: PtoPasa1(3) = 0 PtoPasa2(1) = 30: PtoPasa2(2) = 10: PtoPasa2(3) = 0 PtoTexto(1) = 35: PtoTexto(2) = 12: PtoTexto(3) = 0 Set Cota = AcadModel.AddDimAngular(PtoLin4, PtoPasa1, PtoPasa2, PtoTexto) PtoTexto(1) = 30: PtoTexto(2) = 3: PtoTexto(3) = 0 Set Cota = AcadModel.AddDimRotated(PtoLin1, PtoLin4, PtoTexto, 60) End Sub
DOCE.5.22. Sombreado
Un sombreado es (y siempre ha sido), en realidad, un objeto ms de dibujo de AutoCAD que se puede aadir sin ningn problema desde VBA. Veremos aqu cmo hacerlo. El mtodo para dibujar sombreados es AddHatch. La manera de agregar un sombreado en cualquiera de las colecciones que admiten este mtodo (Espacio Modelo, Espacio Papel y bloques) es mediante la sintaxis siguiente: Set ObjSombreado = ObjColeccin .AddHatch( IntTipoPatrn, BooAsociatividad ) StrNombrePatrn ,
66
IntTipoPatrn es un valor Integer que se refiere al tipo de patrn de sombreado que se utilizar. Adems acepta las siguientes constantes: acHatchPatternTypePreDefined acHatchPatternTypeCustomDefined acHatchPatternTypeUserDefined
Cada una de ellas dice referencia a los distintos tipos de patrn que tambin podemos utilizar desde la interfaz grfica de AutoCAD. StrNombrePatrn es un valor de cadena alfanumrica ( String) que representa el nombre del patrn que se usar. Y BooAsociatividad es un valor Boolean que determina la condicin de asociatividad del patrn de sombreado: True significa que el patrn es asociativo y False que no es asociativo. Pasemos ahora a comentar las propiedades nuevas no estudiadas. AsociativeHatch. Esta propiedad obtiene exclusivamente el carcter de asociatividad de un patrn de sombreado ya dibujado. El valor de retorno habr de ser recogido en una variable declarada como Boolean. Si esta variable guarda un valor True significar que el patrn es asociativo; si guarda, por el contrario, un valor False, significar que el patrn no es asociativo. Veamos su sintaxis: BooAsociatividad = ObjetoSombreado.AsociativeHacth Elevation. Obtiene y tambin asigna la elevacin (valor de la coordenada Z) de un sombreado. La sintaxis para asignar es: ObjetoSombreado .Elevation = DblElevacin La sintaxis para obtener es: DblElevacin = ObjetoSombreado.Elevation La elevacin es un valor Double (doble precisin). HatchStyle. Dice relacin al estilo del patrn de sombreado. Esta propiedad se puede extraer de un sombreado y tambin se puede asignar. La sintaxis que utilizaremos para asignar un estilo a un sombreado es: ObjetoSombreado .HatchStyle = IntEstilo La sintaxis para obtener un estilo de un sombreado es: IntEstilo = ObjetoSombreado .HatchStyle Donde IntEstilo es un valor Integer que adems admite las siguientes constantes: acHatchStyleNormal acHatchStyleOuter acHatchStyleIgnore
Todas ellas se corresponden con las opciones de Estilo de contorno de las Opciones avanzadas del sombreado en AutoCAD: Normal, Exterior e Ignorar. NumberOfLoops. Devuelve el nmero de contornos de un sombreado:
67
IntNmContornos = ObjetoSombreado .NumberOfLoops IntNmContornos habr sido declarada como Integer, evidentemente. PatternAngle. Especifica el ngulo en radianes del patrn de sombreado. La sintaxis para asignar es: ObjetoSombreado.PatternAngle = Dblngulo La sintaxis para obtener es: Dblngulo = ObjetoSombreado .PatternAngle Dblngulo es el valor del ngulo en radianes (Double), por lo tanto estar entre 0 y 6.28. Este valor es tambin controlado por la variable de sistema HPANG. PatternDouble. Especifica si el sombreado es doble o no. El valor asignado u obtenido ser del tipo Boolean: True es doble, False no es doble. La sintaxis para asignar es: ObjetoSombreado .PatternDouble = BooDoble La sintaxis para obtener es: BooDoble = ObjetoSombreado.PatternDouble Este valor es tambin controlado por la variable de sistema HPDOUBLE . PatternName. Especif ica el nombre del patrn de sombreado. El valor asignado u obtenido ser del tipo String. La sintaxis para asignar es: ObjetoSombreado .PatternName = StrNombre La sintaxis para obtener es: StrNombre = ObjetoSombreado .PatternName Este valor es tambin c ontrolado por la variable de sistema HPNAME. PatternScale. Especifica la escala del patrn de sombreado. El valor asignado u obtenido ser del tipo Double. La sintaxis para asignar es: ObjetoSombreado .PatternScale = DblEscala La sintaxis para obtener es: DblEscala = ObjetoSombreado .PatternScale
68
Este valor es tambin controlado por la variable de sistema HPSCALE. PatternSpace. Especifica el espaciado entre lneas en los sombreados definidos por el usuario. El tipo de dato de este valor es Double. La sintaxis para asignar es: ObjetoSombreado .PatternSpace = DblEspaciado La sintaxis para obtener es: DblEspaciado = ObjetoSombreado.PatternSpace Este valor es tambin controlado por la variable de sistema HPSPACE. PatternType. Obtiene el tipo de patrn utilizado en un sombreado. Es una propiedad de slo lectura. El tipo de dato para este valor es Integer, aunque tambin admite las constantes explicadas para el argumento IntTipoPatrn del mtodo AddHatch . La sintaxis es: IntTipoPatrn = ObjetoSombreado .PatternType Vamos a repasar ahora los nuevos mtodos propuestos. AppendInnerLoop. Este mtodo aade contornos interiores al sombreado. Su sintaxis es la que sigue: Call ObjSombreado .AppendInnerLoop( ObjContornoInterior ) ObjContornoInterior ser u na matriz de objetos que formen un contorno cerrado. Estos objetos podrn ser slo lneas, polilneas, crculos, elipses, splines y/o regiones. Antes de aadir objetos interiores de contorno, habremos de aadir los objetos exteriores evidentemente. Para ello utilizaremos el siguiente mtodo. AppendOuterLoop. Este mtodo aade contornos exteriores al sombreado. Su sintaxis es la que sigue: Call ObjSombreado .AppendOuterLoop( ObjContornoExterior ) ObjContornoExterior igual que para el mtodo anterior ObjetoContornoInterior . La forma correcta de crear un sombreado desde VBA consiste en definir primero el patrn y despus encerrarlo en un contorno. Veamos la siguiente macro como ejemplo: Option Explicit Dim Dim Dim Dim Dim AcadDoc As Object AcadModel As Object Sombreado As Object Crculo1 As Object MatrizObjeto(0) As Object
69
Dim PtoCentro1(1 To 3) As Double PtoCentro1(1) = 10: PtoCentro1(2) = 10: PtoCentro1(3) = 0 Set Crculo1 = AcadModel.AddCircle(PtoCentro1, 10) Set MatrizObjeto(0) = Crculo1 Set Sombreado = AcadModel.AddHatch(1, "angle", True) Call Sombreado.AppendOuterLoop(MatrizObjeto) End Sub Como podemos observar, lo pr imero que se hace es crear un crculo que ser el objeto que se va a sombrear. Seguidamente creamos el sombreado o patrn con las caractersticas que nos interesen. Por ltimo, encerramos el sombreado dentro del crculo, aadiendo ste como contorno exterior con AppendOuterLoop . NOTA: Ntese que el argumento que requiere AppendOuterLoop (y tambin AppendInnerLoop) ha de ser una matriz de objetos. En este caso en el que slo deseamos sombrear un crculo, creamos un matriz de un nico elemento con dicho crc ulo. Si no lo hiciramos as, este mtodo no funcionara. GetLoopAt. Obtiene el contorno de sombreado en el ndice dado: Call ObjSombreado .GetLoopAt( Intndice, VarContorno )
Intndice es una variable Integer que guardar el ndice. El primer ndice es el 0. VarContorno es una variable Variant que guardar una matriz de los diversos objetos obtenidos. InsertLoopAt. Este mtodo inserta un contorno en la localizacin indicada por un ndice: Call ObjSombreado .InsertLoopAt( Intndice, IntTipoContorno, ObjContorno )
Intndice es un valor Integer que representa un ndice de localizacin en la matriz de vrtices que forman el contorno del sombreado. El primer ndice de la matriz es el 0. IntTipoContorno es un valor Integer, tambin, que representa el tipo de contorno. Este argumento adems admite las siguientes constantes, que no son sino los tipos de contornos aceptados: acHatchLoopTypeDefault acHatchLoopTypePolyline acHatchLoopTypeTextbox ObjContorno igual ObjetoContornoInterior . que para acHatchLoopTypeExternal acHatchLoopTypeDerived
mtodos
anteriores
en
ObjContornoExterior
SetPattern. Asigna un nombre y un tipo de patrn a un sombreado. Su sintaxis es: Call ObjSombreado .SetPattern( IntTipoPatrn, StrNombrePatrn )
Ambos argumentos de SetPattern tienen el mismo significado y los mismos valores que los argumentos del mismo nombre en la sintaxis del mtodo AddHatch .
70
Veamos pues las nuevas propiedades inherentes a estos objetos de referencia a bloque. XScaleFactor. Asigna u obtiene el factor de escala en el eje X de la insercin de un bloque. La sintaxis para asignar es: ObjetoRefBloque .XScaleFactor = DblFactorEscalaX La sintaxis para obtener es: DblFactorEscalaX = ObjetoRefBloque.XScaleFactor El valor es un valor Double que es 1.0 por defecto. YScaleFactor. Asigna u obtiene el factor escala en el eje Y de la insercin de un bloque. La sintaxis para asignar es: ObjetoRefBloque .YScaleFactor = DblFactorEscalaY La sintaxis para obtener es: DblFactorEscalaY = ObjetoRefBloque.YScaleFactor
71
El valor es un valor Double que es 1.0 por defecto. Y veamos ahora los dos nuevos mtodos. GetAttributes. Este mtodo obtiene los atributos de una insercin de bloque. Pa ra recogerlos habremos de declarar una variable como Variant. La sintaxis de uso es: VarAtributos = ObjRefBloque .GetAttributes El retorno de este mtodo (como ya hemos dicho en una variable tipo Variant) ser una matriz de objetos de atributo que veremos enseguida . Como ya sabemos podemos hacer uso de ndices para extraer cada uno de ellos de la matriz. HasAttributes. Este mtodo especifica si el bloque (por medio de su insercin) contiene atributos o no. El valor de retorno ha de recogerlo una variable declarada como Boolean que, si recoge True significar que el bloque tiene atributos y, si recoge False, que no tiene. La sintaxis de utilizacin es la siguiente: BooTieneAtributos = ObjRefBloque .HasAttributes
72
DblAltura es el primer argumento que hemos de suministrar al mtodo AddAtribute . Dice relacin a la altura del texto del atributo en las unidades del documento activo actual, esto es del dibujo actual. IntModo es un argumento opcional que indica el modo del atributo (invisible, constante, verificable y/o predefinido). Ha de ser un valor entero (Integer), pero tambin admite las siguientes constantes: acAttributeModeInvisible acAttributeModeVerify acAttributeModeConstant acAttributeModePreset
Puede ser combinada ms una constante utilizando el operador booleano OR. Hemos de prestar especial atencin a no combinar modos incompatibles. StrMensaje es una cadena (String) que representa el mensaje que aparece en lnea de comandos o en el cuadro de peticin de atributos (dependiendo del valor de la variable de sistema de AutoCAD ATTDIA) al insertar el bloque que contiene el atributo. El valor por defecto para este argumento es la cadena indicada en el argumento StrIdentificador. Si el modo del atributo es acAttributeModeConstant , este argumento se inhabilita. DblPtoIns es una matriz de tres valores Double (X, Y y Z) que representa las coordenadas del punto de insercin para el atributo el SCU. StrIdentificador es una cadena (String) que representa al identificador del atributo. Como ya debemos saber en esta cadena deberemos obviar los espacios y los signos de exclamacin. Adems, decir que AutoCAD cambia automticamente las minsculas a maysculas. StrValorDefecto es una cadena ( String) que representa el valor por defecto del atributo al ser insertado. Expliquemos ahora las dos propiedades no estudiadas. FielLength. Asigna u obtiene la longitud de campo (Integer) en nmero de caracteres para el atributo. La sintaxis para asignar es: ObjetoAtributo.FieldLength = IntLongitudCampo La sintaxis para obtener es: IntLongitudCampo = ObjetoAtributo .FieldLength TagString. Asigna u obtiene el identificador (String) de un atributo. La sintaxis para asignar es:
73
ObjetoAtributo.TagString = StrIdentificador La sintaxis para obtener es: StrIdentificador = ObjetoAtributo .TagString
ArrayPolar ArrayRectangul GetBoundingB ar GetXData ox Mirror Mirror3D Rotate ScaleEnti 3D ty Update Veamos las dos nuevas propiedades.
Mode. Obtiene y/o asigna el modo de un atributo. Es un valor Integer que admite adems las constantes especificadas en la seccin anterior para el argumento IntModo del mtodo AddAttribute . La sintaxis para asignar un modo es: ObjetoAtributo.Mode = IntModo La sintaxis para obtener un modo es: IntModo = ObjetoAtributo .Mode PromptString. Obtiene y/o asigna la cadena (String) de mensaje de peticin de un atributo (vase la explicaci n del argumento StrMensaje del mtodo AddAtribute en la seccin anterior). La sintaxis para asignar una cadena es: ObjetoAtributo.PromptString = StrMensaje La sintaxis para obtener una cadena es:
74
StrMensaje = ObjetoAtributo .PromptString
Pasemos pues a comentar las propie dades primero. ActiveDocument. Obtiene el objeto de documento activo. La sintaxis es: Set ObjDocumento = ObjAplicacin .ActiveDocument
75
La sintaxis la conocemos de sobra, ya que la utilizamos en todos los programas al hacer: Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Nos preguntaremos la necesidad de esta propiedad cuando en AutoCAD nicamente se puede tener un documento abierto cada vez (es una aplicacin SDI). Y es que ActiveDocument est preparada para futuras versiones de AutoCAD, en el que el entorno sea MDI (mltiples documentos abiertos) y el programa afecte nicamente al activo actualmente (uno cada vez evidentemente). El retorno de esta propiedad aplicada a la aplicacin es un objeto de documento, del que se hablar en la siguiente seccin. Caption. Obtiene el texto de la barra de ttulo (generalmente azul) de la aplicacin. La sintaxis es: StrTtulo = ObjAplicacin .Caption Siendo StrTtulo declarado como String. Veamos el siguiente ejemplo de una macro VBA: Option Explicit Dim Acad As Object Dim AcadDoc As Object Dim AcadModel As Object Sub Macro() Set Acad = GetObject(, "AutoCAD.Application") Set AcadDoc = Acad.ActiveDocument Set AcadModel = AcadDoc.ModelSpace Dim TitApli As String TitApli = Acad.Caption MsgBox TitApli End Sub Como vemos hemos introducido un objeto nuevo, hemos desglosado la llamada a los objetos principales de AutoCAD en una rama ms: la aplicacin en s. De esta manera, podemos utilizar este nuevo objeto (Acad) para extraer el texto de la ventana de ttulo de AutoCAD en un momento concreto, para despus mostrarlo con un MsgBox. Un resultado posible de esta macro podra ser:
FullName. Obtiene el nombre de la aplicacin y su camino completo. La sintaxis es: StrNombre = ObjAplicacin .Fullname
o ruta de acceso
75
76
Siendo StrTtulo declarado como String. Si las tres ltimas lneas de la macro de ejemplo anterior se cambiaran por las siguientes: Dim NomApli As String NomApli = Acad.FullName MsgBox NomApli un resultado posible sera:
Left. Esta propiedad permite obtener y/o asignar la distancia desde el lado izquierdo de la ventana principal de la aplicacin hasta el lado izquierdo de la pantalla; se refiere pues a la coordenada X de la esquina superior izquierda de la ventana de la aplicacin. NOTA: El origen de coordenadas en los monitores comienza en la esquina superior izquierda de la pantalla (coordenada 0,0). La sintaxis para asignar una distancia con Left es: ObjAplicacin .Left = IntDistanciaL y para obtener la actual: IntDistanciaL = ObjAplicacin .Left LocaleID. Obtiene el ID (identificador) local para la sesin actual de AutoCAD. El ID local es definido por Miscrosoft para los entornos Windows 95/98 y Windows NT. La sintaxis es: LngID = ObjAplicacin .LocaleID Una respuesta coherente puede ser, por ejemplo: 1033. Path. Obtiene el camino o ruta de acceso a la aplicacin (o documento), sin el nombre de archivo incluido. La sintaxis es: StrCamino = ObjNoGrfico .Path StrCamino se declarar como String evidentemente. Preferences. Obtiene hablaremos). La sintaxis es: el objeto de preferencias de aplicacin (del que ya
76
77
Top. Esta propiedad permite obtener y/o asignar la distancia desde el lado superior de la ventana principal de la aplicacin hasta el lado superior de la pantalla; se refiere pues a la coordenada Y de la esquina superior izquierda de la ventana de la aplicacin. NOTA: El origen de coordenadas en los monitores comienza en la esquina superior izquierda de la pantalla (coordenada 0,0). La sintaxis para asignar una distancia con Top es: ObjAplicacin .Top = IntDistanciaT y para obtener la actual: IntDistanciaT = ObjAplicacin .Top Version. Devuelve la versin de AutoCAD que se est utilizando. Es igual a la variable de sistema ACADVER del programa. Su sintaxis: StrVersin = ObjAplicacin.Version Veremos ahora los mtodos de este objeto Application . GetInterfaceObject. Acepta el ID de un programa e intenta cargarlo en AutoCAD como un InProcServer . Esta propiedad permite conectar un servidor ActiveX Automation. Su sintaxis: Set ObjInterfaz = ObjAplicacin .GetInterfaceObject( IDPrograma ) ObjInterfaz es un objeto declarado como Object. Dim Poly as Object Set Poly = Acad.GetInterfaceObject("Polycad.Application") ListADS. Devuelve una lista de las aplicaciones ADS cargadas. Su sintaxis es: VarListaADS = ObjAplicacin .ListADS VarListaADS estar declarada como Variant. Guardar una matriz de elementos con cada uno de los valores de la lis ta. Para acceder a ellos recordemos que podemos utilizar ndices. ListARX. Devuelve una lista de las aplicaciones ARX cargadas. Su sintaxis es: VarListaARX = ObjAplicacin .ListARX Las mismas consideraciones que para el mtodo anterior. LoadADS. Ca rga una aplicacin ADS. Deberemos proporcionarle el nombre y ruta (si fuera necesaria) de la aplicacin en cuestin. Veamos la sintaxis. Call ObjAplicacin .LoadADS( StrNombreAplicADS ) Nombre y ruta habrn de ser una cadena. 77
78
LoadARX. Carga una aplicac in ARX. Deberemos proporcionarle el nombre y ruta (si fuera necesaria) de la aplicacin en cuestin. Veamos la sintaxis. Call ObjAplicacin .LoadARX( StrNombreAplicARX ) Nombre y ruta habrn de ser una cadena. Quit. Cierra la aplicacin AutoCAD. Sintaxis: ObjAplicacin .Quit UnloadADS. Las mismas consideraciones que para LoadADS pero para descargar la aplicacin ADS. UnloadARX. Las mismas consideraciones que para LoadARX pero para descargar la aplicacin ARX.
78
79
Open
Veamos primero, como siempre, las propiedades. ActiveDimStyle. Asigna u obtiene el estilo de acotacin actual. Se estudiarn ms detalles sobre los estilos de acotacin en su seccin correspondiente. La sintaxis para asignar: ObjDocumento .ActiveDimStyle = ObjEstiloAcotacin La sintaxis para obtener: Set ObjEstiloAcotacin = ObjDocumento .ActiveDimStyle ObjEstiloAcotacin es un objeto de estilo de acotacin del que ya se hablar. ActiveLayer. Asigna u obtiene la capa actual. Se estudiarn ms detalles sobre las capas en su seccin correspondiente. La sintaxis para asignar: ObjDocumento .ActiveLayer = ObjCapa La sintaxis para obtener: Set ObjCapa = ObjDocumento.ActiveLayer ObjCapa es un objeto de capa del que ya se hablar. ActiveLinetype. Asigna u obtiene el tipo de lnea actual. Se estudiarn ms detalles sobre los tipos de lnea en su seccin correspondiente. La sintaxis para asignar: ObjDocumento .ActiveLinetype = ObjTipoLnea La sintaxis para obtener: Set ObjTipoLnea = ObjDocumento .ActiveLinetype ObjTipoLnea es un objeto de tipo de lnea del que ya se hablar. ActivePViewport. Asigna u obtiene la ventana de Espacio Papel actual. Se estudiarn ms detalles sobre las ventanas de Espacio Papel en su seccin correspondiente. La sintaxis para asignar: ObjDocumento .ActivePViewport = ObjVentanaPapel La sintaxis para obtener: 79
80
Set ObjVentanaPapel = ObjDocumento.ActivePViewport ObjVentanaPapel es un objeto de ventana de Espacio Papel del que ya se hablar. ActiveSelectionSet. Obtiene exclusivamente el conjunto de seleccin actual. Se estudiarn ms detalles sobre los conjuntos de seleccin en su seccin correspondiente. La sintaxis para asignar: ObjDocumento .ActiveSelectionSet La sintaxis para obtener: Set ObjConjuntoSel = ObjDocumento .ActiveSelectionSet ObjConjuntoSel es un objeto de conjunto de seleccin del que ya se hablar. ActiveSpace. Conmuta el espacio actual entre Espacio Modelo Mosaico y Espacio Papel/Modelo Flotante. La sintaxis para realizar la conmutacin: ObjDocumento .ActiveSpace = IntEspacio Si el actual es Espacio Modelo Mosaico se cambia a Espacio Papel/Modelo Flotante, y viceversa. La sintaxis para obtener el valor del espacio actual: IntEspacio = ObjDocumento .ActiveSpace IntEspacio es un valor Integer que puede almacenar las siguientes constantes: acModelSpace acPaperSpace = ObjConjuntoSel
ActiveTextStyle. Asigna u obtiene el estilo de texto actual. Se estudiarn ms detalles sobre los estilos de texto en su seccin correspondiente. La sintaxis para asignar: ObjDocumento .ActiveTextstyle = ObjEstiloText La sintaxis para obtener: Set ObjEstiloTexto = ObjDocumento .ActiveTextStyle ObjEstiloTexto es un objeto de estilo de texto del que ya se hablar. ActiveUCS. Asigna u obtiene el SCP actual. Se estudiarn ms detalles sobre los SCP en su seccin correspondiente. La sintaxis para asignar: ObjDocumento .ActiveUCS = ObjSCP La sintaxis para obtener: 80
81
Set ObjSCP = ObjDocumento.ActiveUCS ObjSCU es un objeto de SCP (Sistema de Coordenadas Personal) del que ya se hablar. ActiveViewport. Asigna u obtiene la ventana mosaico actual. S e estudiarn ms detalles sobre las ventanas de Espacio Modelo Mosaico en su seccin correspondiente. La sintaxis para asignar: ObjDocumento .ActiveViewport = ObjVentanaModelo La sintaxis para obtener: Set ObjVentanaModelo = ObjDocumento .ActiveViewport ObjVentanaModelo es un objeto de ventana de Espacio Modelo Mosaico del que ya se hablar. Blocks. Obtiene exclusivamente el objeto de coleccin de bloques del dibujo. Acerca de los bloques hablaremos largo y tendido en su momento. La sintaxis para utilizar esta propiedad es: Set ObjColBloques = ObjDocumento .Block ObjColBloques es un objeto de coleccin de bloques del que ya se hablar. Dictionaries. Obtiene exclusivamente el objeto de coleccin de diccionarios del documento activo. Acerca de los diccionarios hablaremos en su momento. La sintaxis para utilizar esta propiedad es: Set ObjColDiccionarios = ObjDocumento .Dictionaries ObjColDiccionarios es un objeto de coleccin de diccionario del que ya se hablar. DimStyles. Obtiene exclusivamente el objeto de coleccin de estilos de acotacin del dibujo. Acerca de los estilos de acotacin hablaremos en su momento. La sintaxis para utilizar esta propiedad es: Set ObjColEstilosAcotacin = ObjDocumento .DimStyles ObjColEstilosAcotacin es un objeto de coleccin de estilos de acotacin del que ya se hablar. ElevationModelSpace . Obtiene y/o asigna la elevacin en el Espacio Modelo. La sintaxis para asignar: ObjDocumento .ElevationModelSpace La sintaxis para obtener: DblElevacinM = ObjDocumento .ElevationModelSpace DblElevacinM ser declarada como Double (doble precisin). 81 = DblElevacinM
82
ElevationPaperSpace . Obtiene y/o asigna la elevacin en el Espacio Papel. La sintaxis para asignar: ObjDocumento .ElevationPaperSpace La sintaxis para obtener: DblElevacinP = ObjDocumento .ElevationPaperSpace DblElevacinP ser declarada como Double. Groups. Obtiene el objeto de coleccin de grupos. Sobre los grupos se hablar ms adelante. La sintaxis para utilizar esta propiedad es: Set ObjColGrupos = ObjDocumento .Groups ObjColGrupos es un objeto de coleccin de estilos de acotacin del que ya se hablar. Layers. Obtiene el objeto de coleccin de capas. Sobre las capas se hablar ms adelante. La sintaxis para utilizar esta propiedad es: Set ObjColCapas = ObjDocumento.Layers ObjColCapas es un objeto de coleccin de capas del que ya se hablar. Limits. Permite asignar y obtener los lmites del dibujo actual. La sintaxis para asignar unos lmites es: ObjDocumento .Limits = DblLmites La sintaxis para obtener unos lmites es: VarLmites = ObjDocumento .Limits Para asignar lmites al dibujo deberemos crear una matriz de cuatro valores tipo Double. Para recoger unos lmites habilitaremos una variable definida como Variant . Sabemos que despus mediante ndices podemos acceder a cada valor. El primer par de valores define las coordenadas X e Y del lmite inferior izquierdo y, el segundo par de valores, las coordenadas X e Y del lmite superior derecho. Linetypes. Devuelve el objeto de coleccin de tipos de lnea. De los tipos de lnea hablaremos ms adelante. La sintaxis para utilizar esta propiedad es: Set ObjColTiposLnea = ObjDocumento .Linetypes ObjColTiposLnea es un objeto de coleccin de tipos de lnea del que ya se hablar. = DblElevacinP
82
83
ModelSpace. Devuelve el objeto de coleccin de Espacio Modelo. De esta coleccin ya hablaremos ms adelante, sin embargo es una sintaxis que nos sonar de utilizarla al principio de los programas: Set ObjColEspacioM = ObjDocumento .ModelSpace Plot. Obtiene el objeto de trazado del documento actual. Este objeto ser estudiado ms adelante. Su sintaxis de uso es: Set ObjTrazado = ObjDocumento .Plot ObjTrazado es un objeto de trazado del que ya se hablar. ReadOnly. Obtiene la condicin que tiene un documento de ser de slo lectura o de lectura y escritura. La sintaxis para usar esta propiedad, por cierto de slo lectura, es: BooCondicin = ObjDocumento .ReadOnly BooCondicin habr sido declarada como Boolean. Si almacena True el documento es de slo lectura; si almacena False el documento es de lectura y escritura. RegisteredApplications . Obtiene la coleccin de aplicaciones registradas. Esta coleccin ser estudiada ms adelante. Su sintaxis de uso es: Set ObjColAplicReg = ObjDocumento .RegisteredApplications Saved. Especifica si el documento actual tiene algn cambio realizado sin guardar. Se recoge en una variable Boolean: si el valor es True el documento posee cambios sin guardar; si es False el documento no posee cambios sin guardar. BooCambios = ObjDocumento .Saved SelectionSets. Obtiene el objeto de coleccin de conjuntos de seleccin. Este objeto ser estudiado ms adelante. Su sintaxis de uso es: Set ObjColConjuntosSel = ObjDocumento .SelectionSets ObjColConjuntosSel es un objeto de coleccin conjuntos de seleccin del que ya se hablar. TextStyles. Obtiene el objeto de coleccin de estilos de texto. Este objeto ser estudiado ms adelante. Su sintaxis de uso es: Set ObjColEstilosTexto = ObjDocumento .TextStyles ObjColEstilosTexto es un objeto de coleccin de estilos de texto del que ya se hablar. UserCoordinateSystems . Obtiene el objeto de coleccin de SCPs. Este objeto ser estudiado ms adelante. Su sintaxis de uso es: Set ObjColSCPs = ObjDocumento .UserCoordinateSystems ObjColSCPs es un objeto de coleccin de Sistemas de Coordenadas Personales del que ya se hablar. 83
84
Utility. Obtiene el objeto de utilidades para el documento actual activo. De este objeto hablaremos largo y tendido en su momento. Su sintaxis de uso es: Set ObjUtil = ObjDocumento.Utility ObjUtil es un objeto de utilidades del que ya se hablar. Viewports. Obtiene el objeto de coleccin de ventanas del documento actual activo. Su sintaxis de uso es: Set ObjColVentanas = ObjDocumento .Viewports ObjVentanas es un objeto de coleccin de ventanas del que ya se hablar. Views. Obtiene el objeto de coleccin de vistas del documento actual activo. Su sintaxis de uso es: Set ObjColVistas = ObjDocumento .Views ObjVistas es un objeto de coleccin de vistas del que ya se hablar. Probablemente no logremos comprender ahora para que nos sirven todas estas propiedades que devuelven objetos y colecciones de objetos, pero en cuanto nos introduzcamos en la materia de las distintas colecciones se nos har el camino ms sencillo. Bsicamente lo que viene a significar lo podemos deducir de una de las propiedades que ya conocamos: ModelSpace. Lo que en realidad hacemos al llamar a esta propiedad es llamar al objeto de coleccin de Espacio Modelo (llamado ModelSpace ), que se encuentra bajo el documento actual activo (ActiveDocument) y bajo la aplicacin (AutoCAD.Application ). Tras la llamada podremos utilizar multitud de mtodos y propiedades de este objeto de coleccin. Concretamente, y como ya dijimos, todos los mtodos de dibujo de entidades (AddLine, AddCircle, AddRaster...) son mtodos de la coleccin de Espacio Modelo, as como de Espacio Papel y bloques (se puede ver el la jerarqua del cuadro del inicio del MDULO). Tambin existen propiedades que ya veremos. Con los dems objetos y colecciones ocurrir lo mismo: realizaremos la llamada al objeto de coleccin de capas, por ejemplo, para crear una nueva capa o para averiguar el nmero de capas que hay; o realizaremos la llamada a una capa concreta para cambia rle el color, averiguar su nombre, bloquearla... Digamos que todo est basado en algo parecido a las rutas de acceso o caminos de directorios: necesitamos incluir en ellas todas las carpetas y subcarpetas (niveles jerrquicos) en el orden correcto hasta llegar al objetivo final (propiedad o mtodo). Por ello es muy importante entender (que no memorizar) el cuadro jerrquico del principio del MDULO; es esencial comprenderlo completa y correctamente. A continuacin estudiaremos los distintos mtodos del documento activo. AuditInfo. Este mtodo evala la integridad del dibujo actual. Para cada error AutoCAD provee de un mensaje de error al usuario. Adems se puede elegir la opcin de hacer que los errores se corrijan automticamente. La sintaxis de este mtodo es: Call ObjDocumento .AuditInfo( StrNombArch , BooCorregir )
donde StrNombArch es una cadena (tipo de dato String) que contendr el nombre del archivo que se desea comprobar, y BooCorregir es un valor Boolean que determina si se desea la 84
85
correccin de errores automticamente. automtica: True corrige automticamente; False no corrige
Export. Exporta el dibujo actual de AutoCAD a formato SAT, WMF, EPS, DXF, 3DS y/o BMP. La sintaxis de este mtodo es: Call ObjDocumento .Export( StrNombArch , StrExtensin, ObjConjuntoSel )
donde StrNombArch es una cadena (tipo de dato String) que contendr el nombre del archivo, StrExtensin es otra cadena que contendr tres caracteres especificando la extensin, y puede ser (maysculas o minsculas): SAT WMF EPS DXF 3DS BMP
Y ObjConjuntoSel exporta slo los objetos contenidos en el conjunto de seleccin especificado. A crear conjuntos de seleccin aprenderemos ms adelante. Este conjunto de seleccin no puede estar vaco. Si este valor es Null se exporta el dibujo completo. GetVariable. Obtiene el valor de la variable de sistema de AutoCAD especificada. La sintaxis es: VarValor = ObjDocumento .GetVariable( StrNombVar ) Siendo StrNombVar una cadena (String) que representa el nombre de la variable en cuestin (maysculas o minsculas), y VarValor una variable Variant donde se guardar el valor. HandleToObject. Obtiene el objeto que se corresponde con el cdigo de objeto dado. La sintaxis es: ObjNoGrfico = ObjDocumento .HandleToObject( StrCdigoObj ) ObjNoGrfico es Object y StrCdigoObj es String. Import. Funciona de manera inversa a Export, es decir, importa un dibujo en determinado formato grfico (SAT, WMF, EPS, DXF, 3DS o BMP) a un dibujo de AutoCAD .D WG. La sintaxis de Import es: Set ObjDocumento2 = ObjDocumento1 .Import(StrNombArch , DblPtoIns , DblEsc)
ObjDocumento2 es un objeto (declarado como Object) que es el valor de salida del mtodo. Este objeto es de tipo de documento evidentemente. StrNombArch es una cadena con el nombre y ruta del archivo en cuestin, DblPtoIns un array de tres valores Double que representan las coordenadas del punto de insercin, y DblEsc el factor de escala de insercin (Double tambin). LoadShapeFile. Carga un archivo de formas compilado mtodo es: Call ObjDocumento .LoadShapeFile( StrNombArch ) StrNombArch como en mtodos anteriores. 85 .SHX. La sintaxis de este
86
NOTA: Para insertar formas de un archivo de formas cargado recordemos el mtodo AddShape de las colecciones de Espacio Modelo, Espacio Papel y bloques. New. Crea un nuevo documento y lo establece como documento activo. Para utilizar este mtodo usaremos la sintaxis siguiente: Set ObjDocumento2 = ObjDocumento1 .New( StrNombrePlantilla) ObjDocumento2 es el valor de salida (un objeto de documento). StrNombrePlantilla es una cadena String que contiene el camino completo y nombre de la plantilla (recordemos: archivos .DWT) con la que se abrir el dibujo nuevo. NOTA: Las plantillas por defecto (las que se abren en AutoCAD cuando no se indica plantilla alguna) son ACADISO.DWT o ACAD.DWT, dependiendo de si trabajamos en milmetros (unidades mtricas) o pulgadas (unidades inglesas). ObjectIDToObject. Obtiene el objeto que se corresponde con el ID de objeto dado. La sintaxis es: ObjNoGrfico = ObjDocumento .ObjectIDToObject( LngIDObjeto ) ObjNoGrfico es Object y LngIDObject es Long. Open. Abre un dibujo existente que se convierte en el documento actual. Hay que pasarle como argumento String la ruta completa y nombre del archivo. La sintaxis de este mtodo es: Call ObjDocumento .Open( StrNombArch ) PurgeAll. Limpia todo lo no utilizado en el dibujo. El mtodo realiza la misma accin que utilizar el comando LIMPIA de AutoCAD con la opcin TODO (PURGE, en ingls, con la opcin ALL). Su sintaxis es: ObjDocumento .PurgeAll Regen. Regenera el dibujo completo y recalcula las coordenadas de la pantalla y la resolucin de la vista para todos los objetos. Tambin reindexa la Base de Datos de dibujo para una ptima representacin y seleccin de los objetos. Su sintaxis es: ObjDocumento .Regen( IntVentanas ) IntVentanas es un valor Integer que admite las siguientes constantes: acActiveViewport acAllViewports
haciendo referencia a una regeneracin en la ventana grfica actual (REGEN) o en todas las ventanas grficas (REGENT, REGENALL en ingls). Save. Guarda los cambios del documento actual activo. La sintaxis de uso es: ObjDocumento .Save SaveAs. Guarda los cambios del documento actual activo, pasando como argumento el nombre de archivo y camino de acceso completo. El nuevo d ocumento es el documento activo. La sintaxis de uso es: 86
87
ObjDocumento .SaveAs( StrNombArch ) StrNombArch es una cadena (tipo String). SetVariable. Asigna el valor especificado como segundo argumento a la variable de sistema de AutoCAD especificada como primer argumento. La sintaxis es: Call ObjDocumento .SetVariable(StrNombVar , VarValor)
Siendo StrNombVar una cadena (String) que representa el nombre de la variable en cuestin (maysculas o minsculas), y VarValor una variable Variant donde se guardar el valor. NOTA: Tras el siguiente mtodo que es el ltimo se estudia un ejemplo completo en el que podremos observar un trato correcto de las variables (el ms tpico quiz) a la hora de utilizar GetVariable y SetVariable . WBlock. Crea un nuevo archivo d e dibujo con el contenido del conjunto de seleccin indicado (al estilo de BLOQUEDISC, WBLOCK en ingls). La sintaxis es: Call ObjDocumento .WBlock( StrNombArch, ObjConjuntoSel )
Siendo StrNombVar una cadena (String) que representa el nombre del archivo en cuestin (y su ruta), y ObjConjuntoSel un objeto de conjunto de seleccin que guarda las entidades con las que se crear un nuevo archivo. Este nuevo archivo no pasa a ser el documento activo, evidentemente. Y una vez vistas propiedades y vistos mtodos, exponemos un ejemplo muy interesante en el que, aunque no se encuentren muchas de las caractersticas vistas hasta este momento ya que hemos de estudiar las colecciones para avanzar ms , nos ayudar a comprender un poco ms la programacin en VBA para AutoCAD. El programa en cuestin consta de una cuadro de dilogo con varias pestaas en las que existen diferentes caractersticas de AutoCAD referidas a variables de sistema. Desde este cuadro podremos actuar sobre dichas variables de una forma verstil y rpida:
87
88
Y ahora se proporciona el listado completo del programa: Option Explicit Dim AcadDoc As Object Private Sub buttonAceptar_Click() Call AcadDoc.SetVariable("surftab1", CInt(Val(boxSurftab1.Text))) Call AcadDoc.SetVariable("surftab2", CInt(Val(boxSurftab2.Text))) Call AcadDoc.SetVariable("isolines", CInt(Val(boxIsolneas.Text))) Call AcadDoc.SetVariable("facetres", Val(boxSuavizado.Text) Call AcadDoc.SetVariable("dispsilh", Abs(checkSilueta.Value)) Call AcadDoc.SetVariable("delobj", Abs(checkBorrar.Value)) Call AcadDoc.SetVariable("ltscale", Val(boxEscala.Text) Call AcadDoc.SetVariable("filedia", Abs(checkArchivos.Value)) Call AcadDoc.SetVariable("cmddia", Abs(checkImprimir.Value)) End End Sub Private Sub buttonCancelar_Click() End End Sub Private Sub buttonDefecto_Click() boxSurftab1.Text = "16" boxSurftab2.Text = "16" boxIsolneas.Text = "4" boxSuavizado.Text = "2.5" checkSilueta.Value = 0 checkBorrar.Value = 1 boxEscala.Text = "1" checkArchivos.Value = 1 checkImprimir.Value = 1 End Sub Private Sub UserForm_Initialize() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument boxSurftab1.Text = Str(AcadDoc.GetVariable("surftab1")) boxSurftab2.Text = Str(AcadDoc.GetVariable("surftab2")) boxIsolneas.Text = Str(AcadDoc.GetVariable("isolines")) boxSuavizado.Text = Str(AcadDoc.GetVariable("facetres")) 88
89
checkSilueta.Value = AcadDoc.GetVariable("dispsilh") checkBorrar.Value = AcadDoc.GetVariable("delobj") boxEscala.Text = Str(AcadDoc.GetVariable("ltscale")) checkArchivos.Value = AcadDoc.GetVariable("filedia") checkImprimir.Value = AcadDoc.GetVariable("cmddia") End Sub Comentmoslo un poco. Tras declarar e inicializar nicamente un objeto para el documento actual (no necesitamos ms), se escriben en las distintas casillas (al inicializar el formulario) los diferentes valores de las variables de sistema. Para ello se convierten a cadena con Str. Es conveniente realizar esto, ya que si no utilizamos Str vamos a tener posteriores problemas con la coma (,) y el punto (.) como separadores decimales; convirtiendo con Str pasar todo como tal, es decir, con un punto decimal que es lo que se utiliza normalmente. Las variables que tienen un valor booleano (0 1) se pueden igualar directamente a la propiedad Value de las casillas de verificacin, porque stas reconocen sin problema alguno los valores y establecen la casilla dependiendo de ellos (1 marcada y 0 sin marcar). A la hora de realizar la operacin inversa, es decir, leer los valores de las casillas e introducirlos en las variables de sistema, deberemos observar algunas consideraciones. Las variables que necesiten un valor Double (tipo FACETRES) pueden ser convertidas a valor numrico directamente con Val; las que necesiten un valor entero (SURFTAB1 por ejemplo) se convierte con Val y se transforman a Integer con Cint; las variables que necesiten un valor booleano (tipo FILEDIA ) se suministran directamente ledas de la casilla de verificacin. Pero cuidado, cuando una casilla est activada, al leerla para SetVariable se devuelve el valor 1, por lo que habremos de asegurarnos siempre introduciendo una funcin Abs por delante, que devuelve el valor absoluto sin signo. Por ltimo y como vemos, el botn Defecto rellena las casillas con unos valores que se estiman por defecto, y el botn Cancelar simplemente termina el programa. Evidentemente faltara un pequeo control de errores en el programa que evitara introducir valores decimales donde no se puede y dems. Con ello y algunos detalles ms el programa estara completo.
89
90
91
IntNmero = ObjNoGrfico .Count Donde IntNmero ser una variable declarada evidentemente como Integer. La ejecucin de la siguiente macro devolvera actualmente en el Espacio Modelo: Option Explicit Dim Acad As Object Dim AcadDoc As Object Dim AcadModel As Object Sub Macro() Set Acad = GetObject(, "AutoCAD.Application") Set AcadDoc = Acad.ActiveDocument Set AcadModel = AcadDoc.ModelSpace Dim Num As Integer Num = AcadModel.Count MsgBox Num End Sub Probemos a dibujar y borrar entidades para ver los distintos resultados de la propiedad Count y comprenderla bien. Veamos ahora los dos nuevos mtodos. InsertBlock. Este mtodo inserta un bloque en una coleccin (Modelo, Papel o bloques) que se encuentre definido en la sesin actual de dibujo. NOTA: Si se inserta un bloque dentro de otro (en coleccin de bloques) se crearn bloques anidados. La sintaxis para utilizar este mtodo es: Set ObjRefBloque = ObjNoGrfico .InsertBlock( DblPtoIns, DblEscalaY, DblRotacin ) StrNombre , DblEscalaX , el nmero de objetos existente
DblPtoIns es una matriz de tres valores Double que especifica el punto de insercin para el bloque. StrNombre se refiere al nombre del bloque, si es una variable habr sido declarada como String. DblEscalaX y DblEscalaY son dos valores Double que representan la escala de insercin del bloque en X e Y. DblRotacin es una valor Double que dice relacin al ngulo de rotacin de insercin en radianes. Veamos la siguiente macro: Option Explicit Dim Acad As Object Dim AcadDoc As Object Dim AcadModel As Object Sub Macro() Set Acad = GetObject(, "AutoCAD.Application") Set AcadDoc = Acad.ActiveDocument Set AcadModel = AcadDoc.ModelSpace 91
92
Dim Bloq As Object Dim PtoIns(1 To 3) As Double PtoIns(1) = 10: PtoIns(2) = 10: PtoIns(3) = 0 Set Bloq = AcadModel.InsertBlock(PtoIns, "circl", 1, 1, 0) End Sub El resultado ser la insercin en el punto 10,10,0 (a escala 1:1 y con un ngulo de rotacin de 0 radianes) del bloque definido con el nomb re de circl. Este bloque deber existir en el dibujo actual. Este resultado es un objeto de referencia a bloque, que ya vimos, por lo que podr ser tratado como tal. Item. Este mtodo obtiene el objeto especificado por un ndice dentro de una coleccin (o tambin grupo o conjunto de seleccin). Su sintaxis es: Set ObjGrfico = ObjNoGrfico .Item( Varndice ) Donde Varndice es un valor Variant que puede ser un entero o una cadena. Si es entero va desde 0 (como primer objeto) hasta N-1 (como ltimo objeto), siendo N el total de objetos en la coleccin (o grupo o conjunto de seleccin). Si Varndice es una cadena ser el nombre de un bloque creado o similar. El resultado es un objeto grfico, definido como Object.
(*) NOTA: nicamente un mtodo aparece aqu nuevo (AddPViewport), pero vamos a posponer su estudio a la seccin DOCE.8.14.1. , pues all se habla de las ventanas de Espacio Modelo y este mtodo est relacionado, ya que sirve p ara gestionar ventanas en Espacio Papel. 92
93
Veamos un pequeo programa que dibuja una lnea desde el punto 100,-50,0 hasta el punto 0,0,0 en Espacio Modelo o Espacio Papel, dependiendo de lo que el usuario elija. El listado es: Option Explicit Dim Dim Dim Dim Dim Acad As Object AcadDoc As Object AcadModel As Object AcadPaper As Object Lnea As Object
Dim Pto1(1 To 3) As Double Dim Pto2(1 To 3) As Double Private Sub cbDibujar_Click() If obModelo.Value = True Then Set Lnea = AcadModel.AddLine(Pto1, Pto2) Else Set Lnea = AcadPaper.AddLine(Pto1, Pto2) End If End End Sub Private Sub cbSalir_Click() End End Sub Private Sub UserForm_Initialize() Set Acad = GetObject(, "AutoCAD.Application") Set AcadDoc = Acad.ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set AcadPaper = AcadDoc.PaperSpace Pto1(1) = 100: Pto1(2) = -50: Pto1(3) = 0 Pto2(1) = 0: Pto2(2) = 0: Pto2(3) = 0 End Sub El cuadro de dilogo (formulario) correspondiente podra ser el que se muestra a continuacin. La manera de utilizarlo es simple: slo hay que escoger a cul de las dos colecciones se van a aadir los objetos grficos, a la coleccin de objetos de Espacio Modelo o a la coleccin de objetos de Espacio Papel. Tras esto se pulsa el bot n Dibujar ahora! Para trazar la lnea en el espacio correspondiente. El botn Salir simplemente termina la ejecucin del programa.
93
94
De estas dos colecciones vistas hasta ahora los objetos componentes simples son todos los ya estudiados: lneas, crculos, arcos, referencias de bloque...
95
Dim Lin As Object Sub Macro() Set Acad = GetObject(, "AutoCAD.Application") Set AcadDoc = Acad.ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set AcadBloq = AcadDoc.Blocks Dim Bloq As Object Dim PtoIns(1 To 3) As Double Dim Pto2(1 To 3) As Double PtoIns(1) = 10: PtoIns(2) = 10: PtoIns(3) = 0 Pto2(1) = 100: Pto2(2) = 100: Pto2(3) = 0 Set Bloq = AcadBloq.Add(PtoIns, "pqpq") Set Bloq = Bloq.AddLine(PtoIns, Pto2) End Sub Lo que se debe hacer en primera instancia es crear el objeto de bloque en la coleccin de bloques (Set Bloq = AcadBloq.Add(PtoIns, "pqpq")); es como si creramos un bloque vaco. Despus se le aaden entidades de dibujo, como en este caso una lnea (Set Bloq = Bloq.AddLine(PtoIns, Pto2)) con los mtodos ya estudiados, ya que estos mtodos, como hemos visto, son propios tambin de la coleccin de objetos de bloque. El nuevo mtodo no estudiado an de los objetos que son bloques es: Delete. Delete borra o elimina el objeto indicado. Hemos de indicar el nombre de dicho objeto (bloque, estilo de acotacin, SCP...) como una cadena (String), pero esto no es necesario ms que para la coleccin de ventanas: ObjNoGrafico .Delete( StrNombreObj )
96
Sigamos. El objeto simple de la coleccin de diccionarios es un objeto de diccionario. Los objetos de diccionario poseen las siguientes propiedades y mtodos:
Un diccionario es un sistema para almacenar y recuperar objetos con una cadena de palabras clave asociada. El objeto puede ser referenciado en un diccionario mediante su palabra clave. Un diccionario puede contener cualquier tipo de objeto, incluso otro diccionario. NOTA: Este objeto de diccionario no tiene nada que ver con el diccionario ortogrfico de correccin de AutoCAD. De ste hablaremos cuando estudiemos el objeto de preferencias. Los nuevos mtodos de los objetos de diccionario que hemos de estudiar son los que siguen a continuacin. AddObject. Aade un nuevo objeto a un diccionario. Si la entrada ya existe es sustituida por el nuevo objeto, si no simplemente se agrega. Los dos argumentos para este mtodo (nombre de objeto y palabra clave) han de ser cadenas (String). Veamos la sintaxis: Set ObjNoGrfico = ObjDiccionario .AddObject( StrPalClave , StrNomObjeto )
GetName. Devuelve el nombre (palabra clave) de un objeto de un diccionario: StrNombre = ObjDiccionario .GetName( ObjEnDiccionario ) GetObject. Devuelve el objeto que se corresponde con una palabra clave en un diccionario: ObjEnDiccionario = ObjDiccionario .GetObject( StrPalClave ) Remove. Elimina el objeto de un diccionario indicado por su palabra clave: Call ObjDiccionario .Remove( StrPalClave ) Rename. Cambia el nombre (palabra clave) del objeto de un diccionario indicado por su palabra clave: Call ObjDiccionario .Rename( StrNombreAntiguo , StrNombreNuevo )
Replace. Cambia una entrada en un diccionario por otra dada: Call ObjDiccionario .Replace( StrPalClave , ObjObjetoNuevo )
96
97
97
Los mtodos nuevos son: AppendItems. Aade una o ms entidades grficas al grupo: Call ObjGrupo .AppendItems( ObjGrficos ) ObjGrficos es una matriz de objetos grficos de AutoCAD. RemoveItems. Elimina los objetos especificados de un grupo (o tambin de un conjunto de seleccin): Call ObjGrupo.RemoveItems(ObjGrficos) ObjGrficos es una matriz de objetos grficos de AutoCAD.
98
99
Lock Name
Las nuevas propiedades se explican a continuacin. Freeze. La propiedad Freeze congela o descongela una capa. Es lo que se denomina en la vers in castellana de AutoCAD la inutilizacin y reutilizacin de capas (representado por un Sol o un smbolo de hielo, dependiendo de la condicin, en el cuadro de dilogo de capas). Tambin nos permite obtener el estado en que se encuentra una capa con respecto a este aspecto. La sintaxis para asignar un estado con Freeze a una capa es: ObjCapa.Freeze = BooEstadoUtilizacin BooEstadoUtilizacin es un valor Boolean que puesto a True indica que la capa se inutiliza (se congela) y puesto a False indica que la capa se reutiliza o utiliza (se descongela). La sintaxis para obtener un estado con Freeze de una capa es: BooEstadoUtilizacin = ObjCapa.Freeze BooEstadoUtilizacin es un valor Boolean que si almacena True indica que la capa est inutilizada y si almacena False indica que la capa est reutilizada o utilizada. Recordemos que la ventaja de inutilizar o congelar una capa es que es excluida de la regeneracin, lo que no ocurre por ejemplo al desactivarla simplemente. Tambin decir que una capa inutilizada no es trazada (por plotter o impresora). LayerOn. La propiedad LayerOn activa o desactiva una capa (representado por una bombilla encendida o apagada, dependiendo de la condicin, en el cuadro de dilogo de capas). Tambin nos permite obtener el est ado en que se encuentra una capa con respecto a este aspecto. La sintaxis para asignar un estado con LayerOn a una capa es: ObjCapa.LayerOn = BooEstadoActivacin BooEstadoActivacin es un valor Boolean que puesto a True indica que la capa se activa y puesto a False indica que la capa de desactiva. La sintaxis para obtener un estado con LayerOn de una capa es: BooEstadoActivacin = ObjCapa.LayerOn BooEstadoActivacin es un valor Boolean que si almacena True indica que la capa est activada y si almacena False indica que la capa est desactivada. Al desactivar un capa no aparecer en pantalla ni en trazador, pero sus objetos seguirn respondiendo a las regeneraciones del dibujo. Lock. La propiedad Lock bloquea o desbloquea una capa (representado po r un candado abierto o cerrado, dependiendo de la condicin, en el cuadro de dilogo de capas). 99
100
Tambin nos permite obtener el estado en que se encuentra una capa con respecto a este aspecto. La sintaxis para asignar un estado con Lock a una capa es: ObjCapa.Lock = BooEstadoBloqueo BooEstadoBloqueo es un valor Boolean que puesto a True indica que la capa se bloquea y puesto a False indica que la capa de desbloquea. La sintaxis para obtener un estado con Lock de una capa es: BooEstadoBloqueo = ObjCapa.Lock BooEstadoBloqueo es un valor Boolean que si almacena True indica que la capa est bloqueada y si almacena False indica que la capa est desbloqueada. Al bloquear una capa no se podr modificar, pero seguir visible y respondiendo a acciones como, por ejemplo, la utilizacin de modos de referencia en ella. Veamos un programa de ejemplo de manejo de capas. Este ejercicio maneja el cuadro de dilogo que se puede observar en esta misma pgina. Su misin es nicamente informativa, es decir, slo informa del nombre y propiedades de las diferente capas del dibujo actual. Al ejecutar el programa deber rellenar la lista desplegable con las capas de la sesin de AutoCAD en curso y mostrar la primera de ellas (siempre la capa 0) escribiendo en los distintos cuadros de edicin sus respectivas propiedades. Al actuar sobre la lista desplegable eligiendo una capa, las casillas de edicin se actualizarn con los nuevos valores. Veamos pues el letrero de dilogo comentado y, a continuacin, el listado del progra ma propiamente dicho.
100
101
El listado es el que sigue: Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim AcadCapas As Object Dim NumCapas As Integer Private Sub cbSalir_Click() End End Sub Private Sub cbCapas_Change() Dim ndice As Integer ndice = cbCapas.ListIndex tbColor.Text = AcadCapas.Item(ndice).Color tbTipolin.Text = AcadCapas.Item(ndice).Linetype If AcadCapas.Item(ndice).LayerOn = True Then tbAD.Text = "Activada" Else tbAD.Text = "Desactivada" End If If AcadCapas.Item(ndice).Freeze = True Then tbIR.Text = "Inutilizada" Else tbIR.Text = "Utilizada" End If If AcadCapas.Item(ndice).Lock = True Then tbBD.Text = "Bloqueada" Else tbBD.Text = "Desbloqueada" End If End Sub Private Sub UserForm_Initialize() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set AcadCapas = AcadDoc.Layers NumCapas = AcadCapas.Count Dim i As Integer For i = 0 To Val(NumCapas - 1) cbCapas.AddItem AcadCapas.Item(i).Name Next i cbCapas.Text = AcadCapas.Item(0).Name End Sub Vemos como en cuanto se corre el programa se hace una llamada al procedimiento cbCapas_Change. Esto es debido a la lnea cbCapas.Text = AcadCapas.Item(0).Name, que en s ya realiza un cambio en la lista desplegable, por eso se ejecuta el procedimiento anteriormente dicho. Esta lnea escribe en la casilla de la lista desplegable el primero de los elementos (la primera capa, la capa 0). Antes de esto se introducen todos los nombres de capas en la lista. Vemos que no tiene ningn misterio y que simplemente es limitarse a seguir las pautas y diversas sintaxis de uso que vamos estudiando. Con las extraccin del color, tipo de lnea y dems propiedades, vemos que el pro ceso es similar. La nica variante es que se ha introducido un control para averiguar cuando 101
102
determinados valores son True o False y escribir textos en las casillas que resulten ms lgicos al usuario que Verdadero y/o Falso. NOTA: Como el cuadro es slo informativo no nos olvidemos de establecer la propiedad Style de la lista desplegable a 2 (fmStyleDropDownList ) y las propiedades Locked de las casillas de edicin a True. Todo ello para no poder editar valores manualmente. Si quisiramos que el usuario pudiera entrar en las casillas y variar los valores para cambiar las propiedades de las capas, nicamente habramos de dejar estas propiedades especificadas como estn y aadir algo ms de cdigo al programa con las diferentes sintaxis para asignar en lugar de obtener las propiedades de las capas.
Como vemos hay un nuevo mtodo: Load. Carga en el dibujo actual el tipo de lnea especificado (String) del archivo de definicin de tipos de lnea (.LIN) especificado (String): Call ObjColTiposDeLnea .Load(StrNombreTipoLnea , StrNombreArchivo )
NOTA: Si utilizamos el mtodo Add se crear un nuevo tipo de lnea con las propiedades por defecto. El objeto simple de esta coleccin es un objeto de tipo de lnea. Los objetos de tipo de lnea poseen las siguientes propiedades y mtodos:
Propiedades de los objetos de tipo de lnea: Application Description Name Mtodos de los objetos de tipo de lnea:
Delete GetXData La nueva propiedad es: Description. Asigna u obtiene una descripcin (String) para el tipo de lnea. Esta descripcin es la que aparece en el archivo de definicin .LIN y en el cuadro de gestin de tipos de lnea, es la representacin de la lnea con caracteres ASCII (puntos, guiones, texto, etc...). Como mximo puede tener 47 caracteres. La sintaxis para asignar una descripcin es: SetXData
102
103
ObjTipoLnea .Description = StrDescripcin La sintaxis para obtener una descripcin es: StrDescripcin = ObjTipoLnea .Description Veamos la siguiente macro de ejemplo en la que se carga un tipo de lnea y se obtiene su descripcin: Option Explicit Dim AcadDoc As Object Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument If IsEmpty(AcadDoc.Linetypes.Item("trazo_y_punto")) Then Call AcadDoc.Linetypes.Load("trazo_y_punto", "acadiso.lin") End If Dim TipoLin As Object Set TipoLin = AcadDoc.Linetypes.Item("trazo_y_punto") Dim Descr As String Descr = TipoLin.Description MsgBox Descr End Sub NOTA: Podemos comprobar que con la nica definicin de AcadDoc nos sirve para este programa; no hay por qu declarar ms variables de objeto de AutoCAD si no es necesario. Si intentamos cargar un tipo de lnea existe, un estilo de texto, etctera), VBA comprobar primero si dicho tipo de lnea menesteres utilizamos la func in de Visual listado. y este ya est cargado (o crear un capa que ya devuelve un error. Para evitar esto hemos de en este caso est ya cargado. Para estos Basic IsEmpty como se puede observar en el
Tras cargar el tipo de lnea, si no estaba ya cargado, se extrae su descripcin y se muestra con un MsgBox. El resultado es el siguiente:
NOTA: Si el archivo ACADISO.LIN no hubiera estado en uno de los directorios de soporte de AutoCAD, habramos de haber indicado la ruta completa al fichero; al igual que ocurra con los programas en AutoLISP, si recordamos.
103
105
Call ObjConjuntoSel .AddItems( ObjGrficos ) ObjGrficos es una matriz de objetos grficos. NOTA: No confundir AddItems con el mtodo AppendItems de los objetos de grupo ni con el mtodo AddItem de las listas desplegables y cuadros de lista de Visual Basic. El siguiente ejemplo de macro dibuja una lnea, un crculo, crea un conjunto de seleccin y le aade ambos objetos creados: Option Explicit Dim Dim Dim Dim Dim AcadDoc As Object AcadModel As Object Lnea As Object Crculo As Object Grupo1 As Object
Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Dim Pto1(2) As Double Dim Pto2(2) As Double Pto1(0) = 100: Pto1(1) = 100: Pto1(2) = 0 Pto2(0) = 200: Pto2(1) = 200: Pto2(2) = 0 Set Lnea = AcadModel.AddLine(Pto1, Pto2) Set Crculo = AcadModel.AddCircle(Pto1, 10) Set Grupo1 = AcadDoc.SelectionSets.Add("Prueba") Dim Objeto(1) As Object Set Objeto(0) = Lnea: Set Objeto(1) = Crculo Call Grupo1.AddItems(Objeto) End Sub Si ahora yo quisiera eliminar por ejemplo ambos objetos guardados en el conjunto de seleccin Grupo1, simplemente hara: Grupo1.Erase Clear. Elimina todos los elementos de un conjunto de seleccin: Call ObjConjuntoSel .Clear Esto es, vaca el conjunto. Select. Selecciona los objetos designados por el modo indicado y los introduce en un conjunto de seleccin. Su sintaxis de utilizacin es: Call ObjConjuntoSel .Select( IntModo, VarDatoFiltro ) DblPto1, DblPto2, VarTipoFiltro ,
El argumento IntModo es un valor Integer que define el tipo o modo de seleccin que se ejecutar sobre los objetos. Admite tambin las siguientes constantes: acSelectionSetAll acSelectionSetCrossingPolygon acSelectionSetLast acSelectionSetWindows acSelectionSetCrossing acSelectionSetFence acSelectionSetPrevious acSelectionSetWindowPolygon
106
Las cuales se corresponden con los diferentes modos de designacin de entidades de AutoCAD, esto es: Todo , Captura, Polgono-Captura, Borde, ltimo, Previo , Ventana y Polgono- Ventana. Los dos argumentos de punto siguientes (matriz de tres valores Double) son obligatorios. En el caso de Captura y Ventana representan las dos esquinas opuestas por la diagonal. En el caso de Polgono (Captura o Ventana) y Borde, el primer argumento DblPto1 debe contener una matriz con todos los puntos que definen el polgono o el borde, y se debe suministrar un argumento DblPto2 ficticio; en este caso resulta preferible utilizar el mtodo SelectByPolygon (que luego veremos). En el caso de modos que no necesitan puntos, como Todo , ltimo y Previo , los dos puntos se deben suministrar como argumentos ficticios que luego no se van a utilizar. El argumento VarTipoFiltro (Variant) permite especificar un filtro de seleccin, de manera similar a la funcin de AutoLISP SSGET. El ltimo argumento permite especificar filtros para los datos extendidos. SelectAtPoint. Selecciona el objeto que pasa por el punto indicado y lo aade a un conjunto de seleccin. Su sintaxis de utilizacin es: Call ObjConjuntoSel.SelectAtPoint(DblPto, VarTipoFiltro , VarDatoFiltro )
DblPto es una matriz de tres valores Double. Los dos ltimos argumentos como en el mtodo Select. SelectByPolygon. Selecciona entidades incluidas dentro de un polgono definido por una lista de puntos suministrada (y las aade a un conjunto de seleccin). Su sintaxis de utilizacin es: Call ObjConjuntoSel .SelectByPolygon( IntModo, VarDatoFiltro ) DblListaPtos , VarTipoFiltro ,
El argumento IntModo es un valor Integer que define el tipo o modo de seleccin que se ejecutar sobre los objetos. Admite tambin las siguientes constantes: acSelectionSetCrossing acSelectionSetFence acSelectionSetCrossingPolygon
DblListaPtos es una matriz de puntos con las esquinas del polgono. Los dos ltimos argumentos como en el mtodo Select. SelectOnScreen. Permite seleccionar objetos en pantalla (tras el prompt Designar objetos:, o Select objects: en ingls) que sern aadidos a un conjunto de seleccin. Su sintaxis de utilizacin es: Call ObjConjuntoSel .SelectOnScreen( VarTipoFiltro , Los dos argumentos como en el mtodo Select. NOTA: En todos estos mtodos de seleccin, VarDatoFiltro son opcionales. Veamos el siguiente ejemplo: los argumentos VarTipoFiltro y VarDatoFiltro )
107
Option Explicit Dim Dim Dim Dim Dim AcadDoc As Object AcadModel As Object Lnea As Object Crculo As Object Grupo1 As Object
Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Dim Pto1(2) As Double Dim Pto2(2) As Double Pto1(0) = 100: Pto1(1) = 100: Pto1(2) = 0 Pto2(0) = 200: Pto2(1) = 200: Pto2(2) = 0 Set Lnea = AcadModel.AddLine(Pto1, Pto2) Set Crculo = AcadModel.AddCircle(Pto1, 10) Set Grupo1 = AcadDoc.SelectionSets.Add("Prueba") Call Grupo1.SelectOnScreen Grupo1.Erase End Sub Esta macro dibuja una lnea y un crculo en pantalla. Tras crear un nuevo conjunto de seleccin ( Grupo1) se permite seleccionar en pantalla los objetos que se insertarn en l. Despus de esta designacin los objetos se borran. NOTA: Ms adelante veremos como seleccionar tambin en pantalla puntos, ngulos, distancias, etctera.
Veamos estas nuevas propiedades aplicables nicamente a estilos de texto. BigFontFile. Permite especificar u obtener el nombre de archivo de fue nte grande (para tipos de letra asiticos, por ejemplo) asociado con el estilo de texto. La sintaxis para asignar un archivo es: ObjEstiloTexto.BigFontFile = StrNombreArch donde StrNombreArch es una cadena (tipo de dato String). La sintaxis para obtener o extraer el archivo de texto de fuente grande de un estilo de texto es: StrNombreArch = ObjEstiloTexto.BigFontFile donde StrNombreArch es una cadena (tipo de dato String). NOTA: El nico tipo de archivo vlido es el de extensin .SHX. FontFile. Permite especificar u obtener el nombre de archivo de fuente principal o primario asociado con el estilo de texto. La sintaxis para asignar un archivo es: ObjEstiloTexto.FontFile = StrNombreArch donde StrNombreArch es una cadena (tipo de dato String). La sintaxis para obtener o extraer el archivo de texto de fuente principal de un estilo de texto es: StrNombreArch = ObjEstiloTexto.FontFile donde StrNombreArch es una cadena (tipo de dato String). NOTA: Los tipos de archivo vlidos son .PFA, .PFB, .SHX, .TTF. LastHeight. Asigna u obtiene la ltima altura de texto utilizada. Para asignar: ObjEstiloTexto.LastHeight = DblltimaAltura donde DblltimaAltura es un valor Double. La sintaxis para obtener: DblltimaAltura = ObjEstiloTexto .LastHeight donde DblltimaAltura es un valor Double.
109
Observamos que existen dos nuevas propiedades y un mtodo nuevo que an no conocemos. Pasaremos pues a estudiar esto. Primero las propiedades: XVector. Asigna u obtiene la direccin X del SCP. Para asignar: ObjSCP.XVector = DblVectorX donde DblVectorX es un array de tres valores Double. Esta caracterstica est controlada tambin por la variable de sistema de AutoCAD UCSXDIR. Para obtener:
110
VarVectorX = ObjSCP.XVector YVector. Asigna u obtiene la direccin Y del SCP. Para asignar: ObjSCP.YVector = DblVectorY donde DblVectorY es un array de tres valores Double. Esta caracterstica est controlada por la variable de sistema de AutoCAD UCSYDIR. Para obtener: VarVectorY = ObjSCP.YVector Ahora el mtodo: GetUCSMatrix. Obtiene la matriz de transformacin del objeto de SCP al que se aplica el mtodo. Esta matriz de 4 4 define las rotaciones y traslaciones de cada eje del SCP respecto al Sistema Universal. Sintaxis: VarMatriz = ObjSCP .GetUCSMatrix donde VarMatriz es una variable que habr sido declarada como Variant, aunque recoger una matriz de 4 4 elementos Double. Despus podremos acceder a cada valor por medio de ndices, como hemos hecho otras veces.
111
Direction. Asigna u obtiene la direccin de la vista para una visualizacin tridimensional. Para asignar: ObjNoGrfico .Direction = DblVector Para obtener: VarVector = ObjNoGrfico .Direction donde DblVector es un array de tres valores Double. Es un vector de direccin desde donde el dibujo se ver. Esta propiedad es similar al comando PTOVISTA (VPOINT en ingls) de AutoCAD. Target. Asigna u obtiene el punto objetivo de una vista (en este caso). Para asignar: ObjNoGrfico .Target = DblPuntoObjetivo Para obtener: VarPuntoObjetivo = ObjNoGrfico .Target donde DblPuntoObjetivo es un array de tres valores Double. Como siempre, pare recoger utilizaremos una variable dec larada como Variant.
Las propiedades y mtodos expuestos estn ya estudiados. El objeto simple de esta coleccin es un objeto de ventana grfica. Los objetos de ventana grfica poseen las siguientes propiedades y mtodos:
de ventana:
GetSnapSpaci ng SetView GetXDa ta SetXDa ta SetGridSpaci ng Split
112
ZoomAll ZoomScaled ZoomCenter ZoomWindow ZoomExtents ZoomPickWind ow
Comencemos por las nuevas propiedades. GridOn. Obtiene y asigna el valor de estado de la rejilla en una ventana. Es un valor booleano (Boolean) que si es True especifica que la rejilla est activada y si, por el contrario, es False, especifica que la rejilla est desactivada. La sintaxis para asignar este valor es: ObjVentana.GridOn = BooRejilla Y la sintaxis para obtenerlo: BooRejilla = ObjVentana .GridOn LowerLeftCorner. Obtiene el vrtice inferior izquierdo de la ventana grfica, en porcentaje de ancho y alto de pantalla, tal como se almacenan las configuraciones de ventanas mosaico en AutoCAD. Sintaxis: VarEsquinaII = ObjVentana .LowerLeftCorner VarEsquinaII recoger una matriz de valores Double. OrthoOn. Obtiene y asigna la condicin del modo Orto en la ventana activa actualmente. Sintaxis para asignar: ObjVentana.OrthoOn = BooModoOrto Sintaxis para obtener: BooModoOrto = ObjVentana .OrthoOn BooModoOrto tomar el valor True si el modo Orto est activado o se quiere activar ; tomar el valor False si el modo Orto est desactivado o se quiere desactivar. SnapBasePoint. Especifica el punto base para el forzado de cursor/rejilla en la ventana actual. La sintaxis para asignar este valor es: ObjVentana.SnapBasePoint = DblPtoBase Y la sintaxis para obtenerlo: VarPtoBase = ObjVentana .SnapBasePoint Evidentemente, DblPtoBase, al ser un punto, ser una matriz de tres valores Double. Si es para obtener, recordar que habremos de guardarlo en una variable Variant. SnapOn. Especifica el estado del forzado de cursor. La sintaxis para asignar este valor es: ObjVentana.SnapOn = BooEstadoForzcursor
113
Y la sintaxis para obtenerlo: BooEstadoForzcursor = ObjVentana .SnapOn BooEstadoForzcursor constantes: acOn acOff ser un valor Boolean que adems admite las siguientes
que especifican la activacin (acOn) o no activacin (acOff) del Forzcursor. SnapRotationAngle. Es el ngulo de rotacin en radianes (valor Double de 0 a 6.28) del forzado de cursor en la ventana con respecto al SCU. La sintaxis para asignar este valor es: ObjVentana.SnapRotationAngle = DblnguloRotacin Y la sintaxis para obtenerlo: DblnguloRotacin = ObjVentana.SnapRotationAngle StatusID. Obtiene nicamente el estado de activacin de una ventana. El valor se recoge en una variable declarada como Boolean: si guarda True la ventana est activada, si guarda False la ventana est desactivada: BooEstadoActivacin = ObjVentana .StatusID UCSIconAtOrigin. Especifica si el icono o smbolo del SCP se muestra en el origen de coordenadas o no. Todo ello es controlado por un valor Boolean que, si es True quiere decir que el SCP aparece en el origen y, si es False, que no. La sintaxis para asignar este valor es: ObjVentana.UCSIconAtOrigen = BooSimbSCPOrigen Y la sintaxis para obtenerlo: BooSimbSCPOrigen = ObjVentana .UCSIconAtOrigin UCSIconOn. Especifica si el icono o smbolo del SCP se visualiza o no. Todo ello es controlado por un valor Boolean que, si es True quiere decir que el SCP se visualiza y, si es False, que no se visualiza. La sintaxis para asignar este valor es: ObjVentana.UCSIconOn = BooSimbSCPActivo Y la sintaxis para obtenerlo: BooSimbSCPActivo = ObjVentana .UCSIconOn UpperRightCorner. Obtiene el vrtice superior derecho de la ventana grfica, e n porcentaje de ancho y alto de pantalla, tal como se almacenan las configuraciones de ventanas mosaico en AutoCAD. Sintaxis:
114
VarEsquinaSD = ObjVentana .UpperRightCorner VarEsquinaSD ser una matriz de valores Double. Veamos ahora los nuevos mtodos. GetGridSpacing. Obtiene el espaciado de la rejilla para la ventana: Call ObjVentana.GetGridSpacing( DblEspXRejilla, DblEspYRejilla )
DblEspXRejilla y DblEspYRejilla son dos variables declaradas como Double que guardarn el espaciado en X y en Y respectivame nte. GetSnapSpacing. Obtiene el espaciado del forzado de cursor para la ventana: Call ObjVentana.GetSnapSpacing( DblEspXForzcursor, DblEspYForzcursor )
DblEspXForzcursor y DblEspYForzcursor son dos variables declaradas como Double que guardarn el espac iado en X y en Y respectivamente. SetGridSpacing. Asigna el espaciado de la rejilla para la ventana: Call ObjVentana.SetGridSpacing(DblEspXRejilla, DblEspXRejilla y DblEspYRejilla espaciado en X y en Y respectivamente. DblEspYRejilla ) Double que representan el
SetSnapSpacing. Asigna el espaciado del forzado de cursor para la ventana: Call ObjVentana.SetSnapSpacing( DblEspXForzcursor , DblEspYForzcursor )
DblEspXForzcursor y DblEspYForzcursor son dos valores Double que representan el espaciado en X y en Y respectivamente. El valor inicial para X e Y es 1.0000. SetView. Establece en la ventana grfica la visualizacin de un objeto de vista. El argumento suministrado deber ser de tipo Object, conteniendo una vista existente en el dibujo: Call ObjVentana.SetView( ObjVista ) ObjVista es un objeto de vista de los explicados en la seccin anterior. Split. Divide la ventana grfica actual en el nmero de partes indicado: Call ObjVentana.Split( IntNmVentanas ) IntNmVentanas ha de ser un nmero entero, aunque tambin se admiten las siguientes constantes (las cuales dicen relacin a las diferentes formas predeterminadas de AutoCAD de dividir una ventana): acViewport2Horizontal acViewport3Left acViewport3Horizontal acViewport3Above acViewport4 acViewport2Vertical acViewport3Right acViewport3Vertical acViewport3Below
115
La siguiente macro muestra la manera de dividir la ventana grfica actual en tres ventanas con una posicin predefinida de AutoCAD: Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim Ventana1 As Object Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set Ventana1 = AcadDoc.Viewports.Add("Nueva") Call Ventana1.Split(acViewport3Left) Set AcadDoc.ActiveViewport = Ventana1 End Sub Primero hemos de crear un nuevo objeto de ventana en la coleccin de ventanas, despus dividirlo a nuestro gusto y, por ltimo, definirlo como la ventana actual (recordemos la propiedad ActiveViewport del objeto de documento activo). ZoomAll. Realiza un Zoom Todo en la ventana actual: ObjVentana .ZoomAll ZoomCenter. Realiza un Zoom Centro en la ventana actual. Hay que proporcionar el centro en cuestin (matriz de tres valores Double) y el factor de ampliacin (Double). Call ObjVentana.ZoomCenter( DblPtoCentro , DblFactorAmpl )
ZoomExtens. Realiza un Zoom Extensin en la ventana actual: ObjVentana .ZoomExtens ZoomPickWindow. Realiza un Zoom Ventana en la ventana actual. Los puntos diagonales de la ventana se marcan en pantalla con el dispositivo sealador al mensaje habitual: ObjVentana .ZoomPickWindow ZoomScaled. Realiza un Zoom Factor en la ventana actual. Hay que proporcionar el factor de escala y el tipo de escala: Call ObjVentana.ZoomScaled( DblFactorEscala, IntTipoEscala )
DblFactorEscala es un valor Double que representa el factor de escala. IntTipoEscala es un valor Integer que adems admite las tres siguientes constantes (absoluta, relativa y relativa al Espacio Papel): acZoomScaledAbsolute acZoomScaledRelative acZoomScaledRelativePSpace los puntos
ZoomWindow. Realiza un Zoom Ventana en el que se proporcionan diagonales como argumentos del mtodo:
115
116
Call ObjVentana.ZoomWindow( DblPtoInfIzq , DblPtoSupDcha )
DblPtoInfIzq y DblPtoSupDcha son los puntos (matriz de tres valores Double) inferior izquierda y superior derecha, respectivamente, de la ventana.
DblCentro es un valor que especifica el punto (array de tres valores Double) central de la ventana. DblAltura es un valor Double que especifica al altura de la ventana. DblAnchura es un valor Double que especifica al anchura de la ventana. Estos dos ltimos valores han de ser positivos. Pasemos a explicar las nuevas propiedades y el nuevo mtodo. LensLength. Especifica la longitud de la lente (en milmetros) para la vista en perspectiva. Este valor Double est tambin controlado por la variable de sistema LENSLENGTH. La sintaxis para asignar este valor es: ObjVentanaPapel .LensLength = DblLongLente Y la sintaxis para obtenerlo: DblLongLente = ObjVentanaPapel.LensLength 116
117
RemoveHiddenLines. Especifica si las lneas ocultas han de ser trazadas o imprimidas en determinada ventana. Su sintaxis para asignar un valor es la que sigue: ObjVentanaPapel .RemoveHiddenLines Y la sintaxis para obtenerlo: BooLneasOcultas = ObjVentanaPapel.RemoveHiddenLines BooLneasOcultas es un valor Boolean; si es True las lneas ocultas no aparecen trazadas, si es False s. TwistAngle. Obtiene el ngulo de ladeo de una ventana. Su sintaxis es la que sigue: DblngLadeo = ObjVentanaPapel .TwistAngle DblngLadeo es un valor Double. El mtodo Display a continuacin. Display. Este mtodo activa o desactiva una ventana de Espacio Papel: ObjVentanaPapel .Display( BooEstado) BooEstado es un valor Boolean; True activa la ventana, False la desactiva. Veamos el ejemplo que sigue: Option Explicit Dim AcadDoc As Object Dim AcadPapel As Object Dim VentanaPapel As Object Dim CentroVentana(1 To 3) As Double Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadPapel = AcadDoc.PaperSpace CentroVentana(1) = 100: CentroVentana(2) = 100: CentroVentana(3) = 0 Set VentanaPapel = AcadPapel.AddPViewport(CentroVentana, 100, 100) VentanaPapel.Display (True) End Sub Con esta macro creamos una ventana flotante de Espacio Papel. Al crearla, por defecto aparece desactivada. Para activarla utilizamos el mtodo Display. Hasta aqu todo lo referente a las colecciones de objetos. Hemos aprendido muchos detalles que ya nos harn programar medianamente bien. Sin embargo, para optar por una progra macin aceptable necesitamos conocer algunos mecanismos ms, sobre todo los que veremos en la seccin siguiente. = BooLneasOcultas
117
118
El funcionamiento del programa es el siguiente. Al iniciar el letrero se rellenar la lista desplegable Tipo de lnea: con los nombres de los tipos de lnea actualmente cargados en el dibujo. La lista Tipo de objeto: permanecer vaca por el momento. Al pulsar el botn Designar< se cerrar el cuadro y se permitir designar en pantalla uno o varios objetos. Tras el final de la designacin o seleccin, se retornar al cuadro en el que se rellenar la lista desplegable Tipo de objeto: con el tipo (lnea, crculo, spline...) y el nmero ID de identificacin, entre parntesis, de cada uno de los objetos seleccionados. La manera de aplicar ahora tipos de lnea a los objetos es escogiendo de la lista superior la entidad en concreto y, de la lista inferior, el tipo de lnea que ser asignado a ella. Tras esto se pulsa el botn Aplicar para aplicar los cambios. Los cambios deben ser evidentes de inmediato (al pulsar Aplicar ) pero el letrero no ha de cerrarse; por si acaso se quieren realizar ms modificaciones o cambios. El botn Salir cierra el letrero de dilogo y termina la aplicacin.
119
Dim AcadUtil As Object y luego inicializarlas as: Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set AcadUtil = AcadDoc.Utility Como vemos, el objeto de utilidad desciende directamente del de documento activ o, por lo que la forma de inicializarlo es similar a la de la coleccin de objetos de Espacio Modelo por ejemplo, como se ve (estn en el mismo nivel). Pasemos directamente a ver la lista de propiedades y mtodos de este objeto, para despus estudiarlos detenidamente.
Tanto DblPtoInic como DblPtoFinal son los dos puntos de una lnea o de un vector que no tiene por qu estar dibujado , por lo que sern matrices o arrays de tres elementos (coordenada X, coordenada Y y coordenada Z) de tipo de dato Double. No es indiferente el orden en que se introducen los puntos, ya que no es igual el ngulo desde el eje X a una lnea que va desde un punto 1 hasta un punto 2, que el ngulo desde el eje X a una lnea que va desde 2 hasta 1, evidentemente. NOTA: La variable que recoja este valor (DblnguloDesdeX) habr sido declarada como Double. AngleToReal. Este mtodo obtiene la conversin en radianes de un ngulo en formato de texto a un nmero real de doble precisin. Veamos la sintaxis de este mtodo: DblnguloReal = ObjUtilidad .AngleToReal( Strngulo, IntUnidades )
Como vemos, el ngulo ha de ser en formato de cadena de texto normalmente introducido por el usuario . IntUnidades, por su lado, es un valor Integer que determina en qu unidades aparece el ngulo del argumento anterior, procediendo a su conversin en 119
120
nmero real segn convenga. constantes: acDegrees acRadians Este segundo argumento admite tambin las siguientes
acDegreeMinuteSeconds acSurveyorUnits
acGra ds
stas se corresponden con los diferentes tipos de ngulos que maneja AutoCAD (grados sexagesiamales decimales, grados/minutos/segundos, grados centesimales, ra dianes, unidades geodsicas). As pues, una operacin como la que sigue (siguiendo con la notacin especificada al principio de esta seccin): Dim Resultado As Double Resultado = AcadUtil.AngleToReal("180", acDegrees) MsgBox Resultado devolver 3.14159265358979, esto es, el resultado de pasar a radianes la cantidad obtenida de convertir el texto "180" considerado como grados en notacin decimal. El resultado (PI) sera el mismo al hacer lo siguiente: Dim Resultado As Double Resultado = AcadUtil.AngleToReal("100", acGrads) MsgBox Resultado AngleToString. AngleToString convierte el ngulo proporcionado, el cual se considera siempre en radianes, a cadena de texto de acuerdo con las unidades y los decimales de precisin indicados: StrnguloCadena = ObjUtilidad .AngleToString( Dblngulo, IntUnidades, IntPrecis)
Dblngulo es un valor Double que, como decimos, estar en radianes, ya que VBA as siempre lo interpreta. IntUnidades es un valor Integer que admite las mismas constantes explicadas en el mtodo anterior y que representa las unidades a las que se convertirn los radianes especificados. IntPrecis especifica la precisin del ngulo, que se convertir a cadena, en nmero de decimales. Este ltimo argumento admite un valor entre 0 y 8 (siempre entero). Veamos una rutina de ejemplo: Dim Resultado As String Const PI = 3.14159265358979 Resultado = AcadUtil.AngleToString(PI / 2, acDegrees, 3) MsgBox Resultado El resultado sera la cadena "90". Como vemos se ha transformado en grados sexagesimales en formato decimal ( acDegrees), en cadena ( AngleToString) y, aunque se indic un precisin de tres decimales ( 3), no se ha tenido en cuenta al resultar un valor exacto. DistanceToReal. Convierte un distancia en formato de texto normalmente indicada por el usuario a un valor real, de acuerdo con el tipo de unidades especificado: DblDistReal = ObjUtilidad .DistanceToReal( StrDistancia, IntUnidades )
StrDistancia es un valor tipo String que, como decimos, ser una cadena. IntUnidades es un valor entero (Integer) que tambin admite las siguientes constantes: 120
121
acScientific acArchitectural acDecimal acFractional acEngineering
Este ltimo argumento indica las unidades de conversin, cuyas constantes se corresponden con las unidades manejadas por AutoCAD (cientficas, decimales, pies y pulgadas I, pies y pulgadas II y fraccionarias). NOTA: El valor de la distancia obtenido es siempre en unidades de dibujo. EndUndoMark. Este mtodo coloca una seal de fin de DESHACER en el lugar del programa que se utilice. Su sintaxis es: ObjUtilidad .EndUndoMark Si recordamos, las marcas de inicio y fin del comando de AutoCAD DESHACER las utilizbamos mucho en los programas de AutoLISP, por lo que no hay motivo para no hacerlo en VBA tambin. Cuando realizamos un programa o una macro que dibuja varias entidades, por ejemplo, si al trmino de su ejecucin no estamos contentos con el resultado y utilizamos el comando H para deshacer el dibujo, nicamente se deshar la ltima entidad dibujada. Si antes de comenzar el dibujo del conjunto introducimos una marca de inicio de DESHACER y, tras terminar el dibujo completo, otra de fin de DESHACER, al introducir H al final de la ejecucin del programa o de la macro, el conjunto de entidades se deshar por completo como un todo, cosa que nos interesa por esttica y por funcionalidad. Esta caracterstica se corresponde con la opcin Fin (End en ingls) del comando DESHACER (UNDO en ingls) de AutoCAD. NOTA: Ms adelante se explicar el mtodo StartUndoMark que coloca marcas de inicio de DESHACER. GetAngle. Acepta el valor de un ngulo indicado por el usuario. Sintaxis: Dblngulo = ObjUtilidad .GetAngle( DblPtoBase , StrMensaje )
Este valor se puede introducir directamente desde el teclado (en el formato actual de unidades en AutoCAD o con los sufijos permitidos para radianes, centesimales, etc.), o sealando puntos en pantalla. Si se especifica un punto de base (es opcional) Double, se muestra un cursor elstico enganchado a dicho punto y el ngulo es el formado por la lnea desde ese punto hasta el sealado por el usuario. Si no se especifica un punto de base, el usuario puede sealar dos puntos en pantalla para indicar el ngulo. El ngulo se mide siempre en dos dimensiones, ignorndose las coordenadas Z de los puntos. En cualquiera de los supuestos, el ngulo se mide a partir del origen actualmente establecido en AutoCAD (variable de ANGBASE), siempre en sentido antihorario. El valor devuelto es siempre en radianes. Si se introduce el valor por teclado, se considerar como radianes. A diferencia del mtodo GetOrientation explicado ms adelante, GetAngle se emplea sobre todo para medir ngulos relativos. El mensaje tambin es opcional (tipo String), y especifica el texto que aparecer como solicitud del ngulo en la lnea de comandos. Comentemos la macro siguiente: Option Explicit 121
122
Dim AcadDoc As Object Dim AcadModel As Object Dim AcadUtil As Object Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set AcadUtil = AcadDoc.Utility Dim Resultado As Double Dim PtoBase(1 To 3) As Double PtoBase(1) = 10: PtoBase(2) = 18 Resultado = AcadUtil.GetAngle(PtoBase, "ngulo: ") MsgBox Resultado End Sub Veamos que aqu se solicita un ngulo al usuario y luego se muestra con un MsgBox. Percatmonos tambin de que la coordenada Z del punto base no es necesario que tenga valor, ya que como hemos dicho no se toma en cuenta. Sin embargo, a la hora de declarar la variable habremos de hacerlo como un array de tres valores (aunque el ltimo luego lo dejemos vaco), ya que de otro modo no funcionar el mtodo. GetCorner. Este mtodo acepta el valor de un punto indicado por el usuario, mientras existe otro punto enganchado, lo que forma un rectngulo. Sintaxis: VarPuntoEsquina = ObjUtilidad .GetCorner( DblPtoBase, StrMensaje )
En este caso DblPtoBase es obligatorio (Double). StrMensaje sigue siendo opcional, al igual que con el mtodo anterior, y es una cadena alfanumrica (String). El resultado de este mtodo ser un punto (matriz de tres elementos Double), por lo que habr de recogerse en una variable tipo Variant para luego, y si se quieren utilizar las coordenadas de dicho punto, extraer los valores mediante ndices y hacer un trasvase. GetDistance. Este mtodo acepta el valor de una distancia indicada por el usuario. Este valor ( Double) podr ser introducido mediante el teclado o directamente en pantalla marcando dos puntos. En este caso da lo mismo el orden de introduccin de puntos. La sintaxis para GetDistance es la siguiente: DblDistancia = ObjUtilidad.GetDistance( DblPtoBase, StrMensaje )
Si se indica un punto base, que habr de ser Double, el cursor se enganchar a l y la distancia ser medida desde ah hasta el siguiente punto indicado por el usuario. StrMensaje (String), como viene siendo habitual, es un valor opcional. NOTA: En principio la distancia medida con GetDistance es un distancia Aprenderemos al ver el mtodo InitializeUserInput que esto puede modificarse. 3D.
GetInput. Este mtodo Se utiliza inmediatamente despus de alguno de los otros mtodos de solicitud (Get...), para detectar si el usuario ha dado alguna respuesta textual desde el teclado. Devuelve el texto introducido desde el teclado. Su sintaxis es: StrCadenaDevuelta = ObjUtilidad .GetInput NOTA: Veremos ms adelante algn InitializeUserInput) que nos lo aclarar ms. ejemplo de este mtodo (despus de 122
123
GetInteger. Solicita del usuario que indique un nmero entero. Si no es as, rechaza el dato introducido y vuelve a solicit ar un nmero entero. Se permiten valores enteros negativos y el valor 0, a no ser que se especifique lo contrario mediante el mtodo InitializeUserInput. La sintaxis de GetInteger es: IntValorEntero = ObjUtilidad .GetInteger( StrMensaje) StrMensaje es opcional y funciona como en los mtodos explicados anteriormente. NOTA: Ms aclaraciones sobre este y otros mtodos tras InitializeUserInput . GetKeyword. Solicita del usuario que indique la palabra clave que le interesa. El mensaje de solicitud ofrec er, lgicamente, las opciones posibles con las abreviaturas en maysculas para que el usuario sepa a qu atenerse. Previamente, se habr utilizado el mtodo InitializeUserInput para establecer las palabras clave permitidas. Su sintaxis: StrPalabraClave = ObjUtilidad .GetKeyword( StrMensaje) StrMensaje es opcional y funciona como en los mtodos explicados anteriormente. GetOrientation. Funciona de manera muy similar a GetAngle, con la nica diferencia de que los ngulos se miden siempre desde el origen por defecto (posicin de las 3 en el reloj o punto cardinal Este), independientemente del establecido en AutoCAD (variable de ANGBASE). Este mtodo se emplea sobre todo para mediar ngulos absolutos y su sintaxis es: DblOrientacin = ObjUtilidad .GetOrientation( DblPtoBase, Los argumentos funcionan igual que en GetAngle. GetPoint. GetPoint solicita al usuario un punto que podr ser marcado en pantalla o introducido por teclado: VarPunto = ObjUtilidad.GetPoint( DblPtoBase, StrMensaje) StrMensaje )
Si se indica un punto Double de base (opcional), el cursor aparece enganchado mediante una lnea elstica a dicho punto. StrMensaje funciona igual que en mtodos anteriores y tambin es opcional. La siguiente macro de ejemplo se utiliza para dibujar rectngulos mediante polilneas con slo marcar dos puntos en pantalla: el primero controlado por un GetPoint y el segundo con un GetCorner, para poder ver el rectngulo final en tiempo real antes de ser dibujado: Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim AcadUtil As Object Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace 123
124
Set AcadUtil = AcadDoc.Utility Dim Punto1, Punto2 Dim PuntoTras(2) As Double Dim PuntosPol(9) As Double Punto1 = AcadUtil.GetPoint(, "Primera esquina: ") PuntoTras(0) = Punto1(0): PuntoTras(1) = Punto1(1): PuntoTras(2) = Punto1(2) Punto2 = AcadUtil.GetCorner(PuntoTras, "Esquina opuesta: ") PuntosPol(0) = Punto1(0): PuntosPol(1) = Punto1(1) PuntosPol(2) = Punto2(0): PuntosPol(3) = Punto1(1) PuntosPol(4) = Punto2(0): PuntosPol(5) = Punto2(1) PuntosPol(6) = Punto1(0): PuntosPol(7) = Punto2(1) PuntosPol(8) = Punto1(0): PuntosPol(9) = Punto1(1) Call AcadDoc.ModelSpace.AddLightWeightPolyline(PuntosPol) End Sub Lo primero que se hace, tras declarar las variables, es solicitar el primer punto del rectngulo. Se realiza ahora un trasvase de coordenadas (de Variant a Double) para podrselas suministrar al mtodo GetCorner como punto base. Se pide el segundo punto (el cursor permanecer enganchado al primero mediante un rectngulo elstico) y se calculan los puntos para la polilnea que dibujar el rectngulo. Una nota importante que debemos resear de este ejemplo es la manera de dibujar la polilnea. Ntese que por primera vez en estas pginas, en lugar de utilizar el mtodo como explicamos en su momento, lo hemos usado con Call. Es momento ahora de decir que esto es perfectamente factible con todos los mtodos de dibujo de entidades. Lo que ocurre, es que normalmente se utiliza la otra manera (guardando el objeto resultante en una variable de objeto) para despus tener acceso absoluto a la entidad dibujada: cambiar su color, su tipo de lnea, etctera o utilizar cualquiera de las propiedades o mtodos de ella. Ahora bien, en momentos en los que no nos interese de una entidad ms que su puro dibujo, se puede utilizar esta tcnica. NOTA: Percatmonos que declarar un matriz con (2) elementos es igual que hacerlo con (1 To 3) ele mentos. En este segundo caso los ndices variaran de 1 a 3, y en el primero de 0 a 2; lo que da un total de tres elementos en ambos casos. GetReal. Solicita del usuario que indique un nmero real. Si no es as, rechaza el dato introducido y vuelve a solicitar un nmero real. Si se indica un nmero entero, es aceptado como real. La sintaxis de GetReal es: DblValorReal = ObjUtilidad.GetReal (StrMensaje ) StrMensaje es opcional y funciona como en los mtodos explicados anteriormente. GetString. Acepta un cadena de texto introducida por el usuario. Si contiene ms de 132 caracteres, slo devuelve los primeros 132 caracteres. Sintaxis: StrCadena = ObjUtilidad .GetString (BooModo, StrMensaje) El modo es un valor Boolean (True o False) que indica si la cadena de texto puede contener espacios en blanco. Si es verdadero se admiten espacios y el texto introducido por teclado debe terminarse con INTRO. Si es falso, el primer espacio se considerar como un INTRO y terminar el texto. Si no se introduce ningn texto y se pulsa directamente INTRO, se devuelve una cadena vaca. 124
125
InitializeUserInput . Este mtodo establece limitaciones para aceptar los datos introducidos por el usuario, y tambin permite especificar palabras clave para ser aceptadas como nombres de opcin. Veamos la sintaxis de utilizacin: Call ObjUtilidad .InitializeUserInput (IntModo, StrPalabrasClave )
La mayora de los mtodos Get... que hemos visto se parecen enormemente (hasta algunos en los nombres) a las funciones GET... de AutoLISP que realizaban los mismos cometidos. Evidentemente necesitaremos pues un mtodo como InitializeUserInput que haya opcin de aadir justo antes de cualquier Get... para filtrar sus resultados; es lo que hacamos en AutoLISP con INITGET. IntModo es un valor entero (Integer) con cdigo de bits que determina las limitaciones impuestas al usuario. Los modos posibles coinciden con los de la funcin INITGET de AutoLISP y se encuentran en la siguiente tabla:
Valor de bit
1 2 4 8 16 32 64 128
Modo
No admite valores nulos, es decir, INTRO como respuesta. No admite el valor cero (0). No admite valores negativos. No verifica lmites, aunque estn activados. (No se utiliza). Dibuja la lnea o el rectngulo elsticos con lnea de trazos en lugar de continua. Hace que la funcin GETDIST devuelva distancias 2D. Permite introducir datos arbitrarios por teclado. Tiene prioridad sobre el valor 1.
Al indicar un modo se pueden sumar varios de los bits. Por ejemplo, para impedir que el usuario indique un valor cero, nulo (es decir INTRO) y/o negativo, el modo que se especificar ser 7 (1 + 2 + 4). Este mtodo debe invocarse justo antes del mtodo Get... que limita. Los modos que tienen sentido para cada mtodo Get... tambin coinciden con los correspondientes de AutoLISP y se encuentran en la siguiente tabla:
Mtodo
8 8
32 32 32 32 32
64
NOTA: El modo no es opcional, y si no se desea ninguno hay que especificar un valor 0. El segundo parmetro (String) es una cadena que define las palabras clave vlidas como nombres de opciones. Estas se indican entre comillas, separadas por un espacio en blanco, y con la abreviatura en maysculas. La abreviatura es el mnimo nmero de caracteres en que debe coincidir la respuesta del usuario con una de las palabras clave vlidas. El mtodo 125
126
siempre devuelve la palabra tal y como est escrita en InitializeUserInput . La solicitud de palabra clave se realiza mediante el mtodo GetKeyword. Por ejemplo: Call AcadUtil.InitializeUserInput (7, "Alta Baja Normal") Op = AcadUtil.GetKeyword ("Precisin Alta/Baja/Normal: ") En el ejemplo se supone que las variables AcadUtil y Op ya han sido definidas. El mtodo GetKeyword solicita del usuario una opcin. Si ste desea la opcin Alta, puede indicar a, al, alt o alta, y en todos los casos la variable Op almacena el valor Alta.
127
Establecer la sentencia On Error Resume Next para que el programa no se detenga al producirse un error. Establecer un modo en InitializeUserInput con 129 como sumando. Detectar si ha habido error, examinando si Err.Number es diferente de 0. Detectar si el error se debe a texto del teclado, examinando si Err.Description = "La entrada de usuario es una palabra clave" Recuperar el texto introducido por teclado, mediante GetInput . Examinar si ese texto es una cadena vaca "". El siguiente ejemplo muestra cmo aceptar una opcin por defecto desde GetInteger. Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim AcadUtil As Object Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set AcadUtil = AcadDoc.Utility Dim Prec As Integer Dim HayClave As Boolean Dim ValorClave As String On Error Resume Next Call AcadUtil.InitializeUserInput(135) Prec = AcadUtil.GetInteger("Valor de precisin <50>: ") If Err.Description = "La entrada de usuario es una palabra clave" Then HayClave = True Else HayClave = False End If ValorClave = AcadUtil.GetInput If Err.Number <> 0 Then If HayClave And ValorClave = "" Then Prec = 50 Else GoTo Errores End If Err.Clear ... resto del cdigo ... End Errores: MsgBox "*NO VALE*" End Sub El modo empleado en InitializeUserInput es 135 ( 1 + 2 + 4 + 128). Esto impide valores negativos 0, pero no INTRO, debido a que el modo 128 prevalece sobre el 1. Mediante GetInteger se solicita un nmero entero. La variable Prec se define como Integer y acepta la respuesta del usuario. Si ste indica un valor negativo o cero, se rechaza y se vuelve a solicitar. Si indica un valor entero positivo ste se almacena en Prec, el valor de Err.Number es 0 por lo que no se ejecuta la sentencia dentro del If, y Prec mantiene su valor para el resto del programa.
127
128
Si el usuario cancela mediante ESC, se produce un error. La variable HayClave, definida como Boolean, almacena el resultado verdadero o falso de comparar Err.Description con el texto de descripcin, en este caso False. Por eso dentro de la sentencia de If no se cumplir la condicin y el programa saltar a la subrutina Errores, que por simplificar consiste simplemente en mostrar un cuadro de dilogo de aviso con el mensaje *NO VALE*. Si el usuario pulsa INTRO, tambin se produce un error al haberse sumado 1 al modo de InitializeUserInput . La descripcin del error s coincide con el texto indicado en el cdigo del programa. La variable ValorClave, definida como String, almacena el valor devuelto por GetInput que en este caso es una cadena vaca. Por lo tanto, se cumple la sentencia dentro del If y la variable Prec se iguala al valor por defecto 50. Si el usuario pulsa cualquier otra combinacin (un valor numrico con decimales o un texto), se produce un error con la descripcin de palabra clave. Pero GetInput devuelve el texto introducido en vez de cadena vaca, por lo que la sentencia dentro del If no cumplir su condicin, y se producir un salto a la subrutina de Errores. En todos los casos, la sentencia Err.Clear elimina la descripcin de error para que no se quede almacenada y pueda originar mal funcionamiento en la siguiente ejecucin del programa.
129
posible utilizar otros mecanismos especficos conociendo los tipos de errores producidos. dependiendo del diseo del programa y
Por ejemplo, cuando se define una variable como Integer y se le asigna el valor devuelto por GetInteger, si el usuario pulsa INTRO, VBA lo considera un tipo de dato inesperado y origina un error de desbordamiento con un valor de Err.Number igual a 6. Cualquier otro error, por ejemplo al cancelar mediante ESC, produce otro nmero diferente. Por lo tanto, un mecanismo sencillo para aceptar opciones por defecto es: Dim N As Integer Call AcadUtil.InitializeUserInput(6) On Error Resume Next N = AcadUtil.GetInteger("Precisin <3>: ") If Err.Number <> 0 Then If Err.Number = 6 Then N = 3 Else GoTo Errores End If Mediante el modo 6, el mtodo InitializeUserInput impide valores negativos y 0. La sentencia On Error Resume Next, hace que el programa no se detenga al producirse un error y contine normalmente. El mtodo GetInteger solicita un nmero entero. Si el usuario indica uno que no sea negativo ni 0, se acepta, el valor de Err.Number es 0, la condicional If no se cumple y el programa contina sin problemas. Si el usuario indica INTRO, se produce un error aunque el programa contina sin detenerse, el valor de Err.Number es 6, y entonces en la variable N se almacena el valor por defecto 3. Si se origina cualquier otro error (por ejemplo el usuario cancela mediante ESC), el valor de Err.Number es diferente de 0 y 6, y entonces la sentencia GoTo sa lta a una subrutina Errores, donde habr especificadas una serie de actuaciones y despus se abortar el programa.
130
por defecto. En caso contrario, en If no se realiza ninguna accin y el programa contina normalmente.
Otros mtodos
Crear una rutina de aceptacin de valores por defecto para los dems mtodos resulta sencillo, ya que slo hay que reflejarse en los ejemplos vistos hasta aqu y adecuar el ms preciso.
131
Si se produce un error inesperado, su descripcin no corresponder a la de palabra clave, y la sentencia dentro del If no se cumplir por lo que Else saltar a la subrutina Errores. Si se pulsa INTRO (en el ejemplo no se admite una opcin por defecto), ValorClave ser una cadena vaca, la sentencia dentro del If tampoco se cumplir y se saltar a la subrutina de Errores. Sigamos pues ahora con la explicacin de los mtodos que faltan del objeto Utility de utilidad. PolarPoint. Este mtodo obtiene el punto (matriz de tres elementos Double) a partir de otro punto dado (matriz de tres elementos Double), segn un ngulo en radianes (Double) y una distancia en las unidades actuales (Double). Es decir, obtiene un punto por coordenadas polares a partir de otro dado. La sintaxis de este mtodo es: DblPunto2 = ObjUtilidad .PolarPoint (DblPunto1, Dblngulo, DblDistancia ) En el siguiente ejemplo, se dibuja una lnea perpendicular desde el punto medio entre otros dos puntos, con una longitud especificada: Option Explicit Dim AcadDoc As Object Dim AcadModel As Object Dim AcadUtil As Object Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadModel = AcadDoc.ModelSpace Set AcadUtil = AcadDoc.Utility Dim VPunto1, VPunto2, VPuntoFinal Dim Punto1(2) As Double, Punto2(2) As Double Dim PuntoMedio(2) As Double, PuntoFinal(2) As Double Dim ngulo As Double, Distancia As Double Const PI = 3.1415926 Call AcadUtil.InitializeUserInput(1) VPunto1 = AcadUtil.GetPoint(, "Primer punto: ") Punto1(0) = VPunto1(0): Punto1(1) = VPunto1(1): Punto1(2) = VPunto1(2) Call AcadUtil.InitializeUserInput(1) VPunto2 = AcadUtil.GetPoint(Punto1, "Segundo punto: ") Punto2(0) = VPunto2(0): Punto2(1) = VPunto2(1): Punto2(2) = VPunto2(2) PuntoMedio(0) = ((Punto1(0) + Punto2(0)) / 2) PuntoMedio(1) = ((Punto1(1) + Punto2(1)) / 2): PuntoMedio(2) = Punto1(2) ngulo = AcadUtil.AngleFromXAxis(Punto1, Punto2) Distancia = AcadUtil.GetDistance(PuntoMedio, "Distancia en perpendicular: ") VPuntoFinal = AcadUtil.PolarPoint(PuntoMedio, ngulo + PI / 2, Distancia) PuntoFinal(0) = VPuntoFinal(0) PuntoFinal(1) = VPuntoFinal(1) PuntoFinal(2) = VPuntoFinal(2) Call AcadDoc.ModelSpace.AddLine(PuntoMedio, PuntoFinal) End Sub Los puntos Punto1 y Punto2 (VPunto1 y VPunto2 en su definicin Variant) son solicitados por el programa, sin permitir INTRO como respuesta nula. Pueden ser los extremos de una lnea ya dibujada o dos puntos cualesquiera. A continuaci n, el programa calcula el 131
132
punto medio PuntoMedio haciendo medias aritmticas con las coordenadas X e Y. Mediante el mtodo AngleFromXAxis calcula el ngulo absoluto entre los puntos 1 y 2. Despus solicita la distancia en perpendicular y calcula el punto PuntoFinal a partir del punto medio, llevando la distancia a un ngulo que resulta de sumar PI / 2 al ngulo absoluto entre 1 y 2. La ltima operacin es dibujar una lnea entre los dos ltimos puntos. RealToString. RealToString convierte el valor propo rcionado, el cual ser real (Double), a cadena de texto de acuerdo con las unidades y los decimales de precisin indicados: StrRealCadena = ObjUtilidad .RealToString( DblValorReal, IntUnidades, IntPrecis)
DblValorReal es, como hemos dicho, un valor Double. IntUnidades es un valor Integer que admite las mismas constantes explicadas en el mtodo DistanceToReal y que representa las unidades a las que se convertir el valor real. IntPrecis especifica la precisin en decimales del nmero real, el cual se convertir a cadena. Este ltimo argumento admite un valor entre 0 y 8 (siempre entero). En la siguiente rutina: Dim TxValor As String TxValor = AcadUtil.RealToString(326.7539, MsgBox TxValor el valor devuelto ser la cadena "326 3/4". StartUndoMark. Este mtodo coloca una seal de inicio del comando DESHACER en el lugar del programa que se utilice. Su sintaxis es: ObjUtilidad .StartUndoMark Esta caracterstica se corresponde con la opcin Inicio (BEgin en ingls) del comando DESHACER (UNDO en ingls) de AutoCAD. NOTA: Vase en esta misma seccin el mtodo EndUndoMark que coloca marcas de fin de DESHACER. TranslateCoordinates . Convierte un punto o vector de desplazamiento de un sistema de coordenadas de origen a otro de destino: VarPtoConvertido = ObjUtilidad.TranlateCoordinates( DblPtoOriginal, IntSisDestino, BooDesplazamiento ) IntSisOrigen ,
acFractional, 2)
BooDesplazamiento es un valor Boolean que indica si la matriz de tres valores Double que es DblPtoOriginal se considera un vector de desplazamiento. Si es verdadero, se considera un vector de desplazamiento. Si es falso, se considera un punto. Los sistemas de coordenadas de origen y destino se indican mediante un cdigo de nmero entero (Integer). Para mayor facilidad y comodidad existen cuatro constantes que tambin se pueden especificar: acWorld acUCS acDisplayDCS acPaperSpaceDCS
Estas constantes se corresponden con los distintos sistemas de coordenadas que se utilizan en la interfaz grfica de AutoCAD (Sistema de Coordenadas Univ ersal o SCU, Sistema 132
133
de Coordenadas Personal o SCP, Sistema de Coordenadas de Visualizacin o SCV y Sistema de Coordenadas de Espacio Papel o SCEP). En esta rutina (utilizando las convenciones que arrastramos desde el inicio de esta seccin): Dim VarPtoOr, VarPtoDest VarPtoOr = AcadUtil.GetPoint(, "Punto que convertir: ") VarPtoDest = AcadUtil.TranslateCoordinates(VarPtoOr, acUCS, acWorld, False) el mtodo GetPoint solicita indicar un punto, ste se acepta en la variable (definida como Variant) VarPtoOr y despus se convierte desde el SCP actual al SCU, indicando un valor False de desplazamiento para que no se considere un vector. NOTA: Recurdese que no declarar una variable con un tipo concreto es lo mismo que declararla como Variant. A continuacin estudiaremos un programa que resulta muy jugoso como repaso de todo lo que hemos estudiado hasta ahora. Este programa maneja un cuadro de dilogo (formulario) que es el que se observa en la pgina siguiente. Como vemos, resulta ser un programa para dibujar agujeros para tornillos en alzado. Se indica primero el tipo de agujero (con cajera recta, con cajera avellanada o sin cajera). Despus hemos de introducir en las diferentes casillas los distintos valores necesarios para dibujar el agujero. Al pulsar el botn Aceptar se nos solicitar el punto y el ngulo de insercin, tras lo cual se dibujar el agujero con la lnea de ejes en una capa llamada EJES, con tipo de lnea TRAZO_Y_PUNTO y color rojo. El botn Cancelar termina el programa. Veamos, tras el diseo del letrero, el cdigo VBA de este programa complejo . ya un poco
133
134
Option Explicit Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim AcadDoc As Object, AcadUtil As Object AcadObj As Object, AcadEje As Object, AcadCapa As Object VPt0, VPt1, VPt2, VPt3, VPt4, VPt5 VPtgj, VPt1Eje, VPt2Eje DiamAgujero0, ProfAgujero0, DiamCajera0, ProfCajera0 Pt0(2) As Double Pt1(2) As Double, Pt2(2) As Double, Pt3(2) As Double Pt4(2) As Double, Pt5(2) As Double Ptgj(2) As Double, Pt1Eje(2) As Double, Pt2Eje(2) As Double Refent0 As Integer, Angulo As Variant, PI As Double
Private Sub CajeraAvellanada_Click() DiamCajera.Enabled = True ProfCajera.Enabled = True Label3.Enabled = True Label4.Enabled = True Imagen.Picture = LoadPicture("cajera_avellanada.bmp") End Sub Private Sub CajeraRecta_Click() DiamCajera.Enabled = True ProfCajera.Enabled = True Label3.Enabled = True Label4.Enabled = True Imagen.Picture = LoadPicture("cajera_recta.bmp") End Sub Private Sub Cancelar_Click() End End Sub Private Sub Dibujar_Click() On Error GoTo Error Chequear If Errores.Caption = "" Then Else Exit Sub formAgujeros.Hide Call AcadUtil.InitializeUserInput(1) VPt0 = AcadUtil.GetPoint(, "Punto: ") Pt0(0) = VPt0(0): Pt0(1) = VPt0(1): Pt0(2) = VPt0(2) Call AcadDoc.SetVariable("osmode", 512) Call AcadUtil.InitializeUserInput(1) Angulo = AcadDoc.Utility.GetAngle(VPt0, "Angulo (Cerca de): ") PI = 3.14159265359 If SinCajera.Value = True Then VPtgj = VPt0 DibAgujero Else DibCajera DibAgujero End If VPt1Eje = AcadDoc.Utility.PolarPoint(Pt0, Angulo + PI, 5) Pt1Eje(0) = VPt1Eje(0): Pt1Eje(1) = VPt1Eje(1): Pt1Eje(2) = VPt1Eje(2): VPt2Eje = AcadDoc.Utility.PolarPoint(Pt3, Angulo, 5) Pt2Eje(0) = VPt2Eje(0): Pt2Eje(1) = VPt2Eje(1): Pt2Eje(2) = VPt2Eje(2): Set AcadEje = AcadObj.AddLine(Pt1Eje, Pt2Eje) On Error Resume Next If IsEmpty(AcadDoc.Linetypes.Item("trazo_y_punto")) Then Call AcadDoc.Linetypes.Load("trazo_y_punto", "acadiso.lin") End If 134
135
If IsEmpty(AcadDoc.Layers.Item("ejes")) Then Set AcadCapa = AcadDoc.Layers.Add("ejes") AcadCapa.Linetype = "trazo_y_punto" AcadCapa.Color = 1 End If AcadEje.Layer = "ejes" Call AcadDoc.SetVariable("osmode", Refent0) Open "agujeros.$vr" For Output As #1 Write #1, DiamAgujero, ProfAgujero, DiamCajera, ProfCajera Close #1 Error: MsgBox "NO End Sub
Private Sub DibCajera() VPt1 = AcadUtil.PolarPoint(Pt0, Angulo - (PI / 2), Val(DiamCajera) / 2) Pt1(0) = VPt1(0): Pt1(1) = VPt1(1): Pt1(2) = VPt1(2) VPt2 = AcadUtil.PolarPoint(Pt1, Angulo, Val(ProfCajera)) Pt2(0) = VPt2(0): Pt2(1) = VPt2(1): Pt2(2) = VPt2(2) VPt3 = AcadUtil.PolarPoint(Pt2, Angulo + (PI / 2), Val(DiamCajera)) Pt3(0) = VPt3(0): Pt3(1) = VPt3(1): Pt3(2) = VPt3(2) VPt4 = AcadUtil.PolarPoint(Pt3, Angulo + PI, Val(ProfCajera)) Pt4(0) = VPt4(0): Pt4(1) = VPt4(1): Pt4(2) = VPt4(2) If CajeraAvellanada.Value = True Then VPt1 = AcadUtil.PolarPoint(Pt1, Angulo - (PI Pt1(0) = VPt1(0): Pt1(1) = VPt1(1): Pt1(2) = End If If CajeraAvellanada.Value = True Then VPt4 = AcadUtil.PolarPoint(Pt4, Angulo + (PI Pt4(0) = VPt4(0): Pt4(1) = VPt4(1): Pt4(2) = End If
Call AcadObj.AddLine(Pt1, Pt2) Call AcadObj.AddLine(Pt2, Pt3) Call AcadObj.AddLine(Pt3, Pt4) VPtgj = AcadUtil.PolarPoint(Pt0, Angulo, Val(ProfCajera)) End Sub Private Sub DibAgujero() Ptgj(0) = VPtgj(0): Ptgj(1) = VPtgj(1): Ptgj(2) = VPtgj(2) VPt1 = AcadUtil.PolarPoint(Ptgj, Angulo - (PI / 2), Val(DiamAgujero) / 2) Pt1(0) = VPt1(0): Pt1(1) = VPt1(1): Pt1(2) = VPt1(2) VPt2 = AcadUtil.PolarPoint(Pt1, Angulo, Val(ProfAgujero)) Pt2(0) = VPt2(0): Pt2(1) = VPt2(1): Pt2(2) = VPt2(2) VPt3 = AcadUtil.PolarPoint(Pt2, Angulo + (PI / 2), Val(DiamAgujero) / 2) Pt3(0) = VPt3(0): Pt3(1) = VPt3(1): Pt3(2) = VPt3(2) VPt3 = AcadUtil.PolarPoint(Pt3, Angulo, Val(DiamAgujero) / 4) Pt3(0) = VPt3(0): Pt3(1) = VPt3(1): Pt3(2) = VPt3(2) VPt4 = AcadUtil.PolarPoint(Pt2, Angulo + (PI / 2), Val(DiamAgujero)) Pt4(0) = VPt4(0): Pt4(1) = VPt4(1): Pt4(2) = VPt4(2) VPt5 = AcadUtil.PolarPoint(Pt4, Angulo + PI, Val(ProfAgujero)) Pt5(0) = VPt5(0): Pt5(1) = VPt5(1): Pt5(2) = VPt5(2) Call Call Call Call Call AcadObj.AddLine(Pt1, Pt2) AcadObj.AddLine(Pt2, Pt4) AcadObj.AddLine(Pt4, Pt5) AcadObj.AddLine(Pt2, Pt3) AcadObj.AddLine(Pt3, Pt4)
136
End Sub Private Sub Chequear() If Val(DiamAgujero) <= 0 Then Errores.Caption = "Dimetro de agujero debe ser mayor o igual que 0" DiamAgujero.SelStart = 0: DiamAgujero.SelLength = Len(DiamAgujero) DiamAgujero.SetFocus: Exit Sub End If If Val(ProfAgujero) <= 0 Then Errores.Caption = "Profundidad de agujero debe ser mayor o igual que 0" ProfAgujero.SelStart = 0: ProfAgujero.SelLength = Len(ProfAgujero) ProfAgujero.SetFocus: Exit Sub End If If Cajera.Enabled = True Then If Val(DiamCajera) <= Val(DiamAgujero) Then Errores.Caption = "Dimetro de cajera debe ser mayor que el de agujero" DiamCajera.SelStart = 0: DiamCajera.SelLength = Len(DiamCajera) DiamCajera.SetFocus: Exit Sub End If End If If Cajera.Enabled = True Then If Val(ProfCajera) <= 0 Then Errores.Caption = "Profundidad de cajera debe ser mayor o igual que 0" ProfCajera.SelStart = 0: ProfCajera.SelLength = Len(ProfCajera) ProfCajera.SetFocus: Exit Sub End If End If Errores.Caption = "" End Sub Private Sub UserForm_Initialize() Set AcadDoc = GetObject(, "Autocad.Application").ActiveDocument Set AcadUtil = AcadDoc.Utility Set AcadObj = AcadDoc.ModelSpace On Error Resume Next Refent0 = AcadDoc.GetVariable("osmode") Open "agujeros.$vr" For Input As #1 If Err.Description = "No se encontr el archivo" Then GoSub Defecto Input #1, DiamAgujero0, ProfAgujero0, DiamCajera0, ProfCajera0 DiamAgujero = DiamAgujero0 ProfAgujero = ProfAgujero0 DiamCajera = DiamCajera0 ProfCajera = ProfCajera0 Close #1 Exit Sub Defecto: Open "agujeros.$vr" For Append As #1 Write #1, "10", "10", "20", "5" Close #1 Open "agujeros.$vr" For Input As #1 Return End Sub Private Sub SinCajera_Click() DiamCajera.Enabled = False ProfCajera.Enabled = False Label3.Enabled = False Label4.Enabled = False Imagen.Picture = LoadPicture("sin_cajera.bmp")
137
End Sub Iremos comentando cada procedimiento Sub por separado y no en el orden en que estn en el listado, sino en uno quiz ms lgico. (General)_(Declaraciones) Aqu como siempre se declaran todas las variables que luego utilizaremos, tanto las de objeto (Object), como Variant y Double. Recordar la necesidad de tener un doble juego de variables, unas Variant y otras Double, para hacer trasvase al obtener un punto y luego querer utilizarlo. UserForm_Initialize() Este es el procedimiento que se ejecuta nada ms correr el programa, al inicializarse el formulario. Lo primero es lo de siempre, esto es, asignar a cada objeto de AutoCAD que vamos a necesitar su valor correspondiente. Despus se utiliza la sentencia On Error Resume Next para controlar la apertura del archivo que vamos a explicar ahora. Luego se guarda en Refent0 el valor de la variable OSMODE de AutoCAD; ya veremos para qu. As como AutoLISP guarda los valores de las variables globales utilizadas hasta cerrar AutoCAD, con VBA no disponemos de esa ventaja. Es por ello que, dada la caracterstica de los programas para AutoCAD que poseen la capacidad de almacenar los ltimos valores utilizados como valores por defecto, nos vamos a inventar un mtodo para que esto suceda tambin en nuestros programas VBA. El sencillo mtodo consiste simplemente en crear un archivo de texto donde se almacenarn, en cada ejecucin del programa, los ltimos valores utilizados. De este modo, al correr de nuevo el programa, se leern dichos valores y se introducirn en el cuadro para ofrecerlos por defecto. De esta manera intentamos leer el archivo que almacenar los valores (AGUJEROS.$VR ) en el directorio actual. Si no existiera se producira un error, por lo que la ejecucin sigue en la siguiente lnea (recordemos el On Error Resume Next). En esta lnea se compara el texto del error con el que significa que el archivo no se ha encontrado y, si fueran iguales, la ejecucin se dirige a la subrutina Defecto donde se crea y se le aaden unos valores por defecto. Tanto si existiera como si estuviera recin creado, se contina la ejecucin leyendo los valores del archivo e introducindolos en el cuadro. NOTA: Es ms lgico utilizar los valores numricos de Err en lugar de sus descripciones, ya que podra utilizarse as en cualquier plataforma idiomtica VBA. Para hallar el nmero de un error (si no disponemos de una lista), slo hemos de provocarlo y extraer el valor con Err.Number. SinCajera_Click() Este procedimiento y los dos siguientes dicen referencia a la hora de hacer clic en alguno de los tres botones excluyentes para elegir el tipo de agujero. Este concretamente responde al evento de hacer clic en el botn excluyente Sin cajera. Al hacerlo, tanto la casillas de profundidad de cajera como la de dimetro de la cajera, as como sus etiquetas, deben inhabilitarse. Tambin se refleja en el cuadro de imagen el archivo .BMP correspondiente.
138
CajeraRecta_Click() Al igual que en el anterior procedimiento explicado, en CajeraRecta_Click() se muestra la imagen correspondiente en el cuadro de imagen y se establecen como habilitadas las casillas y etiquetas de profundidad y dimetro de cajera por si al hacer clic en Cajera recta se proviniera de Sin cajera, la cual las desactiva c omo sabemos. CajeraAvellanada_Click() As tambin, en este procedimiento Sub se muestra la imagen correspondiente con una cajera avellanada en el cuadro de imagen, y tambin se establecen como habilitadas las casillas y etiquetas de profundidad y dime tro de cajera por si al hacer clic en Cajera avellanada se proviniera de Sin cajera. Dibujar_Click() Este es el procedimiento que arranca al ser pulsado el botn Aceptar . Lo primero que hace es definir una rutina de errores que controlar salidas no deseadas, por ejemplo (como al pulsar ESC), u otros errores no deseados. Despus se llama al procedimiento de chequeo de casillas, el cual se comentar seguido de ste. Tras ocultar el formulario (letrero de dilogo) se pregunta por el punto de insercin del agujero (sin admitir INTRO como respuesta) y se guardan sus coordenadas en VPt0. Seguidamente se hace el trasvase de variables con Pto0, que ser la que se utilice para el dibujo. Se establece el valor de OSMODE a 512 (Cercano) y se pide el ngulo de insercin. Y tras establecer el valor de PI se comprueba si el agujero tiene cajera o no. Si no tuviera se llama nicamente a la rutina de dibujo del agujero y, si tuviera cajera (recta o avellanada), se llama primero a la rutina que dibuja la cajera y luego a la del agujero. Adems, el hecho de no tener cajera hace que el punto de insercin sea igual al primer punto de dibujo del agujero Las sentencias siguientes se corresponden con los clculos de los puntos del eje de simetra. Adems se carga el tipo de lnea si no est cargado y se crea la capa si no existe que pertenecern al eje. A esta ltima se le asigna el tipo de lnea cargado y el color rojo. Por ltimo se reasigna a la variable OSMODE su valor original (por eso lo guardamos en Refent0) y se guardan los valores utilizados en el archivo de valores por defecto. NOTA: Recurdese que antes de finalizar este procedimiento ha habido que pasar por otros dos o tres: el de chequeo, el de dibujo de cajera y el de dibujo de agujero. Estos se estudian ahora por ese orden. Chequear() Aqu se comprueban los valores de cada casilla y, si alguno estuviera errado, se muestra un mensaje en una lnea de errores inferior (que es una etiqueta), se selecciona el texto de la casilla y se sale de procedimiento. Al haber error el texto de la lnea inferior es diferente que una cadena vaca. Si no hay error este texto es igual a la cadena vaca (""). Repsese el cdigo del procedimiento anterior para ver cmo se controla despus esto. DibCajera() Para dibujar la cajera se calculan todos los puntos necesarios y se dibuja. Tambin se
139
tiene en cuenta si es recta o avellanada. DibAgujero() Para dibujar el agujero se calculan todos los puntos y se dibuja. NOTA: Recurdese que tras este procedimiento Sub se sigue en Dibujar_Click() . Cancelar_Click() Este Sub nicamente dice que al pulsar el botn Cancelar se acabe el programa, sin ms. NOTA: Evidentemente, para que este programa funcione, habrn de estar los archivos .B MP en el directorio actual de trabajo.
140
DOCE.10. EL TRAZADO
El trazado o plotteado de dibujos desde el VBA de AutoCAD se maneja mediante el objeto de trazado llamado Plot. Si comprobamos la lista jerrquica de objetos, ste es descendiente directo del documento actual activo (ActiveDocument ). Como siempre, si vamos a utilizarlo mucho en un programa podemos declarar una variable para l, y despus asignarle su valor, por ejemplo as: Option Explicit Dim AcadDoc As Object Dim AcadPlot As Object y luego: Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadPlot = AcadDoc.Plot
Vemos que este objeto posee diferentes propiedades (algunas ya conocidas) y mtodos que habremos de utilizar con conveniencia para asegurar un trazado fidedigno. Por ello vamos a pasar directamente a su explicacin. AdjustAreaFill. Obtiene y/o asigna el estado actual de activacin de ajuste de rea de relleno para el trazado. La variable que lo recoja o el valor que se asigne sern ambos tipo Boolean; siendo True la opcin para activado y False la opcin para desactivado. La sintaxis para asignar un valor es la siguiente: ObjetoTrazado.AdjustAreaFill = BooAjusteRelleno La sintaxis para obtener el valor actual es la que sigue: BooAjusteRelleno = ObjetoTrazado .AdjustAreaFill HideLines. Obtiene y/o asigna el estado actual de ocultacin de lneas para el trazado. La variable que lo recoja o el valor que se asigne sern ambos tipo Boolean; siendo True la opcin para activado y False la opcin para desactivado. La sintaxis para asignar un valor es la siguiente: ObjetoTrazado .HideLines = BooLneasOcultas
141
La sintaxis para obtener el valor actual es la que sigue: BooLneasOCultas = ObjetoTrazado .HideLine NOTA: Esta propiedad se refiere a los objetos del Espacio Modelo. Para ocultar lneas en las ventanas de Espacio Papel utilizamos la propiedad ya estudiada RemoveHiddenLines del objeto de ventana de Espacio Papel. PaperSize. Obtiene el tamao actual para el papel de impresin o trazado. Tambin permite asignar un tamao. La sintaxis para ello es: ObjetoTrazado .PaperSize = DblMatrizTamaos La sintaxis para obtener el tamao de papel actual asignado: VarMatrizTamaos = ObjetoTrazado .PaperSize DblMatrizTamaos es una matriz, tabla o array de dos elementos Double. El primero de ellos dice relacin a la anchura del papel, y el segundo a la altura del mismo. PlotOrientation. Esta propiedad PlotOrientation permite especificar y obtener una orientacin para el papel de trazado. Para asignar: ObjetoTrazado .PlotOrientation = IntOrientacin Para obtener: IntOrientacin = ObjetoTrazado.PlotOrientation IntOrientation es un valor Integer que adems admite las constantes siguientes: acPlotOrientationPortrait acPlotOrientationLandscape
Ambas constantes se refieren a la orientacin vertical (portrait ) o a la orientacin apaisada ( landscape ). PlotScale. PlotScale permite especificar y obtener una escala para el trazado. Para asignar: ObjetoTrazado .PlotScale = DblMatrizEscala Para obtener: VarMatrizEscala = ObjetoTrazado .PlotScale DblMatrizEscala es una matriz de dos valores tipo Double. El primero indica las unidades de trazado y el segundo las unida des de dibujo, es decir, unidades en el papel y unidades en el dibujo. NOTA: Si ambos valores son igual a 0, la escala se corresponde con Escala hasta ajustar del letrero de trazado/impresin de AutoCAD.
142
PlotUnits. PlotUnits permite obtener y/o asignar las unidades del trazado, es decir o milmetros (mtricas) o pulgadas (inglesas). Para asignar: ObjetoTrazado .PlotUnits = IntUnidades Para obtener: IntUnidades = ObjetoTrazado .PlotUnits IntUnidades es un valor Integer que tambin admite las siguientes constantes: acEnglish acMetric
Las dems propiedades ya estn estudiadas. Decir que, obviamente, la rotacin y el origen como propiedades en este objeto Plot (Rotation y Origin), se refieren a la rotacin y al origen del trazado con el mismo significado que en el cuadro de dilogo de AutoCAD. Pasemos a estudiar los mtodos. LoadPC2. Carga las especificaciones de trazado del archivo .PC2 especificado: ObjTrazado .LoadPC2( StrNombrePC2 ) StrNombrePC2 es un cadena (String) que indica el nombre del archivo y su ubicacin, por ejemplo: Option Explicit Dim AcadDoc As Object Dim AcadPlot As Object Sub Macro() Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadPlot = AcadDoc.Plot AcadPlot.LoadPC2 ("c:\autocad\xtras\cfgplot.pc2") End Sub NOTA: Estos archivos .PC2 tienen informacin del dispositivo de trazado, adems de todo el resto de caractersticas del trazado en s. No as ocurra con los archivos .PCP (de versiones anteriores a la 14 de AutoCAD), que nicamente guardaba n (y guardan, si se quieren utilizar) informacin del trazado; y se materializaban en el dispositivo actualmente establecido. PlotExtents. Define como rea de trazado la extensin del dibujo. Hay que tener en cuenta que esta extensin no se actualiza c uando hay reducciones en el dibujo, por lo que es recomendable hacer un Zoom Extensin antes de trazar el dibujo: ObjTrazado .PlotExtents PlotLimits. Define como rea de trazado los lmites del dibujo. Equivale, como sabemos, a realizar un Zoom Todo: ObjTrazado .PlotLimits
143
PlotPreview. Muestra la presentacin preliminar tpica de AutoCAD en cualquiera de sus dos versiones (segn se indique), parcial o total: ObjTrazado .PlotPreview( IntModoPresPrel ) IntModoPresPrel es un valor Integer que admite tambin las siguientes constantes: acPartialPreview acFullPreview
PlotToDevice. Realiza el trazado del dibujo en el dispositivo cuyo nombre se indica (String). Este nombre es aquel con el que se ha configurado dicho dispositivo. La lista de todos los dispositivos de impresin se encuentra tras el comando PREFERENCIAS (PREFERENCES en versiones sajonas) de AutoCAD, en la pestaa Impresora: ObjTrazado .PlotToDevice( StrDispositivo ) NOTA: Si StrDispositivo es una cadena vaca o nula ( ""), el trazado se enva al dispositivo trazador configurado por defecto actualmente. PlotToFile. Realiza el trazado del dibujo en el archivo cuyo nombre se indica (String). Por defecto, la extensin de los archivos de trazado es .PLT. ObjTrazado .PlotToFile( StrArchivo ) PlotView. Define como rea de trazado la vista cuyo nombre se indica como cadena (String): ObjTrazado .PlotView( StrVista) PlotWindow. Define como rea de trazado la ventana cuyas esquinas se especifican: ObjTrazado.PlotWindow(DblEsquinaSupIz, DblEsquinaInfDcha )
Las dos esquinas (superior izquierda e inferior derecha) son matrices de tres elementos Double cada una (X, Y y Z en el SCU). PlotWithConfigFile. Realiza el trazado del dibujo de acuerdo con las especificaciones que en el archivo de configuracin se indican. Este archivo puede ser un .PCP o un .PC2: ObjTrazado .PlotWithConfigFile( StrArchivoConfiguracin ) StrArchivoConfiguracin es un valor de cadena (String) con el nombre y la ruta del archivo en cuestin. SavePC2. Como contraposicin a LoadPC2, SavePC2 guarda las especificaciones de trazado en el archivo .PC2 especificado: ObjTrazado .SavePC2( StrNombrePC2 ) StrNombrePC2 es un cadena (String) que indica el nombre del archivo y su ubicacin. El procedimiento tpico para imprimir un dibujo desde VBA puede parecer extrao, pero no lo es tanto. Teniendo en cuenta que nicamente los mtodos PlotToDevice, PlotToFile y
144
PlotWithConfigFile envan realmente el documento al trazador o a la impresora, hemos de disear un algoritmo que nos permita seguir determinados pasos para la impresin tpica de un dibujo de AutoCAD. Evidentemente si deseamos enviar el trazado a un archivo, utilizaremos el mtodo PlotToFile del objeto de trazado Plot. Si ya disponemos de un archivo de configuracin de trazado .PCP o .PC2 a nuestro gusto, utilizaremos el mtodo PlotWithConfigFile . Pero lo lgico ser que nuestro programa se ejecute en mquinas de las cuales no conocemos su configuracin y, por lo tanto, no sabremos qu impresoras o qu plotters tienen instalados sus usuarios; o incluso si disponen de alguno instalado. Por lo tanto, los pasos lgicos a la hora de imprimir un dibujo sern los siguientes: Averiguar qu dispositivos de trazado hay instalados. Permitir al usuario elegir entre cualquiera de ellos. Permitir al usuario elegir las preferencias para la impresin o trazado. Enviar el dibujo al dispositivo elegido.
Para averiguar los dispositivos slo tenemos que extraer en un bucle todos los valores de la variable PLOTID, que guarda la descripcin del trazador configurado por defecto, apoyndonos en la variable PLOTTER, que cambia el trazador por defecto. Con este pequeo truco, la mayor parte del problema est resuelto. Pero para verlo correctamente, comentaremos un programa que permite imprimir el dibujo actual, ya sea en su extensin o en sus lmites. Veamos cmo sera el letrero de dilogo (formulario en VBA) que manejara este programa, por ejemplo:
Y ahora se muestra el cdigo VBA de susodicho: Option Explicit Dim AcadDoc As Object Dim AcadPlot As Object Dim StrPlot As String Dim NumPlot As Integer Private Sub UserForm_Initialize() On Error Resume Next
145
Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument Set AcadPlot = AcadDoc.Plot NumPlot = 0 Do Call AcadDoc.SetVariable("PLOTTER", NumPlot) If Err.Number <> 0 Then Exit Do StrPlot = AcadDoc.GetVariable("PLOTID") Dispositivo.AddItem StrPlot, NumPlot NumPlot = NumPlot + 1 Loop End Sub Private Sub Aceptar_Click() Dim ndice As Integer Dim Papel(1 To 2) As Double Dim Escala(1 To 2) As Double Dim Origen(1 To 3) As Double If Dispositivo.ListIndex = -1 Then MsgBox "Escoja un dispositivo": Exit Sub ndice = Dispositivo.ListIndex AcadPlot.PlotUnits = acMetric Papel(1) = 210: Papel(2) = 297 AcadPlot.PaperSize = Papel AcadPlot.PlotOrientation = acPlotOrientationPortrait Escala(1) = 0: Escala(2) = 0 AcadPlot.PlotScale = Escala Origen(1) = 0: Origen(2) = 0: Origen(3) = 0 AcadPlot.Origin = Origen AcadPlot.Rotation = 0 AcadPlot.AdjustAreaFill = True AcadPlot.HideLines = True If Extensin.Value = True Then AcadPlot.PlotExtents Else AcadPlot.PlotLimits End If Call AcadDoc.SetVariable("PLOTTER", ndice) StrPlot = AcadDoc.GetVariable("PLOTID") AcadPlot.PlotToDevice (StrPlot) End End Sub Private Sub Cancelar_Click() End End Sub Comentaremos el programa por procedimientos Sub. (General)_(Declaraciones) Se declaran las variables de objeto tpicas (objetos de AutoCAD) y alguna ms que nos ser til a lo largo del programa. UserForm_Initialize() Aqu, lo primero que se hace es establecer la condicin que dice que si existiera algn error, se continuara en la lnea siguiente (veremos para qu). Inmediatamente despus se 145
146
inicializan las variables de los objetos de AutoCAD (se les da valor). Las dos variables que hemos declarado al principio las vamos a utilizar aqu. NumPlot va a guardar un valor entero que va a ser el nmero de trazador, adems del ndice del cuadro de lista. StrPlot ser una variable de cadena que almacenar las distintas descripciones de los diferentes trazadores. Recordemos que al mtodo PlotToDevice hay que darle un nombre de descripcin de trazador. Lo que hace la siguiente serie de sentencias de este Sub es rellenar el cuadro de lista con las descripciones de los trazadores, impresoras u otros dispositivos (archivo en formato DXB, por ejemplo). Se inicializa NumPlot a 0. Se sigue con una estructura repetitiva aparentemente infinita; pero no es as. Veamos: Se introduce el valor de NumPlot (0) en la variable de sistema PLOTTER que, como hemos dicho, almacena un nmero que se corresponde con el trazador actual configurado. El valor de PLOTTER va desde 0 hasta el nmero de configuraciones de trazador menos uno (si son tres com o en el ejemplo, sern 0, 1 y 2); hasta un mximo de 29. El truco est en que, si damos un valor por encima de dicho nmero, PLOTTER devuelve un mensaje de error. Este mensaje es el que queremos captar con el On Error Resume Next del principio y con la sig uiente sentencia If Err.Number <> 0 Then Exit Do. Por lo tanto, si ha habido error se sale del bucle. Si no hay error se contina extrayendo la descripcin del trazador actual y guardndola en StrPlot. A continuacin de aade esa descripcin al cuadro de lista con el ndice igual al nmero de trazador. Se incrementa el valor de NumPlot en una unidad con el contador-suma (NumPlot = NumPlot + 1) y se vuelve a empezar. Ahora el trazador por defecto ser otro y la descripcin otra. Y as sucesivamente. En el momento en que se hayan aadido todos los dispositivos configurados, se produce el error controlado y se sale del bucle. Sigamos con lo que ocurre al pulsar el botn Aceptar . Aceptar_Click() Se dimensionan algunas variables que vamos a utilizar. A continuacin se controla si la propiedad ListIndex del cuadro de lista es igual a -1, lo que querra decir que no se ha seleccionado trazador alguno. En este caso se muestra un mensaje y se sale del procedimiento Sub, permitiendo as al usuario que elija un trazador. En el momento en que se elija uno se hace su ndice igual a la variable ndice. Recordemos que el ndice era igual al nmero del trazador. Se establece toda una serie de valores para la escala, las lneas ocultas, etctera. Algunos de ellos no pueden estar dispuestos en cualquier orden. Por norma general conviene hacer caso a la lgica y dar valores segn se hara en AutoCAD. As, resulta lgico establecer primero las unidades, luego el tamao del papel, la orientacin, la escala, el ori gen, la rotacin... Se controla tambin si el usuario eligi un plotteo de la extensin o de los lmites, actuando en consecuencia con el mtodo PlotExtents o PlotLimits. Por fin se establece en la variable de sistema de AutoCAD PLOTTER el valor del trazador (o ndice) escogido y se extrae de PLOTID la descripcin de ese trazador. Esta descripcin se proporciona al mtodo PlotToDevice y el proceso ha concluido. 146
147
Cancelar_Click() Aqu simplemente se termina el programa, sin ms.
Propiedades del objeto de preferencias: ActiveProfile AltFontFile AltTabletMenuFile Application ArcSmoothness AutoAudit AutoSaveFile AutoSaveInterval BeepOnError ConfigFile ContourLinesPerSurface CreateBackup CrosshairColor CursorSize CustomDictionary DefaultInternetURL DemandLoadARXApp DisplayDraggedObject DisplayScreenMenu DisplayScrollBars DisplaySilhouette DockedVisibleLines DriversPath EnableStartupDialog FontFileMap FullCrcValidation GraphicFont GraphicFontSize GraphicFontStyle GraphicsTextBackgrndColor GraphicsTextColor GraphicsWinBackgrndColor HistoryLines HelpFilePath IncrementalSavePercent KeyboardAccelerator KeyboardPriority LicenseServer LogFileName LogFileOn MainDictionary MaxActiveViewports MaxAutoCADWindow MaxNumOfSymbols MeasurementUnits MenuFile MonochromeVectors PersistentLISP PostScriptPrologFile PrintFile PrintSpoolerPath PrintSpoolExecutable ProxyImage RenderSmoothness SavePreviewThumbnail SegmentPerPolyline ShowProxyDialogBox ShowRasterImage SupportPath TempFileExtension TempFilePath TemplateDWGPath TempXRefPath
147
148
TextEditor TextFontStyle TextWinBackgrndCol or TextFont TextFrameDispl ay TextWinTextCol or TextFontSize TextureMapPa th XRefDemandLo ad
GetProjectFilePa th SetProjectFilePa th La ingente cantidad de propiedades que hemos de explicar la dividiremos en grupos temticos para su ptimo aprendizaje. Estos grupos se corresponden (la mayora) con las diferentes pestaas del cuadro Preferencias de AutoCAD. Comencemos pues sin ms dilacin.
ExportProfile ResetProfile
149
ConfigFile. Obtiene la localizacin del archivo de configuracin de AutoCAD (por defecto ACAD14.CFG). Su sintaxis es: StrArchivoConfig = ObjetoPreferencias .ConfigFile StrArchivoConfig (nombre y ruta al archivo) es tipo de dato String. NOTA: La manera de asignar otra ubicacin a este archivo de configuracin se explicar en el APNDICE H, sobre la configuracin general del programa, ya que esto se realiza desde las propiedades del acceso directo al ejecutable principal. CustomDictionary. Especifica la localizacin de un diccionario personalizado si existe. La sintaxis para asignar: ObjetoPreferencias.CustomDictionary La sintaxis para obtener: StrArchivoDiccionario = ObjetoPreferencias .CustomDictionary StrArchivoDiccionario (nombre y ruta al archivo) es tipo de dato String. DefaultInternetURL. Especifica la localizacin URL del sitio WWW configurado por defecto. La sintaxis para asignar: ObjetoPreferencias.DefaultInternetURL La sintaxis para obtener: StrURL = ObjetoPreferencias .DefaultInternerURL StrURL es tipo de dato String. DriversPath. Especifica el directorio en el cual AutoCAD buscar controladores (drivers) de dispositivos ADI para el monitor, dispositivos sealadores, impresoras y trazadores. La sintaxis para asignar: ObjetoPreferencias.DriversPath La sintaxis para obtener: StrDirectorioControladores = ObjetoPreferencias .DriversPath StrDirectorioControladores es tipo de dato String. FontFileMap. Especifica la localizacin del archivo de representacin de tipos de letra o fuentes, es decir, el archivo que define cmo AutoCAD convertir las fuentes que no pueda encontrar. 149 = StrDirectorioControladores = StrURL = StrArchivoDiccionario
150
La sintaxis para asignar: ObjetoPreferencias.FontFileMap La sintaxis para obtener: StrArchivoRepFuentes = ObjetoPreferencias .FontFileMap StrArchivoRepFuentes (nombre y ruta al archivo) es tipo de dato String. HelpFilePath. Especifica la localizacin del archivo de ayuda de AutoCAD. La sintaxis para asignar: ObjetoPreferencias.HelpFilePath La sintaxis para obtener: StrDirectorioAyuda = ObjetoPreferencias .HelpFilePath StrDirectorioAyuda es tipo de dato String. LicenseServer. Obtiene una lista de licencias de proveedor disponibles. Su sintaxis es: StrListaLicencias = ObjetoPreferencias.LicenseServer StrListaLicencias es tipo de dato String. LogFileName. Especifica la localizacin del archivo de registro de defecto ACAD.LOG). La sintaxis para asignar: ObjetoPreferencias.LogFileName La sintaxis para obtener: StrArchivoRegistro = ObjetoPreferencias .LogFileName StrArchivoRegistro (nombre y ruta al archivo) es tipo de dato String. MainDictionary. Especifica la localizacin del diccionario de correccin ortogrfica principal. La sintaxis para asignar: ObjetoPreferencias.MainDictionary La sintaxis para obtener: StrArchivoDiccPrincipal = ObjetoPreferencias .MainDictionary StrArchivoDiccPrincipal (nombre y ruta al archivo) es tipo de dato String. 150 = StrArchivoDiccPrincipal = StrArchivoRegistro AutoCAD (por = StrDirectorioAyuda = StrArchivoRepFuentes
151
MenuFile. Especifica la localizacin del archivo de men principal. La sintaxis para asignar: ObjetoPreferencias.MenuFile = StrArchivoMenPrincipal La sintaxis para obtener: StrArchivoMenPrincipal = ObjetoPreferencias .MenuFile StrArchivoMenPrincpal (nombre y ruta al archivo) es tipo de dato String. PostScriptPrologFile . Especifica personalizada en el archivo ACAD.PSF. La sintaxis para asignar: ObjetoPreferencias.PostScriptPrologFile La sintaxis para obtener: StrNomSeccinPrlogo = ObjetoPreferencias .PostScriptPrologFile StrNomSeccinPrlogo es tipo de dato String . PrintFile. Espec ifica un nombre para el archivo temporal de trazado. Por defecto es el nombre del dibujo ms la extensin .PLT. La sintaxis para asignar: ObjetoPreferencias.PrintFile = StrArchivoTrazado La sintaxis para obtener: StrArchivoTrazado = ObjetoPreferencias.PrintFile StrArchivo es tipo de dato String. NOTA: Para aceptar el nombre por defecto (nombre de archivo ms extensin .PLT) se introduce un punto (.) como StrArchivoTrazado . PrintSpoolerPath. Especifica el directorio para los archivos de trazado diferido. La sintaxis para asignar: ObjetoPreferencias.PrintSpoolerPath La sintaxis para obtener: StrDirectorioTrazadoDif = ObjetoPreferencias .PrintSpoolerPath StrDirectorioTrazadoDif es tipo de dato String. PrintSpoolExecutable . Especifica el nombre del ejecutable para el trazado diferido. 151 = StrDirectorioTrazadoDif = StrNomSeccinPrlogo el nombre de una seccin de prlogo
152
La sintaxis para asignar: ObjetoPreferencias.PrintSpoolExecutable La sintaxis para obtener: StrEjecTrazadoDif = ObjetoPreferencias.PrintSpoolExecutable StrEjecDrazadoDif es tipo de dato String. SupportPath. Especifica las diversas localizaciones si hay ms de una han de ir separadas por caracteres de punto y coma (;) donde AutoCAD buscar archivos de soporte. La sintaxis para asignar: ObjetoPreferencias.SupportPath La sintaxis para obtener: StrDirectorioSoporte = ObjetoPreferencias .SupportPath StrDirectorioSoporte es tipo de dato String . TempFilePath. Especifica la localizacin de archivos temporales. La sintaxis para asignar: ObjetoPreferencias.TempFilePath La sintaxis para obtener: StrDirectorioTemp = ObjetoPreferencias.TempFilePath StrDirectorioTemp es tipo de dato String. TemplateDWGPath. Especifica la localizacin de archivos de plantilla, ut ilizados por los asistentes de inicio. La sintaxis para asignar: ObjetoPreferencias.TemplateDWGPath La sintaxis para obtener: StrDirectorioPlantillas = ObjetoPreferencias .TemplateDWGPath StrDirectorioPlantillas es tipo de dato String. TempXRefPath. Especifica la localizacin de archivos de referencia externa. Esta localizacin se utiliza si elegimos la constante acDemandLoadEnabledWithCopy con la propiedad XRefDemandLoad que veremos al trmino de la prxima seccin. La sintaxis para asignar: ObjetoPreferencias.TempXRefPath = StrDirectorioTempRefX 152 = StrDirectorioPlantillas = StrDirectorioTemp = StrDirectorioSoporte = StrEjecTrazadoDif
153
La sintaxis para obtener: StrDirectorioTempRefX = ObjetoPreferencias .TempXRefPath StrDirectorioTempRefX es tipo de dato String . TextEditor. Especifica el nombre para un editor de texto externo con el comando TEXTOM (MTEXT en ingls). La sintaxis para asignar: ObjetoPreferencias.TextEditor = StrNombreEditor La sintaxis para obtener: StrNombreEditor = ObjetoPreferencias .TextEditor StrNombreEditor es tipo de dato String. TextureMapPath. Especifica la localizacin del directorio contenedor de archivos de mapas de texturas para renderizar. La sintaxis para asignar: ObjetoPreferencias.TextureMapPath La sintaxis para obtener: StrDirectorioTexturas = ObjetoPreferencias .TextureMapPath StrDirectorioTexturas es tipo de dato String . = StrDirectorioTexturas
154
La sintaxis para obtener: IntIsolneas = ObjetoPreferencias .ContourLinesPerSurface IntIsolneas es tipo de dato Integer. DisplayDraggedObject . Especifica el modo de arrastre dinmico. La sintaxis para asignar: ObjetoPreferencias.DisplayDraggedObject La sintaxis para obtener: IntModoArrastre = ObjetoPreferencias .DisplayDraggedObject IntModoArrastre siguientes: es tipo de dato Integer, que adems admite las constantes = IntModoArrastre
acDragDoNotDisplay acDragDisplayAutomatically
acDragDisplayOnRequest
DisplaySilhouette. Especifica el estado de activacin de la silueta al ocultar slidos. La sintaxis para asignar: ObjetoPreferencias.DisplaySilhouette La sintaxis para obtener: BooSilueta = ObjetoPreferencias .DisplaySilhouette BooSilueta es tipo de dato Boolean: True activa la silueta, False la desactiva. IncrementalSavePercent . Especifica el valor del guardado progresivo. Ha de ser un valor porcentual, es decir, entre 0 y 100. La sintaxis para asignar: ObjetoPreferencias.IncrementalSavePercent La sintaxis para obtener: IntGuardProgresivo = ObjetoPreferencias.IncrementalSavePercent IntGuardProgresivo es tipo de dato Integer. MaxActiveViewports. Especifica el valor del mximo de ventanas activas. Ha de ser un valor entre 2 y 48. La sintaxis para asignar: ObjetoPreferencias.MaxActiveViewports = IntMxVentanas = IntGuardProgresivo = BooSilueta
154
155
La sintaxis para obtener: IntMxVentanas = ObjetoPreferencias.MaxActiveViewports IntMaxVentanas es tipo de dato Integer. RenderSmoothness. Especifica el valor de suavizado de slidos o resolucin de faceteado. Ha de ser una valor entre 0.01 y 10.0. La sintaxis para asignar: ObjetoPreferencias.RenderSmoothness La sintaxis para obtener: DblResFaceteado = ObjetoPreferencias.RenderSmoothness DblResFaceteado es tipo de dato Double. SegmentPerPolyline. Especifica el valor de nmero de segmentos polilineal. Este valor estar entre 0 y 42950. La sintaxis para asignar: ObjetoPreferencias.SegmentPerPolyline La sintaxis para obtener: DblSegmentosPol = ObjetoPreferencias.SegmentPerPolyline DblSegmentosPol es tipo de dato Double. ShowRasterImage. Especifica la activacin de mostrar o no el contenido de imgenes de trama o raster cuando son movidas con un encuadre o un zoom en tiempo real. La sintaxis para asignar: ObjetoPreferencias.ShowRasterImage La sintaxis para obtener: BooMostrarRaster = ObjetoPreferencias.ShowRasterImage BooMostrarRaster es tipo de dato Boolean: True activa la muestra de imgenes y False la desactiva. Tambin est admitido el siguiente par de constantes: acOn acOff = BooMostrarRaster = DblSegmentosPol por curva = DblResFaceteado
TextFrameDisplay. Especifica la activacin de mostrar o no slo el marco de contorno de los texto o el texto en s. La sintaxis para asignar: ObjetoPreferencias.TextFrameDisplay = BooMostrarMarcoTextos 155
156
La sintaxis para obtener: BooMostrarMarcoTextos = ObjetoPreferencias.TextFrameDisplay BooMostrarMarcoTextos es tipo de dato Boolean: True activa la muestra del marco y False la desactiva. XRefDemandLoad. Especifica la activacin o desactivacin de la carga bajo demanda de referencias externas. La sintaxis para asignar: ObjetoPreferencias.XRefDemandLoad La sintaxis para obtener: IntCargaBajoDemanda = ObjetoPreferencias.XRefDemandLoad IntCargaBajoDemanda es tipo de dato Integer, aunque tambi n admite las siguientes constantes: acDemandLoadDisabled acDemandLoadEnabledWithCopy acDemandLoadEnabled = IntCargaBajoDemanda
EnableStartupDialog . Especifica si se muestra el letrero de dilogo de inicio en una sesin de AutoCAD. La sintaxis para asignar: ObjetoPreferencias.EnableStartupDialog La sintaxis para obtener: BooCuadroInicio = ObjetoPreferencias .EnableStartupDialog 156 = BooCuadroInicio
157
EnableStartupDialog es tipo de dato Boolean: True activa el cuadro de inicio y False lo desactiva. KeyboardAccelerator . Especifica la activacin o desac tivacin de la prioridad de teclas de aceleracin. La sintaxis para asignar: ObjetoPreferencias.KeyboardAccelerator La sintaxis para obtener: BooTeclasAcel = ObjetoPreferencias .KeyboardAccelerator BooTeclasAcel es tipo de dato Boolean, pero que adems admite las siguientes constates: acPreferenceClassic acPreferenceCustom = BooTeclasAcel
las cuales hacen referencia al modo AutoCAD y al modo Windows respectivamente. KeyboardPriority. Controla la prioridad de coordenadas. La sintaxis para asignar: ObjetoPreferencias.KeyboardPriority La sintaxis para obtener: IntPrioridadCoordenadas = ObjetoPreferencias .KeyboardPriority IntPrioridadCoordenadas es tipo de dato siguientes constates: acKeyboardRunningObjSnap acKeyboardProxyNoScripts Integer, pero que adems admite las = IntPrioridadCoordenadas
acKeyboardEntry
PersistentLISP. Especifica la activacin o desactivacin de la caracterstica de volver a cargar programas o rutinas AutoLISP entre dibujos. La sintaxis para asignar: ObjetoPreferencias.PersistentLISP La sintaxis para obtener: BooLISP = ObjetoPreferencias .PersistentLISP BooLISP es tipo de dato Boolean. ProxyImage. Obtiene y/o especifica el modo de mostrar objetos proxy . La sintaxis para asignar: ObjetoPreferencias.ProxyImage = IntObjProxy 157 = BooLISP
158
La sintaxis para obtener: IntObjProxy = ObjetoPreferencias.ProxyImage IntObjProxy constates: es tipo de dato Integer, pero que adems admite las siguientes
acProxyNotShow
acProxyShow
acProxyBoundingBox
ShowProxyDialog. Obtiene y/o especifica si AutoCAD debe mostrar un mensaje cuando se abra un dibujo con objetos proxy . La sintaxis para asignar: ObjetoPreferencias.ShowProxyDialog La sintaxis para obtener: BooMensajeProxy = ObjetoPreferencias.ShowProxyDialog BooMensajeProxy es tipo de dato Boolean. = BooMensajeProxy
158
159
La sintaxis para asignar: ObjetoPreferencias.BeepOnError La sintaxis para obtener: BooSonidoError = ObjetoPreferencias .BeepOnError BooSonidoError es tipo de dato Boolean. CreateBackup. Especifica la activacin de crear o no copia de seguridad al guardar (archivos .BAK). La sintaxis para asignar: ObjetoPreferencias.CreateBackup La sintaxis para obtener: BooCopiaSeguridad = ObjetoPreferencias.CreateBackup BooCopiaSeguridad es tipo de dato Boolean. FullCrcValidation. Especifica la activacin de la validacin CRC (comprobacin cclica de redundancia) continua. La sintaxis para asignar: ObjetoPreferencias.FullCrcValidation La sintaxis para obtener: BooCRC = ObjetoPreferencias .FullCrcValidation BooCRC es tipo de dato Boolean. LogFileOn. Especifica si se escribe en un archivo de revisin lo que va apareciendo en la ventana de texto (por defecto ACAD.LOG). La sintaxis para asignar: ObjetoPreferencias.LogFileOn = BooArchivoLOG La sintaxis para obtener: BooArchivoLOG = ObjetoPreferencias .LogFileOn BooArchivoLOG es tipo de dato Boolean. MaxNumOfSymbols. Especifica el mximo de elementos que ordenar (por defecto es igual a 200). La sintaxis para asignar: ObjetoPreferencias.MaxNumOfSymbols = IntNumElementos 159 = BooCRC = BooCopiaSeguridad = BooSonidoError
160
La sintaxis para obtener: IntNumElementos = ObjetoPreferencias .MaxNumOfSymbols MaxNumOfSymbols es tipo de dato Integer. MeasurementUnits. Especifica el tipo de unidades del dibujo. La sintaxis para asignar: ObjetoPreferencias.MeasurementUnits La sintaxis para obtener: IntUnidadesDibujo = ObjetoPreferencias.MeasurementUnits IntUnidadesDibujo es tipo de dato Integer. SavePreviewThumbnail . Especifica la activacin o desactivacin de guardar imagen preliminar con el dibujo. La sintaxis para asignar: ObjetoPreferencias.SavePreviewThumbnail La sintaxis para obtener: IntImgPreliminar = ObjetoPreferencias .SavePreviewThumbnail IntImgPreliminar es tipo de dato Integer. TempFileExtension. Especifica la extensin de los archivos temporales de AutoCAD (por defecto .AC$). La sintaxis para asignar: ObjetoPreferencias.TempFileExtension La sintaxis para obtener: StrExtArchivoTemp = ObjetoPreferencias.TempFileExtension StrExtArchivoTemp es tipo de dato String. = StrExtArchivoTemp = IntImgPreliminar = IntUnidadesDibujo
160
161
La sintaxis para obtener: IntColorCursor = ObjetoPreferencias.CrosshairColor IntColorCursor es tipo de dato Integer, aunque tambin se admiten las siguientes constantes: AcRed AcCyan AcBlue AcGreen AcYellow AcWhite AcMagen ta
DisplayScreenMenu. Especifica si se muestra o no el men de pantalla. La sintaxis para asignar: ObjetoPreferencias.DisplayScreenMenu La sintaxis para obtener: BooMenPantalla = ObjetoPreferencias .DisplayScreenMenu BooMenPantalla es tipo de dato Boolean. DisplayScrollBars. Especifica si se muestran o no las barras de desplazamiento (horizontal y vertical). La sintaxis para asignar: ObjetoPreferencias.DisplayScrollBars La sintaxis para obtener: BooBarrasDespl = ObjetoPreferencias .DisplayScrollBars BooBarrasDespl es tipo de dato Boolean. DockedVisibleLines. Especifica el nmero de lneas de comando ancladas (valor por defecto 5). La sintaxis para asignar: ObjetoPreferencias.DockedVisibleLines La sintaxis para obtener: IntNumLneasComando = ObjetoPreferencias .DockedVisibleLines IntNumLneasComando es tipo de dato Integer . HistoryLines. Especifica el nmero de lneas en la ventana de texto que se guardan en memoria (valor por defecto 400). La sintaxis para asignar: ObjetoPreferencias.HistoryLines = IntNumLneasHistorial 161 = IntNumLneasComando = BooBarrasDespl = BooMenPantalla
162
La sintaxis para obtener: IntNumLneasHistorial = ObjetoPreferencias .HistoryLines IntNumLneasHistorial es tipo de dato Integer. GraphicFont. Especifica la fuente que se utiliza para grficos, es decir, el tipo de letra con el que se escriben las opciones de men, textos en lnea de comandos, etctera. La sintaxis para asignar: ObjetoPreferencias.GraphicFont La sintaxis para obtener: StrFuenteGrficos = ObjetoPreferencias.GraphicFont StrFuenteGrficos es tipo de dato String. GraphicFontSize. Especifica el tamao de la fuente que se utiliza para grficos. La sintaxis para asignar: ObjetoPreferencias.GraphicFontSize La sintaxis para obtener: IntTamaoFuenteGrficos = ObjetoPreferencias.GraphicFontSize IntTamaoFuenteGrficos es tipo de dato Integer. GraphicFontStyle. Especifica el estilo de la fuente que se utiliza para grficos. La sintaxis para asignar: ObjetoPreferencias.GraphicFontStyle La sintaxis para obtener: IntEstiloFuenteGrficos = ObjetoPreferencias .GraphicFontStyle IntEstiloFuenteGrficos siguientes: acFontRegular es tipo de dato Integer, aunque admite las constantes = IntEstiloFuenteGrficos = IntTamaoFuenteGrficos = StrFuenteGrficos
acFontItalic
acFontBold
acFontBoldItalic
GraphicsTextBackgrndColor. Especifica el color para el fondo del texto grfico. La sintaxis para asignar: ObjetoPreferencias.GraphicsTextBackgrndColor La sintaxis para obtener: IntColorFondoTextoGrficos = ObjetoPreferencias.GraphicsTextBackgrndColor 162 = IntColorFondoTextoGrficos
163
IntColorFondoTextoGrficos es tipo de dato Integer. El intervalo y las constantes son las mismas que para CrosshairColor . GraphicsTextColor. Especifica el color para el texto grfico. La sintaxis para asignar: ObjetoPreferencias.GraphicsTextColor La sintaxis para obtener: IntColorTextoGrficos = ObjetoPreferencias.GraphicsTextColor IntColorTextoGrficos es tipo de dato Integer. El intervalo y las constantes son las mismas que para CrosshairColor . GraphicsWinBackgrndColor. Especifica el color para el fondo de la ventana grfica. La sintaxis para asignar: ObjetoPreferencias.GraphicsWinBackgrndColor La sintaxis para obtener: IntColorFondoVentanaGrfica = ObjetoPreferencias.GraphicsWinBackgrndColor IntColorFondoVentanaGrfica es tipo de dato Integer. El intervalo y las constantes son las mismas que para CrosshairColor . MaxAutoCADWindow. Especifica la activacin de maximizar o no AutoCAD al iniciar. La sintaxis para asignar: ObjetoPreferencias.MaxAutoCADWindow La sintaxis para obtener: BooMaximizar = ObjetoPreferencias.MaxAutoCADWindow BooMaximizar es tipo de dato Boolean. MonochromeVectors. monocromo. La sintaxis para asignar: ObjetoPreferencias.MonochromeVectors La sintaxis para obtener: BooVectoresMonocromo = ObjetoPreferencias.MonochromeVectors BooVectoresMonocromo es tipo de dato Boolean. TextFont. Especifica la fuente que se utiliza para textos. 163 = BooVectoresMonocromo Especifica la activacin o desactivacin de los vectores = BooMaximizar = IntColorFondoVentanaGrfica = IntColorTextoGrficos
164
La sintaxis para asignar: ObjetoPreferencias.TextFont = StrFuenteTextos La sintaxis para obtener: StrFuenteTextos = ObjetoPreferencias .TextFont StrFuenteTextos es tipo de dato String. TextFontSize. Especifica el tamao de la fuente que se utiliza para textos. La sintaxis para asignar: ObjetoPreferencias.TextFontSize La sintaxis para obtener: IntTamaoFuenteTextos = ObjetoPreferencias .TextFontSize IntTamaoFuenteTextos es tipo de dato Integer. TextFontStyle. Especifica el estilo de la fuente que se utiliza para textos. La sintaxis para asignar: ObjetoPreferencias.TextFontStyle La sintaxis para obtener: IntEstiloFuenteTextos = ObjetoPreferencias .TextFontStyle IntEstiloFuenteTextos siguientes: acFontRegular es tipo de dato Integer, aunque admite las constantes = IntEstiloFuenteTextos = IntTamaoFuenteTextos
acFontItalic
acFontBold
acFontBoldItalic
TextWinBackgrndColor . Especifica el color para el fondo de la ventana de texto. La sintaxis para asignar: ObjetoPreferencias.TextWinBackgrndColor La sintaxis para obtener: IntColorFondoVentanaTexto = ObjetoPreferencias.TextWinBackgrndColor IntColorFondoVentanaTexto es tipo de dato Integer. El intervalo y las constantes son las mismas que para CrosshairColor . TextWinTextColor. Especifica el color para el texto de la ventana de text o. La sintaxis para asignar: ObjetoPreferencias.TextWinTextColor = IntColorTextoVentanaTexto 164 = IntColorFondoVentanaTexto
165
La sintaxis para obtener: IntColorTextoVentanaTexto = ObjetoPreferencias.TextWinTextColor l s constantes IntColorTextoVentanaTexto es tipo de dato Integer. El intervalo y a son las mismas que para CrosshairColor .
166
ObjPreferencias .DeleteProfile(StrPerfilExport, StrArchivoARG )
StrPerfilExport es un valor String que especifica el nombre del perfil que se desea exportar. StrArchivoARG es un valor de tipo String tambin, el cual indica la ruta y el nombre del archivo donde se exporta el perfil para su posterior uso. El archivo ser de extensin .ARG. GetProjectFilePath. Obtiene el camino asociado con el proyecto cuyo nombre se indica. de bsqueda de referencias externas
StrDirectorio = ObjPreferencias .GetProjectFilePath( StrNombreProyecto ) StrNombreProyecto es un valor String que especifica el nombre del proyecto. StrDirectorio es una variable de tipo String que recoger el directorio donde AutoCAD buscar referencias externas. ImportProfile. La sintaxis de este mtodo es: ObjPreferencias .DeleteProfile(StrPerfilImport, StrArchivoARG , IncluirCamino )
ImportProfile importa el perfil de usuario cuyo nombre se indica de un archivo de registro de perfiles con la extensin .ARG. El ltimo argumento es un valor booleano (Boolean) que determina si se incluye el camino de acceso en la informacin del perfil. Si el valor es True se incluir dicho camino; en caso contrario (False) no. ResetProfile. La sintaxis de este mtodo es: ObjPreferencias .ResetProfile( StrPerfilInic ) ResetProfile inicializa el perfil que se indica (como cadena String ) , estableciendo todas las caractersticas con los valores por defecto. SetProjectFilePath. Crea un nuevo proyecto con el nombre indicado y le asigna o asocia un camino de bsqueda para referencias externas cuando se trabaje con l. La sintaxis de este mtodo es: ObjPreferencias .SetProjectFilePath( StrNombreProyecto , StrDirectorioRefX )
StrNombreProyecto es un valor String que especifica el nombre del proyecto. StrDirectorioRefX es una variable de tipo String que recoger el directorio donde AutoCAD busc ar referencias externas.
167
hora de programar en VBA para AutoCAD. Existe a veces un vaco en el programador cuando se encuentra con situaciones que no sabe resolver. La mayor parte de estas situaciones tienen solucin, slo hay que saber encontrarla y, pa ra ello, hacen mucha falta horas de programacin y experiencia. Aqu se explica un pequeo grupo de tcnicas que pueden resolver algunos problemas a la hora de hacer programas para AutoCAD.
Elemento VBA
Tercero . Exportados y guardados como archivos todos los elementos, hemos de pasarlos a Visual Basic. Aqu abriremos un nuevo proyecto y lo dejaremos vaco de formularios y mdulos de cdigo (eliminando el formulario que aparece por defecto).
168
Ahora hemos de pulsar con el botn derecho en un espacio vaco (blanco) de la ventana de proyecto y elegir Agregar>Formulario.... En el cuadro de dilogo buscaremos y abriremos el archivo .FRM generado del proyecto en VBA. Lo mismo para los mdulos de cdigo y dems. Es decir, crearemos un slo proyecto de Visual Basic .VBP agregando o anexando todos los trozos extrados del proyecto de VBA. Al final podemos guardarlo todo. Cuarto. Muy importante es una cosa. Puede que al intentar aadir un formulario nos d un error Visual Basic. Procuremos antes de nada elegir la referencia a la librera de objetos de AutoCAD (AutoCAD Object Library) en el men Proyecto>Referencias... , adems de las dos siguientes referencias tambin: Visual Basic For Applications y OLE Automation (otras que haya escogidas ya hemos de dejarlas como estn). Adems, bajo Proyectos>Componentes... escogeremos Microsoft Forms 2.0 Object Library. Este ltimo componente es el que utiliza el VBA de AutoCAD como predeterminado; es la librera de objetos insertables en los formularios: cuadros de lista, listas desplegables, botones, etctera. Si en el formulario hay algn elemento que no se encuentra en la librera por defecto de Visual Basic, como por ejemplo la pgina mltiple (la ventana con pestaas), puede que se produzca un error al agregar el formulario. Las referencias expuestas dicen relacin a VBA. La ms importante es AutoCAD Object Library, ya que contiene definidos los objetos de AutoCAD para VBA: Application , Document, ModelSpace, Plot, Preferences ... Quinto. Una vez hecho todo lo anterior hemos de repasar el cdigo para encontrar incompatibilidades de VBA con Visual Basic. Por ejemplo, sabemos que el documento actual activo puede ser referenciado desde VBA con el trmino ThisDrawing. Esto es imposible desde un Visual Basic externo; a la hora de compilar nos dar un error y nos dir que esa variable no est declarada. Desde Visual Basic es indispensable utilizar la sintaxis que hemos venido usando hasta ahora, por ejemplo: Dim AcadDoc as Object Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument De esta forma hacemos referencia a la aplicacin AutoCAD y a su librera de objetos. A partir de aqu ningn mtodo o propiedad ser considerada por Visual Basic como un error de sintaxis o de falta de declaracin de variables. Otra serie de errores nos producen todas las constantes equivalentes a valores Integer que admiten algunos mtodos y algunas propiedades: acOn, acOff, acMetric, acSelectionSetAll, acPlotOrientationLandscape ... En estos casos se producir tambin un error, al compilar, de variable no declarada. Para evitarlo nicamente hemos de sustituir estos valores constantes por sus correspondientes valores enteros (Integer). NOTA IMPORTANTE DE SINTAXIS: No se ha comentado a lo largo de este MDULO ninguno de los valores enteros correspondientes con las diversas constantes, sino nicamente ellas. Cada lista de constantes en estas pginas est ordenada de izquierda a derecha y de arriba a abajo (sentido lgico de lectura). Pues bien, los valores enteros se encuentran tambin en dicho orden, comenzando siempre por el cero (0). En ltima instancia, si no pudiramos solucionar un error de esta ndole por alguno de estos mtodos, bastara deshacernos de la sentencia Option Explicit para que todo funcione a la perfeccin.
169
Sexto. El proyecto a nivel esttico en Visual Basic es mucho ms agradecido que en VBA. Ahora, y antes de la compilacin, podremos agregar un icono propio a cada formulario, anular o no los botones de maximizar y minimizar, etctera. Esto va con el gusto del programador. Sptimo. Este paso es el de la compilacin. Simplemente consiste en dirigirnos a Archivo>Generar Proyecto1.exe... (esta opcin cambia, pero la primera vez probablemente sea este el ttulo), elegir la opcin, darle un ttulo al ejecutable y pulsar el botn Aceptar . Si se nos ofrece algn error de compilacin sin depurar de los mencio nados en el paso anterior, simplemente habremos de seguir las instrucciones pertinentes ya comentadas para solucionarlo. Octavo. Una vez en disposicin de un ejecutable vlido, se nos presenta el problema de la ejecucin desde AutoCAD. El archivo objeto es .EXE, sin embargo no tiene nada que ver con aplicaciones ADS ni ARX. La manera de cargar un ejecutable compilado con Visual Basic es con la funcin STARTAPP de AutoLISP. La explicacin completa de esta funcin se encuentra en la seccin ONCE.15.5. , sobre el inicio de aplicaciones Windows. As por ejemplo, si nuestro nuevo ejecutable se llamara TRAZADO.EXE y se encontrar en una carpeta llamada VBACOMP en el diirectorio raz del disco duro (C:\), podramos hacer: (STARTAPP "c:/vbacom/trazado.exe") Esta lnea puede formar parte de un programa AutoLISP, de la macro de un botn, de una opcin de men o de un archivo de guin, adems de poder teclearla directamente en la lnea de comandos. De esta manera, queda as explicada la forma de crear aplicaciones con VBA y Visual Basic para AutoCAD que no necesiten el editor VBA para funcionar y tambin, que no tengan el cdigo fuente a la vista. An as, AutoCAD deber estar ejecutndose para que estos programas funcionen correctamente, de forma evidente. Tambin hemos de tener en cuenta a la hora de correr nuestros programas en otras mquinas, la necesidad de ciertos archivos (libreras de objetos y dems) para que todo funcione a la perfeccin. Por ltimo, resear la necesidad de comprobar los derechos de autor de ciertos archivos al distribuirlos de manera gratuita o por una cantidad dineraria.
170
Set AcadApp = CreateObject("AutoCAD.Application") If Err Then MsgBox Err.Description Exit Sub End If End If De esta manera, se intenta acceder con GetObject al objeto de aplicacin de AutoCAD (previamente declarado como Object, al igual que siempre). Si se produce un error se procura crear un objeto de aplicacin de AutoCAD (con CreateObject). Lo que har este mecanismo es arrancar AutoCAD si lo encuentra y no se produce ningn error. Por ltimo, y si esto falla, se presenta un mensaje de error con la descripcin del mismo. Por defecto la aplicacin de AutoCAD se inicia con la propiedad desactivada, por lo que habr que activarla as, por ejemplo: AcadApp.Visible = True Despus, y si nos interesa, podremos darle tamao a la ventana, por ejemplo as: acadApp.Top = 0 acadApp.Left = 0 acadApp.Width = 400 acadApp.Height = 400 A menudo el orden de las propiedades del objeto no es importante, pero en este caso s lo es. Dado que el tamao de la ventana de aplicacin se mide desde la esquina superior izquierda de la ventana, el ajuste de las propiedades Width o Height antes que Top o Left provoca un comportamiento no recomendable. de visibilidad
171
nombre de la macro. Aqu el nombre del mdulo es Mdulo1 (nombre por defecto) y el de la macro definida dentro de l es MacroPrueba . Al final hemos de descargar el programa o proyecto. Para ello utilizamos VBAUNLOAD. El programa se descargar al finalizar su ejecucin. NOTA: A esta serie de funciones se le puede aadir cdigo para controlar la existencia del archivo, de la macro, etctera. Si lo que deseamos ejecutar no es una macro dentro de un mdulo sino un programa con su letrero de dilogo (formulario) y dems, la prctica lgica pasa por crear una macro en un mdulo de dicho programa que muestre el formulario principal, ya que no se puede llamar a otro elemento que no sea una macro con VBARUN. Por ejemplo, en un programa que arranque con un formulario llamado formPrincipal, creamos una macro (en el mdulo Mdulo1) tal que as: Sub Arranque() formPrincipal.Show End Sub De esta manera luego podemos dirigirnos desde AutoLISP a esta macro as: (COMMAND "_-VBARUN" "Mdulo1.Arranque") lo que har ejecutarse el programa normalmente. A la hora de ejecutar programas VBA desde una macro (botn, men o archivo de guin), podemos incluir el cdigo anterior en AutoLISP, ya que resultara como si lo estuviramos entrando en lnea de comandos. Sin embargo, por las propias caractersticas de las macros, podemos incluir la serie de comandos sin necesidad de hacer intervenir a AutoLISP por ningn lado. As por ejemplo, la macro de un botn de barra de herramientas que cargue un programa podra ser: ^C^C_VBALOAD c:/misdoc~1/autocad/vba/trazado.dvb; _-VBARUN Mdulo1.Macro;_VBAUNLOAD NOTA: Tnganse en cuenta las propias caractersticas de cada tipo de macro, sea de dentro de un botn, de un archivo de guin, etctera. Por ltimo decir que en la mquina que se escriban estos comandos habr de estar instalado VBA para AutoCAD, sino no funcionar. Es por esto, que a la hora de distribuir aplicaciones se recomiende la compilacin explicada en la seccin anterior (DOCE.12.1. ).
172
SendKeys Cadena[, Modo_espera ] Donde Cadena es la cadena que deseamos enviar. Esta puede ser tambin una pulsacin de teclas especiales (ENTER, ALT...), pero nos centraremos en una cadena tpica. Modo_espera es un argumento opcional booleano que, si se establece como True se procesan las pulsaciones antes de devolver el control al procedimiento Sub y, si es False se devuelve el control inmediatamente despus de enviarse las pulsaciones. Normalmente utilizaremos esta ltima opcin, que es la predeterminada, por lo que no har falta que escribamos nada. Para poder hacer funcionar este mecanismo habremos de ayudarnos de la instruccin AppActivate, cuya sintaxis es: AppActivate Ttulo [, Modo_espera ] AppActivate activa una ventana de aplicacin. Ttulo es el argumento obligatorio que hay que pasarle, y dice referencia al nombre actual en la barra de ttulo (barra azul normalmente) de la ventana. Modo_espera es un valor booleano opcional que especifica si la aplicacin que hace la llamada tiene el enfoque antes de activar otra. Si se especifica False (predeterminado), se activa inmediatamente la aplicacin especificada, aunque la aplicacin que hace la llamada no tenga el enfoque. Si se especifica True, la aplicacin que hace la llamada espera hasta que tenga el enfoque y luego activa la aplicacin especificada (normalmente utilizaremos esta opcin True). Pero veamos un ejemplo: Option Explicit Dim AcadApp As Object Dim AcadCommand As String Sub Macro() Set AcadApp = GetObject(, "AutoCAD.Application") AppActivate AcadApp.Caption AcadCommand = "_.open " SendKeys AcadCommand, True End Sub Esta macro define el objeto de aplicacin de AutoCAD primero. Despus la activa enviando el nombre de la barra de ttulo actual. Como en AutoCAD (y en otras muchas aplicaciones) este ttulo cambia segn el nombre del archivo abierto, se extrae directamente el actual con la propiedad Caption del objeto Application . A continuacin se define y enva la cadena a la lnea de comandos. En este caso es el comando para abrir un archivo. Ntese que ha de dejarse un espacio blanco al final para emular un INTRO, ya que es como si estuviramos escribiendo en lnea de comandos. NOTA: Un INTRO puede tambin representarse como {INTRO} o con una tilde ~. Como se ha dicho, SendKeys se utiliza para enviar pulsaciones de teclas (para pulsar botones desde cdigo, ejecutar opciones de men, etc.). En AutoCAD, como sabemos, si escribimos algo directamente teniendo delante la interfaz grfica donde primero se refleja es en la lnea de comandos. De ah este mecanismo para este problema. Podemos tambin enviar cdigo AutoLISP o lo que nos apetezca. Incluso se podra hacer que un programa VBA leyera lnea por lnea un archivo .LSP y lo fuera enviando a la lnea de comandos. Sin embargo esto es un poco peligroso, ya que un programa completo AutoLISP espera respuestas por parte del usuario, abre cuadros DCL, etc., y el programa VBA
173
seguira mandando lneas y lneas sin parar. Aunque se puede conseguir que esto funcione, lo lgico es reservarlo para acciones simples y cortas, programando el resto del cdigo en VBA. An as, veremos un ejemplo ms prctico que el anterior con cdigo en AutoLISP. Sabemos que VBA no dispone (como AutoLISP) de un mtodo o propiedad que llame al cuadro de color de AutoCAD. Pues mezclando algunas tcnicas podremos hacer desde VBA que se llame a dicho cuadro utilizando AutoLISP para luego acabar con el resultado en una variable VBA. Veamos el cdigo: Option Explicit Dim AcadApp As Object Dim AcadDoc As Object Sub Macro() Dim AcadCommand As String Set AcadApp = GetObject(, "AutoCAD.Application") Set AcadDoc = AcadApp.ActiveDocument AppActivate AcadApp.Caption AcadCommand = "{(}SETVAR ""useri1"" {(}SETQ NumCol {(}ACAD_COLORDLG 256{)}{)}{)} " SendKeys AcadCommand, True End Sub Sub Macro2() Dim NmeroColor As Integer NmeroColor = AcadDoc.GetVariable("useri1") MsgBox "Elegido color: " & NmeroColor End Sub Cmo podemos observar, este cdigo consta de dos macros ( Macro y Macro2). La primera de ellas es la encargada de enviar el cdigo AutoLISP a la lnea de comandos, como hacamos en el ejemplo anterior. El nico inconveniente viene dado por la utilizacin de parntesis, y es que estos tienen un significado especial para SendKeys. Es por ello que, cuando queramos utilizar uno, habremos de encerrarlo entre llaves. Tambin debemos saber, que en Visual Basic para introducir comillas dentro de una cadena hemos de indicar estos caracteres como dobles (""), para que no se confundan con las comillas propias de la cadena de texto. Segn todo esto, una secuencia AutoLISP que sera as: (SETVAR ""useri1"" (SETQ NumCol (ACAD_COLORDLG 256))) se convierte en esto: {(}SETVAR ""useri1"" {(}SETQ NumCol {(}ACAD_COLORDLG 256{)}{)}{)} Aqu lo que hacemos es introducir directamente el valor de la variable de AutoLISP que creamos, llamada NumCol, la cual recoge el color seleccionado en el cuadro, en una de las variables de usuario para valores enteros de AutoCAD, USERI1. NOTA: Repsese la seccin NUEVE.3.6. para recordar el sentido de estas quince variables de diferentes tipos. Ahora les hemos encontrado otro quehacer.
174
Macro2 simplemente se limita a extraer el valor de USERI1, con el mtodo GetVariable del objeto de documento activo, y a mostrarlo. Estas variables de usuario son accesibles del mismo modo que las dems variables de sistema. NOTA: Primero ejecutaremos Macro y despus Macro2.
II. III.
Crear una macro VBA que permita aadir lneas de ejes a arcos, crculos y/o elipses previamente seleccionados. Progra mar un ejemplo en VBA que permita cambiar la altura a todos los textos del dibujo actual. El letrero de dilogo puede ser este mismo:
IV.
Realizar una serie de programas en AUTOLISP/DCL y en VBA los cuales permitan aprovechar al completo las capacidades de AutoCAD a la hora de trabajar con