Beispiel #1
0
        private static WElement2D[] Create_Elements(ref int[] Ls1, ref int[] Ls2, List <int> Nums, List <WPoint2D> Ps, bool PreCheck)
        {
            //bool ClockCheck = false;
            //if ((Ps[Ls1[0]].X > Ps[Ls2[0]].X) && (Ps[Ls1[0]].Y > Ps[Ls1[Ls1.Length - 1]].Y))
            //    ClockCheck = true;
            //if ((Ps[Ls1[0]].X < Ps[Ls2[0]].X) && (Ps[Ls1[0]].Y < Ps[Ls1[Ls1.Length - 1]].Y))
            //    ClockCheck = true;
            //if ((Ps[Ls1[0]].Y < Ps[Ls2[0]].Y) && (Ps[Ls1[0]].X > Ps[Ls1[Ls1.Length - 1]].X))
            //    ClockCheck = true;
            //if ((Ps[Ls1[0]].Y > Ps[Ls2[0]].Y) && (Ps[Ls1[0]].X < Ps[Ls1[Ls1.Length - 1]].X))
            //    ClockCheck = true;
            ///////

            WElement2D[] Es = new WElement2D[0];
            int          L1 = Ls1.Length;
            int          L2 = Ls2.Length;
            int          Lm = L1;

            if (L2 < Lm)
            {
                Lm = L2;
            }

            bool RevCheck = Check_Reverse(Ls1[L1 - 1], Ls1[L1 - 2], Ls2[L2 - 1], Ps);

            Add_Element(ref Es, 3, Ls1[L1 - 1], Ls1[L1 - 2], Ls2[L2 - 1], 0, RevCheck, ref Nums);   //////最后先用三角形封起来
            Array.Resize <int>(ref Ls1, L1 - 1);
            L1--;

            while (L1 != L2)
            {
                if (L1 > L2)
                {
                    Add_Element(ref Es, 3, Ls1[L1 - 1], Ls1[L1 - 2], Ls2[L2 - 1], 0, RevCheck, ref Nums);
                    Array.Resize <int>(ref Ls1, L1 - 1);
                    L1--;
                }
                else
                {
                    Add_Element(ref Es, 3, Ls2[L2 - 2], Ls2[L2 - 1], Ls1[L1 - 1], 0, RevCheck, ref Nums);
                    Array.Resize <int>(ref Ls2, L2 - 1);
                    L2--;
                }
            }

            for (int i = L1 - 1; i > 0; i--)
            {
                Add_Element(ref Es, 4, Ls1[i], Ls1[i - 1], Ls2[i - 1], Ls2[i], RevCheck, ref Nums);
            }

            return(Es);
        }
Beispiel #2
0
        public static int E4sID_App(ref List <int> Ns1, ref List <int> Ns2, ref WElement2D[] Es, int Num_Start)
        {
            int Quan = Ns1.Count - 1;

            Array.Resize <WElement2D>(ref Es, Quan);
            int Num;

            for (int i = 0; i < Quan; i++)
            {
                Num   = Num_Start + i + 1;
                Es[i] = new WElement2D(4, Ns1[i], Ns2[i], Ns2[i + 1], Ns1[i + 1]);
            }
            return(Num_Start + Quan - 1);
        }
Beispiel #3
0
        public static int E2ID_App(int N1, int N2, ref WElement2D[] Es, int Num_Start, bool Append_Check)
        {
            int Quan_Pre;

            if (Append_Check == true)
            {
                Quan_Pre = Es.Length;
            }
            else
            {
                Quan_Pre = 0;
            }
            Array.Resize <WElement2D>(ref Es, Quan_Pre + 1);
            Es[Quan_Pre] = new WElement2D(2, N1, N2, 0, 0);
            return(Num_Start + 1);
        }
Beispiel #4
0
        public static WElement2D[] Do_Mesh(ref WEntity2D[] Rim_Curves, string Name, ref WMesh2D_Para MP)
        {
            List <WPoint2D> Ps = new List <WPoint2D>(); ///// 节点集
            List <int>      Ns = new List <int>();      ///// 节点编号集

            Get_Rim(ref Rim_Curves, ref Ps, ref Ns);


            int[] Corner = Find_Corner(ref Ps);

            WElement2D[] Es = new WElement2D[0];
            if (Corner.Length == 3)
            {
                Es = Mesh_TriCorner(ref Corner, Ns, Ps);
            }
            if (Corner.Length == 4)
            {
                Es = Mesh_FourCorner(ref Corner, Ns, Ps);
            }
            return(Es);
        }
