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.
		
		
		
		
		
			
		
			
				
					
					
						
							373 lines
						
					
					
						
							17 KiB
						
					
					
				
			
		
		
	
	
							373 lines
						
					
					
						
							17 KiB
						
					
					
				using DevExpress.Xpf.Editors; | 
						|
using DevExpress.XtraGrid.Views.Grid; | 
						|
using ESRI.ArcGIS.Carto; | 
						|
using ESRI.ArcGIS.Controls; | 
						|
using ESRI.ArcGIS.esriSystem; | 
						|
using ESRI.ArcGIS.Geodatabase; | 
						|
using KGIS.Framework.AE; | 
						|
using KGIS.Framework.AE.GPHelper; | 
						|
using KGIS.Framework.Maps; | 
						|
using KGIS.Framework.OpenData.Control; | 
						|
using KGIS.Framework.OpenData.Filter; | 
						|
using KGIS.Framework.OpenData.InterFace; | 
						|
using KGIS.Framework.Utils; | 
						|
using KGIS.Framework.Utils.ExtensionMethod; | 
						|
using KGIS.Framework.Utils.Helper; | 
						|
using KUI.Windows; | 
						|
using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Data; | 
						|
using System.IO; | 
						|
using System.Linq; | 
						|
using System.Runtime.InteropServices; | 
						|
using System.Windows; | 
						|
using UIShell.OSGi; | 
						|
 | 
						|
