· MeasurementUnits. Especifica el tipo de unidades del dibujo.

La sintaxis para asignar:

ObjetoPreferencias.MeasurementUnits = IntUnidadesDibujo

La sintaxis para obtener:

IntUnidadesDibujo = ObjetoPreferencias.MeasurementUnits

IntUnidadesDibujo es tipo de dato Integer.

· SavePreviewThumbnail. Especifica la activación o desactivación de guardar imagen preliminar con el dibujo.

La sintaxis para asignar:

ObjetoPreferencias.SavePreviewThumbnail = IntImgPreliminar

La sintaxis para obtener:

IntImgPreliminar = ObjetoPreferencias.SavePreviewThumbnail

IntImgPreliminar es tipo de dato Integer.

· TempFileExtension. Especifica la extensión de los archivos temporales de AutoCAD 14 (por defecto .AC$).

La sintaxis para asignar:

ObjetoPreferencias.TempFileExtension = StrExtArchivoTemp

La sintaxis para obtener:

StrExtArchivoTemp = ObjetoPreferencias.TempFileExtension

StrExtArchivoTemp es tipo de dato String.

 

DOCE.11.5. Preferencias de visualización

· CrosshairColor. Especifica el color para la cruceta del cursor (también cambia el cuadro de designación y el símbolo del SCP). Habrá de ser un valor entre 1 y 255.

La sintaxis para asignar:

ObjetoPreferencias.CrosshairColor = IntColorCursor

La sintaxis para obtener:

IntColorCursor = ObjetoPreferencias.CrosshairColor

IntColorCursor es tipo de dato Integer, aunque también se admiten las siguientes constantes:

AcRed
AcBlue
AcYellow
AcMagenta
AcCyan
AcGreen
AcWhite

· DisplayScreenMenu. Especifica si se muestra o no el menú de pantalla.

La sintaxis para asignar:

ObjetoPreferencias.DisplayScreenMenu = BooMenúPantalla

La sintaxis para obtener:

BooMenúPantalla = ObjetoPreferencias.DisplayScreenMenu

BooMenúPantalla 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 = BooBarrasDespl

La sintaxis para obtener:

BooBarrasDespl = ObjetoPreferencias.DisplayScrollBars

BooBarrasDespl es tipo de dato Boolean.

· DockedVisibleLines. Especifica el número de líneas de comando ancladas (valor por defecto 5).

La sintaxis para asignar:

ObjetoPreferencias.DockedVisibleLines = IntNumLíneasComando

La sintaxis para obtener:

IntNumLíneasComando = ObjetoPreferencias.DockedVisibleLines

IntNumLíneasComando es tipo de dato Integer.

· HistoryLines. Especifica el número de líneas en la ventana de texto que se guardan en memoria (valor por defecto 400).

La sintaxis para asignar:

ObjetoPreferencias.HistoryLines = IntNumLíneasHistorial

La sintaxis para obtener:

IntNumLíneasHistorial = ObjetoPreferencias.HistoryLines

IntNumLíneasHistorial es tipo de dato Integer.

· GraphicFont. Especifica la fuente que se utiliza para gráficos, es decir, el tipo de letra con el que se escriben las opciones de menú, textos en línea de comandos, etcétera.

La sintaxis para asignar:

ObjetoPreferencias.GraphicFont = StrFuenteGráficos

La sintaxis para obtener:

StrFuenteGráficos = ObjetoPreferencias.GraphicFont


StrFuenteGráficos
es tipo de dato String.

· GraphicFontSize. Especifica el tamaño de la fuente que se utiliza para gráficos.

La sintaxis para asignar:

ObjetoPreferencias.GraphicFontSize = IntTamañoFuenteGráficos

La sintaxis para obtener:

IntTamañoFuenteGráficos = ObjetoPreferencias.GraphicFontSize

IntTamañoFuenteGráficos es tipo de dato Integer.

· GraphicFontStyle. Especifica el estilo de la fuente que se utiliza para gráficos.

La sintaxis para asignar:

