Beispiel #1
0
        /// <summary>
        /// 在某Zone的四边形 Face 表面创建分割此四边形的两个三角形 Liner 单元,
        /// 其在Flac3d中的导入格式为:sel liner id 1 em group ex1 range x 23.73 23.78 y -0.01 0.01 z 19.65 19.67
        /// </summary>
        /// <param name="sr"></param>
        /// <param name="sw"> S4类型的单元在inp文件中的格式为: 102038,    107275,    105703,    105704,    104375  </param>
        /// <param name="componentName"> 当前读取到Inp中的那一个 Component(即 Hypermesh 中的 Component) </param>
        /// <param name="groupName"> 要依托于哪一个group来生成liner单元 </param>
        /// <param name="selId"> 结构单元所属集合的Id </param>
        /// <returns>在这一区块中,最后一次读取的字符,即跳出循环的字符,比如:**HWCOLOR COMP 57   60 或者 **HMASSEM  2   6 A_M</returns>
        /// <remarks>创建方法为先找到此四边形的形心,然后将形心点向扩展1mm, 以形成一个体积为1立方毫米的立方体,然后用此立方体来作为创建 Liner 的 range。</remarks>
        private string Gen_Liner4(StreamReader sr, StreamWriter sw, string componentName, string groupName, int selId)
        {
            string pattern = @"^\s*(\d*),\s*(\d*),\s*(\d*),\s*(\d*),\s*(\d*)";
            string strLine = "";
            int    eleId;
            int    node1 = 0;
            int    node2 = 0;
            int    node3 = 0;
            int    node4 = 0;

            //
            strLine = sr.ReadLine(); // S4 类型的信息在inp中,大致的结构为: " 102038,    107275,    105703,    105704,    104375 "
            Match           match  = default(Match);
            GroupCollection groups = default(GroupCollection);

            match = Regex.Match(strLine, pattern);
            while (match.Success)
            {
                groups = match.Groups;
                eleId  = Convert.ToInt32(groups[1].Value);
                // 在 inp 中 S4 单元的id号,但是这个单元并不用来创建Flac中的 liner 单元,而是利用其四个节点来创建liner 单元。
                node1 = Convert.ToInt32(groups[2].Value);
                node2 = Convert.ToInt32(groups[3].Value);
                node3 = Convert.ToInt32(groups[4].Value);
                node4 = Convert.ToInt32(groups[5].Value);

                // 获取此四个节点所形成的共面四边形的形心点
                XYZ centroid = XYZ.FindCentroid(_allNodes[node1], _allNodes[node2], _allNodes[node3],
                                                _allNodes[node4]);

                string range = Hm2Flac3DHandler.ExtendCentroid(centroid);

                // 创建与两面都有与 zone 的接触的 Liner 单元
                // Sel Liner  id 1 em group ex1 range x 23.73 23.78 y -0.01 0.01 z 19.65 19.67
                sw.WriteLine("Sel Liner id {0} em group {1} {2}", selId, groupName, range);

                //下面这一条语句所创建的Liner,它并不会与其周围的Zone之间建立 Node-to-Zone links.
                //而且即使用"SEL NODE INIT XPOS ADD 0.0"来创建Node-Zone link,此单元上也只有一面会与Zone之间有link
                //sw.WriteLine("SEL LINERSEL cid   {0} id   {1}  ele DKT_CST  nodes  {2} {3} {4}", eleId, SelId, node1, node2, node3) ' 大致的结构为:SEL SHELLSEL cid    68341 id    68341 ele DKT_CST  nodes  1 2 3

                //Debug.Print(_allNodes(node1).ToString() & _allNodes(node2).ToString() &
                //            _allNodes(node3).ToString() & _allNodes(node4).ToString() &
                //            centroid.ToString())

                //读取下一个节点
                strLine = sr.ReadLine();
                match   = Regex.Match(strLine, pattern);
            }

            sw.WriteLine("sel group  {0} range id {1}", componentName, selId);
            // 大致的结构为:SEL PILESEL  cid   109200 id   109200 nodes  1770004 1769720
            return(strLine);
        }