Files
speckle-sharp-connectors/Converters/Autocad/Speckle.Converters.AutocadShared/ToSpeckle/Geometry/Solid3dToSpeckleConverter.cs
T
Dogukan Karatas 034e1dcef8 feat (civil3d): data object with raw encoding for solid3d objects (#1208)
* solidx converter added

* some formatting

* version bump

* supress the check

* dwg based dataobject

* replace dwg with sat

* update sdk package

* some cleanup

* change operation order

* some formatting

* ITypedConverter cast

* static to ITypedConverter

* minors

* non-nullable parameters

* unit conversion added

---------

Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2025-12-08 21:28:50 +03:00

76 lines
2.2 KiB
C#

using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
using Speckle.Objects.Other;
using Speckle.Sdk;
using Speckle.Sdk.Common.Exceptions;
using Speckle.Sdk.Models;
namespace Speckle.Converters.Autocad.Geometry;
/// <summary>
/// Converts AutoCAD Solid3d entities to SolidX with SAT encoding for lossless round-trip.
/// </summary>
[NameAndRankValue(typeof(ADB.Solid3d), NameAndRankValueAttribute.SPECKLE_DEFAULT_RANK + 1)]
public class Solid3dToSpeckleConverter : IToSpeckleTopLevelConverter
{
private readonly ITypedConverter<ADB.Solid3d, SOG.Mesh> _meshConverter;
private readonly ITypedConverter<ADB.Solid3d, RawEncoding> _encodingConverter;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public Solid3dToSpeckleConverter(
ITypedConverter<ADB.Solid3d, SOG.Mesh> meshConverter,
ITypedConverter<ADB.Solid3d, RawEncoding> encodingConverter,
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_meshConverter = meshConverter;
_encodingConverter = encodingConverter;
_settingsStore = settingsStore;
}
public Base Convert(object target) => RawConvert((ADB.Solid3d)target);
public SOG.SolidX RawConvert(ADB.Solid3d target)
{
// Generate display mesh for viewer
SOG.Mesh displayMesh = _meshConverter.Convert(target);
// Calculate geometric properties
double? volume = null;
double? area = null;
try
{
using ABR.Brep brep = new(target);
if (!brep.IsNull)
{
area = brep.GetSurfaceArea();
try
{
volume = brep.GetVolume();
}
catch (ABR.Exception)
{
// Volume calculation can fail for non-volumetric solids
}
}
}
catch (Exception ex) when (!ex.IsFatal())
{
throw new ConversionException($"Failed to calculate geometric properties: {ex.Message}", ex);
}
// Create raw encoding for round-tripping
RawEncoding encoding = _encodingConverter.Convert(target);
return new SOG.SolidX
{
displayValue = [displayMesh],
encodedValue = encoding,
volume = volume ?? 0,
area = area ?? 0,
units = _settingsStore.Current.SpeckleUnits
};
}
}