miércoles, 18 de diciembre de 2013

MapBasic (Programacion en MapInfo): Leer las Entidades que conforman un “Collection Object”


En este mes se verá como leer cada entidad que conforma un “Collection Object” (como indica el título de este post).
 
Un “Collection Object”, como su nombre lo indica, es una combinación de objetos tales como Puntos, Polilineas y Regiones. Para que exista un “Collection Object” debe estar dos de los tres tipos de objetos anteriormente dichos.

Para obtener cada objeto o entidad que compone un “Collection Object” y para extraer las coordenadas de sus vértices o nodos de dichas entidades, usaremos el siguiente código en MapBasic:


include "Mapbasic.def"

Declare Sub Main
Declare Sub Dialogo
Declare Sub NumeroNodos
Declare Sub VentanaMensaje

Dim NombreTable as string
Dim Objeto as Alias
Dim ColeccionPuntos as Object
Dim ColeccionPolilineas as Object
Dim ColeccionRegiones as Object
Dim NumPuntos as Integer
Dim NumPolilineas as Integer
Dim NumPoligonos as Integer

Dim NumeroDeEntidades as String
Dim NumeroDeEntidades as String
Dim idMap as integer

Sub Main

 idMap = FrontWindow()
 set CoordSys Window idMap
 NombreTable = SelectionInfo(SEL_INFO_TABLENAME)
 Fetch rec CommandInfo (CMD_INFO_ROWID) From NombreTable 

 Objeto = NombreTable + ".obj"

 ColeccionPuntos = ObjectInfo(Objeto, 10)
 ColeccionPolilineas = ObjectInfo(Objeto, 9)
 ColeccionRegiones = ObjectInfo(Objeto, 8)

 NumPuntos = ObjectInfo(ColeccionPuntos ,20)
 NumPolilineas = ObjectInfo(ColeccionPolilineas ,21)
 NumPoligonos = ObjectInfo(ColeccionRegiones ,21)
 NumeroDeEntidades = "Cantidad de Puntos: " & NumPuntos & ";" & "Cantidad de Polilíneas: " & NumPolilineas & ";" & "Cantidad de Regiones: " & ObjectInfo(ColeccionRegiones ,21)
 
 Call VentanaMensaje
 Call Dialogo
 
 Close Table Selection
End Sub

Sub NumeroNodos
 Dim i as integer
 Dim j as integer

 if ReadControlValue(1) = 1 then
  Print "Listado de Puntos: " & NumPuntos & " puntos"
  For i = 1 to NumPuntos 
   Print "Punto " & i & ": " & ObjectNodeX(ColeccionPuntos ,0,i) & "," & ObjectNodeY(ColeccionPuntos ,0,i)
  next
 elseif ReadControlValue(1) = 2 then
  Print "Listado de Polilíneas"
  For i = 1 to NumPolilineas 
   Print "Polilínea " & i & ": " & ObjectInfo(ColeccionPolilineas ,OBJ_INFO_NPOLYGONS + i) & " nodos"
   For j = 1 to ObjectInfo(ColeccionPolilineas ,OBJ_INFO_NPOLYGONS + i)
    Print "Vertice " & j & ": " & ObjectNodeX(ColeccionPolilineas ,i,j) & "," & ObjectNodeY(ColeccionPolilineas ,i,j)
   next
  next  
 elseif ReadControlValue(1) = 3 then
  Print "Listado de Regiones"
  For i = 1 to NumPoligonos
   Print "Región " & i & ": " & ObjectInfo(ColeccionRegiones ,OBJ_INFO_NPOLYGONS + i) & " nodos"
   For j = 1 to ObjectInfo(ColeccionRegiones ,OBJ_INFO_NPOLYGONS + i)
    Print "Vertice " & j & ": " & ObjectNodeX(ColeccionRegiones ,i,j) & "," & ObjectNodeY(ColeccionRegiones ,i,j)
   next
  next 
 end if

End Sub

Sub Dialogo

Dialog
 Title "Entidades Multiples: " & NombreTable 
 Width 160 Height 60

 Control RadioGroup
  Title NumeroDeEntidades 
  Position 5,5
  ID 1
  Value 1
  Calling NumeroNodos

End Sub

Sub VentanaMensaje
 Open Window Message
 Set Window Message
 Position (0.25,0.25)
 Width 3  Height 3
End Sub

 

Explicación del Código:

El código lo que realiza es leer las entidades que hay en un “Collection Object” según su tipo: Puntos, Polilineas y Regiones. Luego de leer estas entidades, procede a obtener sus nodos

El código está dividido en cuatro Procedimientos “Sub”, de los cuales el Procedimiento Sub Dialogo muestra el cuadro de dialogo para escoger que tipo de entidad que está contenida en el “Collection Object” escogeremos, y el Procedimiento Sub VentanaMensaje configura la ventana de salida de los datos.

Ahora nos concentraremos en los Procedimientos Sub Main y Sub NumeroNodos:

Procedimiento Sub Main:


