//======================================================================
//
//        成都同飞科技地下管网GIS系统
//
//        CLR 版本: 4.0.30319.42000
//        命名空间: GNetworkProcessTool
//        类    名: GNetworkHelper
//        创 建 人: 汤云伟
//        创建时间: 2017/5/10 10:05:55
//        修 改 人: 
//        修改时间: 
//
//======================================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using ESRI.ArcGIS.Geodatabase;

namespace GNetworkProcessTool
{
    /// <summary>
    /// 几何网络协助器
    /// </summary>
    public class GNetworkHelper
    {
        /// <summary>
        /// 
        /// </summary>
        private static Dictionary<int, Dictionary<string, int>> _dicLayerFieldIndex = new Dictionary<int, Dictionary<string, int>>();


        /// <summary>
        /// 检查‘0长度’连接关系
        /// </summary>
        /// <param name="featChecking">待检查要素</param>
        /// <returns>要素连接是否正确(true -正确; false - 错误;)</returns>
        public static bool CheckConnectionZeroLength(IFeature featChecking)
        {
            bool __bErrorConnection = false;

            if (featChecking.FeatureType == esriFeatureType.esriFTSimpleEdge)
            {
                IEdgeFeature __simEdge = featChecking as IEdgeFeature;
                __bErrorConnection = (__simEdge.FromJunctionEID == __simEdge.ToJunctionEID);    //边要素连接关系异常检查(0长度、微短线)
            }

            return (__bErrorConnection == false);
        }
        /// <summary>
        /// 检查边要素连接关系
        /// </summary>
        /// <param name="featChecking">待检查要素</param>
        /// <returns>要素连接是否正确(true -正确; false - 错误;)</returns>
        public static bool CheckConnectionEdge(IFeature featChecking)
        {
            bool __bErrorConnection = false;

            if (featChecking.FeatureType == esriFeatureType.esriFTSimpleEdge)
            {
                if (GNetworkHelper._dicLayerFieldIndex.ContainsKey(featChecking.Class.ObjectClassID) == false)
                {
                    GNetworkHelper._dicLayerFieldIndex.Add(featChecking.Class.ObjectClassID, new Dictionary<string, int>());
                    GNetworkHelper._dicLayerFieldIndex[featChecking.Class.ObjectClassID].Add("NODE1_ID", featChecking.Fields.FindField("NODE1_ID"));
                    GNetworkHelper._dicLayerFieldIndex[featChecking.Class.ObjectClassID].Add("NODE2_ID", featChecking.Fields.FindField("NODE2_ID"));
                }
                IEdgeFeature __simEdge = featChecking as IEdgeFeature;
                ISimpleJunctionFeature __simJunctionFrom = __simEdge.FromJunctionFeature as ISimpleJunctionFeature;
                ISimpleJunctionFeature __simJunctionTo = __simEdge.ToJunctionFeature as ISimpleJunctionFeature;
                string __strFJunctionClass = ((__simEdge.FromJunctionFeature as IFeature).Class as IDataset).BrowseName;
                string __strTJunctionClass = ((__simEdge.ToJunctionFeature as IFeature).Class as IDataset).BrowseName;

                if ((__strFJunctionClass.EndsWith("GASDATASET_Net_Junctions") && __simJunctionFrom.EdgeFeatureCount == 1)
                    || (__strTJunctionClass.EndsWith("GASDATASET_Net_Junctions") && __simJunctionTo.EdgeFeatureCount == 1))
                {
                    string __strNode1 = Convert.ToString(featChecking.get_Value(GNetworkHelper._dicLayerFieldIndex[featChecking.Class.ObjectClassID]["NODE1_ID"]));
                    string __strNode2 = Convert.ToString(featChecking.get_Value(GNetworkHelper._dicLayerFieldIndex[featChecking.Class.ObjectClassID]["NODE2_ID"]));

                    __bErrorConnection = (__strNode1 != "0" || __strNode2 != "0");
                }
            }

            return (__bErrorConnection == false);
        }
        /// <summary>
        /// 检查三通要素连接关系
        /// </summary>
        /// <param name="featChecking">待检查要素</param>
        /// <returns>要素连接是否正确(true -正确; false - 错误;)</returns>
        public static bool CheckConnectionTEE(IFeature featChecking)
        {
            bool __bErrorConnection = false;

            if (featChecking.FeatureType == esriFeatureType.esriFTSimpleJunction && (featChecking.Class as IDataset).BrowseName.EndsWith("TEE_N"))
            {
                if (GNetworkHelper._dicLayerFieldIndex.ContainsKey(featChecking.Class.ObjectClassID) == false)
                {
                    GNetworkHelper._dicLayerFieldIndex.Add(featChecking.Class.ObjectClassID, new Dictionary<string, int>());
                    GNetworkHelper._dicLayerFieldIndex[featChecking.Class.ObjectClassID].Add("NODE1_ID", featChecking.Fields.FindField("NODE1_ID"));
                    GNetworkHelper._dicLayerFieldIndex[featChecking.Class.ObjectClassID].Add("NODE2_ID", featChecking.Fields.FindField("NODE2_ID"));
                }
                string __strNode1 = Convert.ToString(featChecking.get_Value(GNetworkHelper._dicLayerFieldIndex[featChecking.Class.ObjectClassID]["NODE1_ID"]));
                string __strNode2 = Convert.ToString(featChecking.get_Value(GNetworkHelper._dicLayerFieldIndex[featChecking.Class.ObjectClassID]["NODE2_ID"]));
                ISimpleJunctionFeature __simJunction = featChecking as ISimpleJunctionFeature;

                __bErrorConnection = (__strNode1 != "0" && __strNode2 != "0" && __simJunction.EdgeFeatureCount < 2);
            }

            return (__bErrorConnection == false);
        }
    }
}