I am using the C# version located here http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/d/00010000017z000000.ht...
// Copyright 2010 ESRI
//
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
//
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
//
// See the use restrictions at http://help.arcgis.com/en/sdk/10.0/usageRestrictions.htm
//
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Editor;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.Geometry;
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace ViperPin
{
public sealed class ViperPinTool : BaseTool, IShapeConstructorTool, ISketchTool
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
// Required for ArcGIS Component Category Registrar support
ArcGISCategoryRegistration(registerType);
//
// TODO: Add any COM registration code here
//
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
// Required for ArcGIS Component Category Registrar support
ArcGISCategoryUnregistration(registerType);
//
// TODO: Add any COM unregistration code here
//
}
#region ArcGIS Component Category Registrar generated code
/// <summary>
/// Required method for ArcGIS Component Category registration -
/// Do not modify the contents of this method with the code editor.
/// </summary>
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
MxCommands.Register(regKey);
}
/// <summary>
/// Required method for ArcGIS Component Category unregistration -
/// Do not modify the contents of this method with the code editor.
/// </summary>
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
MxCommands.Unregister(regKey);
}
#endregion
#endregion
private IApplication m_application;
private IEditor3 m_editor;
private IEditEvents_Event m_editEvents;
private IEditEvents5_Event m_editEvents5;
private IEditSketch3 m_edSketch;
private IShapeConstructor m_csc;
private ViperPinForm m_form;
public ViperPinTool()
{
base.m_category = "Developer Samples"; //localizable text
base.m_caption = "ViperPin"; //Text in construct tools window
base.m_message = "populate parcel pin"; //localizable text
base.m_toolTip = "Viper PIN tool"; //localizable text
base.m_name = "DeveloperSamples_ViperPin"; //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
try
{
string bitmapResourceName = GetType().Name + ".bmp";
base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
//base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur");
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
}
}
#region ISketchTool Members
//pass to constructor
public void AddPoint(IPoint point, bool Clone, bool allowUndo)
{
m_csc.AddPoint(point, Clone, allowUndo);
}
public IPoint Anchor
{
get { return m_csc.Anchor; }
}
public double AngleConstraint
{
get { return m_csc.AngleConstraint; }
set { m_csc.AngleConstraint = value; }
}
public esriSketchConstraint Constraint
{
get { return m_csc.Constraint; }
set { m_csc.Constraint = value; }
}
public double DistanceConstraint
{
get { return m_csc.DistanceConstraint; }
set { m_csc.DistanceConstraint = value; }
}
public bool IsStreaming
{
get { return m_csc.IsStreaming; }
set { m_csc.IsStreaming = value; }
}
public IPoint Location
{
get { return m_csc.Location; }
}
#endregion
#region ITool Members
//pass to constructor
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
m_csc.OnMouseDown(Button, Shift, X, Y);
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
m_csc.OnMouseMove(Button, Shift, X, Y);
}
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
m_csc.OnMouseUp(Button, Shift, X, Y);
}
public override bool OnContextMenu(int X, int Y)
{
return m_csc.OnContextMenu(X, Y);
}
public override void OnKeyDown(int keyCode, int Shift)
{
m_csc.OnKeyDown(keyCode, Shift);
}
public override void OnKeyUp(int keyCode, int Shift)
{
m_csc.OnKeyUp(keyCode, Shift);
}
public override void Refresh(int hDC)
{
m_csc.Refresh(hDC);
}
public override int Cursor
{
get { return m_csc.Cursor; }
}
public override void OnDblClick()
{
if (Control.ModifierKeys == Keys.Shift)
{
ISketchOperation so = new SketchOperation();
so.MenuString_2 = "Finish Sketch Part";
so.Start(m_editor);
m_edSketch.FinishSketchPart();
so.Finish(null);
}
else
m_edSketch.FinishSketch();
}
public override bool Deactivate()
{
//unsubscribe events
m_editEvents.OnSketchModified -= m_editEvents_OnSketchModified;
m_editEvents5.OnShapeConstructorChanged -= m_editEvents5_OnShapeConstructorChanged;
m_editEvents.OnSketchFinished -= m_editEvents_OnSketchFinished;
return base.Deactivate();
}
#endregion
public override void OnCreate(object hook)
{
if (hook == null)
return;
m_application = hook as IApplication;
//get the editor
UID editorUid = new UID();
editorUid.Value = "esriEditor.Editor";
m_editor = m_application.FindExtensionByCLSID(editorUid) as IEditor3;
m_editEvents = m_editor as IEditEvents_Event;
m_editEvents5 = m_editor as IEditEvents5_Event;
}
public override bool Enabled
{
// Enable the tool if we are editing
get { return (m_editor.EditState == esriEditState.esriStateEditing); }
}
public override void OnClick()
{
m_edSketch = m_editor as IEditSketch3;
//Restrict to line constructors (for this tool)
m_edSketch.GeometryType = esriGeometryType.esriGeometryPolyline;
//Activate a constructor based on the current sketch geometry
if (m_edSketch.GeometryType == esriGeometryType.esriGeometryPoint)
m_csc = new PointConstructorClass();
else
m_csc = new StraightConstructorClass();
m_csc.Initialize(m_editor);
m_edSketch.ShapeConstructor = m_csc;
m_csc.Activate();
//set the current task to null
m_editor.CurrentTask = null;
//setup events
m_editEvents.OnSketchModified += new IEditEvents_OnSketchModifiedEventHandler(m_editEvents_OnSketchModified);
m_editEvents5.OnShapeConstructorChanged += new IEditEvents5_OnShapeConstructorChangedEventHandler(m_editEvents5_OnShapeConstructorChanged);
m_editEvents.OnSketchFinished += new IEditEvents_OnSketchFinishedEventHandler(m_editEvents_OnSketchFinished);
//Create form and pass initialization parameters
m_form = new ViperPinForm(m_editor);
base.OnClick();
}
void m_editEvents_OnSketchFinished()
{
//send a shift-tab to hide the construction toolbar
//SendKeys.SendWait("+{TAB}");
OnKeyDown(9,1);
//Show the dialog modal
m_form.ShowDialog();
}
private void m_editEvents_OnSketchModified()
{
m_csc.SketchModified();
}
private void m_editEvents5_OnShapeConstructorChanged()
{
//activate new constructor
m_csc.Deactivate();
m_csc = null;
m_csc = m_edSketch.ShapeConstructor;
m_csc.Activate();
}
}
}