Microstation
Microstation VBA
Geographics
S.I.G. (SIG)
Teledetección
Utilidades
Contacto
Introduccion - Conceptos - Programacion

Warning: date() [function.date]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for 'UTC/0.0/no DST' instead in /home/www/lanero.net/ViejaWeb/esqueleto.php on line 143

 

 

Geographics > Programación:

La programación en Geographics es igual que la de Microstation, con el valor añadido de que los objetos de Geographics integrados en MS-Basic, VBA o MDL tienen todas las propiedades y parámetros del propio programa, lo que nos permite poder hacer nuevas funciones y complementos personalizados.
Quizá la mejor forma hacerse una pequeña idea sea la de ver una muestra sobre un programa.

Este programa sirve para eliminar todos los enlaces a Base de Datos de un elemento gráfico en el plano. ¿Que utilidad puede tener?, pues en algunos casos es imprescindible.

Supongamos que vamos a empezar un proyecto SIG sobre una determinada zona y que obtenemos cartografía de esa zona procedente de otro proyecto SIG sobre Geographics, todos los elementos gráficos que estuvieran enlazados a Base de Datos en el proyecto original de donde proceden los planos tendrán guardado en el fichero de diseño los valores de Tipo de Link, MSLINK y ENTITY, y es probable que estos valores interfieran con nuestras definiciones de las entidades en el proyecto nuevo, por tanto, lo más racional será asegurar que empezamos el proyecto nuevo con todos los elementos gráficos "limpios".

El problema es que no hay herramientas de "limpieza" automática de estas cosas, y gráficamente no se puede hacer puesto que no son atributos gráficos. Por ello, el programa que sigue hace esta función de una forma muy eficiente.
Hay dos posibilidades, limpiar todos los vínculos de los elementos de un deteminado nivel, o todos los vínculos de todos los elementos del plano. Para ello se ha proporcionado de una interface interactiva en la que el usuario decide esta acción.
En el programa "Convertir Nodos de Texto a Texto" descrito en el apartado Porgramación MVBA está detallado el interface, luego el "corazón" de este nuevo programa se centra en esta pequeña rutina:

Dim Elemento As Element
Dim Punto As Point3d
Dim dbLink As DatabaseLink
Dim dbLinks() As DatabaseLink
Dim counter As Long
Dim status As Integer
Dim vinculos() As DatabaseLink
Dim i As Integer
Dim Conjunto As ElementEnumerator

'Preparo el fichero para ser escaneado y me sitúo el principio del mismo
Set Conjunto = Application.ActiveModelReference.Scan(Criterio)
Conjunto.Reset

'Empiezo a escanear el fichero
While Conjunto.MoveNext
  Set Elemento = Conjunto.Current
  If Elemento.IsGraphical Then
    If Elemento.HasAnyDatabaseLinks = True Then
     Elemento.Redraw msdDrawingModeHilite
     vinculos = Elemento.GetDatabaseLinks()
     'recorro todos los vínculos encontrados al elemento
     For i = 0 To UBound(vinculos)
       'Para comprobar todos los vínculos que tiene el elemento
       Debug.Print "Entidad:" + Str$(vinculos(i).EntityNumber)_                  + " Mslink: " + Str$(vinculos(i).Mslink)       
     Next i
     Elemento.RemoveAllDatabaseLinks
     'Reescribo el elemento
     Elemento.Rewrite
   End If
  End If
Wend

 

El programa completo se puede descargar Remove_Mslink.mvba, con licencia totalmete libre para ser usado directamente, manipulado y cambiado. Es free.

Recientemente me surgió la necesidad de convertir unos ficheros cartográficos en 3D a ArcGIS (v8.3) puesto que se necesitaba continuar con un estudio ya iniciado en ese sistema y ampliarlo para hacer análisis de terrenos en función de su pendiente.
Debo decir que aunque conozco algo ArcGIS, no lo domino con la suficiente profundidad como para hacer esta conversión directamente desde un DGN, es decir, no encontré la forma de que en ArcGIS se obtuviera la cota de las curvas de nivel directamente del DGN.
La solución que se me ocurrió, quizá un poco extraña, fué la de vincular todas las curvas de nivel a una Tabla de una Base de Datos en la que almacené las corrdenadas X, Y, Z de cada tramo de las Curvas de Nivel, para desde ahí, exportarlo a formato SHP. Funcionó perfectamente, y este es el programita que resovió el problema.

