![在这里插入图片描述](https://img-blog.csdnimg.cn/20201013140717610.png#pic_center)
1.绘制点
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using System.Windows.Forms;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
namespace Com.XXW.NTSL.EditorTool
{
[Guid("30ce6ad4-971f-4260-99df-c12bdd650c39")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Com.XXW.NTSL.EditorTool.DrawPointTool")]
public sealed class DrawPointTool : BaseTool
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
ArcGISCategoryRegistration(registerType);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
ArcGISCategoryUnregistration(registerType);
}
#region ArcGIS Component Category Registrar generated code
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Register(regKey);
}
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Unregister(regKey);
}
#endregion
#endregion
private IHookHelper m_hookHelper;
private ILayer pLayer;
public DrawPointTool(ILayer Layer)
{
pLayer = Layer;
base.m_category = "";
base.m_caption = "";
base.m_message = "";
base.m_toolTip = "";
base.m_name = "";
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 Overridden Class Methods
public override void OnCreate(object hook)
{
if (m_hookHelper == null)
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
public override void OnClick()
{
}
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
if (Button == 1)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
AddFeature(pLayer, pPoint);
IActiveView pActiveView = m_hookHelper.ActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pLayer, null);
}
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
}
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
}
private void AddFeature(ILayer pLayer, IGeometry pGeometry)
{
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
if (pFeatureLayer != null)
{
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IWorkspaceEdit w = (pFeatureClass as IDataset).Workspace as IWorkspaceEdit;
IFeature pFeature;
IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
IFeatureCursor pFtCursor;
pFtCursor = pFeatureClass.Search(null, true);
pFeature = pFtCursor.NextFeature();
pFtCursor = pFeatureClass.Insert(true);
try
{
pFeatureBuffer.Shape = pGeometry;
}
catch (COMException ex)
{
MessageBox.Show("绘制的几何图形超出了边界!");
return;
}
object featureOID = pFtCursor.InsertFeature(pFeatureBuffer);
pFtCursor.Flush();
Marshal.ReleaseComObject(pFtCursor);
IFeatureSelection pFeatureSelection = pLayer as IFeatureSelection;
pFeatureSelection.Add(pFeatureClass.GetFeature((int)featureOID));
}
else
{
MessageBox.Show("未发现图层");
}
}
#endregion
}
}
2.绘制线
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using System.Windows.Forms;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
namespace Com.XXW.NTSL.EditorTool
{
[Guid("c0e21075-d1ae-45c1-bfe5-ae53479cc91d")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Com.XXW.NTSL.EditorTool.DrawPolylineTool")]
public sealed class DrawPolylineTool : BaseTool
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
ArcGISCategoryRegistration(registerType);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
ArcGISCategoryUnregistration(registerType);
}
#region ArcGIS Component Category Registrar generated code
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Register(regKey);
}
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Unregister(regKey);
}
#endregion
#endregion
private IHookHelper m_hookHelper;
private INewLineFeedback m_NewLineFeedback;
private ILayer pLayer;
public DrawPolylineTool(ILayer Layer)
{
pLayer = Layer;
base.m_category = "";
base.m_caption = "";
base.m_message = "";
base.m_toolTip = "";
base.m_name = "";
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 Overridden Class Methods
public override void OnCreate(object hook)
{
if (m_hookHelper == null)
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
public override void OnClick()
{
}
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
if (Button == 1)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (m_NewLineFeedback == null)
{
m_NewLineFeedback = new NewLineFeedback();
m_NewLineFeedback.Display = m_hookHelper.ActiveView.ScreenDisplay;
m_NewLineFeedback.Start(pPoint);
}
else
{
m_NewLineFeedback.AddPoint(pPoint);
}
}
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (m_NewLineFeedback != null)
{
m_NewLineFeedback.MoveTo(pPoint);
}
}
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
}
public override void OnDblClick()
{
if (m_NewLineFeedback != null)
{
IPolyline pPolyline = m_NewLineFeedback.Stop();
m_NewLineFeedback = null;
AddFeature(pLayer, pPolyline);
IActiveView pActiveView = m_hookHelper.ActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pLayer, null);
}
}
private void AddFeature(ILayer pLayer, IGeometry pGeometry)
{
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
if (pFeatureLayer != null)
{
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IWorkspaceEdit w = (pFeatureClass as IDataset).Workspace as IWorkspaceEdit;
IFeature pFeature;
w.StartEditing(true);
w.StartEditOperation();
IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
IFeatureCursor pFtCursor;
pFtCursor = pFeatureClass.Search(null, true);
pFeature = pFtCursor.NextFeature();
pFtCursor = pFeatureClass.Insert(true);
try
{
pFeatureBuffer.Shape = pGeometry;
}
catch (COMException ex)
{
MessageBox.Show("绘制的几何图形超出了边界!");
return;
}
object featureOID = pFtCursor.InsertFeature(pFeatureBuffer);
pFtCursor.Flush();
Marshal.ReleaseComObject(pFtCursor);
IFeatureSelection pFeatureSelection = pLayer as IFeatureSelection;
pFeatureSelection.Add(pFeatureClass.GetFeature((int)featureOID));
}
else
{
MessageBox.Show("未发现图层");
}
}
#endregion
}
}
3.绘制面
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using System.Windows.Forms;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
namespace Com.XXW.NTSL.EditorTool
{
[Guid("38bbe890-eade-4303-acd4-3768e2106c49")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Com.XXW.NTSL.EditorTool.DrawPolygonTool")]
public sealed class DrawPolygonTool : BaseTool
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
ArcGISCategoryRegistration(registerType);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
ArcGISCategoryUnregistration(registerType);
}
#region ArcGIS Component Category Registrar generated code
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Register(regKey);
}
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Unregister(regKey);
}
#endregion
#endregion
private IHookHelper m_hookHelper;
private INewPolygonFeedback m_NewPolygonFeedback;
private ILayer pLayer;
public DrawPolygonTool(ILayer Layer)
{
pLayer = Layer;
base.m_category = "";
base.m_caption = "";
base.m_message = "";
base.m_toolTip = "";
base.m_name = "";
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 Overridden Class Methods
public override void OnCreate(object hook)
{
if (m_hookHelper == null)
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
public override void OnClick()
{
}
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
if (Button == 1)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (m_NewPolygonFeedback == null)
{
m_NewPolygonFeedback = new NewPolygonFeedback();
m_NewPolygonFeedback.Display = m_hookHelper.ActiveView.ScreenDisplay;
m_NewPolygonFeedback.Start(pPoint);
}
else
{
m_NewPolygonFeedback.AddPoint(pPoint);
}
}
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (m_NewPolygonFeedback != null)
{
m_NewPolygonFeedback.MoveTo(pPoint);
}
}
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
}
public override void OnDblClick()
{
if (m_NewPolygonFeedback != null)
{
IPolygon pPolygon = m_NewPolygonFeedback.Stop();
m_NewPolygonFeedback = null;
AddFeature(pLayer, pPolygon);
IActiveView pActiveView = m_hookHelper.ActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pLayer, null);
}
}
private void AddFeature(ILayer pLayer, IGeometry pGeometry)
{
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
if (pFeatureLayer != null)
{
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IWorkspaceEdit w = (pFeatureClass as IDataset).Workspace as IWorkspaceEdit;
IFeature pFeature;
IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
IFeatureCursor pFtCursor;
pFtCursor = pFeatureClass.Search(null, true);
pFeature = pFtCursor.NextFeature();
pFtCursor = pFeatureClass.Insert(true);
try
{
pFeatureBuffer.Shape = pGeometry;
}
catch (COMException ex)
{
MessageBox.Show("绘制的几何图形超出了边界!");
return;
}
object featureOID = pFtCursor.InsertFeature(pFeatureBuffer);
pFtCursor.Flush();
Marshal.ReleaseComObject(pFtCursor);
IFeatureSelection pFeatureSelection = pLayer as IFeatureSelection;
pFeatureSelection.Add(pFeatureClass.GetFeature((int)featureOID));
}
else
{
MessageBox.Show("未发现图层");
}
}
#endregion
}
}
4.绘制弧线
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using System.Windows.Forms;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
namespace Com.XXW.NTSL.EditorTool
{
[Guid("2b027ad2-7d99-4dd5-a163-4ed618764c15")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Com.XXW.NTSL.EditorTool.DrawArcTool")]
public sealed class DrawArcTool : BaseTool
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
ArcGISCategoryRegistration(registerType);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
ArcGISCategoryUnregistration(registerType);
}
#region ArcGIS Component Category Registrar generated code
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Register(regKey);
}
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Unregister(regKey);
}
#endregion
#endregion
private IHookHelper m_hookHelper;
private INewArcFeedback m_NewArcFeedback;
private IDisplayFeedback pDisplayFeedback;
private ILayer pLayer;
private int i = 0;
public DrawArcTool(ILayer Layer)
{
pLayer = Layer;
base.m_category = "";
base.m_caption = "";
base.m_message = "";
base.m_toolTip = "";
base.m_name = "";
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 Overridden Class Methods
public override void OnCreate(object hook)
{
if (m_hookHelper == null)
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
public override void OnClick()
{
}
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (Button == 1)
{
if (m_NewArcFeedback == null)
{
m_NewArcFeedback = new NewArcFeedbackClass();
pDisplayFeedback = m_NewArcFeedback as IDisplayFeedback;
pDisplayFeedback.Display = m_hookHelper.ActiveView.ScreenDisplay;
m_NewArcFeedback.Start(pPoint);
i++;
return;
}
if (i == 1)
{
m_NewArcFeedback.SetEndpoint(pPoint);
i++;
return;
}
if(i == 2)
{
ICircularArc circularArc = new CircularArcClass();
m_NewArcFeedback.Stop(pPoint, out circularArc);
AddArc(pLayer, circularArc);
m_NewArcFeedback = null;
i = 0;
return;
}
}
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (m_NewArcFeedback != null)
{
if (m_NewArcFeedback.Arc != null)
{
pDisplayFeedback.MoveTo(pPoint);
}
}
}
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
}
private void AddArc(ILayer pLayer, ICircularArc circularArc)
{
if (pLayer != null)
{
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
if (pFeatureClass != null)
{
if (pFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
{
IPolyline ArcPolyline = new PolylineClass();
ISegmentCollection segementColl = (ISegmentCollection)ArcPolyline;
ISegment segment = (ISegment)circularArc;
segementColl.AddSegment(segment);
AddFeature(pLayer, ArcPolyline);
}
if (pFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
{
IPolygon ArcPolygon = new PolygonClass();
ISegmentCollection segementColl = (ISegmentCollection)ArcPolygon;
ISegment segment = (ISegment)circularArc;
segementColl.AddSegment(segment);
AddFeature(pLayer, ArcPolygon);
}
IActiveView pActiveView = m_hookHelper.ActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pLayer, null);
}
else
{
MessageBox.Show("未发现要素!");
}
}
else
{
MessageBox.Show("未发现图层!");
}
}
private void AddFeature(ILayer pLayer, IGeometry pGeometry)
{
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
if (pFeatureLayer != null)
{
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IWorkspaceEdit WorkspaceEdit = (pFeatureClass as IDataset).Workspace as IWorkspaceEdit;
IFeature pFeature;
WorkspaceEdit.StartEditing(true);
WorkspaceEdit.StartEditOperation();
IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
IFeatureCursor pFtCursor;
pFtCursor = pFeatureClass.Search(null, true);
pFeature = pFtCursor.NextFeature();
pFtCursor = pFeatureClass.Insert(true);
try
{
pFeatureBuffer.Shape = pGeometry;
}
catch (COMException ex)
{
MessageBox.Show("绘制的几何图形超出了边界!");
return;
}
object featureOID = pFtCursor.InsertFeature(pFeatureBuffer);
pFtCursor.Flush();
Marshal.ReleaseComObject(pFtCursor);
IFeatureSelection pFeatureSelection = pLayer as IFeatureSelection;
pFeatureSelection.Add(pFeatureClass.GetFeature((int)featureOID));
}
else
{
MessageBox.Show("未发现图层");
}
}
#endregion
}
}
5.增加折点
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
namespace Com.XXW.NTSL.EditorTool
{
[Guid("5baa7888-3d50-42cb-a0ad-9e64af24a910")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Com.XXW.NTSL.EditorTool.EditorAddPoint")]
public sealed class EditorAddPoint : BaseTool
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
ArcGISCategoryRegistration(registerType);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
ArcGISCategoryUnregistration(registerType);
}
#region ArcGIS Component Category Registrar generated code
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Register(regKey);
}
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Unregister(regKey);
}
#endregion
#endregion
private IHookHelper m_hookHelper;
private IEngineEditor pEngineEditor;
public EditorAddPoint(IEngineEditor EngineEditor)
{
pEngineEditor = EngineEditor;
base.m_category = "";
base.m_caption = "";
base.m_message = "";
base.m_toolTip = "";
base.m_name = "";
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 Overridden Class Methods
public override void OnCreate(object hook)
{
if (m_hookHelper == null)
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
public override void OnClick()
{
}
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (Button == 1)
{
IEngineEditSketch m_pSketch = pEngineEditor as IEngineEditSketch;
IHitTest hitShape = (IHitTest)m_pSketch.Geometry;
IPoint hitPoint = new PointClass();
double hitDistance = 0;
int hitPartIndex = 0;
int hitSegmentIndex = 0;
bool bRightSide = false;
esriGeometryHitPartType hitPartType = esriGeometryHitPartType.esriGeometryPartNone;
double searchRadius = 1;
hitPartType = esriGeometryHitPartType.esriGeometryPartVertex;
bool isTrue = hitShape.HitTest(pPoint, searchRadius, hitPartType, hitPoint, ref hitDistance, ref hitPartIndex, ref hitSegmentIndex, ref bRightSide);
if (isTrue) return;
hitPartType = esriGeometryHitPartType.esriGeometryPartBoundary;
isTrue = hitShape.HitTest(pPoint, searchRadius, hitPartType, hitPoint, ref hitDistance, ref hitPartIndex, ref hitSegmentIndex, ref bRightSide);
if (isTrue)
{
IEngineSketchOperation pSketchOp = new EngineSketchOperationClass();
pSketchOp.Start(pEngineEditor);
pSketchOp.SetMenuString("Insert Vertex (Custom)");
IGeometryCollection pGeoCol = (IGeometryCollection)m_pSketch.Geometry;
IPointCollection pPathOrRingPtCol = (IPointCollection)pGeoCol.get_Geometry(hitPartIndex);
object missing = Type.Missing;
object hitSegmentIndexObject = hitSegmentIndex;
object partIndexObject = hitPartIndex;
pPathOrRingPtCol.AddPoint(hitPoint, ref missing, ref hitSegmentIndexObject);
pGeoCol.RemoveGeometries(hitPartIndex, 1);
pGeoCol.AddGeometry((IGeometry)pPathOrRingPtCol, ref partIndexObject, ref missing);
esriEngineSketchOperationType opType = esriEngineSketchOperationType.esriEngineSketchOperationVertexAdded;
pSketchOp.Finish(null, opType, hitPoint);
}
}
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
}
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
}
#endregion
}
}
6.删除折点
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.SystemUI;
namespace Com.XXW.NTSL.EditorTool
{
[Guid("f8560298-7770-4528-9ec5-b1b69ebf9ad5")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Com.XXW.NTSL.EditorTool.EditorDeletePoint")]
public sealed class EditorDeletePoint : BaseTool
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
ArcGISCategoryRegistration(registerType);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
ArcGISCategoryUnregistration(registerType);
}
#region ArcGIS Component Category Registrar generated code
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Register(regKey);
}
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
ControlsCommands.Unregister(regKey);
}
#endregion
#endregion
private IHookHelper m_hookHelper;
private IEngineEditor pEngineEditor;
public EditorDeletePoint(IEngineEditor EngineEditor)
{
pEngineEditor = EngineEditor;
base.m_category = "";
base.m_caption = "";
base.m_message = "";
base.m_toolTip = "";
base.m_name = "";
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 Overridden Class Methods
public override void OnCreate(object hook)
{
if (m_hookHelper == null)
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
public override void OnClick()
{
}
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (Button == 1)
{
IEngineEditSketch m_pSketch = pEngineEditor as IEngineEditSketch;
IHitTest hitShape = (IHitTest)m_pSketch.Geometry;
IPoint hitPoint = new PointClass();
double hitDistance = 0;
int hitPartIndex = 0;
int hitSegmentIndex = 0;
bool bRightSide = false;
esriGeometryHitPartType hitPartType = esriGeometryHitPartType.esriGeometryPartNone;
double searchRadius = 1;
hitPartType = esriGeometryHitPartType.esriGeometryPartVertex;
bool isTrue = hitShape.HitTest(pPoint, searchRadius, hitPartType, hitPoint, ref hitDistance, ref hitPartIndex, ref hitSegmentIndex, ref bRightSide);
if (isTrue)
{
IEngineSketchOperation pSketchOp = new EngineSketchOperationClass();
pSketchOp.Start(pEngineEditor);
pSketchOp.SetMenuString("Delete Vertex (Custom)");
IGeometryCollection pGeoCol = (IGeometryCollection)m_pSketch.Geometry;
IPointCollection pPathOrRingPtCol = (IPointCollection)pGeoCol.get_Geometry(hitPartIndex);
object missing = Type.Missing;
object partIndexObject = hitPartIndex;
pPathOrRingPtCol.RemovePoints(hitSegmentIndex, 1);
pGeoCol.RemoveGeometries(hitPartIndex, 1);
pGeoCol.AddGeometry((IGeometry)pPathOrRingPtCol, ref partIndexObject, ref missing);
esriEngineSketchOperationType opType = esriEngineSketchOperationType.esriEngineSketchOperationVertexDeleted;
pSketchOp.Finish(null, opType, hitPoint);
}
}
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
}
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
}
#endregion
}
}
7.主窗体事件
using Com.XXW.NTSL.Base;
using Com.XXW.NTSL.EditorTool;
using Com.XXW.NTSL.Framework;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Com.XXW.NTSL.EditorManagement
{
public partial class EditorToolBar : Form
{
private int x, y;
private ILayer pLayer;
private static AxMapControl MapControl;
private static IEngineEditor pEngineEditor;
public EditorToolBar(ILayer Layer)
{
MainForm mainForm = MainForm.GetInstance();
MapControl = mainForm.MapControl;
pLayer = Layer;
InitializeComponent();
UpdataEnabled();
}
private void EditorToolBar_Load(object sender, EventArgs e)
{
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IDataset dataset = pFeatureClass as IDataset;
IWorkspace workspace = dataset.Workspace;
pEngineEditor = new EngineEditorClass();
pEngineEditor.EnableUndoRedo(true);
pEngineEditor.StartEditing(workspace, MapControl.Map);
pEngineEditor.StartOperation();
IEngineEditLayers pEditLayer = pEngineEditor as IEngineEditLayers;
pEditLayer.SetTargetLayer(pFeatureLayer, 0);
ICommand pSketch = new ControlsEditingSketchToolClass();
pSketch.OnCreate(MapControl.Object);
MapControl.CurrentTool = pSketch as ITool;
}
private void EditorSelect_Click(object sender, EventArgs e)
{
CancelCheck();
IEngineEditTask pEngineEditTask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask");
pEngineEditor.CurrentTask = pEngineEditTask;
ICommand pEditor = new ControlsEditingEditToolClass();
pEditor.OnCreate(MapControl.Object);
MapControl.CurrentTool = pEditor as ITool;
}
private void EditorPoint_Click(object sender, EventArgs e)
{
CancelCheck();
ICommand pEditor = new DrawPointTool(pLayer);
pEditor.OnCreate(MapControl.Object);
MapControl.CurrentTool = pEditor as ITool;
}
private void EditorLine_Click(object sender, EventArgs e)
{
CancelCheck();
ICommand pEditor = new DrawPolylineTool(pLayer);
pEditor.OnCreate(MapControl.Object);
MapControl.CurrentTool = pEditor as ITool;
}
private void EditorPolygon_Click(object sender, EventArgs e)
{
CancelCheck();
ICommand pEditor = new DrawPolygonTool(pLayer);
pEditor.OnCreate(MapControl.Object);
MapControl.CurrentTool = pEditor as ITool;
}
private void EditorArc_Click(object sender, EventArgs e)
{
CancelCheck();
ICommand pEditor = new DrawArcTool(pLayer);
pEditor.OnCreate(MapControl.Object);
MapControl.CurrentTool = pEditor as ITool;
}
private void EditorTrace_Click(object sender, EventArgs e)
{
CancelCheck();
}
private void EditorBreak_Click(object sender, EventArgs e)
{
if (pEngineEditor.SelectionCount != 0)
{
CancelCheck();
EditorAddPoint.Enabled = true;
EditorDeletePoint.Enabled = true;
IEngineEditTask pEngineEditTask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask");
pEngineEditor.CurrentTask = pEngineEditTask;
ICommand pEditor = new ControlsEditingEditToolClass();
pEditor.OnCreate(MapControl.Object);
MapControl.CurrentTool = pEditor as ITool;
}
else
{
EditorBreak.Checked = true;
MessageBox.Show("请选择要编辑的要素!","提示",MessageBoxButtons.OK);
}
}
private void EditorAddPoint_Click(object sender, EventArgs e)
{
EditorAddPoint.Checked = false;
EditorDeletePoint.Checked = false;
ICommand pEditor = new EditorAddPoint(pEngineEditor);
pEditor.OnCreate(MapControl.Object);
MapControl.CurrentTool = pEditor as ITool;
}
private void EditorDeletePoint_Click(object sender, EventArgs e)
{
EditorAddPoint.Checked = false;
EditorDeletePoint.Checked = false;
ICommand pEditor = new EditorDeletePoint(pEngineEditor);
pEditor.OnCreate(MapControl.Object);
MapControl.CurrentTool = pEditor as ITool;
}
private void buttonClose_Click(object sender, EventArgs e)
{
pEngineEditor.StopOperation(null);
pEngineEditor.StopEditing(true);
this.Close();
}
private void UpdataEnabled()
{
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
if (pFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
{
pEnabled();
EditorPoint.Enabled = true;
EditorPoint.Checked = true;
EditorBreak.Enabled = true;
}
if (pFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
{
pEnabled();
EditorLine.Enabled = true;
EditorLine.Checked = true;
EditorArc.Enabled = true;
EditorTrace.Enabled = true;
EditorBreak.Enabled = true;
}
if (pFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
{
pEnabled();
EditorPolygon.Enabled = true;
EditorPolygon.Checked = true;
EditorArc.Enabled = true;
EditorTrace.Enabled = true;
EditorBreak.Enabled = true;
}
}
private void pEnabled()
{
EditorPoint.Enabled = false;
EditorLine.Enabled = false;
EditorPolygon.Enabled = false;
EditorArc.Enabled = false;
EditorTrace.Enabled = false;
EditorBreak.Enabled = false;
EditorAddPoint.Enabled = false;
EditorDeletePoint.Enabled = false;
}
private void CancelCheck()
{
EditorSelect.Checked = false;
EditorPoint.Checked = false;
EditorLine.Checked = false;
EditorPolygon.Checked = false;
EditorArc.Checked = false;
EditorTrace.Checked = false;
EditorBreak.Checked = false;
EditorAddPoint.Checked = false;
EditorDeletePoint.Checked = false;
EditorAddPoint.Enabled = false;
EditorDeletePoint.Enabled = false;
}
private void panelTitle_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
x = e.X;
y = e.Y;
}
}
private void panelTitle_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
this.Location = new System.Drawing.Point(this.Location.X + (e.X - x), this.Location.Y + (e.Y - y));
}
}
}
}