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);
}
}