En
las versiones 8.x Microstation incorpora un nuevo lenguaje de programación
para el desarrollo de aplicaciones, lo que le da una gran versatilidad
a la hora de hacer proyectos personalizados y aumentar la productividad.
Este nuevo lenguaje, (VBA), es todo un estandar en el campo de la programación
y Microstation lo incorpora en toda su extensión con un entorno
de desarrollo prácticamente igual al de Visual Basic 6.
Visual
Basic y VBA son lenguajes orientados a objetos utilizados por los desarrolladores
profesionales de aplicaciones y programadores no habituales. Visual Basic
es la plataforma de desarrollo primaria para gran número de productos
comerciales. Visual Basic para Aplicaciones, (VBA), comparte la mayoría
de las características de Visual Basic, siendo la mayor diferencia
con este la imposibilidad de generar ejecutables con VBA (.exe) o controles
ActiveX. Los programas desarrollados con VBA están diseñados
para ser ejecutados sobre una aplicación servidor como Microsoft
Excel, Microsoft Word, o en nuestro caso, MicroStation V8.
Un
programa VBA puede estar compuesto por:
Modulos: Codigo fuente organizado en funciones y procedimientos.
Los nombres de las macros disponibles para un proyecto, coinciden con
los nombres de procedimientos definidos en estos módulos.
Formularios: La parte gráfica de los programas,
es el interface de usuario que puede contener además funciones
y procedimientos en su interior.
Clases: Contenedores en los que se crean definiciones
realizadas por los usuarios de objetos. Suelen contener datos y métodos
para trabajar con esos datos. La diferencia fundamentar con un modulo,
es que se pueden crear instancias de estas clases, tener varios objetos
utilizando este codigo, y los módulos son una única instanciación
del código que contienen.

Sin
pretender dar un curso de programación, quizá la mejor forma
de explicar la funcionalidad de VBA en Microstation sea analizar un
pequeño programa escrito en este lenguaje.
El
programa que analizaré, es una pequeña aplicación
que tiene como finalidad convertir todos los elementos del tipo Text
Node (Nodos de Texto) a tipo Texto. ¿Que utilidad puede tener esto?,
pues sencillamente es un ejercicio de programación al que posteriormente
con algo de imaginación se le puede sacar un buen provecho.
 |
El
programa tiene como interface de usuario una ventana en la que se
muestran todos los niveles del fichero de diseño activo, permitiendo
elegir en que nivel se procesarán los Nodos de Texto, o por
el contrario, procesar todos los Nodos de Texto del plano independientemente
del nivel en que esten situados.
Para
ello, en el formulario insertamos un Cuadro de Lista (List Box)
en el que cargaremos la lista de niveles del fichero.
Insertamos
también un Check Box para seleccionar si queremos procesar
todos los Nodos de Texto del plano y finalmente un boton de comados
(Command Button) para ejecutar el programa..
Al
ejecutar el programa lo primero que se hace es cargar la lista de
niveles en el List Box. El código es sencillo: |
 |
