using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.AE.ExtensionMethod; using KGIS.Framework.Maps; using KGIS.Framework.Utils; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.Utils.Helper; using KGIS.Framework.Views; using Kingo.PluginServiceInterface; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using UIShell.OSGi; namespace Kingo.Plugin.NYYP.View { /// /// UCTBBG.xaml 的交互逻辑 /// public partial class UCTBBG : UserControl, IElementInfo { private IProofManager ProofMgr = null; List _Elements = null; IElementInfo _WYInfo = null; IElementInfo _FeatureInfo = null; IElementInfo _NYYPInfo = null; IElementInfo _WYImgInfo = null; IFeatureLayer _curFeatureLayer; IFeatureLayer _curJCTBFeatureLayer; private object Hook = null; public UCTBBG() { InitializeComponent(); Title = "图斑变更组件"; DockWidth = 550; this.Loaded += (s, e) => { MapsManager.Instance.MapService.OnSelectionChanged -= MapService_OnSelectionChanged; MapsManager.Instance.MapService.OnSelectionChanged += MapService_OnSelectionChanged; _curFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); _curJCTBFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("JCTB"); Hook = MapsManager.Instance.MapService.Hook; }; } private int CurShowJCOID = 0; private void MapService_OnSelectionChanged(object sender, EventArgs e) { try { if (!IsShow) { MapsManager.Instance.MapService.OnSelectionChanged -= MapService_OnSelectionChanged; return; }//当前窗口关闭时,注销触发事件 ISelectionSet pSelectionSetes = (_curFeatureLayer as IFeatureSelection).SelectionSet;//获取图层要素已被选择的 ISelectionSet pJCSelectionSetes = (_curJCTBFeatureLayer as IFeatureSelection).SelectionSet;//获取图层要素已被选择的 int oid = -1; //ShowIndex 暂时当做区分变更范围与监测图斑 if (pSelectionSetes != null && pSelectionSetes.Count != 0 && this.ShowIndex == 0) { if (IsSave) return; IEnumIDs enumIDs = pSelectionSetes.IDs; enumIDs.Reset(); while ((oid = enumIDs.Next()) >= 0) { IFeature f = _curFeatureLayer.FeatureClass.GetFeature(oid); BindData(f); Marshal.ReleaseComObject(enumIDs); break; } }//监测是否有要素被选择 else if (pJCSelectionSetes != null && pJCSelectionSetes.Count != 0 && this.ShowIndex == 1) { IEnumIDs enumIDs = pJCSelectionSetes.IDs; enumIDs.Reset(); oid = -1; while ((oid = enumIDs.Next()) >= 0) { if (CurShowJCOID == oid) break;//不重新绑定当前已选择行 IFeature f = _curJCTBFeatureLayer.FeatureClass.GetFeature(oid); BindData(f); Marshal.ReleaseComObject(f); Marshal.ReleaseComObject(enumIDs); CurShowJCOID = oid; break; } } Marshal.ReleaseComObject(pSelectionSetes); Marshal.ReleaseComObject(pJCSelectionSetes); if (oid == -1) { BindData(null); return; } } catch (Exception ex) { LogAPI.Debug(ex.Message); } } public bool IsShow { get; set; } public int ShowIndex { get; set; } public bool ResetSize { get; set; } public bool AllowEdit { get; set; } public Guid ID { get; set; } public DockStyle DockAreas { get; set; } public System.Drawing.Size FloatSize { get; set; } public int DockWidth { get; set; } public int DockHeight { get; set; } public DockStyle DefaultArea { get; set; } public bool ShowCloseButton { get; set; } public bool ShowAutoHideButton { get; set; } public string Title { get; set; } public void BindData(object obj) { try { if (_curFeatureLayer == null) _curFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); Init(); tvDataList.Items.Clear(); if (obj is IFeature) { IFeature tempFeature = obj as IFeature; string mFcName = (tempFeature.Class as FeatureClass).BrowseName; if (mFcName == "JCTB") { GetBGTBForJCTB(tempFeature); if (tvDataList.SelectedItem is ListBoxItem item) item.FontStyle = FontStyles.Oblique; } else if (mFcName == "DLTBBG") { _FeatureInfo?.BindData(obj); _NYYPInfo?.BindData(obj); object wyData = GetProofData(obj as IFeature); if (wyData == null) { labIsProof.Content = "图斑未举证"; labIsProof.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Red); } else { labIsProof.Content = "图斑已举证"; labIsProof.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Green); } _WYInfo?.BindData(wyData); _WYImgInfo?.BindData(wyData); } return; } else { ISelectionSet pSelectionSetes = (_curFeatureLayer as IFeatureSelection).SelectionSet;//获取图层要素已被选择的 if (pSelectionSetes == null) return;//监测是否有要素被选择 IEnumIDs enumIDs = pSelectionSetes.IDs; enumIDs.Reset(); List selectionOIDs = new List(); int oid = -1; while ((oid = enumIDs.Next()) >= 0) { obj = _curFeatureLayer.FeatureClass.GetFeature(oid); break; } } _FeatureInfo?.BindData(obj); _WYInfo?.BindData(obj); _NYYPInfo?.BindData(obj); _WYImgInfo?.BindData(obj); } catch (Exception ex) { LogAPI.Debug("加载图斑变更详情页面时发生异常,异常信息如下:"); LogAPI.Debug(ex); } } public void GetBGTBForJCTB(IFeature pJCTB) { if (pJCTB == null) return; IFeatureLayer featureLayerBG = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); int JCBHIndex = pJCTB.Fields.FindField("JCBH"); if (JCBHIndex == -1) return; string strJCBH = pJCTB.Value[JCBHIndex].ToTrim(); if (string.IsNullOrWhiteSpace(strJCBH)) { labIsProof.Content = "图斑未举证"; labIsProof.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Red); _WYInfo?.BindData(null); _WYImgInfo?.BindData(null); _FeatureInfo?.BindData(null); return; } IQueryFilter queryFilter = new QueryFilterClass() { WhereClause = string.Format("TBYBH='{0}'", strJCBH) }; #region 验证监测/变更是否存在空间关系 int BGTBYBHIndex = featureLayerBG.FeatureClass.FindField("TBYBH"); List BGFs = FeatureAPI.Identify2(pJCTB.ShapeCopy, featureLayerBG); bool IsExit = false; foreach (IFeature itemBG in BGFs) { ITopologicalOperator topo = pJCTB.ShapeCopy as ITopologicalOperator; IGeometry newGeo = topo.Intersect(itemBG.ShapeCopy, itemBG.ShapeCopy.Dimension); decimal ares = newGeo.GetEllipseArea().ToDecimal(); decimal asde = Convert.ToDecimal(pJCTB.ShapeCopy.GetEllipseArea()); //decimal asdw = ares / asde; if (ares / asde > 0.8.ToDecimal()) { if (BGTBYBHIndex == -1) continue; itemBG.Value[BGTBYBHIndex] = strJCBH; itemBG.Store(); IsExit = true; } } #endregion #region 无对应变更图斑数据,可从监测图层中加载 if (!IsExit && featureLayerBG.FeatureClass.FeatureCount(queryFilter) == 0) { System.Windows.Forms.DialogResult result = MessageHelper.ShowYesNoCancelAndTips("无对应变更图斑数据,是否从监测图层中加载?"); if (result == System.Windows.Forms.DialogResult.Yes) { #region 字段属性 int JCJCBHIndex = pJCTB.Fields.FindField("TBBH"); int JCBGDLIndex = pJCTB.Fields.FindField("BGDL"); int JCTZIndex = pJCTB.Fields.FindField("TZ"); int JCBGFWIndex = pJCTB.Fields.FindField("BGFW"); int JCWBGLXIndex = pJCTB.Fields.FindField("WBGLX"); int JCSJLYIndex = pJCTB.Fields.FindField("SJLY"); int BGDLBMIndex = featureLayerBG.FeatureClass.FindField("DLBM"); int TZIndex = featureLayerBG.FeatureClass.FindField("TZ"); int BGDLIndex = featureLayerBG.FeatureClass.FindField("BGDL"); int BGFWIndex = featureLayerBG.FeatureClass.FindField("BGFW"); int WBGLXIndex = featureLayerBG.FeatureClass.FindField("WBGLX"); int SJLYIndex = featureLayerBG.FeatureClass.FindField("SJLY"); #endregion //监测图斑 IFeatureClassLoad pFclsLoad = featureLayerBG.FeatureClass as IFeatureClassLoad; if (pFclsLoad != null) pFclsLoad.LoadOnlyMode = true; //地类变更图斑 IFeatureBuffer buffer = featureLayerBG.FeatureClass.CreateFeatureBuffer(); IFeatureCursor T_Cursor = featureLayerBG.FeatureClass.Insert(true); #region 属性赋值 buffer.Shape = pJCTB.ShapeCopy; buffer.Value[BGDLIndex] = pJCTB.Value[JCBGDLIndex]; buffer.Value[TZIndex] = pJCTB.Value[JCTZIndex]; buffer.Value[BGFWIndex] = pJCTB.Value[JCBGFWIndex]; buffer.Value[WBGLXIndex] = pJCTB.Value[JCWBGLXIndex]; buffer.Value[SJLYIndex] = pJCTB.Value[JCSJLYIndex]; buffer.Value[BGTBYBHIndex] = pJCTB.Value[JCJCBHIndex]; int DLBMFieldLength = featureLayerBG.FeatureClass.Fields.get_Field(BGDLBMIndex).Length; if (!string.IsNullOrWhiteSpace(pJCTB.Value[JCBGDLIndex].ToTrim()) && pJCTB.Value[JCBGDLIndex].ToTrim().Length <= DLBMFieldLength) buffer.Value[BGDLBMIndex] = pJCTB.Value[JCBGDLIndex]; else if (!string.IsNullOrWhiteSpace(pJCTB.Value[JCBGDLIndex].ToTrim()) && pJCTB.Value[JCBGDLIndex].ToTrim().Contains(',')) buffer.Value[BGDLBMIndex] = pJCTB.Value[JCBGDLIndex].ToTrim().Split(',')[0]; else buffer.Value[BGDLBMIndex] = DBNull.Value; #endregion T_Cursor.InsertFeature(buffer); T_Cursor.Flush(); if (pFclsLoad != null) pFclsLoad.LoadOnlyMode = false; Marshal.ReleaseComObject(T_Cursor); Marshal.ReleaseComObject(buffer); Marshal.ReleaseComObject(pFclsLoad); } } #endregion #region 展示选项卡 IFeatureCursor featureCursorBG = featureLayerBG.FeatureClass.Search(queryFilter, false); IFeature bgF = null; while ((bgF = featureCursorBG.NextFeature()) != null) { ListBoxItem item = new ListBoxItem { Margin = new Thickness(32, 0, 0, 0), Content = "图斑:" + bgF.OID, Tag = bgF }; tvDataList.Items.Add(item); } #endregion Marshal.ReleaseComObject(featureCursorBG); if (tvDataList.Items.Count > 0) { (tvDataList.Items[0] as ListBoxItem).IsSelected = true; } } ControlsEditingSaveCommandClass saveCmd = null; bool IsSave = false; public void SaveEdit() { IsSave = true; if (saveCmd == null) { saveCmd = new ControlsEditingSaveCommandClass(); saveCmd.OnCreate(MapsManager.Instance.MapService.Hook); } if (saveCmd.Enabled) { saveCmd.OnClick(); } IsSave = false; _FeatureInfo?.SaveEdit(); _NYYPInfo?.SaveEdit(); _WYImgInfo?.SaveEdit(); } public void Init() { try { if (_Elements == null) { _Elements = BundleRuntime.Instance.GetService(); } if (_Elements == null) return; if (_WYImgInfo == null) { _WYImgInfo = _Elements.FirstOrDefault(f => f.Title == "外业照片"); } if (_WYImgInfo != null && (_WYImgInfo as UserControl).Parent != null) { ((_WYImgInfo as UserControl).Parent as Grid).Children.Clear(); } if (_WYImgInfo != null) WYImgInfo.Children.Add(_WYImgInfo as UIElement); //if (_NYYPInfo == null) //{ // _NYYPInfo = _Elements.FirstOrDefault(f => f.Title == "内业预判"); //} //if ((_NYYPInfo as UserControl).Parent != null) //{ // ((_NYYPInfo as UserControl).Parent as Grid).Children.Clear(); //} //if (_NYYPInfo != null) // NYYPInfoPanel.Children.Add(_NYYPInfo as UIElement); if (_WYInfo == null) { _WYInfo = _Elements.FirstOrDefault(f => f.Title == "外业信息组件"); } if ((_WYInfo as UserControl).Parent != null) { ((_WYInfo as UserControl).Parent as Grid).Children.Clear(); } WYInfo.Children.Add(_WYInfo as UIElement); if (_FeatureInfo == null) { _FeatureInfo = _Elements.FirstOrDefault(f => f.Title == "要素属性"); } if ((_FeatureInfo as UserControl).Parent != null) { ((_FeatureInfo as UserControl).Parent as Grid).Children.Clear(); } TBInfo.Children.Add(_FeatureInfo as UIElement); } catch (Exception ex) { LogAPI.Debug("初始化图斑详情页面失败!"); LogAPI.Debug(ex); } } private void tvDataList_PreviewMouseUp(object sender, MouseButtonEventArgs e) { try { //ListBoxItem item = tvDataList.SelectedItem as ListBoxItem; foreach (ListBoxItem itemBOX in tvDataList.Items) { if (itemBOX.IsSelected == true) itemBOX.FontStyle = FontStyles.Oblique; else itemBOX.FontStyle = FontStyles.Normal; } } catch (Exception ex) { LogAPI.Debug("要素属性中 元素树操作时鼠标抬起 时异常,异常信息如下:"); LogAPI.Debug(ex); } } private void tvDataList_SelectionChanged(object sender, SelectionChangedEventArgs e) { try { if (tvDataList.SelectedItem == null) return; ListBoxItem item = tvDataList.SelectedItem as ListBoxItem; if (item == null || item.Tag == null) { return; } object Data = null; if (item.Tag is IFeature) { Data = item.Tag; } _FeatureInfo?.BindData(item.Tag); if (item.Tag is IFeature) { MoveToCenter(item.Tag as IFeature); ISelectionSet pSelectionSet = (_curFeatureLayer as IFeatureSelection).SelectionSet; pSelectionSet.Add((item.Tag as IFeature).OID); } //_WYInfo?.BindData(item.Tag); _NYYPInfo?.BindData(item.Tag); object wyData = GetProofData(item.Tag as IFeature); if (wyData == null) { labIsProof.Content = "图斑未举证"; labIsProof.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Red); } else { labIsProof.Content = "图斑已举证"; labIsProof.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Green); } _WYInfo?.BindData(wyData); _WYImgInfo?.BindData(wyData); } catch (Exception ex) { LogAPI.Debug(ex.Message); throw; } } private void MoveToCenter(IFeature pFeatures) { try { IEnvelope pEnvelope = new EnvelopeClass() as IEnvelope; pEnvelope = pFeatures.ShapeCopy.Envelope; List featureList = new List(); featureList.Add(pFeatures); //(Hook as IMapControlDefault).Map.SelectFeature(_curFeatureLayer as ILayer, pFeatures);与变更图斑产生冲突 if (pEnvelope.XMax < pFeatures.ShapeCopy.Envelope.XMax) pEnvelope.XMax = pFeatures.ShapeCopy.Envelope.XMax; if (pEnvelope.XMin > pFeatures.ShapeCopy.Envelope.XMin) pEnvelope.XMin = pFeatures.ShapeCopy.Envelope.XMin; if (pEnvelope.YMax < pFeatures.ShapeCopy.Envelope.YMax) pEnvelope.YMax = pFeatures.ShapeCopy.Envelope.YMax; if (pEnvelope.YMin > pFeatures.ShapeCopy.Envelope.YMin) pEnvelope.YMin = pFeatures.ShapeCopy.Envelope.YMin; ////投影到当前地图坐标系定位缩放到当前要素 pEnvelope.Project((Hook as IMapControlDefault).SpatialReference); IUnitConverter pUnitConverter = new UnitConverterClass(); double dScale = pUnitConverter.ConvertUnits(20, esriUnits.esriMeters, (Hook as IMapControlDefault).MapUnits); pEnvelope.PutCoords(pEnvelope.XMin - dScale, pEnvelope.YMin - dScale, pEnvelope.XMax + dScale, pEnvelope.YMax + dScale); (Hook as IMapControlDefault).ActiveView.Extent = pEnvelope; (Hook as IMapControlDefault).ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, (Hook as IMapControlDefault).ActiveView.Extent); (Hook as IMapControlDefault).ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, featureList, (Hook as IMapControlDefault).ActiveView.Extent); } catch (Exception ex) { MessageHelper.ShowError("操作异常!异常信息:" + ex.Message); LogAPI.Debug(ex); } } private List GetProofData(IFeature pFeature) { if (ProofMgr == null) ProofMgr = BundleRuntime.Instance.GetFirstOrDefaultService(); List result = new List(); int fieldIndex = pFeature.Fields.FindField("TBYBH"); if (fieldIndex == -1) fieldIndex = pFeature.Fields.FindField("TBBH"); if (fieldIndex > 0) { result = ProofMgr.GetProofInfoList(pFeature.Value[fieldIndex].ToString()); } return result; } } }