ObjetoPreferencias.GraphicFontStyle = IntEstiloFuenteGráficos

La sintaxis para obtener:

IntEstiloFuenteGráficos = ObjetoPreferencias.GraphicFontStyle

IntEstiloFuenteGráficos es tipo de dato Integer, aunque admite las constantes siguientes:

acFontRegular
acFontItalic
acFontBold
acFontBoldItalic

· GraphicsTextBackgrndColor. Especifica el color para el fondo del texto gráfico.

La sintaxis para asignar:

ObjetoPreferencias.GraphicsTextBackgrndColor = IntColorFondoTextoGráficos

La sintaxis para obtener:

IntColorFondoTextoGráficos = ObjetoPreferencias.GraphicsTextBackgrndColor

IntColorFondoTextoGráficos es tipo de dato Integer. El intervalo y las constantes son las mismas que para CrosshairColor.

· GraphicsTextColor. Especifica el color para el texto gráfico.

La sintaxis para asignar:

ObjetoPreferencias.GraphicsTextColor = IntColorTextoGráficos

La sintaxis para obtener:

IntColorTextoGráficos = ObjetoPreferencias.GraphicsTextColor

IntColorTextoGráficos 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 gráfica.

La sintaxis para asignar:


ObjetoPreferencias
.GraphicsWinBackgrndColor = IntColorFondoVentanaGráfica

La sintaxis para obtener:

IntColorFondoVentanaGráfica = ObjetoPreferencias.GraphicsWinBackgrndColor

IntColorFondoVentanaGráfica es tipo de dato Integer. El intervalo y las constantes son las mismas que para CrosshairColor.

· MaxAutoCADWindow. Especifica la activación de maximizar o no AutoCAD al iniciar.

La sintaxis para asignar:

ObjetoPreferencias.MaxAutoCADWindow = BooMaximizar

La sintaxis para obtener:

BooMaximizar = ObjetoPreferencias.MaxAutoCADWindow

BooMaximizar es tipo de dato Boolean.

· MonochromeVectors. Especifica la activación o desactivación de los vectores monocromo.

La sintaxis para asignar:

ObjetoPreferencias.MonochromeVectors = BooVectoresMonocromo

La sintaxis para obtener:

BooVectoresMonocromo = ObjetoPreferencias.MonochromeVectors

BooVectoresMonocromo es tipo de dato Boolean.

· TextFont. Especifica la fuente que se utiliza para textos.

La sintaxis para asignar:

ObjetoPreferencias.TextFont = StrFuenteTextos

La sintaxis para obtener:

StrFuenteTextos = ObjetoPreferencias.TextFont

StrFuenteTextos es tipo de dato String.

· TextFontSize. Especifica el tamaño de la fuente que se utiliza para textos.

La sintaxis para asignar:

ObjetoPreferencias.TextFontSize = IntTamañoFuenteTextos

La sintaxis para obtener:

IntTamañoFuenteTextos = ObjetoPreferencias.TextFontSize

IntTamañoFuenteTextos es tipo de dato Integer.

· TextFontStyle. Especifica el estilo de la fuente que se utiliza para textos.

La sintaxis para asignar:


ObjetoPreferencias
.TextFontStyle = IntEstiloFuenteTextos

La sintaxis para obtener:

IntEstiloFuenteTextos = ObjetoPreferencias.TextFontStyle

IntEstiloFuenteTextos es tipo de dato Integer, aunque admite las constantes siguientes:

acFontRegular
acFontItalic
acFontBold
acFontBoldItalic

· TextWinBackgrndColor. Especifica el color para el fondo de la ventana de texto.

La sintaxis para asignar:

ObjetoPreferencias.TextWinBackgrndColor = IntColorFondoVentanaTexto

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

La sintaxis para asignar:


ObjetoPreferencias
.TextWinTextColor = IntColorTextoVentanaTexto

La sintaxis para obtener:

IntColorTextoVentanaTexto = ObjetoPreferencias.TextWinTextColor

IntColorTextoVentanaTexto es tipo de dato Integer. El intervalo y las constantes son las mismas que para CrosshairColor.

 