Beispiel #5
0
        public static int E2sID_App(ref List <int> Ns, ref WElement2D[] Es, int Num_Start, bool Append_Check)
        {
            int Quan = Ns.Count - 1;
            int Quan_Pre, Num;

            if (Append_Check == true)
            {
                Quan_Pre = Es.Length;
            }
            else
            {
                Quan_Pre = 0;
            }
            Array.Resize <WElement2D>(ref Es, Quan + Quan_Pre);
            for (int i = 0; i < Quan; i++)
            {
                Num = Num_Start + i + 1;
                Es[i + Quan_Pre] = new WElement2D(2, Ns[i], Ns[i + 1], 0, 0);
            }
            return(Num_Start + Quan - 1);
        }
Beispiel #6
0
 public void Add_E(WElement2D E)
 {
     this.Elements.Add(E);
 }
Beispiel #7
0
        /// <summary>
        /// 生成夹丝区域的节点,单元,输出,绘制等
        /// </summary>
        /// <param name="AxisX">横向轴线</param>
        /// <param name="WBs">夹丝线</param>
        /// <param name="Ws">夹丝区域的上下边界线</param>
        /// <remarks></remarks>
        private static WMesh2D_Mesh Mesh_SingleRim(ref WLine2D AxisX,
                                                   ref WEntity2D[] WBs, ref WEntity2D[] Ws,
                                                   ref GLCommon GLC)
        {
            WMesh2D_Mesh Glass_Mesh = new WMesh2D_Mesh("Wires");

            Glass_Mesh.Shapes.Add(new WShapeRim2D(Color.Black, 1f));
            /////
            int N  = 0;                                            /////节点编号
            int E4 = 0;                                            /////Shell单元编号
            int E2 = 0;                                            /////Beam单元编号

            WEntity2D[] WBs_V = Sort_WBs(AxisX, ref WBs, ref GLC); /////找到竖向边界排序输出,并在边界线数组中去除竖向边界线
            if (WBs_V.Length == 0)
            {
                return(null);
            }
            WCurve2D Bd_L = (WCurve2D)WBs_V[0];                     /////左侧边界
            WCurve2D Bd_R = (WCurve2D)WBs_V[1];                     /////右侧边界

            WCurve2D[] Bds_O = new WCurve2D[WBs.Length];            /////上下边界线
            for (int i = 0; i < WBs.Length; i++)
            {
                Bds_O[i] = (WCurve2D)WBs[i];
            }

            ///////先求出上下边界
            List <WPoint2D> Ps_WiL = new List <WPoint2D>();           /////记录所有线与上边界的交点,从左至右
            List <WPoint2D> Ps_WiU = new List <WPoint2D>();           /////记录所有线与下边界的交点,从左至右
            List <WPoint2D> Pts;                                      /////辅助点集

            for (int i = 0; i <= Ws.Length - 1; i++)
            {
                Pts = Geos2D_Intersection.Intersection_L2Cvs((WLine2D)Ws[i], ref WBs); /////找与上下边线的交点作为划分的边界
                if (Pts.Count == 0)
                {
                    continue;                        /////夹丝线与上下边界不一定会有交点
                }
                Add_Ps2_Bnds(ref Pts, ref Bds_O);

                Geos2D_Other.Merge_Points(ref Pts);  /////去掉多余节点
                if (Pts[0].Y > Pts[1].Y)
                {
                    Ps_WiU.Add(Pts[0]);
                    Ps_WiL.Add(Pts[1]);
                }
                else
                {
                    Ps_WiU.Add(Pts[1]);
                    Ps_WiL.Add(Pts[0]);
                }
            }

            ///////对上下左右边界进行网格划分//////
            Bd_L.Nodes = Geos2D_Modify.DotCurve_Times(Bd_L, GLC.Mesh_WireTimes); /////左边界划分
            Bd_R.Nodes = Geos2D_Modify.DotCurve_Times(Bd_R, GLC.Mesh_WireTimes); /////右边界划分
            WMFuncs2D.Ps_Sort(Bd_L.Nodes, false, true);                          /////从下到上排列左边界节点
            WMFuncs2D.Ps_Sort(Bd_R.Nodes, false, true);                          /////从下到上排列右边界节点

            //////Shell//////
            List <int> Ns_WiL = new List <int>();                                //////记录所有线与上边界的交点的节点编号(Shell),从左至右
            List <int> Ns_WiU = new List <int>();                                //////记录所有线与下边界的交点的节点编号(Shell),从左至右

            N = WMFuncs2D.NsID_App(ref Bd_L.Nodes, ref Bd_L.Nodes_num, N);       //////将左边界的节点进行划分并输入Bnd中(Shell)
            N = WMFuncs2D.NsID_App(ref Ps_WiU, ref Ns_WiU, N);                   //////将上边界的节点进行划分(Shell)
            N = WMFuncs2D.NsID_App(ref Bd_R.Nodes, ref Bd_R.Nodes_num, N, true); //////将右边界的节点进行划分并输入Bnd中(Shell),注意需要反向
            N = WMFuncs2D.NsID_App(ref Ps_WiL, ref Ns_WiL, N, true);             //////将下边界的节点进行划分,注意需要反向(Shell)

            //Add_HT2_Bnds(ref Bd_L.Nodes, ref Bds_O);                           //////将左边界头尾节点加入上下边界中(为了节点顺序对,右边界在最后输入)

            //////输出
            Glass_Mesh.Q_FreeNs = Bd_L.Nodes.Count * 2 + Ns_WiL.Count * 2;             /////自由节点数量输出(Shell)
            Glass_Mesh.Add_Ns(ref Bd_L.Nodes, ref Bd_L.Nodes_num, false, 0);           /////输出左边界的节点至Shell节点文件中
            Glass_Mesh.Add_Ns(ref Ps_WiU, ref Ns_WiU, false, 0);                       /////输出上边界的节点至Shell节点文件中
            Glass_Mesh.Add_Ns(ref Bd_R.Nodes, ref Bd_R.Nodes_num, true, 0);            /////输出右边界的节点至Shell节点文件中,注意反向
            Glass_Mesh.Add_Ns(ref Ps_WiL, ref Ns_WiL, true, 0);                        /////输出下边界的节点至Shell节点文件中,注意反向
            /////将边界点放到Shape中
            Glass_Mesh.Shapes[0].Add_Ps(ref Bd_L.Nodes, ref Bd_L.Nodes_num, false, 0); /////输出左边界的节点至Shell节点文件中
            Glass_Mesh.Shapes[0].Add_Ps(ref Ps_WiU, ref Ns_WiU, false, 0);             /////输出上边界的节点至Shell节点文件中
            Glass_Mesh.Shapes[0].Add_Ps(ref Bd_R.Nodes, ref Bd_R.Nodes_num, true, 0);  /////输出右边界的节点至Shell节点文件中,注意反向
            Glass_Mesh.Shapes[0].Add_Ps(ref Ps_WiL, ref Ns_WiL, true, 0);              /////输出下边界的节点至Shell节点文件中,注意反向

            /////对夹丝线进行网格划分//////
            List <WPoint2D> Ps1 = Bd_L.Nodes;
            List <WPoint2D> Ps2 = new List <WPoint2D>();
            List <int>      Ns1 = Bd_L.Nodes_num;
            List <int>      Ns2 = new List <int>();

            WElement2D[] Es = new WElement2D[0];

            for (int i = 0; i <= Ws.Length - 1; i++)
            {
                Ps2 = Geos2D_Modify.DotCurve_Times(Ws[i], Ps_WiU[i], Ps_WiL[i], GLC.Mesh_WireTimes, ref GLC.WGC); /////划分夹丝线
                WMFuncs2D.Ps_Sort(Ps2, false, true);                                                              /////从下到上排列节点
                //Add_HT2_Bnds(ref Ps2, ref Bds_O);                               /////将头尾节点加入上下边界中
                //////Shell//////
                N                  = WMFuncs2D.NsID_App(ref Ps2, ref Ns2, false, N);    /////生成Shell单元的节点编号(注意头尾不要)
                Ns2[0]             = Ns_WiL[i];                                         /////为生成单元,用下边界节点替换最下点编号
                Ns2[Ns2.Count - 1] = Ns_WiU[i];                                         /////为生成单元,用上边界节点替换最上点编号
                E4                 = WMFuncs2D.E4sID_App(ref Ns1, ref Ns2, ref Es, E4); /////生成Shell单元
                Glass_Mesh.AddCross_NodesPair(ref Ns1, ref Ns2);                        /////将节点之间架桥,用于显示
                /////输出
                Glass_Mesh.Add_Ns(ref Ps2, ref Ns2, true, false);                       /////将Shell的中间节点输出至文件(注意头尾不要)
                Glass_Mesh.Add_Es(ref Es);                                              /////输出Shell单元

                E2 = WMFuncs2D.E2sID_App(ref Ns2, ref Es, E2, true);                    /////Beam单元生成
                Glass_Mesh.Add_Es(ref Es);                                              /////Beam单元输出

                //////循环推进//////
                Ps1 = Ps2;
                Ns1 = Ns2;
            }

            ///////最右侧单元处理//////
            Ps2 = Bd_R.Nodes;
            Ns2 = Bd_R.Nodes_num;
            //Add_HT2_Bnds(ref Bd_R.Nodes, ref  Bds_O);                           /////将右侧边界头尾节点加入上下边界中
            E4 = WMFuncs2D.E4sID_App(ref Ns1, ref Ns2, ref Es, E4);               /////输入单元编号
            Glass_Mesh.AddCross_NodesPair(ref Ns1, ref Ns2);                      /////将节点之间架桥,用于显示
            Glass_Mesh.Add_Es(ref Es);
            return(Glass_Mesh);
        }
