年度变更建库软件5.0版本
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.

705 lines
26 KiB

6 months ago
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using KGIS.PlatformPlugin.Commands.Tools.TraceTool.Enum;
using System;
using System.Collections.Generic;
using System.Reflection;
using ICommand = ESRI.ArcGIS.SystemUI.ICommand;
namespace KGIS.PlatformPlugin.Commands.Tools.TraceTool
{
public class NewPolygonTraceTool : ICommand, ITool
{
protected IGeometry m_pGeometry;
private IRing m_pRing;
private List<IFeatureCache2> m_pListFeatureCache;
private List<IPolyline> m_pListBeTracePolyline;
List<IFeatureLayer> lstTraceLayer { get; set; }
private IDisplayFeedback m_pDisplayFeedback { get; set; }
private ITraceFeedback m_pTraceFeedback;
private IFeatureLayer featureLayer { get; set; }
private IEngineEditor m_engineEditor;
private bool m_checked;
private IHookHelper m_hookHelper;
private IGeometryCollection geometryCollection { get; set; }
protected ISnappingFeedback m_pSnappingFeedback;
protected ISnappingEnvironment m_pSnappingEnv;
protected IPointSnapper m_pPntSnapper;
private IPoint m_pPointCatched = null;
public void OnCreate(object hook)
{
try
{
if (m_hookHelper == null)
{
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
//System.IO.Stream delVerStream = GetType().Assembly.GetManifestResourceStream("KGIS.PlatformPlugin.Cur.InsertVertexCursor.cur");
//if (delVerStream != null)
//{
// m_Cursor = new System.Windows.Forms.Cursor(delVerStream);
//}
if (m_engineEditor == null)
{
m_engineEditor = new EngineEditorClass();
}
IHookHelper2 hookHelper2 = m_hookHelper as IHookHelper2;
if (hookHelper2 != null)
{
IExtensionManager extensionManager = hookHelper2.ExtensionManager;
if (extensionManager != null)
{
IExtension extension = extensionManager.FindExtension(new UIDClass
{
Value = "{E07B4C52-C894-4558-B8D4-D4050018D1DA}"
});
if (extension != null)
{
this.m_pSnappingEnv = (extension as ISnappingEnvironment);
this.m_pPntSnapper = this.m_pSnappingEnv.PointSnapper;
this.m_pSnappingFeedback = new SnappingFeedbackClass();
this.m_pSnappingFeedback.Initialize(hook, this.m_pSnappingEnv, true);
}
}
}
IActiveViewEvents_Event activeViewEvents_Event = this.m_hookHelper.ActiveView as IActiveViewEvents_Event;
//activeViewEvents_Event.ContentsChanged += new IActiveViewEvents_ContentsChangedEventHandler(this, (UIntPtr)ldftn(pActiveViewEvents_Event_ContentsChanged));
activeViewEvents_Event.ItemAdded += new IActiveViewEvents_ItemAddedEventHandler(pActiveViewEvents_Event_ItemAdded);
activeViewEvents_Event.ItemDeleted += new IActiveViewEvents_ItemDeletedEventHandler(pActiveViewEvents_Event_ItemDeleted);
}
catch (Exception ex)
{
LogAPI.Debug("NewPolygonTool OnCreate异常:" + ex.Message);
}
}
private void pActiveViewEvents_Event_ItemDeleted(object Item)
{
//if (this.m_pDisplayFeedbackMethod == DisplayFeedbackMethod.Trace)
//{
this.EndTraceFeedback();
//}
}
private void pActiveViewEvents_Event_ItemAdded(object Item)
{
//if (this.m_pDisplayFeedbackMethod == DisplayFeedbackMethod.Trace)
//{
this.EndTraceFeedback();
//}
}
private void pActiveViewEvents_Event_ContentsChanged()
{
}
private void axMapControl_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
{
//this.m_pDisplayFeedbackMethod == DisplayFeedbackMethod.Trace &&
if (this.m_pTraceFeedback != null)
{
this.FillFeatureCache(this.m_pPointCatched);
this.GetBeTracedPolyline();
this.m_pTraceFeedback.ListBeTracePolyline = this.m_pListBeTracePolyline;
}
}
public void OnClick()
{
try
{
//featureLayer = (m_engineEditor as IEngineEditLayers).TargetLayer;
//if (featureLayer == null || featureLayer.FeatureClass == null)
//{
// m_checked = false;
// return;
//}
//IsUseing = true;
m_checked = true;
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
MessageHelper.ShowError(ex.Message);
}
}
public bool Enabled { get { return m_engineEditor.EditState == esriEngineEditState.esriEngineStateEditing; } }
public bool Checked
{
get
{
return m_checked;
}
}
public string Name
{
get
{
return "追踪绘面";
}
}
public string Caption
{
get
{
return "";
}
}
public string Tooltip
{
get
{
return "追踪绘面";
}
}
public string Message
{
get
{
return "";
}
}
public string HelpFile
{
get
{
return "";
}
}
public int HelpContextID
{
get
{
return 0;
}
}
public int Bitmap
{
get
{
return 0;
}
}
public string Category
{
get
{
return "";
}
}
public void OnMouseDown(int button, int shift, int x, int y)
{
try
{
if (button != 1)
{
return;
}
if (this.m_pGeometry == null)
{
this.NewPolygon();
}
if (this.m_pListFeatureCache == null)
{
this.FillFeatureCache(this.m_pPointCatched);
this.GetBeTracedPolyline();
}
IPolyline polyline = this.AddToTraceFeedBack(this.m_pPointCatched);
if (polyline != null)
{
this.AddPolylineToPolygon(polyline);
this.AddToFeedback(polyline);
}
//AddToFeedback(m_pPointCatched);
//AddPointToPolygon(m_pPointCatched);
this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, this.m_hookHelper.ActiveView.Extent);
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
MessageHelper.ShowError(ex.Message);
}
}
private void NewPolygon()
{
this.m_pGeometry = new PolygonClass();
this.m_pGeometry.SpatialReference = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.SpatialReference;
//this.m_pEditor.SketchGeometry = new SketchGeometry(this.m_pGeometry, null, true);
IEngineEditSketch editSketch = m_engineEditor as IEngineEditSketch;
editSketch.Geometry = m_pGeometry;
//editSketch.FinishSketch();
}
private void EndPolygon()
{
if (this.m_pRing != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(this.m_pRing);
this.m_pRing = null;
}
}
private void AddToFeedback(IPoint pPoint)
{
if (this.m_pDisplayFeedback == null)
{
m_pDisplayFeedback = new NewPolygonFeedbackClass();
m_pDisplayFeedback.Display = this.m_hookHelper.ActiveView.ScreenDisplay;
(this.m_pDisplayFeedback as INewPolygonFeedback).Start(pPoint);
return;
}
if (this.m_pDisplayFeedback is INewPolygonFeedback)
{
(this.m_pDisplayFeedback as INewPolygonFeedback).AddPoint(pPoint);
}
}
public void FinishSketch()
{
this.EndFeedback();
//this.EndArcFeedback();
this.EndTraceFeedback();
this.EndPolygon();
if (this.m_pGeometry != null && (this.m_pGeometry as IPointCollection).PointCount > 2)
{
(this.m_pGeometry as IPolygon).SimplifyPreserveFromTo();
//if (this.OnDrawEnd != null)
//{
// this.OnDrawEnd(this, this.m_pGeometry);
//}
IEngineEditSketch editSketch = m_engineEditor as IEngineEditSketch;
editSketch.Geometry = m_pGeometry;
editSketch.FinishSketch();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(this.m_pGeometry);
this.m_pGeometry = null;
//if (this.m_pEditor.SketchGeometry != null)
//{
// this.m_pEditor.SketchGeometry.Deactivate();
// this.m_pEditor.SketchGeometry = null;
//}
//this.m_pEditor.RefreshForeground(null);
this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, this.m_hookHelper.ActiveView.Extent);
}
private void AddPointToPolygon(IPoint pPoint)
{
if (this.m_pRing != null)
{
IPointCollection arg_24_0 = this.m_pRing as IPointCollection;
object value = Missing.Value;
object value2 = Missing.Value;
arg_24_0.AddPoint(pPoint, ref value, ref value2);
return;
}
this.NewPolygonPart();
IPointCollection arg_4C_0 = this.m_pRing as IPointCollection;
object value3 = Missing.Value;
object value4 = Missing.Value;
arg_4C_0.AddPoint(pPoint, ref value3, ref value4);
}
private void NewPolygonPart()
{
if (this.m_pRing == null)
{
this.m_pRing = new RingClass();
IGeometryCollection geometryCollection = this.m_pGeometry as IGeometryCollection;
IGeometryCollection arg_36_0 = geometryCollection;
IGeometry arg_36_1 = this.m_pRing;
object value = Missing.Value;
object value2 = Missing.Value;
arg_36_0.AddGeometry(arg_36_1, ref value, ref value2);
}
}
private void EndFeedback()
{
if (this.m_pDisplayFeedback != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(this.m_pDisplayFeedback);
this.m_pDisplayFeedback = null;
}
}
//private void AddPointToPolygon(IPoint pPoint)
//{
// if (this.m_pRing != null)
// {
// IPointCollection arg_24_0 = this.m_pRing as IPointCollection;
// object value = Missing.Value;
// object value2 = Missing.Value;
// arg_24_0.AddPoint(pPoint, ref value, ref value2);
// return;
// }
// this.NewPolygonPart();
// IPointCollection arg_4C_0 = this.m_pRing as IPointCollection;
// object value3 = Missing.Value;
// object value4 = Missing.Value;
// arg_4C_0.AddPoint(pPoint, ref value3, ref value4);
//}
public void OnMouseMove(int button, int shift, int x, int y)
{
try
{
m_pPointCatched = this.m_hookHelper.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;
}
}
//if (m_pDisplayFeedback != null)
//{
// m_pDisplayFeedback.MoveTo(m_pPointCatched);
//}
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);
RefreshForeground(this.m_hookHelper.ActiveView.Extent);
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
MessageHelper.ShowError(ex.Message);
}
}
public void RefreshForeground(IEnvelope pEnvelope = null)
{
this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, null, pEnvelope);
KGIS.Framework.Platform.Platform.Instance.GetMapsManager().GetMapService().getAxMapControl().Update();
}
public void OnMouseUp(int button, int shift, int x, int y)
{
}
public void OnDblClick()
{
try
{
FinishSketch();
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
MessageHelper.ShowError(ex.Message);
}
}
public void OnKeyDown(int keyCode, int shift)
{
if (keyCode == (int)ConsoleKey.F9 || keyCode == (int)ConsoleKey.Escape)
{
}
}
public void OnKeyUp(int keyCode, int shift)
{
}
public bool OnContextMenu(int x, int y)
{
return true;
}
public void Refresh(int hdc)
{
if (this.m_pDisplayFeedback != null)
{
this.m_pDisplayFeedback.Refresh(hdc);
}
}
public bool Deactivate()
{
try
{
m_checked = false;
if (m_pDisplayFeedback != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_pDisplayFeedback);
m_pDisplayFeedback = null;
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
return true;
}
public int Cursor
{
get
{
return System.Windows.Forms.Cursors.Cross.Handle.ToInt32();
}
}
private void FillFeatureCache(IPoint pPoint)
{
try
{
List<IFeatureLayer> listAllLayer = KGIS.Framework.Platform.Platform.Instance.GetMapsManager().GetMapService().GetAllLayerInMap<IFeatureLayer>();
lstTraceLayer = new List<IFeatureLayer>();
foreach (IFeatureLayer item in listAllLayer)
{
if (item == null || !item.Visible || !item.Selectable || item.FeatureClass == null)
{
continue;
}
if (item.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon || item.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
{
lstTraceLayer.Add(item);
}
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
IEnvelope arg_41_0 = this.m_hookHelper.ActiveView.Extent;
int width = KGIS.Framework.Platform.Platform.Instance.GetMapsManager().GetMapService().getAxMapControl().Size.Width;
double size = ConvertPixelsToMapUnits((double)width);
if (this.m_pListFeatureCache != null)
{
this.ReleaseFeatureCache();
}
this.m_pListFeatureCache = new List<IFeatureCache2>();
foreach (IFeatureLayer current in lstTraceLayer)
{
IFeatureCache2 featureCache = new FeatureCacheClass();
featureCache.Initialize(pPoint, size);
featureCache.AddFeatures(current.FeatureClass, null);
this.m_pListFeatureCache.Add(featureCache);
}
}
private void ReleaseFeatureCache()
{
if (this.m_pListFeatureCache != null)
{
using (List<IFeatureCache2>.Enumerator enumerator = this.m_pListFeatureCache.GetEnumerator())
{
if (enumerator.MoveNext())
{
IFeatureCache2 current = enumerator.Current;
ComReleaser.ReleaseCOMObject(current);
}
}
this.m_pListFeatureCache.Clear();
this.m_pListFeatureCache = null;
}
}
public double ConvertPixelsToMapUnits(double dPixelUnits = 0.0)
{
if (dPixelUnits == 0.0)
{
dPixelUnits = 10.0;
}
int num = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().right - this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().left;
double width = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
double num2 = width / (double)num;
return dPixelUnits * num2;
}
private void GetBeTracedPolyline()
{
if (this.m_pListBeTracePolyline != null)
{
this.ReleaseBeTracedPolyline();
}
this.m_pListBeTracePolyline = new List<IPolyline>();
foreach (IFeatureCache2 current in this.m_pListFeatureCache)
{
int count = current.Count;
for (int i = 0; i < count; i++)
{
IFeature feature = current.get_Feature(i);
IGeometry shapeCopy = feature.ShapeCopy;
ITopologicalOperator topologicalOperator = shapeCopy as ITopologicalOperator;
if (shapeCopy.GeometryType == esriGeometryType.esriGeometryPolygon)
{
IPolyline polyline = topologicalOperator.Boundary as IPolyline;
IGeometryCollection geometryCollection = polyline as IGeometryCollection;
int geometryCount = geometryCollection.GeometryCount;
for (int j = 0; j < geometryCount; j++)
{
IPath path = geometryCollection.get_Geometry(j) as IPath;
IPolyline item = ToPolyline(path);
this.m_pListBeTracePolyline.Add(item);
ComReleaser.ReleaseCOMObject(path);
}
ComReleaser.ReleaseCOMObject(polyline);
}
else
{
if (shapeCopy.GeometryType == esriGeometryType.esriGeometryPolyline)
{
IPolyline polyline2 = shapeCopy as IPolyline;
IGeometryCollection geometryCollection2 = polyline2 as IGeometryCollection;
int geometryCount2 = geometryCollection2.GeometryCount;
for (int k = 0; k < geometryCount2; k++)
{
IPath path2 = geometryCollection2.get_Geometry(k) as IPath;
IPolyline item2 = ToPolyline(path2);
this.m_pListBeTracePolyline.Add(item2);
ComReleaser.ReleaseCOMObject(path2);
}
}
}
ComReleaser.ReleaseCOMObject(shapeCopy);
}
}
}
private IPolyline AddToTraceFeedBack(IPoint pPoint)
{
if (this.m_pTraceFeedback == null)
{
this.m_pTraceFeedback = new TraceFeedbackExClass();
m_pTraceFeedback.Display = this.m_hookHelper.ActiveView.ScreenDisplay;
this.m_pTraceFeedback.ListBeTracePolyline = this.m_pListBeTracePolyline;
if (this.m_pGeometry.IsEmpty)
{
this.m_pTraceFeedback.Start(pPoint, null, null);
}
else
{
IPoint fromPoint = this.m_pRing.FromPoint;
IPoint toPoint = this.m_pRing.ToPoint;
this.m_pTraceFeedback.Start(pPoint, fromPoint, toPoint);
}
return null;
}
IPolyline result = this.m_pTraceFeedback.Stop(pPoint);
this.m_pTraceFeedback = null;
return result;
}
private void ReleaseBeTracedPolyline()
{
if (this.m_pListBeTracePolyline != null)
{
foreach (IGeometry current in this.m_pListBeTracePolyline)
{
ComReleaser.ReleaseCOMObject(current);
}
this.m_pListBeTracePolyline.Clear();
this.m_pListBeTracePolyline = null;
}
}
public static IPolyline ToPolyline(IPath pPath)
{
IPolyline polyline = new PolylineClass();
polyline.SpatialReference = pPath.SpatialReference;
ISegmentCollection segments = pPath as ISegmentCollection;
ISegmentCollection segmentCollection = polyline as ISegmentCollection;
segmentCollection.AddSegmentCollection(segments);
polyline.SimplifyNetwork();
return polyline;
}
private void AddPolylineToPolygon(IPolyline pPolyline)
{
if (pPolyline != null && !pPolyline.IsEmpty)
{
if (this.m_pRing == null)
{
this.NewPolygonPart();
}
ISegmentCollection segmentCollection = this.m_pRing as ISegmentCollection;
if (!this.m_pRing.IsEmpty && this.m_pRing.ToPoint != null)
{
ILine line = new LineClass();
line.PutCoords(this.m_pRing.ToPoint, pPolyline.FromPoint);
ISegmentCollection arg_7B_0 = segmentCollection;
ISegment arg_7B_1 = line as ISegment;
object value = Missing.Value;
object value2 = Missing.Value;
arg_7B_0.AddSegment(arg_7B_1, ref value, ref value2);
}
ISegmentCollection segmentCollection2 = pPolyline as ISegmentCollection;
int segmentCount = segmentCollection2.SegmentCount;
for (int i = 0; i < segmentCount; i++)
{
ISegmentCollection arg_AE_0 = segmentCollection;
ISegment arg_AE_1 = segmentCollection2.get_Segment(i);
object value3 = Missing.Value;
object value4 = Missing.Value;
arg_AE_0.AddSegment(arg_AE_1, ref value3, ref value4);
}
return;
}
}
private void AddToFeedback(IPolyline pPolyline)
{
if (this.m_pDisplayFeedback != null)
{
IPointCollection pointCollection = pPolyline as IPointCollection;
int pointCount = pointCollection.PointCount;
for (int i = 0; i < pointCount; i++)
{
(this.m_pDisplayFeedback as INewPolygonFeedback).AddPoint(pointCollection.get_Point(i));
}
return;
}
this.m_pDisplayFeedback = new NewPolygonFeedbackClass();
m_pDisplayFeedback.Display = this.m_hookHelper.ActiveView.ScreenDisplay;
if (pPolyline.IsEmpty)
{
return;
}
IPointCollection pointCollection2 = pPolyline as IPointCollection;
int pointCount2 = pointCollection2.PointCount;
(this.m_pDisplayFeedback as INewPolygonFeedback).Start(pointCollection2.get_Point(0));
for (int j = 1; j < pointCount2; j++)
{
(this.m_pDisplayFeedback as INewPolygonFeedback).AddPoint(pointCollection2.get_Point(j));
}
}
private void EndTraceFeedback()
{
if (this.m_pTraceFeedback != null)
{
this.m_pTraceFeedback.Stop(null);
this.m_pTraceFeedback = null;
}
this.ReleaseFeatureCache();
this.ReleaseBeTracedPolyline();
}
}
}