DOCE.11.6. Preferencia de dispositivo

· CursorSize. Especifica el tamaño del cursor gráfico (como porcentaje respecto a la pantalla). Será un valor de 0 a 100.

La sintaxis para asignar:

ObjetoPreferencias.CursorSize = IntTamañoCursor

La sintaxis para obtener:

IntTamañoCursor = ObjetoPreferencias.CursorSize

IntTamañoCursor es tipo de dato Integer.

 

DOCE.11.7. Preferencia de perfil

· ActiveProfile. Especifica el perfil de usuario activo.

La sintaxis para asignar:

ObjetoPreferencias.ActiveProfile = StrPerfil

La sintaxis para obtener:

StrPerfil = ObjetoPreferencias.ActiveProfile

StrPerfil es tipo de dato String.

 

DOCE.11.8. Métodos del objeto de preferencias

Una vez vistas las propiedades pasamos a los métodos. Los métodos siguientes se corresponden con las acciones de los botones existentes en el cuadro de la pestaña Perfil del cuadro Preferencias de AutoCAD 14.

· DeleteProfile. Elimina un perfil de usuario de AutoCAD.

ObjPreferencias.DeleteProfile(StrPerfilElim)

StrPerfilElim es un valor String que especifica el nombre del perfil que se desea eliminar.

· ExportProfile. Exporta un perfil de usuario de AutoCAD.

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 también, el cual indica la ruta y el nombre del archivo donde se exporta el perfil para su posterior uso. El archivo será de extensión .ARG.

· GetProjectFilePath. Obtiene el camino de búsqueda de referencias externas asociado con el proyecto cuyo nombre se indica.

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 método 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 extensión .ARG. El último argumento es un valor booleano (Boolean) que determina si se incluye el camino de acceso en la información del perfil. Si el valor es True se incluirá dicho camino; en caso contrario (False) no.

· ResetProfile. La sintaxis de este método es:

ObjPreferencias.ResetProfile(StrPerfilInic)

ResetProfile inicializa el perfil que se indica (como cadena String), estableciendo todas las características con los valores por defecto.

· SetProjectFilePath. Crea un nuevo proyecto con el nombre indicado y le asigna o asocia un camino de búsqueda para referencias externas cuando se trabaje con él.

La sintaxis de este método 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 buscará referencias externas.

 

6ª fase intermedia de ejercicios

· Prográmese algún ejemplo que actúe sobre las preferencias de AutoCAD 14..

 

DOCE.12. ALGUNOS TRUCOS ActiveX Automation
PARA AutoCAD 14

En esta sección simplemente se quieren mostrar algunos trucos o técnicas útiles a la hora de programar en VBA para AutoCAD 14. Existe a veces un vacío en el programador cuando se encuentra con situaciones que no sabe resolver. La mayor parte de estas situaciones tienen solución, sólo hay que saber encontrarla y, para ello, hacen mucha falta horas de programación y experiencia.

Aquí se explica un pequeño grupo de técnicas que pueden resolver algunos problemas a la hora de hacer programas para AutoCAD.

 

DOCE.12.1. Compilación de programas con un compi-
lador de Visual Basic externo

Como nos habremos dado cuenta a la hora de programar a lo largo de este MÓDULO DOCE, resulta un poco fastidioso el mecanismo de VBA en el momento de ejecutar un programa. Si este dispone de letrero de diálogo se cambia automáticamente a la ventana de AutoCAD (siempre que no esté minimizada), pero si es una macro simplemente, hemos de cambiar manualmente.

Además de ello, en cuanto el programa termina se vuelve al editor VBA, ya que hemos de tenerlo siempre abierto para ejecutar un programa. Esto no es nada elegante si nuestro deseo es distribuir o vender un programa. Con el consabido temor a que alguien además haga suyo nuestro código fuente.

Para evitar todos estos problemas podemos recurrir a un compilador externo de Visual Basic, como Visual Basic 5.0 o Visual Basic 6.0. De esta manera, únicamente hemos de compilar el programa para crear una aplicación .EXE independiente (pero que sólo correrá bajo AutoCAD).