Sub Main

 idMap = FrontWindow()
 ‘Obtengo el id de la ventana actual (debe ser una Vista)

 set CoordSys Window idMap
 ‘Configuro las unidades de salida de las coordenadas para que sean iguales a la de laVista

 NombreTable = SelectionInfo(SEL_INFO_TABLENAME)
 ‘Obtengo el nombre de la tabla (archivo de MapInfo) seleccionada

 Fetch rec CommandInfo (CMD_INFO_ROWID) From NombreTable 
 Objeto = NombreTable + ".obj"
 ‘Luego selecciono y obtengo el “Collection Object” a analizar
 
 ColeccionPuntos = ObjectInfo(Objeto, 10)
 ‘Obtengo todos los Puntos contenidos en el “Collection Object”

 ColeccionPolilineas = ObjectInfo(Objeto, 9)
 ‘Obtengo todas las Polilineas contenidas en el “Collection Object”

 ColeccionRegiones = ObjectInfo(Objeto, 8)
 ‘Obtengo todas las Regiones contenidas en el “Collection Object”

 NumPuntos = ObjectInfo(ColeccionPuntos ,20)
 ‘ Aca consigo el número de Puntos en el “Collection Object”

 NumPolilineas = ObjectInfo(ColeccionPolilineas ,21)
 ‘ Aca consigo el número de Polilineas en el “Collection Object”
 
 NumPoligonos = ObjectInfo(ColeccionRegiones ,21)
 ‘ Aca consigo el número de Regiones en el “Collection Object”


 NumeroDeEntidades = "Cantidad de Puntos: " & NumPuntos & ";" & "Cantidad de Polilíneas: " & NumPolilineas & ";" & "Cantidad de Regiones: " & ObjectInfo(ColeccionRegiones ,21)
 ‘En la variable NumeroDeEntidades estarán los títulos de las tres opciones vistas en la ventana con la cantidad de Puntos, Polilineas y Regiones

 Call VentanaMensaje
‘Llamada al Procedimiento Sub VentanaMensaje que formatea la ventana de salida de datos

Call Dialogo
‘Llamada al Procedimiento Sub Dialogo que muestra la ventana del programa con las opciones a escoger
 
Close Table Selection
‘Al finalizar el programa, se quitara la selección
End Sub



Procedimiento Sub NumeroNodos:

En el cuadro de Dialogo (que está en el Procedimiento Sub Dialogo), hay tres opciones para escoger (Puntos, Polilineas y Regiones), y dependiendo de qué opción escogemos, en la ventana del Print (que está configurada en el procedimiento Sub VentanaMensaje) aparecerán los Puntos, Polilineas y Regiones y sus nodos o vértices correspondientes. Para ello se utiliza un función IF en cada uno de las tres opciones existentes:



Sub NumeroNodos
 Dim i as integer
 Dim j as integer

 if ReadControlValue(1) = 1 then ‘Si se escoge la primera opción, entra acá
  Print "Listado de Puntos: " & NumPuntos & " puntos" ‘Imprime el número de puntos
  For i = 1 to NumPuntos ‘este FOR recorre desde 1 hasta la cantidad de Puntos
   Print "Punto " & i & ": " & ObjectNodeX(ColeccionPuntos ,0,i) & "," & ObjectNodeY(ColeccionPuntos ,0,i) ‘Se imprime la palabra “PUNTO” seguido del número del Punto y sus coordenadas
  next
 elseif ReadControlValue(1) = 2 then ‘Si se escoge la segunda opción, entra acá

  Print "Listado de Polilíneas" ‘Imprime solo el título de Inicio

  For i = 1 to NumPolilineas ‘este FOR recorre desde 1 hasta la cantidad de Polilineas

   Print "Polilínea " & i & ": " & ObjectInfo(ColeccionPolilineas ,OBJ_INFO_NPOLYGONS + i) & " nodos" ‘ Imprime el número de la Polilinea y la cantidad de nodos de dicha Polilinea
   For j = 1 to ObjectInfo(ColeccionPolilineas ,OBJ_INFO_NPOLYGONS + i)
    Print "Vertice " & j & ": " & ObjectNodeX(ColeccionPolilineas ,i,j) & "," & ObjectNodeY(ColeccionPolilineas ,i,j) ‘Se imprime la palabra “vertice” seguido del número del Vertice y sus coordenadas

   next
  next  
 elseif ReadControlValue(1) = 3 then ‘Si se escoge la tercera opción, entra acá
  Print "Listado de Regiones" ‘Imprime solo el título de Inicio
  For i = 1 to NumPoligonos ‘este FOR recorre desde 1 hasta la cantidad de Poligonos
   Print "Región " & i & ": " & ObjectInfo(ColeccionRegiones ,OBJ_INFO_NPOLYGONS + i) & " nodos" ‘ Imprime el número de la Region y la cantidad de nodos de dicha Region
   For j = 1 to ObjectInfo(ColeccionRegiones ,OBJ_INFO_NPOLYGONS + i)
    Print "Vertice " & j & ": " & ObjectNodeX(ColeccionRegiones ,i,j) & "," & ObjectNodeY(ColeccionRegiones ,i,j) ‘Se imprime la palabra “vertice” seguido del número del Vertice y sus coordenadas

   next
  next 
 end if

End Sub


Para hacer funcionar este script, primero se debe seleccionar el “Collection Object” (solo funciona con este tipo de entidades), luego compilar el script con “ctrl + k” y se ejecuta con “ctrl + u”.

 

El resultado se ve en la ventana del Print:


 



En este ENLACE hay un ejemplo de un archivo de MapInfo con un "Collection Object"

Esperando que este post sea de su agrado y ayuda, será hasta el otro año, no sin antes deseándoles una Feliz Navidad y un Próspero Año 2014, y muchas gracias por su atención en estos 12 meses… Muchas gracias
ª