Private
Sub UserForm_Activate()
Call CargaNiveles
End Sub
Private
Sub CargaNiveles()
Dim oLevel As Level
Dim oLevels As Levels
' Limpio el List Box por si hubiera
algo
ListNiveles.Clear
' Hago una lista con todos los niveles
del fichero
For Each oLevel In ActiveDesignFile.Levels
' y relleno el ListBox con la lista
de los Niveles del fichero
ListNiveles.AddItem oLevel.Name
Next
End Sub
|
Si se pulsa sobre uno de los niveles de la lista, se ejecuta el código
siguiente:
Option Explicit
Dim Nivel As String
Private
Sub ListNiveles_Click()
Dim i As Integer
i = ListNiveles.ListIndex
Nivel = Trim(ListNiveles.List(i))
Check1.Value = False
CmdFichero.Enabled = True
End Sub
Es
decir, almaceno en una variable de la memoria, (Nivel), el nombre
del nivel seleccionado, y a la vez desactivo el Check Box y activo
en botón de procesar el fichero.
El
"peso" fuerte del programa se lo lleva el botón de Procesar
fichero, al pulsarlo se ejecuta este código.
Private
Sub CmdFichero_Click()
Dim Criterio As ElementScanCriteria
Dim Conjunto As ElementEnumerator
Dim Elemento As Element
Dim MiNivel As Level
Dim Punto As Point3d
Dim Texto As String
Dim EleTexto As TextElement
Dim xTexto As Double
Dim yTexto As Double
Dim zTexto As Double
Dim oElEnum As ElementEnumerator
Dim oTextElement As TextNodeElement
Dim oSubElement As TextElement
Dim oElText As TextElement
'Defino un punto para datapoint
Punto.X = 1
Punto.Y = 1
Punto.Z = 1
' Si no he activado el Check Box
If Check1.Value = False Then
Set MiNivel = Application.ActiveDesignFile.Levels(Nivel)
' Si el nivel activo actualmente en la sesión
de Microstation no es el que seleccioné, hago que sea este
If ActiveSettings.Level.Name <> MiNivel.Name Then
ActiveSettings.Level = MiNivel
End If
' Determino las condiciones de búsqueda
en el fichero
Set Criterio = New ElementScanCriteria
Criterio.ExcludeAllLevels
' Y condiciono a buscar solo en el Nivel donde
están los textos
Criterio.IncludeLevel MiNivel
' Si he pulsado el Check Box, es decir si quiero
coger todos los Text Node del plano
Else
Set Criterio = New ElementScanCriteria
Criterio.inludeAllLevels
' Cojo todos los niveles delfichero
CmdFichero.Enabled = True
End If
' Defino las especificaciones que quiero que
tengan los textos nuevos
CadInputQueue.SendCommand "ACTIVE STYLE 0"
CadInputQueue.SendCommand "ACTIVE WEIGHT 0"
CadInputQueue.SendCommand "ACTIVE COLOR 6"
CadInputQueue.SendCommand "ACTIVE LEVEL " & Nivel
CadInputQueue.SendCommand "ACTIVE TXHEIGHT = 1.0"
CadInputQueue.SendCommand "ACTIVE TXWIDTH = 0.75"
' Preparo el fichero para ser escaneado y me
sitúo al principio del mismo
Set Conjunto = Application.ActiveModelReference.Scan(Criterio)
Conjunto.Reset
' Empiezo a escanear el fichero
While Conjunto.MoveNext
Set Elemento = Conjunto.Current
' Solo cojo elementos del tipo Nodo de Texto
(7) y cuando encuentro un Nodo de Texto....
If Elemento.Type = msdElementTypeTextNode Then
' ... hago que se resalte el elemento encontrado
....
Elemento.Redraw msdDrawingModeHilite
Set oTextElement = Elemento
Set oElEnum = oTextElement.GetSubElements
' Recorro todos los componentes del Nodo de
Texto
Texto = ""
Do While oElEnum.MoveNext
Set oSubElement = oElEnum.Current
Set oElText = oElEnum.Current
' Voy añadiendo elementos para hacer
solo una línea de Texto que situaré en la misma posición
que estaba el Text Node
Texto = Texto & oElText.Text
xTexto = oElText.Origin.X
yTexto = oElText.Origin.Y
zTexto = oElText.Origin.Z
Loop
' Borro el Nodo del Texto del Plano
ActiveModelReference.RemoveElement Elemento
Punto.X = xTexto
Punto.Y = yTexto
Punto.Z = zTexto
' Escribo en el fichero el Texto que había
en el Nodo de Texto. Ahora ya es un
elemento de Texto (Tipo 17)
Set EleTexto = CreateTextElement1(Nothing, Texto, Punto, Matrix3dIdentity)
ActiveModelReference.AddElement EleTexto
EleTexto.Redraw msdDrawingModeNormal
End If
Wend
End Sub
El
resultado final es que se han convertido todos los Nodos de Texto a Textos
sencillos en el fichero sobre el que estábamos actuando. El
programa en formato mvba está aquí: TexNode2Text.mvba
Programa
VBA Calcular Superficies de todos los elementos cerrados de un fichero de
diseño y escribir el resultado en el propio fichero dentro de cada
elemento
Este
programa permite calcular la superificie de los elementos cerrados que haya
en un fichero de diseño, pudiendo elegir el nivel en el que estan
estos elementos o calcular la superficie de todos los elementos independientemente
del nivel en el que están situados.
Si se solicita la calcular la superficie de los elementos de un determinado
nivel, el texto de la superficie calculada lo escribirá en el nivel
del elemento encontrado y con los parámetros definidos en la ventana
de diálogo del propio programa.
Si se solicita calcular la superfiice de todos los elementos del fichero
de diseño, escribirá el resultado en el nivel activo en ese
momento.
El
ejemplo que se muestra abajo se ha elegido calcular las superficies de los
elementos que están en el nivel CUADRADOS.

En
este otro ejemplo se ha optado por calcular la superficie de todos los elementos cerrados
del plano y el resultado se escribe en el nivel "Por defecto"
con los parámentros de texto definidos en la ventana del programa.

El programa
dispuesto para ser utilizado está aquí: SuperfText.mvba