Exemplo n.º 1
0
        /// <summary>
        /// Mesh单条线
        /// </summary>
        /// <param name="Cin"></param>
        /// <param name="Mesh_Length"></param>
        public static void Mesh_Curve(WEntity2D Cin, double Mesh_Length)
        {
            WCurve2D C = (WCurve2D)Cin;
            int      Times;

            if (C.Meshed_Check == true)
            {
                if (C.StartPoint.DistanceTo(C.Nodes[0]) > (C.StartPoint.DistanceTo(C.Nodes[C.Nodes.Count - 1])))
                {
                    WMFuncs2D.Points_Reverse(ref C.Nodes, true);                       /////翻转点集
                }
                return;
            }
            Times   = (int)Math.Ceiling(C.Length / Mesh_Length);
            C.Nodes = Geos2D_Modify.DotCurve_Times(C, Times);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Mesh线集合
        /// </summary>
        /// <param name="Cs"></param>
        /// <param name="Mesh_Length"></param>
        public static void Mesh_Curves(ref WEntity2D[] Cs, double Mesh_Length)
        {
            WCurve2D C;
            int      Times;

            for (int i = 0; i < Cs.Length; i++)
            {
                C = (WCurve2D)Cs[i];
                if (C.Meshed_Check == true)
                {
                    if (C.StartPoint.DistanceTo(C.Nodes[0]) > (C.StartPoint.DistanceTo(C.Nodes[C.Nodes.Count - 1])))
                    {
                        WMFuncs2D.Points_Reverse(ref C.Nodes, true);                       /////翻转点集
                    }
                    continue;
                }
                Times   = (int)Math.Ceiling(C.Length / Mesh_Length);
                C.Nodes = Geos2D_Modify.DotCurve_Times(Cs[i], Times);
            }
        }
Exemplo n.º 3
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);
        }