You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
9.8 KiB
233 lines
9.8 KiB
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; |
|
} |
|
} |
|
}
|
|
|