About the Points along line construction tool Sample
[C#]
PointsAlongLineTool.cs
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.ArcMapUI; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.Editor; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geometry; namespace PointsAlongLine { /// <summary> /// Summary description for PointsAlongLine. /// </summary> [Guid("1f7cc037-07c1-497d-83a5-bfdd98eb8dd8")] [ClassInterface(ClassInterfaceType.None)] [ProgId("PointsAlongLine.PointsAlongLine")] public sealed class PointsAlongLineTool : 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); FeatureConstructionPointTools.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); FeatureConstructionPointTools.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 PointsAlongLineForm m_form; public PointsAlongLineTool() { base.m_category = "Developer Samples"; //localizable text base.m_caption = "Points along a line"; //localizable text base.m_message = "Creates points at regular intervals along a sketch"; //localizable text base.m_toolTip = "Points along a line tool"; //localizable text base.m_name = "DeveloperSamples_PointsAlongLine"; //unique id, non-localizable (e.g. "MyCategory_ArcMapTool") 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 pso = new SketchOperation(); pso.MenuString_2 = "Finish Sketch Part"; pso.Start(m_editor); m_edSketch.FinishSketchPart(); pso.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 /// <summary> /// Occurs when this tool is created /// </summary> /// <param name="hook">Instance of the application</param> public override void OnCreate(object hook) { 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; } /// <summary> /// Occurs when this tool is clicked /// </summary> public override void OnClick() { m_edSketch = m_editor as IEditSketch3; //Restrict to line constructors (for this tool) m_edSketch.GeometryType = esriGeometryType.esriGeometryPolyline; //Activate a shape 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); } void m_editEvents_OnSketchFinished() { //send a space to hide the construction toolbar SendKeys.SendWait(" "); //Create form and pass initialization parameters m_form = new PointsAlongLineForm(m_editor); //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(); } } }
[Visual Basic .NET]
PointsAlongLineTool.vb
Imports Microsoft.VisualBasic Imports System Imports System.Drawing Imports System.Runtime.InteropServices Imports System.Windows.Forms Imports ESRI.ArcGIS.ADF.BaseClasses Imports ESRI.ArcGIS.ADF.CATIDs Imports ESRI.ArcGIS.ArcMapUI Imports ESRI.ArcGIS.Framework Imports ESRI.ArcGIS.Editor Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geometry Namespace PointsAlongLine ''' <summary> ''' Summary description for PointsAlongLine. ''' </summary> <Guid("1f7cc037-07c1-497d-83a5-bfdd98eb8dd8"), ClassInterface(ClassInterfaceType.None), ProgId("PointsAlongLine.PointsAlongLine")> _ Public NotInheritable Class PointsAlongLineTool Inherits BaseTool Implements IShapeConstructorTool, ISketchTool #Region "COM Registration Function(s)" <ComRegisterFunction(), ComVisible(False)> _ Private Shared Sub RegisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType) ' ' TODO: Add any COM registration code here ' End Sub <ComUnregisterFunction(), ComVisible(False)> _ Private Shared Sub UnregisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType) ' ' TODO: Add any COM unregistration code here ' End Sub #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 Shared Sub ArcGISCategoryRegistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) MxCommands.Register(regKey) FeatureConstructionPointTools.Register(regKey) End Sub ''' <summary> ''' Required method for ArcGIS Component Category unregistration - ''' Do not modify the contents of this method with the code editor. ''' </summary> Private Shared Sub ArcGISCategoryUnregistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) MxCommands.Unregister(regKey) FeatureConstructionPointTools.Unregister(regKey) End Sub #End Region #End Region Private m_application As IApplication Private m_editor As IEditor3 Private m_editEvents As IEditEvents_Event Private m_editEvents5 As IEditEvents5_Event Private m_edSketch As IEditSketch3 Private m_csc As IShapeConstructor Private m_form As PointsAlongLineForm Public Sub New() MyBase.m_category = "Developer Samples" 'localizable text MyBase.m_caption = "Points along a line" 'localizable text MyBase.m_message = "Creates points at regular intervals along a sketch" 'localizable text MyBase.m_toolTip = "Points along a line tool" 'localizable text MyBase.m_name = "DeveloperSamples_PointsAlongLine" 'unique id, non-localizable (e.g. "MyCategory_ArcMapTool") Try Dim bitmapResourceName As String = Me.GetType().Name & ".bmp" MyBase.m_bitmap = New Bitmap(Me.GetType(), bitmapResourceName) 'base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur"); Catch ex As Exception System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap") End Try End Sub #Region "ISketchTool Members" 'pass to constructor Public Sub AddPoint(ByVal point As IPoint, ByVal Clone As Boolean, ByVal allowUndo As Boolean) Implements ISketchTool.AddPoint m_csc.AddPoint(point, Clone, allowUndo) End Sub Public ReadOnly Property Anchor() As IPoint Implements ISketchTool.Anchor Get Return m_csc.Anchor End Get End Property Public Property AngleConstraint() As Double Implements ISketchTool.AngleConstraint Get Return m_csc.AngleConstraint End Get Set(ByVal value As Double) m_csc.AngleConstraint = value End Set End Property Public Property Constraint() As esriSketchConstraint Implements ISketchTool.Constraint Get Return m_csc.Constraint End Get Set(ByVal value As esriSketchConstraint) m_csc.Constraint = value End Set End Property Public Property DistanceConstraint() As Double Implements ISketchTool.DistanceConstraint Get Return m_csc.DistanceConstraint End Get Set(ByVal value As Double) m_csc.DistanceConstraint = value End Set End Property Public Property IsStreaming() As Boolean Implements ISketchTool.IsStreaming Get Return m_csc.IsStreaming End Get Set(ByVal value As Boolean) m_csc.IsStreaming = value End Set End Property Public ReadOnly Property Location() As IPoint Implements ISketchTool.Location Get Return m_csc.Location End Get End Property #End Region #Region "ITool Members" 'pass to constructor Public Overrides Sub OnMouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) m_csc.OnMouseDown(Button, Shift, X, Y) End Sub Public Overrides Sub OnMouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) m_csc.OnMouseMove(Button, Shift, X, Y) End Sub Public Overrides Sub OnMouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) m_csc.OnMouseUp(Button, Shift, X, Y) End Sub Public Overrides Function OnContextMenu(ByVal X As Integer, ByVal Y As Integer) As Boolean Return m_csc.OnContextMenu(X, Y) End Function Public Overrides Sub OnKeyDown(ByVal keyCode As Integer, ByVal Shift As Integer) m_csc.OnKeyDown(keyCode, Shift) End Sub Public Overrides Sub OnKeyUp(ByVal keyCode As Integer, ByVal Shift As Integer) m_csc.OnKeyUp(keyCode, Shift) End Sub Public Overrides Sub Refresh(ByVal hDC As Integer) m_csc.Refresh(hDC) End Sub Public Overrides ReadOnly Property Cursor() As Integer Get Return m_csc.Cursor End Get End Property Public Overrides Sub OnDblClick() If Control.ModifierKeys = Keys.Shift Then Dim pso As ISketchOperation = New SketchOperation() pso.MenuString_2 = "Finish Sketch Part" pso.Start(m_editor) m_edSketch.FinishSketchPart() pso.Finish(Nothing) Else m_edSketch.FinishSketch() End If End Sub Public Overrides Function Deactivate() As Boolean 'unsubscribe events RemoveHandler m_editEvents.OnSketchModified, AddressOf m_editEvents_OnSketchModified RemoveHandler m_editEvents5.OnShapeConstructorChanged, AddressOf m_editEvents5_OnShapeConstructorChanged RemoveHandler m_editEvents.OnSketchFinished, AddressOf m_editEvents_OnSketchFinished Return MyBase.Deactivate() End Function #End Region ''' <summary> ''' Occurs when this tool is created ''' </summary> ''' <param name="hook">Instance of the application</param> Public Overrides Sub OnCreate(ByVal hook As Object) m_application = TryCast(hook, IApplication) 'get the editor Dim editorUid As New UID() editorUid.Value = "esriEditor.Editor" m_editor = TryCast(m_application.FindExtensionByCLSID(editorUid), IEditor3) m_editEvents = TryCast(m_editor, IEditEvents_Event) m_editEvents5 = TryCast(m_editor, IEditEvents5_Event) End Sub ''' <summary> ''' Occurs when this tool is clicked ''' </summary> Public Overrides Sub OnClick() m_edSketch = TryCast(m_editor, IEditSketch3) 'Restrict to line constructors (for this tool) m_edSketch.GeometryType = esriGeometryType.esriGeometryPolyline 'Activate a shape constructor based on the current sketch geometry If m_edSketch.GeometryType = esriGeometryType.esriGeometryPoint Then m_csc = New PointConstructorClass() Else m_csc = New StraightConstructorClass() End If m_csc.Initialize(m_editor) m_edSketch.ShapeConstructor = m_csc m_csc.Activate() 'set the current task to null m_editor.CurrentTask = Nothing 'setup events AddHandler m_editEvents.OnSketchModified, AddressOf m_editEvents_OnSketchModified AddHandler m_editEvents5.OnShapeConstructorChanged, AddressOf m_editEvents5_OnShapeConstructorChanged AddHandler m_editEvents.OnSketchFinished, AddressOf m_editEvents_OnSketchFinished End Sub Private Sub m_editEvents_OnSketchFinished() 'send a space to hide the construction toolbar SendKeys.SendWait(" ") 'Create form and pass initialization parameters m_form = New PointsAlongLineForm(m_editor) 'Show the dialog modal m_form.ShowDialog() End Sub Private Sub m_editEvents_OnSketchModified() m_csc.SketchModified() End Sub Private Sub m_editEvents5_OnShapeConstructorChanged() 'activate new constructor m_csc.Deactivate() m_csc = Nothing m_csc = m_edSketch.ShapeConstructor m_csc.Activate() End Sub End Class End Namespace