Syntax Highlighing:
comments, key words, predefined symbols, class members & methods, functions & classes
# SpyGlassRaster.sml
#
# Sample Display Control Script for SpyGlass GraphTip.
#
# Group must have a raster object as the first layer.
# Circular GraphTip shows matching area from a 24-bit
# raster object that is not in the group. SpyGlass raster
# is shown at the same scale as the current View scale.
#
# Author: Jeremy Johnson and Randy Smith
# MicroImages, Inc.
# 10 December 2004
class GRE_LAYER_RASTER F_layer;
class RASTER F, Zoom, SourceRaster;
class POINT2D rasterUL, offset, center;
class GRDEVICE_RAST_RGB24 rasterdev; ## graphics rendering device in memory for drawing
## 24-bit raster image as GraphTip
class GRDEVICE_MEM_BINARY maskdev; ## graphics rendering device in memory for binary
## image buffer (for transparency mask for GraphTip)
class GC gc; ## graphics context for drawing to GraphTip mask
numeric height, width;
numeric count = 0;
class POINT2D SourcePoint, LayerPoint, MapPoint, SourceMapPoint, SourceObjPoint;
class RVC_GEOREFERENCE SourceGeo, FGeo;
class TRANSPARM ScreenToLayer, FMapToSourceMap;
class TRANSPARM FObjToMap, SourceMapToObj;
##########################################################################
# proc OnGroupCreateView:
# Called when any view for the group is created.
# The process gets the raster from the group's first layer.
# This raster (F) will be used for establishing a translation between the coordinates of the mouse
# and the coordinates of the desired location to be displayed in the GraphTip's view circle
##########################################################################
proc OnGroupCreateView (
class GRE_GROUP group
) {
F_layer = group.FirstLayer;
DispGetRasterFromLayer(F, F_layer);
# open raster that is source for spyglass image
# file should be in same directory as control script
string filename$ = _context.ScriptDir + "\RalstonDOQQc.rvc";
OpenRaster(SourceRaster, filename$, "RalstonDOQQ");
}
##########################################################################
# Function called when the mouse is left over a position.
# This is the primary function for creating and displaying the GraphTip.
##########################################################################
func OnViewDataTipShowRequest (
class GRE_VIEW view,
class POINT2D point, # cursor position in screen coordinates
class TOOLTIP datatip
) {
height = view.height/4; # Set height and width of GraphTip area (in screen pixels as a fraction of View dimensions).
width = view.width/4; # Height and width should match. Height must be > 32.
if (height < 32 && width < 32) {
height = width = 32;
} else {
if (height > width) {
width = height;
} else {
height = width;
}
}
maskdev.Create(height,width); # create memory device for mask and set all to 0
maskdev.ClearAll();
center.x = height/2; # position in mask for center of circle
center.y = height/2;
offset.x = -height/2; # offset GraphTip so it is centered on cursor position
offset.y = -height/2;
point.x = point.x + offset.x; # reset point to upper left corner of GraphTip raster area
point.y = point.y + offset.y;
# create temporary raster to construct spyglass image
CreateTempRaster(Zoom, height, width, "24-bit color RGB");
###############################################
# Set up projection transformations
###############################################
SourceGeo.OpenLastUsed(SourceRaster);
SourceGeo.GetTransparm(SourceMapToObj, 1, SourceGeo.GetCalibModel() );
FMapToSourceMap.OutputCoordRefSys = SourceGeo.GetCoordRefSys();
FGeo.OpenLastUsed(F);
FGeo.GetTransparm(FObjToMap, 0, FGeo.GetCalibModel() );
FMapToSourceMap.InputCoordRefSys = FGeo.GetCoordRefSys();
ScreenToLayer = view.GetTransLayerToScreen(F_layer, 1);
#---Copy cells from the spyglass image raster into the temp raster, repeating (if zoomed in) or excluding (if zoomed out) cells as needed
local numeric x, y;
for (x = 0; x < width; x++) {
for (y = 0; y < height; y++) {
SourcePoint.x = point.x + x; # increment screen position
SourcePoint.y = point.y + y;
LayerPoint = ScreenToLayer.ConvertPoint2DFwd(SourcePoint); # find position in lin and col of displayed raster
MapPoint = TransPoint2D(LayerPoint, FObjToMap); # convert to map coordinates of displayed raster
SourceMapPoint = FMapToSourceMap.ConvertPoint2dFwd(MapPoint); # find map coordinates in georeference used by spyglass image raster
SourceObjPoint = TransPoint2D(SourceMapPoint, SourceMapToObj); # convert map coordinates to lin and col of spyglass image raster
Zoom[y+1,x+1] = SourceRaster[SourceObjPoint.y+1, SourceObjPoint.x+1]; # copy cell from spyglass source raster into the temp raster
}
}
#--Create the raster device for the GraphTip and check for errors
local numeric error = rasterdev.Create(Zoom);
if (error < 0) {
PopupError(error);
return (error);
}
#------create graphics for mask and draw circular image area (mask = 1)
gc = maskdev.CreateGC();
gc.SetColorPixel(1);
gc.FillCircle(center.y, center.x, width/2 - 2);
#---Set up the GraphTip
datatip.PixelDelta = 0;
datatip.Delay = 300 ;
datatip.MarginHeight = 100;
# set the temp raster as the source for the GraphTip image
datatip.SetImageTip(rasterdev, maskdev, offset);
DeleteTempRaster(Zoom);
return (1); # in GraphTip use only what is created by script
}