Macros Segur

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 42

CURSO DE INTRODUCCIÓN A

MACROS DE MICROSTATION
1. INTRODUCCIÓN A MACROS 1
1.1 Creación de Macros Interactivas 1
1.2 Reproducción de una Macro 2
1.3 Detalle de una Macro 2
2. ENTORNO DE PROGRAMACIÓN 3
2.1 Menú de Archivo 4
2.2 Menú Edición 4
2.3 Menú Ejecutar 6
2.4 Barra de Botones 6
3. REVISIÓN DEL LENGUAJE 7
3.1 Comentarios 7
3.2 Nomenclatura de Identificadores 7
3.3 Tipos de Datos predefinidos 8
3.4 Declaración de Variables 8
3.5 Arrays 9
3.6 Tipos definidos por el usuario, Registros 11
3.7 Ámbito de las Variables 12
3.8 Inicialización de Variables 12
3.9 Literales 13
3.10 Constantes 13
3.11 Expresiones aritméticas 13
3.12 Sentencias 17
3.13 Control de Ejecución 17
3.13.1 Bifurcaciones 17
3.13.2 Iteraciones 19
3.14 Saltos Incondicionales 21
3.15 Estructura del programa 22
3.15.1 Procedimientos 23
3.15.2 Funciones 25
3.15.3 Paso de argumentos a procedimientos y funciones 26
3.15.4 Declaración de funciones y procedimientos 27
3.16 Objetos en Basic 28
3.16.1 Declaración de Variables de objeto 29
3.16.2 Asignación de objetos 29
3.16.3 Creación de instancias de objetos 29
3.16.4 Acceso a propiedades de un objeto 30
3.16.5 Acceso a métodos de un objeto 30
3.16.6 Colecciones de objetos 31
3.16.7 Objetos constantes 31
3.17 Manejo de Errores 32
3.18 Interacción de las Macros con MicroStation 33
3.18.1 Comandos de MicroStation 34
3.18.2 Sistema de coordenadas de las Macros 34
3.18.3 Manipulación de elementos 34
3.18.4 Modificación de elementos 36
3.18.5 Selección de elementos y cercados 37
3.18.6 Localización de elementos gráficos 38
3.18.7 Acceso a la información del archivo de diseño 39
3.18.8 Acceso a los ajustes de MicroStation 39
3.18.9 Acceso a la Información de vistas 39
3.18.10 Acceso a la información de los archivos de referencia 40
3.18.11 Acceso a la información de la sesión 40
3.18.12 Extensiones de Base de Datos 40.
3.19 Cajas de Diálogo 40
3.19.1 Cajas Standard 40
3.19.2 Cajas Personalizadas 41
1. INTRODUCCIÓN A MACROS.
1.1 CREACIÓN DE MACROS GRABADAS
La creación de macros se realiza en lenguaje BASIC, debido a su amplia
difusión y fácil aprendizaje, a este lenguaje se le han añadido extensiones para ejecutar
operaciones en
MicroStation. Las macros más simples posibles son las que llamaremos macros
grabadas, que lo único que hacen es realizar de manera automática una secuencia de
pasos que nosotros hemos realizado con anterioridad. Las operaciones que nosotros
realicemos se pasará a instrucciones en BASIC, que posteriormente el motor de Macros
de MicroStation interpretará.
Para crear una macro se realizarán los siguientes pasos:
Utilidades ?? Crear macro...

Nos aparecerá entonces la siguiente caja de diálogo, donde introduciremos el


nombre de la macro y una descripción de ésta. Además se nos informa de la ubicación
de la macro.
Una vez introducidos el nombre y la descripción, aceptaremos con Ok. Entonces
la ventana se cerrará y se volverá al entorno norma de MicroStation, pero aparecerá la
siguiente caja de diálogo:

Las funciones de esta caja son las siguientes. El icono de reproducción, si se


encuentra pulsado indica que todas las operaciones que realicemos serán grabadas en la
macro. La macro reproducirá todas las operaciones que realicemos mientras esté
pulsado este botón. En la grabación no importará el factor tiempo, solo las operaciones
realizadas. El icono de pausa se utiliza para parar temporalmente la grabación de la
macro, de forma que las operaciones que realicemos mientras este botón este pulsado no
serán incluidas en la macro, de esta manera evitamos que las operaciones que no son
relevantes para el objetivo que debe cumplir la macro no aparezcan en ésta. Cuando se
pulsa, para reanudar la grabación, deberemos pulsar el botón de reproducción. El botón
de Stop acabará la grabación de la macro. Cuando se pulse, la grabación de la macro
habrá finalizado.
1.2 REPRODUCCIÓN DE UNA MACRO

Para reproducir una macro ya existente, los pasos a seguir son los siguientes:
Desde la barra de menús realizaremos:
Utilidades ?? Macros
Nos aparecerá la siguiente caja de diálogo:

Donde seleccionaremos la macro que queremos reproducir, y una vez seleccionada de la


lista, haremos click en Ejecutar. Esto hará que se ejecute la macro. La ventana de la
macros existentes seguirá abierta.
1.3 DETALLE DE UNA MACRO
Si hacemos click en el botón detalle, nos aparecerá una pantalla en la que se indicará el
nombre de la macro seleccionada, la descripción y el lugar donde se encuentra grabada.
Esto se nos comunicará en una caja
de diálogo como la siguiente:

Las macros vistas hasta ahora en del tipo mas básico que se pueden realizar con
MicroStation.
Estas macros no aportan ningún tipo de flexibilidad. Las macros programadas permiten
toda la flexibilidad que sea necesaria, así como la creación de nuestras propias cajas de
diálogo. Para realizar este tipo de macros, MicroStation nos facilita un entorno de
trabajo. La herramienta fundamental es el editor de texto. Si queremos editar el texto de
una macro existente, deberemos hacer:
Utilidades ?? Macros
Y una vez que aparece la ventana con las macros que contiene, deberemos seleccionar
la macro que queremos editar y hacer clic en ella. Después haremos clic en Editar. Con
esto nos aparecerá el código de esa macro en el editor de macros de MicroStation.
2. EL ENTORNO DE PROGRAMACIÓN DE
MACROS EN MICROSTATION BASIC.4
Veremos ahora la utilidad de las opciones del menú del editor de Macros, así como las
funciones de los botones de su barra de tareas.
2.1 MENÚ ARCHIVO
En el menú archivo nos encontramos las operaciones típicas de cualquier aplicación que
se ejecuta en entorno Windows.
Nuevo...
La utilizaremos cuando queramos comenzar a programar una macro desde cero. No será
el procedimiento habitual, pues por metodología partiremos sobre una macro grabada
que nos dará la estructura, y nosotros luego refinaremos.
Abrir
La utilizaremos para abrir el código de una macro ya existente.
Guardar
Almacenará la macro activa. En el editor de macros sólo se puede tener abierto el
código de una única macro.
Guardar como...
Servirá para guardar la macro activa con el nombre y en el directorio que
especifiquemos.
Salir
Sale del editor de macros.
2.2 EL MENÚ EDICIÓN.
Aquí se encuentran las operaciones típicas de las operaciones de edición de cualquier
aplicación en entorno Windows.
Deshacer
Deshace el último cambio realizado.
Repetir
Deshace la última operación deshecha.
Buscar
Sirve para buscar un texto, y nos permite definir si queremos que distinga las
mayúsculas de las minúsculas.
Buscar siguiente
Busca el siguiente texto que coincide con la búsqueda especificada.
Cortar, Copiar, Pegar
Sirven para cortar, copiar y pegar texto en el documento.
Variables
Muestra la caja de diálogo variables, donde se mostrarán las variables de la macro en
ejecución y su estado actual. Cuando se marcan breakpoint en el código de una macro y
se depura, se puede utilizar el editor de variables, tanto para consultar los valores de
estas como para cambiarlos.
En el editor de variables aparecerán todas las variables del programa, si son
complejas, al hacer un doble clic en ellas se desglosarán, y para cambiar el valor de las
ya simples, se hace doble clic en ella y aparecerá una caja de diálogo en la que se puede
cambiar el valor de esta.
Esta utilidad es de gran ayuda, pues podemos consultar el valor de las variables
sin el típico y costoso método de utilizar mensajes por pantalla para conocer el valor de
una determinada variable.
Diálogo personalizado
Desde aquí se gestionan las interfaces de usuario que se van a crear. Esto se verá
mas en detalle en el punto 3.19, Adicción de cajas de diálogo a macros.
Punto de entrada al programa
Se utiliza para arrancar macros cuando se imprime, se realiza una conversión
DWG - DXF.
2.3 EL MENÚ EJECUTAR
Aquí se encuentran las operaciones propias de un entorno de programación.
Comenzar
Comienza la ejecución de la macro
Dividir
Pone o quita un breakpoint en el punto especificado.
Consultar
Ejecución línea a línea del código de la macro, rastreando las subrutinas
Ignorar.
Ejecución línea a línea del código de la macro, saltando las subrutinas, que no se
ejecutan.
Parar
Para la depuración del código del sistema
Seguir
Arranca o continúa (tras parar en un breakpoint) la ejecución del código

