### AspectTip2.sml ### sample Display Control Script ### Creates a DataTip graphic within normal DataTip frame and background. ### DataTip information from other layers is suppressed. ### Assumptions: Display layout includes a group named "Group 1" ### containing a raster object named "ASPECT". ################ Global Variables ########################### class RVC_RASTER ASPECT; # the aspect raster object class GRE_LAYER aspectLayer; # the layer containing the aspect raster class GRDEVICE_MEM_RGBA dev; # RGB Alpha (opacity) graphics rendering device in memory for drawing in DataTip class COLOR transparent(0, 0, 0, 0); # transparent color to clear device numeric height, width; # height and width of graphics rendering device ################################################################# ### procedure called when group or layout is initialized proc OnInitialize () { width = 110; # set width of rendering device in pixels height = width * 1.45; # set height of rendering device in pixels dev.Create(height, width); # create graphics rendering device } ################################################################## ### procedure called when view is created for layout ### Modify target group name and raster name to fit your data. proc OnLayoutCreateView ( class GRE_LAYOUT layout, class GRE_VIEW view ) { local class GRE_GROUP group; local class RVC_RASTER rast; local class GRE_LAYER layer; local string name$; # name of the target raster object # locate the Group in the layout group = layout.FirstGroup; # start with first group in layout while (group.Name != "Group 1") # iterate through groups until find named group group = group.NextGroup; # find the aspect raster by its object name "ASPECT" layer = group.FirstLayer; while (name$ != "ASPECT") { # check if layer with single raster; if so, get object name if (layer.TypeID == "Raster" && layer.GetNumObjects() == 1) { DispGetRasterFromLayer(rast, layer); # get raster object from layer name$ = rast.$Info.Name; # check name of raster object if (name$ == "ASPECT") { aspectLayer = layer; DispGetRasterFromLayer(ASPECT, layer); # assign object to global raster instance } # end if } # end if layer = layer.NextLayer; # move to next layer in group } # end while } # end of proc OnLayoutCreateView ########################################################## ### function called when DataTip request is made func OnViewDataTipShowRequest ( class GRE_VIEW view, class POINT2D point, class TOOLTIP datatip ) { local class TRANSPARM trans; # coordinate transformation parameters local numeric lin, col; # current line and column position local numeric aspect; # value from the ASPECT raster for cell under cursor local string aspect$; # aspect value string local class GC gc; # graphics context for the graphics rendering device local class COLOR color; # reusable color for drawing local class POINT2D center; # position of center of rotation of aspect arrow local class POINT2D arrowEnd; # position used to draw arrow head for aspect pointer local numeric radius; # radius of aspect circle local numeric aspectDrawAngle; # angle used for drawing aspect arrow local numeric arrowLength; # half-length of aspect pointer in pixels local numeric boxtop; # y position of top of label rectangle local numeric start; # computed start position for centered text # get transform from screen to layer coordinates and convert cursor position to layer coordinates trans = view.GetTransLayerToScreen(aspectLayer, 1); # 1 for second parameter gets the inverse transform point = trans.ConvertPoint2DFwd(point); lin = floor(point.y); ## line and column position of cell under cursor col = floor(point.x); aspect = ASPECT[lin, col]; if (aspect <> ASPECT.$Info.NullValue) # if cursor is not over a null cell { ### clear the graphics rendering device dev.Clear(transparent); ### Draw static GraphTip elements gc = dev.CreateGC(); # create graphics context # draw background circle for aspect indicator and rectangle for aspect text center.x = width * 0.5; center.y = center.x; radius = width * 0.45; boxtop = center.x * 2; gc.SetColorRGB(230, 255, 230); gc.FillCircle(center.x, center.y, radius); gc.FillRect(15, boxtop, width-30, 35); # draw black circle outline and black rectangle outline gc.SetColorName("black"); gc.DrawCircle(center.x, center.y, radius); # circle outline gc.DrawRect(15, boxtop, width-30, 35); # rectangle outline # set parameters for drawing Aspect text label in rectangle gc.DrawTextSetFont("ARIALBD.TTF"); gc.DrawTextSetHeightPixels(12); color.Name = "black"; gc.DrawTextSetColors(color); # draw centered Aspect label in rectangle start = center.x - ( gc.TextGetWidth("Aspect:") * 0.5 ); gc.DrawTextSimple("Aspect", start, boxtop + 15); # set aspect text and pointer parameters gc.DrawTextSetFont("ARIAL.TTF"); # font for aspect value string if (aspect == -1) { # flat area with aspect undefined; only write string aspect$ = "Undefined"; start = center.x - ( gc.TextGetWidth(aspect$) * 0.5 ); gc.DrawTextSimple(aspect$, start, boxtop + 30); } else { # draw aspect value and pointer aspect$ = sprintf("%.1f deg", aspect); # create and draw aspect label string start = center.x - ( gc.TextGetWidth(aspect$) * 0.5 ); gc.DrawTextSimple(aspect$, start, boxtop + 30); aspectDrawAngle = (aspect - 90); # drawing angle for aspect pointer arrowLength = 40; gc.SetLineWidth(3); # set line width to 3 pixels for pointer ### find and store coordinates of end of pointer line arrowEnd.x = center.x + arrowLength * cosd(aspectDrawAngle); arrowEnd.y = center.y + arrowLength * sind(aspectDrawAngle); ### move to start of pointer line and draw to end gc.MoveTo( center.x - arrowLength * cosd(aspectDrawAngle), center.y - arrowLength * sind(aspectDrawAngle) ); gc.SetColorName("red"); gc.DrawTo(arrowEnd.x, arrowEnd.y); ### draw arrowhead and small black circle at center of rotation of pointer gc.DrawArrow(arrowEnd.x, arrowEnd.y, aspectDrawAngle, 9, 30, "Open"); gc.SetColorName("black"); gc.FillCircle(center.x, center.y, 3); datatip.AppendImage(dev); # add the graphics device to the DataTip datatip.AppendText("\n"); return 1; # suppress other DataTip components } } # end if not over null cell else return -1; # if outside ASPECT raster or on null cell, don't show any DataTip } # end OnViewDataTipShowRequest