/// <summary> /// 构造函数 /// </summary> /// <param name="inpReader"></param> /// <param name="message">用于输出的消息说明</param> public Hm2Zone(StreamReader inpReader, StringBuilder message) : base(inpReader, message) { // Flac3dCommandWriters fcw = Flac3dCommandWriters.GetUniqueInstance(); Flac3DCommandType fct = Hm2Flac3DHandler.GetCommandType(ElementType.GridPoint); StreamWriter swZone = fcw.GetWriter(fct, Flac3dCommandWriters.FileZone, null); // sw_Zone = swZone; _message = message; //写入头文件信息 // 用im zone.dat来在Flac3d中导入网格时,在zone.dat中可以先写入文件头信息,而structures.dat文件中,不能用“*”来写注释 string strHeading = "* --------------------------------------------------" + "\r\n" + "* INP (exported from Hypermesh) to FLAC3D " + "\r\n" + "* Coded by Zengfy. Contact the developer with [email protected]." + "\r\n" + "* Latest update date: 2016/11/25 " + "\r\n" + "* --------------------------------------------------" + "\r\n" + "* Generated time: " + DateTime.Today.ToString("yyyy/MM/dd") + " " + DateTime.Now.ToShortTimeString() + "\r\n" + "\r\n" + "* GRIDPOINTS"; sw_Zone.WriteLine(strHeading); }
/// <summary> /// 创建节点 /// </summary> /// <param name="sr">用来提取数据的inp文件</param> /// <returns></returns> protected override string Gen_Node(StreamReader sr) { string strLine = ""; // Flac3dCommandWriters fcw = Flac3dCommandWriters.GetUniqueInstance(); Flac3DCommandType fct = Hm2Flac3DHandler.GetCommandType(ElementType.SelNode); StreamWriter swNode = fcw.GetWriter(fct, Flac3dCommandWriters.FileSelNode, null); // strLine = sr.ReadLine(); // 节点信息在inp中的大致的结构为: " 16, 10.0 , 6.6666666666667, 0.0 " while (!(strLine.StartsWith("*"))) { // 写入flac文件 swNode.WriteLine("SEL NODE cid {0}", strLine); // 大致的结构为: ' SEL NODE cid 1440016 0.216969418565193E+02 -0.531659539393860E+02 -0.161000000000000E+02 //保存节点信息,以供后面创建Liner之用 string[] comps = strLine.Split(','); _allNodes.Add(int.Parse(comps[0]), new XYZ( double.Parse(comps[1]), double.Parse(comps[2]), double.Parse(comps[3]))); // 读取下一个节点 strLine = sr.ReadLine(); // 大致的结构为: " 16, 10.0 , 6.6666666666667, 0.0 " } return(strLine); }
/// <summary> /// 根据要导出的单元类型,返回一个 StreamWriter,以存储用于在Flac3D中创建此类结构的命令语句 /// </summary> /// <param name="commandType"> 要写入的命令文本的类型 </param> /// <param name="writerName">写入的文本文件的名称,不包括后缀名 </param> /// <param name="fileSuffix"> 用户强行指定的文本后缀,如果不指定,则由<paramref name="commandType"/>来确定文件后缀。 </param> /// <param name="selId"> 结构单元所属的集合Id,如果没有Id,则赋值为 null </param> /// <returns></returns> public StreamWriter GetWriter(Flac3DCommandType commandType, string writerName, int?selId) { // 确定文件名 string fileName = writerName + GetFileSuffix(commandType); if (_openedWriters.ContainsKey(fileName)) { return(_openedWriters[fileName].Writer); } else // 说明此文本还未创建 { string filePath = Path.Combine(GetCommandDirectory(), fileName); // 新建一个文本文档并将相关信息保存下来 FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); // WriterInfo wi = new WriterInfo(commandType, fileName, sw) { Id = selId, }; _openedWriters.Add(fileName, wi); return(sw); } }
/// <summary> 定义每一种类型的单元应该被放置在哪种类型的命令文本中 </summary> /// <param name="elementType"></param> /// <returns></returns> public static Flac3DCommandType GetCommandType(ElementType elementType) { Flac3DCommandType fct = Flac3DCommandType.Others; switch (elementType) { case ElementType.SelNode: return(Flac3DCommandType.SelNode); case ElementType.GridPoint: case ElementType.ZONE_B8: case ElementType.ZONE_T4: case ElementType.ZONE_W6: return(Flac3DCommandType.Zones); case ElementType.BEAM: return(Flac3DCommandType.Beam); case ElementType.PILE: return(Flac3DCommandType.Pile); case ElementType.SHELL3: return(Flac3DCommandType.Shell); case ElementType.Liner3: case ElementType.Liner4: return(Flac3DCommandType.Liner); case ElementType.MERGEPOINT: return(Flac3DCommandType.MergePoint); } return(fct); }
/// <summary> 根据不同的单元类型返回对应文本的后缀名 </summary> /// <param name="commandType"></param> /// <returns></returns> private string GetFileSuffix(Flac3DCommandType commandType) { if ((commandType & Flac3DCommandType.Zones) > 0) { // 土体单元文本文件的后缀 return(FileSuffixZone); } else { // 结构单元文本文件的后缀 return(FileSuffixSel); } }
protected override string GenerateElement(ElementType type, StreamReader sr_inp, string componentName) { // Flac3dCommandWriters fcw = Flac3dCommandWriters.GetUniqueInstance(); Flac3DCommandType fct = Hm2Flac3DHandler.GetCommandType(type); StreamWriter swSel = fcw.GetWriter(fct, componentName, _selId); // // 结构单元 string strLine; if (type == ElementType.BEAM) { strLine = Gen_Beam(sr_inp, swSel, componentName, _selId); } else if (type == ElementType.PILE) { strLine = Gen_Pile(sr_inp, swSel, componentName, _selId); } else if (type == ElementType.SHELL3) { strLine = Gen_Shell3(sr_inp, swSel, componentName, _selId); } else if (type == (ElementType.Liner3 | ElementType.Liner4)) { strLine = Gen_Liner(sr_inp, swSel, componentName, _selId, true); } else if (type == ElementType.Liner4) { strLine = Gen_Liner(sr_inp, swSel, componentName, _selId, false); } //Hypermesh中的类型在Flac3d中没有设置对应的类型 else { _message.AppendLine($"Warning : Can not match element type \" {type} \"(in component {componentName}) with a corresponding type in Flac3D."); //如果某行字符串没有进行任何的数据提取,或者进行单元类型的判断,则继续读取下一行字符。 strLine = sr_inp.ReadLine(); } _selId++; return(strLine); }
/// <summary> /// 读取数据,并返回跳出循环的字符串 /// </summary> /// <param name="sr_inp"></param> /// <param name="stringline"> 当前要读取 inp 文件中的那一行数据 </param> /// <returns>如果数据提取成功,则返回True,否则返回False</returns> /// <remarks>在读取数据时,每一个生成单元的函数中,都会返回最后跳出循环的那个字符串,如果某行字符串没有进行任何的数据提取,或者进行单元类型的判断,则继续读取下一行字符。</remarks> protected override string ReadElements(StreamReader sr_inp, string stringline) { const string pattern_ElementType = @"\*ELEMENT,TYPE=(.+),ELSET=(.+)"; //大致结构为: *ELEMENT,TYPE=B31,ELSET=columns-c1 const string pattern_ElementSet_LinerGroup = @"\*ELSET, ELSET=(LG.*)"; // 大致结构为:*ELSET, ELSET=LG_C2Wall const string pattern_NodeSet_Merge = @"\*NSET, NSET=(LM.*)"; // 大致结构为:*NSET, NSET=LM_WallBottom //表示 Hypermesh 中的 SetBrowser 里面的 Element 组,用来作为 在Flac3D 中创建 Liner 时的 group 区间。 string strLine = stringline; Match match; do { //在Hypermesh导出的inp文件中,可以有很多个 *ELEMENT,TYPE=B31,ELSET=columns 这样的语句,它们是按hypermesh中的Component来进行分组的。 match = Regex.Match(strLine, pattern_ElementType, RegexOptions.IgnoreCase); if (match.Success) { // string strEleType = match.Groups[1].Value; string strComponentName = match.Groups[2].Value; // 当前读取到Inp中的那一个 Component(即 Hypermesh 中的 Component) ElementType tp = Hm2Flac3DHandler.GetElementType(strEleType, strComponentName); // 创建 Flac3D 单元 strLine = GenerateElement(tp, sr_inp, strComponentName); } else if ((match = Regex.Match(strLine, pattern_ElementSet_LinerGroup, RegexOptions.IgnoreCase)).Success) { string groupName = match.Groups[1].Value; if (groupName.Contains("-")) // set 的名称中不能包含“-” { _message.AppendLine($"Warning : Can not export element set : \" {groupName} \", make sure the set name starts with \"LG\"(case ignored) and excludes \"-\" if you want to bind the set to the creation of Liner elements."); } else { // 创建 Group 用来依附 Liner单元 strLine = Gen_LinerGroup(sr_inp, groupName); } } else if ((match = Regex.Match(strLine, pattern_NodeSet_Merge, RegexOptions.IgnoreCase)).Success) { string groupName = match.Groups[1].Value; if (groupName.Contains("-")) // set 的名称中不能包含“-” { _message.AppendLine($"Warning : Can not export element set : \" {groupName} \", make sure the set name starts with \"LM\"(case ignored)."); } else { // Flac3dCommandWriters fcw = Flac3dCommandWriters.GetUniqueInstance(); Flac3DCommandType fct = Hm2Flac3DHandler.GetCommandType(ElementType.MERGEPOINT); StreamWriter swMergeGp = fcw.GetWriter(fct, groupName, null); // // 节点耦合 strLine = Gen_GpMerge(sr_inp, swMergeGp, groupName); } } else { //如果某行字符串没有进行任何的数据提取,或者进行单元类型的判断,则继续读取下一行字符。 strLine = sr_inp.ReadLine(); } } while (strLine != null); return(strLine); }
public WriterInfo(Flac3DCommandType commandType, string fileName, StreamWriter writer) { CommandType = commandType; FileName = fileName; Writer = writer; }