Sin embargo, compilar un proyecto VBA en un editor externo de Visual Basic no es un camino de rosas. Tampoco pensemos que es un infierno, no, es sencillo, pero hay que seguir una serie de pasos y unas normas para que todo funcione correctamente. Veamos cuáles son.

Primero. El primer paso consiste, evidentemente, en conseguir una distribución de Visual Basic. Sin el compilador no podremos hacer nada, como es lógico. Aquí se explicarán los pasos refiriéndonos a Visual Basic 5.0.

Segundo. Un compilador de Visual Basic no lee archivos binarios .DVB (los del VBA de AutoCAD), por lo que habrá que exportar los archivos a un formato comprensible. Para ello, y desde la ventana de proyecto de VBA, seleccionamos uno por uno los archivos de nuestro proyecto (los de formulario, módulo...) y, pulsando sobre ellos con el botón derecho del ratón elegimos la opción Exportar archivo... del menú contextual.

Todos los archivos resultantes los guardaremos en una sola carpeta en el disco duro para mayor organización final. Los elementos, según su condición, se exportan a un archivo diferente según la siguiente tabla:

Elemento VBA		Al exportar es un archivo de Visual Basic


Formulario		.FRM
Módulo			.BAS
Módulo de clase		.CLS

Tercero. Exportados y guardados como archivos todos los elementos, hemos de pasarlos a Visual Basic. Aquí abriremos un nuevo proyecto y lo dejaremos vacío de formularios y módulos de código (eliminando el formulario que aparece por defecto).

Ahora hemos de pulsar con el botón derecho en un espacio vacío (blanco) de la ventana de proyecto y elegir Agregar>Formulario.... En el cuadro de diálogo buscaremos y abriremos el archivo .FRM generado del proyecto en VBA. Lo mismo para los módulos de código y demás. Es decir, crearemos un sólo proyecto de Visual Basic .VBP agregando o anexando todos los trozos extraídos del proyecto de VBA. Al final podemos guardarlo todo.

Cuarto. Muy importante es una cosa. Puede que al intentar añadir un formulario nos dé un error Visual Basic. Procuremos antes de nada elegir la referencia a la librería de objetos de AutoCAD (AutoCAD Object Library) en el menú Proyecto>Referencias..., además de las dos siguientes referencias también: Visual Basic For Applications y OLE Automation (otras que haya escogidas ya hemos de dejarlas como están). Además, bajo Proyectos>Componentes... escogeremos Microsoft Forms 2.0 Object Library.

Este último componente es el que utiliza el VBA de AutoCAD 14 como predeterminado; es la librería de objetos insertables en los formularios: cuadros de lista, listas desplegables, botones, etcétera. Si en el formulario hay algún elemento que no se encuentra en la librería por defecto de Visual Basic, como por ejemplo la página múltiple (la ventana con pestañas), puede que se produzca un error al agregar el formulario.

Las referencias expuestas dicen relación a VBA. La más 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 código para encontrar incompatibilidades de VBA con Visual Basic. Por ejemplo, sabemos que el documento actual activo puede ser referenciado desde VBA con el término 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 aplicación AutoCAD y a su librería de objetos. A partir de aquí ningún método o propiedad será considerada por Visual Basic como un error de sintaxis o de falta de declaración de variables.

Otra serie de errores nos producen todas las constantes equivalentes a valores Integer que admiten algunos métodos y algunas propiedades: acOn, acOff, acMetric, acSelectionSetAll, acPlotOrientationLandscape... En estos casos se producirá también 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 MÓDULO ninguno de los valores enteros correspondientes con las diversas constantes, sino únicamente ellas. Cada lista de constantes en estas páginas está ordenada de izquierda a derecha y de arriba a abajo (sentido lógico de lectura). Pues bien, los valores enteros se encuentran también en dicho orden, comenzando siempre por el cero (0).

En última instancia, si no pudiéramos solucionar un error de esta índole por alguno de estos métodos, bastaría deshacernos de la sentencia Option Explicit para que todo funcione a la perfección.