2.4 LA BARRA DE BOTONES

La barra de botones incorpora las siguientes funciones, que se encuentran ya detalladas


en las correspondientes utilidades de los menús: Seguir, Parar, Cambiar punto de
conmutación (poner o quitar breakpoints), Consultar, Ignorar, Editar variables.
3. REVISIÓN DEL LENGUAJE
En este punto realizaremos un análisis sobre la sintaxis de un programa en MicroStation
BASIC.
MicroStation BASIC no distingue mayúsculas de minúsculas
3.1 COMENTARIOS
Existen dos tipos de comentarios, utilizando una comilla simple ' o con la palabra
reservada REM. Si se utiliza REM, se entenderá que se está comentando la línea entera.
Si se utiliza ' se podrá comentar tanto una línea completa como el final de una línea de
código. Ejemplos:

'Esto es un comentario de línea completa


Print "Bienvenidos a todos" 'Esto es un comentario tras una línea de código.
REM esto es un comentario

3.2 NOMENCLATURA DE IDENTIFICADORES


Las reglas para la especificación de un identificador, entendiendo por identificador
cualquier palabra que se utiliza para identificar variables, procedimientos, etiquetas de
salto, etc... en definitiva cualquier palabra que utilicemos en el programa que no sea una
palabra reservada del interprete de MicroStation BASIC, son las siguientes:

? Los identificadores deberán estar compuestos de caracteres alfanuméricos, o


sea los dígitos del 0
? al 9, todas las letras y el carácter "_"
? Los identificadores deben empezar con una letra.
? No pueden tener mas de 40 caracteres de longitud.
? Ejemplos de identificadores válidos
Dim var1, var2, celula1
Dim numeroVista
? identificadores no válidos
Dim 2var, 1var
Dim variable?1.8
? pues los primeros empiezan por número, y el último tiene un carácter no
permitido.
?
3.3 TIPOS DE DATOS PREDEFINIDOS
Los tipos de datos básicos que posee MicroStation BASIC son los siguientes:
? Entero (Integer) : valores numéricos entre -32786 y 32767
? Entero Largo (Long): valores numéricos entre -2.147.483.648 y
2.147.483.647
? Cadenas de caracteres (String): Conjunto de caracteres Ascii, de una longitud
máxima de
? 32.767 caracteres.
? Real (Single): Números reales, con valores negativos entre -3.402823E38 y -
1.401298E-45
? y positivos entre 1.401298E-45 y 3.402823E38, esto es, 7 dígitos
significativos.
? Real de doble precisión (Double): Número reales pero con mucha mas
precisión (hasta 15
? dígitos significativos).
3.4 DECLARACIÓN DE VARIABLES
Las variables se utilizan para almacenar valores dentro de ellas, y utilizarlos para
cualquier uso posteriormente (cálculos, impresiones por pantalla, etc...). La declaración
de variables es necesaria en el entorno de desarrollo de MicroStation BASIC, de esta
manera el interprete reserva el espacio necesario para cada variable en tiempo de
compilación. Se pueden declarar la variables
de dos maneras:
-Explícita: Declararlas al principio de la macro (recomendada) o procedimiento.
-Implícita: Se declaran al utilizarlas por primera vez.
Se recomienda la primera debido a que aporta mayor claridad al programa.
En MicroStation BASIC la declaración de una variable se hace según el esquema:
Dim Variable AsTipo
o
Dim Variable CaracterTipo
Se pueden declarar variables del mismo tipo en una sola línea, poniendo comas como
separadores:
Dim Varible1, Variable2, Variable3 As Tipo.9
En la siguiente tabla se resumen la declaración de variables de los tipos preconstruidos:

Si se utilizara la declaración iimplícita en la propia expresión donde aparece la variable


por primera vez, se debe anexionar al nombre de la variable el CCarácterde tipo.
Ejemplos:
nombre$="Miguel de Cervantes"
incremento%=final - inicial
Como se ve, el valor de una variable de estos tipos se accede nombrándola
directamente, y para asignarla un valor igual.
3.5 ARRAYS
Un array es una ccolecciónde elementos de un determinado tamaño (que se
puede en MicroStation Basic cambiar dinámicamente) a los que se accede por índice
Los arrays pueden ser de una o varias dimensiones. Las declaraciones son la siguiente
forma:
DimnombreArray(indice_maximo_dimension1,indice_maximo_dimension2,...)
As Tipo
y el array irá desde 0 hasta indice_maximo_dimension1, etc...
Ejemplos:
Dim personas(50) As String 'array de 51 nombres, indexados del 0 al 50..10
Dim ganadores(2) As Integer 'array de 3 números enteros, indexados del 0 al 2.
Dim coordenadas(10,10) As Integer 'array de dos dimensiones de enteros que
van desde
'el 0..10 y 0..10
Otra posibilidad es utilizar el carácter de tipo:
Dim personas$(50)
Dim ganadores#(2)
Dim coordenadas%(10,10)
El acceso a una posición de un array se hace de la siguiente manera:
variable(indice, indice...)
Ejemplos:
personas(3)="Pedro"
ganadores(0)=35
coordenadas(4,2)=3
Una característica muy importante de los arrays en MicroStation BASIC es que son
redimensionables si así se desea. Si los declaramos como los hemos visto hasta ahora,
serán de longitud fija, pero sin los declaramos sin indicar límites ni dimensiones, las
podremos cambiar en ejecución.
Ejemplos:
Dim ficheros () As String
Dim puntos () As Integer
Dim numeroFicheros As Integer
Dim numeroPuntos As Integer
numeroFicheros=10
ReDim ficheros (10) ‘Ficheros tiene indices ahora de 0 a 10
numeroPuntos=6
ReDim puntos(numeroPuntos, 4) ‘Dos dimensiones, 0..6 y 0..4
Si queremos que nos mantenga el contenido del array al redimensionar, utilizaremos la
clausula Preserve:
ReDim Preserve (numeroFicheros+1)
Si queremos que nos mantenga el contenido, solo podemos cambiar las dimensiones y
los límites.11 de los índices (como veremos a continuacion), pero no podemos cambiar
las dimensiones.
Si deseamos poner unos determinados índices a una dimension, en vez de utilizar el que
se utiliza por defecto, utilizaremos en la definición la clausula To.
Dim valores (1 To 10, 2 To 5) As Integer
‘Vector de dos dimensiones, con límites 1..10 y 2..5
3.6 TIPOS DEFINIDOS POR EL USUARIO, REGISTRO S.
Los registros son tipos que crea el usuario. Son como fichas con distintos
campos del tipo que
especifiquemos. La declaración es del tipo:
Type NombreTipo
variable1 As Tipo1
variable2 As Tipo2
...
variableN As TipoN
End Type
Ejemplo:
Type punto2D
xCoord As Double
yCoord As Double
End Type
Type Persona
nombre As String
apellido As String
edad As Integer
End type
Cuando declaremos una variable de estos tipos se hará de la siguiente forma:
Dim pedro As Persona
Dim pueblo(100) As Persona
El acceso a los diferentes campos de un registro se hace utilizando el punto:
pedro.nombre = 15
pueblo(5).edat = 13
pueblo(3) = pedro.12

3.7 AMBITO DE LAS VARIABLES.


Por defecto las variables son visibles dentro de la parte de la macro donde se
declararon. Es el ámbito por defecto, pero se puede variar utilizando las clausulas Public
y Private.
Variables privadas
Son variables que serán visibles en toda la macro. Se deben declarar antes de
cualquier procedimiento o función. Este tipo de variables se utiliza para compartir
información entre funcines y procedimientos. Para declararlas se utilizará:
Private variable As Tipo
Ejemplo:
Private estado As Integer
Por razones de legilibilidad de programas, su utilización se debe de restringir al
máximo.

