From 3414599f72460d7111b7dc89f2c0835855a1567c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinhagen?= <88777268+bjoernsteinhagen@users.noreply.github.com> Date: Fri, 3 Oct 2025 17:15:54 +0200 Subject: [PATCH 1/2] fix(etabs): units not supported (#1132) * fix: etabs units not supported * chore: notes --- .../CsiConversionSettingsFactory.cs | 18 +++++++--- .../CsiToSpeckleUnitConverter.cs | 33 +++++++------------ .../ServiceRegistration.cs | 2 +- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/Converters/CSi/Speckle.Converters.CSiShared/CsiConversionSettingsFactory.cs b/Converters/CSi/Speckle.Converters.CSiShared/CsiConversionSettingsFactory.cs index e93354e21..7388778ef 100644 --- a/Converters/CSi/Speckle.Converters.CSiShared/CsiConversionSettingsFactory.cs +++ b/Converters/CSi/Speckle.Converters.CSiShared/CsiConversionSettingsFactory.cs @@ -5,7 +5,7 @@ namespace Speckle.Converters.CSiShared; [GenerateAutoInterface] public class CsiConversionSettingsFactory( - IHostToSpeckleUnitConverter unitsConverter, + IHostToSpeckleUnitConverter unitsConverter, IConverterSettingsStore settingsStore ) : ICsiConversionSettingsFactory { @@ -15,11 +15,21 @@ public class CsiConversionSettingsFactory( cSapModel document, List? selectedLoadCasesAndCombinations = null, List? selectedResultTypes = null - ) => - new( + ) + { + // NOTE: only applicable to ETABS. If we bring in SAP2000 then we need to revert to GetPresentUnits + // NOTE: change from GetPresentUnits as this was linked to weird behaviour (see CNX-2621), returning "0" sometimes + // bug in the GetPresentUnits api call ... + eTemperature temperatureUnit = eTemperature.NotApplicable; + eLength lengthUnit = eLength.NotApplicable; + eForce forceUnit = eForce.NotApplicable; + document.GetPresentUnits_2(ref forceUnit, ref lengthUnit, ref temperatureUnit); + + return new CsiConversionSettings( document, - unitsConverter.ConvertOrThrow(document.GetPresentUnits()), + unitsConverter.ConvertOrThrow(lengthUnit), selectedLoadCasesAndCombinations ?? [], selectedResultTypes ?? [] ); + } } diff --git a/Converters/CSi/Speckle.Converters.CSiShared/CsiToSpeckleUnitConverter.cs b/Converters/CSi/Speckle.Converters.CSiShared/CsiToSpeckleUnitConverter.cs index 4082abd8f..5398a56df 100644 --- a/Converters/CSi/Speckle.Converters.CSiShared/CsiToSpeckleUnitConverter.cs +++ b/Converters/CSi/Speckle.Converters.CSiShared/CsiToSpeckleUnitConverter.cs @@ -5,37 +5,28 @@ using Speckle.Sdk.Common.Exceptions; namespace Speckle.Converters.CSiShared; /// -/// Convert CSi eUnits enumeration to Speckle units. +/// Convert CSi eLength enumeration to Speckle units. /// /// -/// CSi GetPresentUnits() valid for both SAP 2000 and ETABS. +/// CSi GetPresentUnits_2() valid for ONLY ETABS. If we add SAP2000, this needs to be modified /// Represents units transmitted through API calls and not necessarily those displayed in GUI. /// -public class CsiToSpeckleUnitConverter : IHostToSpeckleUnitConverter +public class CsiToSpeckleUnitConverter : IHostToSpeckleUnitConverter { - private readonly Dictionary _unitMapping = new Dictionary(); + private readonly Dictionary _unitMapping = []; public CsiToSpeckleUnitConverter() { - _unitMapping[eUnits.lb_in_F] = Units.Inches; - _unitMapping[eUnits.lb_ft_F] = Units.Feet; - _unitMapping[eUnits.kip_in_F] = Units.Inches; - _unitMapping[eUnits.kip_ft_F] = Units.Feet; - _unitMapping[eUnits.kN_mm_C] = Units.Millimeters; - _unitMapping[eUnits.kN_m_C] = Units.Meters; - _unitMapping[eUnits.kgf_mm_C] = Units.Millimeters; - _unitMapping[eUnits.kgf_m_C] = Units.Meters; - _unitMapping[eUnits.N_mm_C] = Units.Millimeters; - _unitMapping[eUnits.N_m_C] = Units.Meters; - _unitMapping[eUnits.Ton_mm_C] = Units.Millimeters; - _unitMapping[eUnits.Ton_m_C] = Units.Meters; - _unitMapping[eUnits.kN_cm_C] = Units.Centimeters; - _unitMapping[eUnits.kgf_cm_C] = Units.Centimeters; - _unitMapping[eUnits.N_cm_C] = Units.Centimeters; - _unitMapping[eUnits.Ton_cm_C] = Units.Centimeters; + _unitMapping[eLength.NotApplicable] = Units.None; + _unitMapping[eLength.inch] = Units.Inches; + _unitMapping[eLength.ft] = Units.Feet; + // _unitMapping[eLength.micron] = Units.None; + _unitMapping[eLength.mm] = Units.Millimeters; + _unitMapping[eLength.cm] = Units.Centimeters; + _unitMapping[eLength.m] = Units.Meters; } - public string ConvertOrThrow(eUnits hostUnit) => + public string ConvertOrThrow(eLength hostUnit) => _unitMapping.TryGetValue(hostUnit, out string? value) ? value : throw new UnitNotSupportedException($"The Unit System \"{hostUnit}\" is unsupported."); diff --git a/Converters/CSi/Speckle.Converters.CSiShared/ServiceRegistration.cs b/Converters/CSi/Speckle.Converters.CSiShared/ServiceRegistration.cs index 565cafd5b..735491fce 100644 --- a/Converters/CSi/Speckle.Converters.CSiShared/ServiceRegistration.cs +++ b/Converters/CSi/Speckle.Converters.CSiShared/ServiceRegistration.cs @@ -39,7 +39,7 @@ public static class ServiceRegistration serviceCollection.AddScoped(); // Settings and unit conversions - serviceCollection.AddApplicationConverters(converterAssembly); + serviceCollection.AddApplicationConverters(converterAssembly); serviceCollection.AddScoped< IConverterSettingsStore, ConverterSettingsStore From a9360e5fac8fbfc3a40156fd470d7d0c21cfcefc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinhagen?= <88777268+bjoernsteinhagen@users.noreply.github.com> Date: Sat, 4 Oct 2025 11:42:01 +0200 Subject: [PATCH 2/2] fix(grasshopper): optimize `CreateSpeckleProperties` for large data trees (#1135) * perf: remove expensive tree flattening in CreateSpeckleProperties * chore: format --- .../Components/Objects/CreateSpeckleProperties.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Components/Objects/CreateSpeckleProperties.cs b/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Components/Objects/CreateSpeckleProperties.cs index 07ce73043..f84d68bd9 100644 --- a/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Components/Objects/CreateSpeckleProperties.cs +++ b/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Components/Objects/CreateSpeckleProperties.cs @@ -34,8 +34,7 @@ public class CreateSpeckleProperties : VariableParameterComponentBase pManager.AddParameter(param); } - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { + protected override void RegisterOutputParams(GH_OutputParamManager pManager) => pManager.AddParameter( new SpecklePropertyGroupParam(), "Properties", @@ -43,7 +42,6 @@ public class CreateSpeckleProperties : VariableParameterComponentBase "Properties for Speckle Objects", GH_ParamAccess.item ); - } protected override void SolveInstance(IGH_DataAccess da) { @@ -67,8 +65,7 @@ public class CreateSpeckleProperties : VariableParameterComponentBase { var paramName = Params.Input[i].NickName; - var data = Params.Input[i].VolatileData.AllData(true).ToList(); - if (data.Count == 0) + if (Params.Input[i].VolatileDataCount == 0) { continue; } @@ -168,10 +165,8 @@ public class CreateSpeckleProperties : VariableParameterComponentBase ExpireSolution(true); } - protected override void WriteComponentSpecificData(GH_IWriter writer) - { + protected override void WriteComponentSpecificData(GH_IWriter writer) => writer.SetBoolean("CreateEmptyProperties", CreateEmptyProperties); - } protected override void ReadComponentSpecificData(GH_IReader reader) {