/// <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); }
/// <summary> 从NSet(Node Set)中提取出节点编号,并写入一个单独的文本,用来执行Merge操作</summary> /// <param name="sr"></param> /// <param name="groupName"> group的名称必须以LM开头 </param> /// <param name="swGpMerge"> 要写入哪一个文本 </param> /// <returns></returns> private string Gen_GpMerge(StreamReader sr, StreamWriter swGpMerge, string groupName) { string pattern = @"^\s*(\d+)"; // set 集合在inp文件中的格式为: 132, 133, 134, 135, 136, 137, 138, 139, // 但是在最后一行时,也有可能不足8个节点编号,所以在正则表达式中,只能判断这一行中是否有至少一个数值编号 // 每一个节点编号都对应了一条语句,即 generate merge 0.001 Range x= (23.73, 23.78) y =( -0.01, 0.01) z= ( 19.65, 19.67) List <int> listNdId = new List <int>(); // Node Set 中所有的节点编号 //先写入标志语句 // Match match; string strLine; strLine = sr.ReadLine(); // 大致的结构为: 单元id, 节点1 2 3 4 5 6 match = Regex.Match(strLine, pattern); while (match.Success) { string[] elementIds = strLine.Split(','); // 当此行为“ 132, 133, 134, 135, 136, 137, 138, 139,”时,Split()后数组中有9个元素,最后一个为空字符。 //将此行中所有的单元id添加到集合中 listNdId.AddRange(elementIds.Where(r => !string.IsNullOrEmpty(r)).Select(int.Parse).ToArray()); //读取下一个节点 strLine = sr.ReadLine(); match = Regex.Match(strLine, pattern); } //将此Node Set中的每一个节点都生成一条 Generate Merge 命令 XYZ node; string mergeCommand = "Generate Merge " + Hm2Flac3DHandler.CubeRangePrecision * 2 + " "; foreach (int nodeId in listNdId) { node = _allGridPoints[nodeId]; string range = Hm2Flac3DHandler.ExtendCentroid(node); swGpMerge.WriteLine(mergeCommand + range); } // return(strLine); }