|
|
|
|
using ESRI.ArcGIS.ADF.BaseClasses;
|
|
|
|
|
using ESRI.ArcGIS.Carto;
|
|
|
|
|
using ESRI.ArcGIS.Controls;
|
|
|
|
|
using ESRI.ArcGIS.Geodatabase;
|
|
|
|
|
using ESRI.ArcGIS.Geometry;
|
|
|
|
|
using ESRI.ArcGIS.SystemUI;
|
|
|
|
|
using KGIS.Framework.Utils.Helper;
|
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
namespace Kingo.Plugin.NYYP.Tool
|
|
|
|
|
{
|
|
|
|
|
public class AddFeatureCommand : BaseTool
|
|
|
|
|
{
|
|
|
|
|
private IHookHelper m_hookHelper;
|
|
|
|
|
private IEngineEditor edit;
|
|
|
|
|
private ControlsEditingSketchToolClass controlsEditingSketchToolClass = null;
|
|
|
|
|
private IToolbarMenu m_toolbarMenuVertex;//绘图时右键弹出的鼠标点在编辑要素的顶点或边缘上,弹出的右键菜单
|
|
|
|
|
private ControlsEditingSketchDeleteCommandChinese pControlsEditingSketchDeleteCommandChinese;
|
|
|
|
|
public override void OnCreate(object hook)
|
|
|
|
|
{
|
|
|
|
|
if (m_hookHelper == null)
|
|
|
|
|
{
|
|
|
|
|
m_hookHelper = new HookHelperClass();
|
|
|
|
|
m_hookHelper.Hook = hook;
|
|
|
|
|
}
|
|
|
|
|
edit = new EngineEditorClass();
|
|
|
|
|
if (controlsEditingSketchToolClass == null)
|
|
|
|
|
{
|
|
|
|
|
controlsEditingSketchToolClass = new ControlsEditingSketchToolClass();
|
|
|
|
|
}
|
|
|
|
|
(m_hookHelper.Hook as IMapControl2).CurrentTool = controlsEditingSketchToolClass;
|
|
|
|
|
//base.CurrentTool = controlsEditingSketchToolClass;
|
|
|
|
|
//base.OnCreate(hook);
|
|
|
|
|
|
|
|
|
|
//初始化右键菜单 郑英杰 2018-09-10
|
|
|
|
|
if (m_toolbarMenuVertex == null)
|
|
|
|
|
{
|
|
|
|
|
m_toolbarMenuVertex = CreateVertexContextMenu();
|
|
|
|
|
m_toolbarMenuVertex.SetHook(m_hookHelper.Hook);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnClick()
|
|
|
|
|
{
|
|
|
|
|
if (edit == null)
|
|
|
|
|
{
|
|
|
|
|
edit = new EngineEditorClass();
|
|
|
|
|
}
|
|
|
|
|
if ((edit as EngineEditorClass).TargetLayer != null)
|
|
|
|
|
{
|
|
|
|
|
(edit as EngineEditorClass).GeometryType = ((edit as EngineEditorClass).TargetLayer as IFeatureLayer).FeatureClass.ShapeType;
|
|
|
|
|
}
|
|
|
|
|
this.OnCreate(this.m_hookHelper.Hook);
|
|
|
|
|
base.OnClick();
|
|
|
|
|
controlsEditingSketchToolClass.OnClick();
|
|
|
|
|
}
|
|
|
|
|
public override void OnDblClick()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
IFeatureLayer featureLayer = (edit as EngineEditorClass).TargetLayer as IFeatureLayer;
|
|
|
|
|
if (featureLayer == null || featureLayer.FeatureClass == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
IEngineEditSketch editSketch = edit as IEngineEditSketch;
|
|
|
|
|
IGeometry geometry = editSketch.Geometry;
|
|
|
|
|
if (geometry == null || geometry.GeometryType == esriGeometryType.esriGeometryPoint)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//BUG12271 郑英杰 2018-09-12
|
|
|
|
|
if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
|
|
|
|
|
{
|
|
|
|
|
//判断面图形面积是否大于0
|
|
|
|
|
IPolygon pPolygon = geometry as IPolygon;
|
|
|
|
|
IArea pArea = (IArea)pPolygon;
|
|
|
|
|
|
|
|
|
|
//BUG12300 郑英杰 2018-09-13 修改逆时针方向划线无法结束问题
|
|
|
|
|
//if (pArea.Area <= 0)
|
|
|
|
|
if (pArea.Area == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline || featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryLine)
|
|
|
|
|
{
|
|
|
|
|
//判断线图形长度是否大于0
|
|
|
|
|
IPolyline pPolyline = geometry as IPolyline;
|
|
|
|
|
if (pPolyline.Length <= 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double xmin = 0;
|
|
|
|
|
double xmax = 0;
|
|
|
|
|
double ymin = 0;
|
|
|
|
|
double ymax = 0;
|
|
|
|
|
//判断绘制的图形是否在目标图层数据范围内
|
|
|
|
|
if ((featureLayer.FeatureClass as IGeoDataset) != null && (featureLayer.FeatureClass as IGeoDataset).SpatialReference != null)
|
|
|
|
|
{
|
|
|
|
|
(featureLayer.FeatureClass as IGeoDataset).SpatialReference.GetDomain(out xmin, out xmax, out ymin, out ymax);
|
|
|
|
|
IEnvelope enveloe = (featureLayer.FeatureClass as IGeoDataset).Extent;
|
|
|
|
|
enveloe.XMin = xmin;
|
|
|
|
|
enveloe.XMax = xmax;
|
|
|
|
|
enveloe.YMin = ymin;
|
|
|
|
|
enveloe.YMax = ymax;
|
|
|
|
|
geometry.SpatialReference = enveloe.SpatialReference;
|
|
|
|
|
if (!KGIS.Framework.AE.FeatureAPI.IsContains(enveloe, geometry))
|
|
|
|
|
{
|
|
|
|
|
MessageHelper.ShowError("绘制图形超出目标图层范围!");
|
|
|
|
|
editSketch.Geometry = null;
|
|
|
|
|
editSketch.RefreshSketch();
|
|
|
|
|
this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, this.m_hookHelper.ActiveView.Extent);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//VerificationOfFeatureNodeDensity density = new VerificationOfFeatureNodeDensity();
|
|
|
|
|
//geometry = density.Verification(geometry);
|
|
|
|
|
editSketch.FinishSketch();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
MessageHelper.ShowError("新增要素异常:" + ex.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnKeyDown(int keyCode, int shift)
|
|
|
|
|
{
|
|
|
|
|
if (keyCode == (int)ConsoleKey.F9 || keyCode == (int)ConsoleKey.Escape)
|
|
|
|
|
{
|
|
|
|
|
#region 撤销点
|
|
|
|
|
ESRI.ArcGIS.Geometry.IPointCollection points = (edit as IEngineEditSketch).Geometry as ESRI.ArcGIS.Geometry.IPointCollection;
|
|
|
|
|
if (points.PointCount == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if ((edit as IEngineEditSketch).Geometry.GeometryType == esriGeometryType.esriGeometryPolygon)
|
|
|
|
|
{
|
|
|
|
|
if (points.PointCount - 2 > 0)
|
|
|
|
|
{
|
|
|
|
|
points.RemovePoints(points.PointCount - 2, 1);
|
|
|
|
|
}
|
|
|
|
|
else if (points.PointCount - 2 == 0)
|
|
|
|
|
{
|
|
|
|
|
points.RemovePoints(points.PointCount - 2, 2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
points.RemovePoints(points.PointCount - 1, 1);
|
|
|
|
|
}
|
|
|
|
|
(edit as IEngineEditSketch).Geometry = points as IGeometry;
|
|
|
|
|
(edit as IEngineEditSketch).RefreshSketch();
|
|
|
|
|
//this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, this.m_hookHelper.ActiveView.Extent);
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
//修改者:周旺华 修改时间:20180911 增加删除功能
|
|
|
|
|
else if (keyCode == (int)ConsoleKey.Backspace)
|
|
|
|
|
{
|
|
|
|
|
#region 清除绘制的图形
|
|
|
|
|
ESRI.ArcGIS.Geometry.IPointCollection points = (edit as IEngineEditSketch).Geometry as ESRI.ArcGIS.Geometry.IPointCollection;
|
|
|
|
|
if (points.PointCount == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
points.RemovePoints(0, points.PointCount);
|
|
|
|
|
(edit as IEngineEditSketch).Geometry = points as IGeometry;
|
|
|
|
|
(edit as IEngineEditSketch).RefreshSketch();
|
|
|
|
|
this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, this.m_hookHelper.ActiveView.Extent);
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
controlsEditingSketchToolClass.OnKeyDown(keyCode, shift);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnKeyUp(int keyCode, int shift)
|
|
|
|
|
{
|
|
|
|
|
controlsEditingSketchToolClass.OnKeyUp(keyCode, shift);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnMouseDown(int button, int shift, int x, int y)
|
|
|
|
|
{
|
|
|
|
|
base.OnMouseDown(button, shift, x, y);
|
|
|
|
|
//显示右键菜单 郑英杰 2018-09-10
|
|
|
|
|
if (button == 2)
|
|
|
|
|
{
|
|
|
|
|
IEngineEditSketch editSketch = edit as IEngineEditSketch;
|
|
|
|
|
pControlsEditingSketchDeleteCommandChinese.Geometry = editSketch.Geometry;
|
|
|
|
|
((IEngineEditSketch)edit).SetEditLocation(x, y);
|
|
|
|
|
m_toolbarMenuVertex.PopupMenu(x, y, m_hookHelper.ActiveView.ScreenDisplay.hWnd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool OnContextMenu(int x, int y)
|
|
|
|
|
{
|
|
|
|
|
return base.OnContextMenu(x, y);
|
|
|
|
|
}
|
|
|
|
|
public override bool Enabled
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (edit == null)
|
|
|
|
|
{
|
|
|
|
|
edit = new EngineEditorClass();
|
|
|
|
|
}
|
|
|
|
|
if (edit.EditState == esriEngineEditState.esriEngineStateEditing)
|
|
|
|
|
{
|
|
|
|
|
ILayer layer = (edit as EngineEditorClass).TargetLayer;
|
|
|
|
|
if (layer != null && (layer as IFeatureLayer) != null)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建右键菜单
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public IToolbarMenu CreateVertexContextMenu()
|
|
|
|
|
{
|
|
|
|
|
IToolbarMenu pToolbarMenuVertex = new ToolbarMenuClass();
|
|
|
|
|
|
|
|
|
|
pControlsEditingSketchDeleteCommandChinese = new ControlsEditingSketchDeleteCommandChinese();
|
|
|
|
|
pToolbarMenuVertex.AddItem(pControlsEditingSketchDeleteCommandChinese, -1, 0, false, esriCommandStyles.esriCommandStyleTextOnly);
|
|
|
|
|
pToolbarMenuVertex.AddItem(new ControlsEditingSketchFinishCommandChinese(), -1, 1, false, esriCommandStyles.esriCommandStyleTextOnly);
|
|
|
|
|
return pToolbarMenuVertex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|