namespace Kingo.Plugin.EngineEditor.View | 
						|
{ | 
						|
    public partial class UCSetAttribute : BaseWindow | 
						|
    { | 
						|
        private IHookHelper m_hookHelper;//获取地图控件和主窗体 | 
						|
        private Dictionary<string, IFeatureLayer> keys { get; set; } | 
						|
        private Dictionary<string, esriFieldType> keyValuePairs { get; set; } | 
						|
        public IFeatureClass ExternalFeatureClass { get; set; } | 
						|
        public UCSetAttribute(object Helpers) | 
						|
        { | 
						|
            InitializeComponent(); | 
						|
            try | 
						|
            { | 
						|
                if (this.m_hookHelper == null) | 
						|
                    this.m_hookHelper = Helpers as IHookHelper; | 
						|
                //获取当前工程中的全部图层 | 
						|
                List<IFeatureLayer> featureLayers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>(); | 
						|
                if (featureLayers != null && featureLayers.Count > 0) | 
						|
                { | 
						|
                    keys = new Dictionary<string, IFeatureLayer>(); | 
						|
                    foreach (IFeatureLayer iFeatureLayer in featureLayers) | 
						|
                    { | 
						|
                        if (!keys.ContainsKey(iFeatureLayer.Name)) | 
						|
                            keys.Add(iFeatureLayer.Name, iFeatureLayer); | 
						|
                    } | 
						|
                    targetName.ItemsSource = keys.Keys; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("UCSetAttribute异常:" + ex.Message); | 
						|
                LogAPI.Debug("UCSetAttribute异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #region 目标图层切换事件 | 
						|
        private void targetName_SelectionChanged(object sender, System.Windows.RoutedEventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (keys != null) | 
						|
                { | 
						|
                    IFeatureLayer featureLayer = keys[targetName.SelectedItem.ToTrim()]; | 
						|
                    if (featureLayer == null) return; | 
						|
                    IFields fields = featureLayer.FeatureClass.Fields; | 
						|
                    if (fields == null) return; | 
						|
                    keyValuePairs = new Dictionary<string, esriFieldType>(); | 
						|
                    for (int i = 0; i < fields.FieldCount; i++) | 
						|
                    { | 
						|
                        IField field = fields.Field[i]; | 
						|
                        if (field.Name.StartsWith("SHAPE") || field.Name == "OBJECTID" || field.Name.ToUpper().Equals("BSM")) continue; | 
						|
                        if (keyValuePairs.ContainsKey(field.Name)) continue; | 
						|
                        keyValuePairs.Add(field.Name, field.Type); | 
						|
                    } | 
						|
                    targetField.ItemsSource = keyValuePairs.Keys; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("targetName_SelectionChanged异常:" + ex.Message); | 
						|
                LogAPI.Debug("targetName_SelectionChanged异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        #region 目标字段切换事件 | 
						|
        private void targetField_SelectionChanged(object sender, System.Windows.RoutedEventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                //根据选择的属性,判断数据类型 | 
						|
                if (keyValuePairs == null) return; | 
						|
                esriFieldType esriFieldType = keyValuePairs[targetField.SelectedItem.ToTrim()]; | 
						|
                string strMask = string.Empty; | 
						|
                switch (targetField.SelectedItem.ToTrim()) | 
						|
                { | 
						|
                    case "KCXS": | 
						|
                        strMask = @"0|0\.\d{3}"; | 
						|
                        break; | 
						|
                } | 
						|
                if (!string.IsNullOrEmpty(strMask)) | 
						|
                { | 
						|
                    AttributeValue.Mask = strMask; | 
						|
                    AttributeValue.MaskType = MaskType.RegEx; | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    AttributeValue.MaskType = MaskType.None; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("targetField_SelectionChanged异常:" + ex.Message); | 
						|
                LogAPI.Debug("targetField_SelectionChanged异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        #region 关闭窗体事件 | 
						|
        private void BaseWindow_Closed(object sender, EventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                this.Close(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("BaseWindow_Closed异常:" + ex.Message); | 
						|
                LogAPI.Debug("BaseWindow_Closed异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        #region 选择外部数据 | 
						|
        private void btnExternalData_Click(object sender, System.Windows.RoutedEventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                OpenDataDialog pDialog = new OpenDataDialog(); | 
						|
                ISpatialDataObjectFilter pOFilter; | 
						|
                pOFilter = new FilterDatasetsAndLayers(); | 
						|
                pDialog.AddFilter(pOFilter, true); | 
						|
                pDialog.Title = "选择导入的数据"; | 
						|
                pDialog.AllowMultiSelect = false; | 
						|
                pDialog.RestoreLocation = true; | 
						|
                pDialog.StartLocation = pDialog.FinalLocation; | 
						|
                System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog(); | 
						|
                if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0) | 
						|
                { | 
						|
                    foreach (ISpatialDataObject distObj in pDialog.Selection) | 
						|
                    { | 
						|
                        if (distObj.DatasetType == esriDatasetType.esriDTFeatureClass) | 
						|
                        { | 
						|
                            ExternalFeatureClass = (distObj.DatasetName as IName).Open() as IFeatureClass; | 
						|
                            externalDataPath.Text = distObj.FullName; | 
						|
                            break; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("btnExternalData_Click异常:" + ex.Message); | 
						|
                LogAPI.Debug("btnExternalData_Click异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        #region 确定 | 
						|
        private void btnOK_Click(object sender, System.Windows.RoutedEventArgs e) | 
						|
        { | 
						|
            IFeatureCursor pCursor = null; | 
						|
            IFeature feature = null; | 
						|
            try | 
						|
            { | 
						|
                if (string.IsNullOrEmpty(targetName.SelectedItem.ToTrim())) | 
						|
                { | 
						|
                    MessageHelper.ShowTips("请选择目标图层!"); | 
						|
                    return; | 
						|
                } | 
						|
                if (string.IsNullOrEmpty(targetField.SelectedItem.ToTrim())) | 
						|
                { | 
						|
                    MessageHelper.ShowTips("请选择目标字段!"); | 
						|
                    return; | 
						|
                } | 
						|
                if (string.IsNullOrEmpty(AttributeValue.Text.ToTrim())) | 
						|
                { | 
						|
                    if (MessageHelper.ShowYesNoAndTips($"【{targetField.SelectedItem.ToTrim()}】字段设置为空?") != System.Windows.Forms.DialogResult.Yes) | 
						|
                        return; | 
						|
                } | 
						|
                if (string.IsNullOrEmpty(externalDataPath.Text.ToTrim())) | 
						|
                { | 
						|
                    MessageHelper.ShowTips("请选择要赋值的源图层数据!"); | 
						|
                    return; | 
						|
                } | 
						|
                if (ExternalFeatureClass == null) | 
						|
                { | 
						|
                    MessageHelper.ShowTips($"未能打开【{externalDataPath.Text.ToTrim()}】,请检查数据是否正确!"); | 
						|
                    return; | 
						|
                } | 
						|
                this.ShowLoading("正在进行批量赋值中........", 0, 0); | 
						|
                System.Threading.Thread.Sleep(1000); | 
						|
                IQueryFilter Tempfilter = new QueryFilterClass(); | 
						|
                if (isOnlyChangeSelectData.IsChecked == true) | 
						|
                { | 
						|
                    List<int> objectidList = GetSelectRowsOIDS(); | 
						|
                    if (objectidList.Count > 0) | 
						|
                    { | 
						|
                        Tempfilter.WhereClause = $"OBJECTID in ({string.Join(",", objectidList)}) "; | 
						|
                        if (MessageHelper.ShowYesNoAndTips($"当前选择行数为{objectidList.Count},将会操作赋值此数据,是否继续?") == System.Windows.Forms.DialogResult.No) | 
						|
                        { | 
						|
                            return; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                IFeatureLayer UpdatefeatureLayer = keys[targetName.SelectedItem.ToTrim()]; | 
						|
                var Externalcount = ExternalFeatureClass.FeatureCount(Tempfilter); | 
						|
                List<string> oids = new List<string>(); | 
						|
                IField field = UpdatefeatureLayer.FeatureClass.Fields.get_Field(UpdatefeatureLayer.FeatureClass.FindField(targetField.SelectedItem.ToTrim())); | 
						|
                if (field.Length < AttributeValue.Text.ToTrim().Length) | 
						|
                { | 
						|
                    this.CloseLoading(); | 
						|
                    MessageHelper.ShowError("当前值长度大于字段长度!"); | 
						|
                    return; | 
						|
                } | 
						|
                if (Externalcount <= 100) | 
						|
                { | 
						|
                    #region 用外部数据源的图形与要赋值的目标图层  数据量小的情况 | 
						|
                    pCursor = ExternalFeatureClass.Search(Tempfilter, true); | 
						|
                    while ((feature = pCursor.NextFeature()) != null) | 
						|
                    { | 
						|
                        var Identify2List = FeatureAPI.Identify2(feature.ShapeCopy, keys[targetName.SelectedItem.ToTrim()]); | 
						|
                        foreach (var item in Identify2List) | 
						|
                        { | 
						|
                            oids.Add(item.OID.ToTrim()); | 
						|
                        } | 
						|
                    } | 
						|
                    #endregion | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    #region 根据外部选择的数据源范围大小,数据量大小,可以使用GP工具 | 
						|
                    string gdbFileName = Guid.NewGuid().ToString().Replace("-", "") + ".gdb"; | 
						|
                    string gdbFolder = Directory.GetCurrentDirectory() + "\\Temp\\External"; | 
						|
                    if (!Directory.Exists(gdbFolder)) | 
						|
                        Directory.CreateDirectory(gdbFolder); | 
						|
                    PluginServiceInterface.CommonHelper.DelectDir(gdbFolder); | 
						|
                    string path = System.IO.Path.Combine(gdbFolder, gdbFileName); | 
						|
                    IWorkspaceFactory pFtWsFct = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactory(); | 
						|
                    IWorkspaceName workspaceName = pFtWsFct.Create(gdbFolder, gdbFileName, null, 0); | 
						|
                    #endregion | 
						|
                    IFeatureLayer FeatureLayer = null; | 
						|
                    GPParamClass gPParamClass = new GPParamClass | 
						|
                    { | 
						|
                        FirstFeatureLayer = UpdatefeatureLayer, | 
						|
                        SecondFeatureLayer = new FeatureLayer() { FeatureClass = ExternalFeatureClass }, | 
						|
                        OutFeatureClassPath = path + "\\" + "External", | 
						|
                        IsGetOutPutFeature = true | 
						|
                    }; | 
						|
                    GeoprocessorHelper.IntersectAnalysis(gPParamClass, ref FeatureLayer); | 
						|
                    pCursor = FeatureLayer.Search(Tempfilter, true); | 
						|
                    var fid = FeatureLayer.FeatureClass.FindField($"FID_{(UpdatefeatureLayer.FeatureClass as FeatureClass).Name}"); | 
						|
                    while ((feature = pCursor.NextFeature()) != null) | 
						|
                    { | 
						|
                        if (fid != -1) | 
						|
                            oids.Add(feature.Value[fid].ToTrim()); | 
						|
                    } | 
						|
                } | 
						|
                string stroid = string.Join(",", oids); | 
						|
                if (string.IsNullOrWhiteSpace(stroid)) | 
						|
                { | 
						|
                    MessageHelper.ShowTips("赋值失败,当前图层数据间无相交关系,请核对数据是否正确!"); | 
						|
                    return; | 
						|
                } | 
						|
                string sql = string.Empty; | 
						|
                try | 
						|
                { | 
						|
                    string strsetsql = string.IsNullOrEmpty(AttributeValue.Text.ToTrim()) || AttributeValue.Text.ToTrim().ToUpper() == "NULL" ? $"{targetField.SelectedItem.ToTrim()} =null " : $"{targetField.SelectedItem.ToTrim()} ='{AttributeValue.Text.ToTrim()}' "; | 
						|
                    sql = $"Update {(UpdatefeatureLayer.FeatureClass as FeatureClass).Name} set {strsetsql} where OBJECTID in ({stroid}) "; | 
						|
                    (keys[targetName.SelectedItem.ToTrim()].FeatureClass as FeatureClass).Workspace.ExecuteSQL(sql); | 
						|
                } | 
						|
                catch (Exception) | 
						|
                { | 
						|
                    string strsetsql = string.IsNullOrEmpty(AttributeValue.Text.ToTrim()) || AttributeValue.Text.ToTrim().ToUpper() == "NULL" ? $"{targetField.SelectedItem.ToTrim()} =null " : $"{targetField.SelectedItem.ToTrim()} ={AttributeValue.Text.ToTrim()}"; | 
						|
                    sql = $"Update {(UpdatefeatureLayer.FeatureClass as FeatureClass).Name} set {strsetsql} where OBJECTID in ({stroid}) "; | 
						|
                    (keys[targetName.SelectedItem.ToTrim()].FeatureClass as FeatureClass).Workspace.ExecuteSQL(sql); | 
						|
                } | 
						|
                this.CloseLoading(); | 
						|
                MessageHelper.ShowTips("属性赋值完成!"); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                this.CloseLoading(); | 
						|
                LogAPI.Debug("btnOK_Click异常:" + ex.Message); | 
						|
                LogAPI.Debug("btnOK_Click异常:" + ex.StackTrace); | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                this.CloseLoading(); | 
						|
                if (feature != null) | 
						|
                    Marshal.ReleaseComObject(feature); | 
						|
                if (pCursor != null) | 
						|
                    Marshal.ReleaseComObject(pCursor); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
        private List<int> GetSelectRowsOIDS() | 
						|
        { | 
						|
            List<int> vsTemp = new List<int>(); | 
						|
            try | 
						|
            { | 
						|
                PluginServiceInterface.IAttrViewsHelper attrViewsHelper = BundleRuntime.Instance.GetFirstOrDefaultService<PluginServiceInterface.IAttrViewsHelper>(); | 
						|
                if (attrViewsHelper == null) return vsTemp; | 
						|
                List<PluginServiceInterface.IAttrTableView> attrTableViews = attrViewsHelper.GetAllPanel(); | 
						|
                if (attrTableViews == null) return vsTemp; | 
						|
                PluginServiceInterface.IAttrTableView uCAttribute_Form = null; | 
						|
                int index = 0; | 
						|
                string title = ""; | 
						|
                for (int i = 0; i < attrTableViews.Count; i++) | 
						|
                { | 
						|
                    title = attrTableViews[i].Title; | 
						|
                    if (title.Contains("属性表_")) | 
						|
                        title = title.Replace("属性表_", ""); | 
						|
                    if (title == targetName.SelectedItem.ToTrim()) | 
						|
                    { | 
						|
                        index = i; | 
						|
                        uCAttribute_Form = attrTableViews[i]; | 
						|
                        break; | 
						|
                    } | 
						|
                } | 
						|
                if (uCAttribute_Form == null) return vsTemp; | 
						|
                GridView gridView = uCAttribute_Form.GetGridView(); | 
						|
                if (gridView == null) return vsTemp; | 
						|
                int[] SelectR = gridView.GetSelectedRows(); | 
						|
                int objectid = -1; | 
						|
                DataTable tempDT = (gridView.DataSource as DataView).Table as DataTable; | 
						|
                if (tempDT == null) return vsTemp; | 
						|
                foreach (var item in SelectR) | 
						|
                { | 
						|
                    int idx = gridView.ViewRowHandleToDataSourceIndex(item); | 
						|
                    objectid = Convert.ToInt32(tempDT.Rows[idx][tempDT.Columns[0]].ToString()); | 
						|
                    vsTemp.Add(objectid); | 
						|
                } | 
						|
                return vsTemp; | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("GetSelectRowsOIDS异常:" + ex.Message); | 
						|
                LogAPI.Debug("GetSelectRowsOIDS异常:" + ex.StackTrace); | 
						|
                return vsTemp; | 
						|
            } | 
						|
        } | 
						|
        #region 取消 | 
						|
        private void btnCancel1_Click(object sender, System.Windows.RoutedEventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                this.Close(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("btnCancel1_Click异常:" + ex.Message); | 
						|
                LogAPI.Debug("btnCancel1_Click异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
    } | 
						|
 | 
						|
}
 | 
						|
 |