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