Variables públicas
Su visibilidad es para todo el sistema, y es una manera de compartir información
entre dos macros que están activas en el sistema. Tiene muchos inconvenientes, pues se
deben de declarar en las macros que quieren utilizarlas, y si en una macro se declara con
un tipo y en otra macro aparece el mismo macro pero con distinto tipo, una de las dos
macros no se ejecutará. Su declaración se debe de hacer antes de cualquier función o
método. Para declararlas se hará de la
siguiente forma:
Public variable As Tipo
Ejemplo:
Public abiertas As Integer
Solo se deben de utilizar en casos de necesidad.
3.8 INICIALIZACIÓN DE VARIABLES.
MicroStation BASIC realiza una inicializació por defecto de todas las variables al
crearlas. Esta característica es útil, pero por motivos de legibilidad, es interesante
inicializarlas de forma explícita. La inicialización que realiza por defecto es la
siguiente:.13
-Variables numéricas se inicializan a cero.
-Variables String se inicializan con la cadena vacia,“”.
3.9 LITERALES.
Los literales son valores que se indican de manera directa. Los números los
explicitaremos como tales, y las cadenas de texto deberemos introducirlas entre comillas
dobles:

nombre=”Pepe”
edad = 55
peso = 89.5

3.10 CONSTANTES.
Cuando el valor de un literal se debe asignar a una variable o realizar
operaciones con el varias veces, es interesante almacenarlo en una constante con un
determinado nombre. La ventaja es que en caso de cambiar ese valor, con cambiarlo en
la declaración basta, y no deberemos cambiar todas las expresiones. Para declarar una
constante se utiliza: Const nombreConstante CaracterTipo = expresión
Ejemplo:

Const MaximoFicherosReferencia%=255
Const AceptarRechazar = “Aceptar/Rechazar”
Const UnTercio = 1/3 ‘Se evalua 1/3 y UnTercio=0.3333

3.11 EXPRESIONES ARITMÉTICAS.


Una expresión es una combinación de literales, constantes, variables y funciones.

El operador asignación.
Cuando se quiere asignar a una variables el resultado de una expresión se utiliza el
operador asignación, que se encuentra representado por el simbolo igual.
Se pueden asignar sin necesidad de conversiones explícitas cualquier número a
cualquier variable numérica, pues se hacen conversiones automáticas. Pueden existir
errores de “overflow” si el valor que se asigna a una variable es mayor de lo que puede
soportar.
Ejemplo:

Dim valorI as Integer


Dim valorD as Double.14
valorD = 30
valorI=valorD

Las conversiones automáticas de Real a Entero siguen las siguientes reglas:

-Si la parte fraccionaria es mayor que 0.5, se redondea el entero superior


-Si la parte fraccionaria es menor que 0.5, se trunca al entero menor.
-Si es 0.5, si el entero es par, se trunca al entero menor, si es impar, se redondea
al entero
superior.

Ejemplos:

2.1 pasa a 2 2.5 pasa a 2


4.6 pasa a5 3.5 pasa a 4

En una expresión los operadores no necesitan ser del mismo tipo, los tipos mas
pequeños se convierten de manera automática a los mas grandes, y el resultado se
convierte al tipo de la variable a la que se le asigna la expresión.
Operadores aritméticos

Elevar la primera expresión


a la segunda 2.15
Operadores de concatenación de cadenas de caracteres o strings
Operadores relacionales

En las comparaciones con Strings, hay que tener en cuenta que son distintas las
mayúsculas que las minúsculas, yque una “A” es menor que “a”, o sea las mayusculas
tienen menos valor que las minúsculas.
Operadores lógicos

Los operadores lógicos tambien funcionan con operadores numéricos, realizando las
operaciones
booleanas bit a bit.
Preferencia de operadores
Ordenados de mayor a menor preferencia serán:

Los operadores lógicos tambien funcionan con operadores numéricos, realizando las
operaciones booleanas bit a bit.

3.12 SENTENCIAS
En MicroStation BASIC, cada sentencia debe ir en una línea, y en caso de no
caber , se puede utilizar el caracter “_” para continuar en la siguiente línea, pero nunca
dentro de una literal que sea una cadena de caracteres, además debe de ser el último
caracter y estar separado del anterior por un espacio.
Dim mensaje As String
mensaje = “El perro de san roque no tiene rabo” + _
“porque Ramón Rodriguez se lo ha robado”

3.13 CONTROL DE EJECUCIÓ N.


Aquí explicitaremos las diferentes sentencias de ejecución que posee MicroStation
BASIC.

3.13.1 BIFURCACIONES

If..Then..Else End If

Ejecuta un bloque o otro de manera condicional. La extructura es la siguiente:


If condicion1 Then
[bloque 1]
[ElseIf condicion 2 Then
[bloque 2]]
....
[Else
[bloque N]]
End If
Se entra en el bloque cuya condición sea válida, en caso de haber mas de una condición
válida, se ejecutará la primera que se encuentre. Las comparaciones deben ser booleanas
o numéricas,
teniendo en cuenta que cualquier número distintode cero se entenderá como verdadero,
y un cero es falso.
Ejemplos:
If numero < 3 Then
Print “Es menor que tres”
ElseIf 3<=numero<=5 Then.18
Print “Está entre 3 y 5"
Else
Print “Solución por defecto”
End If
If 3+2 Then
Print “Por aquí pasará siempre”
Else
Print “Por aquí no pasará nunca”
End If
Select...case
Es una alternativa al If.. ElseIf... donde se evaluan diferentes valores para una
expresión. La estructura es la siguiente:
Select Case expresionTest
[Case listaExpresiones_1
[bloque 1]]
[Case listaExpresiones_2
[bloque 2]]
...
[Case Else
[bloque N]]
End Select
Se en la primera en la que al evaluar la expresión devuelva verdadero. Si no coincide
ninguna, se entrará en el Case Else, si este existe. Si se desean poner rangos de valores,
se utiliza la clausula
To, y si se desean poner diferentes valores, se separan por comas. Si se desea nombrar a
la propia expresión, se puede utilizar la clausula Is.
Ejemplos:
Select var1
Case Is < 0
Print “valor 0"
Case 0 To 2,15,16
Print “valores 0,1,2,15,16"
Case 6 To 8,19,20
Print “valores 0,1,2,15,16"
Case 12 To 14,23,24.19
Print “valores 12,13,14,23,24"
Case Is < 6,17,18
Print “valores menores que 6 mas 17,18"
Case Is < 12,21,22
Print “valores menores que 12, mas 21,22"
Case Is < 127
Print “valores menores que 127
Case 127
Print “valor 127"
Case Else
Print “ninguno de los anteriores, o sea, mayores que 127”
End Select

3.13.2 ITERACIONES

Do...loop

Un Do...loop ejecuta un bloque un número indefinido de veces. Existen cuatro


variaciones de este bucle, que se diferencian en la manera de evaluar la condición de
continuidad, y si esta condición debe ser verdadera o false para seguir iterando en el
bucle.

Do While ... Loop

La sintaxis de esta variación es de la forma:

Do While condición
Instrucciones
Loop

Esta variación lo primero que hace evaluar la condición, y si es verdadera, entra en el


bucle, y lo ejecuta, y antes de ejecutar de nuevo las instrucciones vuelve a evaluar la
condición. Cuanda sea falsa esta condición, se pasará a la siguiente instrucción que halla
tras el loop.
Ejemplo:
Dim ficherosDGN (1 To 100) As String
Dim numeroFicheros As Integer
numeroFicheros=1
ficherosDGN(numeroFicheros)=Dir$(“*.dgn”)
Do While ficherosDGN(numeroFicheros)<>”“
numeroFicheros = numeroFicheros + 1
ficherosDGN(numeroFicheros) = Dir$()
Loop
Este bucle lo que hace es obtener todos los nombres de los ficheros .dgn que halla en el
directorio
activo, y los almacena en el array ficherosDGN.

Do...Loop While

La sintaxis es la siguiente:

Do
Instrucciones
Loop While Condición
Se diferencia de la anterior, en que primero se ejecutan las instrucciones y despues se
verifica la condición, de esta manera el bucle se ejecuta como mínimo una vez. Se intera
mientras la condición sea verdadera.

Do Until ... Loop

Es como la primera variación del Do...Loop, pero ahora el bucle se ejecuta mientras la
condición sea falsa, cuando se hace verdadera se sale del bucle. La sintaxis es la
siguiente:

Do Until Condición
Instrucciones
Loop

Do ... Loop Until

Es como la segunda variación del Do...Loop, pero ahora el bucle se ejecuta mientras la
condición sea falsa, cuando se hace verdadera se sale del bucle. La sintaxis es la
siguiente:
Do
Instrucciones
Loop Until Condición
Como en la segunda variación, esta variación del Do...Loop se ejecuta siempre al menos
una vez, pues la condición se evalua despues de ejecutar las instrucciones.

