From 4ae45a0e578f4373c7eb58ec016a9434954a76ce Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Fri, 5 Apr 2024 14:21:15 +0200 Subject: [PATCH 01/28] assembly result icons --- .../Properties/Icons/AssemblyResultDiagrams.png | Bin 901 -> 741 bytes GsaGH/Properties/Icons/AssemblyResults.png | Bin 741 -> 901 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/GsaGH/Properties/Icons/AssemblyResultDiagrams.png b/GsaGH/Properties/Icons/AssemblyResultDiagrams.png index f36ba8f9d5e4c32fecc495254cd4280b045d8dec..82e3bd8c821b3a5728b991f3295775829b1418af 100644 GIT binary patch delta 668 zcmV;N0%QG!2jvBjReu6{Nkl0O=ThBUoAoyF%*9z1leU_-GP-;l?-na5~XI#Dll0&Y05m}S~;DcIa->yq%X zAYu01Jig}Ls0TVhe}H)zFdlwiZ^silj}~7ZdqZt-*?%2s*!W$uv~NV0Fm)J33X8GSU^hWr%|}x&@nZpR3g# zJUY>>>pad$i$=&j*ZLR(Wdkb~3WbaVhfW+wi^JCT3_PnX!Zn z&Giw5hze0?z}+-85ZXrhJ!Y87vV0{HiBSAE_!R}&!tn>ExlC0600003LoDe}Dxa{1!d%oZE`*Y3({&$$BqI#JynoN6MPRep;Pd&gyu6I~wJuyNX~aQzO^jp!e!mxqgcj}X?bI+^edLe~ z!~)Zlgu`Kc{O&`+rAq968-vryqqUV6&40q&;Cjt2jjvpk@=aX1S0Io`2Y;7lCxl`nn3ysJwWTFTlWV zJ#;liv@ud4ZJgT5lEIWHKJ~{SS@5ADMON{OCJjbLcoY?FiHlj61bapCUO9tINSEwv zCbEi??tdcG*9)hjkWEo0q~E!+a_k%{vx*ZM8U(uQNwLpmKp<%v+pER?RjY>$waFBvs@h zkW_d)K1@!o(R<-?8?Kby0iTFs!xxm@6H>ElyMJc|^1Jfbbe1PQPDn}?78bA3LoDe}Dxa{1!d%oZE`*Y3({&$$BqI#JynoN6MPRep;Pd&gyu6I~wJuyNX~aQzO^jp!e!mxqgcj}X?bI+^edLe~ z!~)Zlgu`Kc{O&`+rAq968-vryqqUV6&40q&;Cjt2jjvpk@=aX1S0Io`2Y;7lCxl`nn3ysJwWTFTlWV zJ#;liv@ud4ZJgT5lEIWHKJ~{SS@5ADMON{OCJjbLcoY?FiHlj61bapCUO9tINSEwv zCbEi??tdcG*9)hjkWEo0q~E!+a_k%{vx*ZM8U(uQNwLpmKp<%v+pER?RjY>$waFBvs@h zkW_d)K1@!o(R<-?8?Kby0iTFs!xxm@6H>ElyMJc|^1Jfbbe1PQPDn}?78bA0O=ThBUoAoyF%*9z1leU_-GP-;l?-na5~XI#Dll0&Y05m}S~;DcIa->yq%X zAYu01Jig}Ls0TVhe}H)zFdlwiZ^silj}~7ZdqZt-*?%2s*!W$uv~NV0Fm)J33X8GSU^hWr%|}x&@nZpR3g# zJUY>>>pad$i$=&j*ZLR(Wdkb~3WbaVhfW+wi^JCT3_PnX!Zn z&Giw5hze0?z}+-85ZXrhJ!Y87vV0{HiBSAE_!R}&!tn>ExlC060000 Date: Fri, 5 Apr 2024 14:33:59 +0200 Subject: [PATCH 02/28] namespaces --- .../RegressionValues/SteelDesignEffectiveLengthA1.cs | 2 +- .../RegressionValues/SteelDesignEffectiveLengthC1p1.cs | 2 +- .../Collections/RegressionValues/TotalLoadsAndReactionsA3.cs | 2 +- .../5_Results/Collections/TotalLoadsAndReactionsTests.cs | 1 - .../3_Components/5_Results/SteelDesignEffectiveLengthTests.cs | 1 - 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelDesignEffectiveLengthA1.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelDesignEffectiveLengthA1.cs index 4f343c983..ecfe34ede 100644 --- a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelDesignEffectiveLengthA1.cs +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelDesignEffectiveLengthA1.cs @@ -3,7 +3,7 @@ using OasysGH.Parameters; using System.Collections.Generic; -namespace GsaGHTests._1_BaseParameters._5_Results.Collections.RegressionValues { +namespace GsaGHTests.Parameters.Results { public class SteelDesignEffectiveLengthA1 { // these are regression tests, the values are taken directly from GSA results // "BasicFrame.gwb" for member id=46,47,48 for analysis case A1 diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelDesignEffectiveLengthC1p1.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelDesignEffectiveLengthC1p1.cs index 2015db221..891e9e18d 100644 --- a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelDesignEffectiveLengthC1p1.cs +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelDesignEffectiveLengthC1p1.cs @@ -3,7 +3,7 @@ using OasysGH.Parameters; using System.Collections.Generic; -namespace GsaGHTests._1_BaseParameters._5_Results.Collections.RegressionValues { +namespace GsaGHTests.Parameters.Results { public class SteelDesignEffectiveLengthC1P1 { //results are taken directly from GSA results // "BasicFrame.gwb" for member id=46,47,48 for analysis case C1P1 diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/TotalLoadsAndReactionsA3.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/TotalLoadsAndReactionsA3.cs index 5ff6735f1..fab098be0 100644 --- a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/TotalLoadsAndReactionsA3.cs +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/TotalLoadsAndReactionsA3.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace GsaGHTests._1_BaseParameters._5_Results.Collections.RegressionValues { +namespace GsaGHTests.Parameters.Results { public class TotalLoadsAndReactionsA3 { // these are regression tests, the values are taken directly from GSA results // "Steel_Design_Complex.gwb" for all nodes for analysis case A3 diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/TotalLoadsAndReactionsTests.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/TotalLoadsAndReactionsTests.cs index 04ab04a34..12e17c681 100644 --- a/GsaGHTests/1_BaseParameters/5_Results/Collections/TotalLoadsAndReactionsTests.cs +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/TotalLoadsAndReactionsTests.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using GsaGH.Helpers.GsaApi; using GsaGH.Parameters.Results; -using GsaGHTests._1_BaseParameters._5_Results.Collections.RegressionValues; using GsaGHTests.Helper; using OasysUnits; using OasysUnits.Units; diff --git a/GsaGHTests/3_Components/5_Results/SteelDesignEffectiveLengthTests.cs b/GsaGHTests/3_Components/5_Results/SteelDesignEffectiveLengthTests.cs index d345fc92f..f44408842 100644 --- a/GsaGHTests/3_Components/5_Results/SteelDesignEffectiveLengthTests.cs +++ b/GsaGHTests/3_Components/5_Results/SteelDesignEffectiveLengthTests.cs @@ -6,7 +6,6 @@ using GsaGH.Helpers.GsaApi; using GsaGH.Parameters; using GsaGH.Parameters.Results; -using GsaGHTests._1_BaseParameters._5_Results.Collections.RegressionValues; using GsaGHTests.Helper; using GsaGHTests.Helpers; using GsaGHTests.Parameters.Results; From 74b1552acfda1b0825500d14fc7cf3a309283df4 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 8 Apr 2024 11:04:25 +0200 Subject: [PATCH 03/28] GSAGH-492 input index --- GsaGH/Components/6_Display/AssemblyResults.cs | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/GsaGH/Components/6_Display/AssemblyResults.cs b/GsaGH/Components/6_Display/AssemblyResults.cs index 027c346f2..139946237 100644 --- a/GsaGH/Components/6_Display/AssemblyResults.cs +++ b/GsaGH/Components/6_Display/AssemblyResults.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.Drawing; using System.Linq; +using System.Threading.Tasks; using System.Windows.Forms; using GH_IO.Serialization; using Grasshopper; @@ -293,14 +294,14 @@ private enum FoldMode { public override void VariableParameterMaintenance() { if (Params.Input.Count != 6) { - var scale = (Param_Number)Params.Input[4]; - Params.UnregisterInputParameter(Params.Input[4], false); + var scale = (Param_Number)Params.Input[3]; + Params.UnregisterInputParameter(Params.Input[3], false); Params.RegisterInputParam(new Param_Interval()); - Params.Input[4].Name = "Min/Max Domain"; - Params.Input[4].NickName = "I"; - Params.Input[4].Description = "Optional Domain for custom Min to Max contour colours"; - Params.Input[4].Optional = true; - Params.Input[4].Access = GH_ParamAccess.item; + Params.Input[3].Name = "Min/Max Domain"; + Params.Input[3].NickName = "I"; + Params.Input[3].Description = "Optional Domain for custom Min to Max contour colours"; + Params.Input[3].Optional = true; + Params.Input[3].Access = GH_ParamAccess.item; Params.RegisterInputParam(scale); } @@ -752,9 +753,7 @@ private enum FoldMode { var resultLines = new DataTree(); - //Parallel.ForEach(elems, element => { - - foreach (KeyValuePair assembly in filteredAssemblies) { + Parallel.ForEach(assemblies, assembly => { Node topology1 = nodes[assembly.Value.Topology1]; Node topology2 = nodes[assembly.Value.Topology2]; @@ -834,8 +833,7 @@ private enum FoldMode { new GH_Path(key)); } } - } - //}); + }); int gripheight = _legend.Height / ghGradient.GripCount; _legendValues = new List(); From 88d94cfcafcbaf611085bb5f0696794a6ef148f6 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 8 Apr 2024 12:54:06 +0200 Subject: [PATCH 04/28] GSAGH-486 fixed list issue --- GsaGH/Components/3_Loads/CreateBeamLoad.cs | 6 +++- .../3_Loads/CreateBeamThermalLoad.cs | 5 ++- GsaGH/Components/3_Loads/CreateFaceLoad.cs | 3 +- .../3_Loads/CreateFaceThermalLoad.cs | 5 ++- GsaGH/Components/3_Loads/CreateGravityLoad.cs | 4 ++- GsaGH/Helpers/Assembly/Loads/Loads.cs | 31 +++++++++++++++++++ 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/GsaGH/Components/3_Loads/CreateBeamLoad.cs b/GsaGH/Components/3_Loads/CreateBeamLoad.cs index 41ca367fe..4181e3c79 100644 --- a/GsaGH/Components/3_Loads/CreateBeamLoad.cs +++ b/GsaGH/Components/3_Loads/CreateBeamLoad.cs @@ -1,10 +1,13 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Drawing; +using GH_IO.Serialization; using Grasshopper.Kernel; using Grasshopper.Kernel.Parameters; using Grasshopper.Kernel.Types; using GsaAPI; +using GsaGH.Helpers; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Parameters.Enums; @@ -299,7 +302,8 @@ private enum FoldMode { default: if (GH_Convert.ToString(ghTyp.Value, out string beamList, GH_Conversion.Both)) { - beamLoad.ApiLoad.EntityList = beamList; + beamLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + beamLoad.ApiLoad.EntityList = $"\"{beamList}\""; } break; } diff --git a/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs b/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs index 07edef8f0..f42043b32 100644 --- a/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs +++ b/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs @@ -3,6 +3,7 @@ using System.Drawing; using Grasshopper.Kernel; using Grasshopper.Kernel.Types; +using GsaAPI; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Parameters.Enums; @@ -15,6 +16,7 @@ using OasysUnits; using OasysUnits.Units; using EntityType = GsaGH.Parameters.EntityType; +using TemperatureUnit = OasysUnits.Units.TemperatureUnit; namespace GsaGH.Components { public class CreateBeamThermalLoad : GH_OasysDropDownComponent { @@ -180,7 +182,8 @@ private enum FoldMode { default: if (GH_Convert.ToString(ghTyp.Value, out string beamList, GH_Conversion.Both)) { - beamThermalLoad.ApiLoad.EntityList = beamList; + beamThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + beamThermalLoad.ApiLoad.EntityList = $"\"{beamList}\""; } break; } diff --git a/GsaGH/Components/3_Loads/CreateFaceLoad.cs b/GsaGH/Components/3_Loads/CreateFaceLoad.cs index 7d7bbac7f..673e874a8 100644 --- a/GsaGH/Components/3_Loads/CreateFaceLoad.cs +++ b/GsaGH/Components/3_Loads/CreateFaceLoad.cs @@ -304,7 +304,8 @@ private enum FoldMode { } default: { if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { - faceLoad.ApiLoad.EntityList = elemList; + faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceLoad.ApiLoad.EntityList = $"\"{elemList}\""; } break; diff --git a/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs b/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs index 35a749ed6..21d98a46a 100644 --- a/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs +++ b/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs @@ -3,6 +3,7 @@ using System.Drawing; using Grasshopper.Kernel; using Grasshopper.Kernel.Types; +using GsaAPI; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Parameters.Enums; @@ -15,6 +16,7 @@ using OasysUnits; using OasysUnits.Units; using EntityType = GsaGH.Parameters.EntityType; +using TemperatureUnit = OasysUnits.Units.TemperatureUnit; namespace GsaGH.Components { public class CreateFaceThermalLoad : GH_OasysDropDownComponent { @@ -177,7 +179,8 @@ private enum FoldMode { } default: { if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { - faceThermalLoad.ApiLoad.EntityList = elemList; + faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceThermalLoad.ApiLoad.EntityList = $"\"{elemList}\""; } break; diff --git a/GsaGH/Components/3_Loads/CreateGravityLoad.cs b/GsaGH/Components/3_Loads/CreateGravityLoad.cs index f11784f2d..8757a4d2b 100644 --- a/GsaGH/Components/3_Loads/CreateGravityLoad.cs +++ b/GsaGH/Components/3_Loads/CreateGravityLoad.cs @@ -2,6 +2,7 @@ using System.Drawing; using Grasshopper.Kernel; using Grasshopper.Kernel.Types; +using GsaAPI; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Parameters.Enums; @@ -135,7 +136,8 @@ public class CreateGravityLoad : GH_OasysComponent { } default: { if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { - gravityLoad.ApiLoad.EntityList = elemList; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + gravityLoad.ApiLoad.EntityList = $"\"{elemList}\""; } break; diff --git a/GsaGH/Helpers/Assembly/Loads/Loads.cs b/GsaGH/Helpers/Assembly/Loads/Loads.cs index 681639407..4bdbe1459 100644 --- a/GsaGH/Helpers/Assembly/Loads/Loads.cs +++ b/GsaGH/Helpers/Assembly/Loads/Loads.cs @@ -55,6 +55,12 @@ internal partial class ModelAssembly { } } + foreach(EntityList list in _lists.ReadOnlyDictionary.Values) { + if(load.ApiLoad.EntityList == $"\"{list.Name}\"") { + load.ApiLoad.EntityType = list.Type; + } + } + _beamLoads.Add(load.ApiLoad); } @@ -90,6 +96,12 @@ internal partial class ModelAssembly { } } + foreach (EntityList list in _lists.ReadOnlyDictionary.Values) { + if (load.ApiLoad.EntityList == $"\"{list.Name}\"") { + load.ApiLoad.EntityType = list.Type; + } + } + _beamThermalLoads.Add(load.ApiLoad); } @@ -124,6 +136,13 @@ internal partial class ModelAssembly { } } + + foreach (EntityList list in _lists.ReadOnlyDictionary.Values) { + if (load.ApiLoad.EntityList == $"\"{list.Name}\"") { + load.ApiLoad.EntityType = list.Type; + } + } + _faceLoads.Add(load.ApiLoad); } @@ -158,6 +177,12 @@ internal partial class ModelAssembly { } } + foreach (EntityList list in _lists.ReadOnlyDictionary.Values) { + if (load.ApiLoad.EntityList == $"\"{list.Name}\"") { + load.ApiLoad.EntityType = list.Type; + } + } + _faceThermalLoads.Add(load.ApiLoad); } @@ -194,6 +219,12 @@ internal partial class ModelAssembly { } } + foreach (EntityList list in _lists.ReadOnlyDictionary.Values) { + if (load.ApiLoad.EntityList == $"\"{list.Name}\"") { + load.ApiLoad.EntityType = list.Type; + } + } + _gravityLoads.Add(load.ApiLoad); } From 1853fa0fef42f2d0f47ce96ea9f07b654ba42f72 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 8 Apr 2024 15:50:57 +0200 Subject: [PATCH 05/28] GSAGH-492 VariableParameterMaintenance() --- GsaGH/Components/6_Display/AssemblyResults.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/GsaGH/Components/6_Display/AssemblyResults.cs b/GsaGH/Components/6_Display/AssemblyResults.cs index 139946237..5b701cf35 100644 --- a/GsaGH/Components/6_Display/AssemblyResults.cs +++ b/GsaGH/Components/6_Display/AssemblyResults.cs @@ -293,18 +293,6 @@ private enum FoldMode { } public override void VariableParameterMaintenance() { - if (Params.Input.Count != 6) { - var scale = (Param_Number)Params.Input[3]; - Params.UnregisterInputParameter(Params.Input[3], false); - Params.RegisterInputParam(new Param_Interval()); - Params.Input[3].Name = "Min/Max Domain"; - Params.Input[3].NickName = "I"; - Params.Input[3].Description = "Optional Domain for custom Min to Max contour colours"; - Params.Input[3].Optional = true; - Params.Input[3].Access = GH_ParamAccess.item; - Params.RegisterInputParam(scale); - } - switch (_mode) { case FoldMode.Displacement when (int)_disp < 4: Params.Output[2].Name = "Values [" + Length.GetAbbreviation(_lengthResultUnit) + "]"; From 2eef7c274595a95f600d02bb747d2527675bdbed Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 9 Apr 2024 08:05:41 +0200 Subject: [PATCH 06/28] MinGsaVersion --- GsaGH/GsaGHInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GsaGH/GsaGHInfo.cs b/GsaGH/GsaGHInfo.cs index 8741e1e3c..1b4b4f166 100644 --- a/GsaGH/GsaGHInfo.cs +++ b/GsaGH/GsaGHInfo.cs @@ -36,7 +36,7 @@ public override string Description internal const string Copyright = "Copyright © Oasys 1985 - 2024"; internal const string PluginName = "GsaGH"; internal const string ProductName = "GSA"; - internal static int MinGsaVersion = 7; + internal static int MinGsaVersion = 8; internal const string TermsConditions = "Oasys terms and conditions apply. See https://www.oasys-software.com/terms-conditions for details. "; internal const string Vers = "1.3.0"; From b215e6b732690ffc15be0ab99951e526f2b6da3b Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 9 Apr 2024 09:04:53 +0200 Subject: [PATCH 07/28] GSAGH-486 gravity load bug --- .../Components/LoadsFromReferenceObjects.gh | Bin 97865 -> 97901 bytes GsaGH/Components/3_Loads/CreateBeamLoad.cs | 8 +- .../3_Loads/CreateBeamThermalLoad.cs | 8 +- GsaGH/Components/3_Loads/CreateFaceLoad.cs | 98 ++++++------ .../3_Loads/CreateFaceThermalLoad.cs | 100 ++++++------ GsaGH/Components/3_Loads/CreateGravityLoad.cs | 142 +++++++++--------- .../1_Properties/GsaProp2dTest.cs | 2 - 7 files changed, 183 insertions(+), 175 deletions(-) diff --git a/ExampleFiles/Components/LoadsFromReferenceObjects.gh b/ExampleFiles/Components/LoadsFromReferenceObjects.gh index c8c456c5b0095acc389122518fc8e5669db5babd..b74faab804df52abe1541b4e08a6ea5a625cf4fa 100644 GIT binary patch delta 97272 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 QfBAf*#N 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 ZRXTz!S6)DfhLY5H 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 TTYQ;MAD5Jvyl9oMVc`D&`4*@U diff --git a/GsaGH/Components/3_Loads/CreateBeamLoad.cs b/GsaGH/Components/3_Loads/CreateBeamLoad.cs index 4181e3c79..18bd7018d 100644 --- a/GsaGH/Components/3_Loads/CreateBeamLoad.cs +++ b/GsaGH/Components/3_Loads/CreateBeamLoad.cs @@ -1,13 +1,10 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Drawing; -using GH_IO.Serialization; using Grasshopper.Kernel; using Grasshopper.Kernel.Parameters; using Grasshopper.Kernel.Types; using GsaAPI; -using GsaGH.Helpers; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Parameters.Enums; @@ -303,7 +300,10 @@ private enum FoldMode { default: if (GH_Convert.ToString(ghTyp.Value, out string beamList, GH_Conversion.Both)) { beamLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - beamLoad.ApiLoad.EntityList = $"\"{beamList}\""; + beamLoad.ApiLoad.EntityList = beamList; + if (beamLoad.ApiLoad.EntityList != beamList) { + beamLoad.ApiLoad.EntityList = $"\"{beamList}\""; + } } break; } diff --git a/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs b/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs index f42043b32..00835e714 100644 --- a/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs +++ b/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs @@ -3,7 +3,6 @@ using System.Drawing; using Grasshopper.Kernel; using Grasshopper.Kernel.Types; -using GsaAPI; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Parameters.Enums; @@ -14,7 +13,6 @@ using OasysGH.Units; using OasysGH.Units.Helpers; using OasysUnits; -using OasysUnits.Units; using EntityType = GsaGH.Parameters.EntityType; using TemperatureUnit = OasysUnits.Units.TemperatureUnit; @@ -146,7 +144,6 @@ private enum FoldMode { break; - case GsaElement1dGoo element1dGoo: beamThermalLoad.RefObjectGuid = element1dGoo.Value.Guid; beamThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; @@ -183,7 +180,10 @@ private enum FoldMode { default: if (GH_Convert.ToString(ghTyp.Value, out string beamList, GH_Conversion.Both)) { beamThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - beamThermalLoad.ApiLoad.EntityList = $"\"{beamList}\""; + beamThermalLoad.ApiLoad.EntityList = beamList; + if (beamThermalLoad.ApiLoad.EntityList != beamList) { + beamThermalLoad.ApiLoad.EntityList = $"\"{beamList}\""; + } } break; } diff --git a/GsaGH/Components/3_Loads/CreateFaceLoad.cs b/GsaGH/Components/3_Loads/CreateFaceLoad.cs index 673e874a8..c069cfe9b 100644 --- a/GsaGH/Components/3_Loads/CreateFaceLoad.cs +++ b/GsaGH/Components/3_Loads/CreateFaceLoad.cs @@ -256,60 +256,62 @@ private enum FoldMode { var ghTyp = new GH_ObjectWrapper(); if (da.GetData(1, ref ghTyp)) { switch (ghTyp.Value) { - case GsaListGoo value: { - if (value.Value.EntityType == EntityType.Element - || value.Value.EntityType == EntityType.Member) { - faceLoad.ReferenceList = value.Value; - faceLoad.ReferenceType = ReferenceType.List; - } else { - this.AddRuntimeError( - "List must be of type Element or Member to apply to face loading"); - return; - } - - break; - } - case GsaElement2dGoo value: { - faceLoad.RefObjectGuid = value.Value.Guid; - faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - faceLoad.ReferenceType = ReferenceType.Element; - break; - } - case GsaMember2dGoo value: { - faceLoad.RefObjectGuid = value.Value.Guid; - faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; - faceLoad.ReferenceType = ReferenceType.Member; - break; + case GsaListGoo value: + if (value.Value.EntityType == EntityType.Element + || value.Value.EntityType == EntityType.Member) { + faceLoad.ReferenceList = value.Value; + faceLoad.ReferenceType = ReferenceType.List; + } else { + this.AddRuntimeError( + "List must be of type Element or Member to apply to face loading"); + return; } - case GsaMaterialGoo value: { - if (value.Value.Id != 0) { - this.AddRuntimeWarning( - "Reference Material must be a Custom Material"); - return; - } - faceLoad.RefObjectGuid = value.Value.Guid; - faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - faceLoad.ReferenceType = ReferenceType.Property; - this.AddRuntimeRemark( - "Load from Material reference created as Element load"); - break; + + break; + + case GsaElement2dGoo value: + faceLoad.RefObjectGuid = value.Value.Guid; + faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceLoad.ReferenceType = ReferenceType.Element; + break; + + case GsaMember2dGoo value: + faceLoad.RefObjectGuid = value.Value.Guid; + faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; + faceLoad.ReferenceType = ReferenceType.Member; + break; + + case GsaMaterialGoo value: + if (value.Value.Id != 0) { + this.AddRuntimeWarning( + "Reference Material must be a Custom Material"); + return; } - case GsaProperty2dGoo value: { - faceLoad.RefObjectGuid = value.Value.Guid; + faceLoad.RefObjectGuid = value.Value.Guid; + faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceLoad.ReferenceType = ReferenceType.Property; + this.AddRuntimeRemark( + "Load from Material reference created as Element load"); + break; + + case GsaProperty2dGoo value: + faceLoad.RefObjectGuid = value.Value.Guid; + faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceLoad.ReferenceType = ReferenceType.Property; + this.AddRuntimeRemark( + "Load from 2D Property reference created as Element load"); + break; + + default: + if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - faceLoad.ReferenceType = ReferenceType.Property; - this.AddRuntimeRemark( - "Load from 2D Property reference created as Element load"); - break; - } - default: { - if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { - faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceLoad.ApiLoad.EntityList = elemList; + if (faceLoad.ApiLoad.EntityList != elemList) { faceLoad.ApiLoad.EntityList = $"\"{elemList}\""; } - - break; } + + break; } } diff --git a/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs b/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs index 21d98a46a..2aa110cf1 100644 --- a/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs +++ b/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs @@ -3,7 +3,6 @@ using System.Drawing; using Grasshopper.Kernel; using Grasshopper.Kernel.Types; -using GsaAPI; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Parameters.Enums; @@ -14,7 +13,6 @@ using OasysGH.Units; using OasysGH.Units.Helpers; using OasysUnits; -using OasysUnits.Units; using EntityType = GsaGH.Parameters.EntityType; using TemperatureUnit = OasysUnits.Units.TemperatureUnit; @@ -131,60 +129,62 @@ private enum FoldMode { var ghTyp = new GH_ObjectWrapper(); if (da.GetData(1, ref ghTyp)) { switch (ghTyp.Value) { - case GsaListGoo value: { - if (value.Value.EntityType == EntityType.Element - || value.Value.EntityType == EntityType.Member) { - faceThermalLoad.ReferenceList = value.Value; - faceThermalLoad.ReferenceType = ReferenceType.List; - } else { - this.AddRuntimeError( - "List must be of type Element or Member to apply to face loading"); - return; - } - - break; - } - case GsaElement2dGoo value: { - faceThermalLoad.RefObjectGuid = value.Value.Guid; - faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - faceThermalLoad.ReferenceType = ReferenceType.Element; - break; - } - case GsaMember2dGoo value: { - faceThermalLoad.RefObjectGuid = value.Value.Guid; - faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; - faceThermalLoad.ReferenceType = ReferenceType.Member; - break; + case GsaListGoo value: + if (value.Value.EntityType == EntityType.Element + || value.Value.EntityType == EntityType.Member) { + faceThermalLoad.ReferenceList = value.Value; + faceThermalLoad.ReferenceType = ReferenceType.List; + } else { + this.AddRuntimeError( + "List must be of type Element or Member to apply to face loading"); + return; } - case GsaMaterialGoo value: { - if (value.Value.Id != 0) { - this.AddRuntimeWarning( - "Reference Material must be a Custom Material"); - return; - } - faceThermalLoad.RefObjectGuid = value.Value.Guid; - faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - faceThermalLoad.ReferenceType = ReferenceType.Property; - this.AddRuntimeRemark( - "Load from Material reference created as Element load"); - break; + + break; + + case GsaElement2dGoo value: + faceThermalLoad.RefObjectGuid = value.Value.Guid; + faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceThermalLoad.ReferenceType = ReferenceType.Element; + break; + + case GsaMember2dGoo value: + faceThermalLoad.RefObjectGuid = value.Value.Guid; + faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; + faceThermalLoad.ReferenceType = ReferenceType.Member; + break; + + case GsaMaterialGoo value: + if (value.Value.Id != 0) { + this.AddRuntimeWarning( + "Reference Material must be a Custom Material"); + return; } - case GsaProperty2dGoo value: { - faceThermalLoad.RefObjectGuid = value.Value.Guid; + faceThermalLoad.RefObjectGuid = value.Value.Guid; + faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceThermalLoad.ReferenceType = ReferenceType.Property; + this.AddRuntimeRemark( + "Load from Material reference created as Element load"); + break; + + case GsaProperty2dGoo value: + faceThermalLoad.RefObjectGuid = value.Value.Guid; + faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceThermalLoad.ReferenceType = ReferenceType.Property; + this.AddRuntimeRemark( + "Load from 2D Property reference created as Element load"); + break; + + default: + if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - faceThermalLoad.ReferenceType = ReferenceType.Property; - this.AddRuntimeRemark( - "Load from 2D Property reference created as Element load"); - break; - } - default: { - if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { - faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + faceThermalLoad.ApiLoad.EntityList = elemList; + if (faceThermalLoad.ApiLoad.EntityList != elemList) { faceThermalLoad.ApiLoad.EntityList = $"\"{elemList}\""; } - - break; } + + break; } } diff --git a/GsaGH/Components/3_Loads/CreateGravityLoad.cs b/GsaGH/Components/3_Loads/CreateGravityLoad.cs index 8757a4d2b..b74d21b90 100644 --- a/GsaGH/Components/3_Loads/CreateGravityLoad.cs +++ b/GsaGH/Components/3_Loads/CreateGravityLoad.cs @@ -2,7 +2,6 @@ using System.Drawing; using Grasshopper.Kernel; using Grasshopper.Kernel.Types; -using GsaAPI; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Parameters.Enums; @@ -70,78 +69,87 @@ public class CreateGravityLoad : GH_OasysComponent { } switch (ghTyp.Value) { - case GsaListGoo value: { - if (value.Value.EntityType == EntityType.Element - || value.Value.EntityType == EntityType.Member) { - gravityLoad.ReferenceList = value.Value; - gravityLoad.ReferenceType = ReferenceType.List; - } else { - this.AddRuntimeWarning( - "List must be of type Element or Member to apply to beam loading"); - } - break; - } - case GsaElement2dGoo value: { - gravityLoad.RefObjectGuid = value.Value.Guid; - gravityLoad.ReferenceType = ReferenceType.Element; - gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - break; - } - case GsaMember1dGoo value: { - gravityLoad.RefObjectGuid = value.Value.Guid; - gravityLoad.ReferenceType = ReferenceType.Member; - gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; - break; - } - case GsaMember2dGoo value: { - gravityLoad.RefObjectGuid = value.Value.Guid; - gravityLoad.ReferenceType = ReferenceType.Member; - gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; - break; - } - case GsaMember3dGoo value: { - gravityLoad.RefObjectGuid = value.Value.Guid; - gravityLoad.ReferenceType = ReferenceType.Member; - gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; - break; - } - case GsaMaterialGoo value: { - if (value.Value.Id != 0) { - this.AddRuntimeWarning( - "Reference Material must be a Custom Material"); - return; - } - gravityLoad.RefObjectGuid = value.Value.Guid; - gravityLoad.ReferenceType = ReferenceType.Property; - gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - break; - } - case GsaSectionGoo value: { - gravityLoad.RefObjectGuid = value.Value.Guid; - gravityLoad.ReferenceType = ReferenceType.Property; - gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - break; + case GsaListGoo value: + if (value.Value.EntityType == EntityType.Element + || value.Value.EntityType == EntityType.Member) { + gravityLoad.ReferenceList = value.Value; + gravityLoad.ReferenceType = ReferenceType.List; + } else { + this.AddRuntimeWarning( + "List must be of type Element or Member to apply to beam loading"); } - case GsaProperty2dGoo value: { - gravityLoad.RefObjectGuid = value.Value.Guid; - gravityLoad.ReferenceType = ReferenceType.Property; - gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - break; + break; + + case GsaElement1dGoo value: + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Element; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + break; + + case GsaElement2dGoo value: + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Element; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + break; + + case GsaMember1dGoo value: + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Member; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; + break; + + case GsaMember2dGoo value: + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Member; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; + break; + + case GsaMember3dGoo value: + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Member; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Member; + break; + + case GsaMaterialGoo value: + if (value.Value.Id != 0) { + this.AddRuntimeWarning( + "Reference Material must be a Custom Material"); + return; } - case GsaProperty3dGoo value: { - gravityLoad.RefObjectGuid = value.Value.Guid; - gravityLoad.ReferenceType = ReferenceType.Property; + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Property; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + break; + + case GsaSectionGoo value: + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Property; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + break; + + case GsaProperty2dGoo value: + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Property; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + break; + + case GsaProperty3dGoo value: + gravityLoad.RefObjectGuid = value.Value.Guid; + gravityLoad.ReferenceType = ReferenceType.Property; + gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + break; + + default: + if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; - break; - } - default: { - if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { - gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; + gravityLoad.ApiLoad.EntityList = elemList; + if (gravityLoad.ApiLoad.EntityList != elemList) { gravityLoad.ApiLoad.EntityList = $"\"{elemList}\""; } - - break; } + + break; + } } else { gravityLoad.ApiLoad.EntityList = "All"; diff --git a/GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs b/GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs index 51eb03327..b527096f5 100644 --- a/GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs +++ b/GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs @@ -106,7 +106,6 @@ public class GsaProp2dTests { orig.ApiProp2d.Description = "less cool property"; orig.ApiProp2d.Type = Property2D_Type.LOAD; orig.ApiProp2d.SupportType = SupportType.AllEdges; - orig.ApiProp2d.ReferenceEdge = 4; orig.ApiProp2d.ReferenceSurface = ReferenceSurface.Top; orig.AdditionalOffsetZ = new Length(50.0, LengthUnit.Millimeter); @@ -127,7 +126,6 @@ public class GsaProp2dTests { Assert.Equal("less cool property", orig.ApiProp2d.Description); Assert.Equal(Property2D_Type.LOAD.ToString(), orig.ApiProp2d.Type.ToString()); Assert.Equal(SupportType.AllEdges, orig.ApiProp2d.SupportType); - Assert.Equal(4, orig.ApiProp2d.ReferenceEdge); Assert.Equal(4, orig.Id); Assert.Equal(ReferenceSurface.Top, orig.ApiProp2d.ReferenceSurface); Assert.Equal(50, orig.AdditionalOffsetZ.As(LengthUnit.Millimeter)); From 0698356c8bc8ec68cc78d6443f5adda403c2904d Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 9 Apr 2024 09:22:44 +0200 Subject: [PATCH 08/28] =?UTF-8?q?ReferenceEdge=20can=C2=B4t=20be=20always?= =?UTF-8?q?=20set?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs b/GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs index 51eb03327..b527096f5 100644 --- a/GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs +++ b/GsaGHTests/1_BaseParameters/1_Properties/GsaProp2dTest.cs @@ -106,7 +106,6 @@ public class GsaProp2dTests { orig.ApiProp2d.Description = "less cool property"; orig.ApiProp2d.Type = Property2D_Type.LOAD; orig.ApiProp2d.SupportType = SupportType.AllEdges; - orig.ApiProp2d.ReferenceEdge = 4; orig.ApiProp2d.ReferenceSurface = ReferenceSurface.Top; orig.AdditionalOffsetZ = new Length(50.0, LengthUnit.Millimeter); @@ -127,7 +126,6 @@ public class GsaProp2dTests { Assert.Equal("less cool property", orig.ApiProp2d.Description); Assert.Equal(Property2D_Type.LOAD.ToString(), orig.ApiProp2d.Type.ToString()); Assert.Equal(SupportType.AllEdges, orig.ApiProp2d.SupportType); - Assert.Equal(4, orig.ApiProp2d.ReferenceEdge); Assert.Equal(4, orig.Id); Assert.Equal(ReferenceSurface.Top, orig.ApiProp2d.ReferenceSurface); Assert.Equal(50, orig.AdditionalOffsetZ.As(LengthUnit.Millimeter)); From c65da5d31ccd7c5a753b63ad4e6ce28b46461434 Mon Sep 17 00:00:00 2001 From: DominikaLos <83698580+DominikaLos@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:17:03 +0200 Subject: [PATCH 09/28] Task/gsagh-484 (#657) * added steel utilisations component - AN ICON MUST BE CHANGED! * unit tests * an icon added * added helper for getting min and max values * added tests for max and min values * fix * renamed namespace * renamed namespaces * added component dropdown tests * GSAGH-484 unit tests * fix * removed unused namespaces --------- Co-authored-by: Tilman Reinhardt --- .../5_Results/Helpers/ExtremaHelper.cs | 73 +++++- .../Components/5_Results/SteelUtilisations.cs | 179 +++++++++++++ .../6_Quantities/SteelUtilisation.cs | 28 +- GsaGH/Properties/Icons/SteelUtilisation.png | Bin 0 -> 950 bytes GsaGH/Properties/Resources.Designer.cs | 10 + GsaGH/Properties/Resources.resx | 3 + .../Collections/NodeReactionForcesTests.cs | 44 +--- .../Collections/NodeSpringForcesCacheTests.cs | 4 +- .../RegressionValues/SteelUtilisationA1.cs | 54 ++++ .../RegressionValues/SteelUtilisationA2.cs | 54 ++++ .../RegressionValues/SteelUtilisationC1.cs | 54 ++++ .../5_Results/MaxMinHelper.cs | 50 ++++ .../GsaResultParameterTests.cs | 2 + .../5_Results/ReactionForcesTests.cs | 16 +- .../5_Results/SpringReactionForcesTests.cs | 16 +- .../5_Results/SteelUtilisationsTests.cs | 248 ++++++++++++++++++ GsaGHTests/3_Components/ComponentsTests.cs | 2 + .../3_Components/GH_OasysComponentTest.cs | 2 + .../4_CustomUIComponents/DeserializeTests.cs | 1 + .../DropDownComponentTests.cs | 1 + 20 files changed, 767 insertions(+), 74 deletions(-) create mode 100644 GsaGH/Components/5_Results/SteelUtilisations.cs create mode 100644 GsaGH/Properties/Icons/SteelUtilisation.png create mode 100644 GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationA1.cs create mode 100644 GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationA2.cs create mode 100644 GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationC1.cs create mode 100644 GsaGHTests/1_BaseParameters/5_Results/MaxMinHelper.cs create mode 100644 GsaGHTests/3_Components/5_Results/SteelUtilisationsTests.cs diff --git a/GsaGH/Components/5_Results/Helpers/ExtremaHelper.cs b/GsaGH/Components/5_Results/Helpers/ExtremaHelper.cs index 3c18fca9d..f92122304 100644 --- a/GsaGH/Components/5_Results/Helpers/ExtremaHelper.cs +++ b/GsaGH/Components/5_Results/Helpers/ExtremaHelper.cs @@ -1,6 +1,7 @@ using System; using System.Collections.ObjectModel; using GsaGH.Parameters.Results; +using OasysUnits; namespace GsaGH.Components.Helpers { internal class ExtremaHelper { @@ -195,7 +196,40 @@ internal class ExtremaHelper { "Min DIx", "Min DIy", "Min In-plane" - }); + }); + + internal static readonly ReadOnlyCollection SteelUtilisations + = new ReadOnlyCollection(new[] { + "All", + "Max Overall", + "Max LocalCombined", + "Max BucklingCombined", + "Max LocalAxial", + "Max LocalShearU", + "Max LocalShearV", + "Max LocalTorsion", + "Max LocalMajorMoment", + "Max LocalMinorMoment", + "Max MajorBuckling", + "Max MinorBuckling", + "Max LateralTorsionalBuckling", + "Max TorsionalBuckling", + "Max FlexuralBuckling", + "Min Overall", + "Min LocalCombined", + "Min BucklingCombined", + "Min LocalAxial", + "Min LocalShearU", + "Min LocalShearV", + "Min LocalTorsion", + "Min LocalMajorMoment", + "Min LocalMinorMoment", + "Min MajorBuckling", + "Min MinorBuckling", + "Min LateralTorsionalBuckling", + "Min TorsionalBuckling", + "Min FlexuralBuckling", + }); internal static U FootfallExtremaKey( IEntity0dResultSubset> resultSet, string key) { @@ -511,5 +545,40 @@ internal class ExtremaHelper { _ => throw new ArgumentException("Extrema case not found"), }; } + + internal static Entity0dExtremaKey SteelUtilisationsExtremaKey( + IEntity0dResultSubset resultSet, string key) { + return key switch { + "Max Overall" => resultSet.Max.Overall, + "Max LocalCombined" => resultSet.Max.LocalCombined, + "Max BucklingCombined" => resultSet.Max.BucklingCombined, + "Max LocalAxial" => resultSet.Max.LocalAxial, + "Max LocalShearU" => resultSet.Max.LocalShearU, + "Max LocalShearV" => resultSet.Max.LocalShearV, + "Max LocalTorsion" => resultSet.Max.LocalTorsion, + "Max LocalMajorMoment" => resultSet.Max.LocalMajorMoment, + "Max LocalMinorMoment" => resultSet.Max.LocalMinorMoment, + "Max MajorBuckling" => resultSet.Max.MajorBuckling, + "Max MinorBuckling" => resultSet.Max.MinorBuckling, + "Max LateralTorsionalBuckling" => resultSet.Max.LateralTorsionalBuckling, + "Max TorsionalBuckling" => resultSet.Max.TorsionalBuckling, + "Max FlexuralBuckling" => resultSet.Max.FlexuralBuckling, + "Min Overall" => resultSet.Min.Overall, + "Min LocalCombined" => resultSet.Min.LocalCombined, + "Min BucklingCombined" => resultSet.Min.BucklingCombined, + "Min LocalAxial" => resultSet.Min.LocalAxial, + "Min LocalShearU" => resultSet.Min.LocalShearU, + "Min LocalShearV" => resultSet.Min.LocalShearV, + "Min LocalTorsion" => resultSet.Min.LocalTorsion, + "Min LocalMajorMoment" => resultSet.Min.LocalMajorMoment, + "Min LocalMinorMoment" => resultSet.Min.LocalMinorMoment, + "Min MajorBuckling" => resultSet.Min.MajorBuckling, + "Min MinorBuckling" => resultSet.Min.MinorBuckling, + "Min LateralTorsionalBuckling" => resultSet.Min.LateralTorsionalBuckling, + "Min TorsionalBuckling" => resultSet.Min.TorsionalBuckling, + "Min FlexuralBuckling" => resultSet.Min.FlexuralBuckling, + _ => throw new ArgumentException("Extrema case not found"), + }; + } } -} \ No newline at end of file +} diff --git a/GsaGH/Components/5_Results/SteelUtilisations.cs b/GsaGH/Components/5_Results/SteelUtilisations.cs new file mode 100644 index 000000000..93faa9715 --- /dev/null +++ b/GsaGH/Components/5_Results/SteelUtilisations.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Drawing; +using System.Linq; +using Grasshopper; +using Grasshopper.Kernel; +using Grasshopper.Kernel.Data; +using Grasshopper.Kernel.Types; +using GsaGH.Components.Helpers; +using GsaGH.Helpers; +using GsaGH.Helpers.GH; +using GsaGH.Parameters; +using GsaGH.Parameters.Results; +using GsaGH.Properties; +using OasysGH; +using OasysGH.Components; +using OasysGH.Parameters; + +namespace GsaGH.Components { + ///

+ /// Component to get SteelUtilisations + /// + public class SteelUtilisations : GH_OasysDropDownComponent { + public override Guid ComponentGuid => new Guid("5f6ff7ac-65c9-417b-a373-bb45a3163e99"); + public override GH_Exposure Exposure => GH_Exposure.septenary; + public override OasysPluginInfo PluginInfo => GsaGH.PluginInfo.Instance; + protected override Bitmap Icon => Resources.SteelUtilisations; + + public SteelUtilisations() : base("Steel Utilisations", "SteelUtil", "Steel Utilisation result values", + CategoryName.Name(), SubCategoryName.Cat5()) { + Hidden = true; + } + + public override void SetSelected(int i, int j) { + _selectedItems[i] = _dropDownItems[i][j]; + base.UpdateUI(); + } + + protected override void InitialiseDropdowns() { + _spacerDescriptions = new List(new[] { + "Max/Min", + }); + + _dropDownItems = new List>(); + _selectedItems = new List(); + + _dropDownItems.Add(ExtremaHelper.SteelUtilisations.ToList()); + _selectedItems.Add(_dropDownItems[0][0]); + + _isInitialised = true; + } + + protected override void RegisterInputParams(GH_InputParamManager pManager) { + pManager.AddParameter(new GsaResultParameter(), "Result", "Res", "GSA Result", + GH_ParamAccess.list); + pManager.AddParameter(new GsaMemberListParameter()); + pManager[1].Optional = true; + } + + protected override void RegisterOutputParams(GH_OutputParamManager pManager) { + pManager.AddGenericParameter("Overall", "O", "Overall Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("LocalCombined", "LC", "Local Combined Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("BucklingCombined", "BC", "Buckling Combined Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("LocalAxial", "Ax", "Axial Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("LocalShearU", "Su", "Local Major Shear Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("LocalShearV", "Sv", "Local Minor Shear Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("LocalTorsion", "To", "Local Torsion Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("LocalMajorMoment", "Muu", "Local Major Moment Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("LocalMinorMoment", "Mvv", "Local Minor Moment Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("MajorBuckling", "Buu", "Major Buckling Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("MinorBuckling", "Bvv", "Minor Buckling Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("LateralTorsionalBuckling", "LTB", "Lateral Torsional Buckling Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("TorsionalBuckling", "TB", "Torsional Buckling Utilisation ratio", GH_ParamAccess.list); + pManager.AddGenericParameter("FlexuralBuckling", "FB", "Flexural Buckling Utilisation ratio", GH_ParamAccess.list); + } + + protected override void SolveInternal(IGH_DataAccess da) { + GsaResult result = null; + string memberList = "All"; + + var ghTypes = new List(); + da.GetDataList(0, ghTypes); + + foreach (GH_ObjectWrapper ghTyp in ghTypes) { + result = Inputs.GetResultInput(this, ghTyp); + if (result == null) { + return; + } + } + + var o = new DataTree(); + var lc = new DataTree(); + var bc = new DataTree(); + var ax = new DataTree(); + var su = new DataTree(); + var sv = new DataTree(); + var to = new DataTree(); + var mam = new DataTree(); + var mim = new DataTree(); + var mab = new DataTree(); + var mib = new DataTree(); + var ltb = new DataTree(); + var tb = new DataTree(); + var fb = new DataTree(); + + memberList = Inputs.GetMemberListDefinition(this, da, 1, result.Model); + ReadOnlyCollection memberIds = result.MemberIds(memberList); + IEntity0dResultSubset resultSet + = result.SteelUtilisations.ResultSubset(memberIds); + + List permutations = result.SelectedPermutationIds ?? new List() { + 1, + }; + if (permutations.Count == 1 && permutations[0] == -1) { + permutations = Enumerable.Range(1, resultSet.Subset.Values.First().Count).ToList(); + } + + if (_selectedItems[0] == ExtremaHelper.SteelUtilisations[0]) { + foreach (KeyValuePair> kvp in resultSet.Subset) { + foreach (int p in permutations) { + var path = new GH_Path(result.CaseId, result.SelectedPermutationIds == null ? 0 : p); + + o.Add(new GH_UnitNumber(kvp.Value[p - 1].Overall), path); + lc.Add(new GH_UnitNumber(kvp.Value[p - 1].LocalCombined), path); + bc.Add(new GH_UnitNumber(kvp.Value[p - 1].BucklingCombined), path); + ax.Add(new GH_UnitNumber(kvp.Value[p - 1].LocalAxial), path); + su.Add(new GH_UnitNumber(kvp.Value[p - 1].LocalShearU), path); + sv.Add(new GH_UnitNumber(kvp.Value[p - 1].LocalShearV), path); + to.Add(new GH_UnitNumber(kvp.Value[p - 1].LocalTorsion), path); + mam.Add(new GH_UnitNumber(kvp.Value[p - 1].LocalMajorMoment), path); + mim.Add(new GH_UnitNumber(kvp.Value[p - 1].LocalMinorMoment), path); + mab.Add(new GH_UnitNumber(kvp.Value[p - 1].MajorBuckling), path); + mib.Add(new GH_UnitNumber(kvp.Value[p - 1].MinorBuckling), path); + ltb.Add(new GH_UnitNumber(kvp.Value[p - 1].LateralTorsionalBuckling), path); + tb.Add(new GH_UnitNumber(kvp.Value[p - 1].TorsionalBuckling), path); + fb.Add(new GH_UnitNumber(kvp.Value[p - 1].FlexuralBuckling), path); + } + } + } else { + Entity0dExtremaKey key = ExtremaHelper.SteelUtilisationsExtremaKey(resultSet, _selectedItems[0]); + ISteelUtilisation extrema = resultSet.GetExtrema(key); + int perm = result.CaseType == CaseType.AnalysisCase ? 0 : 1; + var path = new GH_Path(result.CaseId, key.Permutation + perm); + o.Add(new GH_UnitNumber(extrema.Overall), path); + lc.Add(new GH_UnitNumber(extrema.LocalCombined), path); + bc.Add(new GH_UnitNumber(extrema.BucklingCombined), path); + ax.Add(new GH_UnitNumber(extrema.LocalAxial), path); + su.Add(new GH_UnitNumber(extrema.LocalShearU), path); + sv.Add(new GH_UnitNumber(extrema.LocalShearV), path); + to.Add(new GH_UnitNumber(extrema.LocalTorsion), path); + mam.Add(new GH_UnitNumber(extrema.LocalMajorMoment), path); + mim.Add(new GH_UnitNumber(extrema.LocalMinorMoment), path); + mab.Add(new GH_UnitNumber(extrema.MajorBuckling), path); + mib.Add(new GH_UnitNumber(extrema.MinorBuckling), path); + ltb.Add(new GH_UnitNumber(extrema.LateralTorsionalBuckling), path); + tb.Add(new GH_UnitNumber(extrema.TorsionalBuckling), path); + fb.Add(new GH_UnitNumber(extrema.FlexuralBuckling), path); + } + + PostHog.Result(result.CaseType, 1, "SteelUtilisations"); + + da.SetDataTree(0, o); + da.SetDataTree(1, lc); + da.SetDataTree(2, bc); + da.SetDataTree(3, ax); + da.SetDataTree(4, su); + da.SetDataTree(5, sv); + da.SetDataTree(6, to); + da.SetDataTree(7, mam); + da.SetDataTree(8, mim); + da.SetDataTree(9, mab); + da.SetDataTree(10, mib); + da.SetDataTree(11, ltb); + da.SetDataTree(12, tb); + da.SetDataTree(13, fb); + } + } +} diff --git a/GsaGH/Parameters/5_Results/6_Quantities/SteelUtilisation.cs b/GsaGH/Parameters/5_Results/6_Quantities/SteelUtilisation.cs index 0ab7dcd28..c284d8990 100644 --- a/GsaGH/Parameters/5_Results/6_Quantities/SteelUtilisation.cs +++ b/GsaGH/Parameters/5_Results/6_Quantities/SteelUtilisation.cs @@ -20,46 +20,46 @@ public class SteelUtilisation : ISteelUtilisation { public Ratio? FlexuralBuckling { get; internal set; } internal SteelUtilisation(SteelUtilisationResult values) { - if (!double.IsNaN(values.Overall)) { + if (!(double.IsNaN(values.Overall) || double.IsInfinity(values.Overall))) { Overall = new Ratio(values.Overall, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.LocalCombined)) { + if (!(double.IsNaN(values.LocalCombined) ||double.IsInfinity(values.LocalCombined))) { LocalCombined = new Ratio(values.LocalCombined, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.BucklingCombined)) { + if (!(double.IsNaN(values.BucklingCombined) || double.IsInfinity(values.BucklingCombined))) { BucklingCombined = new Ratio(values.BucklingCombined, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.LocalAxial)) { + if (!(double.IsNaN(values.LocalAxial) || double.IsInfinity(values.LocalAxial))) { LocalAxial = new Ratio(values.LocalAxial, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.LocalSu)) { + if (!(double.IsNaN(values.LocalSu) || double.IsInfinity(values.LocalSu))) { LocalShearU = new Ratio(values.LocalSu, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.LocalSv)) { + if (!(double.IsNaN(values.LocalSv) || double.IsInfinity(values.LocalSv))) { LocalShearV = new Ratio(values.LocalSv, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.LocalTorsion)) { + if (!(double.IsNaN(values.LocalTorsion) || double.IsInfinity(values.LocalTorsion))) { LocalTorsion = new Ratio(values.LocalTorsion, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.LocalMuu)) { + if (!(double.IsNaN(values.LocalMuu) || double.IsInfinity(values.LocalMuu))) { LocalMajorMoment = new Ratio(values.LocalMuu, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.LocalMvv)) { + if (!(double.IsNaN(values.LocalMvv) || double.IsInfinity(values.LocalMvv))) { LocalMinorMoment = new Ratio(values.LocalMvv, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.BucklingUu)) { + if (!(double.IsNaN(values.BucklingUu) || double.IsInfinity(values.BucklingUu))) { MajorBuckling = new Ratio(values.BucklingUu, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.BucklingVv)) { + if (!(double.IsNaN(values.BucklingVv) || double.IsInfinity(values.BucklingVv))) { MinorBuckling = new Ratio(values.BucklingVv, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.BucklingLT)) { + if (!(double.IsNaN(values.BucklingLT) || double.IsInfinity(values.BucklingLT))) { LateralTorsionalBuckling = new Ratio(values.BucklingLT, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.BucklingTor)) { + if (!(double.IsNaN(values.BucklingTor) || double.IsInfinity(values.BucklingTor))) { TorsionalBuckling = new Ratio(values.BucklingTor, RatioUnit.DecimalFraction); } - if (!double.IsNaN(values.BucklingFT)) { + if (!(double.IsNaN(values.BucklingFT) || double.IsInfinity(values.BucklingFT))) { FlexuralBuckling = new Ratio(values.BucklingFT, RatioUnit.DecimalFraction); } } diff --git a/GsaGH/Properties/Icons/SteelUtilisation.png b/GsaGH/Properties/Icons/SteelUtilisation.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd96460924e51608281cdad4f22fd27ac3097b3 GIT binary patch literal 950 zcmV;n14;aeP)5Q&in zfdnP6T)ZTOv;>J!Lt1%J!9tZ56rsm6O}DhP#VQZRNlwnp?3tPK&CHoa=zk}QXE4SL z*_chvauh{zz)WjrI``7MhX|`AIvw&b02?ankh?pmzjv{YIAej&70YlyfImu4OF~Cd zL|kS@N`<>X-u6OCX0(lOAJIC<_Jk3xF&URc{R5*Xo(+sLx!K3G6O(V)#Q1}C$Q=;` zLb7P>a8v5c=1R zYhE*hLodt8g=!$J4k?1p;g>7f9T^(hn!O`JCo(cpH5j8-@=ic4*@%E6y}p?r&Xv+M zJl1S{)F%>FmDOlP61s6^4Ud_Y(C`bD2yK;?$EV~oSu(t=nq)!NCZA(Rj$Xj<5IY|C zC_(qvT?Eec>@8Lhe?aG(9M@t|u9{oa0P* z%8!X?jZ)VY=xyPJ!XV38OAQj@V?V%d#uV+&sdX5N*7Wmlh2&?)$J6A|Vg$w8MuT357xAq=nUNqVC_P4kB$EYwSCJKdzhj0k3 z*FeK$rjb!VF%3*Ht4l6YLq}Mh(+fA7SwmxogL6M76_ML(fQPfhX0R*cd^JJ9Gt=#Ef0k%bjr*)!)Lkgz=fI?Oxkz#Dl>hHeK+1YEh7w0=U z4a{d?Q}Qy{?2Cz#O2oNY?k2BWg1?>q#$61L3f96M%fEv4#Fj!Hl6A`R??l7@pZ_`i Y0xJQMz-Mk)g8%>k07*qoM6N<$g4wdIC;$Ke literal 0 HcmV?d00001 diff --git a/GsaGH/Properties/Resources.Designer.cs b/GsaGH/Properties/Resources.Designer.cs index 8a87c32e4..cc19e457b 100644 --- a/GsaGH/Properties/Resources.Designer.cs +++ b/GsaGH/Properties/Resources.Designer.cs @@ -1920,6 +1920,16 @@ internal class Resources { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SteelUtilisations { + get { + object obj = ResourceManager.GetObject("SteelUtilisations", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/GsaGH/Properties/Resources.resx b/GsaGH/Properties/Resources.resx index a6223095b..f458784a8 100644 --- a/GsaGH/Properties/Resources.resx +++ b/GsaGH/Properties/Resources.resx @@ -685,4 +685,7 @@ Icons\AssemblyResults.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Icons\SteelUtilisation.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/NodeReactionForcesTests.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/NodeReactionForcesTests.cs index 740b9d521..ad4f74ce4 100644 --- a/GsaGHTests/1_BaseParameters/5_Results/Collections/NodeReactionForcesTests.cs +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/NodeReactionForcesTests.cs @@ -11,46 +11,6 @@ namespace GsaGHTests.Parameters.Results { public class NodeReactionForcesTests { private static readonly string NodeList = "1324 to 1327"; - internal static double? Max(List values) { - double? max = null; - - foreach (double? value in values) { - if (value == null) { - continue; - } - - if (max == null) { - max = value; - } - - if (value > max) { - max = value; - } - } - - return max; - } - - internal static double? Min(List values) { - double? min = null; - - foreach (double? value in values) { - if (value == null) { - continue; - } - - if (min == null) { - min = value; - } - - if (value < min) { - min = value; - } - } - - return min; - } - [Fact] public void NodeReactionForceNodeIdsFromAnalysisCaseTest() { // Assemble @@ -120,7 +80,7 @@ public class NodeReactionForcesTests { var values = new List(); values.AddRange(ExpectedCombinationCaseC4p1Values(component)); values.AddRange(ExpectedCombinationCaseC4p2Values(component)); - double? expected = Max(values); + double? expected = MaxMinHelper.Max(values); // Act ReadOnlyCollection nodeIds = result.NodeIds(NodeList); @@ -170,7 +130,7 @@ public class NodeReactionForcesTests { var values = new List(); values.AddRange(ExpectedCombinationCaseC4p1Values(component)); values.AddRange(ExpectedCombinationCaseC4p2Values(component)); - double? expected = Min(values); + double? expected = MaxMinHelper.Min(values); // Act ReadOnlyCollection nodeIds = result.NodeIds(NodeList); diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/NodeSpringForcesCacheTests.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/NodeSpringForcesCacheTests.cs index fd50395e1..c73a4d18d 100644 --- a/GsaGHTests/1_BaseParameters/5_Results/Collections/NodeSpringForcesCacheTests.cs +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/NodeSpringForcesCacheTests.cs @@ -81,7 +81,7 @@ public class NodeSpringForcesCacheTests { var values = new List(); values.AddRange(ExpectedCombinationCaseC2p1Values(component)); values.AddRange(ExpectedCombinationCaseC2p2Values(component)); - double? expected = NodeReactionForcesTests.Max(values); + double? expected = MaxMinHelper.Max(values); // Act ReadOnlyCollection nodeIds = result.NodeIds(NodeList); @@ -131,7 +131,7 @@ public class NodeSpringForcesCacheTests { var values = new List(); values.AddRange(ExpectedCombinationCaseC2p1Values(component)); values.AddRange(ExpectedCombinationCaseC2p2Values(component)); - double? expected = NodeReactionForcesTests.Min(values); + double? expected = MaxMinHelper.Min(values); // Act ReadOnlyCollection nodeIds = result.NodeIds(NodeList); diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationA1.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationA1.cs new file mode 100644 index 000000000..2bfed2ddf --- /dev/null +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationA1.cs @@ -0,0 +1,54 @@ +using Grasshopper.Kernel.Types; +using Grasshopper; +using OasysGH.Parameters; +using System.Collections.Generic; + +namespace GsaGHTests.Parameters.Results { + public class SteelUtilisationsA1 { + // these are regression tests, the values are taken directly from GSA results + // "Steel_Design_Simple.gwb" for member id=all for analysis case A1 + + internal static List Overall= new List() { + 0.1499, + }; + internal static List LocalCombined= new List() { + 0.1499, + }; + internal static List BucklingCombined= new List() { + 0.1421 + }; + internal static List LocalAxis= new List() { + 0, + }; + internal static List LocalSu= new List() { + 0, + }; + internal static List LocalSv= new List() { + 0.04847, + }; + internal static List LocalTorsion= new List() { + 0, + }; + internal static List LocalMuu= new List() { + 0.1499, + }; + internal static List LocalMvv= new List() { + 0, + }; + internal static List BucklingUu= new List() { + 0, + }; + internal static List BucklingVv= new List() { + 0, + }; + internal static List BucklingLt= new List() { + 0, + }; + internal static List BucklingTor= new List() { + null, + }; + internal static List BucklingFt= new List() { + null, + }; + } +} diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationA2.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationA2.cs new file mode 100644 index 000000000..3ca336dc0 --- /dev/null +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationA2.cs @@ -0,0 +1,54 @@ +using Grasshopper.Kernel.Types; +using Grasshopper; +using OasysGH.Parameters; +using System.Collections.Generic; + +namespace GsaGHTests.Parameters.Results { + public class SteelUtilisationsA2 { + // these are regression tests, the values are taken directly from GSA results + // "Steel_Design_Simple.gwb" for member id=all for analysis case A2 + + internal static List Overall= new List() { + 0.1199, + }; + internal static List LocalCombined= new List() { + 0.1199, + }; + internal static List BucklingCombined= new List() { + 0.1079, + }; + internal static List LocalAxis= new List() { + 0, + }; + internal static List LocalSu= new List() { + 0, + }; + internal static List LocalSv= new List() { + 0.01939, + }; + internal static List LocalTorsion= new List() { + 0, + }; + internal static List LocalMuu= new List() { + 0.1199, + }; + internal static List LocalMvv= new List() { + 0, + }; + internal static List BucklingUu= new List() { + 0, + }; + internal static List BucklingVv= new List() { + 0, + }; + internal static List BucklingLt= new List() { + 0, + }; + internal static List BucklingTor= new List() { + null, + }; + internal static List BucklingFt= new List() { + null, + }; + } +} diff --git a/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationC1.cs b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationC1.cs new file mode 100644 index 000000000..6f94f9fa1 --- /dev/null +++ b/GsaGHTests/1_BaseParameters/5_Results/Collections/RegressionValues/SteelUtilisationC1.cs @@ -0,0 +1,54 @@ +using Grasshopper.Kernel.Types; +using Grasshopper; +using OasysGH.Parameters; +using System.Collections.Generic; + +namespace GsaGHTests.Parameters.Results { + public class SteelUtilisationsC1 { + // these are regression tests, the values are taken directly from GSA results + // "Steel_Design_Simple.gwb" for member id=all for analysis case C1 + + internal static List Overall= new List() { + 0.4017, + }; + internal static List LocalCombined= new List() { + 0.4017, + }; + internal static List BucklingCombined= new List() { + 0.3716, + }; + internal static List LocalAxis= new List() { + 0, + }; + internal static List LocalSu= new List() { + 0, + }; + internal static List LocalSv= new List() { + 0.09888, + }; + internal static List LocalTorsion= new List() { + 0, + }; + internal static List LocalMuu= new List() { + 0.4017, + }; + internal static List LocalMvv= new List() { + 0, + }; + internal static List BucklingUu= new List() { + 0, + }; + internal static List BucklingVv= new List() { + 0, + }; + internal static List BucklingLt= new List() { + 0, + }; + internal static List BucklingTor= new List() { + null, + }; + internal static List BucklingFt= new List() { + null, + }; + } +} diff --git a/GsaGHTests/1_BaseParameters/5_Results/MaxMinHelper.cs b/GsaGHTests/1_BaseParameters/5_Results/MaxMinHelper.cs new file mode 100644 index 000000000..73da37adf --- /dev/null +++ b/GsaGHTests/1_BaseParameters/5_Results/MaxMinHelper.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GsaGHTests.Parameters { + public class MaxMinHelper { + public static double? Max(List values) { + double? max = null; + + foreach (double? value in values) { + if (value == null) { + continue; + } + + if (max == null) { + max = value; + } + + if (value > max) { + max = value; + } + } + + return max; + } + + public static double? Min(List values) { + double? min = null; + + foreach (double? value in values) { + if (value == null) { + continue; + } + + if (min == null) { + min = value; + } + + if (value < min) { + min = value; + } + } + + return min; + } + + } +} diff --git a/GsaGHTests/2_GooWrappers/PersistentParameters/GsaResultParameterTests.cs b/GsaGHTests/2_GooWrappers/PersistentParameters/GsaResultParameterTests.cs index ec549d446..d80823958 100644 --- a/GsaGHTests/2_GooWrappers/PersistentParameters/GsaResultParameterTests.cs +++ b/GsaGHTests/2_GooWrappers/PersistentParameters/GsaResultParameterTests.cs @@ -45,6 +45,7 @@ public class GsaResultParameterTests { [InlineData(typeof(ReactionForceDiagrams))] [InlineData(typeof(ResultDiagrams))] [InlineData(typeof(PreviewDeformed3dSections))] + [InlineData(typeof(SteelUtilisations))] public void GsaResultParameterPreferredCastFromModelParameterTest(Type componentType) { var doc = new GH_Document(); var open = new OpenModel(); @@ -93,6 +94,7 @@ public class GsaResultParameterTests { [InlineData(typeof(ReactionForceDiagrams))] [InlineData(typeof(ResultDiagrams))] [InlineData(typeof(PreviewDeformed3dSections))] + [InlineData(typeof(SteelUtilisations))] public void GsaResultParameterNullTest(Type componentType) { var comp = (GH_Component)Activator.CreateInstance(componentType); comp.CreateAttributes(); diff --git a/GsaGHTests/3_Components/5_Results/ReactionForcesTests.cs b/GsaGHTests/3_Components/5_Results/ReactionForcesTests.cs index efd0a809c..1fbad1d4d 100644 --- a/GsaGHTests/3_Components/5_Results/ReactionForcesTests.cs +++ b/GsaGHTests/3_Components/5_Results/ReactionForcesTests.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using Grasshopper.Kernel.Data; +using Grasshopper.Kernel.Data; using Grasshopper.Kernel.Types; using GsaGH.Components; using GsaGH.Helpers.GsaApi; @@ -10,10 +6,16 @@ using GsaGH.Parameters.Results; using GsaGHTests.Helper; using GsaGHTests.Helpers; +using GsaGHTests.Parameters; using GsaGHTests.Parameters.Results; using OasysUnits; using OasysUnits.Units; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; using Xunit; +using GsaResultTests = GsaGHTests.Parameters.Results.GsaResultTests; namespace GsaGHTests.Components.Results { [Collection("GrasshopperFixture collection")] @@ -137,7 +139,7 @@ public class ReactionForcesTests { var values = new List(); values.AddRange(ExpectedCombinationCaseC4p1Values(component)); values.AddRange(ExpectedCombinationCaseC4p2Values(component)); - double? expected = NodeReactionForcesTests.Max(values); + double? expected = MaxMinHelper.Max(values); // Act var comp = new ReactionForces(); @@ -192,7 +194,7 @@ public class ReactionForcesTests { var values = new List(); values.AddRange(ExpectedCombinationCaseC4p1Values(component)); values.AddRange(ExpectedCombinationCaseC4p2Values(component)); - double? expected = NodeReactionForcesTests.Min(values); + double? expected = MaxMinHelper.Min(values); // Act var comp = new ReactionForces(); diff --git a/GsaGHTests/3_Components/5_Results/SpringReactionForcesTests.cs b/GsaGHTests/3_Components/5_Results/SpringReactionForcesTests.cs index 15e22b4c7..e5ff337f3 100644 --- a/GsaGHTests/3_Components/5_Results/SpringReactionForcesTests.cs +++ b/GsaGHTests/3_Components/5_Results/SpringReactionForcesTests.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using Grasshopper.Kernel.Data; +using Grasshopper.Kernel.Data; using Grasshopper.Kernel.Types; using GsaGH.Components; using GsaGH.Helpers.GsaApi; @@ -10,10 +6,16 @@ using GsaGH.Parameters.Results; using GsaGHTests.Helper; using GsaGHTests.Helpers; +using GsaGHTests.Parameters; using GsaGHTests.Parameters.Results; using OasysUnits; using OasysUnits.Units; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; using Xunit; +using GsaResultTests = GsaGHTests.Parameters.Results.GsaResultTests; namespace GsaGHTests.Components.Results { [Collection("GrasshopperFixture collection")] @@ -137,7 +139,7 @@ public class SpringReactionForcesTests { var values = new List(); values.AddRange(ExpectedCombinationCaseC2p1Values(component)); values.AddRange(ExpectedCombinationCaseC2p2Values(component)); - double? expected = NodeReactionForcesTests.Max(values); + double? expected = MaxMinHelper.Max(values); // Act var comp = new SpringReactionForces(); @@ -192,7 +194,7 @@ public class SpringReactionForcesTests { var values = new List(); values.AddRange(ExpectedCombinationCaseC2p1Values(component)); values.AddRange(ExpectedCombinationCaseC2p2Values(component)); - double? expected = NodeReactionForcesTests.Min(values); + double? expected = MaxMinHelper.Min(values); // Act var comp = new SpringReactionForces(); diff --git a/GsaGHTests/3_Components/5_Results/SteelUtilisationsTests.cs b/GsaGHTests/3_Components/5_Results/SteelUtilisationsTests.cs new file mode 100644 index 000000000..0c5677e88 --- /dev/null +++ b/GsaGHTests/3_Components/5_Results/SteelUtilisationsTests.cs @@ -0,0 +1,248 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Grasshopper.Kernel.Data; +using GsaGH.Helpers.GsaApi; +using GsaGH.Parameters; +using GsaGH.Parameters.Results; +using GsaGHTests.Helper; +using GsaGHTests.Helpers; +using GsaGHTests.Parameters; +using GsaGHTests.Parameters.Results; +using OasysGH.Parameters; +using OasysUnits; +using Xunit; +using GsaResultTests = GsaGHTests.Parameters.Results.GsaResultTests; +using SteelUtilisations = GsaGH.Components.SteelUtilisations; + +namespace GsaGHTests.Components.Results { + [Collection("GrasshopperFixture collection")] + public class SteelUtilisationsTests { + private static string _memberList = "all"; + + [Fact] + public void InvalidInputErrorTests() { + var comp = new SteelUtilisations(); + ComponentTestHelper.SetInput(comp, "not a result"); + comp.Params.Output[0].CollectData(); + Assert.True((int)comp.RuntimeMessageLevel >= 10); + } + + [Theory] + [InlineData("A", 1)] + [InlineData("A", 2)] + [InlineData("C", 1)] + public void SteelUtilisationsIdsFromCaseTest(string caseName, int index) { + // Assemble + GsaResult result = caseName.Equals("A") + ? (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignSimple, index) + : (GsaResult)GsaResultTests.CombinationCaseResult(GsaFile.SteelDesignSimple, index, new List() { 1 }); + + Assert.NotNull(result); + // Act + var comp = new SteelUtilisations(); + ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + + for (int i = 0; i < comp.Params.Output.Count; i++) { // loop through each output + IList paths = ComponentTestHelper.GetPathOutput(comp, i); + Assert.Single(paths); + + var cases = paths.Select(x => x.Indices[0]).ToList(); + foreach (int caseid in cases) { + Assert.Equal(index, caseid); + } + + var permutations = paths.Select(x => x.Indices[1]).ToList(); + foreach (int permutation in permutations) { + Assert.Equal(caseName.Equals("A") ? 0 : 1, permutation); + } + } + } + + [Theory] + [InlineData("A", 1)] + [InlineData("A", 2)] + [InlineData("C", 1)] + public void SteelUtilisationsOutputCaseTest(string caseName, int index) { + // Assemble + GsaResult result = caseName.Equals("A") + ? (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignSimple, index) + : (GsaResult)GsaResultTests.CombinationCaseResult(GsaFile.SteelDesignSimple, index, new List() { 1 }); + + var comp = new SteelUtilisations(); + ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + ComponentTestHelper.SetInput(comp, _memberList, 1); + + List> expectedOutput = GetExpectedOutput(caseName, index); + + for (int i = 0; i < expectedOutput.Count; i++) { + var outputResult = ComponentTestHelper.GetResultOutputAllData(comp, i).Select(x => ((GH_UnitNumber)x).Value?.Value).ToList(); + + Assert.Equal(expectedOutput[i].Count, outputResult.Count); + + for (int j = 0; j < expectedOutput[i].Count; j++) { + Assert.Equal(expectedOutput[i][j], + outputResult[j] == null ? outputResult[j] : + ResultHelper.RoundToSignificantDigits((double)outputResult[j], 4)); + } + } + } + + [Theory] + [InlineData("A", 1)] + [InlineData("A", 2)] + [InlineData("C", 1)] + public void SteelUtilisationsMinFromCaseTest(string caseName, int index) { + // Assemble + GsaResult result = caseName.Equals("A") + ? (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignSimple, index) + : (GsaResult)GsaResultTests.CombinationCaseResult(GsaFile.SteelDesignSimple, index, new List() { 1 }); + + List> expectedOutput = GetExpectedOutput(caseName, index); + + for (int i = 0; i < expectedOutput.Count; i++) { + var values = new List(); + values.AddRange(expectedOutput[i]); + double? expected = MaxMinHelper.Min(values); + + // Act + var comp = new SteelUtilisations(); + comp.SetSelected(0, 15 + i); + ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + ComponentTestHelper.SetInput(comp, _memberList, 1); + + List output = ComponentTestHelper.GetResultOutput(comp, i); + + // Assert Min in set + if (output.Contains(null)) { + foreach (IQuantity quantity in output) { + Assert.Null(quantity); + } + } else { + double min = output.Min().As(Unit()); + Assert.Equal(expected, ResultHelper.RoundToSignificantDigits(min, 4)); + } + } + } + + [Theory] + [InlineData("A", 1)] + [InlineData("A", 2)] + [InlineData("C", 1)] + public void SteelUtilisationsMaxFromCaseTest(string caseName, int index) { + // Assemble + GsaResult result = caseName.Equals("A") + ? (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignSimple, index) + : (GsaResult)GsaResultTests.CombinationCaseResult(GsaFile.SteelDesignSimple, index, new List() { 1 }); + + List> expectedOutput = GetExpectedOutput(caseName, index); + + for (int i = 0; i < expectedOutput.Count; i++) { + var values = new List(); + values.AddRange(expectedOutput[i]); + double? expected = MaxMinHelper.Max(values); + + // Act + var comp = new SteelUtilisations(); + comp.SetSelected(0, i); + ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + ComponentTestHelper.SetInput(comp, _memberList, 1); + + List output = ComponentTestHelper.GetResultOutput(comp, i); + + // Assert Max in set + if (output.Contains(null)) { + foreach (IQuantity quantity in output) { + Assert.Null(quantity); + } + } else { + double max = output.Max().As(Unit()); + Assert.Equal(expected, ResultHelper.RoundToSignificantDigits(max, 4)); + } + } + } + + private Enum Unit() { + Enum unit = Ratio.BaseUnit; + + return unit; + } + + private static List> GetExpectedOutput(string caseName, int index) { + var expectedOutput = new List>(); + switch (caseName) { + case "A" when index == 1: + expectedOutput = ExpectedA1Output(); + break; + case "A" when index == 2: + expectedOutput = ExpectedA2Output(); + break; + case "C" when index == 1: + expectedOutput = ExpectedC1Output(); + break; + default: break; + } + + return expectedOutput; + } + + private static List> ExpectedA1Output() { + var expectedOutput = new List>() { + SteelUtilisationsA1.Overall, + SteelUtilisationsA1.LocalCombined, + SteelUtilisationsA1.BucklingCombined, + SteelUtilisationsA1.LocalAxis, + SteelUtilisationsA1.LocalSu, + SteelUtilisationsA1.LocalSv, + SteelUtilisationsA1.LocalTorsion, + SteelUtilisationsA1.LocalMuu, + SteelUtilisationsA1.LocalMvv, + SteelUtilisationsA1.BucklingUu, + SteelUtilisationsA1.BucklingVv, + SteelUtilisationsA1.BucklingLt, + SteelUtilisationsA1.BucklingTor, + SteelUtilisationsA1.BucklingFt, + }; + return expectedOutput; + } + private static List> ExpectedA2Output() { + var expectedOutput = new List>() { + SteelUtilisationsA2.Overall, + SteelUtilisationsA2.LocalCombined, + SteelUtilisationsA2.BucklingCombined, + SteelUtilisationsA2.LocalAxis, + SteelUtilisationsA2.LocalSu, + SteelUtilisationsA2.LocalSv, + SteelUtilisationsA2.LocalTorsion, + SteelUtilisationsA2.LocalMuu, + SteelUtilisationsA2.LocalMvv, + SteelUtilisationsA2.BucklingUu, + SteelUtilisationsA2.BucklingVv, + SteelUtilisationsA2.BucklingLt, + SteelUtilisationsA2.BucklingTor, + SteelUtilisationsA2.BucklingFt, + }; + return expectedOutput; + } + private static List> ExpectedC1Output() { + var expectedOutput = new List>() { + SteelUtilisationsC1.Overall, + SteelUtilisationsC1.LocalCombined, + SteelUtilisationsC1.BucklingCombined, + SteelUtilisationsC1.LocalAxis, + SteelUtilisationsC1.LocalSu, + SteelUtilisationsC1.LocalSv, + SteelUtilisationsC1.LocalTorsion, + SteelUtilisationsC1.LocalMuu, + SteelUtilisationsC1.LocalMvv, + SteelUtilisationsC1.BucklingUu, + SteelUtilisationsC1.BucklingVv, + SteelUtilisationsC1.BucklingLt, + SteelUtilisationsC1.BucklingTor, + SteelUtilisationsC1.BucklingFt, + }; + return expectedOutput; + } + + } +} diff --git a/GsaGHTests/3_Components/ComponentsTests.cs b/GsaGHTests/3_Components/ComponentsTests.cs index 60b243252..03f59fd90 100644 --- a/GsaGHTests/3_Components/ComponentsTests.cs +++ b/GsaGHTests/3_Components/ComponentsTests.cs @@ -72,6 +72,7 @@ public class ComponentsTests { [InlineData(typeof(SelectResult), 2)] [InlineData(typeof(SpringReactionForces), 3)] [InlineData(typeof(SteelDesignEffectiveLength), 2)] + [InlineData(typeof(SteelUtilisations), 1)] [InlineData(typeof(TotalLoadsAndReactions), 2)] // Display [InlineData(typeof(AssemblyResultDiagrams), 2)] @@ -158,6 +159,7 @@ public class ComponentsTests { [InlineData(typeof(SelectResult), "AnalysisCase", "Combination")] [InlineData(typeof(SpringReactionForces), "kN", "tf", 1)] [InlineData(typeof(SteelDesignEffectiveLength), "mm", "ft", 1)] + [InlineData(typeof(SteelUtilisations), "All", "Min FlexuralBuckling")] [InlineData(typeof(TotalLoadsAndReactions), "kN", "tf")] [InlineData(typeof(Member1dDisplacements), "All", "Min |R|")] [InlineData(typeof(Member1dForcesAndMoments), "All", "Min |Myz|")] diff --git a/GsaGHTests/3_Components/GH_OasysComponentTest.cs b/GsaGHTests/3_Components/GH_OasysComponentTest.cs index 588aa8f0f..c82621f1e 100644 --- a/GsaGHTests/3_Components/GH_OasysComponentTest.cs +++ b/GsaGHTests/3_Components/GH_OasysComponentTest.cs @@ -131,6 +131,7 @@ public class GH_OasysComponentTests { [InlineData(typeof(SelectResult))] [InlineData(typeof(SpringReactionForces))] [InlineData(typeof(TotalLoadsAndReactions))] + [InlineData(typeof(SteelUtilisations))] // 6_Display [InlineData(typeof(AnnotateDetailed))] [InlineData(typeof(Annotate))] @@ -153,6 +154,7 @@ public class GH_OasysComponentTests { Assert.NotEqual(new Guid(), comp.ComponentGuid); Assert.Equal(PluginInfo.Instance, comp.PluginInfo); } + [Fact] public void GH_OasysTaskCapableComponent() { var comp = new GetModelGeometry(); diff --git a/GsaGHTests/4_CustomUIComponents/DeserializeTests.cs b/GsaGHTests/4_CustomUIComponents/DeserializeTests.cs index 63f376750..a3bf7ca4c 100644 --- a/GsaGHTests/4_CustomUIComponents/DeserializeTests.cs +++ b/GsaGHTests/4_CustomUIComponents/DeserializeTests.cs @@ -73,6 +73,7 @@ public class DeserializeTests { [InlineData(typeof(ReactionForces))] [InlineData(typeof(SpringReactionForces))] [InlineData(typeof(TotalLoadsAndReactions))] + [InlineData(typeof(SteelUtilisations))] // Display [InlineData(typeof(AssemblyResultDiagrams))] [InlineData(typeof(AssemblyResults))] diff --git a/GsaGHTests/4_CustomUIComponents/DropDownComponentTests.cs b/GsaGHTests/4_CustomUIComponents/DropDownComponentTests.cs index 63ec30b20..792ea7eda 100644 --- a/GsaGHTests/4_CustomUIComponents/DropDownComponentTests.cs +++ b/GsaGHTests/4_CustomUIComponents/DropDownComponentTests.cs @@ -74,6 +74,7 @@ public class DropDownComponentTests { [InlineData(typeof(ReactionForces))] [InlineData(typeof(SpringReactionForces))] [InlineData(typeof(TotalLoadsAndReactions))] + [InlineData(typeof(SteelUtilisations))] // Display [InlineData(typeof(AssemblyResultDiagrams))] [InlineData(typeof(AssemblyResults), true)] From 57c7b76e73fda15c06132b921aad26ba6974fa4d Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 9 Apr 2024 10:28:49 +0200 Subject: [PATCH 10/28] GSAGH-486 All --- GsaGH/Components/3_Loads/CreateBeamLoad.cs | 2 +- GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs | 2 +- GsaGH/Components/3_Loads/CreateFaceLoad.cs | 2 +- GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs | 2 +- GsaGH/Components/3_Loads/CreateGravityLoad.cs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/GsaGH/Components/3_Loads/CreateBeamLoad.cs b/GsaGH/Components/3_Loads/CreateBeamLoad.cs index 18bd7018d..02c04fd0d 100644 --- a/GsaGH/Components/3_Loads/CreateBeamLoad.cs +++ b/GsaGH/Components/3_Loads/CreateBeamLoad.cs @@ -301,7 +301,7 @@ private enum FoldMode { if (GH_Convert.ToString(ghTyp.Value, out string beamList, GH_Conversion.Both)) { beamLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; beamLoad.ApiLoad.EntityList = beamList; - if (beamLoad.ApiLoad.EntityList != beamList) { + if (beamLoad.ApiLoad.EntityList != beamList && beamList.ToLower() != "all") { beamLoad.ApiLoad.EntityList = $"\"{beamList}\""; } } diff --git a/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs b/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs index 00835e714..0c5946ec0 100644 --- a/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs +++ b/GsaGH/Components/3_Loads/CreateBeamThermalLoad.cs @@ -181,7 +181,7 @@ private enum FoldMode { if (GH_Convert.ToString(ghTyp.Value, out string beamList, GH_Conversion.Both)) { beamThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; beamThermalLoad.ApiLoad.EntityList = beamList; - if (beamThermalLoad.ApiLoad.EntityList != beamList) { + if (beamThermalLoad.ApiLoad.EntityList != beamList && beamList.ToLower() != "all") { beamThermalLoad.ApiLoad.EntityList = $"\"{beamList}\""; } } diff --git a/GsaGH/Components/3_Loads/CreateFaceLoad.cs b/GsaGH/Components/3_Loads/CreateFaceLoad.cs index c069cfe9b..595988de5 100644 --- a/GsaGH/Components/3_Loads/CreateFaceLoad.cs +++ b/GsaGH/Components/3_Loads/CreateFaceLoad.cs @@ -306,7 +306,7 @@ private enum FoldMode { if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { faceLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; faceLoad.ApiLoad.EntityList = elemList; - if (faceLoad.ApiLoad.EntityList != elemList) { + if (faceLoad.ApiLoad.EntityList != elemList && elemList.ToLower() != "all") { faceLoad.ApiLoad.EntityList = $"\"{elemList}\""; } } diff --git a/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs b/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs index 2aa110cf1..10e623ffb 100644 --- a/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs +++ b/GsaGH/Components/3_Loads/CreateFaceThermalLoad.cs @@ -179,7 +179,7 @@ private enum FoldMode { if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { faceThermalLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; faceThermalLoad.ApiLoad.EntityList = elemList; - if (faceThermalLoad.ApiLoad.EntityList != elemList) { + if (faceThermalLoad.ApiLoad.EntityList != elemList && elemList.ToLower() != "all") { faceThermalLoad.ApiLoad.EntityList = $"\"{elemList}\""; } } diff --git a/GsaGH/Components/3_Loads/CreateGravityLoad.cs b/GsaGH/Components/3_Loads/CreateGravityLoad.cs index b74d21b90..3411f1746 100644 --- a/GsaGH/Components/3_Loads/CreateGravityLoad.cs +++ b/GsaGH/Components/3_Loads/CreateGravityLoad.cs @@ -143,7 +143,7 @@ public class CreateGravityLoad : GH_OasysComponent { if (GH_Convert.ToString(ghTyp.Value, out string elemList, GH_Conversion.Both)) { gravityLoad.ApiLoad.EntityType = GsaAPI.EntityType.Element; gravityLoad.ApiLoad.EntityList = elemList; - if (gravityLoad.ApiLoad.EntityList != elemList) { + if (gravityLoad.ApiLoad.EntityList != elemList && elemList.ToLower() != "all") { gravityLoad.ApiLoad.EntityList = $"\"{elemList}\""; } } From 44c04cdcd6a193d41943350c0f3067f70f63bfaa Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 9 Apr 2024 11:14:34 +0200 Subject: [PATCH 11/28] GSAGH-489 mappings --- GsaGH/Helpers/GsaAPI/Mappings.cs | 84 +++++++++++++----------- GsaGH/Parameters/Enums/ApiDiagramType.cs | 16 +++++ 2 files changed, 62 insertions(+), 38 deletions(-) diff --git a/GsaGH/Helpers/GsaAPI/Mappings.cs b/GsaGH/Helpers/GsaAPI/Mappings.cs index 7ebb2a39b..f029ebfff 100644 --- a/GsaGH/Helpers/GsaAPI/Mappings.cs +++ b/GsaGH/Helpers/GsaAPI/Mappings.cs @@ -213,55 +213,63 @@ internal static class Mappings { internal static readonly IList _diagramTypeMappingAssemblyDisplacement = new List() { - new DiagramTypeMapping("Translation Ux", DiagramType.AssemblyDisplacementUx, - ApiDiagramType.AxialForceFx), - new DiagramTypeMapping("Translation Uy", DiagramType.AssemblyDisplacementUy, - ApiDiagramType.ShearForceFy), - new DiagramTypeMapping("Translation Uz", DiagramType.AssemblyDisplacementUz, - ApiDiagramType.ShearForceFz), - new DiagramTypeMapping("Rotation Rxx", DiagramType.AssemblyRotationRxx, - ApiDiagramType.TorsionMxx), - new DiagramTypeMapping("Rotation Ryy", DiagramType.AssemblyRotationRxx, - ApiDiagramType.MomentMyy), - new DiagramTypeMapping("Rotation Rzz", DiagramType.AssemblyRotationRxx, - ApiDiagramType.MomentMzz) + new DiagramTypeMapping("Translation Ux", DiagramType.AssemblyDisplacementUx, + ApiDiagramType.TranslationUx), + new DiagramTypeMapping("Translation Uy", DiagramType.AssemblyDisplacementUy, + ApiDiagramType.TranslationUy), + new DiagramTypeMapping("Translation Uz", DiagramType.AssemblyDisplacementUz, + ApiDiagramType.TranslationUz), + new DiagramTypeMapping("Resolved Translation |U|", DiagramType.ResolvedAssemblyDisplacementU, + ApiDiagramType.ResolvedTranslationU), + new DiagramTypeMapping("Rotation Rxx", DiagramType.AssemblyRotationRxx, + ApiDiagramType.RotationRxx), + new DiagramTypeMapping("Rotation Ryy", DiagramType.AssemblyRotationRxx, + ApiDiagramType.RotationRyy), + new DiagramTypeMapping("Rotation Rzz", DiagramType.AssemblyRotationRxx, + ApiDiagramType.RotationRzz), + new DiagramTypeMapping("Resolved Rotation |R|", DiagramType.ResolvedAssemblyRotationR, + ApiDiagramType.ResolvedRotationR) }; internal static readonly IList _diagramTypeMappingAssemblyDrift = new List() { - new DiagramTypeMapping("Drift Dx", DiagramType.AssemblyDriftX, - ApiDiagramType.AxialForceFx), - new DiagramTypeMapping("Drift Dy", DiagramType.AssemblyDriftY, - ApiDiagramType.ShearForceFy), - new DiagramTypeMapping("In-plane Drift", DiagramType.AssemblyDriftXY, - ApiDiagramType.ShearForceFz) + new DiagramTypeMapping("Drift Dx", DiagramType.AssemblyDriftX, + ApiDiagramType.DriftX), + new DiagramTypeMapping("Drift Dy", DiagramType.AssemblyDriftY, + ApiDiagramType.DriftY), + //new DiagramTypeMapping("Resolved Drift |D|", DiagramType.ResolvedAssemblyDrift, + // ApiDiagramType.ResolvedDrift), + new DiagramTypeMapping("In-plane Drift", DiagramType.AssemblyDriftXY, + ApiDiagramType.DriftXY) }; internal static readonly IList _diagramTypeMappingAssemblyDriftIndex = new List() { - new DiagramTypeMapping("Drift Index DIx", DiagramType.AssemblyDriftIndexX, - ApiDiagramType.AxialForceFx), - new DiagramTypeMapping("Drift Index DIy", DiagramType.AssemblyDriftIndexY, - ApiDiagramType.ShearForceFy), - new DiagramTypeMapping("In-plane Drift Index", DiagramType.AssemblyDriftIndexXY, - ApiDiagramType.ShearForceFz) + new DiagramTypeMapping("Drift Index DIx", DiagramType.AssemblyDriftIndexX, + ApiDiagramType.DriftIndexX), + new DiagramTypeMapping("Drift Index DIy", DiagramType.AssemblyDriftIndexY, + ApiDiagramType.DriftIndexY), + //new DiagramTypeMapping("Resolved Drift Index |DI|", DiagramType.ResolvedAssemblyDriftIndex, + // ApiDiagramType.ResolvedDriftIndex), + new DiagramTypeMapping("In-plane Drift Index", DiagramType.AssemblyDriftIndexXY, + ApiDiagramType.DriftIndexXY) }; internal static readonly IList _diagramTypeMappingAssemblyForce - = new List() { - new DiagramTypeMapping("Axial Fx", DiagramType.AssemblyAxialForceFx, - ApiDiagramType.AxialForceFx), - new DiagramTypeMapping("Shear Fy", DiagramType.AssemblyShearForceFy, - ApiDiagramType.ShearForceFy), - new DiagramTypeMapping("Shear Fz", DiagramType.AssemblyShearForceFz, - ApiDiagramType.ShearForceFz), - new DiagramTypeMapping("Torsion Mxx", DiagramType.AssemblyTorsionMxx, - ApiDiagramType.TorsionMxx), - new DiagramTypeMapping("Moment Myy", DiagramType.AssemblyMomentMyy, - ApiDiagramType.MomentMyy), - new DiagramTypeMapping("Moment Mzz", DiagramType.AssemblyMomentMzz, - ApiDiagramType.MomentMzz) - }; + = new List() { + new DiagramTypeMapping("Axial Fx", DiagramType.AssemblyAxialForceFx, + ApiDiagramType.AxialForceFx), + new DiagramTypeMapping("Shear Fy", DiagramType.AssemblyShearForceFy, + ApiDiagramType.ShearForceFy), + new DiagramTypeMapping("Shear Fz", DiagramType.AssemblyShearForceFz, + ApiDiagramType.ShearForceFz), + new DiagramTypeMapping("Torsion Mxx", DiagramType.AssemblyTorsionMxx, + ApiDiagramType.TorsionMxx), + new DiagramTypeMapping("Moment Myy", DiagramType.AssemblyMomentMyy, + ApiDiagramType.MomentMyy), + new DiagramTypeMapping("Moment Mzz", DiagramType.AssemblyMomentMzz, + ApiDiagramType.MomentMzz) + }; internal static readonly IList _diagramTypeMappingForce = new List() { diff --git a/GsaGH/Parameters/Enums/ApiDiagramType.cs b/GsaGH/Parameters/Enums/ApiDiagramType.cs index d94e1b92c..fd878a2c8 100644 --- a/GsaGH/Parameters/Enums/ApiDiagramType.cs +++ b/GsaGH/Parameters/Enums/ApiDiagramType.cs @@ -49,5 +49,21 @@ public enum ApiDiagramType { Load3dFacePressure, Load3dThermalUniform, Load3dThermalGradient, + TranslationUx, + TranslationUy, + TranslationUz, + ResolvedTranslationU, + RotationRxx, + RotationRyy, + RotationRzz, + ResolvedRotationR, + DriftX, + DriftY, + DriftXY, + // ResolvedDrift, + DriftIndexX, + DriftIndexY, + DriftIndexXY, + // ResolvedDriftIndex, } } From b5cca11f692a1b59faeb57a016eb82ef51fc5cb6 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 9 Apr 2024 11:45:29 +0200 Subject: [PATCH 12/28] GSAGH-489 resolved assembly results --- GsaGH/Components/6_Display/AssemblyResults.cs | 11 +---------- GsaGH/Helpers/GsaAPI/Mappings.cs | 12 ++++++------ GsaGH/Parameters/Enums/ApiDiagramType.cs | 4 ++-- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/GsaGH/Components/6_Display/AssemblyResults.cs b/GsaGH/Components/6_Display/AssemblyResults.cs index 5b701cf35..84aa58753 100644 --- a/GsaGH/Components/6_Display/AssemblyResults.cs +++ b/GsaGH/Components/6_Display/AssemblyResults.cs @@ -80,15 +80,11 @@ private enum FoldMode { private readonly List _drift = new List(new[] { "Drift Dx", "Drift Dy", - //"Drift Dz", - //"Drift |D|", "In-plane Drift" }); private readonly List _driftIndex = new List(new[] { "Drift Index DIx", "Drift Index DIy", - //"Drift Index DIz", - //"Drift Index |DI|", "In-plane Drift Index" }); private readonly List _force = new List(new[] { @@ -475,11 +471,6 @@ private enum FoldMode { ReadOnlyDictionary nodes = result.Model.Model.Nodes(); ReadOnlyDictionary assemblies = result.Model.Model.Assemblies(); - var list = new EntityList { - Definition = assemblyList, - Type = GsaAPI.EntityType.Assembly - }; - ReadOnlyCollection assemblyIds = result.AssemblyIds(assemblyList); var filteredAssemblies = new Dictionary(); @@ -741,7 +732,7 @@ private enum FoldMode { var resultLines = new DataTree(); - Parallel.ForEach(assemblies, assembly => { + Parallel.ForEach(filteredAssemblies, assembly => { Node topology1 = nodes[assembly.Value.Topology1]; Node topology2 = nodes[assembly.Value.Topology2]; diff --git a/GsaGH/Helpers/GsaAPI/Mappings.cs b/GsaGH/Helpers/GsaAPI/Mappings.cs index f029ebfff..8a0210a69 100644 --- a/GsaGH/Helpers/GsaAPI/Mappings.cs +++ b/GsaGH/Helpers/GsaAPI/Mappings.cs @@ -219,7 +219,7 @@ internal static class Mappings { ApiDiagramType.TranslationUy), new DiagramTypeMapping("Translation Uz", DiagramType.AssemblyDisplacementUz, ApiDiagramType.TranslationUz), - new DiagramTypeMapping("Resolved Translation |U|", DiagramType.ResolvedAssemblyDisplacementU, + new DiagramTypeMapping("Res. Translation |U|", DiagramType.ResolvedAssemblyDisplacementU, ApiDiagramType.ResolvedTranslationU), new DiagramTypeMapping("Rotation Rxx", DiagramType.AssemblyRotationRxx, ApiDiagramType.RotationRxx), @@ -227,7 +227,7 @@ internal static class Mappings { ApiDiagramType.RotationRyy), new DiagramTypeMapping("Rotation Rzz", DiagramType.AssemblyRotationRxx, ApiDiagramType.RotationRzz), - new DiagramTypeMapping("Resolved Rotation |R|", DiagramType.ResolvedAssemblyRotationR, + new DiagramTypeMapping("Res. Rotation |R|", DiagramType.ResolvedAssemblyRotationR, ApiDiagramType.ResolvedRotationR) }; @@ -237,8 +237,8 @@ internal static class Mappings { ApiDiagramType.DriftX), new DiagramTypeMapping("Drift Dy", DiagramType.AssemblyDriftY, ApiDiagramType.DriftY), - //new DiagramTypeMapping("Resolved Drift |D|", DiagramType.ResolvedAssemblyDrift, - // ApiDiagramType.ResolvedDrift), + new DiagramTypeMapping("Res. Drift |D|", DiagramType.ResolvedAssemblyDrift, + ApiDiagramType.ResolvedDrift), new DiagramTypeMapping("In-plane Drift", DiagramType.AssemblyDriftXY, ApiDiagramType.DriftXY) }; @@ -249,8 +249,8 @@ internal static class Mappings { ApiDiagramType.DriftIndexX), new DiagramTypeMapping("Drift Index DIy", DiagramType.AssemblyDriftIndexY, ApiDiagramType.DriftIndexY), - //new DiagramTypeMapping("Resolved Drift Index |DI|", DiagramType.ResolvedAssemblyDriftIndex, - // ApiDiagramType.ResolvedDriftIndex), + new DiagramTypeMapping("Res. Drift Index |DI|", DiagramType.ResolvedAssemblyDriftIndex, + ApiDiagramType.ResolvedDriftIndex), new DiagramTypeMapping("In-plane Drift Index", DiagramType.AssemblyDriftIndexXY, ApiDiagramType.DriftIndexXY) }; diff --git a/GsaGH/Parameters/Enums/ApiDiagramType.cs b/GsaGH/Parameters/Enums/ApiDiagramType.cs index fd878a2c8..49e1e7d48 100644 --- a/GsaGH/Parameters/Enums/ApiDiagramType.cs +++ b/GsaGH/Parameters/Enums/ApiDiagramType.cs @@ -60,10 +60,10 @@ public enum ApiDiagramType { DriftX, DriftY, DriftXY, - // ResolvedDrift, + ResolvedDrift, DriftIndexX, DriftIndexY, DriftIndexXY, - // ResolvedDriftIndex, + ResolvedDriftIndex, } } From bd5d79b5104269d95b23cfa711442fece00c2009 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 9 Apr 2024 14:14:11 +0200 Subject: [PATCH 13/28] GSAGH-489 comment --- GsaGH/Components/6_Display/AssemblyResultDiagrams.cs | 2 +- GsaGH/Components/6_Display/AssemblyResults.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/GsaGH/Components/6_Display/AssemblyResultDiagrams.cs b/GsaGH/Components/6_Display/AssemblyResultDiagrams.cs index dd0a00dde..be3c9776f 100644 --- a/GsaGH/Components/6_Display/AssemblyResultDiagrams.cs +++ b/GsaGH/Components/6_Display/AssemblyResultDiagrams.cs @@ -29,7 +29,7 @@ namespace GsaGH.Components { /// - /// Component to get Assembly results + /// Component to get Assembly result diagrams /// public class AssemblyResultDiagrams : GH_OasysDropDownComponent { public override Guid ComponentGuid => new Guid("1b059edf-69aa-4c54-bcd6-01e3def03ef1"); diff --git a/GsaGH/Components/6_Display/AssemblyResults.cs b/GsaGH/Components/6_Display/AssemblyResults.cs index 84aa58753..b8d5d6ec4 100644 --- a/GsaGH/Components/6_Display/AssemblyResults.cs +++ b/GsaGH/Components/6_Display/AssemblyResults.cs @@ -12,7 +12,6 @@ using Grasshopper.GUI.Gradient; using Grasshopper.Kernel; using Grasshopper.Kernel.Data; -using Grasshopper.Kernel.Parameters; using Grasshopper.Kernel.Special; using Grasshopper.Kernel.Types; using GsaAPI; From f984a1573df23c6edf6a6615e3fa15ee3f63a92c Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Wed, 10 Apr 2024 13:29:01 +0200 Subject: [PATCH 14/28] MinGsaVersion --- GsaGH/GsaGHInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GsaGH/GsaGHInfo.cs b/GsaGH/GsaGHInfo.cs index 8741e1e3c..1b4b4f166 100644 --- a/GsaGH/GsaGHInfo.cs +++ b/GsaGH/GsaGHInfo.cs @@ -36,7 +36,7 @@ public override string Description internal const string Copyright = "Copyright © Oasys 1985 - 2024"; internal const string PluginName = "GsaGH"; internal const string ProductName = "GSA"; - internal static int MinGsaVersion = 7; + internal static int MinGsaVersion = 8; internal const string TermsConditions = "Oasys terms and conditions apply. See https://www.oasys-software.com/terms-conditions for details. "; internal const string Vers = "1.3.0"; From 01fa73f355b02873888ca29fb5e4c85fda6a9cee Mon Sep 17 00:00:00 2001 From: DominikaLos <83698580+DominikaLos@users.noreply.github.com> Date: Mon, 15 Apr 2024 10:53:50 +0200 Subject: [PATCH 15/28] gsagh-488 (#666) * added displacement dropdown * fix for reading old files * fix * update for unit tests * more tests added * update --- GsaGH/Components/6_Display/ResultDiagrams.cs | 105 ++++++++++++++---- GsaGH/Helpers/GsaAPI/Mappings.cs | 20 ++++ .../6_Display/AssemblyResultDiagramsTests.cs | 13 ++- .../6_Display/ResultDiagramsTests.cs | 16 ++- GsaGHTests/3_Components/ComponentsTests.cs | 2 +- 5 files changed, 129 insertions(+), 27 deletions(-) diff --git a/GsaGH/Components/6_Display/ResultDiagrams.cs b/GsaGH/Components/6_Display/ResultDiagrams.cs index 96715d365..a31af688a 100644 --- a/GsaGH/Components/6_Display/ResultDiagrams.cs +++ b/GsaGH/Components/6_Display/ResultDiagrams.cs @@ -38,6 +38,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { protected override Bitmap Icon => Resources.ResultDiagrams; private string _case = string.Empty; + private LengthUnit _lengthUnit = DefaultUnits.LengthUnitResult; private ForceUnit _forceUnit = DefaultUnits.ForceUnit; private MomentUnit _momentUnit = DefaultUnits.MomentUnit; private PressureUnit _stressUnit = DefaultUnits.StressUnitResult; @@ -46,6 +47,10 @@ public class ResultDiagrams : GH_OasysDropDownComponent { "Displays GSA 1D Element Result Diagram", CategoryName.Name(), SubCategoryName.Cat6()) { } public override bool Read(GH_IReader reader) { + string length = string.Empty; + _lengthUnit = reader.TryGetString("length", ref length) + ? (LengthUnit)UnitsHelper.Parse(typeof(LengthUnit), length) + : DefaultUnits.LengthUnitResult; _forceUnit = (ForceUnit)UnitsHelper.Parse(typeof(ForceUnit), reader.GetString("force")); _momentUnit = (MomentUnit)UnitsHelper.Parse(typeof(MomentUnit), reader.GetString("moment")); _stressUnit @@ -57,6 +62,13 @@ public class ResultDiagrams : GH_OasysDropDownComponent { _selectedItems[i] = _dropDownItems[i][j]; if (i == 0) { if (j == 0) { + if (_dropDownItems[1] != Mappings._diagramTypeMappingDisplacement.Select(item => item.Description) + .ToList()) { + _dropDownItems[1] = Mappings._diagramTypeMappingDisplacement.Select(item => item.Description) + .ToList(); + _selectedItems[1] = _dropDownItems[1][3]; // resolved translation u + } + } else if (j == 1) { if (_dropDownItems[1] != Mappings._diagramTypeMappingForce.Select(item => item.Description) .ToList()) { _dropDownItems[1] = Mappings._diagramTypeMappingForce.Select(item => item.Description) @@ -77,6 +89,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { } public override bool Write(GH_IWriter writer) { + writer.SetString("length", Length.GetAbbreviation(_lengthUnit)); writer.SetString("force", Force.GetAbbreviation(_forceUnit)); writer.SetString("moment", Moment.GetAbbreviation(_momentUnit)); writer.SetString("stress", Pressure.GetAbbreviation(_stressUnit)); @@ -90,6 +103,8 @@ public class ResultDiagrams : GH_OasysDropDownComponent { Menu_AppendSeparator(menu); + ToolStripMenuItem lengthUnitsMenu = GenerateToolStripMenuItem.GetSubMenuItem("Length", + EngineeringUnits.Length, Length.GetAbbreviation(_lengthUnit), UpdateLength); ToolStripMenuItem forceUnitsMenu = GenerateToolStripMenuItem.GetSubMenuItem("Force", EngineeringUnits.Force, Force.GetAbbreviation(_forceUnit), UpdateForce); ToolStripMenuItem momentUnitsMenu = GenerateToolStripMenuItem.GetSubMenuItem("Moment", @@ -100,6 +115,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { var unitsMenu = new ToolStripMenuItem("Select Units", Resources.ModelUnits); unitsMenu.DropDownItems.AddRange(new ToolStripItem[] { + lengthUnitsMenu, forceUnitsMenu, momentUnitsMenu, stressUnitsMenu, @@ -120,14 +136,14 @@ public class ResultDiagrams : GH_OasysDropDownComponent { _selectedItems = new List(); _dropDownItems.Add(new List() { + "Displacement", "Force", "Stress", }); _selectedItems.Add(_dropDownItems[0][0]); - - _dropDownItems.Add(Mappings._diagramTypeMappingForce.Select(item => item.Description) + _dropDownItems.Add(Mappings._diagramTypeMappingDisplacement.Select(item => item.Description) .ToList()); - _selectedItems.Add(_dropDownItems[1][5]); // Myy + _selectedItems.Add(_dropDownItems[1][3]); _isInitialised = true; } @@ -165,6 +181,8 @@ public class ResultDiagrams : GH_OasysDropDownComponent { Message = Moment.GetAbbreviation(_momentUnit); } else if (IsStress()) { Message = Pressure.GetAbbreviation(_stressUnit); + } else if (IsDisplacement()) { + Message = Length.GetAbbreviation(_lengthUnit); } else { Message = "Error"; this.AddRuntimeError("Cannot get unit for selected diagramType!"); @@ -214,11 +232,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { LengthUnit lengthUnit = result.Model.ModelUnit; - DiagramType type = _selectedItems[0] == "Force" - ? Mappings._diagramTypeMappingForce.Where(item => item.Description == _selectedItems[1]) - .Select(item => item.GsaApiEnum).FirstOrDefault() - : Mappings._diagramTypeMappingStress.Where(item => item.Description == _selectedItems[1]) - .Select(item => item.GsaApiEnum).FirstOrDefault(); + DiagramType type = GetDiagramType(); double unitScale = ComputeUnitScale(autoScale); double computedScale @@ -262,6 +276,13 @@ public class ResultDiagrams : GH_OasysDropDownComponent { PostHog.Diagram("Result", result.CaseType, _selectedItems[0], type.ToString(), Parameters.EntityType.Element); } + protected override void UpdateUIFromSelectedItems() { + if (_dropDownItems[0].Count == 2) { + _dropDownItems[0].Insert(0, "Displacement"); + } + + base.UpdateUIFromSelectedItems(); + } private List GenerateAnnotations( IReadOnlyCollection annotationsFromModel, double lengthScaleFactor, @@ -317,6 +338,8 @@ public class ResultDiagrams : GH_OasysDropDownComponent { unitScaleFactor = UnitConverter.Convert(1, Pressure.BaseUnit, _stressUnit); } else if (IsMoment()) { unitScaleFactor = UnitConverter.Convert(1, Moment.BaseUnit, _momentUnit); + }else if (IsDisplacement()) { + unitScaleFactor = UnitConverter.Convert(1, Length.BaseUnit, _lengthUnit); } else { this.AddRuntimeError("Not supported diagramType!"); } @@ -327,11 +350,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { private bool IsForce() { bool isForce = false; - DiagramType type = _selectedItems[0] == "Force" ? - Mappings._diagramTypeMappingForce.Where(item => item.Description == _selectedItems[1]) - .Select(item => item.GsaApiEnum).FirstOrDefault() : Mappings._diagramTypeMappingStress - .Where(item => item.Description == _selectedItems[1]).Select(item => item.GsaApiEnum) - .FirstOrDefault(); + DiagramType type = GetDiagramType(); switch (type) { case DiagramType.AxialForceFx: case DiagramType.ShearForceFy: @@ -346,11 +365,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { private bool IsMoment() { bool isMoment = false; - DiagramType type = _selectedItems[0] == "Force" ? - Mappings._diagramTypeMappingForce.Where(item => item.Description == _selectedItems[1]) - .Select(item => item.GsaApiEnum).FirstOrDefault() : Mappings._diagramTypeMappingStress - .Where(item => item.Description == _selectedItems[1]).Select(item => item.GsaApiEnum) - .FirstOrDefault(); + DiagramType type = GetDiagramType(); switch (type) { case DiagramType.MomentMyy: case DiagramType.MomentMzz: @@ -365,11 +380,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { private bool IsStress() { bool isStress = false; - DiagramType type = _selectedItems[0] == "Force" ? - Mappings._diagramTypeMappingForce.Where(item => item.Description == _selectedItems[1]) - .Select(item => item.GsaApiEnum).FirstOrDefault() : Mappings._diagramTypeMappingStress - .Where(item => item.Description == _selectedItems[1]).Select(item => item.GsaApiEnum) - .FirstOrDefault(); + DiagramType type = GetDiagramType(); switch (type) { case DiagramType.AxialStressA: case DiagramType.BendingStressByNegativeZ: @@ -387,6 +398,49 @@ public class ResultDiagrams : GH_OasysDropDownComponent { return isStress; } + private bool IsDisplacement() { + bool isDisplacement = false; + DiagramType type = GetDiagramType(); + switch (type) { + case DiagramType.TranslationUx: + case DiagramType.TranslationUy: + case DiagramType.TranslationUz: + case DiagramType.ResolvedTranslationU: + case DiagramType.RotationRxx: + case DiagramType.RotationRyy: + case DiagramType.RotationRzz: + case DiagramType.ResolvedRotationR: + isDisplacement = true; + break; + } + + return isDisplacement; + } + + private DiagramType GetDiagramType() { + DiagramType type = DiagramType.AxialForceFx; + switch (_selectedItems[0]) { + case "Force": + type = Mappings._diagramTypeMappingForce + .Where(item => item.Description == _selectedItems[1]).Select(item => item.GsaApiEnum) + .FirstOrDefault(); + break; + case "Displacement": + type = Mappings._diagramTypeMappingDisplacement + .Where(item => item.Description == _selectedItems[1]).Select(item => item.GsaApiEnum) + .FirstOrDefault(); + break; + case "Stress": + type = Mappings._diagramTypeMappingStress + .Where(item => item.Description == _selectedItems[1]).Select(item => item.GsaApiEnum) + .FirstOrDefault(); + break; + default: break; + } + + return type; + } + internal void UpdateForce(string unit) { _forceUnit = (ForceUnit)UnitsHelper.Parse(typeof(ForceUnit), unit); ExpirePreview(true); @@ -404,5 +458,10 @@ public class ResultDiagrams : GH_OasysDropDownComponent { ExpirePreview(true); base.UpdateUI(); } + internal void UpdateLength(string unit) { + _lengthUnit = (LengthUnit)UnitsHelper.Parse(typeof(LengthUnit), unit); + ExpirePreview(true); + base.UpdateUI(); + } } } diff --git a/GsaGH/Helpers/GsaAPI/Mappings.cs b/GsaGH/Helpers/GsaAPI/Mappings.cs index 8a0210a69..aae500105 100644 --- a/GsaGH/Helpers/GsaAPI/Mappings.cs +++ b/GsaGH/Helpers/GsaAPI/Mappings.cs @@ -211,6 +211,26 @@ internal static class Mappings { { "Torsional", typeof(TorsionalSpringProperty) } }; + internal static readonly IList _diagramTypeMappingDisplacement + = new List() { + new DiagramTypeMapping("Translation Ux", DiagramType.TranslationUx, + ApiDiagramType.TranslationUx), + new DiagramTypeMapping("Translation Uy", DiagramType.TranslationUy, + ApiDiagramType.TranslationUy), + new DiagramTypeMapping("Translation Uz", DiagramType.TranslationUz, + ApiDiagramType.TranslationUz), + new DiagramTypeMapping("Res. Translation U", DiagramType.ResolvedTranslationU, + ApiDiagramType.ResolvedTranslationU), + new DiagramTypeMapping("Rotation Rxx", DiagramType.RotationRxx, + ApiDiagramType.RotationRxx), + new DiagramTypeMapping("Rotation Ryy", DiagramType.RotationRyy, + ApiDiagramType.RotationRyy), + new DiagramTypeMapping("Rotation Rzz", DiagramType.RotationRxx, + ApiDiagramType.RotationRzz), + new DiagramTypeMapping("Res. Rotation R", DiagramType.ResolvedRotationR, + ApiDiagramType.ResolvedRotationR), + }; + internal static readonly IList _diagramTypeMappingAssemblyDisplacement = new List() { new DiagramTypeMapping("Translation Ux", DiagramType.AssemblyDisplacementUx, diff --git a/GsaGHTests/3_Components/6_Display/AssemblyResultDiagramsTests.cs b/GsaGHTests/3_Components/6_Display/AssemblyResultDiagramsTests.cs index 710f64398..650f4d463 100644 --- a/GsaGHTests/3_Components/6_Display/AssemblyResultDiagramsTests.cs +++ b/GsaGHTests/3_Components/6_Display/AssemblyResultDiagramsTests.cs @@ -14,7 +14,7 @@ public class AssemblyResultDiagramsTests { var comp = new ResultDiagrams(); GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.AssemblyByStorey, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 0); // force + comp.SetSelected(0, 1); // force comp.SetSelected(1, 0); // Axial force comp.UpdateForce("MN"); comp.Params.Output[0].CollectData(); @@ -38,9 +38,20 @@ public class AssemblyResultDiagramsTests { var comp = new ResultDiagrams(); GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.AssemblyByStorey, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + comp.SetSelected(0, 1); comp.UpdateMoment("MN·m"); comp.Params.Output[0].CollectData(); Assert.Equal("MN·m", comp.Message); } + [Fact] + public void UpdateStressTest() { + var comp = new ResultDiagrams(); + GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.AssemblyByStorey, 1); + ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + comp.SetSelected(0, 2); + comp.UpdateStress("mPa"); + comp.Params.Output[0].CollectData(); + Assert.Equal("mPa", comp.Message); + } } } diff --git a/GsaGHTests/3_Components/6_Display/ResultDiagramsTests.cs b/GsaGHTests/3_Components/6_Display/ResultDiagramsTests.cs index b6c3c9e63..edd68287e 100644 --- a/GsaGHTests/3_Components/6_Display/ResultDiagramsTests.cs +++ b/GsaGHTests/3_Components/6_Display/ResultDiagramsTests.cs @@ -29,7 +29,7 @@ public class ResultDiagramsTests { var comp = new ResultDiagrams(); var result = (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 0); // force + comp.SetSelected(0, 1); // force comp.SetSelected(1, 0); // Axial force comp.UpdateForce("MN"); comp.Params.Output[0].CollectData(); @@ -41,7 +41,7 @@ public class ResultDiagramsTests { var comp = new ResultDiagrams(); var result = (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 1); // stress + comp.SetSelected(0, 2); // stress comp.UpdateStress("kPa"); comp.Params.Output[0].CollectData(); Assert.Equal("kPa", comp.Message); @@ -52,9 +52,21 @@ public class ResultDiagramsTests { var comp = new ResultDiagrams(); var result = (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + comp.SetSelected(0, 1); // force comp.UpdateMoment("MN·m"); comp.Params.Output[0].CollectData(); Assert.Equal("MN·m", comp.Message); } + + [Fact] + public void UpdateLengthTest() { + var comp = new ResultDiagrams(); + var result = (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); + ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + comp.SetSelected(0, 0); // displacement + comp.UpdateLength("cm"); + comp.Params.Output[0].CollectData(); + Assert.Equal("cm", comp.Message); + } } } diff --git a/GsaGHTests/3_Components/ComponentsTests.cs b/GsaGHTests/3_Components/ComponentsTests.cs index 03f59fd90..e7f8ad299 100644 --- a/GsaGHTests/3_Components/ComponentsTests.cs +++ b/GsaGHTests/3_Components/ComponentsTests.cs @@ -142,7 +142,7 @@ public class ComponentsTests { [InlineData(typeof(BeamForcesAndMoments), "All", "Min |Myz|")] [InlineData(typeof(BeamStrainEnergyDensity), "All", "Min")] [InlineData(typeof(Contour1dResults), "Displacement", "Steel Design")] - [InlineData(typeof(ResultDiagrams), "Force", "Stress")] + [InlineData(typeof(ResultDiagrams), "Displacement", "Stress")] [InlineData(typeof(Contour2dResults), "Displacement", "Footfall")] [InlineData(typeof(Element2dDisplacements), "All", "Min |R|")] [InlineData(typeof(Element2dForcesAndMoments), "kN/m", "kipf/ft", 1)] From 4cba277eb4c6cc63de18876328fef85af6b99aa9 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 15 Apr 2024 13:02:49 +0200 Subject: [PATCH 16/28] GSAGH-484 icon --- .../{SteelUtilisation.png => SteelUtilisations.png} | Bin GsaGH/Properties/Resources.resx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename GsaGH/Properties/Icons/{SteelUtilisation.png => SteelUtilisations.png} (100%) diff --git a/GsaGH/Properties/Icons/SteelUtilisation.png b/GsaGH/Properties/Icons/SteelUtilisations.png similarity index 100% rename from GsaGH/Properties/Icons/SteelUtilisation.png rename to GsaGH/Properties/Icons/SteelUtilisations.png diff --git a/GsaGH/Properties/Resources.resx b/GsaGH/Properties/Resources.resx index f458784a8..ebb03bce2 100644 --- a/GsaGH/Properties/Resources.resx +++ b/GsaGH/Properties/Resources.resx @@ -686,6 +686,6 @@ Icons\AssemblyResults.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - Icons\SteelUtilisation.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Icons\SteelUtilisations.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file From cb97cf08a9075992ad0758a36863b21972030a77 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 15 Apr 2024 13:16:50 +0200 Subject: [PATCH 17/28] GSAGH-484 max/min keys --- .../5_Results/Helpers/ExtremaHelper.cs | 104 +++++++++--------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/GsaGH/Components/5_Results/Helpers/ExtremaHelper.cs b/GsaGH/Components/5_Results/Helpers/ExtremaHelper.cs index f92122304..f43b8fe98 100644 --- a/GsaGH/Components/5_Results/Helpers/ExtremaHelper.cs +++ b/GsaGH/Components/5_Results/Helpers/ExtremaHelper.cs @@ -202,33 +202,33 @@ internal class ExtremaHelper { = new ReadOnlyCollection(new[] { "All", "Max Overall", - "Max LocalCombined", - "Max BucklingCombined", - "Max LocalAxial", - "Max LocalShearU", - "Max LocalShearV", - "Max LocalTorsion", - "Max LocalMajorMoment", - "Max LocalMinorMoment", - "Max MajorBuckling", - "Max MinorBuckling", - "Max LateralTorsionalBuckling", - "Max TorsionalBuckling", - "Max FlexuralBuckling", + "Max |Local|", + "Max |B|", + "Max Ax", + "Max Su", + "Max Sv", + "Max T", + "Max Muu", + "Max Mvv", + "Max FBuu", + "Max FBvv", + "Max LTB", + "Max TB", + "Max FB", "Min Overall", - "Min LocalCombined", - "Min BucklingCombined", - "Min LocalAxial", - "Min LocalShearU", - "Min LocalShearV", - "Min LocalTorsion", - "Min LocalMajorMoment", - "Min LocalMinorMoment", - "Min MajorBuckling", - "Min MinorBuckling", - "Min LateralTorsionalBuckling", - "Min TorsionalBuckling", - "Min FlexuralBuckling", + "Min |Local|", + "Min |B|", + "Min Ax", + "Min Su", + "Min Sv", + "Min T", + "Min Muu", + "Min Mvv", + "Min FBuu", + "Min FBv", + "Min LTB", + "Min TB", + "Min FB", }); internal static U FootfallExtremaKey( @@ -550,33 +550,33 @@ internal class ExtremaHelper { IEntity0dResultSubset resultSet, string key) { return key switch { "Max Overall" => resultSet.Max.Overall, - "Max LocalCombined" => resultSet.Max.LocalCombined, - "Max BucklingCombined" => resultSet.Max.BucklingCombined, - "Max LocalAxial" => resultSet.Max.LocalAxial, - "Max LocalShearU" => resultSet.Max.LocalShearU, - "Max LocalShearV" => resultSet.Max.LocalShearV, - "Max LocalTorsion" => resultSet.Max.LocalTorsion, - "Max LocalMajorMoment" => resultSet.Max.LocalMajorMoment, - "Max LocalMinorMoment" => resultSet.Max.LocalMinorMoment, - "Max MajorBuckling" => resultSet.Max.MajorBuckling, - "Max MinorBuckling" => resultSet.Max.MinorBuckling, - "Max LateralTorsionalBuckling" => resultSet.Max.LateralTorsionalBuckling, - "Max TorsionalBuckling" => resultSet.Max.TorsionalBuckling, - "Max FlexuralBuckling" => resultSet.Max.FlexuralBuckling, + "Max |Local|" => resultSet.Max.LocalCombined, + "Max |B|" => resultSet.Max.BucklingCombined, + "Max Ax" => resultSet.Max.LocalAxial, + "Max Su" => resultSet.Max.LocalShearU, + "Max Sv" => resultSet.Max.LocalShearV, + "Max T" => resultSet.Max.LocalTorsion, + "Max Muu" => resultSet.Max.LocalMajorMoment, + "Max Mvv" => resultSet.Max.LocalMinorMoment, + "Max FBuu" => resultSet.Max.MajorBuckling, + "Max FBvv" => resultSet.Max.MinorBuckling, + "Max LTB" => resultSet.Max.LateralTorsionalBuckling, + "Max TB" => resultSet.Max.TorsionalBuckling, + "Max FB" => resultSet.Max.FlexuralBuckling, "Min Overall" => resultSet.Min.Overall, - "Min LocalCombined" => resultSet.Min.LocalCombined, - "Min BucklingCombined" => resultSet.Min.BucklingCombined, - "Min LocalAxial" => resultSet.Min.LocalAxial, - "Min LocalShearU" => resultSet.Min.LocalShearU, - "Min LocalShearV" => resultSet.Min.LocalShearV, - "Min LocalTorsion" => resultSet.Min.LocalTorsion, - "Min LocalMajorMoment" => resultSet.Min.LocalMajorMoment, - "Min LocalMinorMoment" => resultSet.Min.LocalMinorMoment, - "Min MajorBuckling" => resultSet.Min.MajorBuckling, - "Min MinorBuckling" => resultSet.Min.MinorBuckling, - "Min LateralTorsionalBuckling" => resultSet.Min.LateralTorsionalBuckling, - "Min TorsionalBuckling" => resultSet.Min.TorsionalBuckling, - "Min FlexuralBuckling" => resultSet.Min.FlexuralBuckling, + "Min |Local|" => resultSet.Min.LocalCombined, + "Min |B|" => resultSet.Min.BucklingCombined, + "Min Ax" => resultSet.Min.LocalAxial, + "Min Su" => resultSet.Min.LocalShearU, + "Min Sv" => resultSet.Min.LocalShearV, + "Min T" => resultSet.Min.LocalTorsion, + "Min Muu" => resultSet.Min.LocalMajorMoment, + "Min Mvv" => resultSet.Min.LocalMinorMoment, + "Min FBuu" => resultSet.Min.MajorBuckling, + "Min FBv" => resultSet.Min.MinorBuckling, + "Min LTB" => resultSet.Min.LateralTorsionalBuckling, + "Min TB" => resultSet.Min.TorsionalBuckling, + "Min FB" => resultSet.Min.FlexuralBuckling, _ => throw new ArgumentException("Extrema case not found"), }; } From f69441c49f3c9538e7b9ce743e40f9cc9f38dd12 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 15 Apr 2024 13:32:55 +0200 Subject: [PATCH 18/28] GSAGH-484 unit test --- GsaGHTests/3_Components/ComponentsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GsaGHTests/3_Components/ComponentsTests.cs b/GsaGHTests/3_Components/ComponentsTests.cs index 03f59fd90..556107873 100644 --- a/GsaGHTests/3_Components/ComponentsTests.cs +++ b/GsaGHTests/3_Components/ComponentsTests.cs @@ -159,7 +159,7 @@ public class ComponentsTests { [InlineData(typeof(SelectResult), "AnalysisCase", "Combination")] [InlineData(typeof(SpringReactionForces), "kN", "tf", 1)] [InlineData(typeof(SteelDesignEffectiveLength), "mm", "ft", 1)] - [InlineData(typeof(SteelUtilisations), "All", "Min FlexuralBuckling")] + [InlineData(typeof(SteelUtilisations), "All", "Min FB")] [InlineData(typeof(TotalLoadsAndReactions), "kN", "tf")] [InlineData(typeof(Member1dDisplacements), "All", "Min |R|")] [InlineData(typeof(Member1dForcesAndMoments), "All", "Min |Myz|")] From 94f4d67572c3b32a7964e8a4edb914baf9807807 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 16 Apr 2024 14:19:48 +0200 Subject: [PATCH 19/28] GSAGH-494 removed drop down menu --- GsaGH/Components/6_Display/Preview3dSections.cs | 17 +++-------------- .../6_Display/PreviewDeformed3dSections.cs | 9 ++++++--- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/GsaGH/Components/6_Display/Preview3dSections.cs b/GsaGH/Components/6_Display/Preview3dSections.cs index 837130af3..ed7577521 100644 --- a/GsaGH/Components/6_Display/Preview3dSections.cs +++ b/GsaGH/Components/6_Display/Preview3dSections.cs @@ -8,13 +8,11 @@ using GsaGH.Helpers.Assembly; using GsaGH.Helpers.GH; using GsaGH.Helpers.Graphics; -using GsaGH.Helpers.GsaApi.EnumMappings; using GsaGH.Parameters; using GsaGH.Properties; using OasysGH; using OasysGH.Components; using OasysGH.Units; -using OasysGH.Units.Helpers; using OasysUnits; using LengthUnit = OasysUnits.Units.LengthUnit; @@ -33,24 +31,16 @@ public class Preview3dSections : GH_OasysDropDownComponent { CategoryName.Name(), SubCategoryName.Cat6()) { } protected override void InitialiseDropdowns() { - _spacerDescriptions = new List(new[] { - "Unit", - "Settings", - }); - + // this has been a drop down component before + _spacerDescriptions = new List(); _dropDownItems = new List>(); _selectedItems = new List(); - _dropDownItems.Add(UnitsHelper.GetFilteredAbbreviations(EngineeringUnits.Length)); - _selectedItems.Add(Length.GetAbbreviation(_lengthUnit)); - _isInitialised = true; } public override void SetSelected(int i, int j) { - _selectedItems[i] = _dropDownItems[i][j]; - _lengthUnit = (LengthUnit)UnitsHelper.Parse(typeof(LengthUnit), _selectedItems[i]); - base.UpdateUI(); + // this has been a drop down component before } protected override void RegisterInputParams(GH_InputParamManager pManager) { @@ -157,7 +147,6 @@ public class Preview3dSections : GH_OasysDropDownComponent { } var model = new GsaModel(); - model.Model.UiUnits().LengthLarge = UnitMapping.GetApiUnit(_lengthUnit); if (models != null) { if (models.Count > 0) { model = models.Count > 1 diff --git a/GsaGH/Components/6_Display/PreviewDeformed3dSections.cs b/GsaGH/Components/6_Display/PreviewDeformed3dSections.cs index 9ba076bed..9432b5ce2 100644 --- a/GsaGH/Components/6_Display/PreviewDeformed3dSections.cs +++ b/GsaGH/Components/6_Display/PreviewDeformed3dSections.cs @@ -17,9 +17,6 @@ using Rhino.DocObjects; namespace GsaGH.Components { - /// - /// Component to get Element1D results - /// public class PreviewDeformed3dSections : GH_OasysDropDownComponent { public override Guid ComponentGuid => new Guid("f1a7f1b4-8c34-43c0-a4f0-6dd207cbf48b"); public override GH_Exposure Exposure => GH_Exposure.primary; @@ -39,7 +36,9 @@ public class PreviewDeformed3dSections : GH_OasysDropDownComponent { "Scale"); _isInitialised = true; } + protected override void InitialiseDropdowns() { } + public override bool Read(GH_IReader reader) { _noDigits = reader.GetInt32("noDec"); _maxValue = reader.GetDouble("valMax"); @@ -47,14 +46,18 @@ public class PreviewDeformed3dSections : GH_OasysDropDownComponent { _defScale = reader.GetDouble("val"); return base.Read(reader); } + public void SetMaxMin(double max, double min) { _maxValue = max; _minValue = min; } + public override void SetSelected(int i, int j) { } + public void SetVal(double value) { _defScale = value; } + public override bool Write(GH_IWriter writer) { writer.SetInt32("noDec", _noDigits); writer.SetDouble("valMax", _maxValue); From 6bfbe5c974df4427f5c0d30f683e5111c10d12ef Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 16 Apr 2024 14:25:51 +0200 Subject: [PATCH 20/28] GSAGH-494 cleaning up --- GsaGH/Components/6_Display/Preview3dSections.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/GsaGH/Components/6_Display/Preview3dSections.cs b/GsaGH/Components/6_Display/Preview3dSections.cs index ed7577521..74382a709 100644 --- a/GsaGH/Components/6_Display/Preview3dSections.cs +++ b/GsaGH/Components/6_Display/Preview3dSections.cs @@ -14,7 +14,6 @@ using OasysGH.Components; using OasysGH.Units; using OasysUnits; -using LengthUnit = OasysUnits.Units.LengthUnit; namespace GsaGH.Components { public class Preview3dSections : GH_OasysDropDownComponent { @@ -22,7 +21,6 @@ public class Preview3dSections : GH_OasysDropDownComponent { public override GH_Exposure Exposure => GH_Exposure.primary; public override OasysPluginInfo PluginInfo => GsaGH.PluginInfo.Instance; protected override Bitmap Icon => Resources.Preview3dSections; - private LengthUnit _lengthUnit = DefaultUnits.LengthUnitGeometry; private Section3dPreview _analysisSection3dPreview; private Section3dPreview _designSection3dPreview; @@ -156,7 +154,7 @@ public class Preview3dSections : GH_OasysDropDownComponent { } // Assemble model - var assembly = new ModelAssembly(model, lists, elem1ds, elem2ds, mem1ds, mem2ds, _lengthUnit); + var assembly = new ModelAssembly(model, lists, elem1ds, elem2ds, mem1ds, mem2ds, DefaultUnits.LengthUnitGeometry); GsaAPI.Model previewModel = assembly.GetModel(); var steps = new List { From e284bf90339bf5a4ceb8833d6fb973f7e07f6141 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Wed, 17 Apr 2024 10:13:45 +0200 Subject: [PATCH 21/28] GSAGH-488 displacements for result diagrams --- GsaGH/Components/6_Display/ResultDiagrams.cs | 77 +++++++++++++++---- GsaGH/Helpers/GsaAPI/Mappings.cs | 32 ++++---- .../Parameters/6_Display/GsaVectorDiagram.cs | 1 + .../6_Display/AssemblyResultDiagramsTests.cs | 22 ++---- .../6_Display/ResultDiagramsTests.cs | 30 +++++--- GsaGHTests/3_Components/ComponentsTests.cs | 3 +- 6 files changed, 109 insertions(+), 56 deletions(-) diff --git a/GsaGH/Components/6_Display/ResultDiagrams.cs b/GsaGH/Components/6_Display/ResultDiagrams.cs index a31af688a..7cc3bb945 100644 --- a/GsaGH/Components/6_Display/ResultDiagrams.cs +++ b/GsaGH/Components/6_Display/ResultDiagrams.cs @@ -22,6 +22,7 @@ using OasysUnits; using OasysUnits.Units; using Rhino.Geometry; +using AngleUnit = OasysUnits.Units.AngleUnit; using DiagramType = GsaAPI.DiagramType; using ForceUnit = OasysUnits.Units.ForceUnit; using LengthUnit = OasysUnits.Units.LengthUnit; @@ -29,7 +30,7 @@ namespace GsaGH.Components { /// - /// Component to get Element1D results + /// Component to get Element1D result diagrams /// public class ResultDiagrams : GH_OasysDropDownComponent { public override Guid ComponentGuid => new Guid("7ae7ac36-f811-4c20-911f-ddb119f45644"); @@ -38,6 +39,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { protected override Bitmap Icon => Resources.ResultDiagrams; private string _case = string.Empty; + private AngleUnit _angleUnit = DefaultUnits.AngleUnit; private LengthUnit _lengthUnit = DefaultUnits.LengthUnitResult; private ForceUnit _forceUnit = DefaultUnits.ForceUnit; private MomentUnit _momentUnit = DefaultUnits.MomentUnit; @@ -47,9 +49,13 @@ public class ResultDiagrams : GH_OasysDropDownComponent { "Displays GSA 1D Element Result Diagram", CategoryName.Name(), SubCategoryName.Cat6()) { } public override bool Read(GH_IReader reader) { + string angle = string.Empty; + _angleUnit = reader.TryGetString("angle", ref angle) + ? (AngleUnit)UnitsHelper.Parse(typeof(AngleUnit), angle) + : DefaultUnits.AngleUnit; string length = string.Empty; - _lengthUnit = reader.TryGetString("length", ref length) - ? (LengthUnit)UnitsHelper.Parse(typeof(LengthUnit), length) + _lengthUnit = reader.TryGetString("length", ref length) + ? (LengthUnit)UnitsHelper.Parse(typeof(LengthUnit), length) : DefaultUnits.LengthUnitResult; _forceUnit = (ForceUnit)UnitsHelper.Parse(typeof(ForceUnit), reader.GetString("force")); _momentUnit = (MomentUnit)UnitsHelper.Parse(typeof(MomentUnit), reader.GetString("moment")); @@ -89,6 +95,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { } public override bool Write(GH_IWriter writer) { + writer.SetString("angle", Angle.GetAbbreviation(_angleUnit)); writer.SetString("length", Length.GetAbbreviation(_lengthUnit)); writer.SetString("force", Force.GetAbbreviation(_forceUnit)); writer.SetString("moment", Moment.GetAbbreviation(_momentUnit)); @@ -103,6 +110,8 @@ public class ResultDiagrams : GH_OasysDropDownComponent { Menu_AppendSeparator(menu); + ToolStripMenuItem angleUnitsMenu = GenerateToolStripMenuItem.GetSubMenuItem("Angle", + EngineeringUnits.Angle, Angle.GetAbbreviation(_angleUnit), UpdateAngle); ToolStripMenuItem lengthUnitsMenu = GenerateToolStripMenuItem.GetSubMenuItem("Length", EngineeringUnits.Length, Length.GetAbbreviation(_lengthUnit), UpdateLength); ToolStripMenuItem forceUnitsMenu = GenerateToolStripMenuItem.GetSubMenuItem("Force", @@ -115,6 +124,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { var unitsMenu = new ToolStripMenuItem("Select Units", Resources.ModelUnits); unitsMenu.DropDownItems.AddRange(new ToolStripItem[] { + angleUnitsMenu, lengthUnitsMenu, forceUnitsMenu, momentUnitsMenu, @@ -140,10 +150,10 @@ public class ResultDiagrams : GH_OasysDropDownComponent { "Force", "Stress", }); - _selectedItems.Add(_dropDownItems[0][0]); - _dropDownItems.Add(Mappings._diagramTypeMappingDisplacement.Select(item => item.Description) + _selectedItems.Add(_dropDownItems[0][1]); + _dropDownItems.Add(Mappings._diagramTypeMappingForce.Select(item => item.Description) .ToList()); - _selectedItems.Add(_dropDownItems[1][3]); + _selectedItems.Add(_dropDownItems[1][5]); // Myy _isInitialised = true; } @@ -181,8 +191,10 @@ public class ResultDiagrams : GH_OasysDropDownComponent { Message = Moment.GetAbbreviation(_momentUnit); } else if (IsStress()) { Message = Pressure.GetAbbreviation(_stressUnit); - } else if (IsDisplacement()) { + } else if (IsTranslation()) { Message = Length.GetAbbreviation(_lengthUnit); + } else if (IsRotation()) { + Message = Angle.GetAbbreviation(_angleUnit); } else { Message = "Error"; this.AddRuntimeError("Cannot get unit for selected diagramType!"); @@ -256,8 +268,27 @@ public class ResultDiagrams : GH_OasysDropDownComponent { da.GetData(4, ref color); double lengthScaleFactor = UnitConverter.Convert(1, Length.BaseUnit, lengthUnit); + bool doubleArrow = false; + bool isDisplacement = false; + if (_selectedItems[0] == "Displacement") { + isDisplacement = true; + if (IsTranslation()) { + color = Color.FromArgb(102, 220, 103); + } else { + color = Color.FromArgb(184, 46, 46); + doubleArrow = true; + } + } + foreach (Line item in linesFromModel) { - diagramLines.Add(new GsaDiagramGoo(new GsaLineDiagram(item, lengthScaleFactor, color))); + if (isDisplacement) { + var anchor = new Point3d(item.Start.X, item.Start.Y, item.Start.Z); + // direction is reversed since GsaVectorDiagram has been implemented for reaction forces, needs refactoring! + var direction = new Vector3d(item.Start.X - item.End.X, item.Start.Y - item.End.Y, item.Start.Z - item.End.Z); + diagramLines.Add(new GsaDiagramGoo(new GsaVectorDiagram(anchor, direction, doubleArrow, color))); + } else { + diagramLines.Add(new GsaDiagramGoo(new GsaLineDiagram(item, lengthScaleFactor, color))); + } } bool showAnnotations = true; @@ -276,6 +307,7 @@ public class ResultDiagrams : GH_OasysDropDownComponent { PostHog.Diagram("Result", result.CaseType, _selectedItems[0], type.ToString(), Parameters.EntityType.Element); } + protected override void UpdateUIFromSelectedItems() { if (_dropDownItems[0].Count == 2) { _dropDownItems[0].Insert(0, "Displacement"); @@ -338,8 +370,10 @@ public class ResultDiagrams : GH_OasysDropDownComponent { unitScaleFactor = UnitConverter.Convert(1, Pressure.BaseUnit, _stressUnit); } else if (IsMoment()) { unitScaleFactor = UnitConverter.Convert(1, Moment.BaseUnit, _momentUnit); - }else if (IsDisplacement()) { + } else if (IsTranslation()) { unitScaleFactor = UnitConverter.Convert(1, Length.BaseUnit, _lengthUnit); + } else if (IsRotation()) { + unitScaleFactor = UnitConverter.Convert(1, Angle.BaseUnit, _angleUnit); } else { this.AddRuntimeError("Not supported diagramType!"); } @@ -398,23 +432,34 @@ public class ResultDiagrams : GH_OasysDropDownComponent { return isStress; } - private bool IsDisplacement() { - bool isDisplacement = false; + private bool IsTranslation() { + bool isTranslation = false; DiagramType type = GetDiagramType(); switch (type) { case DiagramType.TranslationUx: case DiagramType.TranslationUy: case DiagramType.TranslationUz: case DiagramType.ResolvedTranslationU: + isTranslation = true; + break; + } + + return isTranslation; + } + + private bool IsRotation() { + bool isRotation = false; + DiagramType type = GetDiagramType(); + switch (type) { case DiagramType.RotationRxx: case DiagramType.RotationRyy: case DiagramType.RotationRzz: case DiagramType.ResolvedRotationR: - isDisplacement = true; + isRotation = true; break; } - return isDisplacement; + return isRotation; } private DiagramType GetDiagramType() { @@ -463,5 +508,11 @@ public class ResultDiagrams : GH_OasysDropDownComponent { ExpirePreview(true); base.UpdateUI(); } + + internal void UpdateAngle(string unit) { + _angleUnit = (AngleUnit)UnitsHelper.Parse(typeof(AngleUnit), unit); + ExpirePreview(true); + base.UpdateUI(); + } } } diff --git a/GsaGH/Helpers/GsaAPI/Mappings.cs b/GsaGH/Helpers/GsaAPI/Mappings.cs index aae500105..3895390f6 100644 --- a/GsaGH/Helpers/GsaAPI/Mappings.cs +++ b/GsaGH/Helpers/GsaAPI/Mappings.cs @@ -213,22 +213,22 @@ internal static class Mappings { internal static readonly IList _diagramTypeMappingDisplacement = new List() { - new DiagramTypeMapping("Translation Ux", DiagramType.TranslationUx, - ApiDiagramType.TranslationUx), - new DiagramTypeMapping("Translation Uy", DiagramType.TranslationUy, - ApiDiagramType.TranslationUy), - new DiagramTypeMapping("Translation Uz", DiagramType.TranslationUz, - ApiDiagramType.TranslationUz), - new DiagramTypeMapping("Res. Translation U", DiagramType.ResolvedTranslationU, - ApiDiagramType.ResolvedTranslationU), - new DiagramTypeMapping("Rotation Rxx", DiagramType.RotationRxx, - ApiDiagramType.RotationRxx), - new DiagramTypeMapping("Rotation Ryy", DiagramType.RotationRyy, - ApiDiagramType.RotationRyy), - new DiagramTypeMapping("Rotation Rzz", DiagramType.RotationRxx, - ApiDiagramType.RotationRzz), - new DiagramTypeMapping("Res. Rotation R", DiagramType.ResolvedRotationR, - ApiDiagramType.ResolvedRotationR), + new DiagramTypeMapping("Elem. Trans. Ux", DiagramType.TranslationUx, + ApiDiagramType.TranslationUx), + new DiagramTypeMapping("Elem. Trans. Uy", DiagramType.TranslationUy, + ApiDiagramType.TranslationUy), + new DiagramTypeMapping("Elem. Trans. Uz", DiagramType.TranslationUz, + ApiDiagramType.TranslationUz), + new DiagramTypeMapping("Res. Trans. U", DiagramType.ResolvedTranslationU, + ApiDiagramType.ResolvedTranslationU), + new DiagramTypeMapping("Elem. Rot. Rxx", DiagramType.RotationRxx, + ApiDiagramType.RotationRxx), + new DiagramTypeMapping("Elem. Rot. Ryy", DiagramType.RotationRyy, + ApiDiagramType.RotationRyy), + new DiagramTypeMapping("Elem. Rot. Rzz", DiagramType.RotationRxx, + ApiDiagramType.RotationRzz), + new DiagramTypeMapping("Res. Rot. R", DiagramType.ResolvedRotationR, + ApiDiagramType.ResolvedRotationR), }; internal static readonly IList _diagramTypeMappingAssemblyDisplacement diff --git a/GsaGH/Parameters/6_Display/GsaVectorDiagram.cs b/GsaGH/Parameters/6_Display/GsaVectorDiagram.cs index 64d78c96d..c9787467e 100644 --- a/GsaGH/Parameters/6_Display/GsaVectorDiagram.cs +++ b/GsaGH/Parameters/6_Display/GsaVectorDiagram.cs @@ -28,6 +28,7 @@ public override BoundingBox Boundingbox internal GsaVectorDiagram(Point3d anchor, Vector3d direction, bool doubleArrow, Color color) { AnchorPoint = anchor; Direction = direction; + _doubleArrow = doubleArrow; DisplayLine = CreateReactionForceLine(anchor, direction); Value = direction; diff --git a/GsaGHTests/3_Components/6_Display/AssemblyResultDiagramsTests.cs b/GsaGHTests/3_Components/6_Display/AssemblyResultDiagramsTests.cs index 650f4d463..f1cc2e026 100644 --- a/GsaGHTests/3_Components/6_Display/AssemblyResultDiagramsTests.cs +++ b/GsaGHTests/3_Components/6_Display/AssemblyResultDiagramsTests.cs @@ -11,17 +11,16 @@ namespace GsaGHTests.Components.Display { public class AssemblyResultDiagramsTests { [Fact] public void UpdateForceTest() { - var comp = new ResultDiagrams(); + var comp = new AssemblyResultDiagrams(); GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.AssemblyByStorey, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 1); // force + comp.SetSelected(0, 3); // Force comp.SetSelected(1, 0); // Axial force comp.UpdateForce("MN"); comp.Params.Output[0].CollectData(); Assert.Equal("MN", comp.Message); } - [Fact] public void UpdateLengthTest() { var comp = new AssemblyResultDiagrams(); @@ -35,23 +34,14 @@ public class AssemblyResultDiagramsTests { [Fact] public void UpdateMomentTest() { - var comp = new ResultDiagrams(); + var comp = new AssemblyResultDiagrams(); GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.AssemblyByStorey, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 1); - comp.UpdateMoment("MN·m"); + comp.SetSelected(0, 3); // Force + comp.SetSelected(1, 4); // Moment Myy + comp.UpdateMoment("MN·m"); comp.Params.Output[0].CollectData(); Assert.Equal("MN·m", comp.Message); } - [Fact] - public void UpdateStressTest() { - var comp = new ResultDiagrams(); - GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.AssemblyByStorey, 1); - ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 2); - comp.UpdateStress("mPa"); - comp.Params.Output[0].CollectData(); - Assert.Equal("mPa", comp.Message); - } } } diff --git a/GsaGHTests/3_Components/6_Display/ResultDiagramsTests.cs b/GsaGHTests/3_Components/6_Display/ResultDiagramsTests.cs index edd68287e..0b3fcb7ec 100644 --- a/GsaGHTests/3_Components/6_Display/ResultDiagramsTests.cs +++ b/GsaGHTests/3_Components/6_Display/ResultDiagramsTests.cs @@ -13,7 +13,7 @@ namespace GsaGHTests.Components.Display { public class ResultDiagramsTests { [Fact] public void CombinationCaseWithMultiplePermutationsMessageTests() { - var caseResult = (GsaResult)GsaResultTests.CombinationCaseResult(GsaFile.SteelDesignComplex, 2, new List() { 1, 2, 3, }); + GsaResult caseResult = GsaResultTests.CombinationCaseResult(GsaFile.SteelDesignComplex, 2, new List() { 1, 2, 3, }); var comp = new ResultDiagrams(); ComponentTestHelper.SetInput(comp, new GsaResultGoo(caseResult)); @@ -27,9 +27,9 @@ public class ResultDiagramsTests { [Fact] public void UpdateForceTest() { var comp = new ResultDiagrams(); - var result = (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); + GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 1); // force + comp.SetSelected(0, 1); // Force comp.SetSelected(1, 0); // Axial force comp.UpdateForce("MN"); comp.Params.Output[0].CollectData(); @@ -39,9 +39,9 @@ public class ResultDiagramsTests { [Fact] public void UpdateStressTest() { var comp = new ResultDiagrams(); - var result = (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); + GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 2); // stress + comp.SetSelected(0, 2); // Stress comp.UpdateStress("kPa"); comp.Params.Output[0].CollectData(); Assert.Equal("kPa", comp.Message); @@ -50,9 +50,9 @@ public class ResultDiagramsTests { [Fact] public void UpdateMomentTest() { var comp = new ResultDiagrams(); - var result = (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); + GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 1); // force + comp.SetSelected(0, 1); // Force comp.UpdateMoment("MN·m"); comp.Params.Output[0].CollectData(); Assert.Equal("MN·m", comp.Message); @@ -61,12 +61,24 @@ public class ResultDiagramsTests { [Fact] public void UpdateLengthTest() { var comp = new ResultDiagrams(); - var result = (GsaResult)GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); + GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); - comp.SetSelected(0, 0); // displacement + comp.SetSelected(0, 0); // Displacement comp.UpdateLength("cm"); comp.Params.Output[0].CollectData(); Assert.Equal("cm", comp.Message); } + + [Fact] + public void UpdateAngleTest() { + var comp = new ResultDiagrams(); + GsaResult result = GsaResultTests.AnalysisCaseResult(GsaFile.SteelDesignComplex, 1); + ComponentTestHelper.SetInput(comp, new GsaResultGoo(result)); + comp.SetSelected(0, 0); // Displacement + comp.SetSelected(1, 4); + comp.UpdateAngle("rad"); + comp.Params.Output[0].CollectData(); + Assert.Equal("rad", comp.Message); + } } } diff --git a/GsaGHTests/3_Components/ComponentsTests.cs b/GsaGHTests/3_Components/ComponentsTests.cs index 4971f6e93..21d9a6bfe 100644 --- a/GsaGHTests/3_Components/ComponentsTests.cs +++ b/GsaGHTests/3_Components/ComponentsTests.cs @@ -6,7 +6,6 @@ namespace GsaGHTests.Components { [Collection("GrasshopperFixture collection")] public class ComponentsTests { - [Theory] // Model [InlineData(typeof(CreateList), 1)] @@ -142,7 +141,7 @@ public class ComponentsTests { [InlineData(typeof(BeamForcesAndMoments), "All", "Min |Myz|")] [InlineData(typeof(BeamStrainEnergyDensity), "All", "Min")] [InlineData(typeof(Contour1dResults), "Displacement", "Steel Design")] - [InlineData(typeof(ResultDiagrams), "Displacement", "Stress")] + [InlineData(typeof(ResultDiagrams), "Force", "Stress")] [InlineData(typeof(Contour2dResults), "Displacement", "Footfall")] [InlineData(typeof(Element2dDisplacements), "All", "Min |R|")] [InlineData(typeof(Element2dForcesAndMoments), "kN/m", "kipf/ft", 1)] From fbb8b428b1056ce83ec208a34fe2cd1aa56dbcc4 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Tue, 30 Apr 2024 11:53:48 +0200 Subject: [PATCH 22/28] GSAGH-482 grid loading with reference polylines --- GsaGH/Components/0_Model/GetModelLoads.cs | 38 ++-- .../Components/3_Loads/CreateGridAreaLoad.cs | 2 +- .../Components/3_Loads/CreateGridLineLoad.cs | 2 +- .../Components/6_Display/AnnotateDetailed.cs | 2 +- GsaGH/Helpers/Assembly/Loads/Loads.cs | 8 + GsaGH/Helpers/GH/RhinoConversions.cs | 2 +- GsaGH/Helpers/MergeModels.cs | 31 ++-- GsaGH/Parameters/2_Geometry/GsaMember3d.cs | 1 + GsaGH/Parameters/3_Loads/GridLoadHelper.cs | 18 +- GsaGH/Parameters/3_Loads/GsaGridAreaLoad.cs | 12 ++ GsaGH/Parameters/3_Loads/GsaGridLineLoad.cs | 12 ++ GsaGH/Parameters/3_Loads/GsaLoadFactory.cs | 163 ++++++++++-------- .../2_Geometry/GsaElement2dTest.cs | 1 + .../2_Geometry/GsaMember2dTest.cs | 6 +- 14 files changed, 172 insertions(+), 126 deletions(-) diff --git a/GsaGH/Components/0_Model/GetModelLoads.cs b/GsaGH/Components/0_Model/GetModelLoads.cs index 63059d319..390c307fc 100644 --- a/GsaGH/Components/0_Model/GetModelLoads.cs +++ b/GsaGH/Components/0_Model/GetModelLoads.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Drawing; using System.Linq; using Grasshopper.Kernel; +using GsaAPI; using GsaGH.Helpers.GH; using GsaGH.Parameters; using GsaGH.Properties; @@ -92,29 +92,21 @@ public class GetModelLoads : GH_OasysDropDownComponent { GsaModelGoo modelGoo = null; da.GetData(0, ref modelGoo); - GsaAPI.Model model = modelGoo.Value.Model; - ReadOnlyDictionary loadCases = model.LoadCases(); - List cases = GsaLoadFactory.CreateLoadCasesFromApi(loadCases); - List gravity = GsaLoadFactory.CreateGravityLoadsFromApi(model.GravityLoads(), loadCases); - List node = GsaLoadFactory.CreateNodeLoadsFromApi(model, loadCases); - List beam = GsaLoadFactory.CreateBeamLoadsFromApi(model.BeamLoads(), loadCases); - List beamThermal = GsaLoadFactory.CreateBeamThermalLoadsFromApi(model.BeamThermalLoads(), loadCases); - List face = GsaLoadFactory.CreateFaceLoadsFromApi(model.FaceLoads(), loadCases); - List faceThermal = GsaLoadFactory.CreateFaceThermalLoadsFromApi(model.FaceThermalLoads(), loadCases); - - IReadOnlyDictionary srfDict = model.GridSurfaces(); - IReadOnlyDictionary plnDict = model.GridPlanes(); - IReadOnlyDictionary axDict = model.Axes(); - List point = GsaLoadFactory.CreateGridPointLoadsFromApi( - model.GridPointLoads(), srfDict, plnDict, axDict, loadCases, _lengthUnit); - List line = GsaLoadFactory.CreateGridLineLoadsFromApi( - model.GridLineLoads(), srfDict, plnDict, axDict, loadCases, _lengthUnit); - List area = GsaLoadFactory.CreateGridAreaLoadsFromApi( - model.GridAreaLoads(), srfDict, plnDict, axDict, loadCases, _lengthUnit); - + Model model = modelGoo.Value.Model; + List cases = GsaLoadFactory.CreateLoadCasesFromApi(model); + List gravity = GsaLoadFactory.CreateGravityLoadsFromApi(model); + List node = GsaLoadFactory.CreateNodeLoadsFromApi(model); + List beam = GsaLoadFactory.CreateBeamLoadsFromApi(model); + List beamThermal = GsaLoadFactory.CreateBeamThermalLoadsFromApi(model); + List face = GsaLoadFactory.CreateFaceLoadsFromApi(model); + List faceThermal = GsaLoadFactory.CreateFaceThermalLoadsFromApi(model); + List point = GsaLoadFactory.CreateGridPointLoadsFromApi(model, _lengthUnit); + List line = GsaLoadFactory.CreateGridLineLoadsFromApi(model, _lengthUnit); + List area = GsaLoadFactory.CreateGridAreaLoadsFromApi(model, _lengthUnit); + + IReadOnlyDictionary srfDict = model.GridSurfaces(); var gps = srfDict.Keys.Select(key - => new GsaGridPlaneSurfaceGoo(GsaLoadFactory.CreateGridPlaneSurfaceFromApi(srfDict, plnDict, axDict, key, - _lengthUnit))).ToList(); + => new GsaGridPlaneSurfaceGoo(GsaLoadFactory.CreateGridPlaneSurfaceFromApi(model, key, _lengthUnit))).ToList(); da.SetDataList(0, cases); da.SetDataList(1, gravity); diff --git a/GsaGH/Components/3_Loads/CreateGridAreaLoad.cs b/GsaGH/Components/3_Loads/CreateGridAreaLoad.cs index d3b539227..09a5cf549 100644 --- a/GsaGH/Components/3_Loads/CreateGridAreaLoad.cs +++ b/GsaGH/Components/3_Loads/CreateGridAreaLoad.cs @@ -204,7 +204,7 @@ public class CreateGridAreaLoad : GH_OasysDropDownComponent { Curve[] edges = Curve.JoinCurves(edgeSegments); Curve curve = edges[0]; - if (curve.TryGetPolyline(out Polyline polyline)) { + if (curve.TryGetPolyline(out Rhino.Geometry.Polyline polyline)) { var ctrlPts = new Point3dList(polyline); gridareaload.Points = ctrlPts; diff --git a/GsaGH/Components/3_Loads/CreateGridLineLoad.cs b/GsaGH/Components/3_Loads/CreateGridLineLoad.cs index dec580d6c..f0e44ab49 100644 --- a/GsaGH/Components/3_Loads/CreateGridLineLoad.cs +++ b/GsaGH/Components/3_Loads/CreateGridLineLoad.cs @@ -199,7 +199,7 @@ public class CreateGridLineLoad : GH_OasysDropDownComponent { Curve curve = null; GH_Convert.ToCurve(ghCurve, ref curve, GH_Conversion.Both); - if (curve.TryGetPolyline(out Polyline ln)) { + if (curve.TryGetPolyline(out Rhino.Geometry.Polyline ln)) { var controlPoints = new Point3dList(ln); gridlineload.Points = controlPoints; diff --git a/GsaGH/Components/6_Display/AnnotateDetailed.cs b/GsaGH/Components/6_Display/AnnotateDetailed.cs index 5314f1083..678ea9c42 100644 --- a/GsaGH/Components/6_Display/AnnotateDetailed.cs +++ b/GsaGH/Components/6_Display/AnnotateDetailed.cs @@ -229,7 +229,7 @@ public class AnnotateDetailed : GH_OasysDropDownComponent { break; case GsaMember2dGoo m2d: - m2d.Value.PolyCurve.TryGetPolyline(out Polyline pl); + m2d.Value.PolyCurve.TryGetPolyline(out Rhino.Geometry.Polyline pl); if (_text3d) { Plane.FitPlaneToPoints(pl, out Plane pln); pln.Origin = pl.CenterPoint(); diff --git a/GsaGH/Helpers/Assembly/Loads/Loads.cs b/GsaGH/Helpers/Assembly/Loads/Loads.cs index 4bdbe1459..2025db819 100644 --- a/GsaGH/Helpers/Assembly/Loads/Loads.cs +++ b/GsaGH/Helpers/Assembly/Loads/Loads.cs @@ -237,6 +237,10 @@ internal partial class ModelAssembly { $"({Length.GetAbbreviation(_unit)})"; } + if(load.ApiPolyline != null) { + _model.AddPolyline(load.ApiPolyline); + } + if (load.GridPlaneSurface == null) { _gridAreaLoads.Add(load.ApiLoad); return; @@ -265,6 +269,10 @@ internal partial class ModelAssembly { $"({Length.GetAbbreviation(_unit)})"; } + if (load.ApiPolyline != null) { + _model.AddPolyline(load.ApiPolyline); + } + GsaGridPlaneSurface gridplnsrf = load.GridPlaneSurface; if (gridplnsrf.GridPlane != null) { diff --git a/GsaGH/Helpers/GH/RhinoConversions.cs b/GsaGH/Helpers/GH/RhinoConversions.cs index ec45e4275..09a91de36 100644 --- a/GsaGH/Helpers/GH/RhinoConversions.cs +++ b/GsaGH/Helpers/GH/RhinoConversions.cs @@ -706,7 +706,7 @@ public static edges.AddRange(inner); Point3dList ctrlPts; - if (edges[0].TryGetPolyline(out Polyline tempCrv)) { + if (edges[0].TryGetPolyline(out Rhino.Geometry.Polyline tempCrv)) { ctrlPts = new Point3dList(tempCrv); } else { Tuple> convertBadSrf diff --git a/GsaGH/Helpers/MergeModels.cs b/GsaGH/Helpers/MergeModels.cs index 90e8d8b51..c37eb5e72 100644 --- a/GsaGH/Helpers/MergeModels.cs +++ b/GsaGH/Helpers/MergeModels.cs @@ -133,37 +133,28 @@ public class MergeModels { }).ToList(); var gooloads = new List(); - ReadOnlyDictionary loadCases = appendModel.Model.LoadCases(); - gooloads.AddRange(GsaLoadFactory.CreateGravityLoadsFromApi(appendModel.Model.GravityLoads(), loadCases)); - gooloads.AddRange(GsaLoadFactory.CreateNodeLoadsFromApi(appendModel.Model, loadCases)); - gooloads.AddRange(GsaLoadFactory.CreateBeamLoadsFromApi(appendModel.Model.BeamLoads(), loadCases)); - gooloads.AddRange(GsaLoadFactory.CreateBeamThermalLoadsFromApi(appendModel.Model.BeamThermalLoads(), loadCases)); - gooloads.AddRange(GsaLoadFactory.CreateFaceLoadsFromApi(appendModel.Model.FaceLoads(), loadCases)); - gooloads.AddRange(GsaLoadFactory.CreateFaceThermalLoadsFromApi(appendModel.Model.FaceThermalLoads(), loadCases)); + gooloads.AddRange(GsaLoadFactory.CreateGravityLoadsFromApi(appendModel.Model)); + gooloads.AddRange(GsaLoadFactory.CreateNodeLoadsFromApi(appendModel.Model)); + gooloads.AddRange(GsaLoadFactory.CreateBeamLoadsFromApi(appendModel.Model)); + gooloads.AddRange(GsaLoadFactory.CreateBeamThermalLoadsFromApi(appendModel.Model)); + gooloads.AddRange(GsaLoadFactory.CreateFaceLoadsFromApi(appendModel.Model)); + gooloads.AddRange(GsaLoadFactory.CreateFaceThermalLoadsFromApi(appendModel.Model)); IReadOnlyDictionary srfDict = appendModel.Model.GridSurfaces(); IReadOnlyDictionary plnDict = appendModel.Model.GridPlanes(); - gooloads.AddRange(GsaLoadFactory.CreateGridPointLoadsFromApi( - appendModel.Model.GridPointLoads(), srfDict, plnDict, appendModel.ApiAxis, loadCases, - LengthUnit.Meter)); - gooloads.AddRange(GsaLoadFactory.CreateGridLineLoadsFromApi( - appendModel.Model.GridLineLoads(), srfDict, plnDict, appendModel.ApiAxis, loadCases, - LengthUnit.Meter)); - gooloads.AddRange(GsaLoadFactory.CreateGridAreaLoadsFromApi( - appendModel.Model.GridAreaLoads(), srfDict, plnDict, appendModel.ApiAxis, loadCases, - LengthUnit.Meter)); + gooloads.AddRange(GsaLoadFactory.CreateGridPointLoadsFromApi(appendModel.Model, LengthUnit.Meter)); + gooloads.AddRange(GsaLoadFactory.CreateGridLineLoadsFromApi(appendModel.Model, LengthUnit.Meter)); + gooloads.AddRange(GsaLoadFactory.CreateGridAreaLoadsFromApi(appendModel.Model, LengthUnit.Meter)); var loads = gooloads.Select(n => n.Value).ToList(); var gpsgoo = srfDict.Keys.Select(key => new GsaGridPlaneSurfaceGoo( - GsaLoadFactory.CreateGridPlaneSurfaceFromApi( - srfDict, plnDict, appendModel.ApiAxis, key, LengthUnit.Meter))).ToList(); + GsaLoadFactory.CreateGridPlaneSurfaceFromApi(appendModel.Model, key, LengthUnit.Meter))).ToList(); var gps = gpsgoo.Select(n => n.Value).ToList(); List lists = appendModel.GetLists(); List gridLines = appendModel.GetGridLines(); - var gsaLoadCases = - GsaLoadFactory.CreateLoadCasesFromApi(loadCases).Select(n => n.Value).ToList(); + var gsaLoadCases = GsaLoadFactory.CreateLoadCasesFromApi(appendModel.Model).Select(n => n.Value).ToList(); var designTasks = new List(); foreach (SteelDesignTask designTask in appendModel.Model.SteelDesignTasks().Values) { var kvp = new KeyValuePair(0, designTask); diff --git a/GsaGH/Parameters/2_Geometry/GsaMember3d.cs b/GsaGH/Parameters/2_Geometry/GsaMember3d.cs index 4907f2bf1..a39184685 100644 --- a/GsaGH/Parameters/2_Geometry/GsaMember3d.cs +++ b/GsaGH/Parameters/2_Geometry/GsaMember3d.cs @@ -12,6 +12,7 @@ using Rhino.Geometry.Collections; using LengthUnit = OasysUnits.Units.LengthUnit; using Line = Rhino.Geometry.Line; +using Polyline = Rhino.Geometry.Polyline; namespace GsaGH.Parameters { /// diff --git a/GsaGH/Parameters/3_Loads/GridLoadHelper.cs b/GsaGH/Parameters/3_Loads/GridLoadHelper.cs index 7fb455c00..9a00c57d2 100644 --- a/GsaGH/Parameters/3_Loads/GridLoadHelper.cs +++ b/GsaGH/Parameters/3_Loads/GridLoadHelper.cs @@ -1,4 +1,5 @@ -using GsaAPI; +using System.Collections.Generic; +using GsaAPI; using OasysUnits; using Rhino.Collections; using Rhino.Geometry; @@ -27,7 +28,7 @@ internal static class GridLoadHelper { return ClearDefGetUnit(definition).def; } - internal static Point3dList ConvertPoints(string definition, LengthUnit desiredUnit, Plane localPlane) { + internal static Point3dList ConvertPoints(string definition, LengthUnit desiredUnit, Plane localPlane) { (LengthUnit lengthUnit, string def) = ClearDefGetUnit(definition); var points = new Point3dList(); string[] pts = def.Split(')'); @@ -45,6 +46,19 @@ internal static class GridLoadHelper { return points; } + internal static Point3dList ConvertPoints(List definition, LengthUnit desiredUnit, Plane localPlane) { + var map = Transform.ChangeBasis(localPlane, Plane.WorldXY); + var points = new Point3dList(); + foreach (Vector2 vector in definition) { + var x = new Length(vector.X, LengthUnit.Meter); + var y = new Length(vector.Y, LengthUnit.Meter); + var point = new Point3d(x.As(desiredUnit), y.As(desiredUnit), 0); + point.Transform(map); + points.Add(point); + } + return points; + } + private static (LengthUnit lengthUnit, string def) ClearDefGetUnit(string definition) { LengthUnit lengthUnit = LengthUnit.Meter; if (definition.EndsWith("(mm)")) { diff --git a/GsaGH/Parameters/3_Loads/GsaGridAreaLoad.cs b/GsaGH/Parameters/3_Loads/GsaGridAreaLoad.cs index 95e51001d..ecce11d4c 100644 --- a/GsaGH/Parameters/3_Loads/GsaGridAreaLoad.cs +++ b/GsaGH/Parameters/3_Loads/GsaGridAreaLoad.cs @@ -6,6 +6,7 @@ namespace GsaGH.Parameters { public class GsaGridAreaLoad : IGsaGridLoad { public GridAreaLoad ApiLoad { get; set; } = new GridAreaLoad(); + public Polyline ApiPolyline { get; internal set; } public GsaGridPlaneSurface GridPlaneSurface { get; set; } = new GsaGridPlaneSurface(); public GsaLoadCase LoadCase { get; set; } public ReferenceType ReferenceType => GridPlaneSurface._referenceType; @@ -44,11 +45,22 @@ public class GsaGridAreaLoad : IGsaGridLoad { Points = Points, }; + if(ApiPolyline != null) { + dup.ApiPolyline = DuplicateApiPolyline(); + } + if (LoadCase != null) { dup.LoadCase = LoadCase; } return dup; } + + private Polyline DuplicateApiPolyline() { + var polyline = new Polyline(ApiPolyline.Points) { + Name = ApiPolyline.Name + }; + return polyline; + } } } diff --git a/GsaGH/Parameters/3_Loads/GsaGridLineLoad.cs b/GsaGH/Parameters/3_Loads/GsaGridLineLoad.cs index 79954bed6..3e51ad7ac 100644 --- a/GsaGH/Parameters/3_Loads/GsaGridLineLoad.cs +++ b/GsaGH/Parameters/3_Loads/GsaGridLineLoad.cs @@ -6,6 +6,7 @@ namespace GsaGH.Parameters { public class GsaGridLineLoad : IGsaGridLoad { public GridLineLoad ApiLoad { get; set; } = new GridLineLoad(); + public Polyline ApiPolyline { get; internal set; } public GsaGridPlaneSurface GridPlaneSurface { get; set; } = new GsaGridPlaneSurface(); public GsaLoadCase LoadCase { get; set; } public ReferenceType ReferenceType => GridPlaneSurface._referenceType; @@ -45,11 +46,22 @@ public class GsaGridLineLoad : IGsaGridLoad { Points = Points, }; + if (ApiPolyline != null) { + dup.ApiPolyline = DuplicateApiPolyline(); + } + if (LoadCase != null) { dup.LoadCase = LoadCase; } return dup; } + + private Polyline DuplicateApiPolyline() { + var polyline = new Polyline(ApiPolyline.Points) { + Name = ApiPolyline.Name + }; + return polyline; + } } } diff --git a/GsaGH/Parameters/3_Loads/GsaLoadFactory.cs b/GsaGH/Parameters/3_Loads/GsaLoadFactory.cs index 46be1e587..90b68d24b 100644 --- a/GsaGH/Parameters/3_Loads/GsaLoadFactory.cs +++ b/GsaGH/Parameters/3_Loads/GsaLoadFactory.cs @@ -14,9 +14,11 @@ public static class GsaLoadFactory { /// Method to import Load Cases from a GSA model. /// Will output a list of GsaLoadCase. /// - /// + /// /// - internal static List CreateLoadCasesFromApi(ReadOnlyDictionary loadCases) { + internal static List CreateLoadCasesFromApi(Model model) { + ReadOnlyDictionary loadCases = model.LoadCases(); + var cases = new List(); foreach (KeyValuePair kvp in loadCases) { cases.Add(new GsaLoadCaseGoo(new GsaLoadCase(kvp.Key, loadCases))); @@ -29,11 +31,12 @@ public static class GsaLoadFactory { /// Method to import Beam Loads from a GSA model. /// Will output a list of GsaLoads. /// - /// Collection of beams loads to be imported - /// + /// /// - internal static List CreateBeamLoadsFromApi( - ReadOnlyCollection beamLoads, ReadOnlyDictionary loadCases) { + internal static List CreateBeamLoadsFromApi(Model model) { + ReadOnlyCollection beamLoads = model.BeamLoads(); + ReadOnlyDictionary loadCases = model.LoadCases(); + var loads = new List(); foreach (BeamLoad apiLoad in beamLoads) { var load = new GsaBeamLoad { @@ -51,11 +54,12 @@ public static class GsaLoadFactory { /// Method to import Beam Thermal Loads from a GSA model. /// Will output a list of GsaLoads. /// - /// Collection of beam thermal loads to be imported - /// + /// /// - internal static List CreateBeamThermalLoadsFromApi( - ReadOnlyCollection beamThermalLoads, ReadOnlyDictionary loadCases) { + internal static List CreateBeamThermalLoadsFromApi(Model model) { + ReadOnlyCollection beamThermalLoads = model.BeamThermalLoads(); + ReadOnlyDictionary loadCases = model.LoadCases(); + var loads = new List(); foreach (BeamThermalLoad apiLoad in beamThermalLoads) { var load = new GsaBeamThermalLoad { @@ -73,11 +77,12 @@ public static class GsaLoadFactory { /// Method to import Face Loads from a GSA model. /// Will output a list of GsaLoads. /// - /// Collection of Face loads to be imported - /// + /// /// - internal static List CreateFaceLoadsFromApi(ReadOnlyCollection faceLoads, - ReadOnlyDictionary loadCases) { + internal static List CreateFaceLoadsFromApi(Model model) { + ReadOnlyCollection faceLoads = model.FaceLoads(); + ReadOnlyDictionary loadCases = model.LoadCases(); + var loads = new List(); foreach (FaceLoad apiLoad in faceLoads) { var load = new GsaFaceLoad { @@ -95,11 +100,12 @@ public static class GsaLoadFactory { /// Method to import Face Thermal Loads from a GSA model. /// Will output a list of GsaLoads. /// - /// Collection of Face Thermal loads to be imported - /// + /// /// - internal static List CreateFaceThermalLoadsFromApi( - ReadOnlyCollection faceThermalLoads, ReadOnlyDictionary loadCases) { + internal static List CreateFaceThermalLoadsFromApi(Model model) { + ReadOnlyCollection faceThermalLoads = model.FaceThermalLoads(); + ReadOnlyDictionary loadCases = model.LoadCases(); + var loads = new List(); foreach (FaceThermalLoad apiLoad in faceThermalLoads) { var load = new GsaFaceThermalLoad { @@ -117,11 +123,12 @@ public static class GsaLoadFactory { /// Method to import Gravity Loads from a GSA model. /// Will output a list of GsaLoadsGoo. /// - /// Collection of gravity loads to import - /// + /// /// - internal static List CreateGravityLoadsFromApi( - ReadOnlyCollection gravityLoads, ReadOnlyDictionary loadCases) { + internal static List CreateGravityLoadsFromApi(Model model) { + ReadOnlyCollection gravityLoads = model.GravityLoads(); + ReadOnlyDictionary loadCases = model.LoadCases(); + var loads = new List(); foreach (GravityLoad apiLoad in gravityLoads) { var load = new GsaGravityLoad { @@ -139,30 +146,32 @@ public static class GsaLoadFactory { /// Method to import Grid Area Loads from a GSA model. /// Will output a list of GsaLoads. /// - /// Collection of Grid Area loads to be imported - /// Grid Surface Dictionary - /// Grid Plane Dictionary - /// Axes Dictionary - /// + /// /// /// - internal static List CreateGridAreaLoadsFromApi( - ReadOnlyCollection areaLoads, IReadOnlyDictionary srfDict, - IReadOnlyDictionary plnDict, IReadOnlyDictionary axDict, - ReadOnlyDictionary loadCases, LengthUnit unit) { + internal static List CreateGridAreaLoadsFromApi(Model model, LengthUnit unit) { + ReadOnlyCollection areaLoads = model.GridAreaLoads(); + IReadOnlyDictionary srfDict = model.GridSurfaces(); + IReadOnlyDictionary plnDict = model.GridPlanes(); + IReadOnlyDictionary axDict = model.Axes(); + ReadOnlyDictionary loadCases = model.LoadCases(); + ReadOnlyDictionary polylines = model.Polylines(); + var loads = new List(); foreach (GridAreaLoad gridAreaLoad in areaLoads) { var load = new GsaGridAreaLoad { ApiLoad = gridAreaLoad, - GridPlaneSurface - = CreateGridPlaneSurfaceFromApi(srfDict, plnDict, axDict, gridAreaLoad.GridSurface, unit) + GridPlaneSurface = CreateGridPlaneSurfaceFromApi(model, gridAreaLoad.GridSurface, unit) }; - if (gridAreaLoad.PolyLineDefinition != string.Empty - && gridAreaLoad.PolyLineDefinition.Contains('(') - && load.GridPlaneSurface != null) { - load.Points = GridLoadHelper.ConvertPoints( - gridAreaLoad.PolyLineDefinition.ToString(), unit, load.GridPlaneSurface.Plane); + if (load.GridPlaneSurface != null) { + if (gridAreaLoad.PolyLineDefinition != string.Empty && gridAreaLoad.PolyLineDefinition.Contains('(')) { + load.Points = GridLoadHelper.ConvertPoints(gridAreaLoad.PolyLineDefinition.ToString(), unit, load.GridPlaneSurface.Plane); + } else if (polylines.ContainsKey(gridAreaLoad.PolyLineReference)) { + GsaAPI.Polyline polyline = polylines[gridAreaLoad.PolyLineReference]; + load.Points = GridLoadHelper.ConvertPoints(polyline.Points, unit, load.GridPlaneSurface.Plane); + load.ApiPolyline = polyline; + } } load.LoadCase = new GsaLoadCase(load.ApiLoad.Case, loadCases); @@ -176,30 +185,33 @@ public static class GsaLoadFactory { /// Method to import Grid Line Loads from a GSA model. /// Will output a list of GsaLoads. /// - /// Collection of Grid Line loads to be imported - /// Grid Surface Dictionary - /// Grid Plane Dictionary - /// Axes Dictionary - /// + /// /// /// - internal static List CreateGridLineLoadsFromApi( - ReadOnlyCollection lineLoads, IReadOnlyDictionary srfDict, - IReadOnlyDictionary plnDict, IReadOnlyDictionary axDict, - ReadOnlyDictionary loadCases, LengthUnit unit) { + internal static List CreateGridLineLoadsFromApi(Model model, LengthUnit unit) { + ReadOnlyCollection lineLoads = model.GridLineLoads(); + ReadOnlyCollection areaLoads = model.GridAreaLoads(); + IReadOnlyDictionary srfDict = model.GridSurfaces(); + IReadOnlyDictionary plnDict = model.GridPlanes(); + IReadOnlyDictionary axDict = model.Axes(); + ReadOnlyDictionary loadCases = model.LoadCases(); + ReadOnlyDictionary polylines = model.Polylines(); + var loads = new List(); foreach (GridLineLoad gridLineLoad in lineLoads) { var load = new GsaGridLineLoad { ApiLoad = gridLineLoad, - GridPlaneSurface - = CreateGridPlaneSurfaceFromApi(srfDict, plnDict, axDict, gridLineLoad.GridSurface, unit) + GridPlaneSurface = CreateGridPlaneSurfaceFromApi(model, gridLineLoad.GridSurface, unit) }; - if (gridLineLoad.PolyLineDefinition != string.Empty - && gridLineLoad.PolyLineDefinition.Contains('(') - && load.GridPlaneSurface != null) { - load.Points = GridLoadHelper.ConvertPoints( - gridLineLoad.PolyLineDefinition.ToString(), unit, load.GridPlaneSurface.Plane); + if (load.GridPlaneSurface != null) { + if (gridLineLoad.PolyLineDefinition != string.Empty && gridLineLoad.PolyLineDefinition.Contains('(')) { + load.Points = GridLoadHelper.ConvertPoints(gridLineLoad.PolyLineDefinition.ToString(), unit, load.GridPlaneSurface.Plane); + } else if (polylines.ContainsKey(gridLineLoad.PolyLineReference)) { + GsaAPI.Polyline polyline = polylines[gridLineLoad.PolyLineReference]; + load.Points = GridLoadHelper.ConvertPoints(polyline.Points, unit, load.GridPlaneSurface.Plane); + load.ApiPolyline = polyline; + } } load.LoadCase = new GsaLoadCase(load.ApiLoad.Case, loadCases); @@ -217,15 +229,17 @@ public static class GsaLoadFactory { /// Only Grid Surface ID is required, the others will be found by ref /// Will output a new GsaGridPlaneSurface. /// - /// Grid Surface Dictionary - /// Grid Plane Dictionary - /// Axes Dictionary + /// /// ID/Key/number of Grid Surface in GSA model to convert /// /// - internal static GsaGridPlaneSurface CreateGridPlaneSurfaceFromApi( - IReadOnlyDictionary srfDict, IReadOnlyDictionary plnDict, - IReadOnlyDictionary axDict, int gridSrfId, LengthUnit unit) { + internal static GsaGridPlaneSurface CreateGridPlaneSurfaceFromApi(Model model, int gridSrfId, LengthUnit unit) { + ReadOnlyCollection areaLoads = model.GridAreaLoads(); + IReadOnlyDictionary srfDict = model.GridSurfaces(); + IReadOnlyDictionary plnDict = model.GridPlanes(); + IReadOnlyDictionary axDict = model.Axes(); + ReadOnlyDictionary loadCases = model.LoadCases(); + if (srfDict.Count == 0 || !srfDict.TryGetValue(gridSrfId, out GridSurface gs)) { return null; } @@ -268,23 +282,23 @@ public static class GsaLoadFactory { /// Method to import Grid Point Loads from a GSA model. /// Will output a list of GsaLoads. /// - /// Collection of Grid Point loads to be imported - /// Grid Surface Dictionary - /// Grid Plane Dictionary - /// Axes Dictionary - /// + /// /// /// - internal static List CreateGridPointLoadsFromApi( - ReadOnlyCollection pointLoads, IReadOnlyDictionary srfDict, - IReadOnlyDictionary plnDict, IReadOnlyDictionary axDict, - ReadOnlyDictionary loadCases, LengthUnit unit) { + internal static List CreateGridPointLoadsFromApi(Model model, LengthUnit unit) { + ReadOnlyCollection pointLoads = model.GridPointLoads(); + ReadOnlyCollection areaLoads = model.GridAreaLoads(); + IReadOnlyDictionary srfDict = model.GridSurfaces(); + IReadOnlyDictionary plnDict = model.GridPlanes(); + IReadOnlyDictionary axDict = model.Axes(); + ReadOnlyDictionary loadCases = model.LoadCases(); + var loads = new List(); foreach (GridPointLoad gridPointLoad in pointLoads) { var load = new GsaGridPointLoad { ApiLoad = gridPointLoad, - GridPlaneSurface - = CreateGridPlaneSurfaceFromApi(srfDict, plnDict, axDict, gridPointLoad.GridSurface, unit), }; + GridPlaneSurface = CreateGridPlaneSurfaceFromApi(model, gridPointLoad.GridSurface, unit) + }; if (unit != LengthUnit.Meter) { load.ApiLoad.X = new Length(load.ApiLoad.X, LengthUnit.Meter).As(unit); @@ -305,10 +319,11 @@ public static class GsaLoadFactory { /// requeres the entire model to be inputted to this method. /// Will output a list of GsaLoads. /// - /// GSA model containing node loads - /// + /// /// - internal static List CreateNodeLoadsFromApi(Model model, ReadOnlyDictionary loadCases) { + internal static List CreateNodeLoadsFromApi(Model model) { + ReadOnlyDictionary loadCases = model.LoadCases(); + var loads = new List(); // NodeLoads come in varioys types, depending on GsaAPI.NodeLoadType: diff --git a/GsaGHTests/1_BaseParameters/2_Geometry/GsaElement2dTest.cs b/GsaGHTests/1_BaseParameters/2_Geometry/GsaElement2dTest.cs index de665c276..d595c2511 100644 --- a/GsaGHTests/1_BaseParameters/2_Geometry/GsaElement2dTest.cs +++ b/GsaGHTests/1_BaseParameters/2_Geometry/GsaElement2dTest.cs @@ -10,6 +10,7 @@ using Rhino.Geometry; using Xunit; using LengthUnit = OasysUnits.Units.LengthUnit; +using Polyline = Rhino.Geometry.Polyline; namespace GsaGHTests.Parameters { [Collection("GrasshopperFixture collection")] diff --git a/GsaGHTests/1_BaseParameters/2_Geometry/GsaMember2dTest.cs b/GsaGHTests/1_BaseParameters/2_Geometry/GsaMember2dTest.cs index b4ec46dd0..bd1da7e2f 100644 --- a/GsaGHTests/1_BaseParameters/2_Geometry/GsaMember2dTest.cs +++ b/GsaGHTests/1_BaseParameters/2_Geometry/GsaMember2dTest.cs @@ -20,7 +20,7 @@ public class GsaMember2dTest { new Point3d(-1, 2, 0), }; pts.Add(pts[0]); - var pol = new Polyline(pts); + var pol = new Rhino.Geometry.Polyline(pts); Brep brep = Brep.CreatePlanarBreps(pol.ToNurbsCurve(), 0.001)[0]; var inclpts = new Point3dList(); @@ -69,7 +69,7 @@ public class GsaMember2dTest { new Point3d(4, 2, 0), }; pts.Add(pts[0]); - var pol = new Polyline(pts); + var pol = new Rhino.Geometry.Polyline(pts); Brep brep = Brep.CreatePlanarBreps(pol.ToNurbsCurve(), 0.001)[0]; var inclpts = new Point3dList { @@ -127,7 +127,7 @@ public class GsaMember2dTest { new Point3d(2, 4, 0), }; pts2.Add(pts2[0]); - var pol2 = new Polyline(pts2); + var pol2 = new Rhino.Geometry.Polyline(pts2); Brep brep2 = Brep.CreatePlanarBreps(pol2.ToNurbsCurve(), 0.001)[0]; original.UpdateGeometry(brep2); From d1a3143f037baa0a2c0924f43aff1943f68f36de Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Thu, 2 May 2024 10:15:34 +0200 Subject: [PATCH 23/28] TestAdapterPath --- build-test-deploy.yml | 4 ++-- build-test-nightly.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build-test-deploy.yml b/build-test-deploy.yml index 4d30237ba..2dcb8e8da 100644 --- a/build-test-deploy.yml +++ b/build-test-deploy.yml @@ -74,8 +74,8 @@ steps: MSBUILDDISABLENODEREUSE: 1 - powershell: | - dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.0\build --results-directory .\results\gsagh .\GsaGHTests\bin\x64\Release\net48\GsaGHTests.dll - dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.0\build --results-directory .\results\integration .\IntegrationTests\bin\x64\Release\net48\IntegrationTests.dll + dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.2\build --results-directory .\results\gsagh .\GsaGHTests\bin\x64\Release\net48\GsaGHTests.dll + dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.2\build --results-directory .\results\integration .\IntegrationTests\bin\x64\Release\net48\IntegrationTests.dll displayName: dotnet tests failOnStderr: true diff --git a/build-test-nightly.yml b/build-test-nightly.yml index f26e2ee45..7ec6687a3 100644 --- a/build-test-nightly.yml +++ b/build-test-nightly.yml @@ -76,8 +76,8 @@ steps: MSBUILDDISABLENODEREUSE: 1 - powershell: | - dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.0\build --results-directory .\results\gsagh .\GsaGHTests\bin\x64\Release\net48\GsaGHTests.dll - dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.0\build --results-directory .\results\integration .\IntegrationTests\bin\x64\Release\net48\IntegrationTests.dll + dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.2\build --results-directory .\results\gsagh .\GsaGHTests\bin\x64\Release\net48\GsaGHTests.dll + dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.2\build --results-directory .\results\integration .\IntegrationTests\bin\x64\Release\net48\IntegrationTests.dll displayName: dotnet tests failOnStderr: true From ece739d0dd8a7b7b57bbec1d17c633468fda55ec Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Fri, 3 May 2024 16:16:42 +0200 Subject: [PATCH 24/28] nuget packages --- GsaGH/Helpers/Assembly/Loads/Loads.cs | 4 ++-- GsaGH/Parameters/3_Loads/GridLoadHelper.cs | 2 +- GsaGHTests/GsaGHTests.csproj | 4 ++-- IntegrationTests/IntegrationTests.csproj | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/GsaGH/Helpers/Assembly/Loads/Loads.cs b/GsaGH/Helpers/Assembly/Loads/Loads.cs index 2025db819..06e32fd74 100644 --- a/GsaGH/Helpers/Assembly/Loads/Loads.cs +++ b/GsaGH/Helpers/Assembly/Loads/Loads.cs @@ -237,7 +237,7 @@ internal partial class ModelAssembly { $"({Length.GetAbbreviation(_unit)})"; } - if(load.ApiPolyline != null) { + if(load.ApiLoad.PolyLineReference > 0) { _model.AddPolyline(load.ApiPolyline); } @@ -269,7 +269,7 @@ internal partial class ModelAssembly { $"({Length.GetAbbreviation(_unit)})"; } - if (load.ApiPolyline != null) { + if (load.ApiLoad.PolyLineReference > 0) { _model.AddPolyline(load.ApiPolyline); } diff --git a/GsaGH/Parameters/3_Loads/GridLoadHelper.cs b/GsaGH/Parameters/3_Loads/GridLoadHelper.cs index 9a00c57d2..06164f9b0 100644 --- a/GsaGH/Parameters/3_Loads/GridLoadHelper.cs +++ b/GsaGH/Parameters/3_Loads/GridLoadHelper.cs @@ -28,7 +28,7 @@ internal static class GridLoadHelper { return ClearDefGetUnit(definition).def; } - internal static Point3dList ConvertPoints(string definition, LengthUnit desiredUnit, Plane localPlane) { + internal static Point3dList ConvertPoints(string definition, LengthUnit desiredUnit, Plane localPlane) { (LengthUnit lengthUnit, string def) = ClearDefGetUnit(definition); var points = new Point3dList(); string[] pts = def.Split(')'); diff --git a/GsaGHTests/GsaGHTests.csproj b/GsaGHTests/GsaGHTests.csproj index 440971f17..91a4ec1e2 100644 --- a/GsaGHTests/GsaGHTests.csproj +++ b/GsaGHTests/GsaGHTests.csproj @@ -14,8 +14,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/IntegrationTests/IntegrationTests.csproj b/IntegrationTests/IntegrationTests.csproj index ee09ff47e..b9063c61e 100644 --- a/IntegrationTests/IntegrationTests.csproj +++ b/IntegrationTests/IntegrationTests.csproj @@ -6,8 +6,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all From 7dc0a562efbf156edacc089539d2f17773cee2bf Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 6 May 2024 09:04:04 +0200 Subject: [PATCH 25/28] GSAGH-488 color override --- GsaGH/Components/3_Loads/CreateGridAreaLoad.cs | 2 +- GsaGH/Components/3_Loads/CreateGridLineLoad.cs | 2 +- GsaGH/Components/6_Display/AnnotateDetailed.cs | 2 +- GsaGH/Components/6_Display/ResultDiagrams.cs | 12 +++++++----- GsaGH/Helpers/GH/RhinoConversions.cs | 2 +- GsaGH/Parameters/2_Geometry/GsaMember3d.cs | 1 + .../1_BaseParameters/2_Geometry/GsaElement2dTest.cs | 1 + .../1_BaseParameters/2_Geometry/GsaMember2dTest.cs | 5 +++-- 8 files changed, 16 insertions(+), 11 deletions(-) diff --git a/GsaGH/Components/3_Loads/CreateGridAreaLoad.cs b/GsaGH/Components/3_Loads/CreateGridAreaLoad.cs index d3b539227..09a5cf549 100644 --- a/GsaGH/Components/3_Loads/CreateGridAreaLoad.cs +++ b/GsaGH/Components/3_Loads/CreateGridAreaLoad.cs @@ -204,7 +204,7 @@ public class CreateGridAreaLoad : GH_OasysDropDownComponent { Curve[] edges = Curve.JoinCurves(edgeSegments); Curve curve = edges[0]; - if (curve.TryGetPolyline(out Polyline polyline)) { + if (curve.TryGetPolyline(out Rhino.Geometry.Polyline polyline)) { var ctrlPts = new Point3dList(polyline); gridareaload.Points = ctrlPts; diff --git a/GsaGH/Components/3_Loads/CreateGridLineLoad.cs b/GsaGH/Components/3_Loads/CreateGridLineLoad.cs index dec580d6c..f0e44ab49 100644 --- a/GsaGH/Components/3_Loads/CreateGridLineLoad.cs +++ b/GsaGH/Components/3_Loads/CreateGridLineLoad.cs @@ -199,7 +199,7 @@ public class CreateGridLineLoad : GH_OasysDropDownComponent { Curve curve = null; GH_Convert.ToCurve(ghCurve, ref curve, GH_Conversion.Both); - if (curve.TryGetPolyline(out Polyline ln)) { + if (curve.TryGetPolyline(out Rhino.Geometry.Polyline ln)) { var controlPoints = new Point3dList(ln); gridlineload.Points = controlPoints; diff --git a/GsaGH/Components/6_Display/AnnotateDetailed.cs b/GsaGH/Components/6_Display/AnnotateDetailed.cs index 5314f1083..678ea9c42 100644 --- a/GsaGH/Components/6_Display/AnnotateDetailed.cs +++ b/GsaGH/Components/6_Display/AnnotateDetailed.cs @@ -229,7 +229,7 @@ public class AnnotateDetailed : GH_OasysDropDownComponent { break; case GsaMember2dGoo m2d: - m2d.Value.PolyCurve.TryGetPolyline(out Polyline pl); + m2d.Value.PolyCurve.TryGetPolyline(out Rhino.Geometry.Polyline pl); if (_text3d) { Plane.FitPlaneToPoints(pl, out Plane pln); pln.Origin = pl.CenterPoint(); diff --git a/GsaGH/Components/6_Display/ResultDiagrams.cs b/GsaGH/Components/6_Display/ResultDiagrams.cs index 7cc3bb945..39dc380a5 100644 --- a/GsaGH/Components/6_Display/ResultDiagrams.cs +++ b/GsaGH/Components/6_Display/ResultDiagrams.cs @@ -264,14 +264,14 @@ public class ResultDiagrams : GH_OasysDropDownComponent { GraphicDrawResult diagramResults = result.Model.Model.GetDiagrams(graphic); ReadOnlyCollection linesFromModel = diagramResults.Lines; - Color color = Color.Empty; - da.GetData(4, ref color); - - double lengthScaleFactor = UnitConverter.Convert(1, Length.BaseUnit, lengthUnit); - bool doubleArrow = false; bool isDisplacement = false; if (_selectedItems[0] == "Displacement") { isDisplacement = true; + } + + Color color = Color.Empty; + bool doubleArrow = false; + if (!da.GetData(4, ref color) && isDisplacement) { if (IsTranslation()) { color = Color.FromArgb(102, 220, 103); } else { @@ -280,6 +280,8 @@ public class ResultDiagrams : GH_OasysDropDownComponent { } } + double lengthScaleFactor = UnitConverter.Convert(1, Length.BaseUnit, lengthUnit); + foreach (Line item in linesFromModel) { if (isDisplacement) { var anchor = new Point3d(item.Start.X, item.Start.Y, item.Start.Z); diff --git a/GsaGH/Helpers/GH/RhinoConversions.cs b/GsaGH/Helpers/GH/RhinoConversions.cs index ec45e4275..09a91de36 100644 --- a/GsaGH/Helpers/GH/RhinoConversions.cs +++ b/GsaGH/Helpers/GH/RhinoConversions.cs @@ -706,7 +706,7 @@ public static edges.AddRange(inner); Point3dList ctrlPts; - if (edges[0].TryGetPolyline(out Polyline tempCrv)) { + if (edges[0].TryGetPolyline(out Rhino.Geometry.Polyline tempCrv)) { ctrlPts = new Point3dList(tempCrv); } else { Tuple> convertBadSrf diff --git a/GsaGH/Parameters/2_Geometry/GsaMember3d.cs b/GsaGH/Parameters/2_Geometry/GsaMember3d.cs index 4907f2bf1..a39184685 100644 --- a/GsaGH/Parameters/2_Geometry/GsaMember3d.cs +++ b/GsaGH/Parameters/2_Geometry/GsaMember3d.cs @@ -12,6 +12,7 @@ using Rhino.Geometry.Collections; using LengthUnit = OasysUnits.Units.LengthUnit; using Line = Rhino.Geometry.Line; +using Polyline = Rhino.Geometry.Polyline; namespace GsaGH.Parameters { /// diff --git a/GsaGHTests/1_BaseParameters/2_Geometry/GsaElement2dTest.cs b/GsaGHTests/1_BaseParameters/2_Geometry/GsaElement2dTest.cs index de665c276..d595c2511 100644 --- a/GsaGHTests/1_BaseParameters/2_Geometry/GsaElement2dTest.cs +++ b/GsaGHTests/1_BaseParameters/2_Geometry/GsaElement2dTest.cs @@ -10,6 +10,7 @@ using Rhino.Geometry; using Xunit; using LengthUnit = OasysUnits.Units.LengthUnit; +using Polyline = Rhino.Geometry.Polyline; namespace GsaGHTests.Parameters { [Collection("GrasshopperFixture collection")] diff --git a/GsaGHTests/1_BaseParameters/2_Geometry/GsaMember2dTest.cs b/GsaGHTests/1_BaseParameters/2_Geometry/GsaMember2dTest.cs index b4ec46dd0..02b46fab5 100644 --- a/GsaGHTests/1_BaseParameters/2_Geometry/GsaMember2dTest.cs +++ b/GsaGHTests/1_BaseParameters/2_Geometry/GsaMember2dTest.cs @@ -6,6 +6,7 @@ using Rhino.Geometry; using Xunit; using LengthUnit = OasysUnits.Units.LengthUnit; +using Polyline = Rhino.Geometry.Polyline; namespace GsaGHTests.Parameters { [Collection("GrasshopperFixture collection")] @@ -20,7 +21,7 @@ public class GsaMember2dTest { new Point3d(-1, 2, 0), }; pts.Add(pts[0]); - var pol = new Polyline(pts); + var pol = new Rhino.Geometry.Polyline(pts); Brep brep = Brep.CreatePlanarBreps(pol.ToNurbsCurve(), 0.001)[0]; var inclpts = new Point3dList(); @@ -127,7 +128,7 @@ public class GsaMember2dTest { new Point3d(2, 4, 0), }; pts2.Add(pts2[0]); - var pol2 = new Polyline(pts2); + var pol2 = new Rhino.Geometry.Polyline(pts2); Brep brep2 = Brep.CreatePlanarBreps(pol2.ToNurbsCurve(), 0.001)[0]; original.UpdateGeometry(brep2); From 3bb571f96ac3d46982b72074773c86b82a80d49b Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 6 May 2024 09:09:08 +0200 Subject: [PATCH 26/28] coverlet.collector --- build-test-deploy.yml | 4 ++-- build-test-nightly.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build-test-deploy.yml b/build-test-deploy.yml index 4d30237ba..2dcb8e8da 100644 --- a/build-test-deploy.yml +++ b/build-test-deploy.yml @@ -74,8 +74,8 @@ steps: MSBUILDDISABLENODEREUSE: 1 - powershell: | - dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.0\build --results-directory .\results\gsagh .\GsaGHTests\bin\x64\Release\net48\GsaGHTests.dll - dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.0\build --results-directory .\results\integration .\IntegrationTests\bin\x64\Release\net48\IntegrationTests.dll + dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.2\build --results-directory .\results\gsagh .\GsaGHTests\bin\x64\Release\net48\GsaGHTests.dll + dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.2\build --results-directory .\results\integration .\IntegrationTests\bin\x64\Release\net48\IntegrationTests.dll displayName: dotnet tests failOnStderr: true diff --git a/build-test-nightly.yml b/build-test-nightly.yml index f26e2ee45..7ec6687a3 100644 --- a/build-test-nightly.yml +++ b/build-test-nightly.yml @@ -76,8 +76,8 @@ steps: MSBUILDDISABLENODEREUSE: 1 - powershell: | - dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.0\build --results-directory .\results\gsagh .\GsaGHTests\bin\x64\Release\net48\GsaGHTests.dll - dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.0\build --results-directory .\results\integration .\IntegrationTests\bin\x64\Release\net48\IntegrationTests.dll + dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.2\build --results-directory .\results\gsagh .\GsaGHTests\bin\x64\Release\net48\GsaGHTests.dll + dotnet test --collect:"XPlat Code Coverage" /TestAdapterPath:$env:UserProfile\.nuget\packages\coverlet.collector\6.0.2\build --results-directory .\results\integration .\IntegrationTests\bin\x64\Release\net48\IntegrationTests.dll displayName: dotnet tests failOnStderr: true From 7e9bfde2eaf0c779b95c5836fcfeccd0388c6e5b Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 6 May 2024 09:14:03 +0200 Subject: [PATCH 27/28] GSAGH-482 unit tests --- GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs | 3 +++ GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs | 2 ++ 2 files changed, 5 insertions(+) diff --git a/GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs b/GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs index 5c7517a80..0825b92e7 100644 --- a/GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs +++ b/GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs @@ -1,9 +1,11 @@ using System; +using System.Collections.Generic; using GsaAPI; using GsaGH.Parameters; using GsaGHTests.Helpers; using Rhino.Geometry; using Xunit; +using Polyline = GsaAPI.Polyline; namespace GsaGHTests.Parameters { [Collection("GrasshopperFixture collection")] @@ -44,6 +46,7 @@ public class GsaGridAreaLoadTest { Type = type, Value = 10, }, + ApiPolyline = new Polyline(new List()) }; var originalGridPlaneSurface = new GsaGridPlaneSurface(); original.GridPlaneSurface = originalGridPlaneSurface; diff --git a/GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs b/GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs index 1ffd9d7b1..0eff5bc23 100644 --- a/GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs +++ b/GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using GsaAPI; using GsaGH.Parameters; using GsaGHTests.Helpers; @@ -44,6 +45,7 @@ public class GsaGridLineLoadTest { ValueAtStart = 10, ValueAtEnd = 20, }, + ApiPolyline = new Polyline(new List()) }; var duplicate = (GsaGridLineLoad)original.Duplicate(); From 1ac4e57e05071a6d5df6ebb68a28fd373638c483 Mon Sep 17 00:00:00 2001 From: Tilman Reinhardt Date: Mon, 6 May 2024 13:10:19 +0200 Subject: [PATCH 28/28] GSAGH-182 polyline definition --- GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs | 7 ++++++- GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs b/GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs index 0825b92e7..e174a09cf 100644 --- a/GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs +++ b/GsaGHTests/1_BaseParameters/3_Loads/GsaGridAreaLoadTest.cs @@ -46,7 +46,12 @@ public class GsaGridAreaLoadTest { Type = type, Value = 10, }, - ApiPolyline = new Polyline(new List()) + ApiPolyline = new Polyline(new List() { + new Vector2(-3.1, 8.8), + new Vector2(13.6, 9.8), + new Vector2(12.2 , 14.3), + new Vector2(-0.7, 15.6), + }) }; var originalGridPlaneSurface = new GsaGridPlaneSurface(); original.GridPlaneSurface = originalGridPlaneSurface; diff --git a/GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs b/GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs index 0eff5bc23..5bc0e2d59 100644 --- a/GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs +++ b/GsaGHTests/1_BaseParameters/3_Loads/GsaGridLineLoadTest.cs @@ -45,7 +45,12 @@ public class GsaGridLineLoadTest { ValueAtStart = 10, ValueAtEnd = 20, }, - ApiPolyline = new Polyline(new List()) + ApiPolyline = new Polyline(new List() { + new Vector2(-3.1, 8.8), + new Vector2(13.6, 9.8), + new Vector2(12.2 , 14.3), + new Vector2(-0.7, 15.6), + }) }; var duplicate = (GsaGridLineLoad)original.Duplicate();