domingo, 5 de octubre de 2014

MapBasic (Programación en MapInfo): Brush (Estilo de relleno de un Polígono)


Los archivos Tab de MapInfo permiten guardar en ellos mismos sus estilos (a diferencia del Shapefile que necesitan del Lyr para ello) en cada geometría. En esta oportunidad leeremos los estilos de unos polígonos de un Tab y lo guardaremos en la Tabla de atributos en una copia.

Para ello, necesitamos saber que es un Brush

 Toda esta información es encontrada en el “Help” del MapBasic:  El brush especifica el estilo de relleno de un objeto grafico…

 El Brush está formado de la siguiente manera

Brush (patterns, foreground color, background color)

Dónde:

Patterns: Tipo de relleno que se visualiza en el Brush. Esta expresado como un valor entero

Foreground color: Color del tramado definido en el Pattern. Esta expresado como un valor entero

Background color: Color del fondo del Pattern. Esta expresado como un valor entero




El Foreground color y el Background color están expresados como enteros, resultado de la siguiente expresión:

Red * 65536 + Green * 256 + blue

Donde Red, Green y Blue son los valores RGB que se conocen para el Rojo, Verde y Azul que conocemos. Por ejemplo

Para el color Rojo (255,0,0) = 255 * 65536 + 0 * 256 + 0 = 16711680

Para el color Verde (0,255,0) = 0 * 65536 + 255 * 256 + 0 = 65280

Para el color Azul (0,0,255) = 0 * 65536 + 0 * 256 + 255= 255

Para el color Amarillo (255,255,0) = 255 * 65536 + 255 * 256 + 0= 16776960

Donde los números resultantes de la ecuación son los colores (en formato de entero) que usa el Brush para pintar los polígonos. Para comprobar con lo dicho, pueden revisar esta página web:


 Código de Ejemplo

Acá esta un código que lee el Brush de cada polígono y crea en una Tab nuevo cuatro nuevas columnas:

PATT: de tipo Integer que estará guardado el Pattern.

FORE: de tipo Char que estará guardado el color del Foreground en formato RGB (Red, Green, Blue).

BACK: de tipo Char que estará guardado el color del Background en formato RGB (Red, Green, Blue).

BRUSH: de tipo Char que estará guardado el Brush como se lee originalmente.

  

En el código mismo están como comentarios lo que es cada línea y se usa el Archivo Tab “PERU_DEPARTAMENTOS” que lo pueden descargar en el siguiente enlace y debe estar abierto en el MapInfo para que se ejecute con normalidad



Include "mapbasic.def"

'DECLARACION DE FUNCIONES PARA EL SCRIPT
Declare Function EstiloPoligono (ByVal MiBrush as Brush, ByVal Propiedad as String) as String
Declare Function ColorRGB (ByVal MiNumero as Integer) as String

'DECLARACION DE VARIABLES PARA EL SCRIPT
Dim NumeroEntidades as Integer
Dim i as integer
Dim NombreTabla as String
Dim Objeto as Alias

NombreTabla  = "PERU_DEPARTAMENTOS" 'TAB DE EJEMPLO
NumeroEntidades = TableInfo(NombreTabla  ,TAB_INFO_NROWS)'CALCULA NUMERO DE ENTIDADES

'CREACION DE LAS CUATRO COLUMNAS Y LAS INICIALIZAMOS CON VALORES INICIALES
Add Column NombreTabla (PATT Integer) Values 0
Add Column NombreTabla (FORE Char(50)) Values "" 
Add Column NombreTabla (BACK Char(50)) Values "" 
Add Column NombreTabla (BRUSH Char(50)) Values "" 

'CREACION DE LA COPIA DE LA TABLA DE TRABAJO CON LOS CUATRO CAMPOS CREADOS Y SE LE AGREGA EL TEXTO "_COLOR"
Commit Table NombreTabla  As NombreTabla & "_COLOR" 
NombreTabla = NombreTabla & "_COLOR" 
Open Table "C:\INGEOGRAFOS\GIS\LEYENDA_TABLA\TAB\" & NombreTabla & ".TAB" as NombreTabla 
Map From NombreTabla 

'CREACION DEL OBJETO QUE LEERA LOS POLIGONOS
Objeto = NombreTabla & ".obj"

'SENTENCIA FOR QUE LEERA DE CADA POLIGONO EL BRUSH Y GUADARA CADA VARIABLE DEL BRUSH EN UNA DE LAS 4 COLUMNAS CREADAS
For i = 1 to NumeroEntidades 
 fetch rec i From NombreTabla 
 Update NombreTabla set PATT = EstiloPoligono (ObjectInfo(Objeto ,OBJ_INFO_BRUSH),"Pattern"), 
        FORE = EstiloPoligono (ObjectInfo(Objeto ,OBJ_INFO_BRUSH),"Forecolor"),
        BACK = EstiloPoligono (ObjectInfo(Objeto ,OBJ_INFO_BRUSH),"Backcolor"),
        BRUSH = EstiloPoligono (ObjectInfo(Objeto ,OBJ_INFO_BRUSH),"Brush")
 where RowId = i
next 

'GUARDAR LOS CAMBIOS
Commit Table NombreTabla 

Function EstiloPoligono (ByVal MiBrush as Brush, ByVal Propiedad as String) as String

 Dim Pattern as Integer
 Dim Forecolor as Integer
 Dim Backcolor as Integer

 Pattern = StyleAttr(MiBrush, 1 )
 Forecolor = StyleAttr(MiBrush, 2 )
 Backcolor = StyleAttr(MiBrush, 3 )

 
 if Propiedad = "Pattern" then
  EstiloPoligono  = Pattern 
 elseif Propiedad = "Forecolor" then
  EstiloPoligono  = ColorRGB (Forecolor)
 elseif Propiedad = "Backcolor" then
  EstiloPoligono  = ColorRGB (Backcolor)
 elseif Propiedad = "Brush" then
  EstiloPoligono  = MiBrush
 end if

End Function

Function ColorRGB (ByVal MiNumero as Integer) as String
 Dim Rojo as Integer
 Dim Verde as Integer
 Dim Azul as Integer

 Rojo = Fix(MiNumero / 65536)
 Verde = Fix((MiNumero/65536 - Fix(MiNumero/65536))*256) 
 Azul = Fix((MiNumero/256 - Fix(MiNumero/256))*256) 

 ColorRGB  = Rojo & "," & Verde & "," & Azul '& "," & MiNumero 
End Function


Función EstiloPoligono: Esta función dependiendo de la variable Propiedad obtiene el Pattern, Foreground color, Background color o el Brush.

Función ColorRGB: Esta función transforma el entero que representa el color y lo transforma en valores RGB (Red, Green, Blue) concatenados con comas y en forma de Texto. Vendria a ser lo inverso de Red * 65536 + Green * 256 + blue

Esperando que sea útil, será hasta el otro mes.
ª