While...wend

Es identica a la variación del Do...Loop de la forma Do While ... Loop, y se comporta


de identica manera.

For...Next

Cuando se sabe el número de veces que se debe de ejecutar un bucle, lo correcto es


utilizar el.21
bucle For. La sintaxis de un bucle for es la siguiente:

For contador=expresion_inicio To final [step incremento]


instrucciones
Next [contador]

Los pasos que hace son:

-Inicializa contador con el valor de expresión_inicio


-Compara contador con final. Si es mayor y incremento es positivo, se sale del
bucle. Si es menor que el final o el contador es negativo, se continua el bucle
-Se ejecutan las instrucciones
-Se añade incremento a contador
-Se vuelve al paso dos.
El valor de contador no se debe modificar en instrucciones.
Ejemplo:
Dim puntos(100) As Double
Dim num As Integer
...
For num = LBound (puntos) To UBound (puntos)
puntos(num).x = puntos(num).x * scala
puntos(num).y = puntos(num).y * scala
Next num
Si no se utiliza al clausula Step, el incremento que se toma por defecto es 1, si se desea
otro, se debe especificar.

3.14 SALTOS INCONDICIONALES


Goto

Si bien esta es una herramientas mas de programación de las muchas que tiene
MicroStation BASIC, no se debe de utilizar nunca. Esto es debido a que resta claridad y
estructuración al progrma, llendo en contra de toda programación estructurada.
Comentaremos su existencia y uso, pero se deberá utilzar a la hora de programar.
Para hacer un salto incondicional, lo primero es etiquetar una línea (poner un label).
Para esto antes de la instrucción se coloca un identificador seguido de dos puntos.
Ejemplo:

asignacion: punto.x = 30.22


punto.y = 20

Para saltar a esa lína, debermos utilizar la sentencia Goto seguido del identificador de
etiqueta al que deseemos saltar.
Ejemplo:

Goto asignación

GoSub... Return

Es del mismo tipo que un Goto, pero que vuelve automáticamente a la siguiente
sentencia desde la que se saltó al encontrar un Return.
Ejemplo:
‘Calculo de la suma de las 10 primeras potencias de 2
Sub Main
Dim exponenteMaximo, total, exponente As Integer
exponenteMaximo = 10
total = 0
GoSub Calcular
Print “La suma de:”; exponenteMaximo; “es”; total
Exit Sub
Calcular:
For exponente = 1 to exponenteMaximo
total = total + 2 ^ exponente
Next exponente
Return
End Sub

Al igual que la instrucción Goto, no se debe de utilizar, por los mismos motivos que
esta.
3.15 ESTRUCTURA DE PROGRAMA
Cuando se va complicando el programa principal, es necesario estructura el programa
en subprogramas que cumplen diferentes tareas. Se pueden crear dos tipos de
subprogramas, procedimientos y funciones.
-Los procedimientos no devuelven valores, la llamada al procedimiento se una
sentencia por sí.
-Las funciones si pueden devolver valores, de manera que la llamada puede
formar parte de una expresion.
-Existen procedimientos y funciones definidos por el usuario y procedimientos y
funciones que forman parte del entorno de desarrollo, y que ya se encuentran
implementados.
En el desarrollo del código de un subprograma o subrutina, se permite la recursión, esto
es, que la subrutina se llame a si misma.
El uso de procedimientos y funciones, además de utilizarse para estructurar el programa,
vale para encapsular operaciones que se van a utilizar en diferentes puntos del
programa, o operaciones que interesa que se hagan de una sola llamada, por motivos de
claridad (calcular un factorial por ejemplo).
En macro de MicroStation, lo primer que se ejecuta es el procedimiento Main, que
deberá estar en toda macro definido, y a partir de este se llamará a los procedimientos
que hagan falta.

3.15.1 PROCEDIMIENTOS
Declaración de procedimientos
La declaración de un procedimiento es la siguiente:

Sub nombreProcedimiento [(lista de parámetros)]


instrucciones
End Sub

A un procedimiento se le pueden pasar unos parámetros, que serán valores de entrada


y/o salida que utilizará interiormente para realizar cálculos y posteriormente devolver
resultados si es necesario. Los parámetros que se le pasen, si son mas de uno irán
separados por comas, y se indicará el nombre del parámetro y su tipo. La sintaxis de
esta lista de parámetros será la siguiente:

[ByVal] nombreVariable [( )] [As tipo]

Por defecto, los parámetros de un procedimiento, si se modifica su valor dentro del


procedimiento, este valor al acabar el procedimiento se habrán alterado en el programa
que lo llamo, esto es, las modificaciones que se realizan en la variable se mantienen.
Para evitar, esto es, que los parámetros sean solo de entrada, y no de entrada salida,
pondremos delante de la variable la palabra reservada ByVal.
Ejemplos:

‘Imprime la suma de las N potencias de M


Sub ImprimePotenciaSumada (base As Integer, exponente As Integer)
Dim total As Long
Dim exp As Integer
total = 0.24
For exp = 1 To exponente
total = total + base ^ exp
Next exp
Print “Suma: “; total
End Sub
‘Calcula la distancia entre dos puntos, la imprime y la devuelve en una
variable.
Sub Distancia ( puntos() As Point2d, distancia As Integer)
Dim xDistancia, yDistancia As Long
xDistancia = puntos(2).x -puntos(1).x
yDistancia = puntos(2).y - puntos(1).y
distancia = Sqr(xDistancia * xDistancia + yDistancia * yDistancia)
End Sub

En este ejemplo vemos que al poner como parámetro de entrada un vector, no es


necesario
especificar los límites de este.Al salir del procedimiento tendremos en la variable que se
halla
pasado como parámetro en el lugar donde está distancia la distancia entre los dos
puntos.

‘Procedimiento sin parámetros, pues deja el resultado en una variable


global
Private ficherosDgn (1 To 100) As String
Sub obtenFicheros
Dim numero As Integer
numero = 1
ficherosDgn (numero) = Dir$(“*.dgn”)
While ficherosDgn (numero) <> “”
numero = numero + 1
If (numero >= 100) Then
Exit Sub
End If
ficherosDgn (numero) = Dir$()
Wend
End Sub
Llamada a procedimientos
Existen dos formas de llamar a un procedimiento:
-Nombre del procedimiento, con los parámetros que se le pasan separados por
comas tras de el.
-Con la clausula Call, se pondrá la clausula Call seguida del nombre y luego la
lista de parámetros separadas por comas y entre paréntesis
Ejemplo ‘Imprimir la suma de las potencias

Sub main
Dim maximo As Integer
maximo = 10
ImprimePotenciaSumada 2, maximo
Call ImprimePotenciaSumada (3, maximo)
End Sub
Por claridad resulta mejor el segundo tipo de llamada.

3.15.2 FUNCIONES
Declaración de funciones

Las funciones se diferencian de los procedimientos en que devuelven un valor. La


sintaxis de su declaración es la siguiente:

Function nombre [(listaParámetros)] [As Tipo]


instrucciones
End Function

Una función solo puede devolver cosas de tipos predefinidos, no se pueden devolver ni
arrays ni tipos construidos por el usuario.
Para que la función devuelva en valor, se deberá de asignar al nombre de la función el
valor que se desea devolver, de lo contrario de devolverá un 0 si era un valor numérico
o la cadena vacía si lo que se pretendía devolver era un String.
Si se quiere salir de una función antes de llegar al End Function, se puede utilizar la
clausula Exit Sub. Se suele utilizar si se asigna el valor al nombre de la función y
todavía queda código por delante, que será inutil ejecutar, pues ya no influira nada (ya
se ha asignado el valor a devolver), pues los parámetros de una función son solo de
entrada.
Ejemplos:

‘Calculo de la suma de las N primeras potencias de M


Function SumaPotencias (base As Integer, maxExpo As Integer) As Long
Dim total As Long
Dim exponente As Integer
For exponente = 1 to maxExpo
total = total + base ^ exponente
Next maxExpo.26
SumaPotencias = total
End Function
‘Calcula distancia entre dos puntos
Function Distancia (puntos() As Punto2D) As Double
Dim xDistancia, yDistancia As Double
xDistancia = puntos(2).x - puntos(1).x
yDistancia = puntos(2).y - puntos(1).y
Distancia = Sqr((xDistancia ^ 2) + (yDistancia ^ 2))
End Function
Llamada a funciones
Una función puede ser llamada dentro de una expresión debido a que devuelve
un valor determinado, por lo demás es igual que un procedimiento, pero no se
les llama con Call.
Ejemplos:
‘Suma de las 10 primeras potencias de 2,4,6 y 8
Sub Main
Dim total As Long
Dim base As Integer
For base = 2 To 8 step 2
total = SumaPotencias(base,10)
Print “Suma de las primeras 10 potencias de: “; base; “es”; total
Next base
End Sub

