public ConnectivityInfo GetParent(double x, double y)
        {
            ConnectivityInfo conInfo = null;
            List<Node> snappedNodes = GetSnappedNodes(x, y);
            Node snappedNode = null;
            if (snappedNodes != null && snappedNodes.Count > 0)
            {
                if (snappedNodes.Count > 1)
                    return null;//snappedNode = snappedNodes.First(nd => StatusExtensions.IsNetJunction(nd.status));
                else
                    snappedNode = snappedNodes[0];
                int phaseCode = 128;
                int constrPhaseCode = 128;
                Section parentSection = null;
                if (snappedNode.parentList.Count > 0)
                {
                    phaseCode = GetPhaseCodeFromParentSections(snappedNode);
                    constrPhaseCode = GetConstructedPhaseCodeFromParentSections(snappedNode);
                    parentSection = SelectParentFromParentSections(snappedNode);
                }
                else
                {
                    phaseCode = GetPhaseCodeFromChildSections(snappedNode);
                    constrPhaseCode = GetConstructedPhaseCodeFromChildSections(snappedNode);
                    parentSection = SelectParentFromChildSections(snappedNode);
                }

                if (parentSection != null)
                {
                    conInfo = new ConnectivityInfo();
                    conInfo.connectedEdges = GetConnectedSections(snappedNode);
                    conInfo.parentFeature = parentSection;
                    conInfo.phaseCode = phaseCode;
                    conInfo.snappedNodes = snappedNodes;
                    conInfo.constructedPhaseCode = constrPhaseCode;
                    if(StatusExtensions.IsEnergized(parentSection.status))
                        conInfo.status = Constants.Energized;
                    if (StatusExtensions.IsUnenergized(parentSection.status))
                        conInfo.status = Constants.Unenergized;
                    if (StatusExtensions.IsLoop(parentSection.status))
                        conInfo.status = Constants.Loop;
                }
            }
            return conInfo;
        }
        //public void GetNodeStatusToSection(Node nd, Section sec)
        //{
        //    if (StatusExtensions.IsUnenergized(nd.status))
        //    {
        //        netJn.status = Constants.Unenergized + Constants.NetJunction;
        //    }
        //    else if (StatusExtensions.IsEnergized(nd.status))
        //    {
        //        netJn.status = Constants.Energized + Constants.NetJunction;
        //    }
        //    else if (StatusExtensions.IsLoop(nd.status))
        //    {
        //        netJn.status = Constants.Loop + Constants.NetJunction;
        //    }
        //    if (StatusExtensions.IsDisconnected(nd.status))
        //    {
        //        netJn.status = Constants.Disconnected + Constants.NetJunction;
        //    }
        //}
        public ConnectivityInfo GetParent(double x, double y, double tox, double toy)
        {
            ConnectivityInfo conInfo = new ConnectivityInfo();
            List<Node> fromNodeList = GetSnappedNodes(x, y);
            List<Node> toNodeList = GetSnappedNodes(tox, toy);
            Node fromNode = null;
            Node toNode = null;
            if (fromNodeList.Count > 1)
                fromNode = fromNodeList.First(nd => StatusExtensions.IsNetJunction(nd.status));
            else if (fromNodeList != null && fromNodeList.Count!=0)
                fromNode = fromNodeList[0];
            if (toNodeList.Count > 1)
                toNode = toNodeList.First(nd => StatusExtensions.IsNetJunction(nd.status));
            else if(toNodeList!=null && toNodeList.Count!=0)
                toNode = toNodeList[0];
            conInfo.phaseCode = 128;
            conInfo.parentNode = fromNode;
            conInfo.childNode = toNode;
            conInfo.setFlow = false;
            conInfo.status = Constants.Disconnected;

            if (fromNode != null && toNode == null)
            {
                conInfo.status = Constants.WithFlow;
                if(UnenergizedLocal(fromNode)) conInfo.status+= Constants.Unenergized;
                if (!UnenergizedLocal(fromNode)) conInfo.status += Constants.Energized;
                if (StatusExtensions.IsLoop(fromNode.status)) conInfo.status += Constants.Loop;
                if (StatusExtensions.IsDisconnected(fromNode.status)) conInfo.status += Constants.Disconnected;
            }
            if (fromNode == null && toNode != null)
            {
                conInfo.parentNode = toNode;
                conInfo.childNode = fromNode;
                conInfo.status = Constants.AgainstFlow;
                if (UnenergizedLocal(toNode)) conInfo.status += Constants.Unenergized;
                if (!UnenergizedLocal(toNode)) conInfo.status += Constants.Energized;
                if (StatusExtensions.IsLoop(toNode.status)) conInfo.status += Constants.Loop;
                if (StatusExtensions.IsDisconnected(toNode.status)) conInfo.status += Constants.Disconnected;
            }
            if (fromNode != null && toNode != null)
            {
                if (UnenergizedLocal(fromNode) && UnenergizedLocal(toNode))
                {
                    if (StatusExtensions.IsDisconnected(fromNode.status) && StatusExtensions.IsDisconnected(toNode.status))
                    {
                        conInfo.status = Constants.Unenergized + Constants.Disconnected;
                    }
                    else if (!StatusExtensions.IsDisconnected(fromNode.status) && StatusExtensions.IsDisconnected(toNode.status))
                    {
                        conInfo.status = Constants.Unenergized  +Constants.WithFlow;
                        conInfo.setFlow = true;
                        conInfo.phaseCode = -1;
                    }
                    else if (StatusExtensions.IsDisconnected(fromNode.status) && !StatusExtensions.IsDisconnected(toNode.status))
                    {
                        conInfo.parentNode = toNode;
                        conInfo.childNode = fromNode;
                        conInfo.status = Constants.Unenergized + Constants.AgainstFlow;
                        conInfo.setFlow = true;
                        conInfo.phaseCode = -1;
                    }
                    else if (!StatusExtensions.IsDisconnected(fromNode.status) && !StatusExtensions.IsDisconnected(toNode.status))
                    {
                        conInfo.parentNode = fromNode ;
                        conInfo.childNode = toNode;
                        conInfo.status = Constants.Unenergized + Constants.WithFlow;
                        conInfo.phaseCode = -1;
                    }
                }
                if (!UnenergizedLocal(fromNode) && UnenergizedLocal(toNode))
                {
                    conInfo.status = Constants.WithFlow;
                    conInfo.setFlow = true;
                }
                if (UnenergizedLocal(fromNode) && !UnenergizedLocal(toNode))
                {
                    conInfo.parentNode = toNode;
                    conInfo.childNode = fromNode;
                    conInfo.status = Constants.AgainstFlow;
                    conInfo.setFlow = true;
                }
                if (StatusExtensions.IsLoop(fromNode.status) && StatusExtensions.IsLoop(toNode.status))
                {
                    conInfo.status = Constants.Loop;
                }
                else if (!UnenergizedLocal(fromNode) && !UnenergizedLocal(toNode))
                {
                    FillConnectivityInfoForEnergizedSections(conInfo, fromNode, toNode);
                }
            }
            //set phase code
            if (conInfo.parentNode!=null && StatusExtensions.IsNetJunction(conInfo.parentNode.status))
            {
                if (conInfo.phaseCode == -1) conInfo.phaseCode = 128;
                else
                    conInfo.phaseCode = GetPhaseCodeFromParentSections(conInfo.parentNode);
            }
            else
                conInfo.phaseCode = conInfo.parentNode.phaseCode;
            if (conInfo.parentNode != null && StatusExtensions.IsNetJunction(conInfo.parentNode.status))
            {
                conInfo.constructedPhaseCode = GetConstructedPhaseCodeFromParentSections(conInfo.parentNode);
            }
            else
                conInfo.constructedPhaseCode = conInfo.parentNode.constructedPhaseCode;
            return conInfo;
        }
 public void FillConnectivityInfoForEnergizedSections(ConnectivityInfo conInfo, Node fromNode, Node toNode)
 {
     conInfo = new ConnectivityInfo();
     conInfo.phaseCode = 128;
     conInfo.parentNode = fromNode;
     conInfo.childNode = toNode;
     conInfo.setFlow = false;
     if (StatusExtensions.IsSource(fromNode.status) || StatusExtensions.IsSource(toNode.status))
     {
         if(StatusExtensions.IsSource(fromNode.status))
         {
             conInfo.parentNode = fromNode;
             conInfo.childNode = toNode;
             conInfo.status = Constants.WithFlow + Constants.Unenergized;
             conInfo.setFlow = false;
             conInfo.phaseCode = -1;
         }
         if (StatusExtensions.IsSource(toNode.status))
         {
             conInfo.parentNode = toNode ;
             conInfo.childNode = fromNode;
             conInfo.status = Constants.AgainstFlow + Constants.Unenergized;
             conInfo.setFlow = false;
             conInfo.phaseCode = -1;
         }
     }
     else if ((HasParent(fromNode) && !HasChild(fromNode) && HasChild(toNode) && !HasParent(toNode)))
     {
             conInfo.parentNode = fromNode ;
             conInfo.childNode = toNode;
             conInfo.status = Constants.WithFlow ;
             conInfo.setFlow = false;
     }
     else if ((HasParent(toNode) && !HasChild(toNode) && HasChild(fromNode) && !HasParent(fromNode)))
     {
             conInfo.parentNode = toNode ;
             conInfo.childNode = fromNode;
             conInfo.status = Constants.AgainstFlow;
             conInfo.setFlow = false;
     }
         else
         {
             //int fromNodePC = GetPhaseCodeFromParentSections(fromNode);
             //int toNodePC = GetPhaseCodeFromParentSections(toNode);
             conInfo.parentNode = fromNode;
             conInfo.childNode = toNode;
             conInfo.status = Constants.WithFlow + Constants.Unenergized;
             conInfo.setFlow = false;
             conInfo.phaseCode = -1;
         }
 }