Beispiel #8
0
        private static WMesh2D_Mesh Mesh_FreeRim(ref WEntity2D[] WBs, ref WEntity2D[] Ws, ref GLCommon GLC, string Name)
        {
            WMesh2D_Mesh Mesh_Glass = new WMesh2D_Mesh(Name);

            /////
            WEntity2D[]  Bds  = new WEntity2D[0];                                            /////所有的内部边界线
            List <int>[] Rims = Find_BdsRims(ref WBs, ref Ws, ref GLC, ref Bds, Mesh_Glass); /////找到所有的边界线及所有的区域
            /////逐个Rim分别Mesh
            WElement2D[]    Es = new WElement2D[0];
            WEntity2D[]     Rim;
            List <int>      Ns = new List <int>();
            List <WPoint2D> Ps = new List <WPoint2D>();

            /////
            for (int i = 0; i < Rims.Length; i++)
            {
                Rim = new WEntity2D[Rims[i].Count];
                for (int j = 0; j < Rim.Length; j++)
                {
                    Rim[j] = Bds[Rims[i][j]];
                }

                Es = Mesh2D_SingleLayerMesh.Do_Mesh(ref Rim, i.ToString(), ref GLC.MP);
                if (Es == null || Es.Length == 0)
                {
                    for (int j = 0; j < Rim.Length; j++)
                    {
                        for (int k = 0; k < ((WCurve2D)Rim[j]).Nodes.Count - 1; k++)
                        {
                            Ps.Add(((WCurve2D)Rim[j]).Nodes[k]);
                            Ns.Add(((WCurve2D)Rim[j]).Nodes_num[k]);
                        }
                    }
                    Es = Mesh2D_MeshFree.Mesh_SingleRim(ref Ns, ref Ps, ref GLC.MP, i.ToString());
                }
                if (Es == null || Es.Length == 0)
                {
                    continue;
                }
                Mesh_Glass.Add_Es(ref Es);
            }
            if (Mesh_Glass.QEs == 0)
            {
                return(null);
            }
            else
            {
                for (int i = 0; i < Bds.Length; i++)
                {
                    if (Bds[i].Trace != -2)
                    {
                        continue;
                    }
                    Es = new WElement2D[0];
                    WMFuncs2D.E2sID_App(ref ((WCurve2D)Bds[i]).Nodes_num, ref Es, 0, true);  /////Beam单元生成
                    if (Es == null || Es.Length == 0)
                    {
                        continue;
                    }
                    Mesh_Glass.Add_Es(ref Es);                                               /////Beam单元输出
                }
            }
            /////
            int Nt = 0;

            for (int i = 0; i < WBs.Length; i++)
            {
                if (((WCurve2D)WBs[i]).Meshed_Check == true)
                {
                    continue;
                }
                ((WCurve2D)WBs[i]).Nodes = new List <WPoint2D>();
                for (int j = 0; j < Bds.Length; j++)
                {
                    Nt = ((WCurve2D)Bds[j]).Trace;
                    if (Nt != i)
                    {
                        continue;
                    }
                    for (int k = 0; k < ((WCurve2D)Bds[j]).Nodes.Count - 1; k++)
                    {
                        ((WCurve2D)WBs[i]).Nodes.Add(((WCurve2D)Bds[j]).Nodes[k]);
                    }
                }
                ((WCurve2D)WBs[i]).Nodes.Add(new WPoint2D(((WCurve2D)WBs[i]).EndPoint.X, ((WCurve2D)WBs[i]).EndPoint.Y));
            }
            //////
            return(Mesh_Glass);
        }