# NEzoom.sml # View ToolScript that provides zoom in on left mouse click # with variable zoom capability depending on current scale. # At scale > 1,000,000 zooms to county polygon. # At scale > 25,000 zooms in 4X at click-point. # At scale < 25,000 zooms to maximum detail (1X) in orthoimage layer. # Author: Randy Smith, MicroImages, Inc. # January 2006. # Revised 9 June 2006: # After zooming to a county, if initally click outside that county, # tool zooms to the new county. However, this rule is inactivated once # left-click/zoom within the current county. # Revised 13 June 2006: # Added messages to View status line to identify current left-click action, # with Spanish and Turkish translations. # The following symbols are predefined # class GRE_VIEW View {use to access the view the tool script is attached to} # class GRE_GROUP Group {use to access the group being viewed if the script is run from a group view} # class GRE_LAYOUT Layout {use to access the layout being viewed if the script is run from a layout view} # numeric ToolIsActive Will be 0 if tool is inactive or 1 if tool is active # # The following values are also predefined and are valid when the various On...() # functions are called which deal with pointer and keyboard events. # numeric PointerX Pointer X coordinate within view in pixels # numeric PointerY Pointer Y coordinate within view in pixels # numeric ShiftPressed 1 if key being pressed or 0 if not # numeric CtrlPressed 1 if key being pressed or 0 if not # numeric LeftButtonPressed 1 if left pointer button pressed or 0 if not # numeric RightButtonPressed 1 if right pointer button pressed or 0 if not # numeric MiddleButtonPressed 1 if middle pointer button pressed or 0 if not # ######################################## ### Global variable declarations ######################################## # group/layer/object global variables class GRE_LAYER_VECTOR cntyLayer; # county vector layer class GRE_LAYER_VECTOR cntyLayer; # county vector layer class VECTOR cntyVector; # county vector object class GRE_VECTOR_POLYS cntyPolys; # handle for polygon elements in county vector object class TRANSPARM layerTransparm; ## coordinate transformation parameters from screen to vector layer class TRANSPARM viewTransparm; ## coordinate transformation parameters from screen to view (group map coordinates) numeric lastCnty; # polygon number of last county clicked in numeric zoomedBelowCnty; # flag to indicate if have zoomed in after zooming to county numeric mapscale; ### current map scale of View string language$; string msg1$, msg2$, msg3$; # zoom prompt messages for View message field # The following script functions will be called (if used in the script) when # the appropriate action or event occurs as described in the comments before each. # To use a function, uncomment the lines containing the 'func' definition # and ending brace '}' by removing the leftmost '#' on the line and add the # function code between the two lines. # Called the first time the tool is activated. # If the tool implements a dialog it should be created (but not displayed) here. proc OnInitialize () { Group = Layout.FirstGroup; ## iterate through groups to find Nebraska Data group while (Group.Name != "Nebraska Data") Group = Group.NextGroup; # get Counties layer from the group and polygons from the layer cntyLayer = Group.GetLayerByName("Counties"); cntyPolys = cntyLayer.Poly; # get the vector object from the layer DispGetVectorFromLayer(cntyVector, cntyLayer); # set prompt message strings language$ = _context.Locale; if (language$ == "enu") { msg1$ = "Left-click in a Nebraska County to zoom to it."; msg2$ = "Left-click to zoom in to that point."; msg3$ = "Left-click to recenter the view on that point."; } else if (language$ == "esn") { msg1$ = "Clic izquierdo en un Condado de Nebraska para hacer zoom en él."; msg2$ = "Clic izquierdo para hacer zoom en ese punto."; msg3$ = "Clic izquierdo para recentrar la vista en ese punto."; } else if (language$ == "trk") { msg1$ = "Tıklayarak bir County görüntüleyin."; msg2$ = "Bu noktaya büyütmek için tıklayın."; msg3$ = "Görüntüyü bu noktada ortalamak için tıklayın."; } } # end of OnInitialize # Called when tool is to be destroyed, will not be called if tool was never activated. # If the tool implements a dialog it should be destroyed here. # proc OnDestroy () { # } # end of OnDestroy # Called when tool is activated. # If the tool implements a dialog it should be "managed" (displayed) here. # proc OnActivate () { ### get current map scale # mapscale = View.GetMapScale(); # if (mapscale > 1000000) then # View.SetMessage(msg1$); # } # end of OnActivate # Called when tool is deactivated (usually when switching to another tool). # If the tool implements a dialog it should be "unmanaged" (hidden) here. # proc OnDeactivate () { # } # end of OnDeactivate # Called when tool is to be 'suspended' during a redraw operation. # proc OnSuspend () { # } # end of OnSuspend # Called when tool is to be 'resumed' after a redraw operation. # If the tool displays any graphics they should be updated by this function. # proc OnResume () { # } # end of OnResume # Called when user presses 'left' pointer/mouse button. proc OnLeftButtonPress () { local class POINT2d clickPt, clickPtTrans; ### coordinates for mouse-click position local numeric cntynum; ### element number of county polygon clicked in ### get cursor position in screen coordinates clickPt.x = PointerX; clickPt.y = PointerY; ### get current map scale mapscale = View.GetMapScale(); # get TRANSPARM for coordinate transformation from screen to # layer coordinates for the county vector layer and convert # click point location to layer coordinates layerTransparm = View.GetTransLayerToScreen(cntyLayer, 1); clickPtTrans = layerTransparm.ConvertPoint2DFwd(clickPt); # find polygon enclosing the click point cntynum = FindClosestPoly(cntyVector, clickPtTrans.x, clickPtTrans.y, GetLastUsedGeorefObject(cntyVector) ); if (mapscale > 1000000) # zoom to extents of county polygon clicked in { if (cntynum > 0) { # highlight the polygon so can zoom to it, but don't redraw yet cntyPolys.HighlightSingle(cntynum, "Replace", 0); # zoom to the highlighted polygon, redraw when unhighlight all elements cntyLayer.ZoomToActiveElement(); cntyLayer.UnhighlightAllElements(1); lastCnty = cntynum; zoomedBelowCnty = 0; View.SetMessage(msg2$); } } else { if (cntynum > 0) { if (cntynum <> lastCnty && zoomedBelowCnty == 0) # if not same as last county and haven't zoomed below { # highlight the polygon so can zoom to it, but don't redraw yet cntyPolys.HighlightSingle(cntynum, "Replace", 0); # zoom to the highlighted polygon, redraw when unhighlight all elements cntyLayer.ZoomToActiveElement(); cntyLayer.UnhighlightAllElements(1); lastCnty = cntynum; zoomedBelowCnty = 0; View.SetMessage(msg2$); } else # click point is in same county; do variable zoom in based on scale { # get TRANSPARM for coordinate transformation from screen to view # coordinates and convert click point to view coordinates viewTransparm = View.GetTransViewToScreen(1); # inverse to get screen to view clickPt = viewTransparm.ConvertPoint2DFwd(clickPt); # reset view center to click point View.Center = clickPt; if (mapscale > 25000) # zoom in by 4X centered on click point { View.ZoomIn(4, 1); zoomedBelowCnty = 1; View.SetMessage(msg2$); } else # zoom to 1X centered on click point { View.Zoom1X(1); View.SetMessage(msg3$); } } } } } # end of OnLeftButtonPress # Called when user presses 'right' pointer/mouse button. # proc OnRightButtonPress () { # } # end of OnRightButtonPress # Called when user presses 'middle' pointer/mouse button. # proc OnMiddleButtonPress () { # } # end of OnMiddleButtonPress # Called when user releases 'left' pointer/mouse button. # proc OnLeftButtonRelease () { # } # end of OnLeftButtonRelease # Called when user releases 'right' pointer/mouse button. # proc OnRightButtonRelease () { # } # end of OnRightButtonRelease # Called when user releases 'middle' pointer/mouse button. # proc OnMiddleButtonRelease () { # } # end of OnMiddleButtonRelease # Called when user moves cursor if no button being pressed # proc OnPointerMoveNoButton () { # } # end of OnPointerMoveNoButton # Called when user moves cursor while holding down button # proc OnPointerMoveWithButton () { # } # end of OnPointerMoveWithButton # Called when cursor enters window associated with view. proc OnEnterWindow () { ### get current map scale mapscale = View.GetMapScale(); if (mapscale > 1000000) then View.SetMessage(msg1$); else if (mapscale > 3648) then View.SetMessage(msg2$); else View.SetMessage(msg3$); } # end of OnEnterWindow # Called when cursor leaves window associated with view. # proc OnLeaveWindow () { # } # end of OnLeaveWindow # Called when user presses 'key' on keyboard. # proc OnKeyPress (key) { # } # end of OnKeyPress