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 KGIS.Framework.AE; using KGIS.Framework.EngineEditor; using KGIS.Framework.Maps; using KGIS.Framework.Platform; using KGIS.Framework.Utils; using KGIS.Framework.Utils.Helper; using Kingo.Plugin.EngineEditor.Common; using Kingo.PluginServiceInterface; using System; using System.Collections.Generic; using UIShell.OSGi; namespace Kingo.Plugin.EngineEditor.Commands.Tools { /// /// 绘制零星面 /// public class DrawPolygonLXCommandForKDB : 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 (Exception) { } 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(); 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 (MapsManager.Instance == null) return false; object pTemp = (MapsManager.Instance.CurrProjectInfo as ProjectInfo); if (pTemp == null) { return false; } else { //if (string.IsNullOrWhiteSpace(pTemp.GetProjDBPath())) //{ // return false; //} //else //{ if (m_pEditor == null) { return false; } //替换Env改动 IFeatureLayer layer = (m_pEditor as EngineEditorClass).TargetLayer as IFeatureLayer;// Env.Instance.KMap.EngEditor.TargetLayer as IFeatureLayer; if ((m_pEditor as EngineEditorClass).EditState == esriEngineEditState.esriEngineStateEditing && layer != null) { if ((m_pEditor as EngineEditorClass).GeometryType == esriGeometryType.esriGeometryPolygon) { return true; } else { return false; } } return false; //} } } 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(); //GetAllFeatureLayer(); //if (this.m_pListFeatureCache == null) //{ try { this.FillFeatureCache(this.m_pPointCatched); } catch (Exception ex) { } 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) { try { this.m_pTraceFeedback.MoveTo(this.m_pPointCatched); } catch (Exception) { } 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; if (MapsManager.Instance.MapService.GetProjectInfo() is ProjectInfo ProInfo && ProInfo.ProjType == EnumProjType.BHTBTQ && Platform.Instance.SystemType == SystemTypeEnum.BGFWCG) { ucZYQMagrHelper = BundleRuntime.Instance.GetFirstOrDefaultService(); if (ucZYQMagrHelper != null) { selectIdZYQ = ucZYQMagrHelper.GetCheckedID(); } } FinishSketch(); if (ucZYQMagrHelper != null) { ucZYQMagrHelper.AddMask(selectIdZYQ); } } catch (Exception ex) { LogAPI.Debug("新增面‘OnDblClick’操作异常:" + ex.Message); MessageHelper.ShowError("新增面‘OnDblClick’操作异常:" + ex); } } 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) { DrawGeometry(); } } else if (m_pGeometry is IPolyline) { if (!this.m_pGeometry.IsEmpty) { IPolyline polyline = this.m_pGeometry as IPolyline; polyline.SimplifyNetwork(); DrawGeometry(); } } if (EditorSettingClass.Instance.OnDrawEnd != null) { EditorSettingClass.Instance.OnDrawEnd(this, this.m_pGeometry); } if (this.m_pGeometry != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(this.m_pGeometry); if (m_pPath != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(this.m_pPath); if (m_pRing != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(this.m_pRing); this.m_pGeometry = null; if (this.m_pRing != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(this.m_pRing); this.m_pRing = null; if (this.m_pPath != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(this.m_pPath); this.m_pPath = null; if (this.SketchGeometry != null) { this.SketchGeometry.Deactivate(); this.SketchGeometry = null; } this.RefreshForeground(null); } public void DrawGeometry() { try { if (!((m_pEditor as EngineEditorClass).TargetLayer is IFeatureLayer featureLayer) || featureLayer.FeatureClass == null) { return; } IEngineEditSketch editSketch = m_pEditor as IEngineEditSketch; //IGeometry geometry = m_pGeometry; //geometry.SpatialReference = m_pHookHelper.FocusMap.SpatialReference; //if (RegionAuthorize == null) //{ // RegionAuthorize = new RegionAuthorize(); //} if (density == null) { density = new VerificationOfFeatureNodeDensity(m_pHookHelper); } //验证区域授权 //if (!RegionAuthorize.ValidateAuthorize(geometry)) //{ // MessageHelper.ShowError("绘制图形不在授权区域范围内!"); // //模拟点击Backspace按键,目的清除当前绘制对象 // OnKeyDown((int)ConsoleKey.Backspace, 0); // //editSketch.FinishSketch(); // //ControlsEditingClearCommandClass pControlsEditingClearCommandClass = new ControlsEditingClearCommandClass(); // //pControlsEditingClearCommandClass.OnCreate(m_pHookHelper.Hook); // //pControlsEditingClearCommandClass.OnClick(); // return; //} m_pGeometry = density.Verification(m_pGeometry); //判断绘制的图形是否在目标图层数据范围内 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 = new Envelope() as IEnvelope; enveloe.XMin = xmin; enveloe.XMax = xmax; enveloe.YMin = ymin; enveloe.YMax = ymax; if (!FeatureAPI.IsContains(enveloe, m_pGeometry)) { MessageHelper.ShowTips("绘制图形超出目标图层范围!"); editSketch.Geometry = null; editSketch.RefreshSketch(); this.m_pHookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, this.m_pHookHelper.ActiveView.Extent); return; } } //if ((featureLayer.FeatureClass as IGeoDataset) != null && !KGIS.Framework.AE.FeatureAPI.IsContains((featureLayer.FeatureClass as IGeoDataset).Extent, geometry)) //{ // System.Windows.Forms.MessageBox.Show("绘制图形超出目标图层范围!", "系统提示:", System.Windows.Forms.MessageBoxButtons.OK); // editSketch.Geometry = null; // editSketch.RefreshSketch(); // this.m_pHookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, this.m_pHookHelper.ActiveView.Extent); // return; //} //editSketch.FinishSketch(); //ControlsUndoCommand undo = new ControlsUndoCommand(); //undo.OnCreate(m_pHookHelper.Hook); //undo.OnClick(); //开始记录操作 m_pEditor.StartOperation(); #region //IIdentify identify = featureLayer as IIdentify; //IArray iarray = identify.Identify(geometry); //for (int i = 0; i < iarray.Count; i++) //{ // IFeatureIdentifyObj pFeatIdObj = iarray.get_Element(i) as IFeatureIdentifyObj; // IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject; // IFeature newFeature = pRowObj.Row as IFeature; // ITopologicalOperator topOper = newFeature.ShapeCopy as ITopologicalOperator; // IGeometry geometryNew = topOper.Difference(geometry); // newFeature.Shape = geometryNew; // newFeature.Store(); //} //IFeature featureNew = featureLayer.FeatureClass.CreateFeature(); //if (selectPointLayer != null) //{ // ISpatialFilter filter = new SpatialFilterClass(); // filter.Geometry = geometry; // IFeatureCursor featureCursor = selectPointLayer.FeatureClass.Search(filter, false); // IFeature lxdw = featureCursor.NextFeature(); // for (int i = 0; i < lxdw.Fields.FieldCount; i++) // { // string fieldName = lxdw.Fields.Field[i].Name; // if (fieldName.ToUpper() == "OBJECTID" || fieldName.ToUpper() == "FID" || fieldName.ToUpper() == "SHAPE") // { // continue; // } // int fieldIndex = featureNew.Fields.FindField(fieldName); // if (fieldIndex < 0) continue; // featureNew.Value[fieldIndex] = lxdw.Value[i]; // } //} //featureNew.Shape = geometry; //featureNew.Store(); #endregion IFeatureSelection featureSelection = featureLayer as IFeatureSelection; featureSelection.Clear(); //IFeatureLayer selectFeatureLayer = Env.Instance.KMap.GetFeatureLayerByName(this.m_pHookHelper.ActiveView.FocusMap, Env.Instance.DefaultValue.ED_DLTB_TableName) as IFeatureLayer; //IFeatureLayer selectFeatureLayer = Env.Instance.KMap.GetFeatureLayerByName(this.m_pHookHelper.ActiveView.FocusMap, "LXDW") as IFeatureLayer; //if (selectFeatureLayer == null || selectFeatureLayer.FeatureClass == null) //{ // selectFeatureLayer = Env.Instance.KMap.GetFeatureLayerByName(this.m_pHookHelper.ActiveView.FocusMap, Env.Instance.DefaultValue.DLTB_TableName) as IFeatureLayer; //} //替换Env改动 //IFeatureLayer selectFeatureLayer = Env.Instance.KMap.GetFeatureLayerByName(Env.Instance.DefaultValue.DLTB_TableName); IFeatureLayer selectFeatureLayer = (m_pEditor as EngineEditorClass).TargetLayer as IFeatureLayer;// _MapService.GetFeatureLayerByName(//Env.Instance.DefaultValue.DLTB_TableName); if (selectFeatureLayer != null && selectFeatureLayer.FeatureClass != null) { #region //GenerateNewFeature(geometry, selectFeatureLayer.FeatureClass)为geometry裁剪后的图形,不符合 需求 //按权属分割、合并图斑 //List GeoList = FeatureAPI.GenerateNewFeature(geometry, selectFeatureLayer.FeatureClass); //if (GeoList == null || GeoList.Count <= 0) //{ // GeoList.Add(geometry); // //DrawFeature(featureLayer.FeatureClass, geometry, featureSelection); //} #endregion List GeoList = new List(); GeoList.Add(m_pGeometry); //------------------ IIdentify identify = featureLayer as IIdentify; List featureList = new List(); bool isSplit; int splitIndex, segIndex; for (int k = 0; k < GeoList.Count; k++) { IGeometry item = GeoList[k]; if (item.IsEmpty) continue; ITopologicalOperator2 topologicalOperator2 = item as ITopologicalOperator2; //调用Simplify()方法使IsSimple和IsKnownSimple属性都为true topologicalOperator2.Simplify(); IPolyline pPolyline = topologicalOperator2.Boundary as IPolyline; item.SpatialReference = this.m_pHookHelper.FocusMap.SpatialReference; if (identify != null) { IArray iarray = identify.Identify(item); if (iarray != null) { for (int i = 0; i < iarray.Count; i++) { IFeatureIdentifyObj pFeatIdObj = iarray.get_Element(i) as IFeatureIdentifyObj; IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject; IFeature newFeature = pRowObj.Row as IFeature; newFeature.Shape.SpatialReference = this.m_pHookHelper.FocusMap.SpatialReference; ITopologicalOperator topOper = newFeature.ShapeCopy as ITopologicalOperator; topOper.Simplify(); IGeometry geometryNew = topOper.Difference(item); if (geometryNew.IsEmpty) { continue; } newFeature.Shape = geometryNew; newFeature.Store(); SplitMultipartFeature(new List() { newFeature }, item, featureSelection); IPointCollection pointCollection = geometryNew as IPointCollection; for (int j = 0; j < pointCollection.PointCount; j++) { //if (KGIS.Framework.AE.FeatureAPI.IsInterSect(pointCollection.get_Point(j) as IGeometry, item)) //{ // pPolyline.SplitAtPoint(pointCollection.get_Point(j), false, false, out isSplit, out splitIndex, out segIndex); //} } item = FeatureAPI.ConstructPolygonFromPolyline(pPolyline); } } } ////白明雅 2020-04-01 //if (dataCheckService != null) //{ // dataCheckService.GeometryCheck(item, featureLayer); //} DrawFeature(featureLayer.FeatureClass, item, featureSelection); } #region 打开数据检查助手 //替换Env改动 //if (Env.Instance.Platfrom.WinFeatureCheck != null) //{ // (Env.Instance.Platfrom.WinFeatureCheck as CheckAssistant).InitData(featureList); //} #endregion } else { //if (dataCheckService != null) //{ // dataCheckService.GeometryCheck(m_pGeometry, featureLayer); //} DrawFeature(featureLayer.FeatureClass, m_pGeometry, featureSelection); } //结束记录操作 m_pEditor.StopOperation("DRAWLX"); //模拟点击Backspace按键,目的清除当前绘制对象 OnKeyDown((int)ConsoleKey.Backspace, 0); //************************************************************************** //增加通知要素属性窗体刷新功能 //************************************************************************** //Env.Instance.Platfrom.NotifyMsg.SetNotifyMsg(new Common.Interface.NotifyMsgPackage() { MsgType = "RefreshFeatureAttribute" });//暂时注销,待改回 this.m_pHookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground | esriViewDrawPhase.esriViewGeoSelection, null, this.m_pHookHelper.ActiveView.Extent); //KGIS.Common.Utility.CustomLogAPI.WriteSystemOperationLog("数据增加", "画零星面"); } catch (Exception ex) { LogAPI.Debug("画零星面 期间 鼠标双击 时异常,异常信息如下:"); LogAPI.Debug(ex); LogAPI.Debug("画零星面 期间 鼠标双击 时异常信息结束"); MessageHelper.ShowError("绘制失败:" + ex.Message); } } private void DrawFeature(IFeatureClass pFeatureClass, IGeometry geometry, IFeatureSelection featureSelection) { /* * 修改bug:画零星面,出现多条只有属性、没有图形数据 */ if (geometry == null || geometry.IsEmpty) { return; } IFeature feature = pFeatureClass.CreateFeature(); //IPointCollection ps = geometry as IPointCollection; //List pList = new List(); //for (int i = 0; i < ps.PointCount; i++) //{ // pList.Add(ps.Point[i]); //} //IPoint p = GetGravityPoint(pList); //ps.AddPoint(p); feature.Shape = geometry; feature.Shape.SpatialReference = m_pHookHelper.FocusMap.SpatialReference; feature.Store(); SplitMultipartFeature(new List() { feature }, geometry, featureSelection); } public void SplitMultipartFeature(List SelectedFeature, IGeometry drawGeometry, IFeatureSelection featureSelection) { try { foreach (IFeature item in SelectedFeature) { IGeometry geo = item.ShapeCopy; ITopologicalOperator topologicalOperator = geo as ITopologicalOperator; if (topologicalOperator == null) continue; topologicalOperator.Simplify(); if (item.ShapeCopy.GeometryType == esriGeometryType.esriGeometryPolygon) { if ((topologicalOperator as IPolygon4) == null || (topologicalOperator as IPolygon4).ExteriorRingCount <= 0) { continue; } //外环图形 if (!((topologicalOperator as IPolygon4).ExteriorRingBag is GeometryBag ExterGeometryBag)) continue; //IGeometry firstGeo = null; IGeometryCollection ExterRingGeometryCollection = ExterGeometryBag as IGeometryCollection; for (int i = 0; i < ExterRingGeometryCollection.GeometryCount; i++) { IGeometryCollection geometry = new PolygonClass() as IGeometryCollection; IGeometry ExterGeometry = ExterRingGeometryCollection.get_Geometry(i); if (ExterGeometry != null && !ExterGeometry.IsEmpty) { geometry.AddGeometry(ExterGeometry); } else { continue; } //内环图形 IGeometryBag InteriorBag = (topologicalOperator as IPolygon4).get_InteriorRingBag(ExterGeometry as IRing); if (InteriorBag != null) { IGeometryCollection InteriorRingGeometryCollection = InteriorBag as IGeometryCollection; if (InteriorRingGeometryCollection == null) continue; for (int IG = 0; IG < InteriorRingGeometryCollection.GeometryCount; IG++) { IGeometry interiorGeo = InteriorRingGeometryCollection.get_Geometry(IG); if (interiorGeo != null && !interiorGeo.IsEmpty) { geometry.AddGeometry(interiorGeo); } } } if (i == 0) { item.Shape = geometry as IGeometry; item.Store(); if (FeatureAPI.IsContains(drawGeometry, item.ShapeCopy)) { //ISpatialReference s = item.ShapeCopy.SpatialReference; //var n = s.Name; //属性继承 //KGIS.Tools.Utility.FeatureHelper.SetFeatureAttributeNew(item);//以后待改回 featureSelection.Add(item); } } else { IFeature newFeaturte = (item.Class as IFeatureClass).CreateFeature(); IFeatureEdit pFeatureEdit = item as IFeatureEdit; pFeatureEdit.SplitAttributes(newFeaturte); (geometry as IGeometry).SpatialReference = item.ShapeCopy.SpatialReference; newFeaturte.Shape = geometry as IGeometry; newFeaturte.Store(); if (KGIS.Framework.AE.FeatureAPI.IsContains(drawGeometry, newFeaturte.ShapeCopy)) { //属性继承 //KGIS.Tools.Utility.FeatureHelper.SetFeatureAttributeNew(newFeaturte);//以后待改回 featureSelection.Add(newFeaturte); } } } //if (firstGeo != null) //{ // firstGeo.SpatialReference = item.ShapeCopy.SpatialReference; // item.Shape = firstGeo; // item.Store(); //} } else if (item.ShapeCopy.GeometryType == esriGeometryType.esriGeometryPolyline) { IGeometryCollection pGeocoll = geo as IGeometryCollection; int geomcount = pGeocoll.GeometryCount; if (geomcount > 1) { for (int k = 1; k < geomcount; k++) { IFeature newFeaturte = (item.Class as IFeatureClass).CreateFeature(); IFeatureEdit pFeatureEdit = item as IFeatureEdit; pFeatureEdit.SplitAttributes(newFeaturte); IGeometry newGeom = pGeocoll.get_Geometry(k); IPointCollection points = newGeom as IPointCollection; IPointCollection line = new PolylineClass(); for (int i = 0; i < points.PointCount; i++) { line.AddPoint(points.get_Point(i)); } newGeom = line as IGeometry; newGeom.SpatialReference = item.ShapeCopy.SpatialReference; newFeaturte.Shape = newGeom; newFeaturte.Store(); } IGeometry newGeom2 = pGeocoll.get_Geometry(0); IPointCollection points2 = newGeom2 as IPointCollection; IPointCollection line2 = new PolylineClass(); for (int i = 0; i < points2.PointCount; i++) { line2.AddPoint(points2.get_Point(i)); } newGeom2 = line2 as IGeometry; newGeom2.SpatialReference = item.ShapeCopy.SpatialReference; item.Shape = newGeom2; item.Store(); } } } } catch (Exception ex) { LogAPI.Debug("画零星面 期间 拆分多部件要素 时异常,异常信息如下:"); LogAPI.Debug(ex); LogAPI.Debug("画零星面 期间 拆分多部件要素 时异常信息结束"); throw ex; } } private IPoint GetGravityPoint(List lstPol) { double n, i; double x1, y1, x2, y2, x3, y3; double sum_x = 0, sum_y = 0, sum_s = 0; //n = int.Parse(Console.ReadLine()); //x1 = int.Parse(Console.ReadLine()); //y1 = int.Parse(Console.ReadLine()); //x2 = int.Parse(Console.ReadLine()); //y2 = int.Parse(Console.ReadLine()); x1 = lstPol[0].X; y1 = lstPol[0].Y; x2 = lstPol[1].X; y2 = lstPol[1].Y; n = lstPol.Count; int k = 2; for (i = 1; i <= n - 2; i++) { //x3 = int.Parse(Console.ReadLine()); //y3 = int.Parse(Console.ReadLine()); x3 = lstPol[k].X; y3 = lstPol[k].Y; double s = ((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2.0; sum_x += (x1 + x2 + x3) * s; sum_y += (y1 + y2 + y3) * s; sum_s += s; x2 = x3; y2 = y3; k++; } Console.WriteLine("重心为:%.2lf , %.2lf\n", sum_x / sum_s / 3.0, sum_y / sum_s / 3.0); IPoint result = new PointClass() { X = sum_x / sum_s / 3.0, Y = sum_y / sum_s / 3.0 }; return result; } } }