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.
		
		
		
		
		
			
		
			
				
					
					
						
							704 lines
						
					
					
						
							26 KiB
						
					
					
				
			
		
		
	
	
							704 lines
						
					
					
						
							26 KiB
						
					
					
				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(); | 
						|
        } | 
						|
    } | 
						|
}
 | 
						|
 |