public override void Link_Nodes(ref Node[][][] Frame, int x, int y, int z)
                    {
                        int mod = x % 2;

                        int xdim = Frame.Length - 1;
                        int ydim = Frame[mod].Length - 1;
                        int zdim = Frame[mod][0].Length - 1;

                        Links2 = new Node[12];

                        /*
                        [0] = x+y+z+
                        [1] = x+y-z-
                        [2] = x+y-z+
                        [3] = x+y+z-
                        [4] = x-y+z+
                        [5] = x-y-z-
                        [6] = x-y-z+
                        [7] = x-y+z-
                        [8] = y+
                        [9] = y-
                        [10] = z+
                        [11] = z-
                        */

                        if (mod == 0)
                        {
                            if (x < xdim)
                            {
                                if (y < ydim && z < zdim) Links2[0] = Frame[x + 1][y + 1][z + 1]; else Links2[0] = new Null_Node();
                                if (y > 0 && z > 0) Links2[1] = Frame[x + 1][y][z]; else Links2[1] = new Null_Node();
                                if (y > 0 && z < zdim) Links2[2] = Frame[x + 1][y][z + 1]; else Links2[2] = new Null_Node();
                                if (y < ydim && z > 0) Links2[3] = Frame[x + 1][y + 1][z]; else Links2[3] = new Null_Node();
                            }
                            else for (int i = 0; i < 4; i++) Links2[i] = new Null_Node();
                            if (x > 0)
                            {
                                if (y < ydim && z < zdim) Links2[4] = Frame[x - 1][y + 1][z + 1]; else Links2[4] = new Null_Node();
                                if (y > 0 && z > 0) Links2[5] = Frame[x - 1][y][z]; else Links2[5] = new Null_Node();
                                if (y > 0 && z < zdim) Links2[6] = Frame[x - 1][y][z + 1]; else Links2[6] = new Null_Node();
                                if (y < ydim && z > 0) Links2[7] = Frame[x - 1][y + 1][z]; else Links2[7] = new Null_Node();
                            }
                            else for (int i = 4; i < 8; i++) Links2[i] = new Null_Node();
                        }
                        else
                        {
                            if (x < xdim)
                            {
                                if (y < ydim && z < zdim) Links2[0] = Frame[x + 1][y][z]; else Links2[0] = new Null_Node();
                                if (y > 0 && z > 0) Links2[1] = Frame[x + 1][y - 1][z - 1]; else Links2[1] = new Null_Node();
                                if (y > 0 && z < zdim) Links2[2] = Frame[x + 1][y - 1][z]; else Links2[2] = new Null_Node();
                                if (y < ydim && z > 0) Links2[3] = Frame[x + 1][y][z - 1]; else Links2[3] = new Null_Node();
                            }
                            else for (int i = 0; i < 4; i++) Links2[i] = new Null_Node();
                            if (x > 0)
                            {
                                if (y < ydim && z < zdim) Links2[4] = Frame[x - 1][y][z]; else Links2[4] = new Null_Node();
                                if (y > 0 && z > 0) Links2[5] = Frame[x - 1][y - 1][z - 1]; else Links2[5] = new Null_Node();
                                if (y > 0 && z < zdim) Links2[6] = Frame[x - 1][y - 1][z]; else Links2[6] = new Null_Node();
                                if (y < ydim && z > 0) Links2[7] = Frame[x - 1][y][z - 1]; else Links2[7] = new Null_Node();
                            }
                            else for (int i = 4; i < 8; i++) Links2[i] = new Null_Node();
                        }

                        if (y < ydim) Links2[8] = Frame[x][y + 1][z]; else Links2[8] = new Null_Node();
                        if (y > 0) Links2[9] = Frame[x][y - 1][z]; else Links2[9] = new Null_Node();
                        if (z < zdim) Links2[10] = Frame[x][y][z + 1]; else Links2[10] = new Null_Node();
                        if (z > 0) Links2[11] = Frame[x][y][z - 1]; else Links2[11] = new Null_Node();

                        //foreach (Node n in Links2) Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(n.Pt));
                    }
 public void Complete_Boundary()
 {
     /*
     [0] = x+y+z+
     [1] = x+y-z-
     [2] = x+y-z+
     [3] = x+y+z-
     */
     foreach (Bound_Node.Boundary b in B_List)
     {
         if (b == Bound_Node.Boundary.DXPosYPosZPos)
         {
             if (Links2[0] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[0].Pt));
             (Links2[0] as RDD_Node).Links2[5] = new Null_Node();
             Links2[0] = new Null_Node();
             //(Links2[0] as RDD_Node).Links2[5] = (Links2[0] as RDD_Node).Links2[0];
             //Links2[0] = Links2[5];
         }
         else if (b == Bound_Node.Boundary.DXPosYNegZNeg)
         {
             if (Links2[1] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[1].Pt));
             (Links2[1] as RDD_Node).Links2[4] = new Null_Node();
             Links2[1] = new Null_Node();
             //(Links2[1] as RDD_Node).Links2[4] = (Links2[1] as RDD_Node).Links2[1];
             //Links2[1] = Links2[4];
         }
         else if (b == Bound_Node.Boundary.DXPosYNegZPos)
         {
             if (Links2[2] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[2].Pt));
             (Links2[2] as RDD_Node).Links2[7] = new Null_Node();
             Links2[2] = new Null_Node();
             //(Links2[2] as RDD_Node).Links2[7] = (Links2[2] as RDD_Node).Links2[2];
             //Links2[2] = Links2[7];
         }
         else if (b == Bound_Node.Boundary.DXPosYPosZNeg)
         {
             if (Links2[3] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[3].Pt));
             (Links2[3] as RDD_Node).Links2[6] = new Null_Node();
             Links2[3] = new Null_Node();
             //(Links2[3] as RDD_Node).Links2[6] = (Links2[3] as RDD_Node).Links2[3];
             //Links2[3] = Links2[6];
         }
         /*
         [4] = x-y+z+
         [5] = x-y-z-
         [6] = x-y-z+
         [7] = x-y+z-
         */
         else if (b == Bound_Node.Boundary.DXNegYPosZPos)
         {
             if (Links2[4] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[4].Pt));
             (Links2[4] as RDD_Node).Links2[1] = new Null_Node();
             Links2[4] = new Null_Node();
             //(Links2[4] as RDD_Node).Links2[1] = (Links2[4] as RDD_Node).Links2[4];
             //Links2[4] = Links2[1];
         }
         else if (b == Bound_Node.Boundary.DXNegYNegZNeg)
         {
             if (Links2[5] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[5].Pt));
             (Links2[5] as RDD_Node).Links2[0] = new Null_Node();
             Links2[5] = new Null_Node();
             //(Links2[5] as RDD_Node).Links2[0] = (Links2[5] as RDD_Node).Links2[5];
             //Links2[5] = Links2[0];
         }
         else if (b == Bound_Node.Boundary.DXNegYNegZPos)
         {
             if (Links2[6] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[6].Pt));
             (Links2[6] as RDD_Node).Links2[3] = new Null_Node();
             Links2[6] = new Null_Node();
             //(Links2[6] as RDD_Node).Links2[3] = (Links2[6] as RDD_Node).Links2[6];
             //Links2[6] = Links2[3];
         }
         else if (b == Bound_Node.Boundary.DXNegYPosZNeg)
         {
             if (Links2[7] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[7].Pt));
             (Links2[7] as RDD_Node).Links2[2] = new Null_Node();
             Links2[7] = new Null_Node();
             //(Links2[7] as RDD_Node).Links2[2] = (Links2[7] as RDD_Node).Links2[7];
             //Links2[7] = Links2[2];
         }
         /*
         [8] = y+
         [9] = y-    
         [10] = z+
         [11] = z-
         */
         else if (b == Bound_Node.Boundary.AYPos)
         {
             if (Links2[8] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[8].Pt));
             (Links2[8] as RDD_Node).Links2[9] = new Null_Node();
             Links2[8] = new Null_Node();
         //    (Links2[8] as RDD_Node).Links2[9] = (Links2[8] as RDD_Node).Links2[8];
         //    Links2[8] = Links2[9];
         }
         else if (b == Bound_Node.Boundary.AYNeg)
         {
             if (Links2[9] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[9].Pt));
             (Links2[9] as RDD_Node).Links2[8] = new Null_Node();
             Links2[9] = new Null_Node();
             //(Links2[9] as RDD_Node).Links2[8] = (Links2[9] as RDD_Node).Links2[9];
             //Links2[9] = Links2[8];
         }
         else if (b == Bound_Node.Boundary.AZPos)
         {
             if (Links2[10] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[10].Pt));
             (Links2[10] as RDD_Node).Links2[11] = new Null_Node();
             Links2[10] = new Null_Node();
             //(Links2[10] as RDD_Node).Links2[11] = (Links2[10] as RDD_Node).Links2[10];
             //Links2[10] = Links2[11];
         }
         else if (b == Bound_Node.Boundary.AZNeg)
         {
             if (Links2[11] is Null_Node) continue;
             //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(Utilities.PachTools.HPttoRPt(Pt), Utilities.PachTools.HPttoRPt(Links2[11].Pt));
             (Links2[11] as RDD_Node).Links2[10] = new Null_Node();
             Links2[11] = new Null_Node();
             //(Links2[11] as RDD_Node).Links2[10] = (Links2[11] as RDD_Node).Links2[11];
             //Links2[11] = Links2[10];
         }
     }
     /*
     [0] = x+y+z+
     [1] = x+y-z-
     [2] = x+y-z+
     [3] = x+y+z-
     [4] = x-y+z+
     [5] = x-y-z-
     [6] = x-y-z+
     [7] = x-y+z-
     [8] = y+
     [9] = y-
     [10] = z+
     [11] = z-
     */
 }
                    public override void Link_Nodes(ref Node[][][] Frame, int x, int y, int z)
                    {
                        int xdim = Frame.Length - 1;
                        int ydim = Frame[0].Length - 1;
                        int zdim = Frame[0][0].Length - 1;

                        if (x < xdim)
                        {
                            Xpos_Link = Frame[x + 1][y][z] as P_Node;
                        }
                        else Xpos_Link = new Null_Node();
                        //FrameX[x + 1, y, z].id.AddRange(id);
                        if (y < ydim)
                        {
                            Ypos_Link = Frame[x][y + 1][z] as P_Node;
                        }
                        else Ypos_Link = new Null_Node();
                        //FrameY[x, y + 1, z].id.AddRange(id);
                        if (z < zdim)
                        {
                            Zpos_Link = Frame[x][y][z + 1] as P_Node;
                        }
                        else Zpos_Link = new Null_Node();
                        //FrameZ[x, y, z + 1].id.AddRange(id);
                        if (x > 0)
                        {
                            Xneg_Link = Frame[x - 1][y][z] as P_Node;
                        }
                        else Xneg_Link = new Null_Node();
                        //FrameX[x, y, z].id.AddRange(id);
                        if (y > 0)
                        {
                            Yneg_Link = Frame[x][y - 1][z] as P_Node;
                        }
                        else Yneg_Link = new Null_Node();
                        //FrameY[x, y, z].id.AddRange(id);
                        if (z > 0)
                        {
                            Zneg_Link = Frame[x][y][z - 1] as P_Node;
                        }
                        else Zneg_Link = new Null_Node();
                        //FrameZ[x, y, z].id.AddRange(id);

                        Links2 = new P_Node[12];
                        Links3 = new P_Node[8];

                        if (x < xdim && y < ydim) Links2[0] = Frame[x + 1][y + 1][z] as P_Node; else Links2[0] = new Null_Node();
                        if (x > 0 && y > 0) Links2[1] = Frame[x - 1][y - 1][z] as P_Node; else Links2[1] = new Null_Node();
                        if (x < xdim && y > 0) Links2[2] = Frame[x + 1][y - 1][z] as P_Node; else Links2[2] = new Null_Node();
                        if (x > 0 && y < ydim) Links2[3] = Frame[x - 1][y + 1][z] as P_Node; else Links2[3] = new Null_Node();
                        if (x < xdim && z < zdim) Links2[4] = Frame[x + 1][y][z + 1] as P_Node; else Links2[4] = new Null_Node();
                        if (x > 0 && z > 0) Links2[5] = Frame[x - 1][y][z - 1] as P_Node; else Links2[5] = new Null_Node();
                        if (x > 0 && z < zdim) Links2[6] = Frame[x - 1][y][z + 1] as P_Node; else Links2[6] = new Null_Node();
                        if (x < xdim && z > 0) Links2[7] = Frame[x + 1][y][z - 1] as P_Node; else Links2[7] = new Null_Node();
                        if (y < ydim && z < zdim) Links2[8] = Frame[x][y + 1][z + 1] as P_Node; else Links2[8] = new Null_Node();
                        if (y > 0 && z > 0) Links2[9] = Frame[x][y - 1][z - 1] as P_Node; else Links2[9] = new Null_Node();
                        if (y > 0 && z < zdim) Links2[10] = Frame[x][y - 1][z + 1] as P_Node; else Links2[10] = new Null_Node();
                        if (y < ydim && z > 0) Links2[11] = Frame[x][y + 1][z - 1] as P_Node; else Links2[11] = new Null_Node();

                        if (x < xdim && y < ydim && z < zdim) Links3[0] = Frame[x + 1][y + 1][z + 1] as P_Node; else Links3[0] = new Null_Node();
                        if (x > 0 && y > 0 && z > 0) Links3[1] = Frame[x - 1][y - 1][z - 1] as P_Node; else Links3[1] = new Null_Node();
                        if (x > 0 && y > 0 && z < zdim) Links3[2] = Frame[x - 1][y - 1][z + 1] as P_Node; else Links3[2] = new Null_Node();
                        if (x < xdim && y < ydim && z > 0) Links3[3] = Frame[x + 1][y + 1][z - 1] as P_Node; else Links3[3] = new Null_Node();
                        if (x > 0 && y < ydim && z < zdim) Links3[4] = Frame[x - 1][y + 1][z + 1] as P_Node; else Links3[4] = new Null_Node();
                        if (x < xdim && y > 0 && z > 0) Links3[5] = Frame[x + 1][y - 1][z - 1] as P_Node; else Links3[5] = new Null_Node();
                        if (x > 0 && y < ydim && z > 0) Links3[6] = Frame[x - 1][y + 1][z - 1] as P_Node; else Links3[6] = new Null_Node();
                        if (x < xdim && y > 0 && z < zdim) Links3[7] = Frame[x + 1][y - 1][z + 1] as P_Node; else Links3[7] = new Null_Node();
                    }