TNTmips

HOME

FREE PRODUCTS
  TNTlite
  TNTatlas
  TNTsim3D

DOWNLOADS
  Release Version
  Development Version
  FTP
  Language Kits
  Sample Geodata
  Reseller Resources
  Promotional

DOCUMENTATION
  Tutorials
  Technical Guides
  Quick Guides

SITE MAP


elemsel.sml


#  ELEMSEL.SML - Allows user to select and highlight the closest vector 
#	point, line, or label or the enclosing polygon.
#  Created by: Mark Smith and Randy Smith
#  Most recent revision: 2-2002

# The following symbols are predefined
#    class VIEW View            {use to access the view the tool script is attached to}
#    class GROUP Group          {use to access the group being viewed if the script is run from a group view}
#    class LAYOUT Layout        {use to access the layout being viewed if the script is run from a layout view} 
# 
# The following values are also predefined and are valid when the various On...() 
# functions are called which deal with pointer and keyboard events. 
#    number PointerX            Pointer X coordinate within view in pixels 
#    number PointerY            Pointer Y coordinate within view in pixels 

# Variable declarations
class GRE_LAYER_VECTOR vectorLayer;
class Vector targetVector;
class GRE_GROUP activegroup;
class XmForm elemwin, buttonRow;
class XmLabel layerlabel, selectlabel;
class GC gc;
class XmDrawingArea da;
class XmRowColumn selectMode;
class XmTogglebutton pointButton, lineButton, polyButton;
class XmSeparator line1;
class PushButtonItem closeButton;
string layerlabel$, mode$;
numeric toolOpen;

# Callback for drawing area expose; redraws window text.
proc OnRedraw() {
	if (gc == 0) return;
	ActivateGC(gc);
	SetColorName("gray75");
	FillRect(0, 0, da.width, da.height);
	SetColorName("black");
	DrawInterfaceText("Active Layer: " + layerlabel$, 0, 10);
	}

# Checks layer to see if it is valid.
func checkLayer() {
	local numeric valid = true;

	# Get names layers if usable.  If not output error messages.
	# Get name of active layer if it is usable.  If not output an error message.
	if (activegroup.ActiveLayer.Type == "") {
		PopupMessage("Group has no layers!");
		valid = false;
		selectlabel.Sensitive = 0;
		pointButton.Sensitive = 0;
		lineButton.Sensitive = 0;
		polyButton.Sensitive = 0;
		layerlabel$ = "";
		}
	else if (activegroup.ActiveLayer.Type == "Vector") {
		vectorLayer = activegroup.ActiveLayer;
		layerlabel$ = activegroup.ActiveLayer.Name;

		selectlabel.Sensitive = 1;
		pointButton.Sensitive = 1;
		lineButton.Sensitive = 1;
		polyButton.Sensitive = 1;

		DispGetVectorFromLayer(targetVector, vectorLayer);
		}

	else {
		PopupMessage("Active layer not a vector!");

		layerlabel$ = activegroup.ActiveLayer.Name;
		selectlabel.Sensitive = 0;
		pointButton.Sensitive = 0;
		lineButton.Sensitive = 0;
		polyButton.Sensitive = 0;

		valid = false;
		}
	OnRedraw();
	return valid;
	}

# Callback for when active layer changes.
proc OnLayerChange()	{
	if (toolOpen)
		checkLayer();
	}

# Callback for when user selects different vector selection mode.
proc OnModeChanged() {
	if (pointButton.Set == 1) {
		if (targetVector.$Info.NumPoints < 1) {
			PopupMessage("No points!");
			}
		else mode$ = "point";
		activegroup.ActiveLayer.UnhighlightAllElements();
		}
	else if (lineButton.Set == 1) {
		if (targetVector.$Info.NumLines < 1) {
			PopupMessage("No lines!");
			}
		else mode$ = "line";
		activegroup.ActiveLayer.UnhighlightAllElements();
		}
	else if (targetVector.$Info.NumPolys < 1) {
			PopupMessage("No polygons!");
			}
		else mode$ = "poly";
		activegroup.ActiveLayer.UnhighlightAllElements();
	}

# Called when user presses 'left' pointer/mouse button. 
func OnLeftButtonPress () { 
	# If the selected layer is not valid, don't do anything.
	if (checkLayer()) {
		# Set local variables
		local class POINT2D point;

		# Find cursor position in screen coordinates and transform to
		# map coordinates for active layer.
		point.x = PointerX;
		point.y = PointerY;

		point = TransPoint2D(point, ViewGetTransViewToScreen(View, 1));
		point = TransPoint2D(point, ViewGetTransMapToView(View, vectorLayer.Projection, 1));

		if (mode$ == "point") {
			local numeric elementNum = FindClosestPoint(targetVector, point.x, point.y, GetLastUsedGeorefObject(targetVector));
			if (elementNum > 0) then
				vectorLayer.Point.HighlightSingle(elementNum);
			}

		else if (mode$ == "line") {
			elementNum = FindClosestLine(targetVector, point.x, point.y, GetLastUsedGeorefObject(targetVector));
			if (elementNum > 0 ) then
				vectorLayer.Line.HighlightSingle(elementNum);
			}

		else if (mode$ == "poly") {
			elementNum = FindClosestPoly(targetVector, point.x, point.y, GetLastUsedGeorefObject(targetVector));
			if (elementNum > 0 ) then
				vectorLayer.Poly.HighlightSingle(elementNum);
			}
		}
	}  # end of OnLeftButtonPress 

