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

1301 lines
58 KiB

6 months ago
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.AE;
using KGIS.Framework.OpenData.Control;
using KGIS.Framework.OpenData.Filter;
using KGIS.Framework.OpenData.InterFace;
using Kingo.OpenData.Filter;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Windows;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using KGIS.Framework.Maps;
using Path = System.IO.Path;
using KGIS.Framework.Platform;
using Kingo.PluginServiceInterface;
using KGIS.Framework.AE.Enum;
using UIShell.OSGi;
using KGIS.Framework.DBOperator;
using System.Data;
using KGIS.Framework.Utils.Utility;
using KUI.Windows;
using System.Runtime.InteropServices;
using Kingo.PluginServiceInterface.Helper.VCT;
using Kingo.PluginServiceInterface.Model;
namespace Kingo.Plugin.DataLoad.View
{
/// <summary>
/// 参考数据加载 的交互逻辑
/// </summary>
public partial class FrmLoadOtherData : BaseWindow
{
private IDataCatalogService _DataCatalog = null;
public bool shutDown = false;
/// <summary>
/// 导入数据类型(mdb文件为空,Shape文件为Shape)
/// </summary>
public string ImportDataType { get; set; }
private List<IFeatureClass> pSourceFCList;
private string TargetGDBPath = string.Empty;
private string SourceMDBPath { get; set; }
/// <summary>
/// 拷贝参考数据路径
/// </summary>
private string TempFinalLocation { get; set; }
private List<ISpatialDataObject> TempSelection { get; set; }
/// <summary>
/// 当前工程参考数据路径
/// </summary>
private string projectOtherDataPath = string.Empty;
public FrmLoadOtherData()
{
InitializeComponent();
if (_DataCatalog == null)
_DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService<IDataCatalogService>();
BindOtherDataPath();
//隐藏复选框
cbCopyBaseData.Height = 0;
}
#region 最新数据加载
private void BindOtherDataPath()
{
try
{
IWorkCatalog workCatalog = BundleRuntime.Instance.GetFirstOrDefaultService<IWorkCatalog>();
string code = (MapsManager.Instance.CurrProjectInfo as ProjectInfo).CODE;
string xzqmc = GetXZQMC(code);
string xzqDir = string.Format("{0}({1})", xzqmc, code);
if (workCatalog != null && !string.IsNullOrWhiteSpace(code))
{
string projectPath = Path.Combine(workCatalog.SaveWorkSapcePath, xzqDir, "参考数据");
if (Directory.Exists(projectPath))
{
List<string> dataPathList = new List<string>();
GetOtherDataPath(projectPath, dataPathList);
if (dataPathList.Count != 0)
{
this.cobDataBase.ItemsSource = dataPathList;
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug("获取参考数据文件失败:" + ex);
MessageHelper.Show("获取参考数据文件失败:" + ex);
}
}
private string GetXZQMC(string xzqdm)
{
string xzqmc = string.Empty;
KGIS.Framework.DBOperator.IRDBHelper rdbHelper = null;
try
{
string systemPath = SysAppPath.GetDataBasePath() + "System.mdb";
if (File.Exists(systemPath))
{
string connStr = SysConfigsOprator.GetDBConnectionByName("MDBOledbConnection");
connStr = string.Format(connStr, systemPath);
rdbHelper = RDBFactory.CreateDbHelper(connStr, DatabaseType.MSAccess);
//string strSQL = "select OBJECTID AS ID, XZQ AS CODE,XZQMC AS NAME from XZQ Where XZQ LIKE '" + xzqdm + "%'";
string strSQL = string.Format("select OBJECTID AS ID, XZQ AS CODE,XZQMC AS NAME from XZQ Where XZQ = '{0}'", xzqdm);
DataTable dt = rdbHelper.ExecuteDatatable("Dic", strSQL, true);
if (dt != null)
{
List<DataDicTionary> xzqCoderesult = TBToList.ToList<DataDicTionary>(dt);
foreach (var item in xzqCoderesult)
{
if (dt.Rows.Count == 1)
xzqmc = item.NAME;
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
finally
{
if (rdbHelper != null)
rdbHelper.DisConnect();
}
return xzqmc;
}
private void GetOtherDataPath(string dirPath, List<string> pathList)
{
try
{
string[] dirArr = Directory.GetDirectories(dirPath);
string[] fileArr = Directory.GetFiles(dirPath);
// 遍历所有文件
if (fileArr.Length > 0)
{
string fileName;
foreach (string file in fileArr)
{
fileName = Path.GetFileName(file);
if ((fileName.ToLower().Contains(".vct") || fileName.ToLower().Contains(".mdb")) && !pathList.Contains(file))
{
pathList.Add(file);
}
}
}
// 遍历所有文件夹
if (dirArr.Length > 0)
{
string folderName;
foreach (string dir in dirArr)
{
folderName = Path.GetFileName(dir);
if (folderName.ToLower().Contains(".gdb") && !pathList.Contains(dir))
{
pathList.Add(dir);
}
GetOtherDataPath(dir, pathList);
}
}
}
catch (Exception ex)
{
LogAPI.Debug("获取参考数据文件失败:" + ex);
}
}
/// <summary>
/// 文件路径加载切换事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CobDataBase_SelectedIndexChanged(object sender, RoutedEventArgs e)
{
if (this.cobDataBase.ItemsSource != null)
{
try
{
IFeatureClass pSourceFeatureClass = null;
if (this.cobDataBase.SelectedItem == null) return;
string selectedPath = this.cobDataBase.SelectedItem.ToString();
using (ComReleaser com = new ComReleaser())
{
IWorkspaceFactory pWorkspaceFactory = null;
IWorkspace pWorkspace = null;
IFeatureWorkspace pFeatureWorkspace = null;
if (string.IsNullOrWhiteSpace(ImportDataType))
ImportDataType = Path.GetExtension(selectedPath).ToUpper().Replace('.', ' ').TrimStart();
this.ShowLoading("正在打开数据文件...", 0, 0);
System.Threading.Thread.Sleep(1000);
string fileName = string.Empty;
if (string.IsNullOrWhiteSpace(ImportDataType))
{
ImportDataType = "Shape";
List<string> shpPathList = new List<string>();
if (shpPathList.Count == 0)
{
(this.cobDataBase.ItemsSource as List<string>).Remove(selectedPath);
this.cobDataBase.RefreshData();
MessageHelper.ShowError("当前路径错误,请重新选择!");
return;
}
if (Directory.Exists(selectedPath))
{
string[] fileArr = Directory.GetFiles(selectedPath);
// 遍历所有文件
if (fileArr.Length > 0)
{
foreach (string file in fileArr)
{
string extension = Path.GetExtension(file);
if (extension.ToLower() == ".shp" && !shpPathList.Contains(file))
{
shpPathList.Add(file);
}
}
}
pSourceFCList = new List<IFeatureClass>();
for (int i = 0; i < shpPathList.Count; i++)
{
pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
pWorkspace = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(shpPathList[i]), 0);
pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
string name = Path.GetFileName(shpPathList[i]);
pSourceFeatureClass = pFeatureWorkspace.OpenFeatureClass(name);
pSourceFCList.Add(pSourceFeatureClass);
fileName += name + ";";
}
if (pSourceFCList.Count > 0)
{
SetShapeTableMapping();
}
}
}
else if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape") && pSourceFCList.Count != 0)
{
SetShapeTableMapping();
}
else if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("VCT"))
{
string TempMDBFolderPath = Path.GetTempPath();
string TempMDBPath = Path.Combine(TempMDBFolderPath, string.Format("{0}.mdb", Path.GetFileNameWithoutExtension(selectedPath)));
if (File.Exists(TempMDBPath))
{
File.Delete(TempMDBPath);
}
this.ShowLoading("正在解析VCT文件... ...", 0, 0);
VCTToMDBHelper3 vcttomdb = new VCTToMDBHelper3();
vcttomdb.RootPath = TempMDBFolderPath;
vcttomdb.VCTToMDB(selectedPath);
this.CloseLoading();
if (!File.Exists(TempMDBPath))
{
MessageHelper.ShowError("VCT文件解析失败");
return;
}
SourceMDBPath = TempMDBPath;
SetTableMapping();
}
else
{
SetTableMapping();
}
this.CloseLoading();
com.ManageLifetime(pWorkspaceFactory);
com.ManageLifetime(pWorkspace);
com.ManageLifetime(pFeatureWorkspace);
}
}
catch (Exception ex)
{
LogAPI.Debug("选择参考数据库失败:" + ex);
this.CloseLoading();
MessageHelper.Show("选择参考数据库失败:" + ex);
}
finally
{
this.CloseLoading();
}
}
}
private void SetTableMapping()
{
IWorkspaceAPI t_WsAPI = null;
IWorkspaceAPI s_WsAPI = null;
IFeatureClassAPI s_FCAPI = null;
try
{
dgTableMapping.ItemsSource = null;
string s_MdbPath = null;
if (ImportDataType == "VCT")
{
s_MdbPath = SourceMDBPath;
}
else
{
if (this.cobDataBase.SelectedItem != null)
s_MdbPath = this.cobDataBase.SelectedItem.ToString();
}
if ((ImportDataType == "MDB" || ImportDataType == "VCT") && !File.Exists(s_MdbPath))
{
this.CloseLoading();
MessageHelper.ShowTips("请确保文件存在,并且为mdb文件!");
return;
}
else if (ImportDataType == "GDB" && !Directory.Exists(s_MdbPath))
{
this.CloseLoading();
MessageHelper.ShowTips("请确保GDB文件夹存在!");
return;
}
if (ImportDataType == "MDB" || ImportDataType == "VCT")
{
FileInfo s_MdbPathInfo = new FileInfo(s_MdbPath);
if (!s_MdbPathInfo.Extension.Equals(".mdb"))
{
this.CloseLoading();
MessageHelper.ShowTips("必须为mdb文件才能进行导入!");
return;
}
}
if (ImportDataType == "MDB" || ImportDataType == "VCT")
{
s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile);
}
else if (ImportDataType == "GDB" && Directory.Exists(s_MdbPath))
{
s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile);
}
else if (!Directory.Exists(s_MdbPath) && !File.Exists(s_MdbPath))
{
return;
}
List<KeyAndValue> s_TbList = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset).Where(x => !x.Value.StartsWith("TDQSQ") && !x.Value.StartsWith("JC_CZCDYD")).Select(x => new KeyAndValue() { S_Key = x.Key, S_Value = x.Value }).ToList();//周旺华 0424 排除TDQSQ导致的导入问题
Dictionary<string, string> s_TbList2 = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureClass);
Dictionary<string, string> s_TbList3 = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTTable);
foreach (string item in s_TbList2.Keys)
{
if (!s_TbList.Select(x => x.S_Value).Contains(item))
s_TbList.Add(new KeyAndValue() { S_Key = item, S_Value = s_TbList2[item] });
}
if (s_TbList != null)
{
List<TableMapping> MappingList = new List<TableMapping>();
foreach (string key in s_TbList.Select(x => x.S_Key))
{
var s_keyvalue = s_TbList.FirstOrDefault(x => x.S_Key == key).S_Value;
TableMapping mapping = new TableMapping();
mapping.State = TBState.Waiting;
mapping.S_TableName = s_keyvalue;
mapping.S_TableAliasName = key;
if (s_TbList3.Values.Contains(mapping.S_TableName))
{
mapping.S_TableType = "Table";
}
else
{
s_FCAPI = s_WsAPI.OpenFeatureClass(s_keyvalue);
mapping.S_Spatial = (s_FCAPI.FeatureClass as IGeoDataset).SpatialReference.Name;
mapping.S_TableType = s_FCAPI.FeatureClass.ShapeType.ToString();
s_FCAPI.CloseFeatureClass();
}
mapping.T_TableName = s_keyvalue;
mapping.T_TableAliasName = key;
MappingList.Add(mapping);
}
dgTableMapping.ItemsSource = MappingList;
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
MessageHelper.ShowTips(ex.Message);
}
finally
{
if (s_WsAPI != null)
s_WsAPI.CloseWorkspace();
if (t_WsAPI != null)
t_WsAPI.CloseWorkspace();
if (s_FCAPI != null)
{
s_FCAPI.CloseFeatureClass();
s_FCAPI = null;
}
}
}
private void SetShapeTableMapping()
{
try
{
dgTableMapping.ItemsSource = null;
List<TableMapping> MappingList = new List<TableMapping>();
foreach (IFeatureClass pSourceFeatureClass in pSourceFCList)
{
//pSourceFeatureClass.CheckArea();
TableMapping mapping = new TableMapping();
mapping.State = TBState.Waiting;
mapping.S_TableName = (pSourceFeatureClass as FeatureClass).Name;
mapping.S_TableAliasName = pSourceFeatureClass.AliasName;
mapping.S_Spatial = (pSourceFeatureClass as IGeoDataset).SpatialReference.Name;
mapping.S_TableType = pSourceFeatureClass.ShapeType.ToString();
mapping.T_TableName = (pSourceFeatureClass as FeatureClass).Name;
mapping.T_TableAliasName = pSourceFeatureClass.AliasName;
mapping.S_TableType = pSourceFeatureClass.ShapeType.ToString();
MappingList.Add(mapping);
}
dgTableMapping.ItemsSource = MappingList;
//JudgeIsTheSameSpatialReference();
}
catch (Exception ex)
{
LogAPI.Debug(ex);
MessageHelper.ShowTips(ex.Message);
}
}
/// <summary>
/// 重置导入
/// </summary>
public void ResetImport()
{
try
{
//将选中的数据源地址清空
this.cobDataBase.SelectedItem = null;
//将映射关系置空
if (dgTableMapping != null)
{
if (dgTableMapping.ItemsSource != null)
{
dgTableMapping.ItemsSource = null;
}
dgTableMapping.UnselectAll();
dgTableMapping.RefreshData();
}
}
catch (Exception ex)
{
LogAPI.Debug("重置 " + ImportDataType + " 的导入失败,异常原因: " + ex + " ; ");
}
}
/// <summary>
/// 全选和反选事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chkSelectedAll_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
{
try
{
if (this.dgTableMapping == null || (dgTableMapping.ItemsSource as List<TableMapping>) == null)
{
return;
}
List<TableMapping> listTableMapping = (dgTableMapping.ItemsSource as List<TableMapping>);
bool check = (sender as DevExpress.Xpf.Editors.CheckEdit).IsChecked == null ? false : bool.Parse((sender as DevExpress.Xpf.Editors.CheckEdit).IsChecked.Value.ToString());
if (check)
{
listTableMapping.ForEach(x => x.State = TBState.Waiting);
}
else
{
listTableMapping.ForEach(x => x.State = TBState.Delete);
}
dgTableMapping.RefreshData();
}
catch (Exception ex)
{
MessageHelper.ShowTips("全选发生异常:" + ex.Message);
}
}
private void BtnLoad_Click(object sender, RoutedEventArgs e)
{
try
{
//外部数据拷贝至工作目录参考数据文件夹
if (this.cbCopyBaseData.IsChecked == true && TempSelection != null)
{
IWorkCatalog workCatalog = BundleRuntime.Instance.GetFirstOrDefaultService<IWorkCatalog>();
string code = (MapsManager.Instance.CurrProjectInfo as ProjectInfo).CODE;
string xzqmc = GetXZQMC(code);
string xzqDir = string.Format("{0}({1})", xzqmc, code);
if (workCatalog != null && !string.IsNullOrWhiteSpace(code))
{
projectOtherDataPath = Path.Combine(workCatalog.SaveWorkSapcePath, xzqDir, "参考数据");
if (!Directory.Exists(projectOtherDataPath))
Directory.CreateDirectory(projectOtherDataPath);
if (ImportDataType == "GDB")
{
DirectoryCopy(TempFinalLocation, projectOtherDataPath);
}
else
{
for (int i = 0; i < TempSelection.Count; i++)
{
string name = Path.GetFileName(TempSelection[i].FullName);
string nameWithoutExtension = Path.GetFileNameWithoutExtension(TempSelection[i].FullName);
if (ImportDataType == "SHP")
{
string shpDir = Path.GetDirectoryName(TempSelection[i].FullName);
string[] fileArr = Directory.GetFiles(shpDir);
for (int j = 0; j < fileArr.Length; j++)
{
string name2 = Path.GetFileName(fileArr[j]);
string name2WithoutExtension = Path.GetFileNameWithoutExtension(fileArr[j]);
if (nameWithoutExtension == name2WithoutExtension)
File.Copy(fileArr[j], projectOtherDataPath + "\\" + name2, true);
}
}
else
{
File.Copy(TempSelection[i].FullName, projectOtherDataPath + "\\" + name, true);
}
}
}
}
}
if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape"))
{
LoadShpData();
}
else
{
LoadData();
}
//刷新视图
//Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "RefreshLayer" });
}
catch (Exception ex)
{
MessageHelper.ShowError(ex.Message);
LogAPI.Debug(ex);
}
}
private void LoadData()
{
this.btnLoad.IsEnabled = false;
List<TableMapping> mapping = dgTableMapping.ItemsSource as List<TableMapping>;
IWorkspaceAPI pSourceWsAPI = null;
try
{
if (this.cobDataBase.SelectedItem == null)
{
MessageHelper.ShowTips("请先选择要导入的参考数据!");
return;
}
else
{
if (ImportDataType == "GDB")
{
if ((Directory.Exists(this.cobDataBase.SelectedItem.ToString()) == false) || this.cobDataBase.SelectedItem.ToString().ToLower().EndsWith(".gdb") == false)
{
MessageHelper.ShowTips("无效的 " + ImportDataType + " 数据源");
this.cobDataBase.SelectedItem = null;
return;
}
}
else//MDB/VCT/DCSJ
{
if (File.Exists(this.cobDataBase.SelectedItem.ToString()) == false)
{
MessageHelper.ShowTips("无效的 " + ImportDataType + " 数据源");
this.cobDataBase.SelectedItem = null;
return;
}
}
}
string s_MdbPath = null;
if (ImportDataType == "VCT")
{
s_MdbPath = SourceMDBPath;
}
else if (this.cobDataBase.SelectedItem != null)
{
s_MdbPath = this.cobDataBase.SelectedItem.ToString();
}
if (string.IsNullOrWhiteSpace(s_MdbPath)) return;
if (ImportDataType == "MDB" || ImportDataType == "VCT" || ImportDataType == "DCSJ")
{
if (!File.Exists(s_MdbPath)) return;
pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile);
}
else
{
if (!Directory.Exists(s_MdbPath)) return;
pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile);
}
if (mapping != null)
{
//循环导入要素类
string message = string.Empty;
string errorMessage = string.Empty;
int SuccessImportLayerCount = 0;
int DeletedImportLayerCount = 0;
int FailImportLayerCount = 0;
ILayer layer = MapsManager.Instance.MapService.GetGroupLayer("CKSJ");//获取参考数据图层组
LayerCfg GroupLayerInfo = null;
if (_DataCatalog != null)
{
_DataCatalog.GetNodeByLayer(layer);
LayerCfg rootLayer = _DataCatalog.CurrentLayers as LayerCfg;
List<LayerCfg> AllLayers = rootLayer.GetAllItem();
GroupLayerInfo = AllLayers.FirstOrDefault(f => f.LayerName == layer.Name);
}
foreach (TableMapping table in mapping)
{
if (shutDown)
{
return;
}
if (table.State == TBState.Delete) continue;
if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null" || string.IsNullOrWhiteSpace(table.T_TableAliasName))
continue;
dgTableMapping.SelectedItem = table;
dgTableMapping.View.ScrollIntoView(dgTableMapping.SelectedItem);
System.Windows.Forms.Application.DoEvents();
table.State = TBState.BeingImport;
if (AddLayerToMap(GroupLayerInfo, table, pSourceWsAPI, ref message, ref errorMessage, ref FailImportLayerCount))
{
table.State = TBState.EndImport;
SuccessImportLayerCount++;
}
else
{
table.State = TBState.Delete;
DeletedImportLayerCount++;
}
}
if (_DataCatalog != null)
{
if (GroupLayerInfo.Layers.Count > 0)
GroupLayerInfo.Expanded = true;//添加数据时展开
_DataCatalog.UpdateTree();
}
if (!string.IsNullOrWhiteSpace(errorMessage))
{
int TotalImportLayerCount = SuccessImportLayerCount + DeletedImportLayerCount + FailImportLayerCount;
errorMessage = string.Format("共导入{0}个图层,成功{1}个,删除{2}个,失败{3}个。", TotalImportLayerCount, SuccessImportLayerCount,
DeletedImportLayerCount, FailImportLayerCount) + errorMessage;
MessageHelper.Show(errorMessage, true);
}
else
{
int TotalImportLayerCount = SuccessImportLayerCount + DeletedImportLayerCount + FailImportLayerCount;
message = string.Format("共导入{0}个图层,成功{1}个,删除{2}个,失败{3}个。", TotalImportLayerCount, SuccessImportLayerCount,
DeletedImportLayerCount, FailImportLayerCount) + message;
MessageHelper.Show(message, true);
}
Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "SaveProject" });
//这里设置关闭
this.Close();
}
}
catch (Exception ex)
{
LogAPI.Debug("导入 " + ImportDataType + " 数据时失败,异常原因: " + ex + " ; ");
}
finally
{
this.btnLoad.IsEnabled = true;
if (pSourceWsAPI != null)
{
pSourceWsAPI.CloseWorkspace();
}
if (mapping != null && mapping.Count() > 0)
{
mapping = null;
}
}
}
private void LoadShpData()
{
try
{
string str = "1234567890";
if (dgTableMapping.ItemsSource is List<TableMapping> mapping)
{
//循环导入要素类
string message = string.Empty;
string errorMessage = string.Empty;
int SuccessImportLayerCount = 0;
int DeletedImportLayerCount = 0;
int FailImportLayerCount = 0;
ILayer layer = MapsManager.Instance.MapService.GetGroupLayer("CKSJ");//获取参考数据图层组
LayerCfg GroupLayerInfo = null;
if (_DataCatalog != null)
{
_DataCatalog.GetNodeByLayer(layer);
LayerCfg rootLayer = _DataCatalog.CurrentLayers as LayerCfg;
List<LayerCfg> AllLayers = rootLayer.GetAllItem();
GroupLayerInfo = AllLayers.FirstOrDefault(f => f.LayerName == layer.Name);
}
foreach (TableMapping table in mapping)
{
//增加控制,以数字开头的图层不能追加到当前工程。对应bug11125
if (str.Contains(table.S_TableName.Substring(0, 1)) && table.T_TableName == "Add")
{
MessageHelper.ShowTips("以数字开头的图层不能追加到当前工程!");
return;
}
if (shutDown)
{
break;
}
if (table.State == TBState.Delete)
continue;
if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null" || string.IsNullOrWhiteSpace(table.T_TableAliasName))
continue;
dgTableMapping.SelectedItem = table;
dgTableMapping.View.ScrollIntoView(dgTableMapping.SelectedItem);
System.Windows.Forms.Application.DoEvents();
table.State = TBState.BeingImport;
if (AddShpToMap(GroupLayerInfo, table, ref message, ref errorMessage, ref FailImportLayerCount))
{
table.State = TBState.EndImport;
SuccessImportLayerCount++;
}
else
{
table.State = TBState.Delete;
SuccessImportLayerCount++;
}
}
if (_DataCatalog != null)
{
if (GroupLayerInfo.Layers.Count > 0)
GroupLayerInfo.Expanded = true;
_DataCatalog.UpdateTree();
}
MapsManager.Instance.MapService.getAxMapControl().Refresh();
if (!string.IsNullOrWhiteSpace(errorMessage))
{
int TotalImportLayerCount = SuccessImportLayerCount + DeletedImportLayerCount + FailImportLayerCount;
errorMessage = string.Format("共导入{0}个图层,成功{1}个,删除{2}个,失败{3}个。", TotalImportLayerCount, SuccessImportLayerCount,
DeletedImportLayerCount, FailImportLayerCount) + errorMessage;
MessageHelper.Show(errorMessage, true);
}
else
{
int TotalImportLayerCount = SuccessImportLayerCount + DeletedImportLayerCount + FailImportLayerCount;
message = string.Format("共导入{0}个图层,成功{1}个,删除{2}个,失败{3}个。", TotalImportLayerCount, SuccessImportLayerCount,
DeletedImportLayerCount, FailImportLayerCount) + message;
MessageHelper.Show(message, true);
}
Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "SaveProject" });
//这里设置关闭
this.Close();
}
else
{
if (this.cobDataBase.SelectedItem == null)
{
MessageHelper.ShowTips("请先选择 Shape 数据源");
}
else
{
string s_MdbPath_T2 = this.cobDataBase.SelectedItem.ToString();
if (string.IsNullOrWhiteSpace(s_MdbPath_T2) == true)
{
MessageHelper.ShowTips("请先选择 Shape 数据源");
}
else
{
if (Directory.Exists(s_MdbPath_T2) == false)
{
MessageHelper.ShowTips("选择的 Shape 数据源不存在");
(this.cobDataBase.ItemsSource as List<string>).Remove(s_MdbPath_T2);// = null;
this.cobDataBase.RefreshData();
}
else
{
//判断目录下有没有shape文件
string[] strFiles = Directory.GetFiles(s_MdbPath_T2);
int iFileDirs = strFiles.Count();
List<string> ShapeFileNameList = strFiles.ToList();
if (ShapeFileNameList == null || ShapeFileNameList.Count <= 0)
{
MessageHelper.ShowTips("Shape 数据源不能为空");
(this.cobDataBase.ItemsSource as List<string>).Remove(s_MdbPath_T2);// = null;
this.cobDataBase.RefreshData();
}
else
{
bool bHaveShp = false;
foreach (string strFile in strFiles)
{
if (strFile.ToLower().EndsWith(".shp") == true)
{
bHaveShp = true;
break;
}
}
if (bHaveShp == false)
{
MessageHelper.ShowTips("Shape 数据源不能为空");
(this.cobDataBase.ItemsSource as List<string>).Remove(s_MdbPath_T2);// = null;
this.cobDataBase.RefreshData();
}
}
}
}
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (pSourceFCList != null && pSourceFCList.Count > 0)
{
using (ESRI.ArcGIS.ADF.ComReleaser com = new ComReleaser())
{
foreach (IFeatureClass item in pSourceFCList)
{
com.ManageLifetime(item);
}
}
}
this.CloseLoading();
}
}
private bool AddLayerToMap(LayerCfg cksjGroupLayer, TableMapping pTbMaping, IWorkspaceAPI pSourceWsAPI, ref string message, ref string errorMessage, ref int FailImportLayerCount)
{
if (pSourceWsAPI == null || pSourceWsAPI.CurrentWorkspace == null || cksjGroupLayer == null)
return false;
IFeatureClassAPI s_FcAPI = null;
try
{
if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName))
{
s_FcAPI = pSourceWsAPI.OpenFeatureClass(pTbMaping.S_TableName);
if (s_FcAPI != null && s_FcAPI.FeatureClass != null)
{
IFeatureLayer pTargetLayer = new FeatureLayer
{
FeatureClass = s_FcAPI.FeatureClass,
Name = pTbMaping.T_TableAliasName
};
ILegendInfo pLegendInfo = pTargetLayer as ILegendInfo;
int legendGroupCount = pLegendInfo.LegendGroupCount;
ILegendGroup pLGroup;
for (int i = 0; i < legendGroupCount; i++)
{
pLGroup = pLegendInfo.get_LegendGroup(i);
pLGroup.Visible = false;
}
if (cksjGroupLayer.Data is IGroupLayer groupLayer)
{
ICompositeLayer pComLayer = groupLayer as ICompositeLayer;
for (int i = 0; i < pComLayer.Count; i++)
{
ILayer layer = pComLayer.Layer[i];
if ((layer as IDataset).BrowseName == pTbMaping.S_TableName)
{
groupLayer.Delete(layer);
}
}
}
if (_DataCatalog != null)
{
//object parentLayer = _DataCatalog.GetNodeByLayer(ncsjGroupLayer);
_DataCatalog.AddLayer(pTargetLayer, cksjGroupLayer);
}
}
return true;
}
return false;
}
catch (Exception ex)
{
FailImportLayerCount++;
errorMessage += (pTbMaping.S_TableName + "图层数据导入异常!" + ex.Message);
return false;
}
finally
{
if (s_FcAPI != null)
s_FcAPI.CloseFeatureClass();
}
}
public List<T> GetSubLayer<T>(ICompositeLayer group)
{
List<T> result = new List<T>();
for (int i = 0; i < group.Count; i++)
{
var item = group.Layer[i];
if (item is ICompositeLayer)
{
result.AddRange(GetSubLayer<T>(item as ICompositeLayer));
}
else if (item is T)
{
result.Add((T)item);
}
}
return result;
}
private bool AddShpToMap(LayerCfg cksjGroupLayer, TableMapping pTbMaping, ref string message, ref string errorMessage, ref int FailImportLayerCount)
{
if (pSourceFCList == null || cksjGroupLayer == null)
return false;
IFeatureClassAPI t_FcAPI = null;
IFeatureClass pSourceFeatureClass = null;
string currentFiled = string.Empty;
try
{
if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName))
{
pSourceFeatureClass = pSourceFCList.Where(p => (p as FeatureClass).Name.Equals(pTbMaping.S_TableName) || p.AliasName.Equals(pTbMaping.S_TableName)).Single();
if (pSourceFeatureClass == null)
{
return false;
}
IFeatureLayer pTargetLayer = new FeatureLayer();
pTargetLayer.FeatureClass = pSourceFeatureClass;
pTargetLayer.Name = pTbMaping.T_TableAliasName;
ILegendInfo pLegendInfo = pTargetLayer as ILegendInfo;
int legendGroupCount = pLegendInfo.LegendGroupCount;
ILegendGroup pLGroup;
for (int i = 0; i < legendGroupCount; i++)
{
pLGroup = pLegendInfo.get_LegendGroup(i);
pLGroup.Visible = false;
}
//IGroupLayer groupLayer = cksjGroupLayer as IGroupLayer;
//if (groupLayer != null)
//{
// ICompositeLayer pComLayer = groupLayer as ICompositeLayer;
// for (int i = 0; i < pComLayer.Count; i++)
// {
// ILayer layer = pComLayer.Layer[i];
// if ((layer as IDataset).BrowseName == pTbMaping.S_TableName)
// {
// groupLayer.Delete(layer);
// }
// }
//}
//groupLayer.Add(pTargetLayer);
_DataCatalog.AddLayer(pTargetLayer, cksjGroupLayer);
}
return false;
}
catch (Exception ex)
{
FailImportLayerCount++;
errorMessage += (pTbMaping.S_TableName + "图层数据导入异常!" + ex.Message);
return false;
}
finally
{
if (t_FcAPI != null)
t_FcAPI.CloseFeatureClass();
}
}
/// <summary>
/// 选择本地的参考数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSelectedOtherData_Click(object sender, RoutedEventArgs e)
{
try
{
using (ComReleaser com = new ComReleaser())
{
IWorkspaceFactory pWorkspaceFactory = null;
IWorkspace pWorkspace = null;
IFeatureWorkspace pFeatureWorkspace = null;
IFeatureClass pSourceFeatureClass = null;
List<string> otherDataPathList = new List<string>();
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter = new FilterShapefiles();//Shape文件模式
pDialog.AddFilter(pOFilter, true);
pOFilter = new FilterGeoDatabasePersonal();//mdb文件模式
pDialog.AddFilter(pOFilter, true);
//pOFilter = new FilterVCTFile();///VCT文件模式
//pDialog.AddFilter(pOFilter, true);
pOFilter = new FilterGeoDatabaseFile();//GDB文件格式
pDialog.AddFilter(pOFilter, true);
pDialog.AllowMultiSelect = false;
pDialog.Title = "选择其他参考数据";
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)
{
ResetImport();
TempSelection = pDialog.Selection;
TempFinalLocation = pDialog.FinalLocation;
ImportDataType = Path.GetExtension(pDialog.FinalLocation).ToUpper().Replace('.', ' ').TrimStart();
if (string.IsNullOrWhiteSpace(ImportDataType) || (ImportDataType != "VCT" && ImportDataType != "GDB" && ImportDataType != "MDB" && ImportDataType != "SHP"))
{
MessageHelper.Show("选择的数据路径有误,请根据过滤条件,重新选择数据库!!");
return;
}
if (ImportDataType == "SHP")
{
ImportDataType = "Shape";
}
this.cobDataBase.ItemsSource = null;
string fileName = string.Empty;
if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape"))
{
pSourceFCList = new List<IFeatureClass>();
for (int i = 0; i < pDialog.Selection.Count; i++)
{
pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
pWorkspace = pWorkspaceFactory.OpenFromFile(Path.GetDirectoryName(pDialog.Selection[i].FullName), 0);
pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
pSourceFeatureClass = pFeatureWorkspace.OpenFeatureClass(pDialog.Selection[i].Name);
pSourceFCList.Add(pSourceFeatureClass);
fileName += pDialog.Selection[i].Name + ";";
}
otherDataPathList.Add(fileName);
if (pSourceFCList.Count != 0 && otherDataPathList.Count != 0)
{
this.cobDataBase.ItemsSource = null;
this.cobDataBase.ItemsSource = otherDataPathList;
this.cobDataBase.SelectedIndex = 0;
}
}
else if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("VCT"))
{
string TempMDBFolderPath = Path.GetTempPath();
string TempMDBPath = Path.Combine(TempMDBFolderPath, string.Format("{0}.mdb", Path.GetFileNameWithoutExtension(pDialog.FinalLocation)));
if (File.Exists(TempMDBPath))
{
File.Delete(TempMDBPath);
}
//this.ShowLoading("正在解析VCT文件... ...", 0, 0);
VCTToMDBHelper3 vcttomdb = new VCTToMDBHelper3();
vcttomdb.RootPath = TempMDBFolderPath;
vcttomdb.VCTToMDB(pDialog.FinalLocation);
this.CloseLoading();
if (!File.Exists(TempMDBPath))
{
MessageHelper.ShowError("VCT文件解析失败");
return;
}
SourceMDBPath = TempMDBPath;
otherDataPathList.Add(pDialog.FinalLocation);
this.cobDataBase.ItemsSource = null;
this.cobDataBase.ItemsSource = otherDataPathList;
this.cobDataBase.SelectedIndex = 0;
SetTableMapping();
}
else
{
otherDataPathList.Add(pDialog.FinalLocation);
this.cobDataBase.ItemsSource = null;
this.cobDataBase.ItemsSource = otherDataPathList;
this.cobDataBase.SelectedIndex = 0;
SetTableMapping();
}
}
if (pWorkspaceFactory != null)
{
com.ManageLifetime(pWorkspaceFactory);
Marshal.ReleaseComObject(pWorkspaceFactory);
}
if (pWorkspace != null)
{
com.ManageLifetime(pWorkspace);
Marshal.ReleaseComObject(pWorkspace);
}
if (pFeatureWorkspace != null)
{
com.ManageLifetime(pFeatureWorkspace);
Marshal.ReleaseComObject(pFeatureWorkspace);
}
}
}
catch (Exception ex)
{
LogAPI.Debug("选择参考数据库失败:" + ex);
MessageHelper.Show("选择参考数据库失败:" + ex);
}
}
private void BtnSelectedShpData_Click(object sender, RoutedEventArgs e)
{
try
{
using (ComReleaser com = new ComReleaser())
{
IWorkspaceFactory pWorkspaceFactory = null;
IWorkspace pWorkspace = null;
IFeatureWorkspace pFeatureWorkspace = null;
IFeatureClass pSourceFeatureClass = null;
List<string> baseDataPathList = new List<string>();
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter = new FilterShapefiles();//Shape文件模式
pDialog.AddFilter(pOFilter, true);
pDialog.AllowMultiSelect = true;
pDialog.Title = "选择其他参考数据";
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)
{
TempSelection = pDialog.Selection;
TempFinalLocation = pDialog.FinalLocation;
ImportDataType = Path.GetExtension(pDialog.FinalLocation).ToUpper().Replace('.', ' ').TrimStart();
if (string.IsNullOrWhiteSpace(ImportDataType) || (ImportDataType != "VCT" && ImportDataType != "GDB" && ImportDataType != "MDB" && ImportDataType != "SHP"))
{
MessageHelper.Show("选择的数据路径有误,请根据过滤条件,重新选择数据库!!");
return;
}
if (ImportDataType == "SHP")
{
ImportDataType = "Shape";
}
this.cobDataBase.ItemsSource = null;
string fileName = string.Empty;
if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape"))
{
pSourceFCList = new List<IFeatureClass>();
for (int i = 0; i < pDialog.Selection.Count; i++)
{
pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
pWorkspace = pWorkspaceFactory.OpenFromFile(Path.GetDirectoryName(pDialog.Selection[i].FullName), 0);
pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
pSourceFeatureClass = pFeatureWorkspace.OpenFeatureClass(pDialog.Selection[i].Name);
pSourceFCList.Add(pSourceFeatureClass);
fileName += pDialog.Selection[i].Name + ";";
}
baseDataPathList.Add(fileName);
if (pSourceFCList.Count != 0 && baseDataPathList.Count != 0)
{
this.cobDataBase.ItemsSource = baseDataPathList;
this.cobDataBase.SelectedIndex = 0;
}
}
}
com.ManageLifetime(pWorkspaceFactory);
com.ManageLifetime(pWorkspace);
com.ManageLifetime(pFeatureWorkspace);
Marshal.ReleaseComObject(pWorkspaceFactory);
Marshal.ReleaseComObject(pWorkspace);
Marshal.ReleaseComObject(pFeatureWorkspace);
}
}
catch (Exception ex)
{
LogAPI.Debug("选择参考数据库失败:" + ex);
MessageHelper.Show("选择参考数据库失败:" + ex);
}
}
public bool DirectoryCopy(string sourceDir, string targetDirPath)
{
try
{
if (!System.IO.Directory.Exists(sourceDir)) return false;
string targetDir = System.IO.Path.Combine(targetDirPath, System.IO.Path.GetFileName(sourceDir));
if (!System.IO.Directory.Exists(targetDir))
{
System.IO.Directory.CreateDirectory(targetDir);
}
// 文件及文件夹名称数组
string[] dirArr = System.IO.Directory.GetDirectories(sourceDir);
string[] fileArr = System.IO.Directory.GetFiles(sourceDir);
// 遍历复制所有文件
if (fileArr.Length > 0)
{
string fileName;
foreach (string fileDir in fileArr)
{
fileName = System.IO.Path.GetFileName(fileDir);
System.IO.File.Copy(sourceDir + "\\" + fileName, targetDir + "\\" + fileName, true);
}
}
// 遍历复制所有文件夹
if (dirArr.Length > 0)
{
string folderName;
foreach (string dir in dirArr)
{
folderName = System.IO.Path.GetFileName(dir);
// 递归调用
System.IO.Directory.CreateDirectory(targetDir + "\\" + folderName);
DirectoryCopy(dir, targetDir + "\\" + folderName);
}
}
return true;
}
catch (Exception ex)
{
LogAPI.Debug("创建工程目录页面中,文件夹复制时失败,异常原因: " + ex.Message + " ; ");
return false;
throw;
}
}
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
TableMapping tbm = dgTableMapping.SelectedItem as TableMapping;
if (tbm != null)
{
switch (tbm.State)
{
case TBState.Waiting:
tbm.State = TBState.Delete;
break;
case TBState.Delete:
tbm.State = TBState.Waiting;
break;
case TBState.BeingImport:
break;
case TBState.EndImport:
break;
default:
break;
}
dgTableMapping.RefreshData();
}
}
/// <summary>
/// 取消
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void BaseWindow_Closing(object sender, CancelEventArgs e)
{
this.shutDown = true;
}
#endregion
}
}