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
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