SpyGlassVector.sml

  Download

More scripts: Enhanced Data Tip

Syntax Highlighing:

comments, key words, predefined symbols, class members & methods, functions & classes
            
## SpyGlassVector.sml
# Sample Display Control Script for SpyGlass Vector GraphTip
#
# Group must have a raster object as the first layer.
# Script creates a circular GraphTip showing the matching
# area (centered on the mouse cursor) from a vector object in a 
# Project File.  The matching area is extracted from the vector
# object and added / removed as a layer in the group at each
# DataTip event to provide GraphTip behavior.
# Authors: 	Jeremy Johnson, Randy Smith
#				MicroImages, Inc.
#				10 December 2004
class VECTOR SourceVector, MaskVector, ExtractedVector;
class GRE_LAYER_RASTER F_layer;
class RASTER F;
numeric height, width;
numeric count = 0; 
class POINT2D LayerPoint, MapPoint, SourceMapPoint, SourceObjPoint;
class RVC_GEOREFERENCE SourceVecGeo, FGeo;
class TRANSPARM ScreenToLayer, FMapToSourceMap;
class TRANSPARM FObjToMap, SourceMapToObj;
class POLYLINE shape;
class GRE_GROUP global_group;
class GRE_LAYER VectLayer, TestLayer;
########################################################
#  Procedure to remove previous vector layer if it exists
########################################################
func RemoveVectorLayer () {
	local numeric removed = 0;
	if (VectLayer.Name != "") {
		TestLayer = global_group.FirstLayer;
		while (removed == 0) {
			if (TestLayer.Name == "") {
				removed = 1;
				continue;
			}
			if (TestLayer.Name == VectLayer.Name) {
				global_group.RemoveLayer(TestLayer);
				removed = 2;
			}
		TestLayer = TestLayer.NextLayer;
		}
	}
	return removed;
}
##########################################################################
#  Procedure called when view is created for the group.
#
#	Gets handle for the raster object in the group's first layer.
#	This raster (F) will be used for establising a translation between the 
#	coordinates of the mouse and the map coordinates of the desired location
#  to be displayed in the GraphTip's view circle. 
##########################################################################
proc OnGroupCreateView ( 
	class GRE_GROUP group
	) {
		global_group = group;
		F_layer = group.FirstLayer; 
 		DispGetRasterFromLayer(F, F_layer);
		# file with source vector object for GraphTip should be in same directory as control script
		OpenVector(SourceVector, _context.ScriptDir + "\cb_soils.rvc", "CBSOILS");
}
##########################################################################
#  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,
	class TOOLTIP datatip
	) {
	# call procedure to remove previous vector layer if it exists
	local numeric removed = RemoveVectorLayer();
	if (removed == 2) then						# only redraw if a vector layer was actually removed
		view.RedrawDirect("NoBlankScreen");
	# get transparm from screen coordinates to raster layer coordinates
	ScreenToLayer = view.GetTransLayerToScreen(F_layer, 1);
	# transform cursor screen coordinates to object coordinates of raster that is first layer in group
	LayerPoint  = ScreenToLayer.ConvertPoint2DFwd(point); 
	if (!IsNull( F[LayerPoint.y, LayerPoint.x] )) {		# only show GraphTip when cursor is over non-null cell in raster
		CreateTempVector(MaskVector, "VectorToolkit,Polygonal"); # vector to draw circle in for extraction
		CopySubobjects(SourceVector, MaskVector, "GEOREF");
		CreateTempVector(ExtractedVector);
		###############################################
		# Set up projection transformations
		###############################################
		SourceVecGeo.OpenLastUsed(SourceVector);
		SourceVecGeo.GetTransparm(SourceMapToObj, 1, SourceVecGeo.GetCalibModel() );
		FMapToSourceMap.OutputCoordRefSys = SourceVecGeo.GetCoordRefSys();
		FGeo.OpenLastUsed(F);
		FGeo.GetTransparm(FObjToMap, 0, FGeo.GetCalibModel() );
		FMapToSourceMap.InputCoordRefSys = FGeo.GetCoordRefSys();
		MapPoint = TransPoint2D(LayerPoint, FObjToMap); # convert cursor position to map coordinates of displayed raster
		SourceMapPoint = FMapToSourceMap.ConvertPoint2dFwd(MapPoint); # convert raster map coordinates to map coordinates of source vector
		SourceObjPoint = TransPoint2D(SourceMapPoint, SourceMapToObj); # convert to object coordinates of source & mask vector
		###############################################
		# draw circular polygon to use as extraction area
		###############################################
		point =SourceObjPoint;
		shape.Clear();				# clear previous polyline
		local class POINT2D circlepoint;		# class instance for computed vertex position on circumference of circle
		local numeric x, y;
		local numeric radius = 200;			# radius of circle in source object coordinates
		local numeric r2 = radius * radius;
		# Create top half of circle and add to polyline
		for (x = -radius; x <= radius; x++) {
			y = sqrt((r2 - x*x) +0.5);
			circlepoint.x = point.x + x;
			circlepoint.y = point.y + y;
			shape.AppendVertex(circlepoint);
		} 
		# Create bottom of circle and add to polyline
		for (x = radius; x >= -radius; x--) {
			y = sqrt((r2 - x*x) +0.5);
			circlepoint.x = point.x +x;
			circlepoint.y = point.y -y;
			shape.AppendVertex(circlepoint);
		}
		# Close polyline and add it as element to the Mask Vector to use for extraction
		shape.SetClosed(1);
		VectorAddPolyLine(MaskVector, shape);
		# Extract circular area from source vector and add result as layer in group
		ExtractedVector = VectorExtract(MaskVector, SourceVector, "InsideClip");
		VectLayer = GroupQuickAddVectorVar(global_group, ExtractedVector);
		view.RedrawDirect("NoBlankScreen");
		return (1); 
		}
	}