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.
569 lines
24 KiB
569 lines
24 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Text; |
|
using ESRI.ArcGIS.ADF.BaseClasses; |
|
using ESRI.ArcGIS.Controls; |
|
using ESRI.ArcGIS.Carto; |
|
using ESRI.ArcGIS.Geometry; |
|
using ESRI.ArcGIS.Geodatabase; |
|
using System.Windows.Forms; |
|
using ESRI.ArcGIS.Display; |
|
using ESRI.ArcGIS.SystemUI; |
|
using System.Runtime.InteropServices; |
|
using Kingo.Plugin.EngineEditor.Commands.Tools; |
|
using Kingo.Plugin.EngineEditor.Common; |
|
using KGIS.Framework.Utils; |
|
using KGIS.Framework.Utils.Helper; |
|
using KGIS.Framework.Utils.Enum; |
|
using KGIS.Framework.EngineEditor; |
|
using ESRI.ArcGIS.ADF; |
|
using KGIS.Framework.Maps; |
|
using Kingo.PluginServiceInterface; |
|
using KGIS.Framework.Platform; |
|
using UIShell.OSGi; |
|
|
|
namespace Kingo.Plugin.EngineEditor.Commands.Tools |
|
{ |
|
/// <summary> |
|
/// 整形要素工具 |
|
/// </summary> |
|
public class ControlsEditingReshapeTool : BaseToolCmd |
|
{ |
|
public VerificationOfFeatureNodeDensity density |
|
{ |
|
get; |
|
set; |
|
} |
|
public override void OnCreate(object hook) |
|
{ |
|
base.OnCreate(hook); |
|
} |
|
|
|
private void ActiveViewEvents_Event_ItemDeleted(object Item) |
|
{ |
|
if (EditorSettingClass.Instance.IsTraceing) |
|
{ |
|
this.EndTraceFeedback(); |
|
} |
|
} |
|
|
|
private void ActiveViewEvents_Event_ItemAdded(object Item) |
|
{ |
|
if (EditorSettingClass.Instance.IsTraceing) |
|
{ |
|
this.EndTraceFeedback(); |
|
} |
|
} |
|
|
|
private void ActiveViewEvents_Event_ContentsChanged() |
|
{ |
|
|
|
} |
|
|
|
private void M_pAxMapControl_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e) |
|
{ |
|
if (EditorSettingClass.Instance.IsTraceing && this.m_pTraceFeedback != null) |
|
{ |
|
try |
|
{ |
|
this.FillFeatureCache(this.m_pPointCatched); |
|
} |
|
catch { } |
|
this.GetBeTracedPolyline(); |
|
//this.m_pTraceFeedback.SetSplitPolyline(m_pListBeTracePolyline); |
|
this.m_pTraceFeedback.ListBeTracePolyline = this.m_pListBeTracePolyline; |
|
} |
|
} |
|
public override bool Deactivate() |
|
{ |
|
base.Deactivate(); |
|
MapsManager.Instance.MapService.getAxMapControl().OnExtentUpdated -= M_pAxMapControl_OnExtentUpdated; |
|
IActiveViewEvents_Event activeViewEvents_Event = base.m_pMapControl.ActiveView as IActiveViewEvents_Event; |
|
activeViewEvents_Event.ContentsChanged -= ActiveViewEvents_Event_ContentsChanged; |
|
activeViewEvents_Event.ItemAdded -= ActiveViewEvents_Event_ItemAdded; |
|
activeViewEvents_Event.ItemDeleted -= ActiveViewEvents_Event_ItemDeleted; |
|
this.m_deactivate = true; |
|
return this.m_deactivate; |
|
} |
|
public override void OnClick() |
|
{ |
|
base.OnClick(); |
|
base.m_pDisplayFeedbackMethod = DisplayFeedbackMethod.Line; |
|
MapsManager.Instance.MapService.getAxMapControl().OnExtentUpdated += M_pAxMapControl_OnExtentUpdated; |
|
IActiveViewEvents_Event activeViewEvents_Event = base.m_pMapControl.ActiveView as IActiveViewEvents_Event; |
|
activeViewEvents_Event.ContentsChanged += ActiveViewEvents_Event_ContentsChanged; |
|
activeViewEvents_Event.ItemAdded += ActiveViewEvents_Event_ItemAdded; |
|
activeViewEvents_Event.ItemDeleted += ActiveViewEvents_Event_ItemDeleted; |
|
} |
|
public override bool Enabled |
|
{ |
|
get |
|
{ |
|
try |
|
{ |
|
if (m_pEditor.EditState != esriEngineEditState.esriEngineStateEditing) |
|
{ |
|
return false; |
|
} |
|
IFeatureLayer featureLayer = (m_pEditor as IEngineEditLayers).TargetLayer; |
|
if (featureLayer == null || featureLayer.FeatureClass == null) |
|
{ |
|
return false; |
|
} |
|
if ((featureLayer as IFeatureSelection).SelectionSet.Count <= 0) |
|
{ |
|
return false; |
|
} |
|
return true; |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("整形要素Enabled异常:" + ex.Message); |
|
return false; |
|
} |
|
} |
|
} |
|
public override void OnMouseDown(int Button, int Shift, int X, int Y) |
|
{ |
|
if (Button == 1) |
|
{ |
|
DisplayFeedbackMethod pDisplayFeedbackMethod = this.m_pDisplayFeedbackMethod; |
|
if (this.m_pGeometry == null) |
|
{ |
|
switch (pDisplayFeedbackMethod) |
|
{ |
|
case DisplayFeedbackMethod.Line: |
|
this.NewPolyline(); |
|
break; |
|
case DisplayFeedbackMethod.Polygon: |
|
this.NewPolygon(); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
if (pDisplayFeedbackMethod != DisplayFeedbackMethod.Arc) |
|
{ |
|
if (EditorSettingClass.Instance.IsTraceing && (this.m_pDisplayFeedbackMethod == DisplayFeedbackMethod.Polygon || this.m_pDisplayFeedbackMethod == DisplayFeedbackMethod.Line)) |
|
{ |
|
IPoint p = this.m_pMapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); |
|
ISnappingResult snappingResult = null; |
|
if (this.m_pSnappingEnv != null && this.m_pSnappingEnv.Enabled) |
|
{ |
|
snappingResult = this.m_pPntSnapper.Snap(p); |
|
|
|
} |
|
if (snappingResult == null && m_pTraceFeedback == null) |
|
{ |
|
m_pTraceFeedback = null; |
|
switch (pDisplayFeedbackMethod) |
|
{ |
|
case DisplayFeedbackMethod.Polygon: |
|
this.AddToFeedback(this.m_pPointCatched); |
|
this.AddPointToPolygon(this.m_pPointCatched); |
|
break; |
|
case DisplayFeedbackMethod.Line: |
|
//this.StartFeedback(this.m_pPointCatched); |
|
this.AddToFeedback(this.m_pPointCatched); |
|
this.AddPointToPolyline(this.m_pPointCatched); |
|
break; |
|
} |
|
} |
|
else if (snappingResult == null && m_pTraceFeedback != null) |
|
{ |
|
IPolyline polyline = this.AddToTraceFeedBack(this.m_pPointCatched); |
|
if (polyline != null && !polyline.IsEmpty) |
|
{ |
|
if (pDisplayFeedbackMethod == DisplayFeedbackMethod.Polygon) |
|
{ |
|
this.AddPolylineToPolygon(polyline); |
|
this.AddToFeedback(polyline); |
|
} |
|
else if (pDisplayFeedbackMethod == DisplayFeedbackMethod.Line) |
|
{ |
|
this.AddPolylineToPolyline(polyline); |
|
this.AddToFeedback(polyline); |
|
//this.StartFeedback(polyline.ToPoint); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
base.ListSelectableLayer = MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>(); |
|
//GetAllFeatureLayer(); |
|
//if (this.m_pListFeatureCache == null) |
|
//{ |
|
try |
|
{ |
|
this.FillFeatureCache(this.m_pPointCatched); |
|
} |
|
catch (Exception) { } |
|
this.GetBeTracedPolyline(); |
|
//} |
|
IPolyline polyline = this.AddToTraceFeedBack(this.m_pPointCatched); |
|
if (polyline != null && !polyline.IsEmpty) |
|
{ |
|
if (pDisplayFeedbackMethod == DisplayFeedbackMethod.Polygon) |
|
{ |
|
this.AddPolylineToPolygon(polyline); |
|
this.AddToFeedback(polyline); |
|
} |
|
else if (pDisplayFeedbackMethod == DisplayFeedbackMethod.Line) |
|
{ |
|
this.AddPolylineToPolyline(polyline); |
|
this.AddToFeedback(polyline); |
|
//this.StartFeedback(polyline.ToPoint); |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
m_pTraceFeedback = null; |
|
switch (pDisplayFeedbackMethod) |
|
{ |
|
case DisplayFeedbackMethod.Polygon: |
|
this.AddToFeedback(this.m_pPointCatched); |
|
this.AddPointToPolygon(this.m_pPointCatched); |
|
break; |
|
case DisplayFeedbackMethod.Line: |
|
//this.StartFeedback(this.m_pPointCatched); |
|
this.AddToFeedback(this.m_pPointCatched); |
|
this.AddPointToPolyline(this.m_pPointCatched); |
|
break; |
|
} |
|
} |
|
} |
|
else if (this.m_nArcPointCount == 0) |
|
{ |
|
IPointCollection pointCollection = this.m_pGeometry as IPointCollection; |
|
int pointCount = pointCollection.PointCount; |
|
if (pointCount >= 1) |
|
{ |
|
IPoint pPoint = pointCollection.get_Point(pointCount - 1); |
|
this.AddToArcFeedback(pPoint); |
|
this.AddToArcFeedback(this.m_pPointCatched); |
|
} |
|
else |
|
{ |
|
this.AddToArcFeedback(this.m_pPointCatched); |
|
} |
|
} |
|
else if (this.m_nArcPointCount != 1) |
|
{ |
|
if (this.m_nArcPointCount == 2) |
|
{ |
|
ICircularArc circularArc = this.AddToArcFeedback(this.m_pPointCatched); |
|
if (circularArc != null) |
|
{ |
|
this.AddSegmentToPolygon(circularArc as ISegment); |
|
this.AddToFeedback((circularArc as ISegment).ToPoint); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
this.AddToArcFeedback(this.m_pPointCatched); |
|
} |
|
if (this.m_pPointCatched != null) |
|
{ |
|
this.SketchGeometry.Update(); |
|
} |
|
this.RefreshForeground(null); |
|
} |
|
} |
|
public override void OnMouseMove(int Button, int Shift, int X, int Y) |
|
{ |
|
if (Button == 4) |
|
{ |
|
return; |
|
} |
|
this.m_pPointCatched = this.m_pMapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); |
|
if (this.m_pSnappingEnv != null && this.m_pSnappingEnv.Enabled) |
|
{ |
|
ISnappingResult snappingResult = this.m_pPntSnapper.Snap(this.m_pPointCatched); |
|
this.m_pSnappingFeedback.Update(snappingResult, 0); |
|
if (snappingResult != null) |
|
{ |
|
this.m_pPointCatched = snappingResult.Location; |
|
} |
|
} |
|
string strDescription = ""; |
|
IPoint point = null; |
|
if (this.m_pSnappingEnv != null && this.m_pSnappingEnv.Enabled && SnappingSketchFeedback.Enabled) |
|
{ |
|
this.RefreshForeground(null); |
|
point = base.SnappingSketch(this.m_pPointCatched, ref strDescription); |
|
if (point != null) |
|
{ |
|
this.m_pPointCatched = point; |
|
} |
|
} |
|
try |
|
{ |
|
DisplayFeedbackMethod pDisplayFeedbackMethod = this.m_pDisplayFeedbackMethod; |
|
if (pDisplayFeedbackMethod == DisplayFeedbackMethod.Arc) |
|
{ |
|
if (this.m_pNewArcFeedback == null && this.m_pDisplayFeedback != null) |
|
{ |
|
this.m_pDisplayFeedback.MoveTo(this.m_pPointCatched); |
|
} |
|
if (this.m_pNewArcFeedback != null) |
|
{ |
|
if (this.m_nArcPointCount == 2) |
|
{ |
|
(this.m_pNewArcFeedback as IDisplayFeedback).MoveTo(this.m_pPointCatched); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
if (EditorSettingClass.Instance.IsTraceing && (this.m_pDisplayFeedbackMethod == DisplayFeedbackMethod.Polygon || this.m_pDisplayFeedbackMethod == DisplayFeedbackMethod.Line)) |
|
{ |
|
if (this.m_pTraceFeedback == null && this.m_pDisplayFeedback != null) |
|
{ |
|
this.m_pDisplayFeedback.MoveTo(this.m_pPointCatched); |
|
} |
|
if (this.m_pTraceFeedback != null) |
|
{ |
|
this.m_pTraceFeedback.MoveTo(this.m_pPointCatched); |
|
this.RefreshForeground(null); |
|
} |
|
} |
|
else |
|
{ |
|
switch (pDisplayFeedbackMethod) |
|
{ |
|
case DisplayFeedbackMethod.Polygon: |
|
if (this.m_pDisplayFeedback != null) |
|
{ |
|
this.m_pDisplayFeedback.MoveTo(this.m_pPointCatched); |
|
} |
|
break; |
|
case DisplayFeedbackMethod.Line: |
|
if (this.m_pDisplayFeedback != null) |
|
{ |
|
this.m_pDisplayFeedback.MoveTo(this.m_pPointCatched); |
|
} |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
//FormReportException.Report(ex); |
|
} |
|
if (point != null) |
|
{ |
|
this.m_pSnappingSketchFeedback.Update(point, strDescription); |
|
} |
|
} |
|
public override void Refresh(int hDC) |
|
{ |
|
if (this.m_pSnappingFeedback != null) |
|
{ |
|
this.m_pSnappingFeedback.Refresh(hDC); |
|
} |
|
if (this.m_pDisplayFeedback != null) |
|
{ |
|
this.m_pDisplayFeedback.Refresh(hDC); |
|
} |
|
if (EditorSettingClass.Instance.IsTraceing && this.m_pTraceFeedback != null) |
|
{ |
|
this.m_pTraceFeedback.Refresh(hDC); |
|
} |
|
} |
|
public override void ReStartFeedback() |
|
{ |
|
IPointCollection pointCollection = null; |
|
int num = 0; |
|
if (this.m_pGeometry != null || !this.m_pGeometry.IsEmpty) |
|
{ |
|
IGeometryCollection geometryCollection = this.m_pGeometry as IGeometryCollection; |
|
int geometryCount = geometryCollection.GeometryCount; |
|
if (geometryCount > 0) |
|
{ |
|
this.m_pRing = (geometryCollection.get_Geometry(geometryCollection.GeometryCount - 1) as IRing); |
|
pointCollection = (this.m_pRing as IPointCollection); |
|
num = pointCollection.PointCount; |
|
} |
|
else |
|
{ |
|
this.m_pRing = null; |
|
} |
|
} |
|
this.EndFeedback(); |
|
this.EndArcFeedback(); |
|
this.EndTraceFeedback(); |
|
if (pointCollection != null) |
|
{ |
|
for (int i = 0; i < num; i++) |
|
{ |
|
this.AddToFeedback(pointCollection.get_Point(i)); |
|
} |
|
} |
|
this.RefreshForeground(null); |
|
} |
|
public override void OnMouseUp(int Button, int Shift, int X, int Y) |
|
{ |
|
base.OnMouseUp(Button, Shift, X, Y); |
|
} |
|
public override void OnKeyDown(int keyCode, int Shift) |
|
{ |
|
base.OnKeyDown(keyCode, Shift); |
|
} |
|
public override void OnKeyUp(int keyCode, int Shift) |
|
{ |
|
base.OnKeyUp(keyCode, Shift); |
|
} |
|
public override void OnDblClick() |
|
{ |
|
try |
|
{ |
|
int selectIdZYQ = 1; |
|
IUcZYQMagrHelper ucZYQMagrHelper = null; |
|
ProjectInfo ProInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo; |
|
if (ProInfo != null && ProInfo.ProjType == EnumProjType.BHTBTQ && Platform.Instance.SystemType == SystemTypeEnum.BGFWCG) |
|
{ |
|
ucZYQMagrHelper = BundleRuntime.Instance.GetFirstOrDefaultService<IUcZYQMagrHelper>(); |
|
if (ucZYQMagrHelper != null) |
|
{ |
|
selectIdZYQ = ucZYQMagrHelper.GetCheckedID(); |
|
} |
|
} |
|
FinishSketch(); |
|
if (ucZYQMagrHelper != null) |
|
{ |
|
ucZYQMagrHelper.AddMask(selectIdZYQ); |
|
} |
|
|
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug(ex.Message); |
|
MessageHelper.ShowError(ex.Message); |
|
} |
|
} |
|
public void FinishSketch() |
|
{ |
|
this.EndFeedback(); |
|
this.EndArcFeedback(); |
|
this.EndTraceFeedback(); |
|
if (m_pGeometry is IPolygon) |
|
{ |
|
if (!(m_pGeometry as IPolygon).IsClosed) |
|
{ |
|
(m_pGeometry as IPolygon).Close(); |
|
} |
|
(this.m_pGeometry as IPolygon).SimplifyPreserveFromTo(); |
|
|
|
if (!this.m_pGeometry.IsEmpty) |
|
{ |
|
DrawAndReshape(); |
|
} |
|
} |
|
else if (m_pGeometry is IPolyline) |
|
{ |
|
IPolyline polyline = this.m_pGeometry as IPolyline; |
|
polyline.SimplifyNetwork(); |
|
if (!this.m_pGeometry.IsEmpty) |
|
{ |
|
DrawAndReshape(); |
|
} |
|
} |
|
if (EditorSettingClass.Instance.OnDrawEnd != null) |
|
{ |
|
EditorSettingClass.Instance.OnDrawEnd(this, this.m_pGeometry); |
|
} |
|
ComReleaser.ReleaseCOMObject(this.m_pGeometry); |
|
if (m_pPath != null) |
|
ComReleaser.ReleaseCOMObject(this.m_pPath); |
|
if (m_pRing != null) |
|
ComReleaser.ReleaseCOMObject(this.m_pRing); |
|
this.m_pGeometry = null; |
|
ComReleaser.ReleaseCOMObject(this.m_pRing); |
|
this.m_pRing = null; |
|
ComReleaser.ReleaseCOMObject(this.m_pPath); |
|
this.m_pPath = null; |
|
if (this.SketchGeometry != null) |
|
{ |
|
this.SketchGeometry.Deactivate(); |
|
this.SketchGeometry = null; |
|
} |
|
this.RefreshForeground(null); |
|
} |
|
|
|
private void DrawAndReshape() |
|
{ |
|
try |
|
{ |
|
if (density == null) |
|
{ |
|
density = new VerificationOfFeatureNodeDensity(this.m_pHookHelper); |
|
} |
|
IPointCollection reshapePath = new PathClass(); |
|
reshapePath.AddPointCollection(m_pGeometry as IPointCollection); |
|
//reshape the selected feature |
|
m_pEditor.StartOperation(); |
|
IFeatureLayer featureLayer = (m_pEditor as IEngineEditLayers).TargetLayer as IFeatureLayer; |
|
IEnumIDs enumIDs = (featureLayer as IFeatureSelection).SelectionSet.IDs; |
|
enumIDs.Reset(); |
|
int oid = -1; |
|
while ((oid = enumIDs.Next()) > -1) |
|
{ |
|
IFeature item = featureLayer.FeatureClass.GetFeature(oid); |
|
if (item.ShapeCopy is IPolyline) |
|
{ |
|
IPolyline polyline = item.ShapeCopy as IPolyline; |
|
polyline.Reshape(reshapePath as IPath); |
|
//修改人:李忠盼 修改时间:20181102 图形为空不赋值 |
|
if (polyline == null || polyline.IsEmpty) |
|
{ |
|
return; |
|
} |
|
item.Shape = polyline; |
|
item.Store(); |
|
} |
|
else if (item.ShapeCopy is IPolygon) |
|
{ |
|
IGeometryCollection geometryCollection = item.ShapeCopy as IGeometryCollection; |
|
IRing ring = null; |
|
for (int i = 0; i < geometryCollection.GeometryCount; i++) |
|
{ |
|
ring = geometryCollection.get_Geometry(i) as IRing; |
|
try |
|
{ |
|
ring.Reshape(reshapePath as IPath); |
|
} |
|
catch (Exception exce) |
|
{ |
|
LogAPI.Debug("ring.Reshape(reshapePath as IPath) :" + exce.Message); |
|
LogAPI.Debug("ring.Reshape(reshapePath as IPath) :" + exce.StackTrace); |
|
} |
|
} |
|
IGeometry pGeometry = geometryCollection as IGeometry; |
|
//修改人:李忠盼 修改时间:20181102 图形为空不赋值 |
|
if (pGeometry == null || pGeometry.IsEmpty) |
|
{ |
|
return; |
|
} |
|
pGeometry = density.Verification(pGeometry); |
|
item.Shape = pGeometry; |
|
item.Store(); |
|
} |
|
} |
|
m_pEditor.StopOperation("修整要素"); |
|
} |
|
catch (Exception ex) |
|
{ |
|
m_pEditor.AbortOperation(); |
|
LogAPI.Debug("修整要素失败:" + ex.Message); |
|
MessageHelper.ShowError("修整要素失败:" + ex.Message); |
|
} |
|
RefreshForeground(); |
|
m_pHookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground | esriViewDrawPhase.esriViewGeoSelection, null, m_pHookHelper.ActiveView.Extent); |
|
} |
|
} |
|
}
|
|
|