SpyGlassRaster.sml

  Download

More scripts: Enhanced Data Tip

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
}