diff --git a/HoaryFox/RH7/Component/Geometry/Stb2Brep.cs b/HoaryFox/RH7/Component/Geometry/Stb2Brep.cs index 18429709..06fe8af9 100644 --- a/HoaryFox/RH7/Component/Geometry/Stb2Brep.cs +++ b/HoaryFox/RH7/Component/Geometry/Stb2Brep.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.IO; using System.Linq; using Grasshopper.Kernel; @@ -41,6 +42,7 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) protected override void RegisterOutputParams(GH_OutputParamManager pManager) { + pManager.AddTextParameter("Log", "Log", "Log", GH_ParamAccess.item); pManager.AddBrepParameter("Columns", "Col", "output StbColumns to Brep", GH_ParamAccess.tree); pManager.AddBrepParameter("Girders", "Gird", "output StbGirders to Brep", GH_ParamAccess.tree); pManager.AddBrepParameter("Posts", "Pst", "output StbPosts to Brep", GH_ParamAccess.tree); @@ -58,25 +60,27 @@ protected override void SolveInstance(IGH_DataAccess dataAccess) if (!dataAccess.GetData("Data", ref _stBridge)) { return; } if (!dataAccess.GetData("Bake", ref isBake)) { return; } - CreateBrep(); + var log = CreateBrep(); if (isBake) { BakeBrep(); } - for (var i = 0; i < 9; i++) + dataAccess.SetData(0, log); + for (var i = 1; i < 10; i++) { - dataAccess.SetDataTree(i, _brepList[i]); + dataAccess.SetDataTree(i, _brepList[i - 1]); } } protected override Bitmap Icon => Resource.Brep; public override Guid ComponentGuid => new Guid("B2D5EA7F-E75F-406B-8D22-C267B43C5E72"); - private void CreateBrep() + private string CreateBrep() { + var path = Path.GetDirectoryName(Grasshopper.Instances.ComponentServer.FindAssemblyByObject(this).Location); StbMembers member = _stBridge.StbModel.StbMembers; - var brepFromStb = new CreateMemberBrepListFromStb(_stBridge.StbModel.StbSections, _stBridge.StbModel.StbNodes, new[] { DocumentTolerance(), DocumentAngleTolerance() }); + var brepFromStb = new CreateMemberBrepListFromStb(_stBridge.StbModel.StbSections, _stBridge.StbModel.StbNodes, new[] { DocumentTolerance(), DocumentAngleTolerance() }, path); _brepList[0] = brepFromStb.Column(member.StbColumns); _brepList[1] = brepFromStb.Girder(member.StbGirders); _brepList[2] = brepFromStb.Post(member.StbPosts); @@ -86,6 +90,8 @@ private void CreateBrep() _brepList[6] = brepFromStb.Wall(member.StbWalls, member.StbOpens); _brepList[7] = brepFromStb.Pile(member.StbPiles); _brepList[8] = brepFromStb.Footing(member.StbFootings); + brepFromStb.SerializeLog(); + return brepFromStb.Logger.ToString(); } private void BakeBrep() diff --git a/HoaryFox/RH7/Component/Utils/ConvertLogger.cs b/HoaryFox/RH7/Component/Utils/ConvertLogger.cs new file mode 100644 index 00000000..31c034e0 --- /dev/null +++ b/HoaryFox/RH7/Component/Utils/ConvertLogger.cs @@ -0,0 +1,105 @@ +using System; +using System.IO; +using System.Text; + +namespace HoaryFox.Component.Utils +{ + public class ConvertLogger + { + private readonly StringBuilder _logger = new StringBuilder(); + private readonly string _path; + + public ConvertLogger(string path, string version) + { + _path = path; + _logger.AppendLine(@"--------------------------------------"); + _logger.AppendLine(@" ____ ____ ________"); + _logger.AppendLine(@"|_ || _| |_ __ |"); + _logger.AppendLine(@" | |__| | .--. ,--. _ .--. _ __ | |_ \_| .--. _ __"); + _logger.AppendLine(@" | __ | / .'`\ \ `'_\ : [ `/'`\] [ \ [ ] | _| / .'`\ \ [ \ [ ]"); + _logger.AppendLine(@" _| | | |_ | \__. | // | |, | | \ '/ / _| |_ | \__. | > ' <"); + _logger.AppendLine(@"|____||____| '.__.' \'-;__/ [___] [\_: / |_____| '.__.' [__]`\_]"); + _logger.AppendLine(@" \__.'"); + _logger.AppendLine($" version:{version}"); + _logger.AppendLine(@" ST-Bridge to Brep Convert Log"); + _logger.AppendLine(@"--------------------------------------"); + _logger.AppendLine($"::INFO :: 変換開始 | {DateTime.Now}"); + } + + public void Clear() + { + _logger.Clear(); + } + + public void AppendInfoMessage(string message) + { + _logger.AppendLine($"::INFO :: {message}"); + } + + public void AppendInfoConvertStartMessage(string message) + { + _logger.AppendLine("--------------------------------------"); + _logger.AppendLine($"::INFO :: {message}の変換を開始しました。 | {DateTime.Now}"); + } + + public void AppendInfoConvertEndMessage(string message) + { + _logger.AppendLine($"::INFO :: {message}の変換を終了しました。 | {DateTime.Now}"); + _logger.AppendLine("--------------------------------------"); + } + + public void AppendInfoDataNotFoundMessage(string message) + { + _logger.AppendLine($"::INFO :: {message}のデータはありませんでした。 | {DateTime.Now}"); + _logger.AppendLine("--------------------------------------"); + } + + public void AppendInfo(string guid, string message) + { + _logger.AppendLine($"::INFO :: [{guid}] | {message}"); + } + + public void AppendConvertSuccess(string guid, string tag) + { + _logger.AppendLine($"::INFO :: [{guid}] | {tag} | 変換完了"); + } + + public void AppendWarning(string guid, string message) + { + _logger.AppendLine($"::WARNING:: [{guid}] | {message}"); + } + + public void AppendConvertWarning(string guid, string tag, string message) + { + _logger.AppendLine($"::WARNING:: [{guid}] | {tag} | 変換結果 要確認 | {message}"); + } + + public void AppendError(string guid, string message) + { + _logger.AppendLine($"::ERROR :: [{guid}] | {message}"); + } + + public void AppendConvertFailed(string guid, string tag, string message) + { + _logger.AppendLine($"::ERROR :: [{guid}] | {tag} | 変換失敗 | {message}"); + } + + public void AppendSummary(int[] resultCount) + { + _logger.AppendLine($"::INFO :: [SUMMARY] | {resultCount[0]} 件の変換に成功しました。"); + _logger.AppendLine($"::INFO :: [SUMMARY] | {resultCount[1]} 件が変換出来ましたが、結果の確認が必要です。"); + _logger.AppendLine($"::INFO :: [SUMMARY] | {resultCount[2]} 件の変換に失敗しました。"); + } + + public void Serialize() + { + AppendInfoConvertEndMessage("ST-BridgeデータのBrepへ"); + File.WriteAllText(_path + "/S2B_convert.log", _logger.ToString()); + } + + public override string ToString() + { + return _logger.ToString(); + } + } +} diff --git a/HoaryFox/RH7/Component/Utils/Geometry/CreateMemberBrepListFromStb.cs b/HoaryFox/RH7/Component/Utils/Geometry/CreateMemberBrepListFromStb.cs index e1eb376d..ecf7e06a 100644 --- a/HoaryFox/RH7/Component/Utils/Geometry/CreateMemberBrepListFromStb.cs +++ b/HoaryFox/RH7/Component/Utils/Geometry/CreateMemberBrepListFromStb.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Reflection; using Grasshopper.Kernel.Data; using Grasshopper.Kernel.Types; @@ -15,264 +17,363 @@ public class CreateMemberBrepListFromStb private readonly IEnumerable _nodes; private readonly IReadOnlyList _tolerance; private readonly StbSections _sections; + public ConvertLogger Logger { get; private set; } - public CreateMemberBrepListFromStb(StbSections sections, IEnumerable nodes, IReadOnlyList tolerance) + public CreateMemberBrepListFromStb(StbSections sections, IEnumerable nodes, IReadOnlyList tolerance, string logPath) { _nodes = nodes; _tolerance = tolerance; _sections = sections; + var version = Assembly.GetExecutingAssembly().GetName().Version.ToString(3); + Logger = new ConvertLogger(logPath, version); + } + + public void SerializeLog() + { + Logger.Serialize(); } public GH_Structure Column(IEnumerable columns) { + var typeStr = "柱"; + Logger.AppendInfoConvertStartMessage(typeStr); + var resultCount = new int[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (columns == null) { + Logger.AppendInfoDataNotFoundMessage(typeStr); return brepList; } foreach ((StbColumn column, int i) in columns.Select((column, index) => (column, index))) { - StbColumnKind_structure kind = column.kind_structure; - - StbNode[] endNodes = - { - _nodes.First(node => node.id == column.id_node_bottom), - _nodes.First(node => node.id == column.id_node_top) - }; - Point3d[] offset = + try { - new Point3d(column.offset_bottom_X, column.offset_bottom_Y, column.offset_bottom_Z), - new Point3d(column.offset_top_X, column.offset_top_Y, column.offset_top_Z) - }; - Point3d[] sectionPoints = + StbColumnKind_structure kind = column.kind_structure; + StbNode[] endNodes = + { + _nodes.First(node => node.id == column.id_node_bottom), + _nodes.First(node => node.id == column.id_node_top) + }; + Point3d[] offset = + { + new Point3d(column.offset_bottom_X, column.offset_bottom_Y, column.offset_bottom_Z), + new Point3d(column.offset_top_X, column.offset_top_Y, column.offset_top_Z) + }; + Point3d[] sectionPoints = + { + new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], + new Point3d(), + new Point3d(), + new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] + }; + Vector3d memberAxis = sectionPoints[3] - sectionPoints[0]; + sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * column.joint_bottom; + sectionPoints[2] = sectionPoints[3] - memberAxis / memberAxis.Length * column.joint_top; + + var brepMaker = new BrepMaker.Column(_sections, _tolerance, column.guid); + var brep = brepMaker.CreateColumnBrep(column.id_section, column.rotate, kind, sectionPoints, memberAxis); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); + + ConvertResultCheck(resultCount, column.guid, column.name, brep); + } + catch (Exception e) { - new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], - new Point3d(), - new Point3d(), - new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] - }; - Vector3d memberAxis = sectionPoints[3] - sectionPoints[0]; - sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * column.joint_bottom; - sectionPoints[2] = sectionPoints[3] - memberAxis / memberAxis.Length * column.joint_top; - - var brepMaker = new BrepMaker.Column(_sections, _tolerance, column.guid); - brepList.Append(new GH_Brep(brepMaker.CreateColumnBrep(column.id_section, column.rotate, kind, sectionPoints, memberAxis)), new GH_Path(0, i)); + ConvertFailed(resultCount, column.guid, column.name, e); + } } + Logger.AppendSummary(resultCount); + Logger.AppendInfoConvertEndMessage(typeStr); return brepList; } public GH_Structure Post(IEnumerable posts) { + var typeStr = "間柱"; + Logger.AppendInfoConvertStartMessage(typeStr); + var resultCount = new int[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (posts == null) { + Logger.AppendInfoDataNotFoundMessage(typeStr); return brepList; } foreach ((StbPost post, int i) in posts.Select((post, index) => (post, index))) { - StbColumnKind_structure kind = post.kind_structure; - - StbNode[] endNodes = - { - _nodes.First(node => node.id == post.id_node_bottom), - _nodes.First(node => node.id == post.id_node_top) - }; - Point3d[] offset = + try { - new Point3d(post.offset_bottom_X, post.offset_bottom_Y, post.offset_bottom_Z), - new Point3d(post.offset_top_X, post.offset_top_Y, post.offset_top_Z) - }; - Point3d[] sectionPoints = + StbColumnKind_structure kind = post.kind_structure; + StbNode[] endNodes = + { + _nodes.First(node => node.id == post.id_node_bottom), + _nodes.First(node => node.id == post.id_node_top) + }; + Point3d[] offset = + { + new Point3d(post.offset_bottom_X, post.offset_bottom_Y, post.offset_bottom_Z), + new Point3d(post.offset_top_X, post.offset_top_Y, post.offset_top_Z) + }; + Point3d[] sectionPoints = + { + new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], + new Point3d(), + new Point3d(), + new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] + }; + Vector3d memberAxis = sectionPoints[3] - sectionPoints[0]; + sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * post.joint_bottom; + sectionPoints[2] = sectionPoints[3] - memberAxis / memberAxis.Length * post.joint_top; + + var brepMaker = new BrepMaker.Column(_sections, _tolerance, post.guid); + var brep = brepMaker.CreateColumnBrep(post.id_section, post.rotate, kind, sectionPoints, memberAxis); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); + + ConvertResultCheck(resultCount, post.guid, post.name, brep); + } + catch (Exception e) { - new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], - new Point3d(), - new Point3d(), - new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] - }; - Vector3d memberAxis = sectionPoints[3] - sectionPoints[0]; - sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * post.joint_bottom; - sectionPoints[2] = sectionPoints[3] - memberAxis / memberAxis.Length * post.joint_top; - - var brepMaker = new BrepMaker.Column(_sections, _tolerance, post.guid); - brepList.Append(new GH_Brep(brepMaker.CreateColumnBrep(post.id_section, post.rotate, kind, sectionPoints, memberAxis)), new GH_Path(0, i)); + ConvertFailed(resultCount, post.guid, post.name, e); + } } + Logger.AppendSummary(resultCount); + Logger.AppendInfoConvertEndMessage(typeStr); return brepList; } public GH_Structure Girder(IEnumerable girders) { + var typeStr = "大梁"; + Logger.AppendInfoConvertStartMessage(typeStr); + var resultCount = new int[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (girders == null) { + Logger.AppendInfoDataNotFoundMessage(typeStr); return brepList; } foreach ((StbGirder girder, int i) in girders.Select((girder, index) => (girder, index))) { - StbGirderKind_structure kind = girder.kind_structure; - - StbNode[] endNodes = + try { - _nodes.First(node => node.id == girder.id_node_start), - _nodes.First(node => node.id == girder.id_node_end) - }; - Point3d[] offset = - { - new Point3d(girder.offset_start_X, girder.offset_start_Y, girder.offset_start_Z), - new Point3d(girder.offset_end_X, girder.offset_end_Y, girder.offset_end_Z) - }; - Point3d[] sectionPoints = + StbGirderKind_structure kind = girder.kind_structure; + StbNode[] endNodes = + { + _nodes.First(node => node.id == girder.id_node_start), + _nodes.First(node => node.id == girder.id_node_end) + }; + Point3d[] offset = + { + new Point3d(girder.offset_start_X, girder.offset_start_Y, girder.offset_start_Z), + new Point3d(girder.offset_end_X, girder.offset_end_Y, girder.offset_end_Z) + }; + Point3d[] sectionPoints = + { + new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], + Point3d.Origin, // haunch_s + Point3d.Origin, // joint_s + Point3d.Origin, // joint_e + Point3d.Origin, // haunch_e + new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] + }; + Vector3d memberAxis = sectionPoints[5] - sectionPoints[0]; + sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * girder.haunch_start; + sectionPoints[2] = sectionPoints[0] + memberAxis / memberAxis.Length * girder.joint_start; + sectionPoints[3] = sectionPoints[5] - memberAxis / memberAxis.Length * girder.joint_end; + sectionPoints[4] = sectionPoints[5] - memberAxis / memberAxis.Length * girder.haunch_end; + + var brepMaker = new BrepMaker.Girder(_sections, _tolerance, girder.guid); + var brep = brepMaker.CreateGirderBrep(girder.id_section, girder.rotate, kind, sectionPoints, memberAxis); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); + + ConvertResultCheck(resultCount, girder.guid, girder.name, brep); + } + catch (Exception e) { - new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], - Point3d.Origin, // haunch_s - Point3d.Origin, // joint_s - Point3d.Origin, // joint_e - Point3d.Origin, // haunch_e - new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] - }; - Vector3d memberAxis = sectionPoints[5] - sectionPoints[0]; - sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * girder.haunch_start; - sectionPoints[2] = sectionPoints[0] + memberAxis / memberAxis.Length * girder.joint_start; - sectionPoints[3] = sectionPoints[5] - memberAxis / memberAxis.Length * girder.joint_end; - sectionPoints[4] = sectionPoints[5] - memberAxis / memberAxis.Length * girder.haunch_end; - - var brepMaker = new BrepMaker.Girder(_sections, _tolerance, girder.guid); - brepList.Append(new GH_Brep(brepMaker.CreateGirderBrep(girder.id_section, girder.rotate, kind, sectionPoints, memberAxis)), new GH_Path(0, i)); + ConvertFailed(resultCount, girder.guid, girder.name, e); + } } + Logger.AppendSummary(resultCount); + Logger.AppendInfoConvertEndMessage(typeStr); return brepList; } public GH_Structure Beam(IEnumerable beams) { + var typeStr = "小梁"; + Logger.AppendInfoConvertStartMessage(typeStr); + var resultCount = new int[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (beams == null) { + Logger.AppendInfoDataNotFoundMessage(typeStr); return brepList; } foreach ((StbBeam beam, int i) in beams.Select((beam, index) => (beam, index))) { - StbGirderKind_structure kind = beam.kind_structure; - - StbNode[] endNodes = - { - _nodes.First(node => node.id == beam.id_node_start), - _nodes.First(node => node.id == beam.id_node_end) - }; - Point3d[] offset = + try { - new Point3d(beam.offset_start_X, beam.offset_start_Y, beam.offset_start_Z), - new Point3d(beam.offset_end_X, beam.offset_end_Y, beam.offset_end_Z) - }; - Point3d[] sectionPoints = + StbGirderKind_structure kind = beam.kind_structure; + StbNode[] endNodes = + { + _nodes.First(node => node.id == beam.id_node_start), + _nodes.First(node => node.id == beam.id_node_end) + }; + Point3d[] offset = + { + new Point3d(beam.offset_start_X, beam.offset_start_Y, beam.offset_start_Z), + new Point3d(beam.offset_end_X, beam.offset_end_Y, beam.offset_end_Z) + }; + Point3d[] sectionPoints = + { + new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], + Point3d.Origin, // haunch_s + Point3d.Origin, // joint_s + Point3d.Origin, // joint_e + Point3d.Origin, // haunch_e + new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] + }; + Vector3d memberAxis = sectionPoints[5] - sectionPoints[0]; + sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * beam.haunch_start; + sectionPoints[2] = sectionPoints[0] + memberAxis / memberAxis.Length * beam.joint_start; + sectionPoints[3] = sectionPoints[5] - memberAxis / memberAxis.Length * beam.joint_end; + sectionPoints[4] = sectionPoints[5] - memberAxis / memberAxis.Length * beam.haunch_end; + + var brepMaker = new BrepMaker.Girder(_sections, _tolerance, beam.guid); + var brep = brepMaker.CreateGirderBrep(beam.id_section, beam.rotate, kind, sectionPoints, memberAxis); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); + + ConvertResultCheck(resultCount, beam.guid, beam.name, brep); + } + catch (Exception e) { - new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], - Point3d.Origin, // haunch_s - Point3d.Origin, // joint_s - Point3d.Origin, // joint_e - Point3d.Origin, // haunch_e - new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] - }; - Vector3d memberAxis = sectionPoints[5] - sectionPoints[0]; - sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * beam.haunch_start; - sectionPoints[2] = sectionPoints[0] + memberAxis / memberAxis.Length * beam.joint_start; - sectionPoints[3] = sectionPoints[5] - memberAxis / memberAxis.Length * beam.joint_end; - sectionPoints[4] = sectionPoints[5] - memberAxis / memberAxis.Length * beam.haunch_end; - - var brepMaker = new BrepMaker.Girder(_sections, _tolerance, beam.guid); - brepList.Append(new GH_Brep(brepMaker.CreateGirderBrep(beam.id_section, beam.rotate, kind, sectionPoints, memberAxis)), new GH_Path(0, i)); + ConvertFailed(resultCount, beam.guid, beam.name, e); + } } + Logger.AppendSummary(resultCount); + Logger.AppendInfoConvertEndMessage(typeStr); return brepList; } public GH_Structure Brace(IEnumerable braces) { + var typeStr = "ブレース"; + Logger.AppendInfoConvertStartMessage(typeStr); + var resultCount = new int[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (braces == null) { + Logger.AppendInfoDataNotFoundMessage(typeStr); return brepList; } foreach ((StbBrace brace, int i) in braces.Select((brace, index) => (brace, index))) { - StbBraceKind_structure kind = brace.kind_structure; - - StbNode[] endNodes = + try { - _nodes.First(node => node.id == brace.id_node_start), - _nodes.First(node => node.id == brace.id_node_end) - }; - Point3d[] offset = - { - new Point3d(brace.offset_start_X, brace.offset_start_Y, brace.offset_start_Z), - new Point3d(brace.offset_end_X, brace.offset_end_Y, brace.offset_end_Z) - }; - Point3d[] sectionPoints = + StbBraceKind_structure kind = brace.kind_structure; + StbNode[] endNodes = + { + _nodes.First(node => node.id == brace.id_node_start), + _nodes.First(node => node.id == brace.id_node_end) + }; + Point3d[] offset = + { + new Point3d(brace.offset_start_X, brace.offset_start_Y, brace.offset_start_Z), + new Point3d(brace.offset_end_X, brace.offset_end_Y, brace.offset_end_Z) + }; + Point3d[] sectionPoints = + { + new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], + Point3d.Origin, + Point3d.Origin, + new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] + }; + Vector3d memberAxis = sectionPoints[3] - sectionPoints[0]; + sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * brace.joint_start; + sectionPoints[2] = sectionPoints[3] - memberAxis / memberAxis.Length * brace.joint_end; + + var brepMaker = new BrepMaker.Brace(_sections, _tolerance, brace.guid); + var brep = brepMaker.CreateBraceBrep(brace.id_section, brace.rotate, kind, sectionPoints, memberAxis); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); + + ConvertResultCheck(resultCount, brace.guid, brace.name, brep); + } + catch (Exception e) { - new Point3d(endNodes[0].X, endNodes[0].Y, endNodes[0].Z) + offset[0], - Point3d.Origin, - Point3d.Origin, - new Point3d(endNodes[1].X, endNodes[1].Y, endNodes[1].Z) + offset[1] - }; - Vector3d memberAxis = sectionPoints[3] - sectionPoints[0]; - sectionPoints[1] = sectionPoints[0] + memberAxis / memberAxis.Length * brace.joint_start; - sectionPoints[2] = sectionPoints[3] - memberAxis / memberAxis.Length * brace.joint_end; - - var brepMaker = new BrepMaker.Brace(_sections, _tolerance, brace.guid); - brepList.Append(new GH_Brep(brepMaker.CreateBraceBrep(brace.id_section, brace.rotate, kind, sectionPoints, memberAxis)), new GH_Path(0, i)); + ConvertFailed(resultCount, brace.guid, brace.name, e); + } } + Logger.AppendSummary(resultCount); + Logger.AppendInfoConvertEndMessage(typeStr); return brepList; } public GH_Structure Slab(IEnumerable slabs) { + var typeStr = "スラブ"; + Logger.AppendInfoConvertStartMessage(typeStr); + var resultCount = new int[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (slabs == null) { + Logger.AppendInfoDataNotFoundMessage(typeStr); return brepList; } foreach ((StbSlab slab, int i) in slabs.Select((slab, index) => (slab, index))) { - StbSlabOffset[] offsets = slab.StbSlabOffsetList; - var curveList = new PolylineCurve[2]; - double depth = BrepMaker.Slab.GetDepth(_sections, slab); - string[] nodeIds = slab.StbNodeIdOrder.Split(' '); - var topPts = new List(); - foreach (string nodeId in nodeIds) + try { - var offsetVec = new Vector3d(); - if (offsets != null) + StbSlabOffset[] offsets = slab.StbSlabOffsetList; + var curveList = new PolylineCurve[2]; + double depth = BrepMaker.Slab.GetDepth(_sections, slab); + string[] nodeIds = slab.StbNodeIdOrder.Split(' '); + var topPts = new List(); + foreach (string nodeId in nodeIds) { - foreach (StbSlabOffset offset in offsets) + var offsetVec = new Vector3d(); + if (offsets != null) { - if (nodeId == offset.id_node) + foreach (StbSlabOffset offset in offsets) { - offsetVec = new Vector3d(offset.offset_X, offset.offset_Y, offset.offset_Z); + if (nodeId == offset.id_node) + { + offsetVec = new Vector3d(offset.offset_X, offset.offset_Y, offset.offset_Z); + } } } + + StbNode node = _nodes.First(n => n.id == nodeId); + topPts.Add(new Point3d(node.X, node.Y, node.Z) + offsetVec); } - StbNode node = _nodes.First(n => n.id == nodeId); - topPts.Add(new Point3d(node.X, node.Y, node.Z) + offsetVec); - } + topPts.Add(topPts[0]); + curveList[0] = new PolylineCurve(topPts); + var brep = CreateSlabBrep(slab.guid, depth, curveList, topPts); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); - topPts.Add(topPts[0]); - curveList[0] = new PolylineCurve(topPts); - brepList.Append(CreateSlabBrep(depth, curveList, topPts), new GH_Path(0, i)); + ConvertResultCheck(resultCount, slab.guid, slab.name, brep); + } + catch (Exception e) + { + ConvertFailed(resultCount, slab.guid, slab.name, e); + } } + Logger.AppendSummary(resultCount); + Logger.AppendInfoConvertEndMessage(typeStr); return brepList; } - private GH_Brep CreateSlabBrep(double depth, IList curveList, IEnumerable topPts) + private Brep CreateSlabBrep(string guid, double depth, IList curveList, IEnumerable topPts) { if (depth > 0) { @@ -283,19 +384,20 @@ private GH_Brep CreateSlabBrep(double depth, IList curveList, IEn if (capedBrep == null) { + Logger.AppendInfo(guid, "スラブがplanerではないため、NetSurfaceで曲面のスラブ生成します。"); return NonPlanarBrep(depth, curveList); } CheckBrepOrientation(capedBrep); - return new GH_Brep(capedBrep); + return capedBrep; } - return new GH_Brep(curveList[0].IsPlanar() + return curveList[0].IsPlanar() ? Brep.CreatePlanarBreps(curveList[0], _tolerance[0])[0] - : Brep.CreatePatch(new[] { curveList[0] }, 5, 5, _tolerance[0])); + : Brep.CreatePatch(new[] { curveList[0] }, 5, 5, _tolerance[0]); } - private GH_Brep NonPlanarBrep(double depth, IList curveList) + private Brep NonPlanarBrep(double depth, IList curveList) { var nonPlanarBrep = new List(); var topBrep = Brep.CreatePatch(new[] { curveList[0] }, 5, 5, _tolerance[0]); @@ -315,57 +417,73 @@ private GH_Brep NonPlanarBrep(double depth, IList curveList) IEnumerable edgeCurveList = topBrep.Edges.Select(edge => edge.DuplicateCurve()); nonPlanarBrep.AddRange(edgeCurveList.Select(edgeCurve => Surface.CreateExtrusion(edgeCurve, faceNormal * depth).ToBrep())); - return new GH_Brep(Brep.JoinBreps(nonPlanarBrep, _tolerance[0])[0] ?? topBrep); + return Brep.JoinBreps(nonPlanarBrep, _tolerance[0])[0] ?? topBrep; } public GH_Structure Wall(IEnumerable walls, IEnumerable opens) { + var typeStr = "壁"; + Logger.AppendInfoConvertStartMessage(typeStr); + var resultCount = new int[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (walls == null) { + Logger.AppendInfoDataNotFoundMessage(typeStr); return brepList; } foreach ((StbWall wall, int i) in walls.Select((wall, index) => (wall, index))) { - StbWallOffset[] offsets = wall.StbWallOffsetList; - var curveList = new PolylineCurve[2]; - double thickness = BrepMaker.Wall.GetThickness(_sections, wall); - string[] nodeIds = wall.StbNodeIdOrder.Split(' '); - var wallPts = new List(); - foreach (string nodeId in nodeIds) + try { - var offsetVec = new Vector3d(); - if (offsets != null) + StbWallOffset[] offsets = wall.StbWallOffsetList; + var curveList = new PolylineCurve[2]; + double thickness = BrepMaker.Wall.GetThickness(_sections, wall); + string[] nodeIds = wall.StbNodeIdOrder.Split(' '); + var wallPts = new List(); + foreach (string nodeId in nodeIds) { - foreach (StbWallOffset offset in offsets) + var offsetVec = new Vector3d(); + if (offsets != null) { - if (nodeId == offset.id_node) + foreach (StbWallOffset offset in offsets) { - offsetVec = new Vector3d(offset.offset_X, offset.offset_Y, offset.offset_Z); - break; + if (nodeId == offset.id_node) + { + offsetVec = new Vector3d(offset.offset_X, offset.offset_Y, offset.offset_Z); + break; + } } } - } - StbNode node = _nodes.First(n => n.id == nodeId); - wallPts.Add(new Point3d(node.X, node.Y, node.Z) + offsetVec); + StbNode node = _nodes.First(n => n.id == nodeId); + wallPts.Add(new Point3d(node.X, node.Y, node.Z) + offsetVec); + } + wallPts.Add(wallPts[0]); + var centerCurve = new PolylineCurve(wallPts); + Vector3d normal = Vector3d.CrossProduct(centerCurve.TangentAtEnd, centerCurve.TangentAtStart); + curveList[0] = new PolylineCurve(wallPts.Select(pt => pt + normal * thickness / 2)); + curveList[1] = new PolylineCurve(wallPts.Select(pt => pt - normal * thickness / 2)); + Brep brep = Brep.CreateFromLoft(curveList, Point3d.Unset, Point3d.Unset, LoftType.Straight, false)[0].CapPlanarHoles(_tolerance[0]); + CheckBrepOrientation(brep); + + brep = ApplyWallOpen(wall.guid, opens, wall, wallPts, brep); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); + + ConvertResultCheck(resultCount, wall.guid, wall.name, brep); + } + catch (Exception e) + { + ConvertFailed(resultCount, wall.guid, wall.name, e); } - wallPts.Add(wallPts[0]); - var centerCurve = new PolylineCurve(wallPts); - Vector3d normal = Vector3d.CrossProduct(centerCurve.TangentAtEnd, centerCurve.TangentAtStart); - curveList[0] = new PolylineCurve(wallPts.Select(pt => pt + normal * thickness / 2)); - curveList[1] = new PolylineCurve(wallPts.Select(pt => pt - normal * thickness / 2)); - Brep brep = Brep.CreateFromLoft(curveList, Point3d.Unset, Point3d.Unset, LoftType.Straight, false)[0].CapPlanarHoles(_tolerance[0]); - CheckBrepOrientation(brep); - - brep = ApplyWallOpen(opens, wall, wallPts, brep); - brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); } + Logger.AppendSummary(resultCount); + Logger.AppendInfoConvertEndMessage(typeStr); return brepList; } + private static void CheckBrepOrientation(Brep brep) { if (brep == null) @@ -380,7 +498,7 @@ private static void CheckBrepOrientation(Brep brep) brep.Faces.SplitKinkyFaces(); } - private Brep ApplyWallOpen(IEnumerable opens, StbWall wall, IReadOnlyList wallPts, Brep brep) + private Brep ApplyWallOpen(string guid, IEnumerable opens, StbWall wall, IReadOnlyList wallPts, Brep brep) { if (brep == null) { @@ -406,6 +524,10 @@ private Brep ApplyWallOpen(IEnumerable opens, StbWall wall, IReadOnlyLi { brep = Brep.CreateBooleanDifference(brep, openBrep, 1)[0]; } + else + { + Logger.AppendWarning(guid, $"開口id:{id}の作成に失敗しました。"); + } } } @@ -438,102 +560,164 @@ private static Point3d[] GetOpenCurvePts(IReadOnlyList wallPts, StbOpen public GH_Structure Pile(IEnumerable piles) { + var typeString = "杭"; + Logger.AppendInfoConvertStartMessage(typeString); + var resultCount = new[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (piles == null) { + Logger.AppendInfoDataNotFoundMessage(typeString); return brepList; } foreach ((StbPile pile, int i) in piles.Select((pile, index) => (pile, index))) { - StbPileKind_structure kind = pile.kind_structure; - StbNode node = _nodes.First(n => n.id == pile.id_node); - var sectionPoints = new List(); - - switch (kind) + try { - case StbPileKind_structure.RC: - Point3d[] endNodes = - { - new Point3d(node.X, node.Y, node.Z), - new Point3d(node.X, node.Y, node.Z - pile.length_all) - }; - Point3d[] offset = - { - new Point3d(pile.offset_X, pile.offset_Y, pile.level_top), - new Point3d(pile.offset_X, pile.offset_Y, pile.level_top), - }; - sectionPoints = new List - { - endNodes[0] + offset[0], - new Point3d(), - new Point3d(), - endNodes[1] + offset[1] - }; - sectionPoints[1] = sectionPoints[0] - Vector3d.ZAxis * pile.length_head; - break; - case StbPileKind_structure.PC: - var figures = PCPileFigure.GetFigureList(_sections, pile); - sectionPoints.Add(new Point3d - { - X = node.X + pile.offset_X, - Y = node.Y + pile.offset_Y, - Z = node.Z + pile.level_top - }); - foreach ((PCPileFigure figure, int index) in figures.Select((figure, index) => (figure, index))) - { + StbPileKind_structure kind = pile.kind_structure; + StbNode node = _nodes.First(n => n.id == pile.id_node); + var sectionPoints = new List(); + + switch (kind) + { + case StbPileKind_structure.RC: + Point3d[] endNodes = + { + new Point3d(node.X, node.Y, node.Z), + new Point3d(node.X, node.Y, node.Z - pile.length_all) + }; + Point3d[] offset = + { + new Point3d(pile.offset_X, pile.offset_Y, pile.level_top), + new Point3d(pile.offset_X, pile.offset_Y, pile.level_top), + }; + sectionPoints = new List + { + endNodes[0] + offset[0], + new Point3d(), + new Point3d(), + endNodes[1] + offset[1] + }; + sectionPoints[1] = sectionPoints[0] - Vector3d.ZAxis * pile.length_head; + break; + case StbPileKind_structure.PC: + var figures = PCPileFigure.GetFigureList(_sections, pile); sectionPoints.Add(new Point3d { - X = sectionPoints[index].X, - Y = sectionPoints[index].Y, - Z = sectionPoints[index].Z - figure.Length + X = node.X + pile.offset_X, + Y = node.Y + pile.offset_Y, + Z = node.Z + pile.level_top }); - } - break; - } + foreach ((PCPileFigure figure, int index) in figures.Select((figure, index) => (figure, index))) + { + sectionPoints.Add(new Point3d + { + X = sectionPoints[index].X, + Y = sectionPoints[index].Y, + Z = sectionPoints[index].Z - figure.Length + }); + } + break; + } + + var brepMaker = new BrepMaker.Pile(_sections, _tolerance, pile.guid); + var brep = brepMaker.CreatePileBrep(pile.id_section, kind, sectionPoints, -Vector3d.ZAxis); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); - var brepMaker = new BrepMaker.Pile(_sections, _tolerance, pile.guid); - brepList.Append(new GH_Brep(brepMaker.CreatePileBrep(pile.id_section, kind, sectionPoints, -Vector3d.ZAxis)), new GH_Path(0, i)); + ConvertResultCheck(resultCount, pile.guid, pile.name, brep); + } + catch (Exception e) + { + ConvertFailed(resultCount, pile.guid, pile.name, e); + } } + Logger.AppendSummary(resultCount); + Logger.AppendInfoConvertEndMessage(typeString); return brepList; } public GH_Structure Footing(IEnumerable footings) { + var typeStr = "フーチング"; + Logger.AppendInfoConvertStartMessage(typeStr); + var convertCount = new[] { 0, 0, 0 }; var brepList = new GH_Structure(); if (footings == null) { + Logger.AppendInfoDataNotFoundMessage(typeStr); return brepList; } foreach ((StbFooting footing, int i) in footings.Select((f, index) => (f, index))) { - StbNode node = _nodes.First(n => n.id == footing.id_node); - Point3d[] endNodes = - { - new Point3d(node.X, node.Y, node.Z), - new Point3d(node.X, node.Y, node.Z + footing.level_bottom) - }; - Point3d[] offset = + try { - new Point3d(footing.offset_X, footing.offset_Y, 0), - new Point3d(footing.offset_X, footing.offset_Y, 0), - }; - Point3d[] sectionPoints = + StbNode node = _nodes.First(n => n.id == footing.id_node); + Point3d[] endNodes = + { + new Point3d(node.X, node.Y, node.Z), + new Point3d(node.X, node.Y, node.Z + footing.level_bottom) + }; + Point3d[] offset = + { + new Point3d(footing.offset_X, footing.offset_Y, 0), + new Point3d(footing.offset_X, footing.offset_Y, 0), + }; + Point3d[] sectionPoints = + { + endNodes[0] + offset[0], + new Point3d(), + new Point3d(), + endNodes[1] + offset[1] + }; + Vector3d memberAxis = sectionPoints[3] - sectionPoints[0]; + + var brepMaker = new BrepMaker.Footing(_sections, _tolerance, footing.guid); + var brep = brepMaker.CreateFootingBrep(footing.id_section, footing.rotate, sectionPoints, memberAxis / memberAxis.Length); + brepList.Append(new GH_Brep(brep), new GH_Path(0, i)); + + ConvertResultCheck(convertCount, footing.guid, footing.name, brep); + } + catch (Exception e) { - endNodes[0] + offset[0], - new Point3d(), - new Point3d(), - endNodes[1] + offset[1] - }; - Vector3d memberAxis = sectionPoints[3] - sectionPoints[0]; - - var brepMaker = new BrepMaker.Footing(_sections, _tolerance, footing.guid); - brepList.Append(new GH_Brep(brepMaker.CreateFootingBrep(footing.id_section, footing.rotate, sectionPoints, memberAxis / memberAxis.Length)), new GH_Path(0, i)); + ConvertFailed(convertCount, footing.guid, footing.name, e); + } } + Logger.AppendSummary(convertCount); + Logger.AppendInfoConvertEndMessage(typeStr); return brepList; } + + private void ConvertResultCheck(int[] resultCount, string guid, string tag, Brep brep) + { + if (brep == null) + { + resultCount[2]++; + Logger.AppendConvertFailed(guid, tag, "Brepへの変換結果がnullです。"); + return; + } + else if (!brep.IsValid) + { + resultCount[1]++; + Logger.AppendConvertWarning(guid, tag, "BrepがInvalidです。Bakeに失敗する可能性があります。"); + return; + } + else + { + resultCount[0]++; + Logger.AppendConvertSuccess(guid, tag); + } + } + + private void ConvertFailed(int[] resultCount, string guid, string tag, Exception e) + { + resultCount[2]++; + Logger.AppendConvertFailed(guid, tag, e.Message); +#if DEBUG + throw e; +#endif + } } } diff --git a/website/docs/Changelog.md b/website/docs/Changelog.md index 16ec8488..2d687f0f 100644 --- a/website/docs/Changelog.md +++ b/website/docs/Changelog.md @@ -5,6 +5,28 @@ title: Changelog --- +## [v2.4.0 - 2023-06-11](https://github.com/hrntsm/HoaryFox/releases/tag/v2.4.0) + +### 追加 + +- S2Lコンポーネント + - 杭の可視化対応 + - 節点のオフセットの有無を反映するboolの追加 +- S2Bコンポーネント + - S杭を除く杭の可視化 + - 矩形のフーチングの可視化 + - 変換結果のログ出力と保存 + - 鉄骨のT断面、C断面、L断面の背中合わせ、顔合わせに対応 + - CFT断面の出力 + +### 変更 + +- これまで1つでもエラーがあると変換結果が出力されなかったが、変換エラーの情報をログに記載して、それ以外は出力されるようにした。 + +### 修正 + +- ハンチのある梁のハンチ長がこれまではジョイント長で作成されていたため、ハンチ長で作成するようにした。 + ## [v2.3.0 - 2022-10-15](https://github.com/hrntsm/HoaryFox/releases/tag/v2.3.0) ### 追加 diff --git a/website/docs/Component/Geometry.md b/website/docs/Component/Geometry.md index 435856be..10d8d724 100644 --- a/website/docs/Component/Geometry.md +++ b/website/docs/Component/Geometry.md @@ -13,19 +13,25 @@ title: Geometry 部材を Line で表示する -|入力|説明| -|---|:---:| -|Data|Load STB file コンポーネントの Data 出力を入力| -|Bake|各 Line を断面符号ごとにレイヤー分けして Bake する| - -|出力|説明| -|---|:---:| -|Nodes| 節点の Point3d のリストを出力| -|Columns| 柱の Line のツリーを出力| -|Girders| 大梁の Line のツリーを出力| -|Posts| 間柱の Line のツリーを出力| -|Beams| 小梁の Line のツリーを出力| -|Braces| ブレースの Line のツリーを出力| +| 入力 | 説明 | +| ---------- | :------------------------------------------------: | +| Data | Load STB file コンポーネントの Data 出力を入力 | +| OffsetNode | 部材端部のオフセットの考慮の有無 | +| Bake | 各 Line を断面符号ごとにレイヤー分けして Bake する | + +| 出力 | 説明 | +| ------- | :----------------------------: | +| Nodes | 節点の Point3d のリストを出力 | +| Columns | 柱の Line のツリーを出力 | +| Girders | 大梁の Line のツリーを出力 | +| Posts | 間柱の Line のツリーを出力 | +| Beams | 小梁の Line のツリーを出力 | +| Braces | ブレースの Line のツリーを出力 | +| Piles | 杭の Line のツリーを出力 | + +### 備考 + +- 杭についてはオフセットの有無で杭長が変わらないように出力しているため、オフセットを False にした場合、杭先端がオフセット分だけ異なる位置に表示されます。 --- @@ -35,25 +41,32 @@ title: Geometry 部材を Brep で表示する -|入力|説明| -|---|:---:| -|Data|Load STB file コンポーネントの Data 出力を入力| -|Bake|各 Brep を断面符号ごとにレイヤー分けして Bake する| - -|出力|説明| -|---|:---:| -|Columns| 柱形状を表す Brep のツリーを出力| -|Girders| 大梁形状を表す Brep のツリーを出力| -|Posts| 間柱形状を表す Brep のツリーを出力| -|Beams| 小梁形状を表す Brep のツリーを出力| -|Braces| ブレース形状を表す Brep のツリーを出力| -|Slabs| スラブ形状を表す Brep のツリーを出力| -|Walls| 壁形状を表す Brep のツリーを出力| +| 入力 | 説明 | +| ---- | :------------------------------------------------: | +| Data | Load STB file コンポーネントの Data 出力を入力 | +| Bake | 各 Brep を断面符号ごとにレイヤー分けして Bake する | + +| 出力 | 説明 | +| -------- | :--------------------------------------: | +| Log | 変換結果のログ出力 | +| Columns | 柱形状を表す Brep のツリーを出力 | +| Girders | 大梁形状を表す Brep のツリーを出力 | +| Posts | 間柱形状を表す Brep のツリーを出力 | +| Beams | 小梁形状を表す Brep のツリーを出力 | +| Braces | ブレース形状を表す Brep のツリーを出力 | +| Slabs | スラブ形状を表す Brep のツリーを出力 | +| Walls | 壁形状を表す Brep のツリーを出力 | +| Piles | 杭形状を表す Brep のツリーを出力 | +| Footings | フーチング形状を表す Brep のツリーを出力 | ### 表示仕様 -- 床、壁の開口は反映されません。 +- Log は GH コンポーネントと同じフォルダに変換ごとにファイルとして保存されます。 +- 床の開口は反映されません。 - 平面でないスラブでは近似した面を張るため処理が重い場合があります。 +- SRC,CFT は S と RC を一体化した一つの Brep として作成されます。 +- C 断面の背中合わせは H 型、顔合わせはボックス型として出力されます。 +- L 断面の背中合わせは T 型、顔合わせは C 型として出力されます。 --- @@ -63,12 +76,12 @@ title: Geometry 階と軸をラインで表示する -|入力|説明| -|---|:---:| -|Data|Load STB file コンポーネントの Data 出力を入力| -|Factor|軸線の長さの比率| -|Size|軸名、階名の文字のサイズ。デフォルトは 12| +| 入力 | 説明 | +| ------ | :--------------------------------------------: | +| Data | Load STB file コンポーネントの Data 出力を入力 | +| Factor | 軸線の長さの比率 | +| Size | 軸名、階名の文字のサイズ。デフォルトは 12 | -|出力|説明| -|---|:---:| -|Axis| 軸と階を示す Line の出力| \ No newline at end of file +| 出力 | 説明 | +| ---- | :----------------------: | +| Axis | 軸と階を示す Line の出力 | diff --git a/website/images/Component/StbToBrep.png b/website/images/Component/StbToBrep.png index f0b6d2b5..0619c62e 100644 Binary files a/website/images/Component/StbToBrep.png and b/website/images/Component/StbToBrep.png differ diff --git a/website/images/Component/StbToLine.png b/website/images/Component/StbToLine.png index 9f44f0d6..b9eb54b7 100644 Binary files a/website/images/Component/StbToLine.png and b/website/images/Component/StbToLine.png differ diff --git a/website/package.json b/website/package.json index a36f11ee..c305fc34 100644 --- a/website/package.json +++ b/website/package.json @@ -1,6 +1,6 @@ { "name": "hoaryfox-website", - "version": "2.3.0", + "version": "2.4.0", "private": true, "scripts": { "docusaurus": "docusaurus",