using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geodatabase; using KGIS.Framework.AE.ExtensionMethod; using KGIS.Framework.DBOperator; using KGIS.Framework.Maps; using KGIS.Framework.ThreadManager; using KGIS.Framework.Utils; using Kingo.PluginServiceInterface; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media.Animation; namespace Kingo.Plugin.DataCheck.Views { /// /// FrmDataCheckHelp.xaml 的交互逻辑 /// public partial class FrmFeatureDataCheck : Window, IDataCheckHelper { System.Windows.Forms.Control panel = null; private bool isMouseEnter = false; public FrmFeatureDataCheck(IHookHelper hookHelper) { InitializeComponent(); //Storyboard sb = this.Resources["loading"] as Storyboard; //sb.Begin(); this.Closed += (e, a) => { UIShell.OSGi.BundleRuntime.Instance.RemoveService(this); }; UIShell.OSGi.BundleRuntime.Instance.AddService(this); IdataChecks = new List(); IdataChecks.Add(new BGQDataCheck()); IdataChecks.Add(new BGHDataCheck()); IdataChecks.Add(new JCDLTBDataCheck()); IdataChecks.Add(new JCCZCDYDDataCheck()); //IDataCheck = new BGQDataCheck(); m_hookHelper = hookHelper; this.AllowDrop = true; this.LocationChanged += FrmDataCheckHelp_LocationChanged; panel = KGIS.Framework.Maps.MapsManager.Instance.MapService.getAxMapControl(); panel.SizeChanged += Panel_SizeChanged; System.Drawing.Point p = panel.Location; System.Drawing.Point p2 = panel.PointToScreen(p); Top = p2.Y + panel.Height - this.Height - 10; Left = p2.X + panel.Width - this.Width - 10; } IMapService _mapService = null; private IHookHelper m_hookHelper = null; //public event CheckDataPr DataCheckComplate; public IDataCheck IDataCheck { get; set; } public List IdataChecks { get; set; } public void BinddataGridView() { _mapService = MapsManager.Instance.MapService; ProjectInfo projectInfo = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo); string dbPath = System.IO.Path.Combine(projectInfo.ProjDir, "DataCheckrResult.db"); DataTable DataCheckrResult = SQLiteDBOperate.Instance.ExceDataTable(dbPath, $"SELECT OBJECTID,ErrorDesc 错误说明, ErrorArea 错误图形 FROM DataCheckResults "); //if (DataCheckrResult != null) //MyPropertyGrid.ItemsSource = DataCheckrResult.DefaultView; } private void ShowDetail(object o) { } private void Panel_SizeChanged(object sender, EventArgs e) { System.Drawing.Point p = panel.Location; System.Drawing.Point p2 = panel.PointToScreen(p); if (Top < p2.Y) this.Top = p2.Y; if (Left < p2.X) this.Left = p2.X; if (Top + this.Height > p2.Y + panel.Height) Top = p2.Y + panel.Height - this.Height; if (Left + this.Width > p2.X + panel.Width) Left = p2.X + panel.Width - this.Width; } private void FrmDataCheckHelp_LocationChanged(object sender, EventArgs e) { System.Windows.Forms.Control panel = KGIS.Framework.Maps.MapsManager.Instance.MapService.getAxMapControl(); System.Drawing.Point p = panel.Location; System.Drawing.Point p2 = panel.PointToScreen(p); if (Top < p2.Y) this.Top = p2.Y; if (Left < p2.X) this.Left = p2.X; if (Top + this.Height > p2.Y + panel.Height) Top = p2.Y + panel.Height - this.Height; if (Left + this.Width > p2.X + panel.Width) Left = p2.X + panel.Width - this.Width; if (this.Top - p2.Y < popContent.Height) { //下 //popContent.VerticalOffset = popContent.Height + this.Height - 10; } else { //上 //popContent.VerticalOffset = 10; } if (this.Left - p2.X < popContent.Width) { //右 //popContent.HorizontalOffset = 0 + this.Width - 10;// popContent.Width - (this.Left - p2.X);// this.Left;// popContent.Width + this.Width; } else { //左 //popContent.HorizontalOffset = -popContent.Width + 10; } } private void btnClosePage_Click(object sender, RoutedEventArgs e) { isMouseEnter = false; Storyboard sb = this.Resources["closeDW2"] as Storyboard; this.BeginStoryboard(sb); //this.popContent.IsOpen = false; } private void MyPropertyGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (_mapService == null) return; var gridView = sender as DataGrid; var errorMessage = gridView.SelectedItem as DataRowView; if (errorMessage == null) return; if (errorMessage.Row.ItemArray[2].ToString().Contains("paths")) { ESRI.ArcGIS.Geometry.IGeometry geometry = IPolygonExtension.ToGeometry(errorMessage.Row.ItemArray[2].ToString(), true, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline); _mapService.DrawGraph(geometry); _mapService.Zoom(geometry); m_hookHelper.FocusMap.ClearSelection();//清除图层上要素选择 } else { object pLayer = m_hookHelper.GetCustomProperty();//获取对象的创建者的Application对象 if (pLayer != null) { IFeatureLayer pTocFeatureLayer = pLayer as IFeatureLayer; _mapService.SelectFeature(pTocFeatureLayer.Name, errorMessage.Row.ItemArray[0].ToString()); } } } private void BtnClose_Click(object sender, RoutedEventArgs e) { this.Close(); } #region 一键修复 private void KImgButton_Click(object sender, RoutedEventArgs e) { } #endregion private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { //this.DragMove(); } public void DataCheckByThread(CheckParametr pParm) { try { IDataCheck = IdataChecks.FirstOrDefault(x => x.IDataCheckName == pParm.IDataCheckName); if (IDataCheck != null) { //cavLoading.Visibility = Visibility.Visible; if (pParm.DataSource as IFeature != null) { //Thread thread = new Thread(new ParameterizedThreadStart(IDataCheck.FeatureCheck)); //thread.SetApartmentState(ApartmentState.STA); //thread.Start(pParm); ThreadManager2.QueueUserWorkItem(new WaitCallback(IDataCheck.FeatureCheck), pParm, new WaitCallback(ThreadCallBack)); } else if (pParm.DataSource as IFeatureClass != null) { //Thread thread = new Thread(new ParameterizedThreadStart(IDataCheck.FeatureClassCheck)); //thread.SetApartmentState(ApartmentState.STA); //thread.Start(pParm); ThreadManager2.QueueUserWorkItem(new WaitCallback(IDataCheck.FeatureCheck), pParm, new WaitCallback(ThreadCallBack)); } //IDataCheck.DataCheckComplate += _BindTree; } } catch (Exception ex) { throw ex; } } void ThreadCallBack(object o) { CheckParametr result = o as CheckParametr; int oid = (result.DataSource as IFeature).OID; this.Dispatcher.Invoke(() => { //cavLoading.Visibility = Visibility.Collapsed; if (result.CheckResults != null) { _CheckInterface_InspectionCompleted(null, result); IEnumerable> gData = result.CheckResults.GroupBy(g => g.ObjectID); TreeNode rootNode = new TreeNode(); rootNode.Nodes = new System.Collections.ObjectModel.ObservableCollection(); foreach (var item in gData) { TreeNode subNode = new TreeNode();//树节点赋值属性 subNode.Name = "图斑:" + item.Key; subNode.Paixu = 0; subNode.IsExpanded = true; subNode.Data = item; subNode.Icon = "pack://application:,,,/Kingo.Plugin.DataCheck;component/Resources/自主图斑.png"; subNode.Nodes = new System.Collections.ObjectModel.ObservableCollection(); foreach (var err in item) { TreeNode childNodeItem = new TreeNode();//树节点赋值属性 childNodeItem.Name = err.Synopsis; childNodeItem.Tip = err.ErrorDesc; childNodeItem.Paixu = 0; childNodeItem.IsExpanded = true; childNodeItem.Data = item; childNodeItem.Icon = "pack://application:,,,/Kingo.Plugin.DataCheck;component/Resources/错误.png"; subNode.Nodes.Add(childNodeItem); } rootNode.Nodes.Add(subNode); } this.tvTypes.ItemsSource = null; this.tvTypes.ItemsSource = rootNode.Nodes; //IDataCheck.DataCheckComplate -= _BindTree; } }); } public void DataCheck(CheckParametr pParm) { try { IDataCheck = IdataChecks.FirstOrDefault(x => x.IDataCheckName == pParm.IDataCheckName); if (IDataCheck != null) { //IDataCheck.DataCheckComplate += (o) => //{ // if (o != null) // { // _CheckInterface_InspectionCompleted(o, pParm); // } //}; IDataCheck.DataCheckComplate += _CheckInterface_InspectionCompleted; if (pParm.DataSource as IFeature != null) { IDataCheck.FeatureCheck(pParm); } else if (pParm.DataSource as IFeatureClass != null) { IDataCheck.FeatureClassCheck(pParm); } IDataCheck.DataCheckComplate -= _CheckInterface_InspectionCompleted; } } catch (Exception ex) { throw ex; } } private void _BindTree(List dataCheckResults, CheckParametr pParm) { } void _CheckInterface_InspectionCompleted(List Result, CheckParametr pParm) { try { string dbPath = string.Empty; IFeature feature = pParm.DataSource as IFeature; try { //更新界面逻辑 ProjectInfo projectInfo = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo); dbPath = System.IO.Path.Combine(projectInfo.ProjDir, "DataCheckrResult.db"); SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, $"CREATE TABLE IF NOT exists DataCheckResults (`ID` INTEGER, `ErrorLayer` TEXT,`OBJECTID` TEXT,`ErrorType` TEXT,`ErrorCode` TEXT,`ErrorDesc` TEXT,`ErrorData` TEXT,`ErrorArea` TEXT,`ErrorMJ` NUMERIC,`Synopsis` TEXT,`ErrorCategory` TEXT ,PRIMARY KEY(`ID`))", null); if (feature != null) SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, $"delete from DataCheckResults WHERE OBJECTID='{feature.OID}' ;", null);//删除当前数据相关的核查结果 else SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, $"delete from DataCheckResults where ErrorLayer='{pParm.IDataCheckName}' and ErrorCategory='{pParm.CheckType}' ;", null); if (pParm.CheckResults == null) return; if (pParm.CheckResults.Count == 0) return; List sqlList = new List(); foreach (var item in pParm.CheckResults) { sqlList.Add(string.Format("INSERT INTO DataCheckResults (ErrorLayer,OBJECTID,ErrorType,ErrorCode,ErrorDesc,ErrorArea,Synopsis,ErrorCategory) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')", item.ErrorLayer, item.ObjectID, item.ErrorType, item.ErrorCode, item.ErrorDesc, item.ErrorArea, item.Synopsis, item.ErrorCategory)); } InsertSQLiteData(dbPath, sqlList); } catch (Exception ex) { LogAPI.Debug("批量插入SQLite数据(地址:" + dbPath + ") 执行失败,异常原因: " + ex.Message + " ; "); throw ex; } } catch (Exception ex) { throw ex; } } private void InsertSQLiteData(string dbPath, List sqlList) { try { using (System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection("Data Source=" + dbPath)) { conn.Open(); using (System.Data.SQLite.SQLiteTransaction pTrans = conn.BeginTransaction()) { using (System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand(conn)) { for (int i = 0; i < sqlList.Count(); i++) { cmd.CommandText = sqlList[i]; cmd.ExecuteNonQuery(); } pTrans.Commit(); } } conn.Close(); } } catch (Exception ex) { LogAPI.Debug("批量插入SQLite数据(地址:" + dbPath + ") 执行失败,异常原因: " + ex.Message + " ; "); return; } } private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e) { } private void Button_MouseEnter(object sender, MouseEventArgs e) { } private void win_MouseMove(object sender, MouseEventArgs e) { } private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { this.DragMove(); IsMove = true; } bool IsMove = false; private void Grid_MouseEnter(object sender, MouseEventArgs e) { //Storyboard sb = this.Resources["showDW2"] as Storyboard; //if (this.popContent.IsOpen && IsMove) //{ // IsMove = false; // sb = this.Resources["closeDW2"] as Storyboard; // this.BeginStoryboard(sb); // this.popContent.IsOpen = false; // return; //} //if (this.popContent.IsOpen) // return; ////IsErr = false; ////else ////{ //this.popContent.IsOpen = true;// !this.popContent.IsOpen; //popContent.HorizontalOffset = 0;// this.Width - detailGrid.ActualWidth; //System.Windows.Forms.Control panel = KGIS.Framework.Maps.MapsManager.Instance.MapService.getAxMapControl(); //System.Drawing.Point p = panel.Location; //System.Drawing.Point p2 = panel.PointToScreen(p); //if (this.Top - p2.Y < popContent.Height) //{ // popContent.VerticalOffset = this.Height - 10; // ((Canvas1.RenderTransform as System.Windows.Media.TransformGroup).Children[0] as System.Windows.Media.ScaleTransform).CenterY = 0; // //Canvas1.RenderTransform.Value = new System.Windows.Media.Matrix(0, 0, 0, 0, 0, 0); //} //else //{ // popContent.VerticalOffset = 10; // ((Canvas1.RenderTransform as System.Windows.Media.TransformGroup).Children[0] as System.Windows.Media.ScaleTransform).CenterY = popContent.Height; //} //if (this.Left - p2.X < popContent.Width) //{ // popContent.HorizontalOffset = this.Width - 10; // ((Canvas1.RenderTransform as System.Windows.Media.TransformGroup).Children[0] as System.Windows.Media.ScaleTransform).CenterX = 0; //} //else //{ // popContent.HorizontalOffset = 10; // ((Canvas1.RenderTransform as System.Windows.Media.TransformGroup).Children[0] as System.Windows.Media.ScaleTransform).CenterX = popContent.Width; //} //this.BeginStoryboard(sb); } private void Button_Click(object sender, RoutedEventArgs e) { this.Width = 240; this.Height = 300; Canvas1.Visibility = Visibility.Visible; Storyboard sb = this.Resources["showDW2"] as Storyboard; sb.Begin(); //this.DragMove(); //IsMove = true; } //} } }