3.15.3 PASO DE ARGUMENTOS A PROCEDIMIENTOS Y FUNCIONES

Por defecto, los argumentos se pasan por referencia, esto implica que si en la cabecera
del procedimiento o función no se ha utilizado la clausula byVal, si se modifica el valor
de ese parámetro dentro del procedimiento, al volver al programa que llamó al
procedimiento, el valor de esa variable habrá cambiado.
Para evitar que se modifique el valor de la variable hay varias posibilidades:

-Poner delante del parámetro la clausula ByVal


-Cuando se llama al procedimiento o función, pasar el argumento que queremos
que no varíe entre paréntesis.

De esta manera se pasará el parámetro por valor, y no será modificado. Es mas


recomendable utilizar la primera, pues aumenta la claridad del programa. Si se pasa una
expresión como parámetro, se convertirá a una variable, y aunque se modifique el valor
de ese parámentro, obviamente no se modificará nada, pues no se ha pasado una
variable, sino una expresión. Tampoco se genera ningún error, se se pasa una expresión
en un parámetro que se modifica interiormente.
Ejemplos:

Function Prueba (i As Integer) As Integer


i=i+1
Prueba = 2
End Function
Sub main
Dim s, s1 As Integer
s=2
s1 = Prueba (s)
Print(s)
End Sub

En este caso se imprimira en la caja de texto el número 3, pues se incrementa. Si en la


llamada a
la función pongo:

s1 = Prueba((s))

Se imprimirá el número 2, pues no se modificará la variable. Lo mismo sucederá, si en


la declaración de la función, pongo:

Function Prueba (ByVal i As Integer) As Integer


3.15.4 DECLARACIÓN DE FUNCIONES Y PROCEDIMIENTOS

La manera típica de declara los procedimientos y funciones es colocarlos todos ellos


delante de la función Main, que es la que se ejecuta, de esta manera se puede verificar la
corrección de las llamadas antes de hacerlas. Al igual que esto, si un procedimiento
llama a otro, es necesario que el llamado sea declarado antes que el invocante. Esto se
puede cambiar, poniento todos los procedimientos despues de la función Main, pero
para esto hay que indicar el prototipo del procedimiento o función con anterioridad.
Esto se hace utilizando la clausula Delcare y la cabecera del procedimiento o función.
Ejemplos:

Declare Sub ImprimeSumaPotencias (base As Integer, maxEspo As Integer)


Declare Funciont Distancia (puntos() As punto2D)

3.16 OBJETOS EN BASIC

Un objeto es una entidad que engloba unas propiedades o atributos (información del
elemento) y métodos (operaciones que puede realizar ese objeto). Un ejemplo se objeto
sería una persona:

-Atributos:
Edad, nombre, apellidos, etc..

-Metodos:
PonNombre, PonApellidos, Cumpleaños, Edad?

Se podrían declarar diferentes variables de tipo Persona y podríamos realizar


operaciones sobre estas variables, accediendo a sus propiedades y utilizando su
métodos.
En MicroStation BASIC no podemos definir nuestros própios objetos, solo podemos
utilizar algunos objetos que se encuentran predefinidos. Estos objetos son los siguientes:
3.16.1 DECLARACIÓN DE VARIABLES OBJETO
Se utiliza la sentencia Dim, Private o Public de la siguiente forma:
Dim elemento As MbeElement
Private elemSet As MbeElementSet
Public elemSet2 As MbeElementSet
Cuando se crea una variable se le da el valor inicial Nothing, pues todavía no está
asociada a un objeto físico.

3.16.2 ASIGNACIÓN DE OBJETOS

Una vez declarado, hay que asignarle un objeto físico, esto se hace con la sentencia Set,
seguido de una asignación con el operador igual. Al asignar un objeto a otro, se hace
una union unívoca entre ambos, de manera que si modificamos uno, los objetos a los
que fue asignado este también habrán cambiado.
Ejemplos:

Dim elem1, elem2 As MbeElement


Set elem1 = FirstSetElement() ‘Esta funcion devuelve un MbeElement
Set elem2 = element1
...
Set elem1 = Nothing ‘Se rompe asociación
Set elem2 = Nothing ‘Se rompe asociación

Se pueden comparar dos variables de objeto, para ver si apuntan al mismo objeto, si las
variables
contienen identica información, pero no apuntan al mismo objeto, la comparación
devolverá falso. Para comparar dos objetos se utiliza la clausula Is. Así mismo, también
se pueden comparar con Nothing.
Cuando asignamos a una variable de un determinado tipo, el cual es un objeto, y le
asignamos un objeto determinado, decimos que tenemos una instancia de este objeto.
3.16.3 CREACION DE INSTANCIAS DE OBJETOS.

Podemos crear una instancia de un objeto en la propia declaración, sin necesidad de


asignarle otro objeto ya existente. Esto se hace utilizando la clausula New. Y será algo
de la forma:
Dim variableObjeto As New Objeto
Ejemplo:

Dim elem As New MbeElement

Ahora el valor del objeto declarado no es Nothing, es un valor que se refiere a un objeto
físico.
Otra posibilidad es utilizar la clausula Set:
Set variableObjeto = New Objeto
Pero para hacer esto antes se ha tenido que definir la variableObjeto,con una sentencia
Dim
Ejemplo:
Dim elem AS MbeElement
...
Set elem = New MbeElement
...

3.16.4 ACCESO A LAS PROPIEDADES DE UN OBJETO

Para acceder a las propiedades de un objeto, se pone el nombre de la variable, un punto


y el nombre de la propiedad. Algunas propiedades se podrán leer y escribir, otras solo
leer. Será de la forma:
variablesObjeto.propiedad
Ejemplo:
color = elem.color
elem.color = 4

3.16.5 ACCESO A LOS MÉTODOS DE UN OBJETO

Para acceder a los métodos de un objeto, se pone el nombre de la variables, un punto y


el nombre del objeto, seguido de sus parámetros si son necesarios. Si el método no
devuelve nada, se comportará como un procedimiento, si devuelve algo, como un
función. La sintaxis es la siguiente:
variableObjeto.método [argumentos]
Si devuelve algo:
variableObjeto.método ([argumentos])
Ejemplos:
Dim origen As MbePoint
If elem.getOrigin (origin) <> MBE_Success Then
Print “El elemento no tiene origen”
Else
Print “Origen: ”; origen.x; origen.y;origen.z
End If
3.16.6 COLECCIONES DE OBJETOS

Las coleccione de objetos son objetos que contiene otros objetos dentro, para acceder a
estos objetos se utilizan indices, que pueden ser (los índices) Strings o números. Se
comporta mas o menos como un Array unidimensional.
Ejemplo:
‘MbeViews es una colección de objetos MbeView
Dim currentView As MbeView
Dim num As Integer
Set currentView = MbeViews(7) ‘Asigna la vista 7 a currentView
currentView.pattern = True ‘la pone como activa
currentView.update ‘Redibuja la vista 7
For num = 1 To 8
If MbeViews(num).active <> 0 Then
Print “Vista “; num; “está activa.”
End If
Next num
Además de acceder a los objetos de la colección, poseen como cualquier otro objeto sus
propios métodos y propiedades.

3.16.7 OBJETOS CONSTANTES

Debido a su idoneidad, se exponen los datos del sistema como objetos, para manejarlos
de manera fácil. De esta manera manejar el entorno será llamar a los métodos y
propiedades de estos objetos. Estos objetos la única limitación que tienen es que no se
les puede utilizar en sentencias Set, ni utilizar comparaciones lógicas con ellos mediante
el operador Is. Tampoco se pueden declarara variables de su tipo ni crear variables
objeto y apuntarlas a ese objeto. Ejemplos de este tipo de objetos son MbeState, por
ejemplo.
Ejemplo:

Dim punto As MbePoint


Dim vista As Integer
If MbeState.getInputDataPoint (point,view) = BESuccess Then
Print “Punto en vista “; view; “ : “; punto.x ; punto.y
End If
3.17 MANEJO DE ERRORES

Aunque se halla depurado un programa perfectamente, pueden ocurrir errores de