# Callback for when the active group changes.
proc cbGroup() {
	activegroup = Layout.ActiveGroup;
	}

# Procedure for closing the tool dialog window.
proc OnClose()	{
	DialogClose(elemwin);
	toolOpen = false;
	}

# Called the first time the tool is activated.
# If the tool implements a dialog it should be created (but not displayed) here.
func OnInitialize () {
	if (Layout) {
		WidgetAddCallback(Layout.GroupSelectedCallback, cbGroup);
		activegroup = Layout.ActiveGroup;
		}
	else {
		activegroup = Group;
		WidgetAddCallback(Group.LayerSelectedCallback, OnLayerChange);
		}

	# Set up tool dialog window.
	elemwin = CreateFormDialog("Select Element");
	elemwin.marginHeight = 5;
	elemwin.marginWidth = 5;
	WidgetAddCallback(elemwin.Shell.PopdownCallback, OnClose);

	# Add drawing area for layer identifier text.
	da = CreateDrawingArea(elemwin, 12, 180);
	da.TopWidget = elemwin;
	da.LeftWidget = elemwin;
	da.LeftOffset = 5;
	da.RightWidget = elemwin;
	da.RightOffset = 5;
	WidgetAddCallback(da.ExposeCallback, OnRedraw);

	# Add select label text.
	selectlabel = CreateLabel(elemwin, "Select: ");
	selectlabel.TopWidget = da;
	selectlabel.TopOffset = 4;
	selectlabel.LeftWidget = elemwin;
	selectlabel.RightWidget = selectlabel;		# unattached

	# Add form for element type toggle buttons.
	selectMode = CreateRowColumn(elemwin, 1);
	selectMode.Orientation = "VERTICAL";
	selectMode.TopWidget = selectlabel;
	selectMode.LeftWidget = elemwin;
	selectMode.LeftOffset = 20;
	selectMode.RightWidget = elemwin;
	selectMode.RadioBehavior = 1;

	# Add radio button for points.
	pointButton = CreateToggleButton(selectMode, "Closest Point");
	WidgetAddCallback(pointButton.ValueChangedCallback, OnModeChanged);

	# Add radio button for lines.
	lineButton = CreateToggleButton(selectMode, "Closest Line");
	WidgetAddCallback(lineButton.ValueChangedCallback, OnModeChanged);

	# Add radio button for polygons.
	polyButton = CreateToggleButton(selectMode, "Enclosing Polygon");
	WidgetAddCallback(polyButton.ValueChangedCallback, OnModeChanged);

	# Add separator between selection buttons and close button.
	line1 = CreateHorizontalSeparator(elemwin);
	line1.TopWidget = selectMode;
	line1.TopOffset = 5;
	line1.LeftWidget = elemwin;
	line1.RightWidget = elemwin;

	# Add button to close window.
	closeButton = CreatePushButtonItem("Close", OnClose);

	# Create form for pushbutton row.
	buttonRow = CreateButtonRow(elemwin, closeButton);
	buttonRow.TopWidget = line1;
	buttonRow.LeftWidget = elemwin;
	buttonRow.RightWidget = elemwin;

	}  # end of OnInitialize 

# Called when tool is activated.
func OnActivate ()	{
	toolOpen = true;
	checkLayer();

	# Reset dialog window defaults
	pointButton.Set = 1;
	lineButton.Set = 0;
	polyButton.Set = 0;
	mode$ = "point";

	if (activegroup.ActiveLayer.Type == "Vector") then
		activegroup.ActiveLayer.UnhighlightAllElements();

	DialogOpen(elemwin);

	if (gc == 0) then
		gc = CreateGCForDrawingArea(da);

	OnRedraw();
	}	# end of OnActivate

# Called when tool is deactivated (usually when switching to another tool).
func OnDeactivate ()	{
	OnClose();
	}	# end of OnDeactivate

# Called when tool is to be destroyed, will not be called if tool was never activated.
func OnDestroy ()	{
	DestroyGC(gc);
	DestroyWidget(elemwin);
	}		# end of OnDestroy





Back Home ©MicroImages, Inc. 2008 Published in the United States of America
11th Floor - Sharp Tower, 206 South 13th Street, Lincoln NE 68508-2010   USA
Business & Sales: (402)477-9554  Support: (402)477-9562  Fax: (402)477-9559
Business info@microimages.com  Support support@microimages.com  Web webmaster@microimages.com

9 May 2008

page update: 14 Aug 07