Sexto. El proyecto a nivel estético en Visual Basic es mucho más agradecido que en VBA. Ahora, y antes de la compilación, podremos agregar un icono propio a cada formulario, anular o no los botones de maximizar y minimizar, etcétera. Esto va con el gusto del programador.

Séptimo. Este paso es el de la compilación. Simplemente consiste en dirigirnos a Archivo>Generar Proyecto1.exe... (esta opción cambia, pero la primera vez probablemente sea este el título), elegir la opción, darle un título al ejecutable y pulsar el botón Aceptar.

Si se nos ofrece algún error de compilación sin depurar de los mencionados en el paso anterior, simplemente habremos de seguir las instrucciones pertinentes ya comentadas para solucionarlo.

Octavo. Una vez en disposición de un ejecutable válido, se nos presenta el problema de la ejecución 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 función STARTAPP de AutoLISP. La explicación completa de esta función se encuentra en la sección 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 raíz del disco duro (C:\), podríamos hacer:

(STARTAPP "c:/vbacom/trazado.exe")

Esta línea puede formar parte de un programa AutoLISP, de la macro de un botón, de una opción de menú o de un archivo de guión, además de poder teclearla directamente en la línea 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 también, que no tengan el código fuente a la vista.

Aún así, AutoCAD 14 deberá estar ejecutándose para que estos programas funcionen correctamente, de forma evidente. También hemos de tener en cuenta a la hora de correr nuestros programas en otras máquinas, la necesidad de ciertos archivos (librerías de objetos y demás) para que todo funcione a la perfección.

Por último, reseñar la necesidad de comprobar los derechos de autor de ciertos archivos al distribuirlos de manera gratuita o por una cantidad dineraria.

 
DOCE.12.1.1. Objeto de aplicación en programas
compilados

Al compilar un programa VBA con un Visual Basic externo, se puede dar el caso de que el usuario lo pretenda ejecutar sin tener AutoCAD arrancado. En este caso el programa ofrecería un error.

Para evitar este trance, se suele añadir al programa un código parecido al siguiente, para que se ejecute nada más empezar:

On Error Resume Next
Set AcadApp = GetObject(, "AutoCAD.Application")
If Err Then
  Err.Clear
  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 aplicación de AutoCAD (previamente declarado como Object, al igual que siempre). Si se produce un error se procura crear un objeto de aplicación de AutoCAD (con CreateObject). Lo que hará este mecanismo es arrancar AutoCAD si lo encuentra y no se produce ningún error. Por último, y si esto falla, se presenta un mensaje de error con la descripción del mismo.

Por defecto la aplicación de AutoCAD se inicia con la propiedad de visibilidad desactivada, por lo que habrá que activarla así, por ejemplo:

AcadApp.Visible = True

Después, y si nos interesa, podremos darle tamaño 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 tamaño de la ventana de aplicación 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.

 

DOCE.12.2. Ejecución de programas VBA desde Auto-
LISP y en macros

Así como la función STARTAPP, comentada en la sección anterior, nos es útil para ejecutar aplicaciones Windows, puede que lo que nos interese es mantener el programa VBA sin compilar y necesitemos ejecutarlo sin necesidad de hacer pasar al usuario por todo el proceso de cargar un proyecto, etcétera; es decir, hacerlo de una manera automática.

Desde un programa en AutoLISP podremos utilizar sin ningún problema los comandos que se añaden al instalar VB, es decir _VBALOAD, _-VBARUN y _VBAUNLOAD. Imaginemos que disponemos de una macro creada en un archivo que es de proyecto de VBA llamado PRUEBA.DVB, que se encuentra en el directorio C:\VBA\. Para cargarlo podríamos incluir las siguientes líneas en un archivo AutoLISP:

(COMMAND "_VBALOAD" "c:\\vba\\prueba.dvb")
(COMMAND "_-VBARUN" "Módulo1.MacroPrueba")
(COMMAND "_VBAUNLOAD")

