Microstation
Microstation VBA
Geographics
S.I.G. (SIG)
Teledetección
Utilidades
Contacto

 

 

Microstation VBA:

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

http://www.lanero.net