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

494 lines
20 KiB

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using Kingo.Plugin.MapView.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kingo.Plugin.MapView.Commands
{
public class BaseSnapCommand : ICheckBarItem
{
private IHookHelper m_hookHelper;
private EngineEditorClass m_editor = new EngineEditorClass();
private IEngineSnapEnvironment snapEnv = null;
private bool IsChecked = false;
List<IFeatureLayer> layers = new List<IFeatureLayer>();
public virtual ESRI.ArcGIS.Geometry.esriGeometryHitPartType HitPartType { get { return ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartNone; } }
public bool Checked
{
get
{
if (snapEnv.SnapAgentCount != 0)
{
//List<IFeatureLayer> layers = GetVisibleLayer(m_hookHelper.FocusMap);
//layers = FrmSnapSetting.checkedLayers;
//若未进行捕捉设置,则获取当前显示图层
if (layers.Count <= 0)
{
layers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>();
}
if (layers.Count != snapEnv.SnapAgentCount)
{
ESRI.ArcGIS.Geometry.esriGeometryHitPartType partType = (snapEnv.get_SnapAgent(0) as IEngineFeatureSnapAgent).HitType;
snapEnv.ClearSnapAgents();
foreach (IFeatureLayer item in layers)
{
IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap();
featureSnapAgent.FeatureClass = item.FeatureClass;
featureSnapAgent.HitType = partType;
snapEnv.AddSnapAgent(featureSnapAgent);
}
}
}
return IsChecked;
}
}
public virtual void OnCreate(object hook)
{
try
{
snapEnv = (IEngineSnapEnvironment)m_editor;
if (hook == null)
{
return;
}
if (m_hookHelper == null)
{
m_hookHelper = new HookHelper();
m_hookHelper.Hook = hook;
}
if (m_hookHelper.ActiveView == null)
{
m_hookHelper = null;
return;
}
layers = null;
}
catch (Exception ex)
{
LogAPI.Debug("加载 BaseSnap 类时失败,异常原因: " + ex + " ; ");
m_hookHelper = null;
}
}
private IMapService _MapService;
public virtual void OnClick()
{
try
{
snapEnv.SnapTolerance = 15;
this.IsChecked = !this.IsChecked;
if (this.IsChecked)
{
layers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>();
//layers = FrmSnapSetting.checkedLayers;
if (layers.Count <= 0)
{
layers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>();
}
if (snapEnv.SnapAgentCount != layers.Count)
{
snapEnv.ClearSnapAgents();
foreach (IFeatureLayer item in layers)
{
IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap();
featureSnapAgent.FeatureClass = item.FeatureClass;
featureSnapAgent.HitType = HitPartType;
snapEnv.AddSnapAgent(featureSnapAgent);
}
}
else
{
for (int i = 0; i < snapEnv.SnapAgentCount; i++)
{
IEngineFeatureSnapAgent featureSnapAgent = snapEnv.get_SnapAgent(i) as IEngineFeatureSnapAgent;
if (featureSnapAgent != null && (featureSnapAgent.HitType & HitPartType) != HitPartType)
{
featureSnapAgent.HitType = featureSnapAgent.HitType | HitPartType;
}
}
}
}
else
{
if (snapEnv.SnapAgentCount > 0)
{
IEngineFeatureSnapAgent featureSnapAgent = snapEnv.get_SnapAgent(0) as IEngineFeatureSnapAgent;
if (featureSnapAgent != null && (featureSnapAgent.HitType & HitPartType) == HitPartType)
{
if ((featureSnapAgent.HitType ^ HitPartType) == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartNone)
{
snapEnv.ClearSnapAgents();
}
else
{
for (int i = 0; i < snapEnv.SnapAgentCount; i++)
{
IEngineFeatureSnapAgent snapAgent = snapEnv.get_SnapAgent(i) as IEngineFeatureSnapAgent;
if (snapAgent != null && (snapAgent.HitType & HitPartType) == HitPartType)
{
snapAgent.HitType = snapAgent.HitType ^ HitPartType;
}
}
}
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
finally
{
}
}
//public virtual void OnClick()
//{
// try
// {
// _MapService = Platform.Instance.MapsService;
// IPoint IPointNow = m_editor.LastPoint;
// //double dX = IPointNow.X;
// //double dY = IPointNow.Y;
// int iMark = 0;
// if (iMark == 1)
// {
// OnClickReal();
// return;
// }
// snapEnv.SnapTolerance = 15;
// this.IsChecked = !this.IsChecked;
// if (this.IsChecked)//点击了
// {
// layers = KGIS.Framework.AE.IFeatureLayerAPI.GetLayers(m_hookHelper.FocusMap, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryNull, true);
// //if (snapEnv.SnapAgentCount != layers.Count)
// //{
// int iCTemp1 = snapEnv.SnapAgentCount;
// snapEnv.ClearSnapAgents();
// int iCTemp2 = snapEnv.SnapAgentCount;
// foreach (IFeatureLayer item in layers)
// {
// //public static IPoint getSnapPoint(AxMapControl mainMap, IPoint QueryPoint, IFeatureLayer pFeatureLayer, string snapStyle)
// if(IPointNow!=null)
// {
// var v1 = (m_hookHelper.Hook as AxMapControl);
// var v2 = (m_hookHelper as AxMapControl);
// var v3 = (_MapService.getAxMapControl() as AxMapControl);
// IPoint ipO = GetSnapPointBZ.getSnapPoint(v3, IPointNow, item, "线中点");
// snapEnv.SnapPoint(ipO);
// }
// IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap();
// featureSnapAgent.FeatureClass = item.FeatureClass;
// featureSnapAgent.HitType = HitPartType;
// snapEnv.AddSnapAgent(featureSnapAgent);
// }
// m_hookHelper.ActiveView.Refresh();//刷新图层
// //}
// //else
// //{
// // for (int i = 0; i < snapEnv.SnapAgentCount; i++)
// // {
// // IEngineFeatureSnapAgent featureSnapAgent = snapEnv.get_SnapAgent(i) as IEngineFeatureSnapAgent;
// // if (featureSnapAgent != null)
// // {
// // featureSnapAgent.HitType = ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartMidpoint;
// // }
// // }
// //}
// }
// else
// {
// if (snapEnv.SnapAgentCount > 0)
// {
// snapEnv.ClearSnapAgents();
// }
// }
// }
// catch (Exception ex)
// {
// LogAPI.Debug(ex);
// }
// finally
// {
// }
//}
public virtual void OnClickReal()
{
snapEnv.SnapTolerance = 150;
this.IsChecked = !this.IsChecked;
if (this.IsChecked)//点击了
{
layers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>();
if (snapEnv.SnapAgentCount != layers.Count)
{
snapEnv.ClearSnapAgents();
foreach (IFeatureLayer item in layers)
{
IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap();
featureSnapAgent.FeatureClass = item.FeatureClass;
featureSnapAgent.HitType = HitPartType;
snapEnv.AddSnapAgent(featureSnapAgent);
}
}
else
{
for (int i = 0; i < snapEnv.SnapAgentCount; i++)
{
IEngineFeatureSnapAgent featureSnapAgent = snapEnv.get_SnapAgent(i) as IEngineFeatureSnapAgent;
//LogAPI.Debug("featureSnapAgent.HitType 为 " + featureSnapAgent.HitType + " ; ");
//LogAPI.Debug("HitPartType 为 " + HitPartType + " ; ");
//var vTemp11 = featureSnapAgent.HitType & HitPartType;
//LogAPI.Debug("featureSnapAgent.HitType & HitPartType 为 " + vTemp11 + " ; ");
//var vTemp12 = featureSnapAgent.HitType | HitPartType;
//LogAPI.Debug("featureSnapAgent.HitType | HitPartType 为 " + vTemp12 + " ; ");
//bool b11 = (featureSnapAgent.HitType & HitPartType) != HitPartType;
//LogAPI.Debug(" (featureSnapAgent.HitType & HitPartType) != HitPartType 为 " + b11 + " ; ");
if (featureSnapAgent != null && (featureSnapAgent.HitType & HitPartType) != HitPartType)
{
featureSnapAgent.HitType = featureSnapAgent.HitType | HitPartType;
//if(featureSnapAgent.HitType== ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartBoundary)
//{
// int i55 = 1;
//}
//if (featureSnapAgent.HitType == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartVertex)
//{
// int i55 = 1;
//}
//if (featureSnapAgent.HitType == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartEndpoint)
//{
// int i55 = 1;
//}
//if (featureSnapAgent.HitType == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartMidpoint)
//{
// int i55 = 1;
//}
}
}
}
}
else//未点击
{
if (snapEnv.SnapAgentCount > 0)
{
IEngineFeatureSnapAgent featureSnapAgent = snapEnv.get_SnapAgent(0) as IEngineFeatureSnapAgent;
//LogAPI.Debug("featureSnapAgent.HitType 为 " + featureSnapAgent.HitType + " ; ");
//LogAPI.Debug("HitPartType 为 " + HitPartType + " ; ");
//var vTemp21 = featureSnapAgent.HitType ^ HitPartType;
//LogAPI.Debug("featureSnapAgent.HitType ^ HitPartType 为 " + vTemp21 + " ; ");
//var b21 = (featureSnapAgent.HitType & HitPartType) == HitPartType;
//LogAPI.Debug(" (featureSnapAgent.HitType & HitPartType) == HitPartType 为 " + b21 + " ; ");
if (featureSnapAgent != null && (featureSnapAgent.HitType & HitPartType) == HitPartType)
{
//var vTemp22 = featureSnapAgent.HitType ^ HitPartType;
//LogAPI.Debug("featureSnapAgent.HitType ^ HitPartType 为 " + vTemp22 + " ; ");
if ((featureSnapAgent.HitType ^ HitPartType) == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartNone)
{
snapEnv.ClearSnapAgents();
}
else
{
for (int i = 0; i < snapEnv.SnapAgentCount; i++)
{
IEngineFeatureSnapAgent snapAgent = snapEnv.get_SnapAgent(i) as IEngineFeatureSnapAgent;
//var vTemp23 = snapAgent.HitType & HitPartType;
//LogAPI.Debug("snapAgent.HitType & HitPartType 为 " + vTemp23 + " ; ");
//var b22 = (snapAgent.HitType & HitPartType) == HitPartType;
//LogAPI.Debug(" (snapAgent.HitType & HitPartType) == HitPartType 为 " + b22 + " ; ");
if (snapAgent != null && (snapAgent.HitType & HitPartType) == HitPartType)
{
//var vTemp24 = snapAgent.HitType ^ HitPartType;
//LogAPI.Debug("snapAgent.HitType ^ HitPartType 为 " + vTemp24 + " ; ");
snapAgent.HitType = snapAgent.HitType ^ HitPartType;
//if (snapAgent.HitType == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartBoundary)
//{
// int i55 = 1;
//}
//if (snapAgent.HitType == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartVertex)
//{
// int i55 = 1;
//}
//if (snapAgent.HitType == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartEndpoint)
//{
// int i55 = 1;
//}
//if (snapAgent.HitType == ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartMidpoint)
//{
// int i55 = 1;
//}
}
}
}
}
}
}
}
public int Bitmap
{
get { return 0; }
}
public string Caption
{
get { return ""; }
}
public string Category
{
get { return ""; }
}
public bool Enabled
{
get { return m_editor.EditState == esriEngineEditState.esriEngineStateEditing; }
}
public int HelpContextID
{
get { return 0; }
}
public string HelpFile
{
get { return ""; }
}
public string Message
{
get { return ""; }
}
public string Name
{
get { return ""; }
}
public virtual string Tooltip
{
get { return ""; }
}
#region 获取所有可见图层
///// <summary>
///// 获取当前地图中可见的矢量图层
///// </summary>
///// <param name="pMap"></param>
///// <returns></returns>
//private List<IFeatureLayer> GetVisibleLayer(IMap pMap)
//{
// List<IFeatureLayer> result = new List<IFeatureLayer>();
// if (pMap == null)
// return result;
// try
// {
// for (int i = 0; i < pMap.LayerCount; i++)
// {
// ILayer layer = pMap.get_Layer(i);
// if (layer is IFeatureLayer)
// {
// if ((layer as IFeatureLayer).Visible)
// {
// result.Add(layer as IFeatureLayer);
// }
// }
// else if (layer is ICompositeLayer)
// {
// if ((layer as IGroupLayer).Visible)
// {
// result.AddRange(GetVisibleLayerByGroupLayer(layer as ICompositeLayer));
// }
// }
// }
// }
// catch (Exception ex)
// {
// LogAPI.Debug("获取当前地图中可见的矢量图层时失败,异常原因:" + ex + " ; ");
// }
// return result;
//}
//private List<IFeatureLayer> GetVisibleLayerByGroupLayer(ICompositeLayer pGroupLayer)
//{
// List<IFeatureLayer> result = new List<IFeatureLayer>();
// if (pGroupLayer != null && pGroupLayer.Count > 0)
// {
// for (int i = 0; i < pGroupLayer.Count; i++)
// {
// ILayer layer = pGroupLayer.get_Layer(i);
// if (layer is IAnnotationLayer)
// {
// }
// else if (layer is IGroupLayer)
// {
// if ((layer as IGroupLayer).Visible)
// {
// result.AddRange(GetVisibleLayerByGroupLayer(layer as ICompositeLayer));
// }
// }
// else
// {
// if (layer is IFeatureLayer)
// {
// if ((layer as IFeatureLayer).Visible)
// {
// result.Add((IFeatureLayer)layer);
// }
// }
// }
// }
// }
// return result;
//}
#endregion
}
}