年度变更建库软件5.0版本
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.
 
 

313 lines
14 KiB

using DevExpress.Xpf.Editors;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.AE;
using KGIS.Framework.AE.Enum;
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 System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows;
using KUI.Windows;
using KGIS.Framework.Utils.Helper;
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()))
{
MessageBox.Show("请选择目标图层.", "提示信息", MessageBoxButton.OK);
return;
}
if (string.IsNullOrEmpty(targetField.SelectedItem.ToTrim()))
{
MessageBox.Show("请选择目标字段.", "提示信息", MessageBoxButton.OK);
return;
}
if (string.IsNullOrEmpty(AttributeValue.Text.ToTrim()))
{
MessageBoxResult result = MessageBox.Show($"【{targetField.SelectedItem.ToTrim()}】字段设置为空?", "提示信息", MessageBoxButton.YesNoCancel);
if (result != MessageBoxResult.Yes)
return;
}
if (string.IsNullOrEmpty(externalDataPath.Text.ToTrim()))
{
MessageBox.Show("请选择要赋值的源图层数据.", "提示信息", MessageBoxButton.OK);
return;
}
if (ExternalFeatureClass == null)
{
MessageBox.Show($"未能打开【{externalDataPath.Text.ToTrim()}】,请检查数据是否正确.", "提示信息", MessageBoxButton.OK);
return;
}
this.ShowLoading("正在进行批量赋值中........", 0, 0);
System.Threading.Thread.Sleep(1000);
IFeatureLayer UpdatefeatureLayer = keys[targetName.SelectedItem.ToTrim()];
var Externalcount = ExternalFeatureClass.FeatureCount(null);
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(null, 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(null, 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))
{
MessageBox.Show($"赋值失败,当前图层数据间无相交关系,请核对数据是否正确", "提示信息", MessageBoxButton.OK);
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();
MessageBox.Show($"属性赋值完成.", "提示信息", MessageBoxButton.OK);
}
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
#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
}
}