ejecución, debido a fallos del usuario (no tener un disquette introducido, etc... ). Para
controlar estos errores se utilizan varias sentencias.

On Error Goto etiqueta

Esta sentencia se debe poner en los procedimientos que creamos que pueden generar
errores de ejecución. Tras la etiqueta se pondrán las instrucciones a seguir cuando se
genera el error. Con esto creamos un handle del error (manejador).

Resume

En el manejador puede aparecer esta sentencia, la cual hace que se vuelva a la ejecución
en el punto en el que se generó. Se debe utilizar cuando el usuario es capaz de corregir
el error.

Resume Next

Si se utiliza esto en el handle del error, se continuará la ejecución en la siguiente


sentencia a la que generó el error. Es la mas utilizada cuando tras generar el error, este
se corrige por programa, de manera que se puede continuar con la ejecución sin
colaboración del usuario.

Resume etiqueta

Lo que se hace es continuar la ejecución en la sentencia etiquetada con la etiqueta


especificada.
Ejemplo:
‘verificación de la existencia de un fichero
Function ExistenciaFichero (nombre As String) As Integer
Dim errNum As Integer
On Error Goto handleError.33
ExistenciaFichero = Dir$(nombre) <> “”
Exit Function
handleError:
errNum=Err()
If erNum = 71 Then
Print “Insertar el floppy o CD” ‘ Disco no preparado
Sleep (2000) ‘ Esperar dos segundos
ElseIf errNum = 53 Or errNum = 76 Then ‘ El fichero no existe
ExistenciaFichero = False
Resume Next ‘ No existe, continuar
Else
Error errNum ‘ Otro error, se devuelve un error.
End If
End Function
Cuando ocurre un error, se buscan los manejadores en el procedimiento que lo generó,
si no posee un manejador de errores, se va subiendo en los procedimientos que llamaron
al que generó el error, y si se encuentra, se ejecuta. Si no se encuentra, la macro se
aborta con un error. Si se encuentra el manejador en procedimientos superiores al que lo
generó, las sentencias Resume se ejecutan en el procedimiento que tiene el manejador,
no en el que lo generó.
Si se quiere inavilitar en un futuras llamadas un manejador de errores, utilizaremos la
sentencia:
On Error Goto 0
Para acabar la ejecución y devolver un determinado código de error, se utiliza la
sentencia:

Error NúmeroError

Donde NúmeroError es el código del error que se quiere devolver, que puede ser un
predefinido
o uno creado por el programador.

3.18 INTERACCIÓN DE LAS MACROS CON


MICROSTATION
En esta seccion veremos las extensiones del lenguaje BASIC que dan un potente acceso
a las operaciones de MicroStation las extensiones de MicroStation incluyen constantes
predefinidas, tipos de datos, funciones, objetos y colecciones. Para distinguir las
extensiones del MicroStation
BASIC respecto del BASIC Standard, todo lo que sean extensiones tendrán como
prefijo “Mbe”, y las constantes con “MBE_”.
Muchas de las funciones devuelven un entero como código de salida, que indica si se ha
realizado con exito o no. Si se ha realizado con éxito devuelve MBE_Success (realmente
0) y si no devolverá un valor distinto de cero.
3.18.1 COMANDOS DE MICROSTATION
La manera mas simple de realizar una macro es inicializar los comandos de
MicroStation, o sea, las entradas de teclado y por programa proporcionar las entradas
necesarias para esas entradas de teclado. Las funciones que se suelen usar son
MbeSendCommand, MbeSendKeyin,
MbeSendDataPoint, MbeSendTentPoint y MbeSendReset entre otras. Usaremos
MbeGetInput para tomar una entrada del usuario, y MbeState para detectar el tipo y los
detalles de la entrada del usuario. Con MbeWriteMessage, MbeWriteError y
MbeWriteStatus podremos guiar al usuario en la tarea, tambien podemos usar para esto
MbeWrite y MbeWritePrompt.
3.18.2 EL SISTEMA DE COORDENADAS DE LAS MACROS

No se necesita saber en que unidades está el sistema. Todas las coordenadas se pasan a
tipo Double. Los puntos son del tipo MbePoint, que es el siguiente:

Type MbePoint
x As Double
y As Double
z As Double
End Type

Si el fichero es de dos dimensiones, el campo z será cero.


Por defecto se trabaja en las unidades prinicipales del archivo de diseño. El sistema de
coordenadas puede cambiarse utilizando el objeto MbeCurrentTransform, su método
dgnUnits pone el sistema de coordenadas a las coordenadas del archivo de diseño,
masterUnits las devuelve a las que aparecen por defecto. El método fromView orienta el
origen de coordenadaspara coincidir con la orientación de una determinada vista. Otras
operaciones que se pueden
realizar son moveOrigin, moveOriginWorld, rotate y scale.
Todos lo ángulos que pasamos o devuelve las funciones extension de MicroStation van
enradianes, com lo que esperan las entradas de teclado son grados, habrá que
convertirlos
(multiplicando por 180.0 / PI).

3.18.3 MANIPULACIÓN DE ELEMENTOS GRÁFICOS


Cualquier objeto gráfico se puede representar en la macro con un objeto del tipo
MbeElement, que posee métodos y propiedades suficientes para realizar todo tipo de
operaciones con el, sin necesidad de utilizar entradas de teclado. En MbeElement
pueden estar tanto elementos gráficos simples (p.e una simple línea) o complejos
(células, textos... ). Los complejos estarán siempre formados por una cabecera y uno o
mas elementos que dependen de él.
En un fichero de diseño hay dos tipos de objetos, gráficos y de control. Los objetos de
control contiene cosas como los ajustes del archivo de diseño, configuración de las
vistas, etc....

Uso del objeto MbeElement

Lo primero será declararar un objeto de ese tipo:

Dim elem1 As New MbeElement


o
Dim elem1 As MbeElement
Set elem1 = New MbeElement

Ahora hay que asignarle un elemento gráfico de algún tipo. Se puede hacer de dos
formas:
-Con el método fromFile que optiene un elemento gráfico del archivo de diseño
-Con el método fromLocate, que optiene el elemento que está seleccionado en el archivo
de
diseño
Lo siguiente muchas veces será determinar si el elemento es complejo o simple, para
esto se utiliza la propiedad de solo lectura isHeader

Elementos gráficos simples

Si son simples, las manipulaciones son directas, se pueden utilizar sus atributos o
propiedades, tales como color, weight, style, level y class, determinar las propiedades de
su geometría usando getRange, getOrigin, getEndPoints y getPoints. Igual con texto,
que tienen sus propios métodos, tales como font, justification, charWidth, charHeight,
getString, etc...

Elemento gráficos complejos

Manejar elementos gráficos complejos es mas complicado. Estos elementos están


estructurados como árboles.
Esto es el caso mas sencillo de un elemento compuesto, pero puede suceder que uno de
los elementos componente sea a su vez otro elemento compuesto. Lo que se hace es
navegar por el arbol, con las operaciones necesarias, y las operaciones que se realizan se
hacen sobre el elemento que es el actual, o sea, donde estemos situados en ese
momento. Para cambiar de elemento se utilizan operaciones como nextElement,
nextComponent y firstElement. nextElement
nos pasa al siguiente, nos pasará al hermano y nextComponent nos pasará al primer
hijo. Lo mas normal es utilizar un recorrido del arbol, de esta manera podremos recorrer
el arbol entero. Uno
de estos recorridos es el que va recorriendo hijos, y se mete en los que son complejos.
Se hace perfectamente con un arlgoritmo recursivo:

‘Muestra la información de un elemento, su nivel tipo y posición en el fichero.


Sub MuestraInfoElemento (nivel As Integer, elem As MbeElement)
If nivel > 0 then
print Spc (nivel * 2); “(“; nivel; “) Tipo “; elem.type
Else
print “Tipo :” ; elem.type
End If
Print “ Posición en fichero: ”; elem.componentFilePos
End Sub
‘Algoritmo recursivo de recorrido de arboles
Sub RecorreElemento (nivel As Integer, elem As MbeElement)
Dim siguiente As Integer
Do
‘Mostrar la información del elemento
Call MuestraInfoElemento (nivel,elem)
If elem.isHeader <> 0 Then ‘Es un elemento complejo
If elem.nextComponent = MBE_Success Then
Call RecorreElemento(nivel+1, elem)
End If
siguiente = inElem.nextElement
Else
seguiente = inElem.nextElement
End If
Loop While siguiente = MBE_Success
End Sub
‘Programa principal
Sub main
Dim elem As New MbeElement
Dim posicion As Long
‘inicialización, leemos el primer elemento
posicion = element.fromFile(0)
Do While posicion >= 0
Call RecorreElemento (0,elem)
posicion = elem.fromFile (posicion + elem.fileSize)
Loop
End Sub