Lo primero es cargar el archivo con VBLOAD (incluimos el guión de subrayado por mayor compatibilidad, como ya sabemos).

Después hemos de ejecutar la macro. Para ello utilizamos el comando VBARUN con el guión normal (-) por delante para ejecutar su versión de línea de comandos. La manera de ejecutar una macro desde la línea de comandos es con la sintaxis que se indica, es decir: primero el nombre del módulo de código que la contiene, luego un punto (.) y por último el nombre de la macro. Aquí el nombre del módulo es Módulo1 (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 ejecución.

NOTA: A esta serie de funciones se le puede añadir código para controlar la existencia del archivo, de la macro, etcétera.

Si lo que deseamos ejecutar no es una macro dentro de un módulo sino un programa con su letrero de diálogo (formulario) y demás, la práctica lógica pasa por crear una macro en un módulo 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 módulo Módulo1) tal que así:

Sub Arranque()
  formPrincipal.Show
End Sub

De esta manera luego podemos dirigirnos desde AutoLISP a esta macro así:

(COMMAND "_-VBARUN" "Módulo1.Arranque")

lo que hará ejecutarse el programa normalmente.

A la hora de ejecutar programas VBA desde una macro (botón, menú o archivo de guión), podemos incluir el código anterior en AutoLISP, ya que resultaría como si lo estuviéramos entrando en línea de comandos.

Sin embargo, por las propias características de las macros, podemos incluir la serie de comandos sin necesidad de hacer intervenir a AutoLISP por ningún lado. Así por ejemplo, la macro de un botón de barra de herramientas que cargue un programa podría ser:

^C^C_VBALOAD c:/misdoc~1/autocad/vba/trazado.dvb;_-VBARUN Módulo1.Macro;_VBAUNLOAD

NOTA: Ténganse en cuenta las propias características de cada tipo de macro, sea de dentro de un botón, de un archivo de guión, etcétera.

Por último decir que en la máquina 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 compilación explicada en la sección anterior (DOCE.12.1.).

 

DOCE.12.3. Enviar cadenas a la línea de comandos
desde VBA

A veces quizá nos interese, desde un programa VBA, acceder a la línea de comandos de AutoCAD para ejecutar algún comando, por ejemplo. O nos sea necesario ejecutar una función o una secuencia de funciones en AutoLISP, porque su efecto no podemos —o no sabemos— conseguirlo con VBA.

Para ello disponemos de un pequeño truco, el cual consiste en utilizar la instrucción SendKeys de Visual Basic. Ésta permite enviar una o varias pulsaciones de teclas a la ventana activa como si lo estuviéramos haciendo desde el teclado. Su sintaxis es:

SendKeys Cadena[,Modo_espera]

Donde Cadena es la cadena que deseamos enviar. Esta puede ser también una pulsación de teclas especiales (ENTER, ALT...), pero nos centraremos en una cadena típica. 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 después de enviarse las pulsaciones. Normalmente utilizaremos esta última opción, que es la predeterminada, por lo que no hará falta que escribamos nada.

Para poder hacer funcionar este mecanismo habremos de ayudarnos de la instrucción AppActivate, cuya sintaxis es:

AppActivate Título[,Modo_espera]

