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 layers = new List(); public virtual ESRI.ArcGIS.Geometry.esriGeometryHitPartType HitPartType { get { return ESRI.ArcGIS.Geometry.esriGeometryHitPartType.esriGeometryPartNone; } } public bool Checked { get { if (snapEnv.SnapAgentCount != 0) { //List layers = GetVisibleLayer(m_hookHelper.FocusMap); //layers = FrmSnapSetting.checkedLayers; //若未进行捕捉设置,则获取当前显示图层 if (layers.Count <= 0) { layers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap(); } 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(); //layers = FrmSnapSetting.checkedLayers; if (layers.Count <= 0) { layers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap(); } 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(); 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 获取所有可见图层 ///// ///// 获取当前地图中可见的矢量图层 ///// ///// ///// //private List GetVisibleLayer(IMap pMap) //{ // List result = new List(); // 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 GetVisibleLayerByGroupLayer(ICompositeLayer pGroupLayer) //{ // List result = new List(); // 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 } }