Dim Criterio As ElementScanCriteria
Dim Conjunto As ElementEnumerator
Dim Elemento As Element
Dim Link As Long
Dim Punto As Point3d
Dim X As Long, Y As Long, Z As Long
Dim Entidad As Long
Dim oElEnum As ElementEnumerator
Dim oConnection As New ADODB.Connection

Dim Vinculo As DatabaseLink
Dim Mensaje As String
Dim rsCotas As New ADODB.Recordset
Dim oDatabaseLink() As DatabaseLink
Dim mslinkNotExist As Boolean

Set rsCotas = New ADODB.Recordset

'Conecto a la Base de Datos por ODBC
oConnection.Open "DSN=SOMIEDO;UID=;PWD="
rsCotas.Open "S_MDT", oConnection, adOpenKeyset, adLockOptimistic, adCmdTable

Set Criterio = New ElementScanCriteria
'Solo cojo elementos de tipo Line String
Criterio.ExcludeAllTypes
Criterio.IncludeType msdElementTypeLineString
Criterio.IncludeType msdElementTypeLine



'Empiezo a escanear el fichero
Link = 0
'para empezar debo tener seleccionadas todas las curvas que quiero vincular
If ActiveModelReference.AnyElementsSelected = True Then
  Set Conjunto = Application.ActiveModelReference.GetSelectedElements
  Conjunto.Reset
  While Conjunto.MoveNext
    Set Elemento = Conjunto.Current
    Link = Link + 1
    'Cojo las coordenadas de inicio de cada segmento de curva de nivel
    X = Elemento.AsLineElement.StartPoint.X
    Y = Elemento.AsLineElement.StartPoint.Y
    Z = Elemento.AsLineElement.StartPoint.Z
    'Sitúo Entidad en 30 (Entitynum en tabla MSCATALOG), corresponde a la tabla S_MDT
    Entidad = 30
    'Añado el MSLINK al elemento actual
    Set Vinculo = Application.CreateDatabaseLink(Link, Entidad,_                                                      msdDatabaseLinkageOdbc, False, 0)
    Elemento.AddDatabaseLink Vinculo
    'Si hay alguna curva de nivel mal puesta en cota la pinto de color rojo para
    'verla gráficamente en el plano
    If Cota = 0 Then
       Elemento.Color = 4
    End If
    'Reescribo el elmento gráfico en el archivo de diseño
    Elemento.Rewrite 
    'Añado el elemento a la Base de Datos
    rsCotas.AddNew
    rsCotas("MSLINK") = Link
    rsCotas("X") = X
    rsCotas("Y") = Y
    rsCotas("Z") = Z
    rsCotas.Update
    Elemento.Redraw msdDrawingModeHilite
  Wend
  'Quito la selección de los elementos
  ActiveModelReference.UnselectAllElements
Else  
  MsgBox "Debe seleccionar los elementos"
  Exit Sub
End If

MsgBox "Finalizada la carga de datos"

End Sub

 

Los programas que hay a continuación están escritos en MS-Basic, y aunque son un poco "viejos", funcionan perfectamente

Quita_MSLink.zip: Es muy habitual trabajar con ficheros DGN que proceden de otros proyectos y que por tanto, algunos de sus elementos tienen el vínculos a datos del proyecto de donde proceden. Este programita se encarga de borrar todos los valores MSLINK de los elementos de un cercado o de una selección en un fichero DGN, para así, tener los ficheros "limpios" para un nuevo proyecto. Este programa escrito en MS-Basic es en esencia el mismo que el anterior.

Sup_XY.zip: Cuando un proyecto tiene un número considerable de planos y en la Base de Datos se desean tener las coordenadas y la superficie de las parcelas, por ejemplo, cargar estos datos plano a plano es una labor bastante tediosa .
Este programita se encarga de hacerlo automáticamante, carga la superficie en el campo correspondiente de la tabla, y las coordenadas (X,Y) del centroide de cada uno de los elementos superficiales vinculados.

 

 

 

http://www.lanero.net