3.18.4 MODIFICACIÓN DE ELEMENTOS GRÁFICOS

Muchas de las propiedades son de solo lectura, de manera que se pueden consultar pero
no escribir en ellas. Ejemplos de propiedades de solo lectura son type, ejemplos de
propiedades de lectura escritura son color, level, weight, style, class y group. Cuando se
cambian estas propieades, y el elemento es complejo, se modifica el componente que es
el actual. Si queremos que se apliquen a todos tendremos que poner la propiedad
changeAll a TRUE.

3.18.5 USANDO SELECCION DE ELEMENTOS Y CERCADOS

Se utiliza MbeElementSet, para operarar con los elementos que están seleccionados, ya
sea un cercados o seleccionados por el usuario. Lo primero es declarar el elemento a
utilizar:

Dim elemSel As New MbeElementSet


o
Dim elemSel As MbeElementSet
Set elemSel = New MbeElementSet

Con esto ya hemos declarado el objeto y reservado memoria para ellos. Ahora debemos
tomar los elementos para meterlos en el objeto, lo podemos hacer utilizando los
métodos del objeto
fromSeleccionSet y fromFence. Para obtener los diferentes elementos seleccionados,
utilizaremos getFirst y getNext, que nos devolverán objetos del tipo MbeSetMember,
que contienen la siguiente información:

Type MbeSetMember
filePos As Long
fileNum As Integer
End Type

Con esta información, podemos acceder a los elementos utilizando el método fromFile
de los objetos de tipo MbeElement
Una vez utilizados los elementos, liveraremos memoria utilizando el método clear.
Ejemplo:

Sub main
Dim elemSet As New MbeElementSet
Dim elem As New MbeElement
Dim setMem As MbeSetMember
Dim tieneElem As Integer
Dim pos As Long
If elemSet.fromSelectionSet(1) <> MBE_Success Then
Print “No hay nada seleccionado, probando con cercado”
If elemSet.fromFence() <> MBE_Success Then
Print “Tampoco hay nada seleccionado con cercado”
Exit Sub
Else.38
Print “Procesando el cercado”
End If
Else
Print “Procesando los elementos seleccionados”
End If
tieneElem = elemSet.getFirst (setMem)
Do While tieneElem = MBE_Success
pos = elem.fromFile (setMem.filePos,setMem.fileNum)
Call ProcessElement (0,element)
tieneElem = elemSet.getNExt (setMem)
Loop
End Sub

3.18.6 LOCALIZACIÓN DE ELEMENTOS GRÁFICOS

Existen tres posibilidades diferentes, las analizamos:


-La macro va a operar sobre el elemento selecciando utilizando los métodos y
propiedades del objeto MbeElement. El elemento, se desea que sea identificado por el
usuario.
Para este caso, utilizaremos la función MbeStartLocate, que espera a que el usuario
identifique un elemento, una vez que se sale de esta función, es que ya está identificado,
por lo tanto podemos cargar el elemento con MbeElement.fromLocate -La macro
necesita que se el usuario identifique elementos para realizar una tarea, que serealizará
con un comando de MicroStation, (con la función MbeSendCommand) y que será
distinta dependiento de cada elemento.
Utilizaremos la función MbeStartLocate para que el usuario seleccione elementos, luego
identificaremos el elemento, pues lo podemos tomar con el método fromLocate.
Posteriormente mandaremos el comando con MbeSendCommand, y cuando el comando
requiera la entrada del
usuario, llamaremos a la función MbeRelocate. Esto conseguirá el efecto deseado, pues
esta función generará el mismo efecto que si se volviera a identificar el elemento.
-La macro necesita encontrar unos elementos para trabajar en ellos, ya sea mediante
cercado, selección del usuario o buscandolos directamente, pero necesita utilizar
comandos de MicroStation que necesitan localización de elementos.
Lo que haremos será ejecutar el comando en todos los elementos que necesitemos.
Cuando el comando nos pida identificar un elemento, utilizaremos la función
MbeLocateElement. Esto para el comando activo tendrá el mismo efecto que si el
usuario identificara un elemento.
Resumimos las funciones principales para localizaciones:
·MbeStartLocate: Para que el usuario identifique un elemento.
·MbeRelocate: Vuelve a seleccionar los ultimos elementos seleccionados.
·MbeLocateElement: Pone como seleccionado el elemento al que se le pase.

3.18.7 ACCESO A LA INFORMACIÓN DEL ARCHIVO DE DISEÑO

Se encuentra en el objeto predefinido MbeDgnInfo, que no necesita que se genere


ninguna instancia, se accede a el directamente, es mas, no podemos definir instancias de
este. Se encuentra definido en toda macro. Esto objeto tiene propiedades de solo lectura,
como dgnFileName, cellFileName, dgn3d, cell3d, dgnFileReadOnly, cellFileReadOnly,
endOfFile, graphicGroup y nextGraphicGroup.
Otras son de lectura/escritura, tales como masterUnitName, subUnitName, uorPerSub y
subPerMaster.

3.18.8 ACCESO A LOS AJUSTES DE MICROSTATION

Se puede acceder a los ajustes y bloqueos para modificarlos mientras trabajamos con
elementos, utilizando el objeto predefinido MbeSettings (con lo que esto supone), que
posee métodos para cambiar los ajustes como color, colorName, lineStyle,
lineStyleName, weight, level, class, angle, font, fontName, gridUnits, gridReference,
textHeight ...
Cuando direccionamos un comando con MbeSendCommand o MbeSenDataPoint, para
saber si la operación se realizó correctamente o no, podemos utilizar la propiedad
cmdResult. Se puede determinar la posición del elemento seleccionado utilizando
locateFileNum y locateHeaderFilePos y locateComponentFilePos.
Además tiene propiedades de lectura/escritura para permitir o no si los mensaje se van a
mostrar al usuario (messages, errorMessages) así como para verirficar si hay elementos
gráficos dibujados en una vista.
Los resultados de una medida están el la propiedad de solo lectura measureResult y
measureResult2.
Tiene además métodos para controlar el proceso de selección de elementos
(locateClassMask, locatePropMask, locatePropVal, setLocateTypeMask,
setLocateFileMask) así como propiedades como locateTolerance.

3.18.9 ACCESO A LA INFORMACIÓN DE LAS VISTAS


Se utilizan objetos del tipo MbeView, que se encuentran almacenados en el objeto
predefinido MbeViews.
Ejemplo:

Dim vista As MbeView.


Set vista = MbeViews(1)

Los objetos del tipo MbeView tiene propiedades de lectura/escritura para modificar las
vistas, tales como fastCurve, slowFont, noText, lineWeight, textNode...
Si la propiedad deferApply esta a FALSE (defecto), los cambios toman efecto
inmediantamente.
Si está a TRUE, toman efecto la próxima vez que se actualice la vista.
3.18.10 ACCESO A LA INFORMACIÓN DE LOS ARCHIVOS DE
REFERENCIA

Los archivos de referencia de almacenan el objetos del tipo MbeRefFile, que se


encuentran almacenados dentro del objeto predefinido MbeRefFiles, que es una
colección de objetos MbeRefFile. MbeRefFiles tiene propiedades como maxRefFiles,
que indica el número máximo de archivos de referencia vinculables.
MbeRefFiles contiene méotod como active, fileName, logical, description, attachName,
notFound, display, snap, locate, display, plot, scaleLineStyle, scale, getLevels, levelsOn
y levelsOff

3.18.11 ACCESO A LA INFORMACIÓN DE LA SESION

Está encapsulada en el objeto predefinido MbeSession. Tiene propiedades como


msProduct, msVersion, msPlatform, languaje, numScreens y canSwapScreen. Se puede
saber el tiempo que ha pasado desde el inicio con la propiedad elapsedTime.
3.18.12 EXTENSIONES PARA BASES DE DATOS
Están implementadas en tres objetos:

·MbeSqlda
·MbeTable
·MbeDatabase
Mas adelante se explicará el comportamiento de estos tres objetos.

3.19 ADICCIÓN DE CAJAS DE DIÁLOGO A MACROS

Podemos añadir a nuestras macros cajas de diálogo para que el usuario tenga una mayor
interacción con la macro, de manera que pueda configurar algunos parámetros,
seleccionar algo de una lista, etc...

3.19.1 CAJAS DE DIÁLOGO STANDARD

