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

2687 lines
104 KiB

6 months ago
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Columns;
using DevExpress.XtraTreeList.Nodes;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
using KGIS.Framework.AE;
using KGIS.Framework.Commands;
using KGIS.Framework.Maps;
using KGIS.Framework.Menus.Entities;
using KGIS.Framework.Menus.ServicesInvokes;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.ExtensionMethod;
using KGIS.Framework.Utils.Helper;
using KGIS.Framework.Views;
using Kingo.Framework.LayerStyleConvert.Common;
using Kingo.Framework.LayerStyleConvert.XSDClass;
using Kingo.PluginServiceInterface;
using Kingo.PluginServiceInterface.Helper;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using UIShell.OSGi;
namespace Kingo.Plugin.MapView.Views.DataCalalog
{
public partial class UCLayerTree : UserControl, IDockPanel, IDataCatalogService
{
private ICommandManager _CmdManager;
private IMapService _MapService;
private ILayerPropertyService _LayerPropertyService = null;
private EngineEditor _Edit = null;
List<LayerCfg> _listCfg = null;
public UCLayerTree()
{
InitializeComponent();
this.AllowDrop = true;
this.trlProject.AllowDrop = true;
this.trlProject.OptionsDragAndDrop.AcceptOuterNodes = true;
Title = "图层目录";
DockWidth = 330;
DefaultArea = KGIS.Framework.Views.DockStyle.DockLeft;
DockAreas = KGIS.Framework.Views.DockStyle.DockLeft | KGIS.Framework.Views.DockStyle.DockRight | KGIS.Framework.Views.DockStyle.DockBottom | KGIS.Framework.Views.DockStyle.DockTop;
ShowCloseButton = false;
ShowAutoHideButton = true;
//string strMxdPath = System.IO.Path.Combine(SysAppPath.GetCurrentAppPath() + "工作空间\\模板\\新建变更工程\\LayerSymbolCfg" + ".xml");
//if (File.Exists(strMxdPath))
//{
// LayerCfg StrLayerInfo = SerializeAPI.DeserializeToObject2<LayerCfg>(strMxdPath);
// if (StrLayerInfo != null)
// _listCfg = StrLayerInfo.GetAllItem();
//}
bool IsOnlySave = false;
_Edit = new EngineEditorClass();
_Edit.OnStopEditing += (b) =>
{
if (mCurrentEditorNode == null) return;
if (!IsOnlySave)
{
mCurrentEditorNode.SetValue("IsEdit", false);
mCurrentEditorNode.SetValue("ImgIndex", 0);
}
IsOnlySave = false;
};
_Edit.OnSaveEdits += () =>
{
IsOnlySave = true;
};
//打开折叠
trlProject.AfterExpand += (sender1, e1) =>
{
try
{
//bool? IsExpanded = (bool?)e1.Node.GetValue("Expanded");
string name = e1.Node["LayerName"].ToTrim();
var item = Layers.FirstOrDefault(f => f.LayerName == name);
if (item == null) return;
item.Expanded = e1.Node.Expanded;
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
};
//关闭折叠
trlProject.AfterCollapse += (sender2, e2) =>
{
try
{
string layername = e2.Node["LayerName"].ToTrim();
var item = Layers.FirstOrDefault(f => f.LayerName == layername);
item.Expanded = e2.Node.Expanded;
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
};
trlProject.NodeCellStyle += (sender1, e1) =>
{
try
{
//TreeListColumn column2 = trlProject.Columns.ColumnByName("LayerEditable");
bool? isEdit = e1.Node == null ? null : (bool?)e1.Node.GetValue("IsEdit");
if (isEdit == true && e1.Column.FieldName == "LayerName")
{
e1.Appearance.ForeColor = Color.Red;
e1.Appearance.FontStyleDelta = FontStyle.Bold;
}
else if (e1.Column != null && e1.Column.FieldName == "LayerName" && isEdit == false)
{
e1.Appearance.ForeColor = Color.Black;
e1.Appearance.FontStyleDelta = FontStyle.Regular;
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
};
Platform.Instance.NotifyMsgEven2 += (o) =>
{
switch (o.MsgType)
{
case "RefreshLayer":
//InitTreeNode(_MapService.getAxMapControl().Map);
break;
default:
break;
}
};
}
List<LayerCfg> Layers = new List<LayerCfg>();
private LayerCfg _CurrentLayers;
public object CurrentLayers
{
get
{
return _CurrentLayers;
}
set
{
_CurrentLayers = value as LayerCfg;
}
}
private void InitTreeNode(IMap pMap)
{
trlProject.Nodes.Clear();
Bitmap groupImg = new Bitmap(Image.FromFile(System.IO.Path.Combine(Application.StartupPath, "images", "grouplayer" + ".png")), 22, 16);
_CurrentLayers = new LayerCfg
{
LayerName = pMap.Name,
SymbolImg = groupImg,
Visible = true,
Data = pMap,
LayerType = EnumLayerType.Map,
Expanded = true
};
for (int i = 0; i < pMap.LayerCount; i++)
{
ILayer layer = pMap.Layer[i];
EnumLayerType layerType = EnumLayerType.GroupLayer;
bool isSeleable = false;
string FcPath = string.Empty;
string FcName = string.Empty;
if (layer is IGroupLayer)
{
FcName = (layer as ILayerGeneralProperties).LayerDescription;
}
if (layer is IFeatureLayer)
{
isSeleable = (layer as IFeatureLayer).Selectable;
layerType = EnumLayerType.FeatureLayer;
FcPath = ((layer as IFeatureLayer).FeatureClass as FeatureClass).Workspace.PathName;
FcName = ((layer as IFeatureLayer).FeatureClass as FeatureClass).BrowseName;
}
LayerCfg subLayerInfo = new LayerCfg(_CurrentLayers)
{
LayerName = layer.Name,
Visible = layer.Visible,
SymbolImg = groupImg,
Selectable = isSeleable,
LayerType = layerType,
FcPath = FcPath,
FcName = FcName,
Data = layer,
Expanded = Layers.FirstOrDefault(x => x.LayerName == layer.Name) != null ? Layers.FirstOrDefault(x => x.LayerName == layer.Name).Expanded : false
};
_CurrentLayers.Layers.Add(subLayerInfo);
CreateNodeByLayer(subLayerInfo);
}
Layers = _CurrentLayers.GetAllItem();
trlProject.ParentFieldName = "PID";
trlProject.KeyFieldName = "ID";
trlProject.CheckBoxFieldName = "Visible";
trlProject.ImageIndexFieldName = "ImgIndex";
trlProject.DataSource = Layers;
RefreshLayerNode();
}
public UCLayerTree(IBundleContext pContext, IMap pMap) : this()
{
//InitTreeNode(pMap);
InitService(pContext);
//axTOCControl1.OnDoubleClick += AxTOCControl1_OnDoubleClick;
//axTOCControl1.OnMouseUp += _axTocCtrl_OnMouseUp;
}
private void InitService(IBundleContext context)
{
context.AddService<IDataCatalogService>(this);
}
private void CreateNodeByLayer(LayerCfg pLayerInfo)
{
try
{
//List<TreeListNode> nodes = trlProject.GetNodeList();
//TreeListNode pNode = nodes.FirstOrDefault(f => f.Tag == pLayer);
//trlProject.FindNodeByFieldValue("NodeName", "");
ILayer mLayer = pLayerInfo.Data as ILayer;
if (mLayer == null)
return;
if (mLayer is ICompositeLayer)
{
Bitmap groupImg = new Bitmap(Image.FromFile(System.IO.Path.Combine(Application.StartupPath, "images", "grouplayer" + ".png")), 22, 16);
for (int i = 0; i < (mLayer as ICompositeLayer).Count; i++)
{
ILayer tempLayer = (mLayer as ICompositeLayer).Layer[i];
if (tempLayer is ICompositeLayer)
{
pLayerInfo.Layers.Add(new LayerCfg(pLayerInfo)
{
LayerName = tempLayer.Name,
Visible = tempLayer.Visible,
SymbolImg = groupImg,
Selectable = Layers.FirstOrDefault(x => x.LayerName == tempLayer.Name) != null ? Layers.FirstOrDefault(x => x.LayerName == tempLayer.Name).Selectable : true,
LayerType = EnumLayerType.GroupLayer,
Data = tempLayer
});
CreateNodeByLayer(pLayerInfo.Layers[pLayerInfo.Layers.Count - 1]);
}
else
{
ILayerEffects mLayerEffects = tempLayer as ILayerEffects;
int Tran = 0;
if (mLayerEffects != null)
Tran = mLayerEffects.Transparency;
Bitmap symbol = new Bitmap(22, 16);
IGeoFeatureLayer fcLayer = tempLayer as IGeoFeatureLayer;
if (fcLayer != null)
{
ISimpleRenderer render = fcLayer.Renderer as ISimpleRenderer;
IUniqueValueRenderer un = null;
if (render == null)
{
un = fcLayer.Renderer as IUniqueValueRenderer;
}
else if (render.Symbol != null)
{
symbol = PreViewFillSymbol(render.Symbol, 22, 16);
}
}
byte[] bytes = null;
if (symbol == null)
{
symbol = new Bitmap(22, 16);
}
MemoryStream ms = new MemoryStream();
symbol.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
bytes = ms.GetBuffer();
ms.Close();
EnumLayerType layerType = EnumLayerType.FeatureLayer;
string FcPath = string.Empty;
string FcName = string.Empty;
if (tempLayer is IFeatureLayer)
{
FcPath = ((tempLayer as IFeatureLayer).FeatureClass as FeatureClass).Workspace.PathName;
FcName = ((tempLayer as IFeatureLayer).FeatureClass as FeatureClass).BrowseName;
}
else if (tempLayer is IRasterLayer)
{
layerType = EnumLayerType.RasterLayer;
FcPath = (tempLayer as IRasterLayer).FilePath;
}
else if (tempLayer is KOTilesLayer)
{
layerType = EnumLayerType.KOTilesLayer;
FcPath = (tempLayer as KOTilesLayer).DBPath;
}
pLayerInfo.Layers.Add(new LayerCfg(pLayerInfo)
{
LayerName = tempLayer.Name,
Visible = tempLayer.Visible,
SymbolImg = symbol,
Selectable = Layers.FirstOrDefault(x => x.LayerName == tempLayer.Name) != null ? Layers.FirstOrDefault(x => x.LayerName == tempLayer.Name).Selectable : true,
Transparency = Tran,
FcPath = FcPath,
FcName = FcName,
Data = tempLayer,
LayerType = layerType
});
}
}
}
else
{
ILayerEffects mLayerEffects = mLayer as ILayerEffects;
int Tran = 0;
if (mLayerEffects != null)
Tran = mLayerEffects.Transparency;
//ID++;
Bitmap symbol = new Bitmap(22, 16);
IGeoFeatureLayer fcLayer = mLayer as IGeoFeatureLayer;
if (fcLayer != null)
{
ISimpleRenderer render = fcLayer.Renderer as ISimpleRenderer;
IUniqueValueRenderer un = null;
if (render == null)
{
un = fcLayer.Renderer as IUniqueValueRenderer;
}
else
{
symbol = PreViewFillSymbol(render.Symbol, 22, 16);
}
}
byte[] bytes = null;
if (symbol == null)
{
symbol = new Bitmap(22, 16);
}
MemoryStream ms = new MemoryStream();
symbol.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
bytes = ms.GetBuffer();
ms.Close();
EnumLayerType layerType = EnumLayerType.FeatureLayer;
string FcPath = string.Empty;
string FcName = string.Empty;
if (mLayer is IFeatureLayer)
{
FcPath = ((mLayer as IFeatureLayer).FeatureClass as FeatureClass).Workspace.PathName;
FcName = ((mLayer as IFeatureLayer).FeatureClass as FeatureClass).BrowseName;
}
else if (mLayer is IRasterLayer)
{
layerType = EnumLayerType.RasterLayer;
FcPath = (mLayer as IRasterLayer).FilePath;
}
else if (mLayer is KOTilesLayer)
{
layerType = EnumLayerType.KOTilesLayer;
FcPath = (mLayer as KOTilesLayer).DBPath;
}
pLayerInfo.Layers.Add(new LayerCfg(pLayerInfo)
{
LayerName = mLayer.Name,
Visible = mLayer.Visible,
SymbolImg = symbol,
Selectable = Layers.FirstOrDefault(x => x.LayerName == mLayer.Name) != null ? Layers.FirstOrDefault(x => x.LayerName == mLayer.Name).Selectable : true,
Transparency = Tran,
LayerType = layerType,
FcPath = FcPath,
FcName = FcName,
Data = mLayer
});
}
}
catch (Exception ex)
{
throw ex;
}
}
private Bitmap PreViewFillSymbol(ISymbol pSymbol, int width, int height)
{
try
{
IStyleGalleryClass pStyleGalleryClass = new FillSymbolStyleGalleryClass();
if (pSymbol is ILineSymbol)
{
pStyleGalleryClass = new LineSymbolStyleGalleryClass();
}
else if (pSymbol is IMarkerSymbol)
{
pStyleGalleryClass = new MarkerSymbolStyleGalleryClass();
}
Bitmap img = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Graphics gc = Graphics.FromImage(img);
//SystemColors.Window
IntPtr hdc = gc.GetHdc();
tagRECT rect = new tagRECT();
rect.left = 0;
rect.top = 0;
rect.right = width;
rect.bottom = height;
pStyleGalleryClass.Preview(pSymbol, hdc.ToInt32(), ref rect);
//gc.Save();
gc.ReleaseHdc(hdc);
gc.Dispose();
img.MakeTransparent(System.Drawing.Color.FromArgb(System.Drawing.SystemColors.Window.ToArgb()));
//System.IO.FileStream s = File.Open(AppDomain.CurrentDomain.BaseDirectory + "Images\\" + pImgName + ".png",FileMode.Open);
//s.Close();
//File.Delete(AppDomain.CurrentDomain.BaseDirectory + "Images\\" + pImgName + ".png");
//img.Save(AppDomain.CurrentDomain.BaseDirectory + "Images\\" + pImgName + ".png");
return img.Clone(new System.Drawing.Rectangle(0, 0, width, height), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
//return img.Clone(new System.Drawing.Rectangle(4, 4, width - 6, height - 6), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
return null;
}
}
#region IDockPanel接口属性
public Guid ID { get; set; }
public KGIS.Framework.Views.DockStyle DockAreas { get; set; }
public Size FloatSize { get; set; }
public int DockWidth { get; set; }
public int DockHeight { get; set; }
public KGIS.Framework.Views.DockStyle DefaultArea { get; set; }
public bool ShowCloseButton { get; set; }
public bool ShowAutoHideButton { get; set; }
public string Title { get; set; }
#endregion
#region IDataCatalogService 接口
/// <summary>
/// 返回指定图层对应的节点
/// </summary>
/// <param name="layer">图层对象</param>
/// <returns>图层节点</returns>
public object GetNodeByLayer(ILayer layer)
{
if (null == layer) return null;
List<TreeListNode> nodes = trlProject.GetNodeList();
TreeListNode layerNode = null;
foreach (TreeListNode node in nodes)
{
if (node["Data"] == layer)
{
layerNode = node;
break;
}
}
nodes.Clear();
return layerNode;
}
/// <summary>
/// 返回父节点下与指定图层对应的节点
/// </summary>
/// <param name="parentNode">父节点</param>
/// <param name="layer">图层对象</param>
/// <returns>图层节点</returns>
public object GetNodeByLayer(object parentNode, ILayer layer)
{
if (null == layer) return null;
TreeListNodes nodes = null;
if (parentNode is TreeListNode)
{
nodes = (parentNode as TreeListNode).Nodes;
}
else
{
nodes = trlProject.Nodes;
}
foreach (TreeListNode node in nodes)
{
if (node["Data"] == layer) return node;
}
return null;
}
/// <summary>
/// 返回工程树中指定图层名称的节点
/// </summary>
/// <param name="layerName">图层名称</param>
/// <returns>节点</returns>
public object GetNodeByLayerName(string layerName)
{
if (string.IsNullOrEmpty(layerName)) return null;
List<TreeListNode> nodes = trlProject.GetNodeList();
TreeListNode featureNode = null;
foreach (TreeListNode node in nodes)
{
//var ln = node["LayerName"];
if (layerName.Equals(node["LayerName"] as string, StringComparison.OrdinalIgnoreCase))
{
featureNode = node;
break;
}
}
nodes.Clear();
return featureNode;
}
/// <summary>
/// 返回工程树中可选择图层节点的集合
/// </summary>
/// <returns>节点集合</returns>
public object GetSelectableLayerNodes()
{
List<TreeListNode> selectableNodes = new List<TreeListNode>();
//TreeListColumn column1 = trlProject.Columns.ColumnByName("LayerType");
//TreeListColumn column2 = trlProject.Columns.ColumnByName("LayerSelectable");
List<TreeListNode> nodes = trlProject.GetNodeList();
object obj = null;
foreach (TreeListNode node in nodes)
{
//obj = trlProject.GetRowCellValue(node, column1);
obj = node["LayerType"];
if (null == obj) continue;
obj = node["Selectable"]; //trlProject.GetRowCellValue(node, column2);
if (null == obj || !(bool)obj) continue;
selectableNodes.Add(node);
}
nodes.Clear();
return selectableNodes;
}
public object GetVisibleLayerNodes(object parentNode = null)
{
List<TreeListNode> selectableNodes = new List<TreeListNode>();
//TreeListColumn column1 = trlProject.Columns.ColumnByName("LayerType");
//TreeListColumn column2 = trlProject.Columns.ColumnByName("LayerSelectable");
TreeListNodes nodes = trlProject.Nodes;//.GetNodeList();
if (parentNode is TreeListNode)
{
nodes = (parentNode as TreeListNode).Nodes;
}
object obj = null;
foreach (TreeListNode node in nodes)
{
//obj = trlProject.GetRowCellValue(node, column1);
obj = node["LayerType"];
if (null == obj) continue;
obj = node["Visible"]; //trlProject.GetRowCellValue(node, column2);
if (null == obj || !(bool)obj) continue;
selectableNodes.Add(node);
}
nodes.Clear();
return selectableNodes;
}
/// <summary>
/// 返回工程树中选择节点的集合
/// </summary>
/// <param name="orderByIndex">是否按节点索引排序</param>
/// <returns>节点集合</returns>
public object GetSelectedNodes(bool orderByIndex)
{
List<TreeListNode> nodes = new List<TreeListNode>();
for (int i = 0; i < trlProject.Selection.Count; i++)
{
nodes.Add(trlProject.Selection[i]);
}
if (orderByIndex)
{
nodes.Sort(delegate (TreeListNode a, TreeListNode b)
{
if (a.ParentNode == b.ParentNode)
{
if (null == a.ParentNode)
{
return trlProject.Nodes.IndexOf(a).CompareTo(trlProject.Nodes.IndexOf(b));
}
else
{
return a.ParentNode.Nodes.IndexOf(a).CompareTo(b.ParentNode.Nodes.IndexOf(b));
}
}
else
{
return a.Id.CompareTo(b.Id);
}
});
}
return nodes;
}
public object AddLayer(ILayer pLayer, object parentNode = null)
{
LayerCfg layer = null;
if (parentNode is TreeListNode)
{
TreeListNode ParentNode = parentNode as TreeListNode;
LayerCfg ParentLayer = Layers.FirstOrDefault(f => f.LayerName == ParentNode["LayerName"].ToTrim());
if (ParentLayer != null)
{
if (ParentLayer.Data is IGroupLayer)
{
(ParentLayer.Data as IGroupLayer).Add(pLayer);
}
layer = new LayerCfg(ParentLayer);
ParentLayer.Layers.Insert(0, layer);
}
}
else if (parentNode is LayerCfg)
{
LayerCfg ParentLayer = parentNode as LayerCfg;
if (ParentLayer != null)
{
if (ParentLayer.Data is IGroupLayer)
{
(ParentLayer.Data as IGroupLayer).Add(pLayer);
}
layer = new LayerCfg(ParentLayer);
ParentLayer.Layers.Insert(0, layer);
}
}
else
{
if (_CurrentLayers == null)
_CurrentLayers = new LayerCfg();
layer = new LayerCfg(_CurrentLayers);
_CurrentLayers.Layers.Insert(0, layer);
MapsManager.Instance.MapService.getAxMapControl().Map.AddLayer(pLayer);
}
#region 图层名称
layer.LayerName = pLayer.Name;
#endregion
#region 图层是否显示
layer.Visible = pLayer.Visible;
#endregion
#region 图层透明度
if (pLayer is ILayerEffects mLayerEffects)
layer.Transparency = mLayerEffects.Transparency;
#endregion
#region 图层显示比例尺
layer.MinScale = pLayer.MinimumScale.ToInt();
layer.MaxScale = pLayer.MaximumScale.ToInt();
#endregion
layer.Data = pLayer;
if (pLayer is IFeatureLayer mFcLayer)
{
#region 图层要素是否可选择
layer.Selectable = mFcLayer.Selectable;
#endregion
#region 图层显示过滤条件
IFeatureLayerDefinition pFLDefinition = pLayer as IFeatureLayerDefinition;
if (pFLDefinition != null)
{
layer.DefinitionExpression = pFLDefinition.DefinitionExpression;
//Marshal.ReleaseComObject(pFLDefinition);
}
#endregion
#region 图层样式
Renderer randerer = SymbolConvert.Instance().GetRenderer((pLayer as IGeoFeatureLayer).Renderer);
LabelingInfo labelingInfo = null;
LabelStyleConvert styleConvert = new LabelStyleConvert();
List<LabelingInfo> labelInfo = styleConvert.EsriLabelToCustomLabels((pLayer as IGeoFeatureLayer).AnnotationProperties);
if (labelInfo != null && labelInfo.Count > 0)
labelingInfo = labelInfo[0];
if (labelingInfo != null)
{
AdvancedDrawingInfo adi = new AdvancedDrawingInfo();
adi.DrawingInfo.Renderer = randerer;
adi.DrawingInfo.LabelingInfo = labelInfo;
layer.Symbol = adi.ToJson();
}
//LayerCfg layerCfg = _listCfg.FirstOrDefault(f => f.LayerName == pLayer.Name);
//if (layerCfg != null)
//{
// layer.Symbol = layerCfg.Symbol;
// IFeatureRenderer render = GetSymbol(layerCfg.Symbol);
// if (render != null)
// (pLayer as IGeoFeatureLayer).Renderer = render;
//}
Bitmap symbol = new Bitmap(22, 16);
IGeoFeatureLayer fcLayer = pLayer as IGeoFeatureLayer;
if (fcLayer != null)
{
ISimpleRenderer render = fcLayer.Renderer as ISimpleRenderer;
IUniqueValueRenderer un = null;
if (render == null)
{
un = fcLayer.Renderer as IUniqueValueRenderer;
Bitmap groupImg = new Bitmap(Image.FromFile(System.IO.Path.Combine(Application.StartupPath, "images", "DjtbLayer" + ".png")), 22, 16);
symbol = groupImg;//图层多级图层显示
}
else if (render.Symbol != null)
{
symbol = PreViewFillSymbol(render.Symbol, 22, 16);
}
}
byte[] bytes = null;
if (symbol == null)
{
symbol = new Bitmap(22, 16);
}
layer.SymbolImg = symbol;
#endregion
layer.LayerType = EnumLayerType.FeatureLayer;
if ((pLayer as IFeatureLayer).FeatureClass != null)
layer.FcPath = ((pLayer as IFeatureLayer).FeatureClass as FeatureClass).Workspace.PathName;
if ((pLayer as IFeatureLayer).FeatureClass != null)
layer.FcName = ((pLayer as IFeatureLayer).FeatureClass as FeatureClass).BrowseName;
}
else if (pLayer is IRasterLayer)
{
layer.LayerType = EnumLayerType.RasterLayer;
layer.FcPath = (pLayer as IRasterLayer).FilePath;
}
else if (pLayer is WMTSLayer)
{
layer.LayerType = EnumLayerType.WMTSLayer;
layer.FcPath = UserLoginHelper.GetYXGroupLayerValueByAliasName(layer.LayerName) == "" ? UserLoginHelper.GetAppsetingValueByKey("JSYXUrl") : UserLoginHelper.GetYXGroupLayerValueByAliasName(layer.LayerName);
layer.FcName = pLayer.Name;
}
else if (pLayer is KOTilesLayer)
{
layer.LayerType = EnumLayerType.KOTilesLayer;
layer.FcPath = (pLayer as KOTilesLayer).DBPath;
layer.FcName = pLayer.Name;
}
else if (pLayer is IGroupLayer)
{
Bitmap groupImg = new Bitmap(Image.FromFile(System.IO.Path.Combine(Application.StartupPath, "images", "grouplayer" + ".png")), 22, 16);
layer.LayerType = EnumLayerType.GroupLayer;
layer.SymbolImg = groupImg;
ILayerGeneralProperties layerGeneralProperties = pLayer as ILayerGeneralProperties;
if (string.IsNullOrWhiteSpace(layer.FcName))
layer.FcName = layerGeneralProperties.LayerDescription;
}
return layer;
}
public object UpdateLayer(object pData)
{
if (pData is ILayer pLayer)
{
LayerCfg layer = Layers.FirstOrDefault(f => f.Data == pLayer); ;
if (layer == null) return pData;
#region 图层名称
layer.LayerName = pLayer.Name;
#endregion
#region 图层是否显示
layer.Visible = pLayer.Visible;
#endregion
#region 图层透明度
if (pLayer is ILayerEffects mLayerEffects)
layer.Transparency = mLayerEffects.Transparency;
#endregion
#region 图层显示比例尺
layer.MinScale = pLayer.MinimumScale.ToInt();
layer.MaxScale = pLayer.MaximumScale.ToInt();
#endregion
layer.Data = pLayer;
if (pLayer is IFeatureLayer mFcLayer)
{
#region 图层要素是否可选择
layer.Selectable = mFcLayer.Selectable;
#endregion
#region 图层显示过滤条件
IFeatureLayerDefinition pFLDefinition = pLayer as IFeatureLayerDefinition;
if (pFLDefinition != null)
{
layer.DefinitionExpression = pFLDefinition.DefinitionExpression;
//Marshal.ReleaseComObject(pFLDefinition);
}
#endregion
#region 图层样式
Renderer randerer = SymbolConvert.Instance().GetRenderer((pLayer as IGeoFeatureLayer).Renderer);
LabelingInfo labelingInfo = null;
LabelStyleConvert styleConvert = new LabelStyleConvert();
List<LabelingInfo> labelInfo = styleConvert.EsriLabelToCustomLabels((pLayer as IGeoFeatureLayer).AnnotationProperties);
if (labelInfo != null && labelInfo.Count > 0)
labelingInfo = labelInfo[0];
if (labelingInfo != null)
{
AdvancedDrawingInfo adi = new AdvancedDrawingInfo();
adi.DrawingInfo.Renderer = randerer;
adi.DrawingInfo.LabelingInfo = labelInfo;
layer.Symbol = adi.ToJson();
}
//LayerCfg layerCfg = _listCfg.FirstOrDefault(f => f.LayerName == pLayer.Name);
//if (layerCfg != null)
//{
// layer.Symbol = layerCfg.Symbol;
// IFeatureRenderer render = GetSymbol(layerCfg.Symbol);
// if (render != null)
// (pLayer as IGeoFeatureLayer).Renderer = render;
//}
Bitmap symbol = new Bitmap(22, 16);
IGeoFeatureLayer fcLayer = pLayer as IGeoFeatureLayer;
if (fcLayer != null)
{
ISimpleRenderer render = fcLayer.Renderer as ISimpleRenderer;
IUniqueValueRenderer un = null;
if (render == null)
{
un = fcLayer.Renderer as IUniqueValueRenderer;
Bitmap groupImg = new Bitmap(Image.FromFile(System.IO.Path.Combine(Application.StartupPath, "images", "DjtbLayer" + ".png")), 22, 16);
symbol = groupImg;//图层多级图层显示
}
else if (render.Symbol != null)
{
symbol = PreViewFillSymbol(render.Symbol, 22, 16);
}
}
byte[] bytes = null;
if (symbol == null)
{
symbol = new Bitmap(22, 16);
}
layer.SymbolImg = symbol;
#endregion
layer.LayerType = EnumLayerType.FeatureLayer;
layer.FcPath = ((pLayer as IFeatureLayer).FeatureClass as FeatureClass).Workspace.PathName;
layer.FcName = ((pLayer as IFeatureLayer).FeatureClass as FeatureClass).BrowseName;
}
else if (pLayer is IRasterLayer)
{
layer.LayerType = EnumLayerType.RasterLayer;
layer.FcPath = (pLayer as IRasterLayer).FilePath;
}
else if (pLayer is KOTilesLayer)
{
layer.LayerType = EnumLayerType.KOTilesLayer;
layer.FcPath = (pLayer as KOTilesLayer).DBPath;
layer.FcName = pLayer.Name;
}
else if (pLayer is IGroupLayer)
{
Bitmap groupImg = new Bitmap(Image.FromFile(System.IO.Path.Combine(Application.StartupPath, "images", "grouplayer" + ".png")), 22, 16);
layer.LayerType = EnumLayerType.GroupLayer;
layer.SymbolImg = groupImg;
ILayerGeneralProperties layerGeneralProperties = pLayer as ILayerGeneralProperties;
if (string.IsNullOrWhiteSpace(layer.FcName))
layer.FcName = layerGeneralProperties.LayerDescription;
}
return layer;
}
else if (pData is TreeListNode)
{
return pData;
}
return pData;
}
public void RemoveLayer(ILayer pLayer)
{
if (pLayer == null || Layers == null) return;
LayerCfg layerInfo2 = Layers.FirstOrDefault(f => f.Data == pLayer);
if (layerInfo2 == null) return;
LayerCfg infoTemp = Layers.FirstOrDefault(x => x.ID == layerInfo2.PID);
if (infoTemp != null)
infoTemp.Layers.Remove(layerInfo2);
}
public void UpdateTree()
{
if (CurrentLayers == null) return;
Layers = (CurrentLayers as LayerCfg).GetAllItem();
trlProject.ParentFieldName = "PID";
trlProject.KeyFieldName = "ID";
trlProject.CheckBoxFieldName = "Visible";
trlProject.ImageIndexFieldName = "ImgIndex";
trlProject.DataSource = Layers;
MapsManager.Instance.MapService.getAxMapControl().ActiveView.ContentsChanged();
MapsManager.Instance.MapService.getAxMapControl().Refresh();
RefreshLayerNode();
}
/// <summary>
/// 刷新节点历史展开
/// </summary>
private void RefreshLayerNode()
{
foreach (LayerCfg item in Layers.FindAll(x => x.LayerType == EnumLayerType.GroupLayer))
{
if (GetNodeByLayerName(item.LayerName) is TreeListNode rfNode)
{
rfNode.Expanded = item.Expanded;
}
}
}
#endregion
private IFeatureRenderer GetSymbol(string pStrSymbol)
{
IFeatureRenderer result = null;
if (!string.IsNullOrWhiteSpace(pStrSymbol))
{
AdvancedDrawingInfo ad = AdvancedDrawingInfo.FromJson(pStrSymbol);
if (ad != null)
{
if (ad.DrawingInfo.Renderer is Framework.LayerStyleConvert.XSDClass.SimpleRenderer)
{
Symbol symbol1 = (ad.DrawingInfo.Renderer as Framework.LayerStyleConvert.XSDClass.SimpleRenderer).Symbol;
ISimpleRenderer simpleRander2 = SymbolConvert.Instance().GetSimpleRenderer(symbol1, SymbolTypeEnum.Fill);
result = simpleRander2 as IFeatureRenderer;
}
else if (ad.DrawingInfo.Renderer is Framework.LayerStyleConvert.XSDClass.UniqueValueRenderer)
{
Renderer rander = ad.DrawingInfo.Renderer;
IUniqueValueRenderer uniqueValueRander = SymbolConvert.Instance().GetUniqueValueRenderer(rander, SymbolTypeEnum.Fill);
result = uniqueValueRander as IFeatureRenderer;
}
}
}
return result;
}
#region 类事件方法
/// <summary>
/// 工程树节点拖动前事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void trlProject_BeforeDragNode(object sender, DevExpress.XtraTreeList.BeforeDragNodeEventArgs e)
{
if (e.Node.Level == 0 || e.Node["Data"] == null) e.CanDrag = false;
}
/// <summary>
/// 工程树拖放节点经过事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void trlProject_DragOver(object sender, DragEventArgs e)
{
//目标节点
System.Drawing.Point point = trlProject.PointToClient(new System.Drawing.Point(e.X, e.Y));
TreeListNode targetNode = trlProject.CalcHitInfo(point).Node;
//禁止拖放到根节点
if (trlProject.IsRootNode(targetNode))
{
e.Effect = DragDropEffects.None;
}
}
/// <summary>
/// 工程树节点放置后事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void trlProject_DragDrop(object sender, DragEventArgs e)
{
TreeList treeList = sender as TreeList;
//最上部的拖动节点
List<TreeListNode> selectedNodes = GetSelectedNodes(true) as List<TreeListNode>;
if (null == selectedNodes || selectedNodes.Count == 0) return;
//最上部的拖动图层
TreeListNode dragNode = selectedNodes[0];
ILayer sourceLayer = dragNode["Data"] as ILayer;
if (null == sourceLayer) return;
//拖动图层的父节点和父图层
TreeListNode sourceParentNode = null;
ILayer sourceParentLayer = null;
if (null != dragNode.ParentNode)
{
sourceParentNode = dragNode.ParentNode;
sourceParentLayer = sourceParentNode["Data"] as ILayer;
}
//放置节点
DXDragEventArgs args = e.GetDXDragEventArgs(treeList);
TreeListNode dropNode = args.TargetNode;
if (null == dropNode) return;
//放置图层
ILayer targetLayer = dropNode["Data"] as ILayer;
if (null == targetLayer) return;
//放置位置
DragInsertPosition insertPosition = args.DragInsertPosition;
bool dropAsChilds = insertPosition == DragInsertPosition.AsChild;
if (dropAsChilds && !(targetLayer is ICompositeLayer))
{
dropAsChilds = false;
}
//放置节点的父节点和父图层
TreeListNode targetParentNode = null;
ILayer targetParentLayer = null;
if (dropAsChilds)
{
targetParentNode = dropNode;
targetParentLayer = dropNode["Data"] as ILayer;
}
else if (null != dropNode.ParentNode)
{
targetParentNode = dropNode.ParentNode;
targetParentLayer = targetParentNode["Data"] as ILayer;
}
int dragIndex, dropIndex, targetIndex;
List<ILayer> movedLayers = new List<ILayer>();
//拖动节点
treeList.BeginUpdate();
for (int i = 0; i < selectedNodes.Count; i++)
{
dragNode = selectedNodes[i];
sourceLayer = dragNode["Data"] as ILayer;
if (dropAsChilds)
{
targetIndex = dropNode.Nodes.Count;
}
else if (sourceParentNode != targetParentNode)
{
if (insertPosition == DragInsertPosition.After ||
insertPosition == DragInsertPosition.AsChild)
{
targetIndex = GetNodeIndex(dropNode) + i + 1;
}
else
{
targetIndex = GetNodeIndex(dropNode);
}
}
else
{
dragIndex = GetNodeIndex(dragNode);
dropIndex = GetNodeIndex(dropNode);
if (insertPosition == DragInsertPosition.After ||
insertPosition == DragInsertPosition.AsChild)
{
targetIndex = dragIndex < dropIndex ? dropIndex + i : dropIndex + i + 1;
}
else
{
targetIndex = dragIndex < dropIndex ? dropIndex - 1 : dropIndex;
}
}
treeList.MoveNode(dragNode, targetParentNode, true, targetIndex);
movedLayers.Add(sourceLayer);
}
//更新节点可见性
TreeListColumn column = treeList.Columns.ColumnByName("LayerVisible");
if (sourceParentNode != targetParentNode)
{
UpdateParentVisible(selectedNodes[0]);
if (null != sourceParentNode)
{
if (sourceParentNode.HasChildren)
{
UpdateParentVisible(sourceParentNode.Nodes[0]);
}
else if (treeList.GetRowCellValue(sourceParentNode, column) == null)
{
treeList.SetRowCellValue(sourceParentNode, column, false);
}
}
}
treeList.EndUpdate();
targetIndex = GetNodeIndex(selectedNodes[0]);
ReorderLayers(sourceParentLayer, targetParentLayer, movedLayers, targetIndex);
selectedNodes.Clear();
movedLayers.Clear();
e.Effect = DragDropEffects.None;
//CurrentLayers = treeList.DataSource;
//Layers = treeList.DataSource as List<LayerCfg>;
UpdateTree();
}
/// <summary>
/// 工程树获取节点状态图片事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void trlProject_GetStateImage(object sender, DevExpress.XtraTreeList.GetStateImageEventArgs e)
{
int imageIndex = this.GetNodeStateImageIndex(e.Node);
if (imageIndex != -1)
{
e.NodeImageIndex = imageIndex;
}
}
/// <summary>
/// 工程树鼠标弹起事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void trlProject_MouseUp(object sender, MouseEventArgs e)
{
TreeList treeList = sender as TreeList;
if (e.Button != MouseButtons.Right) return;
System.Drawing.Point point = new System.Drawing.Point(e.X, e.Y);
TreeListNode focusedNode = treeList.CalcHitInfo(point).Node;
if (null == focusedNode)
{
treeList.Selection.Clear();
return;
}
if (!treeList.Selection.Contains(focusedNode))
{
try
{
treeList.Selection.Set(focusedNode);
}
catch (Exception ex)
{
LogAPI.Debug(ex);
return;
}
}
ILayer layer = focusedNode["Data"] as ILayer;
bool isSingleNodeSelected = treeList.Selection.Count == 1;
if (layer == null)
{
MapsManager.Instance.MapService.SetCustomProperty(MapsManager.Instance.MapService.getAxMapControl().Map);
SetMenuEnabled(popMapMenu);
popMapMenu.ShowPopup(Control.MousePosition);//弹出右键菜单
}
else
{
MapsManager.Instance.MapService.SetCustomProperty(layer);
if (layer is IGroupLayer)
{
////图层组
SetMenuEnabled(popGroupMenu);
popGroupMenu.ShowPopup(Control.MousePosition);//弹出右键菜单
}
else
{
SetMenuEnabled(popLayerMenu);
popLayerMenu.ShowPopup(Control.MousePosition);//弹出右键菜单
}
}
}
/// <summary>
/// 设置弹出菜单最新状态
/// </summary>
/// <param name="menu"></param>
public void SetMenuEnabled(PopupMenu menu)
{
foreach (LinkPersistInfo menuitem in menu.LinksPersistInfo)//循环设置右键菜单启用/禁用状态
{
if ((menuitem.Item as BarButtonItem) != null)
{
var tmpmenu = menuitem.Item as BarButtonItem;
var tmpcmd = tmpmenu.Tag;
if (tmpcmd == null) return;
Type type = tmpcmd.GetType(); //获取类型
try
{
var propertyInfo = type.GetProperty("Enabled");//获取最新启用状态
//设置菜单启用禁用
tmpmenu.Enabled = (bool)propertyInfo.GetValue(tmpcmd, null);
propertyInfo = type.GetProperty("Caption");
if (propertyInfo == null) return;
object title = propertyInfo.GetValue(tmpcmd, null);
if (title == null) continue;
if (string.IsNullOrWhiteSpace(title.ToTrim())) continue; ;
tmpmenu.Caption = title.ToTrim();
}
catch (Exception exc)
{
LogAPI.Debug(exc);
}
}
}
}
/// <summary>
/// 工程树选择改变事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void trlProject_SelectionChanged(object sender, EventArgs e)
{
TreeList treeList = sender as TreeList;
if (treeList.Selection.Count > 1)
{
TreeListNode focusedNode = treeList.FocusedNode;
int parentNodeId, nodeId;
if (null != treeList.Selection[0].ParentNode)
{
parentNodeId = treeList.Selection[0].ParentNode.Id;
}
else
{
parentNodeId = -1;
}
for (int i = 1; i < treeList.Selection.Count; i++)
{
if (null != treeList.Selection[i].ParentNode)
{
nodeId = treeList.Selection[i].ParentNode.Id;
}
else
{
nodeId = -1;
}
if (parentNodeId != nodeId)
{
treeList.Selection.Set(focusedNode);
break;
}
}
}
//OnSelectedLayersChanged();
}
private void trlProject_AfterCheckNode(object sender, NodeEventArgs e)
{
//List<LayerCfg> list = (sender as TreeList).DataSource as List<LayerCfg>;
//var layerInfo = list.FirstOrDefault(f => f.ID == e.Node.Id);
//if (layerInfo == null)
//{
if (e.Node.GetValue("Data") is ILayer)
{
ILayer layer = e.Node.GetValue("Data") as ILayer;
layer.Visible = e.Node.Checked;
SaveProjectInfo(layer.Name, e.Node.Checked, out LayerCfg layerInfo);
if (layerInfo != null)
LayerCfgList = layerInfo.GetAllItem();
UpdateLayer(e.Node, e.Node.Checked);
MapsManager.Instance.MapService.getAxMapControl().ActiveView.Refresh();
}
//}
}
private void SaveProjectInfo(string layerName, bool isCheck, out LayerCfg layerInfo)
{
layerInfo = null;
try
{
ProjectInfo ProInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo;
if (ProInfo != null && !string.IsNullOrWhiteSpace(ProInfo.TempData))
{
byte[] contentArray = Convert.FromBase64String(ProInfo.TempData);
string LayerCfg = System.Text.Encoding.Default.GetString(contentArray);
layerInfo = KGIS.Framework.Utils.SerializeAPI.DeserializeToObject<LayerCfg>(LayerCfg);
}
layerInfo.GetAllItem().Find(a => a.LayerName == layerName).Visible = isCheck;
Byte[] bytearr = System.Text.Encoding.Default.GetBytes(SerializeAPI.SerializeToXML<LayerCfg>(layerInfo));
string strBase64 = Convert.ToBase64String(bytearr);
ProInfo.TempData = strBase64;
ProInfo.Save();
}
catch (Exception ex)
{
return;
}
}
List<LayerCfg> LayerCfgList = new List<LayerCfg>();
private void UpdateLayer(TreeListNode child, bool isCheck)
{
if (child != null && child.Nodes != null)
{
foreach (TreeListNode item in child.Nodes)
{
ILayer layer = item.GetValue("Data") as ILayer;
if (layer == null) continue;
if (!isCheck)
{
layer.Visible = false;
}
else if (!item.Checked)
{
layer.Visible = false;
}
else
{
LayerCfg layerCfg = LayerCfgList.Find(a => a.LayerName == layer.Name);
layer.Visible = layerCfg == null ? layer.Visible : GetParentIsChecked(layerCfg);
}
UpdateLayer(item, isCheck);
}
}
}
private bool GetParentIsChecked(LayerCfg layer)
{
if (LayerCfgList == null || LayerCfgList.Count == 0) return true;
LayerCfg parent = LayerCfgList.Find(a => a.Layers.Contains(layer));
if (parent == null)
{
return true;
}
else if (!parent.Visible)
{
return false;
}
else
{
return GetParentIsChecked(parent);
}
}
private void RepositoryItemSpinEdit1_EditValueChanged(object sender, System.EventArgs e)
{
ILayer layer = trlProject.FocusedNode["Data"] as ILayer;
ILayerEffects mLayerEffects = layer as ILayerEffects;
if (mLayerEffects != null)
{
mLayerEffects.Transparency = ((short)(sender as SpinEdit).EditValue.ToInt());
MapsManager.Instance.MapService.getAxMapControl().ActiveView.Refresh();
}
}
/// <summary>
/// 工程树图层显示/隐藏选择状态改变事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void chkLayerVisible_CheckedChanged(object sender, EventArgs e)
{
if (null == trlProject.FocusedNode) return;
CheckEdit chkVisible = sender as CheckEdit;
ILayer layer = trlProject.FocusedNode["Data"] as ILayer;
trlProject.BeginUnboundLoad();
TreeListColumn column = trlProject.Columns.ColumnByName("LayerVisible");
trlProject.SetRowCellValue(trlProject.FocusedNode, column, chkVisible.Checked);
if (trlProject.FocusedNode.ParentNode != null)
{
UpdateParentVisible(trlProject.FocusedNode);
}
if (trlProject.FocusedNode.HasChildren)
{
UpdateChildVisible(trlProject.FocusedNode);
}
trlProject.EndUnboundLoad();
if (layer != null)
{
layer.Visible = chkVisible.Checked;
}
MapsManager.Instance.MapService.getAxMapControl().ActiveView.Refresh();
//this.ActiveView.Refresh();
//ProjectHelper.MakeDirty();
}
/// <summary>
/// 工程树图层可编辑点击事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void chkLayerEditable_Click(object sender, EventArgs e)
{
if (null == trlProject.FocusedNode) return;
TreeListColumn column = trlProject.Columns.ColumnByName("LayerEditable");
object obj = trlProject.GetRowCellValue(trlProject.FocusedNode, column);
if (obj == null) return;
ILayer layer = trlProject.FocusedNode["Data"] as ILayer;
if (null == layer || !layer.Valid || !(layer is IFeatureLayer)) return;
IFeatureLayer featureLayer = layer as IFeatureLayer;
CheckEdit chkLayerEditable = sender as CheckEdit;
switch (chkLayerEditable.CheckState)
{
case CheckState.Checked:
chkLayerEditable.CheckState = CheckState.Unchecked;
featureLayer.Selectable = false;
trlProject.SetRowCellValue(trlProject.FocusedNode, column, false);
//更新编辑捕捉环境
//this.OnSystemSnapChanged();
break;
case CheckState.Unchecked:
chkLayerEditable.CheckState = CheckState.Checked;
featureLayer.Selectable = true;
trlProject.SetRowCellValue(trlProject.FocusedNode, column, true);
//更新编辑捕捉环境
//this.OnSystemSnapChanged();
break;
}
//ProjectHelper.MakeDirty();
}
private TreeListNode mCurrentEditorNode = null;
private void chkLayerEditable_DoubleClick(object sender, EventArgs e)
{
if (null == trlProject.FocusedNode) return;
//TreeListColumn column = trlProject.Columns.ColumnByName("LayerEditable");
//object obj = trlProject.GetRowCellValue(trlProject.FocusedNode, column);
//if (obj == null) return;
List<TreeListNode> nodes = trlProject.GetNodeList();
TreeListColumn column = trlProject.Columns.ColumnByName("LayerEditable");
ILayer layer = trlProject.FocusedNode["Data"] as ILayer;
if (null == layer || !layer.Valid || !(layer is IFeatureLayer)) return;
IFeatureLayer featureLayer = layer as IFeatureLayer;
if (featureLayer != null)
{
IEngineEditor tEngineEdit = new EngineEditorClass();
IEngineEditLayers pEditLayer = tEngineEdit as IEngineEditLayers;
//if (pEditLayer.IsEditable(featureLayer))
//{
if (tEngineEdit.EditState != esriEngineEditState.esriEngineStateEditing)
{
tEngineEdit.StartEditing((featureLayer.FeatureClass as FeatureClass).Workspace, MapsManager.Instance.MapService.getAxMapControl().Map);
}
pEditLayer.SetTargetLayer(featureLayer, 0);
if (mCurrentEditorNode != null)
{
trlProject.SetRowCellValue(mCurrentEditorNode, column, null);
}
trlProject.FocusedNode.SetValue(column, true);
//trlProject.Columns["NodeName"].AppearanceCell.ForeColor = Color.Red;
mCurrentEditorNode = trlProject.FocusedNode;// trlProject.SetRowCellValue(trlProject.FocusedNode, "", true);
//}
//FormatConditionRuleValue ruleForMark = new FormatConditionRuleValue();
//ruleForMark.Condition = FormatCondition.Expression;
//ruleForMark.Expression = "[IsEditable] == true";
//ruleForMark.Appearance.BackColor = Color.Red;
//trlProject.FormatRules.Add(trlProject.Columns["NodeName"], ruleForMark);
}
//ProjectHelper.MakeDirty();
}
//private void txtLayerName_DoubleClick(object sender, EventArgs e)
//{
// ILayer layer = trlProject.FocusedNode["Data"] as ILayer;
// if (null == layer || !layer.Valid || !(layer is IFeatureLayer)) return;
// IFeatureLayer featureLayer = layer as IFeatureLayer;
// if (featureLayer != null)
// {
// IEngineEditLayers pEditLayer = new EngineEditorClass();
// pEditLayer.SetTargetLayer(featureLayer, 0);
// }
//}
/// <summary>
/// 工程树图层可选择状态改变事件方法
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
private void chkLayerSelectable_CheckedChanged(object sender, EventArgs e)
{
try
{
if (null == trlProject.FocusedNode) return;
CheckEdit chkSelectable = sender as CheckEdit;
ILayer layer = trlProject.FocusedNode.GetValue("Data") as ILayer;
trlProject.BeginUnboundLoad();
TreeListColumn column = trlProject.Columns.ColumnByName("LayerSelectable");
trlProject.SetRowCellValue(trlProject.FocusedNode, column, chkSelectable.Checked);
if (trlProject.FocusedNode.ParentNode != null)
{
UpdateParentSelectable(trlProject.FocusedNode);
}
if (trlProject.FocusedNode.HasChildren)
{
UpdateChildSelectable(trlProject.FocusedNode);
}
if (layer is IFeatureLayer)
{
(layer as IFeatureLayer).Selectable = chkSelectable.Checked;
}
trlProject.EndUnboundLoad();
MapsManager.Instance.MapService.getAxMapControl().ActiveView.Refresh();
//ProjectHelper.MakeDirty();
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
}
#endregion
/// <summary>
/// 返回指定节点的索引
/// </summary>
/// <param name="node">节点</param>
/// <returns>节点索引</returns>
public int GetNodeIndex(TreeListNode node)
{
if (null == node) return -1;
if (null == node.ParentNode)
{
return trlProject.Nodes.IndexOf(node);
}
else
{
return node.ParentNode.Nodes.IndexOf(node);
}
}
/// <summary>
/// 返回工程树中指定图层编码的节点
/// </summary>
/// <param name="layerId">图层编码</param>
/// <returns>节点</returns>
public TreeListNode GetNodeByLayerId(string layerId)
{
if (string.IsNullOrEmpty(layerId)) return null;
TreeListColumn column = trlProject.Columns.ColumnByName("Id");
List<TreeListNode> nodes = trlProject.GetNodeList();
TreeListNode layerNode = null;
foreach (TreeListNode node in nodes)
{
if (layerId.Equals(trlProject.GetRowCellValue(node, column) as string, StringComparison.OrdinalIgnoreCase))
{
layerNode = node;
break;
}
}
nodes.Clear();
return layerNode;
}
/// <summary>
/// 返回工程树中可编辑图层节点的集合
/// </summary>
/// <returns>节点集合</returns>
public List<TreeListNode> GetEditableLayerNodes()
{
List<TreeListNode> editableNodes = new List<TreeListNode>();
TreeListColumn column1 = trlProject.Columns.ColumnByName("LayerType");
TreeListColumn column2 = trlProject.Columns.ColumnByName("LayerEditable");
List<TreeListNode> nodes = trlProject.GetNodeList();
object obj = null;
foreach (TreeListNode node in nodes)
{
obj = trlProject.GetRowCellValue(node, column1);
if (null == obj || (int)obj != (int)EnumFeatureLayerType.ShapeFileFeatureLayer) continue;
obj = trlProject.GetRowCellValue(node, column2);
if (null != obj && !(bool)obj) continue;
editableNodes.Add(node);
}
nodes.Clear();
return editableNodes;
}
/// <summary>
/// 返回工程树中正在编辑节点的集合
/// </summary>
/// <returns>节点</returns>
public TreeListNode GetEditingLayerNode()
{
TreeListNode editingNode = null;
TreeListColumn column1 = trlProject.Columns.ColumnByName("LayerType");
TreeListColumn column2 = trlProject.Columns.ColumnByName("LayerEditable");
List<TreeListNode> nodes = trlProject.GetNodeList();
object obj = null;
foreach (TreeListNode node in nodes)
{
obj = trlProject.GetRowCellValue(node, column1);
if (null == obj || (int)obj != (int)EnumFeatureLayerType.ShapeFileFeatureLayer) continue;
obj = trlProject.GetRowCellValue(node, column2);
if (null != obj) continue;
editingNode = node;
break;
}
nodes.Clear();
return editingNode;
}
/// <summary>
/// 更新父节点图层显示的选择状态
/// </summary>
/// <param name="node">工程树节点</param>
public void UpdateParentVisible(TreeListNode node)
{
if (null == node || null == node.ParentNode) return;
object obj = null;
int visibleCount = 0, pendingCount = 0;
TreeListColumn column = trlProject.Columns.ColumnByName("LayerVisible");
foreach (TreeListNode n in node.ParentNode.Nodes)
{
obj = trlProject.GetRowCellValue(n, column);
if (null == obj)
{
pendingCount++;
}
else if ((bool)obj)
{
visibleCount++;
}
}
bool visible = false;
if (pendingCount > 0)
{
trlProject.SetRowCellValue(node.ParentNode, column, null);
visible = true;
}
else if (visibleCount == node.ParentNode.Nodes.Count)
{
trlProject.SetRowCellValue(node.ParentNode, column, true);
visible = true;
}
else if (visibleCount == 0)
{
trlProject.SetRowCellValue(node.ParentNode, column, false);
visible = false;
}
else
{
trlProject.SetRowCellValue(node.ParentNode, column, null);
visible = true;
}
ILayer layer = node.ParentNode["Data"] as ILayer;
if (null != layer && layer.Visible != visible)
{
layer.Visible = visible;
}
if (null != node.ParentNode.ParentNode)
{
UpdateParentVisible(node.ParentNode);
}
}
/// <summary>
/// 更新子节点图层显示的选择状态
/// </summary>
/// <param name="node">工程树节点</param>
public void UpdateChildVisible(TreeListNode node)
{
if (null == node || !node.HasChildren) return;
TreeListColumn column = trlProject.Columns.ColumnByName("LayerVisible");
object obj = trlProject.GetRowCellValue(node, column);
if (null == obj) return;
bool visible = (bool)obj;
ILayer layer = null;
foreach (TreeListNode n in node.Nodes)
{
trlProject.SetRowCellValue(n, column, visible);
layer = n["Data"] as ILayer;
if (null != layer && layer.Visible != visible)
{
layer.Visible = visible;
}
if (n.HasChildren)
{
UpdateChildVisible(n);
}
}
}
/// <summary>
/// 更新父节点图层的可选择状态
/// </summary>
/// <param name="node">工程树节点</param>
public void UpdateParentSelectable(TreeListNode node)
{
if (null == node || null == node.ParentNode) return;
object obj = null;
int visibleCount = 0, pendingCount = 0;
TreeListColumn column = trlProject.Columns.ColumnByName("LayerSelectable");
foreach (TreeListNode n in node.ParentNode.Nodes)
{
obj = trlProject.GetRowCellValue(n, column);
if (null == obj)
{
pendingCount++;
}
else if ((bool)obj)
{
visibleCount++;
}
}
if (pendingCount > 0)
{
trlProject.SetRowCellValue(node.ParentNode, column, null);
}
else if (visibleCount == node.ParentNode.Nodes.Count)
{
trlProject.SetRowCellValue(node.ParentNode, column, true);
}
else if (visibleCount == 0)
{
trlProject.SetRowCellValue(node.ParentNode, column, false);
}
else
{
trlProject.SetRowCellValue(node.ParentNode, column, null);
}
if (null != node.ParentNode.ParentNode)
{
this.UpdateParentSelectable(node.ParentNode);
}
}
/// <summary>
/// 更新子节点图层的可选择状态
/// </summary>
/// <param name="node">工程树节点</param>
public void UpdateChildSelectable(TreeListNode node)
{
if (null == node || !node.HasChildren) return;
TreeListColumn column = trlProject.Columns.ColumnByName("LayerSelectable");
object obj = trlProject.GetRowCellValue(node, column);
if (null == obj) return;
bool selectable = (bool)obj;
ILayer layer = null;
foreach (TreeListNode n in node.Nodes)
{
trlProject.SetRowCellValue(n, column, selectable);
layer = n["Data"] as ILayer;
if (layer is IFeatureLayer)
{
(layer as IFeatureLayer).Selectable = selectable;
}
if (n.HasChildren)
{
UpdateChildSelectable(n);
}
}
}
/// <summary>
/// 显示图层节点
/// </summary>
/// <param name="node">图层节点</param>
public void ShowNode(TreeListNode node)
{
if (null == node) return;
this.trlProject.BeginUpdate();
node.Expand();
this.trlProject.Selection.Clear();
this.trlProject.SelectNode(node);
this.trlProject.SetFocusedNode(node);
this.trlProject.MakeNodeVisible(node);
this.trlProject.EndUpdate();
}
/// <summary>
/// 在父节点下移除已删除图层节点
/// </summary>
/// <param name="parentNode">父节点</param>
/// <param name="layers">图层集合</param>
public void OnLayersRemoved(TreeListNode parentNode, List<ILayer> layers)
{
if (null == layers) return;
trlProject.BeginUnboundLoad();
TreeListNode node = null;
foreach (ILayer layer in layers)
{
node = GetNodeByLayer(parentNode, layer) as TreeListNode;
if (null == node) continue;
if (null != node.ParentNode)
{
node.ParentNode.Nodes.Remove(node);
}
else
{
this.trlProject.Nodes.Remove(node);
}
}
//更新图层可见性
TreeListColumn column = this.trlProject.Columns.ColumnByName("LayerVisible");
if (null != parentNode)
{
TreeListNode updateNode = parentNode;
if (parentNode.HasChildren)
{
updateNode = parentNode.Nodes[0];
}
else if (trlProject.GetRowCellValue(updateNode, column) == null)
{
trlProject.SetRowCellValue(updateNode, column, true);
}
UpdateParentVisible(updateNode);
UpdateChildVisible(updateNode);
UpdateParentSelectable(updateNode);
UpdateChildSelectable(updateNode);
}
trlProject.EndUnboundLoad();
//ProjectHelper.MakeDirty();
}
/// <summary>
/// 查找图层在父节点中的位置索引
/// </summary>
/// <param name="map">地图对象</param>
/// <param name="parentNode">图层父节点</param>
/// <param name="layer">图层</param>
/// <returns>位置索引</returns>
private int FindLayerNodeIndex(IMap map, TreeListNode parentNode, ILayer layer)
{
if (null == layer) return -1;
int layerIndex = this.GetLayerIndex(map, layer);
if (layerIndex == -1) return -1;
TreeListNodes childNodes = null;
if (null == parentNode)
{
childNodes = this.trlProject.Nodes;
}
else
{
childNodes = parentNode.Nodes;
}
int k = 0, childLayerIndex = 0, layerNodeIndex = 0;
ILayer childLayer = null;
foreach (TreeListNode childNode in childNodes)
{
k++;
if (!(childNode.Tag is ILayer)) continue;
childLayer = childNode.Tag as ILayer;
childLayerIndex = this.GetLayerIndex(map, childLayer);
if (childLayerIndex == -1) continue;
if (layerIndex > childLayerIndex) layerNodeIndex = k;
}
return layerNodeIndex;
}
public int GetLayerIndex(IMap map, ILayer layer)
{
if (null == map || null == layer) return -1;
for (int i = 0; i < map.LayerCount; i++)
{
if (map.Layer[i] is ICompositeLayer)
{
ICompositeLayer groupLayer = map.Layer[i] as ICompositeLayer;
for (int j = 0; j < groupLayer.Count; j++)
{
if (groupLayer.Layer[j] == layer) return i + j;
}
}
if (map.get_Layer(i) == layer) return i;
}
return -1;
}
/// <summary>
/// 返回节点状态图片的索引
/// </summary>
/// <param name="node">节点</param>
/// <returns>状态图片索引</returns>
private int GetNodeStateImageIndex(TreeListNode node)
{
if (null == node) return -1;
ILayer layer = node.Tag as ILayer;
if (null == layer)
{
return 5;
}
else if (layer is IFeatureLayer)
{
IFeatureLayer featureLayer = layer as IFeatureLayer;
if (!featureLayer.Valid || null == featureLayer.FeatureClass)
{
return 4;
}
switch (featureLayer.FeatureClass.ShapeType)
{
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultipoint:
return 0;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:
return 1;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:
return 2;
}
}
else if (layer is IRasterLayer)
{
return 3;
}
return -1;
}
/// <summary>
/// 调整图层集合中图层的顺序
/// </summary>
/// <param name="sourceParentLayer">源图层的父图层</param>
/// <param name="targetParentLayer">目标图层的父图层</param>
/// <param name="moveLayers">图层集合</param>
/// <param name="dropAsChilds">是否作为子图层</param>
/// <param name="targetIndex">图层的放置索引</param>
/// <param name="direction">图层的放置方向</param>
private void ReorderLayers(ILayer sourceParentLayer, ILayer targetParentLayer, List<ILayer> moveLayers, int targetIndex)
{
if (null == moveLayers || moveLayers.Count == 0) return;
IMap map = MapsManager.Instance.MapService.getAxMapControl().Map;
IMapLayers2 mapLayers = map as IMapLayers2;
IMapAdmin3 mapAdmin = map as IMapAdmin3;
LayerCfg layerInfo = null;
//LayerCfg cfg = null;//Layers.FirstOrDefault(f => f.Data == sourceParentLayer);
//foreach (var item in Layers)
//{
// if (item.Data == sourceParentLayer)
// {
// cfg = item;
// break;
// }
//}
//移除图层
for (int i = 0; i < moveLayers.Count; i++)
{
//LayerCfg MoveLayerCfg = null;//Layers.FirstOrDefault(f => f.Data == sourceParentLayer);
//foreach (var item in Layers)
//{
// if (item.Data == moveLayers[i])
// {
// MoveLayerCfg = item;
// break;
// }
//}
if (null == sourceParentLayer)
{
map.DeleteLayer(moveLayers[i]);
}
else
{
//CurrentLayers
//if (cfg != null)
//{
// if (MoveLayerCfg != null)
// cfg.Layers.Remove(MoveLayerCfg);
//}
(sourceParentLayer as IGroupLayer).Delete(moveLayers[i]);
}
mapAdmin.FireLayerDeleted(moveLayers[i]);
layerInfo = Layers.FirstOrDefault(f => f.LayerName == moveLayers[i].Name);
if (layerInfo != null)
{
LayerCfg parentLayerInfo = Layers.FirstOrDefault(f => f.ID == layerInfo.PID);
parentLayerInfo.Layers.Remove(layerInfo);
}
}
LayerCfg ParentLayInfo = null;
//增加图层
for (int i = 0; i < moveLayers.Count; i++)
{
if (null == targetParentLayer)
{
mapLayers.InsertLayer(moveLayers[i], false, targetIndex + i);
ParentLayInfo = _CurrentLayers;
}
else
{
mapLayers.InsertLayerInGroup(targetParentLayer as IGroupLayer, moveLayers[i], false, targetIndex + i);
ParentLayInfo = Layers.FirstOrDefault(f => f.LayerName == targetParentLayer.Name);
}
if (ParentLayInfo != null)
{
ParentLayInfo.Layers.Insert(targetIndex, layerInfo);
}
mapAdmin.FireLayerAdded(moveLayers[i]);
}
//ProjectHelper.MakeDirty();
//刷新地图
IActiveView activeView = map as IActiveView;
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography | esriViewDrawPhase.esriViewGeoSelection, null, activeView.Extent);
}
/// <summary>
/// 折叠指定节点的所有子节点
/// </summary>
/// <param name="node">节点</param>
private void CollapseLayerNode(TreeListNode node)
{
if (null == node || !node.HasChildren) return;
foreach (TreeListNode childNode in node.Nodes)
{
CollapseLayerNode(childNode);
}
node.Collapse();
}
/// <summary>
/// 匹配要素样式
/// </summary>
/// <param name="featureLayer">要素图层</param>
/// <param name="fieldName">字段名称</param>
/// <param name="uniqueValues">唯一值集合</param>
/// <param name="uniqueValueRenderer">单一值渲染器</param>
public void MatchFeatureStyle(IFeatureLayer featureLayer, string fieldName, List<object> uniqueValues, IUniqueValueRenderer uniqueValueRenderer)
{
if (null == featureLayer || !featureLayer.Valid || string.IsNullOrEmpty(fieldName) ||
null == uniqueValues || uniqueValues.Count == 0 || null == uniqueValueRenderer) return;
IFeatureClass featureClass = featureLayer.FeatureClass;
ESRI.ArcGIS.Geometry.esriGeometryType geometryType = featureClass.ShapeType;
//设置单值渲染器的属性.
uniqueValueRenderer.FieldCount = 1;
uniqueValueRenderer.set_Field(0, fieldName);
uniqueValueRenderer.DefaultSymbol = GetDefaultFeatureSymbol(geometryType, null);
uniqueValueRenderer.DefaultLabel = null;//Constant.Field_NullValue_Label;
uniqueValueRenderer.UseDefaultSymbol = false;
//设置算术颜色带
bool ok = false;
IAlgorithmicColorRamp randomColorRamp = new AlgorithmicColorRampClass();
randomColorRamp.FromColor = GetColor(100, 100, 60);
randomColorRamp.ToColor = GetColor(0, 100, 100);
randomColorRamp.Size = uniqueValues.Count * 2;
randomColorRamp.CreateRamp(out ok);
IEnumColors enumColors = randomColorRamp.Colors;
enumColors.Reset();
//设置单值渲染器的值和符号
IStyleGalleryItem styleGalleryItem = null;
ISymbol symbol = null;
foreach (string uniqueValue in uniqueValues)
{
switch (geometryType)
{
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultipoint:
styleGalleryItem = this.GetStyleGalleryItem("Marker Symbols", uniqueValue);
break;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:
styleGalleryItem = this.GetStyleGalleryItem("Line Symbols", uniqueValue);
break;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:
styleGalleryItem = this.GetStyleGalleryItem("Fill Symbols", uniqueValue);
break;
}
if (null != styleGalleryItem)
{
symbol = styleGalleryItem.Item as ISymbol;
}
else
{
symbol = GetDefaultFeatureSymbol(geometryType, enumColors.Next());
}
uniqueValueRenderer.AddValue(uniqueValue, fieldName, symbol);
uniqueValueRenderer.set_Heading(uniqueValue, uniqueValue);
uniqueValueRenderer.set_Label(uniqueValue, uniqueValue);
uniqueValueRenderer.set_Description(uniqueValue, uniqueValue);
uniqueValueRenderer.set_Symbol(uniqueValue, symbol);
}
ITable table = featureLayer as ITable;
int fieldIndex = table.Fields.FindField(fieldName);
bool isStringType = table.Fields.get_Field(fieldIndex).Type == ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString;
uniqueValueRenderer.set_FieldType(0, isStringType);
uniqueValueRenderer.ColorScheme = "自定义";
if (null != enumColors) DisposeArcGISObject(enumColors);
if (null != randomColorRamp) DisposeArcGISObject(randomColorRamp);
}
private IStyleGalleryItem GetStyleGalleryItem(string styleClassName, string styleName)
{
if (string.IsNullOrEmpty(styleClassName) || string.IsNullOrEmpty(styleName)) return null;
IEnumStyleGalleryItem enumStyleGalleryItem = null;
IStyleGalleryItem styleGalleryItem = null;
try
{
//enumStyleGalleryItem = this.styleGallery.get_Items(styleClassName, ConfigHelper.GetStyleFile(), null);
//enumStyleGalleryItem.Reset();
//while ((styleGalleryItem = enumStyleGalleryItem.Next()) != null)
//{
// if (styleGalleryItem.Name.Equals(styleName, StringComparison.OrdinalIgnoreCase))
// {
// return styleGalleryItem;
// }
//}
return null;
}
catch (Exception ex)
{
Console.WriteLine(String.Format("获取样式类{0}失败:{1}", styleClassName, ex.Message));
return null;
}
finally
{
if (null != enumStyleGalleryItem)
{
DisposeArcGISObject(enumStyleGalleryItem);
}
}
}
public void DisposeArcGISObject(object obj)
{
if (obj == null) return;
int refCount = 1;
while (refCount > 0)
{
refCount = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
}
obj = null;
}
public static IColor GetColor(int red, int green, int blue)
{
IRgbColor color = new RgbColor();
color.Red = red;
color.Green = green;
color.Blue = blue;
return color as IColor;
}
public ISymbol GetDefaultFeatureSymbol(ESRI.ArcGIS.Geometry.esriGeometryType shapeType, IColor color)
{
switch (shapeType)
{
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultipoint:
ISimpleMarkerSymbol markerSymbol = new SimpleMarkerSymbolClass();
markerSymbol.Style = ESRI.ArcGIS.Display.esriSimpleMarkerStyle.esriSMSCircle;
markerSymbol.Size = 7;
markerSymbol.Color = color == null ? GetColor(0, 166, 116) : color;
markerSymbol.Outline = true;
markerSymbol.OutlineSize = 1;
markerSymbol.OutlineColor = GetColor(78, 78, 78);
return markerSymbol as ISymbol;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:
ISimpleLineSymbol lineSymbol = new SimpleLineSymbolClass();
lineSymbol.Style = ESRI.ArcGIS.Display.esriSimpleLineStyle.esriSLSSolid;
lineSymbol.Color = color == null ? GetColor(230, 152, 0) : color;
lineSymbol.Width = 1;
return lineSymbol as ISymbol;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:
ISimpleLineSymbol borderSymbol = new SimpleLineSymbol();
borderSymbol.Style = ESRI.ArcGIS.Display.esriSimpleLineStyle.esriSLSSolid;
borderSymbol.Color = GetColor(110, 110, 110);
borderSymbol.Width = 0.4;
ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
simpleFillSymbol.Style = ESRI.ArcGIS.Display.esriSimpleFillStyle.esriSFSSolid;
simpleFillSymbol.Color = color == null ? GetColor(238, 205, 247) : color;
simpleFillSymbol.Outline = borderSymbol;
return simpleFillSymbol as ISymbol;
}
return null;
}
/// <summary>
/// 标注要素图层
/// </summary>
/// <param name="featureLayer">要素图层</param>
/// <param name="labelExpression">标注表达式</param>
/// <param name="labelTextSymbol">标注文字符号</param>
private void LabelFeatureLayer(IFeatureLayer featureLayer, string labelExpression, ITextSymbol labelTextSymbol)
{
//if (null == featureLayer || !featureLayer.Valid || string.IsNullOrEmpty(labelExpression)) return;
//ILabelEngineLayerProperties2 labelEngineLayerProperties = null;
//Response response = MapHelper.CreateFeatureLayerLabelProperties(featureLayer, labelExpression, labelTextSymbol, out labelEngineLayerProperties);
//if (response.Code == Constant.Success)
//{
// IAnnotateLayerProperties annotateLayerProperties = labelEngineLayerProperties as IAnnotateLayerProperties;
// IGeoFeatureLayer geoFeatureLayer = featureLayer as IGeoFeatureLayer;
// geoFeatureLayer.AnnotationProperties.Clear();
// geoFeatureLayer.AnnotationProperties.Add(annotateLayerProperties);
// geoFeatureLayer.DisplayAnnotation = true;
//}
}
public void InitCatalogContextMenus(IEnumerable<ContentMenuItemEntity> itemDatas)
{
if (itemDatas == null)
return;
if (_CmdManager == null)
_CmdManager = BundleRuntime.Instance.GetFirstOrDefaultService<ICommandManager>();
if (_MapService == null)
{
_MapService = BundleRuntime.Instance.GetFirstOrDefaultService<IMapService>();
}
if (_LayerPropertyService == null)
{
_LayerPropertyService = BundleRuntime.Instance.GetFirstOrDefaultService<ILayerPropertyService>();
}
foreach (var item in itemDatas)
{
BarItem barItem = DealWithCatalogContextMenus(item);
switch (item.ContentItemType)
{
case "Map":
popMapMenu.AddItem(barItem);
break;
case "Group":
popGroupMenu.AddItem(barItem);
break;
case "Layer":
popLayerMenu.AddItem(barItem);
break;
case "WMTSLayer":
popLayerMenu.AddItem(barItem);
break;
default:
break;
}
}
}/// <summary>
/// 将配置列表数据加载成右击菜单项
/// </summary>
/// <param name="pMenuItem"></param>
/// <returns></returns>
private BarItem DealWithCatalogContextMenus(ContentMenuItemEntity pMenuItem)
{
try
{
BarItem bar = null;
if (pMenuItem.Childs != null && pMenuItem.Childs.Count > 0)
{
bar = new BarSubItem();
bar.Caption = pMenuItem.Name;
bar.Glyph = pMenuItem.GetImage();
//创建子项
foreach (var item in pMenuItem.Childs)
{
BarItem subItem = DealWithCatalogContextMenus(item);
(bar as BarSubItem).AddItem(subItem);
barManager1.Items.Add(bar);
if (ExtendMethd.JudgeIsCouldConversionStringOrHasValue(item.ParentId) == false)
{
switch (item.ContentItemType)
{
case "Map":
popMapMenu.AddItem(subItem);
break;
case "Group":
popGroupMenu.AddItem(subItem);
break;
case "Layer":
popLayerMenu.AddItem(subItem);
break;
case "WMTSLayer":
popLayerMenu.AddItem(subItem);
break;
default:
break;
}
}
}
}
else
{
bar = new BarButtonItem();
bar.Caption = pMenuItem.Name;
bar.ItemClick += Bar_ItemClick;
bar.Glyph = pMenuItem.GetImage();
if (_CmdManager != null)
bar.Tag = _CmdManager.AddCmd(pMenuItem.CommandId, pMenuItem.Bundle, null);
if (bar.Tag is BaseMapMenuCommand && _MapService != null)
{
(bar.Tag as BaseMapMenuCommand).OnCreate(_MapService.getAxMapControl().Object);
}
else
if (bar.Tag is ICommand && _MapService != null)
{
(bar.Tag as ICommand).OnCreate(_MapService.getAxMapControl().Object);
}
barManager1.Items.Add(bar);
}
return bar;
}
catch (Exception ex)
{
LogAPI.Debug("执行 将配置列表数据加载成右击菜单项 方法时异常:" + ex + " ; ");
return null;
}
finally
{
}
}
private void Bar_ItemClick(object sender, ItemClickEventArgs e)
{
BarItem item = e.Item as BarItem;
if (item == null || item.Tag == null)
{
return;
}
try
{
if (item.Tag is ITool && _MapService != null)
{
_MapService.SetCurrentTool(item.Tag);
}
else
if (item.Tag is BaseMapMenuCommand)
{
CommandManagerInvoke.ExeCommand(item.Tag, null);
if (item is BarCheckItem)
{
(item as BarCheckItem).Checked = (item.Tag as BaseMapMenuCommand).Checked;
}
}
else
if (item.Tag is ICommand)
{
(item.Tag as ICommand).OnClick();
if (item is BarCheckItem)
{
(item as BarCheckItem).Checked = (item.Tag as ICommand).Checked;
}
}
}
catch (Exception ex)
{
LogAPI.Debug(string.Format("执行【{0}】命令异常,异常信息如下:", item.Caption));
LogAPI.Debug(ex);
LogAPI.Debug("异常信息结束");
}
}
public void InitLayerTree(IMap pMap)
{
try
{
//InitTreeNode(pMap);
}
catch (Exception ex)
{
MessageHelper.Show("初始化图层树时发生异常,异常信息请查看日志文件");
LogAPI.Debug(string.Format("初始化图层树失败:", ex.Message));
LogAPI.Debug(ex);
LogAPI.Debug("异常信息结束");
}
}
private void repositoryItemPictureEdit1_DoubleClick(object sender, EventArgs e)
{
try
{
if (null == trlProject.FocusedNode) return;
ILayer layer = trlProject.FocusedNode["Data"] as ILayer;
if (layer != null)
{
if (layer is IFeatureLayer && _LayerPropertyService != null)
{
_LayerPropertyService.SetLayerStyle(layer);
Bitmap symbol = new Bitmap(22, 16);
IGeoFeatureLayer fcLayer = layer as IGeoFeatureLayer;
if (fcLayer != null)
{
ISimpleRenderer render = fcLayer.Renderer as ISimpleRenderer;
IUniqueValueRenderer un = null;
if (render == null)
{
un = fcLayer.Renderer as IUniqueValueRenderer;
}
else
{
symbol = PreViewFillSymbol(render.Symbol, 22, 16);
}
}
byte[] bytes = null;
if (symbol == null)
{
symbol = new Bitmap(22, 16);
}
MemoryStream ms = new MemoryStream();
symbol.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
bytes = ms.GetBuffer(); //byte[] bytes= ms.ToArray(); 这两句都可以,至于区别么,下面有解释
ms.Close();
TreeListColumn column = trlProject.Columns.ColumnByName("colSymbol");
trlProject.SetRowCellValue(trlProject.FocusedNode, column, symbol);
MapsManager.Instance.MapService.getAxMapControl().ActiveView.ContentsChanged();
MapsManager.Instance.MapService.getAxMapControl().ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground | esriViewDrawPhase.esriViewForeground |
esriViewDrawPhase.esriViewGeography | esriViewDrawPhase.esriViewGeoSelection |
esriViewDrawPhase.esriViewGraphics | esriViewDrawPhase.esriViewGraphicSelection, null, MapsManager.Instance.MapService.getAxMapControl().ActiveView.Extent);
MapsManager.Instance.MapService.getAxMapControl().Refresh();
}
}
}
catch (Exception ex)
{
LogAPI.Debug("设置图层样式界面加载失败:" + ex);
MessageHelper.Show("设置图层样式界面加载失败:" + ex);
}
}
private void colLayerName_DoubleClick(object sender, EventArgs e)
{
}
private void btnLayerName_DoubleClick(object sender, EventArgs e)
{
try
{
//if (e.Button != MouseButtons.Left) return;
//TreeList tree = s as TreeList;
//TreeListHitInfo _hitInfo = tree.CalcHitInfo(e.Location);
//TreeListNode CurrentNode = _hitInfo.Node;
//ILayer layer = trlProject.FocusedNode.GetValue("Data") as ILayer;
if (trlProject.FocusedNode != null)
{
var Data = trlProject.FocusedNode["Data"];
if (Data is IFeatureLayer)
{
TreeListColumn column = trlProject.Columns.ColumnByName("LayerEditable");
IFeatureLayer featureLayer = Data as IFeatureLayer;
//IEngineEditor tEngineEdit = new EngineEditorClass();
IEngineEditLayers pEditLayer = _Edit as IEngineEditLayers;
//if (pEditLayer.IsEditable(featureLayer))
IWorkspace ws = (featureLayer.FeatureClass as FeatureClass).Workspace;
if (_Edit.EditState != esriEngineEditState.esriEngineStateEditing)
{
ProjectInfo ProInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo;
if (ProInfo != null)
{
_Edit.StartEditing(ws, MapsManager.Instance.MapService.getAxMapControl().Map);
}
}
else if (_Edit.EditWorkspace != ws)
{
if (_Edit.HasEdits())
{
DialogResult r = MessageHelper.ShowYesNoCancelAndTips("当前图层存在编辑为保存,是否保存编辑内容?");
if (r == DialogResult.Cancel)
return;
_Edit.StopEditing(r == DialogResult.Yes);
_Edit.StartEditing(ws, MapsManager.Instance.MapService.getAxMapControl().Map);
}
else
{
_Edit.StopEditing(false);
_Edit.StartEditing(ws, MapsManager.Instance.MapService.getAxMapControl().Map);
}
}
pEditLayer.SetTargetLayer(featureLayer, 0);
if (mCurrentEditorNode != null)
{
trlProject.SetRowCellValue(mCurrentEditorNode, "IsEdit", false);
trlProject.SetRowCellValue(mCurrentEditorNode, "ImgIndex", 0);
}
trlProject.FocusedNode.SetValue("IsEdit", true);
trlProject.FocusedNode.SetValue("ImgIndex", 1);
//trlProject.Columns["NodeName"].AppearanceCell.ForeColor = Color.Red;
mCurrentEditorNode = trlProject.FocusedNode;
}
//DataEntity nodeData = tree.GetDataRecordByNode(CurrentNode) as DataEntity;
//ResetNode(nodeData);
//ClosePopup();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
LogAPI.Debug("双击图层开启编辑失败:" + ex.Message);
}
}
private void btnLayerName_Click(object sender, EventArgs e)
{
if (e is MouseEventArgs)
{
if ((e as MouseEventArgs).Button == MouseButtons.Right)
{
MouseEventArgs eArgs = (e as MouseEventArgs);
System.Drawing.Point p = (sender as ButtonEdit).PointToScreen((e as MouseEventArgs).Location);
System.Drawing.Point p1 = trlProject.PointToClient(p);
MouseEventArgs args = new MouseEventArgs(eArgs.Button, eArgs.Clicks, p1.X, p1.Y, eArgs.Delta);
trlProject_MouseUp(trlProject, args);
}
}
}
}
public enum EnumFeatureLayerType : byte
{
Unkonwn = 0,
ShapeFileFeatureLayer = 1,
CADFeatureLayer = 2,
SurveyFeatureLayer = 3,
FileGDBFeatureLayer = 4,
PersonalGDBFeatureLayer = 5,
EnterpriseGDBFeatureLayer = 6,
CADAnnotationFeatureLayer = 7,
CoverageFeatureLayer = 8,
CoverageAnnotationFeatureLayer = 9,
}
public class NodeData
{
public int NodeID { get; set; }
public int NodePID { get; set; }
public string NodeName { get; set; }
public bool IsVisible { get; set; }
public bool IsSelectable { get; set; }
public bool IsEditable { get; set; }
public int NodeType { get; set; }
}
}