martes, 28 de julio de 2015

Emulación del Info Tool de MapInfo (Usando MapBasic)

En este ejercicio, se hará una emulación del botón Info Tool del MapInfo usando programación en MapBasic.


Para ello  haremos uso de la sentencia SearchPoint y SearchInfo que en este caso nos ayudaran en Seleccionar información con el puntero del mouse (SerchPoint) para luego obtener su información (SearchInfo). Toda la información de estas sentencias es obtenida desde el Help del MapBasic.
SearchPoint: busca en un mapa los objetos que están en una específica coordenada X, Y. Su sintaxis es la siguiente:
SearchPoint (id del Map, x, y)
Dónde:
Id del Map: es el Identificador del Map activado y se obtiene con FrontWindow().
X: coordenada X obtenida con el puntero del mouse y se obtiene con el CommandInfo(CMD_INFO_X) o  CommandInfo(1).
Y: coordenada Y obtenida con el puntero del mouse y se obtiene con el CommandInfo(CMD_INFO_Y) o  CommandInfo(2).
El resultado es el “número de objetos encontrados”. Pero para entender mejor esto último, vemos que es el SearchInfo.
SearchInfo: Devuelve la información obtenida desde el SearchPoint. Su sintaxis es la siguiente:
SearchInfo(número de orden*, atributo)
*traducción libre del editor del Blog.
Dónde:
Numero de orden: es el número con el cual vamos a identificar cada objeto hallado en el SearchPoint. Por ejemplo, si en el SearchPoint obtuve un número 3, entonces es porque hay 3 objetos y si quiero acceder al primero, segundo o tercer objeto escribo respectivamente 1, 2 o 3.
Atributo: es el atributo la que quiero leer. En este ejercicio se usa el atributo SEARC_INFO_TABLE o 1 para obtener el nombre de la tabla y el SEARCH_INFO_ROW o 2 para obtener el RowID del objeto seleccionado.
Código del ejercicio:
Este es el código del ejercicio con algunos comentarios para su comprensión., Se utilizó una Tabla de MapInfo con los departamentos del Perú:


Include "Mapbasic.def"
Include "Menu.def"
Include "Icons.def"

Declare Sub Main 'DECLARO UN SUB MAIN 
Declare Sub MiIdentificador 'DECLARO UN SUB PARA MI IDENTIFICADOR

Sub Main 
 'RUTINA QUE CREA UN BOTON PARA MI IDENTIFICADOR
 Create ButtonPad "MiBoton" As
  ToolButton
   Calling MiIdentificador 'LLAMA SUB MiIdentificador
   Icon MI_ICON_CROSSHAIR
   Cursor MI_CURSOR_CROSSHAIR  
     
  Title "Mis botones"
  Width 3
  Show
End Sub

Sub MiIdentificador
 Dim X as Float
 Dim Y as Float
 Dim MiTabla as String
 Dim MiId as Integer
 Dim Seleccion as Integer
 Dim MiValor as Alias
 Dim MisValores as String
 Dim i as Integer

 X = CommandInfo(1)'LEE LA COORDENADA X DEL MOUSE EN EL MOMENTO QUE PRESIONO EL CLICK IZQUIERDO
 Y = CommandInfo(2)'LEE LA COORDENADA Y DEL MOUSE EN EL MOMENTO QUE PRESIONO EL CLICK IZQUIERDO

 Seleccion = SearchPoint (FrontWindow(),X, Y) 'SELECCIONO LAS CAPAS EXISTENTES DEL MAP CUYAS GEOMETRIAS INTERSECTAN CON LA COORDENADA X, Y
 MiTabla = SearchInfo(Seleccion ,1)'LEO LA PRIMERA CAPA SELECCIONADA (SOLO HAY UNA CAPA EN ESTE EJEMPLO)
 MiId = SearchInfo(Seleccion ,2)'LEO EL RowID DEL OBJETO SELECCIONADO PROVENIENTE DE LA CAPA SELECCIONADA
 
 Fetch Rec MiId From MiTabla 'APUNTO EL Fetch HACIA EL RowID SELECCIONADO
 
 MisValores = "" 'EN ESTA VARIABLE ESTARAN LOS NOMBRES DE LAS COLUMNAS Y SUS VALORES SELECCIONADOS SEGUN EL RowID
 For i = 1 to TableInfo(MiTabla,4)'FOR PARA LEER LAS COLUMNAS DE LA TABLA SELECCIONADA
  If (MisValores = "") Then
   MiValor = MiTabla &".col"& i
   MisValores = ColumnInfo(MiTabla,"COL"& i,1 )& ": " & MiValor 
  Else
   MiValor = MiTabla &".col"& i
   MisValores = MisValores & ";" & ColumnInfo(MiTabla,"COL" & i,1 )& ": " & MiValor 
  End If
 Next

 'ESTE Dialog ES PARA VER LOS RESULTADOS DE LA SELECCION COMO SI FUERA EL Id DEL MAPINFO
 Dialog
  Title "Mi Identificador-"&MiTabla
  Control ListBox
   Title MisValores 
   Width 200
   Height 200

End Sub

Resultados:
Se observan estos resultados:































Cometarios:
Quizá no sea tan interactiva como el Info Tool del MapInfo ya que hay que cerrar el Cuadro de Dialogo cada vez que se quiera usar de nuevo esta herramienta, pero puede ser útil al querer obtener información de ciertos elementos al usar el puntero mouse a tiempo real.

Esperando que sea útil esta información, será hasta el otro mes. Hasta luego.
ª