MicroStation BASIC tiene algunas cajas de diálogo standard que se llaman con una
determinada función, y al hacer esto aparece la caja de diálogo, se realizan las
operaciones con ella, y la función devuelve un determinado valor. Las funciones que
son de este tipo son, entre otras:

-MbeFileOpen: Saca una caja de diálogo para abrir un fichero


-MbeFileCreate: Muestra una caja de diálogo para crear un fichero
-MbeMessageBox: Para mostrar mensajes
-MbeInputBox: Para obtener información del usuario
-MbeSelectBox: Para seleccionar un elemento de entre una lista

3.19.2 CAJAS DE DIÁLOGO PERSONALIZADAS

Podemos crear nuestras propias cajas de diálogo, pero tienen algunas limitaciones:
-Las cajas de diálogo son modales: Mientras está la caja de diálogo en pantalla,
se para todo
lo demás, es la única que manda en el sistema.
-No tienen funciones para manejar eventos: Lo que realmente hace una caja de
diálogo es meter en una variable de la macro lo que el usuario ponga en un texto,
opción, etc...
-Los tipos de datos se asignan dinámicamente, y el contenido de cualquier
elemento de una caja de diálogo lo determina el tipo de la variable asociada a
esta.
Una vez definida la caja de diálogo, la podremos cargar utilizando la función

MbeOpenModalDialog.

Una caja de diálogo genera un archivo .BA al compilarla, si se borra este archivo se
pierda la caja de diálogo.

EL CONTRUCTOR DE CAJAS DE DIÁLOGO PERSONALIZADAS


Para abrirlo, desde el editor de macros, haremos:
Edición ??Diálogo personalizado ??Editar

Nos aparecerán las siguientes herramientas:

La ventana etiquetada como Constructor, contiene dos listas. Una de ellas, la superior
contiene una lista con todas la cajas de diálogo abiertas, la inferior contiene la
descripción de los elementos que contiene la caja seleccionada en la lista superior.
Los campos de la lista superior son título (nombre de la caja de diálogo), Id nº ( ) y
archivo (archivo físico que la contiene)
Los campos de la lista inferior son X (posicion en el eje X), Y (posición en el eje Y),
Anchura del elemento), Etiqueta (texto que la acompaña), Tipo (del elemento) Id (), EH
(puede ser M de modificado, N de nuevo, R de solo lectura o puede estar en blanco)
Aux ( ).

El menú diálogo

Nuevo
Se utiliza para crear una nueva caja de diálogo.
Cargar
Abre una caja de diálogo donde seleccionaremos el fichero desde donde deseamos
cargar la caja de diálogo, así como el modo en que la abrimos, o sea, dolo de lectura,
como copia del original.
Si se abre una caja de diálogo con un Id que ya está abierto, se abrirá una copia.
Cierra una caja de diálogo
Guardar
Guarda la caja de diálogo en su archivo, si no tenía un archivo especificado, se pedirá en
nombre
de este.
Guardar en archivo existente...
Guarda la caja de diálogo en un archivo ya existente, si se ha abierto como solo lectura,
no está habilitada.
Guardar en archivo nuevo...
Se guarda en un archivo que se pide al usuario.
Borrar
Borra la caja de diálogo seleccionada.
El menú edición

Ademas de las típicas de cualquier aplicación windows (copiar, pegar, cortar, borrar,
seleccionar todo), tiene las opciones de Poner delante y Poner detras, que se utilizan
para cuando se tiene varios controles uno encima de otro, determinar cual estará en
primer plano.

El menú opciones

Probar diálogo
Para cambiar el diálogo entre modo edición y modo prueba. El modo de edición es el
modo normal, en el cual se puede modificar el diálogo. En modo prueba, se muestra el
diálogo tal y como aparecerá al ejecutarse la macro.
Herramientas
Muestra u oculta la caja de herramientas para poner elementos.
Atributos de elemento...
Muestra una caja con los atributos de el elemento gráfico seleccionado (dependerán del
elemento seleccionado) También se pueden sacar los atributos de un elemento haciendo
doble click en este.
Atributos de diálogo...
Muestra una caja con los atributos de la caja de diálogo que seleccionemos (archivo
físico, altura,
anchura, título, identificador)
Preferencias
Muestra la caja de preferencias

El menú alineación

Contiene diferentes opciones para cambiar el tamaño, o alineación de los elementos


seleccionados, tales como izquierda, derecha, inferior, superior; así como para centrar
ya sea en horizontal o vertical. Tambien hace varios elementos del mismo tamaño,
además de extenderlos.
ANÁLISIS DE LOS ATRIBUTOS DE CADA ITEM
Si bien cada elemento tiene sus propios atributos, algunos de ellos son comunes a todos,
los analizamos:
Etiqueta

Contiene la cadena de caracteres que se mostrará con el item

Cadena de acceso

Nombre de la variable que estará unida a este item. El valor de esta variable será lo
mostrado al mostrar la caja de diálogo, y el valor que introduzca el usuario el devuelto
al acabar.

Item Tipo de datos

Selector de Color Long o Integer


Etiqueta sin cadena de acceso
Grupo sin cadena de acceso
Mapa de niveles Array de 4 enteros
Mapa de niveles (elemento activo) Long o Integer
Botón de opción Long o Integer
Botón de pulsación sin cadena de acceso
Botón de radio Long o Integer
Escala Single o Double.45
Texto Int, Long, Integer, Single, Double
Botón Toggle Long o Integer

CAJA DE TEXTO
Solo lectura

Si está marcado, el contenido de la caja de texto no se podrá modificar.

Etiqueta arriba

Si está habilitado, el texto que lo precede irá encima, en vez de delante.

# de caracteres
Longitud de caracteres máxima

ETIQUETAS

Etiqueta

Texto de la etiqueta

Justificación

Se especifica la justificación de la etiqueta

Salto automático de línea

Si está habilitado, si el texto no cabe se ensancha la etiqueta y se escribe en multilíneas.

Fuente Negrita

Si habilitado, las fuentes aparecen en negrita

BOTÓN TOGGLE

Area

Cadena de acceso con la que se realiza la operación lógica AND u OR. Si invertir está a
TRUE, se hace un OR con los bit de la variable de acceso. Si invertir está a FALSE, se
hace una AND de la variable de acceso con el complementario de la máscara.

Invertir

Se marcado, se realiza la inversión del resultado.

BOTÓN DE OPCIÓN (REALMENTE UNA LISTA DESPLEGABLE)

Sub Items

Lista con las diferentes opciones que se presentarán al usuario. Se incluye el texto de la
etiqueta, valor, mascara de comparación de bits y si aparecerá habilitado o desabilitado.

SELECTOR DE COLOR

Area

Con la que se realizará una AND en la variable de destino.

Id# de texto asociado


Identificador de la caja de texto donde al seleccionar el color se pondrá el nombre de
este.

MAPA DE NIVELES

Cadena de Acceso

Nombre de variable utilizado para representar el mada de niveles

Cadena de Acceso de nivel activo

Nivel activo (Entero o Long)

ELEMENTO DE ESCALA

Cantidad de incremento

Incremento mínimo entre valor y valor

Mínimo y Maximo

Valores mínimo y máximo de la escala

Formato de visualización

Formato en el que se convierte el valor cuando se muestra el númeroque indica el valor


del.47
desplazamiento, si está activado mostrar valor

Mostrar valor

Si está activado muestra una etiqueta con el valor del desplazamiento.

Tiene flechas

Si se muestran o no las flechas.

Cantidad de incremento de páginas

El valor que suma o resta cuando el usuario en vez de utilizar las flechas hace click en
los
espacios de la barra.

Limites en lado

Si muestra los límites a los lados de la barra.

GRUPOS
Sirven para poner un cercado alrededor de determinados elementos. El único atributo
que tienen
es una etiqueta de texto.

BOTÓN DE OPCIÓN

Son los típicos botones de opción con forma redondeada, que se suelen utilizar de
manera
mutuamente excluyente con otro grupo de botones de opción.

Area

Mascara con la que se comparan los bits indicados de la variable de acceso con el valor
especificado, si el elemento resulta seleccionado, si se desea que se compare la variable
entera, se
deberá dejar a FFFFFFFF

Valor

Numero con el que se compara la cadena de Acceso, teniendo en cuenta el área


determinada
(especifica que bits se comparan).

Lista de identificadores

Especifica un grupo de botones de opción, al cual queremos que se asocie nuestro botón
de
opción. De esta menera, el resultado será mutuamente exclusivo entre los que se
especifiquen en
la lista y el actual..

También podría gustarte