AppActivate activa una ventana de aplicación. Título es el argumento obligatorio que hay que pasarle, y dice referencia al nombre actual en la barra de título (barra azul normalmente) de la ventana. Modo_espera es un valor booleano opcional que especifica si la aplicación que hace la llamada tiene el enfoque antes de activar otra. Si se especifica False (predeterminado), se activa inmediatamente la aplicación especificada, aunque la aplicación que hace la llamada no tenga el enfoque. Si se especifica True, la aplicación que hace la llamada espera hasta que tenga el enfoque y luego activa la aplicación especificada (normalmente utilizaremos esta opción 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 aplicación de AutoCAD primero. Después la activa enviando el nombre de la barra de título actual. Como en AutoCAD (y en otras muchas aplicaciones) este título cambia según el nombre del archivo abierto, se extrae directamente el actual con la propiedad Caption del objeto Application.

A continuación se define y envía la cadena a la línea de comandos. En este caso es el comando para abrir un archivo. Nótese que ha de dejarse un espacio blanco al final para emular un INTRO, ya que es como si estuviéramos escribiendo en línea de comandos.


NOTA: Un
INTRO puede también representarse como {INTRO} o con una tilde ~.

Como se ha dicho, SendKeys se utiliza para enviar pulsaciones de teclas (para pulsar botones desde código, ejecutar opciones de menú, etc.). En AutoCAD, como sabemos, si escribimos algo directamente —teniendo delante la interfaz gráfica— donde primero se refleja es en la línea de comandos. De ahí este mecanismo para este problema.

Podemos también enviar código AutoLISP o lo que nos apetezca. Incluso se podría hacer que un programa VBA leyera línea por línea un archivo .LSP y lo fuera enviando a la línea 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 seguiría mandando líneas y líneas sin parar. Aunque se puede conseguir que esto funcione, lo lógico es reservarlo para acciones simples y cortas, programando el resto del código en VBA.

Aún así, veremos un ejemplo más práctico que el anterior con código en AutoLISP. Sabemos que VBA no dispone (como AutoLISP) de un método o propiedad que llame al cuadro de color de AutoCAD 14. Pues mezclando algunas técnicas podremos hacer desde VBA que se llame a dicho cuadro utilizando AutoLISP para luego acabar con el resultado en una variable VBA. Veamos el código:

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 NúmeroColor As Integer
  NúmeroColor = AcadDoc.GetVariable("useri1")
  MsgBox "Elegido color: " & NúmeroColor
End Sub


Cómo podemos observar, este código consta de dos macros (Macro y Macro2). La primera de ellas es la encargada de enviar el código AutoLISP a la línea de comandos, como hacíamos en el ejemplo anterior. El único inconveniente viene dado por la utilización de paréntesis, y es que estos tienen un significado especial para SendKeys. Es por ello que, cuando queramos utilizar uno, habremos de encerrarlo entre llaves.

También 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.

Según todo esto, una secuencia AutoLISP que sería 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: Repásese la sección NUEVE.3.6. para recordar el sentido de estas quince variables de diferentes tipos. Ahora les hemos encontrado otro quehacer.

Macro2 simplemente se limita a extraer el valor de USERI1, con el método GetVariable del objeto de documento activo, y a mostrarlo. Estas variables de usuario son accesibles del mismo modo que las demás variables de sistema.

NOTA: Primero ejecutaremos Macro y después Macro2.

DOCE.13. COMO APUNTE FINAL

Como se advirtió al principio de este MÓDULO, la comprensión del mismo pasa por el conocimiento obligado por parte del lector de la programación en Visual Basic. Aquí, según se ha visto, se le pega simplemente un gran repaso a todos los métodos y propiedades que componen la inclusión de VBA en AutoCAD 14.

Aún así, el autor de este curso cree que no resulta harto complicado la comprensión del mismo, ya que los ejemplos, los ejercicios y las explicaciones detalladas pueden ayudarnos a comenzar a programar en un lenguaje tan sencillo y versátil como es Visual Basic, sin dejar de lado por supuesto a la parte que le toca al, todavía algo verde, VBA de AutoCAD 14.

 

DOCE.FIN. EJERCICIOS PROPUESTOS

  1. Crear un sencillo programa en VBA que permita cambiar el color a todos los bloques definidos en el dibujo de una sola vez. El letrero de diálogo que maneje puede ser el siguiente:


 

II. Crear una macro VBA que permita añadir líneas de ejes a arcos, círculos y/o elipses previamente seleccionados.

III. Programar un ejemplo en VBA que permita cambiar la altura a todos los textos del dibujo actual. El letrero de diálogo 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 14 a la hora de trabajar con él en cualquiera que sea el puesto de trabajo. Un proyecto de personalización completo puede incluir diseños de menús, barras de herramientas, etcétera; en fin todo lo que hemos estudiado a lo largo de este curso.

 

Autor: Jonathan Préstamo Rodríguez.
Para:
La Web del Programador.