Change conversion stack to better usage for products. (#215)

* fix: Push to sync with Jedd

* Jedd's record suggestions

* cleanup stack

* Revit settings converted

* more settings changes

* fix unit of work and scope registration

* rename

* fix more settings

* Use a generic factory to create settings contexts

* fix ArcGIS

* generic sending

* fix ArcGIS

* remove extras

* fix crs scoping

* fix autocad

* fix units for arcgis

* civil3d conversions

* rhino mostly works

* Rhino and recieve changed

* fix revit tests

* fix rhino tests

* fix merge

* make settings a record again

* fixes from reversion

* merge fixes

* ArcGIS reverts

* more senders reverted

* remove added reference

* clean up locks and files

* update nunit

* make things proper records

* fix test

* Merge fixes

* merge fixes

* Initialize the settings instead of push empty

* scan things consistently

---------

Co-authored-by: Alan Rynne <alan@speckle.systems>
Co-authored-by: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com>
This commit is contained in:
Adam Hathcock
2024-09-17 13:42:00 +01:00
committed by GitHub
parent cc285e99ee
commit 8d0d7a89f7
201 changed files with 1191 additions and 1272 deletions
@@ -1,3 +1,5 @@
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Mapping;
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.DUI.Bindings;
@@ -7,6 +9,9 @@ using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.ArcGIS3;
using Speckle.Converters.ArcGIS3.Utils;
using Speckle.Converters.Common;
using Speckle.Sdk;
namespace Speckle.Connectors.ArcGIS.Bindings;
@@ -19,6 +24,7 @@ public sealed class ArcGISReceiveBinding : IReceiveBinding
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<ArcGISReceiveBinding> _logger;
private readonly IArcGISConversionSettingsFactory _arcGISConversionSettingsFactory;
private ReceiveBindingUICommands Commands { get; }
public IBridge Parent { get; }
@@ -29,7 +35,8 @@ public sealed class ArcGISReceiveBinding : IReceiveBinding
CancellationManager cancellationManager,
IUnitOfWorkFactory unitOfWorkFactory,
IOperationProgressManager operationProgressManager,
ILogger<ArcGISReceiveBinding> logger
ILogger<ArcGISReceiveBinding> logger,
IArcGISConversionSettingsFactory arcGisConversionSettingsFactory
)
{
_store = store;
@@ -39,6 +46,7 @@ public sealed class ArcGISReceiveBinding : IReceiveBinding
_unitOfWorkFactory = unitOfWorkFactory;
_operationProgressManager = operationProgressManager;
_logger = logger;
_arcGISConversionSettingsFactory = arcGisConversionSettingsFactory;
}
public async Task Receive(string modelCardId)
@@ -53,12 +61,20 @@ public sealed class ArcGISReceiveBinding : IReceiveBinding
}
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
using IUnitOfWork<ReceiveOperation> unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
using var unitOfWork = _unitOfWorkFactory.Create();
unitOfWork
.Resolve<IConverterSettingsStore<ArcGISConversionSettings>>()
.Initialize(
_arcGISConversionSettingsFactory.Create(
Project.Current,
MapView.Active.Map,
new CRSoffsetRotation(MapView.Active.Map)
)
);
// Receive host objects
var receiveOperationResults = await unitOfWork
.Service.Execute(
.Resolve<ReceiveOperation>()
.Execute(
modelCard.GetReceiveInfo("ArcGIS"), // POC: get host app name from settings? same for GetSendInfo
cancellationToken,
(status, progress) =>
@@ -1,6 +1,7 @@
using System.Collections.Concurrent;
using System.Diagnostics.CodeAnalysis;
using ArcGIS.Core.Data;
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Editing.Events;
using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Mapping;
@@ -20,6 +21,9 @@ using Speckle.Connectors.DUI.Settings;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.ArcGIS3;
using Speckle.Converters.ArcGIS3.Utils;
using Speckle.Converters.Common;
using Speckle.Sdk;
using Speckle.Sdk.Common;
@@ -40,6 +44,7 @@ public sealed class ArcGISSendBinding : ISendBinding
private readonly ILogger<ArcGISSendBinding> _logger;
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
private readonly MapMembersUtils _mapMemberUtils;
private readonly IArcGISConversionSettingsFactory _arcGISConversionSettingsFactory;
/// <summary>
/// Used internally to aggregate the changed objects' id. Note we're using a concurrent dictionary here as the expiry check method is not thread safe, and this was causing problems. See:
@@ -61,7 +66,8 @@ public sealed class ArcGISSendBinding : ISendBinding
ISendConversionCache sendConversionCache,
IOperationProgressManager operationProgressManager,
ILogger<ArcGISSendBinding> logger,
MapMembersUtils mapMemberUtils
MapMembersUtils mapMemberUtils,
IArcGISConversionSettingsFactory arcGisConversionSettingsFactory
)
{
_store = store;
@@ -73,6 +79,7 @@ public sealed class ArcGISSendBinding : ISendBinding
_logger = logger;
_topLevelExceptionHandler = parent.TopLevelExceptionHandler;
_mapMemberUtils = mapMemberUtils;
_arcGISConversionSettingsFactory = arcGisConversionSettingsFactory;
Parent = parent;
Commands = new SendBindingUICommands(parent);
@@ -357,7 +364,7 @@ public sealed class ArcGISSendBinding : ISendBinding
public async Task Send(string modelCardId)
{
//poc: dupe code between connectors
using var unitOfWork = _unitOfWorkFactory.Resolve<SendOperation<MapMember>>();
try
{
if (_store.GetModelById(modelCardId) is not SenderModelCard modelCard)
@@ -371,6 +378,16 @@ public sealed class ArcGISSendBinding : ISendBinding
var sendResult = await QueuedTask
.Run(async () =>
{
using var unitOfWork = _unitOfWorkFactory.Create();
unitOfWork
.Resolve<IConverterSettingsStore<ArcGISConversionSettings>>()
.Initialize(
_arcGISConversionSettingsFactory.Create(
Project.Current,
MapView.Active.Map,
new CRSoffsetRotation(MapView.Active.Map)
)
);
List<MapMember> mapMembers = modelCard
.SendFilter.NotNull()
.GetObjectIds()
@@ -400,7 +417,8 @@ public sealed class ArcGISSendBinding : ISendBinding
}
var result = await unitOfWork
.Service.Execute(
.Resolve<SendOperation<MapMember>>()
.Execute(
mapMembers,
modelCard.GetSendInfo("ArcGIS"), // POC: get host app name from settings? same for GetReceiveInfo
(status, progress) =>
@@ -33,13 +33,13 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
private readonly ICrsUtils _crsUtils;
// POC: figure out the correct scope to only initialize on Receive
private readonly IConversionContextStack<ArcGISDocument, Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
private readonly GraphTraversal _traverseFunction;
private readonly ArcGISColorManager _colorManager;
public ArcGISHostObjectBuilder(
IRootToHostConverter converter,
IConversionContextStack<ArcGISDocument, Unit> contextStack,
IConverterSettingsStore<ArcGISConversionSettings> settingsStore,
IFeatureClassUtils featureClassUtils,
ILocalToGlobalUnpacker localToGlobalUnpacker,
ILocalToGlobalConverterUtils localToGlobalConverterUtils,
@@ -49,7 +49,7 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
)
{
_converter = converter;
_contextStack = contextStack;
_settingsStore = settingsStore;
_featureClassUtils = featureClassUtils;
_localToGlobalUnpacker = localToGlobalUnpacker;
_localToGlobalConverterUtils = localToGlobalConverterUtils;
@@ -240,7 +240,7 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
// get CRS from any present VectorLayer
Base? vLayer = objectsToConvertTc.FirstOrDefault(x => x.Current is VectorLayer)?.Current;
_crsUtils.FindSetCrsDataOnReceive(vLayer);
using var crs = _crsUtils.FindSetCrsDataOnReceive(vLayer); // TODO help
// now filter the objects
objectsToConvertTc = objectsToConvertTc.Where(ctx => ctx.Current is not Collection).ToList();
@@ -306,8 +306,7 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
{
// get layer details
string? datasetId = trackerItem.DatasetId; // should not be null here
Uri uri =
new($"{_contextStack.Current.Document.SpeckleDatabasePath.AbsolutePath.Replace('/', '\\')}\\{datasetId}");
Uri uri = new($"{_settingsStore.Current.SpeckleDatabasePath.AbsolutePath.Replace('/', '\\')}\\{datasetId}");
string nestedLayerName = trackerItem.NestedLayerName;
// add group for the current layer
@@ -317,7 +316,7 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
// if no general group layer found
if (createdLayerGroups.Count == 0)
{
Map map = _contextStack.Current.Document.Map;
Map map = _settingsStore.Current.Map;
GroupLayer mainGroupLayer = LayerFactory.Instance.CreateGroupLayer(map, 0, $"{projectName}: {modelName}");
mainGroupLayer.SetExpanded(true);
createdLayerGroups["Basic Speckle Group"] = mainGroupLayer; // key doesn't really matter here
@@ -340,9 +339,9 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
// if Scene
// https://community.esri.com/t5/arcgis-pro-sdk-questions/sdk-equivalent-to-changing-layer-s-elevation/td-p/1346139
if (_contextStack.Current.Document.Map.IsScene)
if (_settingsStore.Current.Map.IsScene)
{
var groundSurfaceLayer = _contextStack.Current.Document.Map.GetGroundElevationSurfaceLayer();
var groundSurfaceLayer = _settingsStore.Current.Map.GetGroundElevationSurfaceLayer();
var layerElevationSurface = new CIMLayerElevationSurface
{
ElevationSurfaceLayerURI = groundSurfaceLayer.URI,
@@ -1,5 +1,4 @@
using System.Diagnostics;
using ArcGIS.Core.Geometry;
using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Mapping;
using Microsoft.Extensions.Logging;
@@ -28,14 +27,14 @@ public class ArcGISRootObjectBuilder : IRootObjectBuilder<MapMember>
private readonly IRootToSpeckleConverter _rootToSpeckleConverter;
private readonly ISendConversionCache _sendConversionCache;
private readonly ArcGISColorManager _colorManager;
private readonly IConversionContextStack<ArcGISDocument, Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
private readonly MapMembersUtils _mapMemberUtils;
private readonly ILogger<ArcGISRootObjectBuilder> _logger;
public ArcGISRootObjectBuilder(
ISendConversionCache sendConversionCache,
ArcGISColorManager colorManager,
IConversionContextStack<ArcGISDocument, Unit> contextStack,
IConverterSettingsStore<ArcGISConversionSettings> settingsStore,
IRootToSpeckleConverter rootToSpeckleConverter,
MapMembersUtils mapMemberUtils,
ILogger<ArcGISRootObjectBuilder> logger
@@ -43,7 +42,7 @@ public class ArcGISRootObjectBuilder : IRootObjectBuilder<MapMember>
{
_sendConversionCache = sendConversionCache;
_colorManager = colorManager;
_contextStack = contextStack;
_settingsStore = settingsStore;
_rootToSpeckleConverter = rootToSpeckleConverter;
_mapMemberUtils = mapMemberUtils;
_logger = logger;
@@ -125,17 +124,17 @@ public class ArcGISRootObjectBuilder : IRootObjectBuilder<MapMember>
.ConfigureAwait(false);
// get units & Active CRS (for writing geometry coords)
converted["units"] = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString;
converted["units"] = _settingsStore.Current.SpeckleUnits;
var spatialRef = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference;
var spatialRef = _settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference;
converted["crs"] = new CRS
{
wkt = spatialRef.Wkt,
name = spatialRef.Name,
offset_y = Convert.ToSingle(_contextStack.Current.Document.ActiveCRSoffsetRotation.LatOffset),
offset_x = Convert.ToSingle(_contextStack.Current.Document.ActiveCRSoffsetRotation.LonOffset),
rotation = Convert.ToSingle(_contextStack.Current.Document.ActiveCRSoffsetRotation.TrueNorthRadians),
units_native = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString,
offset_y = Convert.ToSingle(_settingsStore.Current.ActiveCRSoffsetRotation.LatOffset),
offset_x = Convert.ToSingle(_settingsStore.Current.ActiveCRSoffsetRotation.LonOffset),
rotation = Convert.ToSingle(_settingsStore.Current.ActiveCRSoffsetRotation.TrueNorthRadians),
units_native = _settingsStore.Current.SpeckleUnits,
};
}
@@ -7,6 +7,8 @@ using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Autocad;
using Speckle.Converters.Common;
using Speckle.Sdk;
namespace Speckle.Connectors.Autocad.Bindings;
@@ -21,6 +23,7 @@ public sealed class AutocadReceiveBinding : IReceiveBinding
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<AutocadReceiveBinding> _logger;
private readonly IAutocadConversionSettingsFactory _autocadConversionSettingsFactory;
private ReceiveBindingUICommands Commands { get; }
@@ -30,7 +33,8 @@ public sealed class AutocadReceiveBinding : IReceiveBinding
CancellationManager cancellationManager,
IUnitOfWorkFactory unitOfWorkFactory,
IOperationProgressManager operationProgressManager,
ILogger<AutocadReceiveBinding> logger
ILogger<AutocadReceiveBinding> logger,
IAutocadConversionSettingsFactory autocadConversionSettingsFactory
)
{
_store = store;
@@ -38,6 +42,7 @@ public sealed class AutocadReceiveBinding : IReceiveBinding
_unitOfWorkFactory = unitOfWorkFactory;
_operationProgressManager = operationProgressManager;
_logger = logger;
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
Parent = parent;
Commands = new ReceiveBindingUICommands(parent);
}
@@ -46,7 +51,10 @@ public sealed class AutocadReceiveBinding : IReceiveBinding
public async Task Receive(string modelCardId)
{
using var unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
using var unitOfWork = _unitOfWorkFactory.Create();
unitOfWork
.Resolve<IConverterSettingsStore<AutocadConversionSettings>>()
.Initialize(_autocadConversionSettingsFactory.Create(Application.DocumentManager.CurrentDocument));
try
{
// Get receiver card
@@ -65,7 +73,8 @@ public sealed class AutocadReceiveBinding : IReceiveBinding
// Receive host objects
var operationResults = await unitOfWork
.Service.Execute(
.Resolve<ReceiveOperation>()
.Execute(
modelCard.GetReceiveInfo(Speckle.Connectors.Utils.Connector.Slug),
cancellationToken,
(status, progress) =>
@@ -16,6 +16,8 @@ using Speckle.Connectors.DUI.Settings;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Autocad;
using Speckle.Converters.Common;
using Speckle.Sdk;
using Speckle.Sdk.Common;
@@ -37,6 +39,7 @@ public sealed class AutocadSendBinding : ISendBinding
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<AutocadSendBinding> _logger;
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
private readonly IAutocadConversionSettingsFactory _autocadConversionSettingsFactory;
/// <summary>
/// Used internally to aggregate the changed objects' id. Note we're using a concurrent dictionary here as the expiry check method is not thread safe, and this was causing problems. See:
@@ -55,7 +58,8 @@ public sealed class AutocadSendBinding : ISendBinding
IUnitOfWorkFactory unitOfWorkFactory,
ISendConversionCache sendConversionCache,
IOperationProgressManager operationProgressManager,
ILogger<AutocadSendBinding> logger
ILogger<AutocadSendBinding> logger,
IAutocadConversionSettingsFactory autocadConversionSettingsFactory
)
{
_store = store;
@@ -66,6 +70,7 @@ public sealed class AutocadSendBinding : ISendBinding
_sendConversionCache = sendConversionCache;
_operationProgressManager = operationProgressManager;
_logger = logger;
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
_topLevelExceptionHandler = parent.TopLevelExceptionHandler;
Parent = parent;
Commands = new SendBindingUICommands(parent);
@@ -153,7 +158,10 @@ public sealed class AutocadSendBinding : ISendBinding
throw new InvalidOperationException("No publish model card was found.");
}
using var uow = _unitOfWorkFactory.Resolve<SendOperation<AutocadRootObject>>();
using var unitOfWork = _unitOfWorkFactory.Create();
unitOfWork
.Resolve<IConverterSettingsStore<AutocadConversionSettings>>()
.Initialize(_autocadConversionSettingsFactory.Create(Application.DocumentManager.CurrentDocument));
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
@@ -173,8 +181,9 @@ public sealed class AutocadSendBinding : ISendBinding
throw new SpeckleSendFilterException("No objects were found to convert. Please update your publish filter!");
}
var sendResult = await uow
.Service.Execute(
var sendResult = await unitOfWork
.Resolve<SendOperation<AutocadRootObject>>()
.Execute(
autocadObjects,
modelCard.GetSendInfo(Speckle.Connectors.Utils.Connector.Slug),
(status, progress) =>
@@ -18,7 +18,6 @@ using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Instances;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Sdk.Models.GraphTraversal;
namespace Speckle.Connectors.Autocad.DependencyInjection;
@@ -55,7 +54,6 @@ public static class SharedRegistration
builder.AddScoped<AutocadMaterialBaker>();
builder.AddSingleton<IAutocadIdleManager, AutocadIdleManager>();
builder.AddSingleton<IHostToSpeckleUnitConverter<UnitsValue>>();
// operation progress manager
builder.AddSingleton<IOperationProgressManager, OperationProgressManager>();
@@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Instances;
using Speckle.Converters.Autocad;
using Speckle.Converters.Common;
using Speckle.DoubleNumerics;
using Speckle.Sdk;
@@ -23,25 +24,25 @@ public class AutocadInstanceBaker : IInstanceBaker<List<Entity>>
private readonly AutocadLayerBaker _layerBaker;
private readonly AutocadColorBaker _colorBaker;
private readonly AutocadMaterialBaker _materialBaker;
private readonly IHostToSpeckleUnitConverter<UnitsValue> _unitsConverter;
private readonly AutocadContext _autocadContext;
private readonly ILogger<AutocadInstanceBaker> _logger;
private readonly IConverterSettingsStore<AutocadConversionSettings> _converterSettings;
public AutocadInstanceBaker(
AutocadLayerBaker layerBaker,
AutocadColorBaker colorBaker,
AutocadMaterialBaker materialBaker,
IHostToSpeckleUnitConverter<UnitsValue> unitsConverter,
AutocadContext autocadContext,
ILogger<AutocadInstanceBaker> logger
ILogger<AutocadInstanceBaker> logger,
IConverterSettingsStore<AutocadConversionSettings> converterSettings
)
{
_layerBaker = layerBaker;
_colorBaker = colorBaker;
_materialBaker = materialBaker;
_unitsConverter = unitsConverter;
_autocadContext = autocadContext;
_logger = logger;
_converterSettings = converterSettings;
}
public BakeResult BakeInstances(
@@ -224,10 +225,7 @@ public class AutocadInstanceBaker : IInstanceBaker<List<Entity>>
private Matrix3d GetMatrix3d(Matrix4x4 matrix, string units)
{
var sf = Units.GetConversionFactor(
units,
_unitsConverter.ConvertOrThrow(Application.DocumentManager.CurrentDocument.Database.Insunits)
);
var sf = Units.GetConversionFactor(units, _converterSettings.Current.SpeckleUnits);
var scaledTransform = new[]
{
@@ -8,6 +8,8 @@ using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Sdk;
namespace Speckle.Connectors.Revit.Bindings;
@@ -22,6 +24,7 @@ internal sealed class RevitReceiveBinding : IReceiveBinding
private readonly CancellationManager _cancellationManager;
private readonly DocumentModelStore _store;
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IRevitConversionSettingsFactory _revitConversionSettingsFactory;
private ReceiveBindingUICommands Commands { get; }
public RevitReceiveBinding(
@@ -30,7 +33,8 @@ internal sealed class RevitReceiveBinding : IReceiveBinding
IBridge parent,
IUnitOfWorkFactory unitOfWorkFactory,
IOperationProgressManager operationProgressManager,
ILogger<RevitReceiveBinding> logger
ILogger<RevitReceiveBinding> logger,
IRevitConversionSettingsFactory revitConversionSettingsFactory
)
{
Parent = parent;
@@ -38,6 +42,7 @@ internal sealed class RevitReceiveBinding : IReceiveBinding
_unitOfWorkFactory = unitOfWorkFactory;
_operationProgressManager = operationProgressManager;
_logger = logger;
_revitConversionSettingsFactory = revitConversionSettingsFactory;
_cancellationManager = cancellationManager;
Commands = new ReceiveBindingUICommands(parent);
@@ -47,7 +52,6 @@ internal sealed class RevitReceiveBinding : IReceiveBinding
public async Task Receive(string modelCardId)
{
using var unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
try
{
// Get receiver card
@@ -59,9 +63,19 @@ internal sealed class RevitReceiveBinding : IReceiveBinding
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
using var unitOfWork = _unitOfWorkFactory.Create();
unitOfWork
.Resolve<IConverterSettingsStore<RevitConversionSettings>>()
.Initialize(
_revitConversionSettingsFactory.Create(
DetailLevelType.Coarse, //TODO figure out
null
)
);
// Receive host objects
HostObjectBuilderResult conversionResults = await unitOfWork
.Service.Execute(
.Resolve<ReceiveOperation>()
.Execute(
modelCard.GetReceiveInfo(Speckle.Connectors.Utils.Connector.Slug),
cancellationToken,
(status, progress) =>
@@ -1,6 +1,5 @@
using System.Collections.Concurrent;
using Autodesk.Revit.DB;
using Autofac;
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.DUI.Bindings;
@@ -17,6 +16,7 @@ using Speckle.Connectors.Revit.Plugin;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Sdk;
@@ -34,6 +34,7 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
private readonly ToSpeckleSettingsManager _toSpeckleSettingsManager;
private readonly ILogger<RevitSendBinding> _logger;
private readonly ElementUnpacker _elementUnpacker;
private readonly IRevitConversionSettingsFactory _revitConversionSettingsFactory;
/// <summary>
/// Used internally to aggregate the changed objects' id. Note we're using a concurrent dictionary here as the expiry check method is not thread safe, and this was causing problems. See:
@@ -54,7 +55,8 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
IOperationProgressManager operationProgressManager,
ToSpeckleSettingsManager toSpeckleSettingsManager,
ILogger<RevitSendBinding> logger,
ElementUnpacker elementUnpacker
ElementUnpacker elementUnpacker,
IRevitConversionSettingsFactory revitConversionSettingsFactory
)
: base("sendBinding", store, bridge, revitContext)
{
@@ -66,6 +68,7 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
_toSpeckleSettingsManager = toSpeckleSettingsManager;
_logger = logger;
_elementUnpacker = elementUnpacker;
_revitConversionSettingsFactory = revitConversionSettingsFactory;
var topLevelExceptionHandler = Parent.TopLevelExceptionHandler;
Commands = new SendBindingUICommands(bridge);
@@ -107,18 +110,19 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
using IUnitOfWork<SendOperation<ElementId>> sendOperation = _unitOfWorkFactory.Resolve<SendOperation<ElementId>>(
b =>
{
b.RegisterType<ToSpeckleSettings>().SingleInstance();
b.Register(c => _toSpeckleSettingsManager.GetToSpeckleSettings(modelCard));
}
);
using var unitOfWork = _unitOfWorkFactory.Create();
unitOfWork
.Resolve<IConverterSettingsStore<RevitConversionSettings>>()
.Initialize(
_revitConversionSettingsFactory.Create(
_toSpeckleSettingsManager.GetDetailLevelSetting(modelCard),
_toSpeckleSettingsManager.GetReferencePointSetting(modelCard)
)
);
var activeUIDoc =
RevitContext.UIApplication?.ActiveUIDocument
?? throw new SpeckleException("Unable to retrieve active UI document");
List<ElementId> revitObjects = modelCard
.SendFilter.NotNull()
.GetObjectIds()
@@ -131,8 +135,9 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
throw new SpeckleSendFilterException("No objects were found to convert. Please update your publish filter!");
}
var sendResult = await sendOperation
.Service.Execute(
var sendResult = await unitOfWork
.Resolve<SendOperation<ElementId>>()
.Execute(
revitObjects,
modelCard.GetSendInfo(Speckle.Connectors.Utils.Connector.Slug),
(status, progress) =>
@@ -1,5 +1,6 @@
using Autodesk.Revit.DB;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Sdk.Models.Collections;
namespace Speckle.Connectors.Revit.HostApp;
@@ -9,12 +10,12 @@ namespace Speckle.Connectors.Revit.HostApp;
/// </summary>
public class SendCollectionManager
{
private readonly IRevitConversionContextStack _contextStack;
private readonly IConverterSettingsStore<RevitConversionSettings> _converterSettings;
private readonly Dictionary<string, Collection> _collectionCache = new();
public SendCollectionManager(IRevitConversionContextStack contextStack)
public SendCollectionManager(IConverterSettingsStore<RevitConversionSettings> converterSettings)
{
_contextStack = contextStack;
_converterSettings = converterSettings;
}
/// <summary>
@@ -26,7 +27,7 @@ public class SendCollectionManager
/// <returns></returns>
public Collection GetAndCreateObjectHostCollection(Element element, Collection rootObject)
{
var doc = _contextStack.Current.Document;
var doc = _converterSettings.Current.Document;
var path = new List<string>();
// Step 1: create path components. Currently, this is
@@ -3,7 +3,7 @@ using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Sdk;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models;
@@ -19,21 +19,21 @@ namespace Speckle.Connectors.Revit.Operations.Receive;
internal sealed class RevitHostObjectBuilder : IHostObjectBuilder, IDisposable
{
private readonly IRootToHostConverter _converter;
private readonly IRevitConversionContextStack _contextStack;
private readonly IConverterSettingsStore<RevitConversionSettings> _converterSettings;
private readonly GraphTraversal _traverseFunction;
private readonly ITransactionManager _transactionManager;
private readonly ISyncToThread _syncToThread;
public RevitHostObjectBuilder(
IRootToHostConverter converter,
IRevitConversionContextStack contextStack,
IConverterSettingsStore<RevitConversionSettings> converterSettings,
GraphTraversal traverseFunction,
ITransactionManager transactionManager,
ISyncToThread syncToThread
)
{
_converter = converter;
_contextStack = contextStack;
_converterSettings = converterSettings;
_traverseFunction = traverseFunction;
_transactionManager = transactionManager;
_syncToThread = syncToThread;
@@ -56,7 +56,7 @@ internal sealed class RevitHostObjectBuilder : IHostObjectBuilder, IDisposable
}
using TransactionGroup transactionGroup =
new(_contextStack.Current.Document, $"Received data from {projectName}");
new(_converterSettings.Current.Document, $"Received data from {projectName}");
transactionGroup.Start();
_transactionManager.StartTransaction();
@@ -1,5 +1,6 @@
using Autodesk.Revit.DB;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
namespace Speckle.Connectors.Revit.Operations.Receive;
@@ -9,12 +10,12 @@ namespace Speckle.Connectors.Revit.Operations.Receive;
/// </summary>
public sealed class TransactionManager : ITransactionManager
{
private readonly IRevitConversionContextStack _contextStack;
private Document Document => _contextStack.Current.Document;
private readonly IConverterSettingsStore<RevitConversionSettings> _converterSettings;
private Document Document => _converterSettings.Current.Document;
public TransactionManager(IRevitConversionContextStack contextStack)
public TransactionManager(IConverterSettingsStore<RevitConversionSettings> converterSettings)
{
_contextStack = contextStack;
_converterSettings = converterSettings;
}
// poc : these are being disposed. I'm not sure why I need to supress this warning
@@ -11,6 +11,7 @@ using Speckle.Connectors.Utils.Extensions;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Sdk;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Collections;
@@ -21,32 +22,35 @@ public class RevitRootObjectBuilder : IRootObjectBuilder<ElementId>
{
// POC: SendSelection and RevitConversionContextStack should be interfaces, former needs interfaces
private readonly IRootToSpeckleConverter _converter;
private readonly IRevitConversionContextStack _conversionContextStack;
private readonly IConverterSettingsStore<RevitConversionSettings> _converterSettings;
private readonly Collection _rootObject;
private readonly ISendConversionCache _sendConversionCache;
private readonly ElementUnpacker _elementUnpacker;
private readonly SendCollectionManager _sendCollectionManager;
private readonly RevitMaterialCacheSingleton _revitMaterialCacheSingleton;
private readonly ILogger<RevitRootObjectBuilder> _logger;
public RevitRootObjectBuilder(
IRootToSpeckleConverter converter,
IRevitConversionContextStack conversionContextStack,
IConverterSettingsStore<RevitConversionSettings> converterSettings,
ISendConversionCache sendConversionCache,
ElementUnpacker elementUnpacker,
SendCollectionManager sendCollectionManager,
RevitMaterialCacheSingleton revitMaterialCacheSingleton,
ILogger<RevitRootObjectBuilder> logger
)
{
_converter = converter;
_conversionContextStack = conversionContextStack;
_converterSettings = converterSettings;
_sendConversionCache = sendConversionCache;
_elementUnpacker = elementUnpacker;
_sendCollectionManager = sendCollectionManager;
_revitMaterialCacheSingleton = revitMaterialCacheSingleton;
_logger = logger;
_rootObject = new Collection()
{
name = _conversionContextStack.Current.Document.PathName.Split('\\').Last().Split('.').First()
name = _converterSettings.Current.Document.PathName.Split('\\').Last().Split('.').First()
};
}
@@ -57,7 +61,7 @@ public class RevitRootObjectBuilder : IRootObjectBuilder<ElementId>
CancellationToken ct = default
)
{
var doc = _conversionContextStack.Current.Document;
var doc = _converterSettings.Current.Document;
if (doc.IsFamilyDocument)
{
@@ -69,7 +73,7 @@ public class RevitRootObjectBuilder : IRootObjectBuilder<ElementId>
// Convert ids to actual revit elements
foreach (var id in objects)
{
var el = _conversionContextStack.Current.Document.GetElement(id);
var el = _converterSettings.Current.Document.GetElement(id);
if (el != null)
{
revitElements.Add(el);
@@ -127,9 +131,7 @@ public class RevitRootObjectBuilder : IRootObjectBuilder<ElementId>
}
var idsAndSubElementIds = _elementUnpacker.GetElementsAndSubelementIdsFromAtomicObjects(atomicObjects);
var materialProxies = _conversionContextStack.RenderMaterialProxyCache.GetRenderMaterialProxyListForObjects(
idsAndSubElementIds
);
var materialProxies = _revitMaterialCacheSingleton.GetRenderMaterialProxyListForObjects(idsAndSubElementIds);
_rootObject[ProxyKeys.RENDER_MATERIAL] = materialProxies;
Debug.WriteLine(
@@ -5,11 +5,13 @@ using Speckle.Connectors.Revit.HostApp;
using Speckle.Connectors.Utils.Caching;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.RevitShared.Settings;
using Speckle.InterfaceGenerator;
using Speckle.Sdk.Common;
namespace Speckle.Connectors.Revit.Operations.Send.Settings;
public class ToSpeckleSettingsManager
[GenerateAutoInterface]
public class ToSpeckleSettingsManager : IToSpeckleSettingsManager
{
private readonly RevitContext _revitContext;
private readonly ISendConversionCache _sendConversionCache;
@@ -30,15 +32,7 @@ public class ToSpeckleSettingsManager
_sendConversionCache = sendConversionCache;
}
public ToSpeckleSettings GetToSpeckleSettings(SenderModelCard modelCard)
{
DetailLevelType detailLevel = GetDetailLevelSetting(modelCard);
Transform? referencePointTransform = GetReferencePointSetting(modelCard);
return new ToSpeckleSettings(detailLevel, referencePointTransform);
}
private DetailLevelType GetDetailLevelSetting(SenderModelCard modelCard)
public DetailLevelType GetDetailLevelSetting(SenderModelCard modelCard)
{
var fidelityString = modelCard.Settings?.First(s => s.Id == "detailLevel").Value as string;
if (
@@ -62,7 +56,7 @@ public class ToSpeckleSettingsManager
throw new ArgumentException($"Invalid geometry fidelity value: {fidelityString}");
}
private Transform? GetReferencePointSetting(SenderModelCard modelCard)
public Transform? GetReferencePointSetting(SenderModelCard modelCard)
{
var referencePointString = modelCard.Settings?.First(s => s.Id == "referencePoint").Value as string;
if (
@@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using Rhino;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
@@ -8,6 +9,8 @@ using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
namespace Speckle.Connectors.Rhino.Bindings;
@@ -22,6 +25,7 @@ public class RhinoReceiveBinding : IReceiveBinding
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<RhinoReceiveBinding> _logger;
private readonly IRhinoConversionSettingsFactory _rhinoConversionSettingsFactory;
private ReceiveBindingUICommands Commands { get; }
public RhinoReceiveBinding(
@@ -30,7 +34,8 @@ public class RhinoReceiveBinding : IReceiveBinding
IBridge parent,
IUnitOfWorkFactory unitOfWorkFactory,
IOperationProgressManager operationProgressManager,
ILogger<RhinoReceiveBinding> logger
ILogger<RhinoReceiveBinding> logger,
IRhinoConversionSettingsFactory rhinoConversionSettingsFactory
)
{
Parent = parent;
@@ -38,6 +43,7 @@ public class RhinoReceiveBinding : IReceiveBinding
_unitOfWorkFactory = unitOfWorkFactory;
_operationProgressManager = operationProgressManager;
_logger = logger;
_rhinoConversionSettingsFactory = rhinoConversionSettingsFactory;
_cancellationManager = cancellationManager;
Commands = new ReceiveBindingUICommands(parent);
}
@@ -46,7 +52,10 @@ public class RhinoReceiveBinding : IReceiveBinding
public async Task Receive(string modelCardId)
{
using var unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
using var unitOfWork = _unitOfWorkFactory.Create();
unitOfWork
.Resolve<IConverterSettingsStore<RhinoConversionSettings>>()
.Initialize(_rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
try
{
// Get receiver card
@@ -60,7 +69,8 @@ public class RhinoReceiveBinding : IReceiveBinding
// Receive host objects
HostObjectBuilderResult conversionResults = await unitOfWork
.Service.Execute(
.Resolve<ReceiveOperation>()
.Execute(
modelCard.GetReceiveInfo(Speckle.Connectors.Utils.Connector.Slug),
cancellationToken,
(status, progress) =>
@@ -16,6 +16,8 @@ using Speckle.Connectors.Rhino.HostApp;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
using Speckle.Sdk.Common;
@@ -36,6 +38,7 @@ public sealed class RhinoSendBinding : ISendBinding
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<RhinoSendBinding> _logger;
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
private readonly IRhinoConversionSettingsFactory _rhinoConversionSettingsFactory;
/// <summary>
/// Used internally to aggregate the changed objects' id. Note we're using a concurrent dictionary here as the expiry check method is not thread safe, and this was causing problems. See:
@@ -54,7 +57,8 @@ public sealed class RhinoSendBinding : ISendBinding
CancellationManager cancellationManager,
ISendConversionCache sendConversionCache,
IOperationProgressManager operationProgressManager,
ILogger<RhinoSendBinding> logger
ILogger<RhinoSendBinding> logger,
IRhinoConversionSettingsFactory rhinoConversionSettingsFactory
)
{
_store = store;
@@ -65,6 +69,7 @@ public sealed class RhinoSendBinding : ISendBinding
_sendConversionCache = sendConversionCache;
_operationProgressManager = operationProgressManager;
_logger = logger;
_rhinoConversionSettingsFactory = rhinoConversionSettingsFactory;
_topLevelExceptionHandler = parent.TopLevelExceptionHandler.Parent.TopLevelExceptionHandler;
Parent = parent;
Commands = new SendBindingUICommands(parent); // POC: Commands are tightly coupled with their bindings, at least for now, saves us injecting a factory.
@@ -146,7 +151,10 @@ public sealed class RhinoSendBinding : ISendBinding
public async Task Send(string modelCardId)
{
using var unitOfWork = _unitOfWorkFactory.Resolve<SendOperation<RhinoObject>>();
using var unitOfWork = _unitOfWorkFactory.Create();
unitOfWork
.Resolve<IConverterSettingsStore<RhinoConversionSettings>>()
.Initialize(_rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
try
{
if (_store.GetModelById(modelCardId) is not SenderModelCard modelCard)
@@ -171,7 +179,8 @@ public sealed class RhinoSendBinding : ISendBinding
}
var sendResult = await unitOfWork
.Service.Execute(
.Resolve<SendOperation<RhinoObject>>()
.Execute(
rhinoObjects,
modelCard.GetSendInfo(Speckle.Connectors.Utils.Connector.Slug),
(status, progress) =>
@@ -1,6 +1,6 @@
using Microsoft.Extensions.Logging;
using Rhino;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models.Proxies;
@@ -9,12 +9,15 @@ namespace Speckle.Connectors.Rhino.HostApp;
public class RhinoGroupBaker
{
private readonly IConversionContextStack<RhinoDoc, UnitSystem> _contextStack;
private readonly IConverterSettingsStore<RhinoConversionSettings> _converterSettings;
private readonly ILogger<RhinoGroupBaker> _logger;
public RhinoGroupBaker(IConversionContextStack<RhinoDoc, UnitSystem> contextStack, ILogger<RhinoGroupBaker> logger)
public RhinoGroupBaker(
IConverterSettingsStore<RhinoConversionSettings> converterSettings,
ILogger<RhinoGroupBaker> logger
)
{
_contextStack = contextStack;
_converterSettings = converterSettings;
_logger = logger;
}
@@ -31,7 +34,7 @@ public class RhinoGroupBaker
{
var appIds = groupProxy.objects.SelectMany(oldObjId => applicationIdMap[oldObjId]).Select(id => new Guid(id));
var groupName = (groupProxy.name ?? "No Name Group") + $" ({baseLayerName})";
_contextStack.Current.Document.Groups.Add(groupName, appIds);
_converterSettings.Current.Document.Groups.Add(groupName, appIds);
}
catch (Exception ex) when (!ex.IsFatal())
{
@@ -42,14 +45,14 @@ public class RhinoGroupBaker
public void PurgeGroups(string baseLayerName)
{
for (int i = _contextStack.Current.Document.Groups.Count; i >= 0; i--)
for (int i = _converterSettings.Current.Document.Groups.Count; i >= 0; i--)
{
try
{
var group = _contextStack.Current.Document.Groups.FindIndex(i);
var group = _converterSettings.Current.Document.Groups.FindIndex(i);
if (group is { Name: not null } && group.Name.Contains(baseLayerName))
{
_contextStack.Current.Document.Groups.Delete(i);
_converterSettings.Current.Document.Groups.Delete(i);
}
}
catch (Exception ex) when (!ex.IsFatal())
@@ -1,6 +1,7 @@
using Microsoft.Extensions.Logging;
using Rhino;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Objects.Other;
using Speckle.Sdk;
using Speckle.Sdk.Common;
@@ -10,15 +11,15 @@ namespace Speckle.Connectors.Rhino.HostApp;
public class RhinoMaterialBaker
{
private readonly IConversionContextStack<RhinoDoc, UnitSystem> _contextStack;
private readonly IConverterSettingsStore<RhinoConversionSettings> _converterSettings;
private readonly ILogger<RhinoMaterialBaker> _logger;
public RhinoMaterialBaker(
IConversionContextStack<RhinoDoc, UnitSystem> contextStack,
IConverterSettingsStore<RhinoConversionSettings> converterSettings,
ILogger<RhinoMaterialBaker> logger
)
{
_contextStack = contextStack;
_converterSettings = converterSettings;
_logger = logger;
}
@@ -29,7 +30,7 @@ public class RhinoMaterialBaker
public void BakeMaterials(List<RenderMaterialProxy> speckleRenderMaterialProxies, string baseLayerName)
{
var doc = _contextStack.Current.Document; // POC: too much right now to interface around
var doc = _converterSettings.Current.Document; // POC: too much right now to interface around
// List<ReceiveConversionResult> conversionResults = new(); // TODO: return this guy
foreach (var proxy in speckleRenderMaterialProxies)
@@ -6,6 +6,7 @@ using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Operations.Receive;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models;
@@ -20,7 +21,7 @@ namespace Speckle.Connectors.Rhino.Operations.Receive;
public class RhinoHostObjectBuilder : IHostObjectBuilder
{
private readonly IRootToHostConverter _converter;
private readonly IConversionContextStack<RhinoDoc, UnitSystem> _contextStack;
private readonly IConverterSettingsStore<RhinoConversionSettings> _converterSettings;
private readonly RhinoInstanceBaker _instanceBaker;
private readonly RhinoLayerBaker _layerBaker;
private readonly RhinoMaterialBaker _materialBaker;
@@ -30,7 +31,7 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
public RhinoHostObjectBuilder(
IRootToHostConverter converter,
IConversionContextStack<RhinoDoc, UnitSystem> contextStack,
IConverterSettingsStore<RhinoConversionSettings> converterSettings,
RhinoLayerBaker layerBaker,
RootObjectUnpacker rootObjectUnpacker,
RhinoInstanceBaker instanceBaker,
@@ -40,7 +41,7 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
)
{
_converter = converter;
_contextStack = contextStack;
_converterSettings = converterSettings;
_rootObjectUnpacker = rootObjectUnpacker;
_instanceBaker = instanceBaker;
_materialBaker = materialBaker;
@@ -102,7 +103,7 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
onOperationProgressed?.Invoke("Baking layers (redraw disabled)", null);
using (var _ = SpeckleActivityFactory.Start("Pre baking layers"))
{
using var layerNoDraw = new DisableRedrawScope(_contextStack.Current.Document.Views);
using var layerNoDraw = new DisableRedrawScope(_converterSettings.Current.Document.Views);
foreach (var (path, _) in atomicObjectsWithPath)
{
_layerBaker.GetAndCreateLayerFromPath(path, baseLayerName);
@@ -192,7 +193,7 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
_groupBaker.BakeGroups(unpackedRoot.GroupProxies, applicationIdMap, baseLayerName);
}
_contextStack.Current.Document.Views.Redraw();
_converterSettings.Current.Document.Views.Redraw();
return Task.FromResult(new HostObjectBuilderResult(bakedObjectIds, conversionResults));
}
@@ -200,12 +201,16 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
private void PreReceiveDeepClean(string baseLayerName)
{
// Remove all previously received layers and render materials from the document
int rootLayerIndex = _contextStack.Current.Document.Layers.Find(Guid.Empty, baseLayerName, RhinoMath.UnsetIntIndex);
int rootLayerIndex = _converterSettings.Current.Document.Layers.Find(
Guid.Empty,
baseLayerName,
RhinoMath.UnsetIntIndex
);
_instanceBaker.PurgeInstances(baseLayerName);
_materialBaker.PurgeMaterials(baseLayerName);
var doc = _contextStack.Current.Document;
var doc = _converterSettings.Current.Document;
// Cleans up any previously received objects
if (rootLayerIndex != RhinoMath.UnsetIntIndex)
{
@@ -246,7 +251,7 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
atts.ColorSource = color.Item2;
}
return _contextStack.Current.Document.Objects.Add(obj, atts);
return _converterSettings.Current.Document.Objects.Add(obj, atts);
}
private List<Guid> BakeObjectsAsGroup(
@@ -269,11 +274,11 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
objectIds.Add(id);
}
var groupIndex = _contextStack.Current.Document.Groups.Add(
var groupIndex = _converterSettings.Current.Document.Groups.Add(
$@"{originatingObject.speckle_type.Split('.').Last()} - {originatingObject.applicationId ?? originatingObject.id} ({baseLayerName})",
objectIds
);
var group = _contextStack.Current.Document.Groups.FindIndex(groupIndex);
var group = _converterSettings.Current.Document.Groups.FindIndex(groupIndex);
objectIds.Insert(0, group.Id);
return objectIds;
}
@@ -1,5 +1,4 @@
using Microsoft.Extensions.Logging;
using Rhino;
using Rhino.DocObjects;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
using Speckle.Connectors.Rhino.HostApp;
@@ -10,6 +9,7 @@ using Speckle.Connectors.Utils.Extensions;
using Speckle.Connectors.Utils.Instances;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models;
@@ -26,7 +26,7 @@ public class RhinoRootObjectBuilder : IRootObjectBuilder<RhinoObject>
{
private readonly IRootToSpeckleConverter _rootToSpeckleConverter;
private readonly ISendConversionCache _sendConversionCache;
private readonly IConversionContextStack<RhinoDoc, UnitSystem> _contextStack;
private readonly IConverterSettingsStore<RhinoConversionSettings> _converterSettings;
private readonly RhinoLayerUnpacker _layerUnpacker;
private readonly RhinoInstanceUnpacker _instanceUnpacker;
private readonly RhinoGroupUnpacker _groupUnpacker;
@@ -37,7 +37,7 @@ public class RhinoRootObjectBuilder : IRootObjectBuilder<RhinoObject>
public RhinoRootObjectBuilder(
IRootToSpeckleConverter rootToSpeckleConverter,
ISendConversionCache sendConversionCache,
IConversionContextStack<RhinoDoc, UnitSystem> contextStack,
IConverterSettingsStore<RhinoConversionSettings> converterSettings,
RhinoLayerUnpacker layerUnpacker,
RhinoInstanceUnpacker instanceUnpacker,
RhinoGroupUnpacker groupUnpacker,
@@ -47,7 +47,7 @@ public class RhinoRootObjectBuilder : IRootObjectBuilder<RhinoObject>
)
{
_sendConversionCache = sendConversionCache;
_contextStack = contextStack;
_converterSettings = converterSettings;
_layerUnpacker = layerUnpacker;
_instanceUnpacker = instanceUnpacker;
_groupUnpacker = groupUnpacker;
@@ -73,7 +73,7 @@ public class RhinoRootObjectBuilder : IRootObjectBuilder<RhinoObject>
{
using var activity = SpeckleActivityFactory.Start("Build");
// 0 - Init the root
Collection rootObjectCollection = new() { name = _contextStack.Current.Document.Name ?? "Unnamed document" };
Collection rootObjectCollection = new() { name = _converterSettings.Current.Document.Name ?? "Unnamed document" };
// 1 - Unpack the instances
UnpackResult<RhinoObject> unpackResults;
@@ -102,7 +102,7 @@ public class RhinoRootObjectBuilder : IRootObjectBuilder<RhinoObject>
cancellationToken.ThrowIfCancellationRequested();
// handle layer
Layer layer = _contextStack.Current.Document.Layers[rhinoObject.Attributes.LayerIndex];
Layer layer = _converterSettings.Current.Document.Layers[rhinoObject.Attributes.LayerIndex];
versionLayers.Add(layer);
Collection collectionHost = _layerUnpacker.GetHostObjectCollection(layer, rootObjectCollection);
@@ -10,6 +10,8 @@ public class ArcGISConverterModule : ISpeckleModule
{
public void Load(SpeckleContainerBuilder builder)
{
//register types by default
builder.ScanAssemblyOfType<ArcGISConversionSettings>();
// add single root converter
//don't need a host specific RootToSpeckleConverter
builder.AddRootCommon<RootToSpeckleConverter>();
@@ -23,11 +25,11 @@ public class ArcGISConverterModule : ISpeckleModule
builder.AddScoped<IArcGISFieldUtils, ArcGISFieldUtils>();
builder.AddScoped<ILocalToGlobalConverterUtils, LocalToGlobalConverterUtils>();
builder.AddScoped<ICharacterCleaner, CharacterCleaner>();
builder.AddScoped<ArcGISDocument>();
builder.AddScoped<IHostToSpeckleUnitConverter<Unit>, ArcGISToSpeckleUnitConverter>();
// single stack per conversion
builder.AddScoped<IConversionContextStack<ArcGISDocument, Unit>, ArcGISConversionContextStack>();
builder.AddScoped<
IConverterSettingsStore<ArcGISConversionSettings>,
ConverterSettingsStore<ArcGISConversionSettings>
>();
}
}
@@ -0,0 +1,13 @@
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Mapping;
using Speckle.Converters.ArcGIS3.Utils;
namespace Speckle.Converters.ArcGIS3;
public record ArcGISConversionSettings(
Project Project,
Map Map,
Uri SpeckleDatabasePath,
CRSoffsetRotation ActiveCRSoffsetRotation,
string SpeckleUnits
);
@@ -1,38 +1,34 @@
using System.Diagnostics.CodeAnalysis;
using ArcGIS.Core.Data;
using ArcGIS.Core.Data;
using ArcGIS.Core.Data.DDL;
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Mapping;
using Speckle.Converters.ArcGIS3.Utils;
using Speckle.Converters.Common;
using Speckle.InterfaceGenerator;
namespace Speckle.Converters.ArcGIS3;
public class ArcGISDocument
[GenerateAutoInterface]
public class ArcGISConversionSettingsFactory(IHostToSpeckleUnitConverter<ACG.Unit> unitConverter)
: IArcGISConversionSettingsFactory
{
public Project Project { get; }
public Map Map { get; }
public Uri SpeckleDatabasePath { get; }
public CRSoffsetRotation ActiveCRSoffsetRotation { get; set; }
public ArcGISDocument()
{
Project = Project.Current;
Map = MapView.Active.Map;
SpeckleDatabasePath = EnsureOrAddSpeckleDatabase();
// CRS of either: incoming commit to be applied to all received objects, or CRS to convert all objects to, before sending
// created per Send/Receive operation, will be the same for all objects in the operation
ActiveCRSoffsetRotation = new CRSoffsetRotation(MapView.Active.Map);
}
private const string FGDB_NAME = "Speckle.gdb";
public ArcGISConversionSettings Create(Project project, Map map, CRSoffsetRotation activeCRSoffsetRotation) =>
new(
project,
map,
EnsureOrAddSpeckleDatabase(),
activeCRSoffsetRotation,
unitConverter.ConvertOrThrow(activeCRSoffsetRotation.SpatialReference.Unit)
);
public Uri EnsureOrAddSpeckleDatabase()
{
return AddDatabaseToProject(GetDatabasePath());
}
private const string FGDB_NAME = "Speckle.gdb";
public Uri GetDatabasePath()
{
try
@@ -109,18 +105,3 @@ public class ArcGISDocument
return databasePath;
}
}
// POC: Suppressed naming warning for now, but we should evaluate if we should follow this or disable it.
[SuppressMessage(
"Naming",
"CA1711:Identifiers should not have incorrect suffix",
Justification = "Name ends in Stack but it is in fact a Stack, just not inheriting from `System.Collections.Stack`"
)]
public class ArcGISConversionContextStack : ConversionContextStack<ArcGISDocument, ACG.Unit>
{
public ArcGISConversionContextStack(
IHostToSpeckleUnitConverter<ACG.Unit> unitConverter,
ArcGISDocument arcGisDocument
)
: base(arcGisDocument, MapView.Active.Map.SpatialReference.Unit, unitConverter) { }
}
@@ -7,15 +7,15 @@ namespace Speckle.Converters.ArcGIS3.ToHost.Raw;
public class MeshListToHostConverter : ITypedConverter<List<SOG.Mesh>, ACG.Multipatch>
{
private readonly ITypedConverter<SOG.Point, ACG.MapPoint> _pointConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public MeshListToHostConverter(
ITypedConverter<SOG.Point, ACG.MapPoint> pointConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public ACG.Multipatch Convert(List<SOG.Mesh> target)
@@ -24,8 +24,7 @@ public class MeshListToHostConverter : ITypedConverter<List<SOG.Mesh>, ACG.Multi
{
throw new SpeckleConversionException("Feature contains no geometries");
}
ACG.MultipatchBuilderEx multipatchPart =
new(_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference);
ACG.MultipatchBuilderEx multipatchPart = new(_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference);
foreach (SOG.Mesh part in target)
{
@@ -6,25 +6,26 @@ namespace Speckle.Converters.ArcGIS3.ToHost.Raw;
public class PointToHostConverter : ITypedConverter<SOG.Point, ACG.MapPoint>
{
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public PointToHostConverter(IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack)
public PointToHostConverter(IConverterSettingsStore<ArcGISConversionSettings> settingsStore)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Point)target);
public ACG.MapPoint Convert(SOG.Point target)
{
SOG.Point scaledMovedRotatedPoint = _contextStack.Current.Document.ActiveCRSoffsetRotation.OffsetRotateOnReceive(
target
SOG.Point scaledMovedRotatedPoint = _settingsStore.Current.ActiveCRSoffsetRotation.OffsetRotateOnReceive(
target,
_settingsStore.Current.SpeckleUnits
);
return new ACG.MapPointBuilderEx(
scaledMovedRotatedPoint.x,
scaledMovedRotatedPoint.y,
scaledMovedRotatedPoint.z,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
}
}
@@ -8,15 +8,15 @@ namespace Speckle.Converters.ArcGIS3.ToHost.TopLevel;
public class ArcToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.Arc, ACG.Polyline>
{
private readonly ITypedConverter<SOG.Point, ACG.MapPoint> _pointConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public ArcToHostConverter(
ITypedConverter<SOG.Point, ACG.MapPoint> pointConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Arc)target);
@@ -35,13 +35,13 @@ public class ArcToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.
fromPt,
toPt,
new ACG.Coordinate2D(midPt),
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
);
return new ACG.PolylineBuilderEx(
segment,
ACG.AttributeFlags.HasZ,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
}
}
@@ -9,15 +9,15 @@ namespace Speckle.Converters.ArcGIS3.ToHost.TopLevel;
public class CircleToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.Circle, ACG.Polyline>
{
private readonly ITypedConverter<SOG.Point, ACG.MapPoint> _pointConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public CircleToHostConverter(
ITypedConverter<SOG.Point, ACG.MapPoint> pointConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Circle)target);
@@ -37,18 +37,18 @@ public class CircleToHostConverter : IToHostTopLevelConverter, ITypedConverter<S
// create a native ArcGIS circle segment
ACG.MapPoint centerPt = _pointConverter.Convert(target.plane.origin);
double scaleFactor = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double scaleFactor = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
ACG.EllipticArcSegment circleSegment = ACG.EllipticArcBuilderEx.CreateCircle(
new ACG.Coordinate2D(centerPt.X, centerPt.Y),
(double)target.radius * scaleFactor,
ACG.ArcOrientation.ArcClockwise,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
);
return new ACG.PolylineBuilderEx(
circleSegment,
ACG.AttributeFlags.HasZ,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
}
}
@@ -9,15 +9,15 @@ namespace Speckle.Converters.ArcGIS3.ToHost.TopLevel;
public class EllipseToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.Ellipse, ACG.Polyline>
{
private readonly ITypedConverter<SOG.Point, ACG.MapPoint> _pointConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public EllipseToHostConverter(
ITypedConverter<SOG.Point, ACG.MapPoint> pointConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Ellipse)target);
@@ -35,12 +35,12 @@ public class EllipseToHostConverter : IToHostTopLevelConverter, ITypedConverter<
}
ACG.MapPoint centerPt = _pointConverter.Convert(target.plane.origin);
double scaleFactor = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double scaleFactor = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
// set default values
double angle =
Math.Atan2(target.plane.xdir.y, target.plane.xdir.x)
+ _contextStack.Current.Document.ActiveCRSoffsetRotation.TrueNorthRadians;
+ _settingsStore.Current.ActiveCRSoffsetRotation.TrueNorthRadians;
double majorAxisRadius = (double)target.firstRadius;
double minorAxisRatio = (double)target.secondRadius / majorAxisRadius;
@@ -58,13 +58,13 @@ public class EllipseToHostConverter : IToHostTopLevelConverter, ITypedConverter<
majorAxisRadius * scaleFactor,
minorAxisRatio,
ACG.ArcOrientation.ArcCounterClockwise,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
);
return new ACG.PolylineBuilderEx(
segment,
ACG.AttributeFlags.HasZ,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
}
}
@@ -8,15 +8,15 @@ namespace Speckle.Converters.ArcGIS3.ToHost.TopLevel;
public class LineSingleToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.Line, ACG.Polyline>
{
private readonly ITypedConverter<SOG.Point, ACG.MapPoint> _pointConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public LineSingleToHostConverter(
ITypedConverter<SOG.Point, ACG.MapPoint> pointConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Line)target);
@@ -28,7 +28,7 @@ public class LineSingleToHostConverter : IToHostTopLevelConverter, ITypedConvert
return new ACG.PolylineBuilderEx(
points,
ACG.AttributeFlags.HasZ,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
}
}
@@ -7,19 +7,16 @@ namespace Speckle.Converters.ArcGIS3.ToHost.TopLevel;
[NameAndRankValue(nameof(SOG.Polycurve), NameAndRankValueAttribute.SPECKLE_DEFAULT_RANK)]
public class PolycurveToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.Polycurve, ACG.Polyline>
{
private readonly ITypedConverter<SOG.Point, ACG.MapPoint> _pointConverter;
private readonly IRootToHostConverter _converter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public PolycurveToHostConverter(
ITypedConverter<SOG.Point, ACG.MapPoint> pointConverter,
IRootToHostConverter converter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_converter = converter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Polycurve)target);
@@ -54,7 +51,7 @@ public class PolycurveToHostConverter : IToHostTopLevelConverter, ITypedConverte
return new ACG.PolylineBuilderEx(
segments,
ACG.AttributeFlags.HasZ,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
}
}
@@ -8,15 +8,15 @@ namespace Speckle.Converters.ArcGIS3.ToHost.TopLevel;
public class PolylineToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.Polyline, ACG.Polyline>
{
private readonly ITypedConverter<SOG.Point, ACG.MapPoint> _pointConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public PolylineToHostConverter(
ITypedConverter<SOG.Point, ACG.MapPoint> pointConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Polyline)target);
@@ -32,7 +32,7 @@ public class PolylineToHostConverter : IToHostTopLevelConverter, ITypedConverter
return new ACG.PolylineBuilderEx(
points,
ACG.AttributeFlags.HasZ,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
}
}
@@ -7,15 +7,15 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.Raw;
public class EnvelopToSpeckleConverter : ITypedConverter<Envelope, SOG.Box>
{
private readonly IConversionContextStack<ArcGISDocument, Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
private readonly ITypedConverter<MapPoint, SOG.Point> _pointConverter;
public EnvelopToSpeckleConverter(
IConversionContextStack<ArcGISDocument, Unit> contextStack,
IConverterSettingsStore<ArcGISConversionSettings> settingsStore,
ITypedConverter<MapPoint, SOG.Point> pointConverter
)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
_pointConverter = pointConverter;
}
@@ -25,18 +25,18 @@ public class EnvelopToSpeckleConverter : ITypedConverter<Envelope, SOG.Box>
target.XMin,
target.YMin,
target.ZMin,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
MapPoint pointMax = new MapPointBuilderEx(
target.XMax,
target.YMax,
target.ZMax,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
SOG.Point minPtSpeckle = _pointConverter.Convert(pointMin);
SOG.Point maxPtSpeckle = _pointConverter.Convert(pointMax);
var units = _contextStack.Current.SpeckleUnits;
var units = _settingsStore.Current.SpeckleUnits;
SOG.Plane plane =
new()
@@ -54,7 +54,7 @@ public class EnvelopToSpeckleConverter : ITypedConverter<Envelope, SOG.Box>
xSize = new Interval { start = minPtSpeckle.x, end = maxPtSpeckle.x },
ySize = new Interval { start = minPtSpeckle.y, end = maxPtSpeckle.y },
zSize = new Interval { start = minPtSpeckle.z, end = maxPtSpeckle.z },
units = _contextStack.Current.SpeckleUnits
units = _settingsStore.Current.SpeckleUnits
};
}
}
@@ -15,7 +15,7 @@ public class GisFeatureToSpeckleConverter : ITypedConverter<(Row, string), IGisF
private readonly ITypedConverter<ACG.Polygon, IReadOnlyList<SGIS.PolygonGeometry>> _polygonConverter;
private readonly ITypedConverter<ACG.Multipatch, IReadOnlyList<Base>> _multipatchConverter;
private readonly ITypedConverter<Row, Base> _attributeConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public GisFeatureToSpeckleConverter(
ITypedConverter<ACG.MapPoint, SOG.Point> pointConverter,
@@ -24,7 +24,7 @@ public class GisFeatureToSpeckleConverter : ITypedConverter<(Row, string), IGisF
ITypedConverter<ACG.Polygon, IReadOnlyList<SGIS.PolygonGeometry>> polygonConverter,
ITypedConverter<ACG.Multipatch, IReadOnlyList<Base>> multipatchConverter,
ITypedConverter<Row, Base> attributeConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
@@ -33,7 +33,7 @@ public class GisFeatureToSpeckleConverter : ITypedConverter<(Row, string), IGisF
_polygonConverter = polygonConverter;
_multipatchConverter = multipatchConverter;
_attributeConverter = attributeConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
private List<SOG.Mesh> GetPolygonDisplayMeshes(List<SGIS.PolygonGeometry> polygons)
@@ -64,7 +64,7 @@ public class GisFeatureToSpeckleConverter : ITypedConverter<(Row, string), IGisF
{
vertices = boundaryPts.SelectMany(x => new List<double> { x.x, x.y, x.z }).ToList(),
faces = faces,
units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
units = _settingsStore.Current.SpeckleUnits
};
displayVal.Add(mesh);
}
@@ -82,7 +82,7 @@ public class GisFeatureToSpeckleConverter : ITypedConverter<(Row, string), IGisF
{
vertices = geo.vertices,
faces = geo.faces,
units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
units = _settingsStore.Current.SpeckleUnits
};
displayVal.Add(displayMesh);
}
@@ -8,11 +8,11 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.Raw;
public class GisRasterToSpeckleConverter : ITypedConverter<Raster, RasterElement>
{
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public GisRasterToSpeckleConverter(IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack)
public GisRasterToSpeckleConverter(IConverterSettingsStore<ArcGISConversionSettings> settingsStore)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((Raster)target);
@@ -178,7 +178,7 @@ public class GisRasterToSpeckleConverter : ITypedConverter<Raster, RasterElement
vertices = newCoords,
faces = newFaces,
colors = newColors,
units = _contextStack.Current.SpeckleUnits
units = _settingsStore.Current.SpeckleUnits
};
rasterElement.displayValue = new List<SOG.Mesh>() { mesh };
@@ -10,15 +10,15 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.Raw;
/// </summary>
public class MultipatchFeatureToSpeckleConverter : ITypedConverter<ACG.Multipatch, IReadOnlyList<Base>>
{
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
private readonly ITypedConverter<ACG.MapPoint, SOG.Point> _pointConverter;
public MultipatchFeatureToSpeckleConverter(
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack,
IConverterSettingsStore<ArcGISConversionSettings> settingsStore,
ITypedConverter<ACG.MapPoint, SOG.Point> pointConverter
)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
_pointConverter = pointConverter;
}
@@ -26,8 +26,7 @@ public class MultipatchFeatureToSpeckleConverter : ITypedConverter<ACG.Multipatc
{
List<Base> converted = new();
// placeholder, needs to be declared in order to be used in the Ring patch type
SGIS.PolygonGeometry3d polygonGeom =
new() { units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString };
SGIS.PolygonGeometry3d polygonGeom = new() { units = _settingsStore.Current.SpeckleUnits };
// convert and store all multipatch points per Part
List<List<SOG.Point>> allPoints = new();
@@ -53,19 +52,19 @@ public class MultipatchFeatureToSpeckleConverter : ITypedConverter<ACG.Multipatc
if (patchType == ACG.PatchType.TriangleStrip)
{
SGIS.GisMultipatchGeometry multipatch = target.CompleteMultipatchTriangleStrip(allPoints, idx);
multipatch.units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString;
multipatch.units = _settingsStore.Current.SpeckleUnits;
converted.Add(multipatch);
}
else if (patchType == ACG.PatchType.Triangles)
{
SGIS.GisMultipatchGeometry multipatch = target.CompleteMultipatchTriangles(allPoints, idx);
multipatch.units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString;
multipatch.units = _settingsStore.Current.SpeckleUnits;
converted.Add(multipatch);
}
else if (patchType == ACG.PatchType.TriangleFan)
{
SGIS.GisMultipatchGeometry multipatch = target.CompleteMultipatchTriangleFan(allPoints, idx);
multipatch.units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString;
multipatch.units = _settingsStore.Current.SpeckleUnits;
converted.Add(multipatch);
}
// in case of RingMultipatch - return PolygonGeometry3d
@@ -79,19 +78,10 @@ public class MultipatchFeatureToSpeckleConverter : ITypedConverter<ACG.Multipatc
}
// first ring means a start of a new PolygonGeometry3d
polygonGeom = new()
{
voids = new List<SOG.Polyline>(),
units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
};
polygonGeom = new() { voids = new List<SOG.Polyline>(), units = _settingsStore.Current.SpeckleUnits };
List<double> pointCoords = allPoints[idx].SelectMany(x => new List<double>() { x.x, x.y, x.z }).ToList();
SOG.Polyline polyline =
new()
{
value = pointCoords,
units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
};
SOG.Polyline polyline = new() { value = pointCoords, units = _settingsStore.Current.SpeckleUnits };
polygonGeom.boundary = polyline;
// if it's already the last part, add to list
@@ -103,12 +93,7 @@ public class MultipatchFeatureToSpeckleConverter : ITypedConverter<ACG.Multipatc
else if (patchType == ACG.PatchType.Ring)
{
List<double> pointCoords = allPoints[idx].SelectMany(x => new List<double>() { x.x, x.y, x.z }).ToList();
SOG.Polyline polyline =
new()
{
value = pointCoords,
units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
};
SOG.Polyline polyline = new() { value = pointCoords, units = _settingsStore.Current.SpeckleUnits };
// every outer ring is oriented clockwise
bool isClockwise = polyline.IsClockwisePolygon();
@@ -125,7 +110,7 @@ public class MultipatchFeatureToSpeckleConverter : ITypedConverter<ACG.Multipatc
{
voids = new List<SOG.Polyline>(),
boundary = polyline,
units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
units = _settingsStore.Current.SpeckleUnits
};
}
// if it's already the last part, add to list
@@ -6,11 +6,11 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.Raw;
public class PointToSpeckleConverter : ITypedConverter<MapPoint, SOG.Point>
{
private readonly IConversionContextStack<ArcGISDocument, Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public PointToSpeckleConverter(IConversionContextStack<ArcGISDocument, Unit> contextStack)
public PointToSpeckleConverter(IConverterSettingsStore<ArcGISConversionSettings> settingsStore)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public SOG.Point Convert(MapPoint target)
@@ -19,12 +19,12 @@ public class PointToSpeckleConverter : ITypedConverter<MapPoint, SOG.Point>
{
// reproject to Active CRS
if (
GeometryEngine.Instance.Project(target, _contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference)
GeometryEngine.Instance.Project(target, _settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference)
is not MapPoint reprojectedPt
)
{
throw new SpeckleConversionException(
$"Conversion to Spatial Reference {_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference.Name} failed"
$"Conversion to Spatial Reference {_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference.Name} failed"
);
}
@@ -36,27 +36,23 @@ public class PointToSpeckleConverter : ITypedConverter<MapPoint, SOG.Point>
)
{
throw new SpeckleConversionException(
$"Conversion to Spatial Reference {_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference.Name} failed: coordinates undefined"
$"Conversion to Spatial Reference {_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference.Name} failed: coordinates undefined"
);
}
// convert to Speckle Pt
SOG.Point reprojectedSpecklePt =
new(
reprojectedPt.X,
reprojectedPt.Y,
reprojectedPt.Z,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
);
SOG.Point scaledMovedRotatedPoint = _contextStack.Current.Document.ActiveCRSoffsetRotation.OffsetRotateOnSend(
reprojectedSpecklePt
new(reprojectedPt.X, reprojectedPt.Y, reprojectedPt.Z, _settingsStore.Current.SpeckleUnits);
SOG.Point scaledMovedRotatedPoint = _settingsStore.Current.ActiveCRSoffsetRotation.OffsetRotateOnSend(
reprojectedSpecklePt,
_settingsStore.Current.SpeckleUnits
);
return scaledMovedRotatedPoint;
}
catch (ArgumentException ex)
{
throw new SpeckleConversionException(
$"Conversion to Spatial Reference {_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference.Name} failed",
$"Conversion to Spatial Reference {_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference.Name} failed",
ex
);
}
@@ -7,15 +7,15 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.Raw;
public class PolygonFeatureToSpeckleConverter : ITypedConverter<ACG.Polygon, IReadOnlyList<PolygonGeometry>>
{
private readonly ITypedConverter<ACG.ReadOnlySegmentCollection, SOG.Polyline> _segmentConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public PolygonFeatureToSpeckleConverter(
ITypedConverter<ACG.ReadOnlySegmentCollection, SOG.Polyline> segmentConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_segmentConverter = segmentConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public IReadOnlyList<PolygonGeometry> Convert(ACG.Polygon target)
@@ -44,7 +44,7 @@ public class PolygonFeatureToSpeckleConverter : ITypedConverter<ACG.Polygon, IRe
{
boundary = polyline,
voids = new List<SOG.Polyline>(),
units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
units = _settingsStore.Current.SpeckleUnits
};
polygonList.Add(polygon);
}
@@ -6,15 +6,15 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.Raw;
public class PolyineFeatureToSpeckleConverter : ITypedConverter<ACG.Polyline, IReadOnlyList<SOG.Polyline>>
{
private readonly ITypedConverter<ACG.ReadOnlySegmentCollection, SOG.Polyline> _segmentConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public PolyineFeatureToSpeckleConverter(
ITypedConverter<ACG.ReadOnlySegmentCollection, SOG.Polyline> segmentConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_segmentConverter = segmentConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public IReadOnlyList<SOG.Polyline> Convert(ACG.Polyline target)
@@ -26,10 +26,9 @@ public class PolyineFeatureToSpeckleConverter : ITypedConverter<ACG.Polyline, IR
// densify the polylines with curves using precision value of the Map's Spatial Reference
if (target.HasCurves)
{
double tolerance = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference.XYTolerance;
double conversionFactorToMeter = _contextStack
double tolerance = _settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference.XYTolerance;
double conversionFactorToMeter = _settingsStore
.Current
.Document
.ActiveCRSoffsetRotation
.SpatialReference
.Unit
@@ -5,15 +5,15 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.Raw;
public class SegmentCollectionToSpeckleConverter : ITypedConverter<ACG.ReadOnlySegmentCollection, SOG.Polyline>
{
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
private readonly ITypedConverter<ACG.MapPoint, SOG.Point> _pointConverter;
public SegmentCollectionToSpeckleConverter(
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack,
IConverterSettingsStore<ArcGISConversionSettings> settingsStore,
ITypedConverter<ACG.MapPoint, SOG.Point> pointConverter
)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
_pointConverter = pointConverter;
}
@@ -33,13 +33,12 @@ public class SegmentCollectionToSpeckleConverter : ITypedConverter<ACG.ReadOnlyS
ACG.Polyline polylineFromSegment = new ACG.PolylineBuilderEx(
segment,
ACG.AttributeFlags.HasZ,
_contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference
_settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference
).ToGeometry();
double tolerance = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference.XYTolerance;
double conversionFactorToMeter = _contextStack
double tolerance = _settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference.XYTolerance;
double conversionFactorToMeter = _settingsStore
.Current
.Document
.ActiveCRSoffsetRotation
.SpatialReference
.Unit
@@ -113,7 +112,7 @@ public class SegmentCollectionToSpeckleConverter : ITypedConverter<ACG.ReadOnlyS
{
value = points.SelectMany(pt => new[] { pt.x, pt.y, pt.z, }).ToList(),
closed = closed,
units = _contextStack.Current.SpeckleUnits
units = _settingsStore.Current.SpeckleUnits
};
return polyline;
@@ -15,17 +15,17 @@ public class PointCloudToSpeckleConverter
{
private readonly ITypedConverter<ACG.MapPoint, SOG.Point> _pointConverter;
private readonly ITypedConverter<ACG.Envelope, SOG.Box> _boxConverter;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public PointCloudToSpeckleConverter(
ITypedConverter<ACG.MapPoint, SOG.Point> pointConverter,
ITypedConverter<ACG.Envelope, SOG.Box> boxConverter,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
private int GetPointColor(LasPoint pt, object renderer)
@@ -103,7 +103,7 @@ public class PointCloudToSpeckleConverter
colors = speckleColors,
sizes = values,
bbox = _boxConverter.Convert(target.QueryExtent()),
units = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString
units = _settingsStore.Current.SpeckleUnits
};
speckleLayer.elements.Add(cloud);
@@ -1,5 +1,4 @@
using ArcGIS.Core.Data.Raster;
using ArcGIS.Core.Geometry;
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
using Speckle.Objects.GIS;
@@ -12,15 +11,15 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.TopLevel;
public class RasterLayerToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConverter<RasterLayer, SGIS.RasterLayer>
{
private readonly ITypedConverter<Raster, RasterElement> _gisRasterConverter;
private readonly IConversionContextStack<ArcGISDocument, Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public RasterLayerToSpeckleConverter(
ITypedConverter<Raster, RasterElement> gisRasterConverter,
IConversionContextStack<ArcGISDocument, Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_gisRasterConverter = gisRasterConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target)
@@ -37,7 +36,7 @@ public class RasterLayerToSpeckleConverter : IToSpeckleTopLevelConverter, ITyped
// get active map CRS if layer CRS is empty
if (spatialRefRaster.Unit is null)
{
spatialRefRaster = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference;
spatialRefRaster = _settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference;
}
speckleLayer.rasterCrs = new CRS
{
@@ -1,5 +1,4 @@
using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry;
using ArcGIS.Desktop.Mapping;
using Speckle.Converters.ArcGIS3.Utils;
using Speckle.Converters.Common;
@@ -14,15 +13,10 @@ namespace Speckle.Converters.ArcGIS3.ToSpeckle.TopLevel;
public class VectorLayerToSpeckleConverter : IToSpeckleTopLevelConverter, ITypedConverter<FeatureLayer, VectorLayer>
{
private readonly ITypedConverter<(Row, string), IGisFeature> _gisFeatureConverter;
private readonly IConversionContextStack<ArcGISDocument, Unit> _contextStack;
public VectorLayerToSpeckleConverter(
ITypedConverter<(Row, string), IGisFeature> gisFeatureConverter,
IConversionContextStack<ArcGISDocument, Unit> contextStack
)
public VectorLayerToSpeckleConverter(ITypedConverter<(Row, string), IGisFeature> gisFeatureConverter)
{
_gisFeatureConverter = gisFeatureConverter;
_contextStack = contextStack;
}
public Base Convert(object target)
@@ -16,16 +16,15 @@ namespace Speckle.Converters.ArcGIS3.Utils;
public struct CRSoffsetRotation
{
public ACG.SpatialReference SpatialReference { get; }
public string SpeckleUnitString { get; set; }
public double LatOffset { get; set; }
public double LonOffset { get; set; }
public double TrueNorthRadians { get; set; }
public SOG.Point OffsetRotateOnReceive(SOG.Point pointOriginal)
public SOG.Point OffsetRotateOnReceive(SOG.Point pointOriginal, string speckleUnitString)
{
// scale point to match units of the SpatialReference
string originalUnits = pointOriginal.units;
SOG.Point point = ScalePoint(pointOriginal, originalUnits, SpeckleUnitString);
SOG.Point point = ScalePoint(pointOriginal, originalUnits, speckleUnitString);
// 1. rotate coordinates
NormalizeAngle();
@@ -34,16 +33,16 @@ public struct CRSoffsetRotation
// 2. offset coordinates
x2 += LonOffset;
y2 += LatOffset;
SOG.Point movedPoint = new(x2, y2, point.z, SpeckleUnitString);
SOG.Point movedPoint = new(x2, y2, point.z, speckleUnitString);
return movedPoint;
}
public SOG.Point OffsetRotateOnSend(SOG.Point point)
public SOG.Point OffsetRotateOnSend(SOG.Point point, string speckleUnitString)
{
// scale point to match units of the SpatialReference
string originalUnits = point.units;
point = ScalePoint(point, originalUnits, SpeckleUnitString);
point = ScalePoint(point, originalUnits, speckleUnitString);
// 1. offset coordinates
NormalizeAngle();
@@ -52,7 +51,7 @@ public struct CRSoffsetRotation
// 2. rotate coordinates
double x2 = x * Math.Cos(TrueNorthRadians) + y * Math.Sin(TrueNorthRadians);
double y2 = -x * Math.Sin(TrueNorthRadians) + y * Math.Cos(TrueNorthRadians);
SOG.Point movedPoint = new(x2, y2, point.z, SpeckleUnitString);
SOG.Point movedPoint = new(x2, y2, point.z, speckleUnitString);
return movedPoint;
}
@@ -63,11 +62,6 @@ public struct CRSoffsetRotation
return new SOG.Point(point.x * scaleFactor, point.y * scaleFactor, point.z * scaleFactor, toUnit);
}
private readonly string GetSpeckleUnit(ACG.SpatialReference spatialReference)
{
return new ArcGISToSpeckleUnitConverter().ConvertOrThrow(spatialReference.Unit);
}
private void NormalizeAngle()
{
if (TrueNorthRadians < -2 * Math.PI || TrueNorthRadians > 2 * Math.PI)
@@ -112,7 +106,6 @@ public struct CRSoffsetRotation
public CRSoffsetRotation(ACG.SpatialReference spatialReference)
{
SpatialReference = spatialReference;
SpeckleUnitString = GetSpeckleUnit(spatialReference);
LatOffset = 0;
LonOffset = 0;
TrueNorthRadians = 0;
@@ -127,7 +120,6 @@ public struct CRSoffsetRotation
ACG.SpatialReference spatialReference = map.SpatialReference;
SpatialReference = spatialReference;
SpeckleUnitString = GetSpeckleUnit(spatialReference);
// read from metadata
string metadata = map.GetMetadata();
@@ -185,7 +177,6 @@ public struct CRSoffsetRotation
)
{
SpatialReference = spatialReference;
SpeckleUnitString = GetSpeckleUnit(spatialReference);
LatOffset = latOffset;
LonOffset = lonOffset;
TrueNorthRadians = trueNorthRadians;
@@ -5,16 +5,9 @@ using Speckle.Sdk.Models;
namespace Speckle.Converters.ArcGIS3.Utils;
[GenerateAutoInterface]
public class CrsUtils : ICrsUtils
public class CrsUtils(IConverterSettingsStore<ArcGISConversionSettings> settingsStore) : ICrsUtils
{
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
public CrsUtils(IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack)
{
_contextStack = contextStack;
}
public void FindSetCrsDataOnReceive(Base? rootObj)
public IDisposable? FindSetCrsDataOnReceive(Base? rootObj)
{
if (rootObj is SGIS.VectorLayer vLayer)
{
@@ -31,12 +24,14 @@ public class CrsUtils : ICrsUtils
double trueNorthRadians = System.Convert.ToDouble((vLayer.crs?.rotation == null) ? 0 : vLayer.crs.rotation);
double latOffset = System.Convert.ToDouble((vLayer.crs?.offset_y == null) ? 0 : vLayer.crs.offset_y);
double lonOffset = System.Convert.ToDouble((vLayer.crs?.offset_x == null) ? 0 : vLayer.crs.offset_x);
_contextStack.Current.Document.ActiveCRSoffsetRotation = new CRSoffsetRotation(
spatialRef,
latOffset,
lonOffset,
trueNorthRadians
return settingsStore.Push(x =>
x with
{
ActiveCRSoffsetRotation = new CRSoffsetRotation(spatialRef, latOffset, lonOffset, trueNorthRadians)
}
);
}
return null;
}
}
@@ -15,15 +15,15 @@ namespace Speckle.Converters.ArcGIS3.Utils;
public class FeatureClassUtils : IFeatureClassUtils
{
private readonly IArcGISFieldUtils _fieldsUtils;
private readonly IConversionContextStack<ArcGISDocument, ACG.Unit> _contextStack;
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
public FeatureClassUtils(
IArcGISFieldUtils fieldsUtils,
IConversionContextStack<ArcGISDocument, ACG.Unit> contextStack
IConverterSettingsStore<ArcGISConversionSettings> settingsStore
)
{
_fieldsUtils = fieldsUtils;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public void ClearExistingDataset(string featureClassName)
@@ -66,8 +66,7 @@ public class FeatureClassUtils : IFeatureClassUtils
private Geodatabase GetDatabase()
{
// get database
FileGeodatabaseConnectionPath fileGeodatabaseConnectionPath =
new(_contextStack.Current.Document.SpeckleDatabasePath);
FileGeodatabaseConnectionPath fileGeodatabaseConnectionPath = new(_settingsStore.Current.SpeckleDatabasePath);
Geodatabase geodatabase = new(fileGeodatabaseConnectionPath);
return geodatabase;
@@ -98,7 +97,7 @@ public class FeatureClassUtils : IFeatureClassUtils
speckleType = speckleType.Length > 10 ? speckleType[..9] : speckleType;
string? parentId = context.Parent?.Current.id;
CRSoffsetRotation activeSR = _contextStack.Current.Document.ActiveCRSoffsetRotation;
CRSoffsetRotation activeSR = _settingsStore.Current.ActiveCRSoffsetRotation;
string xOffset = Convert.ToString(activeSR.LonOffset).Replace(".", "_");
xOffset = xOffset.Length > 15 ? xOffset[..14] : xOffset;
@@ -217,7 +216,7 @@ public class FeatureClassUtils : IFeatureClassUtils
try
{
ShapeDescription shpDescription =
new(geomType, _contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference) { HasZ = true };
new(geomType, _settingsStore.Current.ActiveCRSoffsetRotation.SpatialReference) { HasZ = true };
FeatureClassDescription featureClassDescription = new(featureClassName, fields, shpDescription);
FeatureClassToken featureClassToken = schemaBuilder.Create(featureClassDescription);
}
@@ -1,4 +1,3 @@
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Speckle.Autofac.DependencyInjection;
using Speckle.Converters.Autocad;
@@ -11,11 +10,16 @@ public class AutocadConverterModule : ISpeckleModule
{
public void Load(SpeckleContainerBuilder builder)
{
//register types by default
builder.ScanAssemblyOfType<AutocadConversionSettings>();
// add single root converter
builder.AddRootCommon<AutocadRootToHostConverter>();
// add application converters and context stack
builder.AddApplicationConverters<AutocadToSpeckleUnitConverter, UnitsValue>();
builder.AddScoped<IConversionContextStack<Document, UnitsValue>, AutocadConversionContextStack>();
builder.AddScoped<
IConverterSettingsStore<AutocadConversionSettings>,
ConverterSettingsStore<AutocadConversionSettings>
>();
}
}
@@ -1,21 +0,0 @@
using System.Diagnostics.CodeAnalysis;
using Autodesk.AutoCAD.DatabaseServices;
using Speckle.Converters.Common;
namespace Speckle.Converters.Autocad;
// POC: Suppressed naming warning for now, but we should evaluate if we should follow this or disable it.
[SuppressMessage(
"Naming",
"CA1711:Identifiers should not have incorrect suffix",
Justification = "Name ends in Stack but it is in fact a Stack, just not inheriting from `System.Collections.Stack`"
)]
public class AutocadConversionContextStack : ConversionContextStack<Document, UnitsValue>
{
public AutocadConversionContextStack(IHostToSpeckleUnitConverter<UnitsValue> unitConverter)
: base(
Application.DocumentManager.CurrentDocument,
Application.DocumentManager.CurrentDocument.Database.Insunits,
unitConverter
) { }
}
@@ -0,0 +1,3 @@
namespace Speckle.Converters.Autocad;
public record AutocadConversionSettings(Document Document, string SpeckleUnits);
@@ -0,0 +1,12 @@
using Speckle.Converters.Common;
using Speckle.InterfaceGenerator;
namespace Speckle.Converters.Autocad;
[GenerateAutoInterface]
public class AutocadConversionSettingsFactory(IHostToSpeckleUnitConverter<ADB.UnitsValue> unitsConverter)
: IAutocadConversionSettingsFactory
{
public AutocadConversionSettings Create(Document document) =>
new(document, unitsConverter.ConvertOrThrow(document.Database.Insunits));
}
@@ -9,15 +9,15 @@ namespace Speckle.Converters.Autocad;
public class AutocadRootToHostConverter : IRootToSpeckleConverter
{
private readonly IFactory<IToSpeckleTopLevelConverter> _toSpeckle;
private readonly IConversionContextStack<Document, UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public AutocadRootToHostConverter(
IFactory<IToSpeckleTopLevelConverter> toSpeckle,
IConversionContextStack<Document, UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_toSpeckle = toSpeckle;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target)
@@ -33,9 +33,9 @@ public class AutocadRootToHostConverter : IRootToSpeckleConverter
try
{
using (var l = _contextStack.Current.Document.LockDocument())
using (var l = _settingsStore.Current.Document.LockDocument())
{
using (var tr = _contextStack.Current.Document.Database.TransactionManager.StartTransaction())
using (var tr = _settingsStore.Current.Document.Database.TransactionManager.StartTransaction())
{
var objectConverter = _toSpeckle.ResolveInstance(type.Name);
@@ -1,7 +1,6 @@
global using ABR = Autodesk.AutoCAD.BoundaryRepresentation;
global using ADB = Autodesk.AutoCAD.DatabaseServices;
global using AG = Autodesk.AutoCAD.Geometry;
global using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application;
global using Document = Autodesk.AutoCAD.ApplicationServices.Document;
global using SOG = Speckle.Objects.Geometry;
global using SOP = Speckle.Objects.Primitive;
@@ -9,6 +9,8 @@
<Import_RootNamespace>Speckle.Converters.AutocadShared</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)AutocadConversionSettings.cs" />
<Compile Include="$(MSBuildThisFileDirectory)AutocadConversionSettingsFactory.cs" />
<Compile Include="$(MSBuildThisFileDirectory)AutocadRootToHostConverter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)AutocadConversionContextStack.cs" />
<Compile Include="$(MSBuildThisFileDirectory)AutocadToSpeckleUnitConverter.cs" />
@@ -9,17 +9,17 @@ public class ArcToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.
{
private readonly ITypedConverter<SOG.Arc, AG.CircularArc3d> _arcConverter;
private readonly ITypedConverter<SOG.Plane, AG.Plane> _planeConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public ArcToHostConverter(
ITypedConverter<SOG.Arc, AG.CircularArc3d> arcConverter,
ITypedConverter<SOG.Plane, AG.Plane> planeConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_arcConverter = arcConverter;
_planeConverter = planeConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Arc)target);
@@ -10,17 +10,17 @@ public class CircleToHostConverter : IToHostTopLevelConverter, ITypedConverter<S
{
private readonly ITypedConverter<SOG.Point, AG.Point3d> _pointConverter;
private readonly ITypedConverter<SOG.Vector, AG.Vector3d> _vectorConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public CircleToHostConverter(
ITypedConverter<SOG.Point, AG.Point3d> pointConverter,
ITypedConverter<SOG.Vector, AG.Vector3d> vectorConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_vectorConverter = vectorConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Circle)target);
@@ -29,7 +29,7 @@ public class CircleToHostConverter : IToHostTopLevelConverter, ITypedConverter<S
{
AG.Vector3d normal = _vectorConverter.Convert(target.plane.normal);
AG.Point3d origin = _pointConverter.Convert(target.plane.origin);
double f = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double f = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
var radius = f * target.radius;
return new(origin, normal, radius);
@@ -10,17 +10,17 @@ public class EllipseToHostConverter : IToHostTopLevelConverter, ITypedConverter<
{
private readonly ITypedConverter<SOG.Point, AG.Point3d> _pointConverter;
private readonly ITypedConverter<SOG.Vector, AG.Vector3d> _vectorConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public EllipseToHostConverter(
ITypedConverter<SOG.Point, AG.Point3d> pointConverter,
ITypedConverter<SOG.Vector, AG.Vector3d> vectorConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_vectorConverter = vectorConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Ellipse)target);
@@ -28,7 +28,7 @@ public class EllipseToHostConverter : IToHostTopLevelConverter, ITypedConverter<
/// <exception cref="ArgumentNullException"> Throws if any ellipse radius value is null.</exception>
public ADB.Ellipse Convert(SOG.Ellipse target)
{
double f = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double f = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
AG.Point3d origin = _pointConverter.Convert(target.plane.origin);
AG.Vector3d normal = _vectorConverter.Convert(target.plane.normal);
AG.Vector3d xAxis = _vectorConverter.Convert(target.plane.xdir);
@@ -10,15 +10,15 @@ namespace Speckle.Converters.Autocad.Geometry;
public class MeshToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG.Mesh, ADB.PolyFaceMesh>
{
private readonly ITypedConverter<SOG.Point, AG.Point3d> _pointConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public MeshToHostConverter(
ITypedConverter<SOG.Point, AG.Point3d> pointConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Mesh)target);
@@ -40,13 +40,14 @@ public class MeshToHostConverter : IToHostTopLevelConverter, ITypedConverter<SOG
ADB.PolyFaceMesh mesh = new();
ADB.Transaction tr = _contextStack.Current.Document.TransactionManager.TopTransaction;
//TODO using?
ADB.Transaction tr = _settingsStore.Current.Document.TransactionManager.TopTransaction;
mesh.SetDatabaseDefaults();
// append mesh to blocktable record - necessary before adding vertices and faces
var btr = (ADB.BlockTableRecord)
tr.GetObject(_contextStack.Current.Document.Database.CurrentSpaceId, ADB.OpenMode.ForWrite);
tr.GetObject(_settingsStore.Current.Document.Database.CurrentSpaceId, ADB.OpenMode.ForWrite);
btr.AppendEntity(mesh);
tr.AddNewlyCreatedDBObject(mesh, true);
@@ -1,3 +1,4 @@
using Speckle.Converters.Autocad;
using Speckle.Converters.Autocad.Extensions;
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
@@ -9,15 +10,15 @@ public class AutocadPolycurveToHostPolyline2dRawConverter
: ITypedConverter<SOG.Autocad.AutocadPolycurve, ADB.Polyline2d>
{
private readonly ITypedConverter<SOG.Vector, AG.Vector3d> _vectorConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public AutocadPolycurveToHostPolyline2dRawConverter(
ITypedConverter<SOG.Vector, AG.Vector3d> vectorConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_vectorConverter = vectorConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public ADB.Polyline2d Convert(SOG.Autocad.AutocadPolycurve target)
@@ -35,7 +36,7 @@ public class AutocadPolycurveToHostPolyline2dRawConverter
}
// get vertices
double f = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double f = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
List<AG.Point3d> points = target.value.ConvertToPoint3d(f);
// check for invalid bulges
@@ -62,9 +63,9 @@ public class AutocadPolycurveToHostPolyline2dRawConverter
};
// add polyline2d to document
ADB.Transaction tr = _contextStack.Current.Document.TransactionManager.TopTransaction;
ADB.Transaction tr = _settingsStore.Current.Document.TransactionManager.TopTransaction;
var btr = (ADB.BlockTableRecord)
tr.GetObject(_contextStack.Current.Document.Database.CurrentSpaceId, ADB.OpenMode.ForWrite);
tr.GetObject(_settingsStore.Current.Document.Database.CurrentSpaceId, ADB.OpenMode.ForWrite);
btr.AppendEntity(polyline);
tr.AddNewlyCreatedDBObject(polyline, true);
@@ -1,3 +1,4 @@
using Speckle.Converters.Autocad;
using Speckle.Converters.Autocad.Extensions;
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
@@ -8,26 +9,26 @@ namespace Speckle.Converters.Autocad2023.ToHost.Raw;
public class AutocadPolycurveToHostPolyline3dRawConverter
: ITypedConverter<SOG.Autocad.AutocadPolycurve, ADB.Polyline3d>
{
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public AutocadPolycurveToHostPolyline3dRawConverter(IConversionContextStack<Document, ADB.UnitsValue> contextStack)
public AutocadPolycurveToHostPolyline3dRawConverter(IConverterSettingsStore<AutocadConversionSettings> settingsStore)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public ADB.Polyline3d Convert(SOG.Autocad.AutocadPolycurve target)
{
// get vertices
double f = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double f = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
List<AG.Point3d> points = target.value.ConvertToPoint3d(f);
// create the polyline3d using the empty constructor
ADB.Polyline3d polyline = new() { Closed = target.closed };
// add polyline3d to document
ADB.Transaction tr = _contextStack.Current.Document.TransactionManager.TopTransaction;
ADB.Transaction tr = _settingsStore.Current.Document.TransactionManager.TopTransaction;
var btr = (ADB.BlockTableRecord)
tr.GetObject(_contextStack.Current.Document.Database.CurrentSpaceId, ADB.OpenMode.ForWrite);
tr.GetObject(_settingsStore.Current.Document.Database.CurrentSpaceId, ADB.OpenMode.ForWrite);
btr.AppendEntity(polyline);
tr.AddNewlyCreatedDBObject(polyline, true);
@@ -1,3 +1,4 @@
using Speckle.Converters.Autocad;
using Speckle.Converters.Autocad.Extensions;
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
@@ -8,15 +9,15 @@ namespace Speckle.Converters.Autocad2023.ToHost.Raw;
public class AutocadPolycurveToHostPolylineRawConverter : ITypedConverter<SOG.Autocad.AutocadPolycurve, ADB.Polyline>
{
private readonly ITypedConverter<SOG.Vector, AG.Vector3d> _vectorConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public AutocadPolycurveToHostPolylineRawConverter(
ITypedConverter<SOG.Vector, AG.Vector3d> vectorConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_vectorConverter = vectorConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public ADB.Polyline Convert(SOG.Autocad.AutocadPolycurve target)
@@ -28,7 +29,7 @@ public class AutocadPolycurveToHostPolylineRawConverter : ITypedConverter<SOG.Au
);
}
double f = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double f = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
List<AG.Point2d> points2d = target.value.ConvertToPoint2d(f);
ADB.Polyline polyline =
@@ -6,16 +6,16 @@ namespace Speckle.Converters.Autocad.ToHost.Raw;
public class PointToHostRawConverter : ITypedConverter<SOG.Point, AG.Point3d>
{
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public PointToHostRawConverter(IConversionContextStack<Document, ADB.UnitsValue> contextStack)
public PointToHostRawConverter(IConverterSettingsStore<AutocadConversionSettings> settingsStore)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public AG.Point3d Convert(SOG.Point target)
{
double f = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double f = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
AG.Point3d point = new(target.x * f, target.y * f, target.z * f);
return point;
}
@@ -1,3 +1,4 @@
using Speckle.Converters.Autocad;
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
@@ -8,15 +9,15 @@ namespace Speckle.Converters.AutocadShared.ToHost.Raw;
/// </summary>
public class PolycurveToHostPolylineRawConverter : ITypedConverter<SOG.Polycurve, ADB.Polyline>
{
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
private readonly ITypedConverter<SOG.Point, AG.Point3d> _pointConverter;
public PolycurveToHostPolylineRawConverter(
IConversionContextStack<Document, ADB.UnitsValue> contextStack,
IConverterSettingsStore<AutocadConversionSettings> settingsStore,
ITypedConverter<SOG.Point, AG.Point3d> pointConverter
)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
_pointConverter = pointConverter;
}
@@ -26,7 +27,7 @@ public class PolycurveToHostPolylineRawConverter : ITypedConverter<SOG.Polycurve
AG.Plane plane =
new(
AG.Point3d.Origin,
AG.Vector3d.ZAxis.TransformBy(_contextStack.Current.Document.Editor.CurrentUserCoordinateSystem)
AG.Vector3d.ZAxis.TransformBy(_settingsStore.Current.Document.Editor.CurrentUserCoordinateSystem)
);
int count = 0;
@@ -7,18 +7,18 @@ namespace Speckle.Converters.Autocad.ToHost.Raw;
public class VectorToHostRawConverter : ITypedConverter<SOG.Vector, AG.Vector3d>
{
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public VectorToHostRawConverter(IConversionContextStack<Document, ADB.UnitsValue> contextStack)
public VectorToHostRawConverter(IConverterSettingsStore<AutocadConversionSettings> settingsStore)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public object Convert(Base target) => Convert((SOG.Vector)target);
public AG.Vector3d Convert(SOG.Vector target)
{
double f = Units.GetConversionFactor(target.units, _contextStack.Current.SpeckleUnits);
double f = Units.GetConversionFactor(target.units, _settingsStore.Current.SpeckleUnits);
return new(target.x * f, target.y * f, target.z * f);
}
}
@@ -16,17 +16,17 @@ public class DBPolyfaceMeshToSpeckleConverter : IToSpeckleTopLevelConverter
{
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public DBPolyfaceMeshToSpeckleConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => RawConvert((ADB.PolyFaceMesh)target);
@@ -37,7 +37,7 @@ public class DBPolyfaceMeshToSpeckleConverter : IToSpeckleTopLevelConverter
List<int> faces = new();
List<int> faceVisibility = new();
List<int> colors = new();
using (ADB.Transaction tr = _contextStack.Current.Document.Database.TransactionManager.StartTransaction())
using (ADB.Transaction tr = _settingsStore.Current.Document.Database.TransactionManager.StartTransaction())
{
foreach (ADB.ObjectId id in target)
{
@@ -98,7 +98,7 @@ public class DBPolyfaceMeshToSpeckleConverter : IToSpeckleTopLevelConverter
vertices = vertices,
faces = faces,
colors = colors,
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
bbox = bbox,
["faceVisibility"] = faceVisibility
};
@@ -25,7 +25,7 @@ public class Polyline2dToSpeckleConverter
private readonly ITypedConverter<ADB.Spline, SOG.Curve> _splineConverter;
private readonly ITypedConverter<AG.Vector3d, SOG.Vector> _vectorConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public Polyline2dToSpeckleConverter(
ITypedConverter<ADB.Arc, SOG.Arc> arcConverter,
@@ -34,7 +34,7 @@ public class Polyline2dToSpeckleConverter
ITypedConverter<ADB.Spline, SOG.Curve> splineConverter,
ITypedConverter<AG.Vector3d, SOG.Vector> vectorConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_arcConverter = arcConverter;
@@ -43,7 +43,7 @@ public class Polyline2dToSpeckleConverter
_splineConverter = splineConverter;
_vectorConverter = vectorConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Polyline2d)target);
@@ -78,7 +78,7 @@ public class Polyline2dToSpeckleConverter
List<ADB.Vertex2d> vertices = target
.GetSubEntities<ADB.Vertex2d>(
ADB.OpenMode.ForRead,
_contextStack.Current.Document.TransactionManager.TopTransaction
_settingsStore.Current.Document.TransactionManager.TopTransaction
)
.Where(e => e.VertexType != ADB.Vertex2dType.CurveFitVertex && e.VertexType != ADB.Vertex2dType.SplineFitVertex) // Do not collect fit vertex points, they are not used for creation
.ToList();
@@ -160,7 +160,7 @@ public class Polyline2dToSpeckleConverter
if (isSpline)
{
SOG.Curve spline = _splineConverter.Convert(target.Spline);
SOG.Polyline displayValue = segmentValues.ConvertToSpecklePolyline(_contextStack.Current.SpeckleUnits);
SOG.Polyline displayValue = segmentValues.ConvertToSpecklePolyline(_settingsStore.Current.SpeckleUnits);
if (displayValue != null)
{
spline.displayValue = displayValue;
@@ -185,7 +185,7 @@ public class Polyline2dToSpeckleConverter
length = target.Length,
area = target.Area,
bbox = bbox,
units = _contextStack.Current.SpeckleUnits
units = _settingsStore.Current.SpeckleUnits
};
return polycurve;
@@ -21,19 +21,19 @@ public class Polyline3dToSpeckleConverter
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly ITypedConverter<ADB.Spline, SOG.Curve> _splineConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public Polyline3dToSpeckleConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
ITypedConverter<ADB.Spline, SOG.Curve> splineConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_splineConverter = splineConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Polyline3d)target);
@@ -60,7 +60,7 @@ public class Polyline3dToSpeckleConverter
List<ADB.PolylineVertex3d> vertices = target
.GetSubEntities<ADB.PolylineVertex3d>(
ADB.OpenMode.ForRead,
_contextStack.Current.Document.TransactionManager.TopTransaction
_settingsStore.Current.Document.TransactionManager.TopTransaction
)
.Where(e => e.VertexType != ADB.Vertex3dType.FitVertex) // Do not collect fit vertex points, they are not used for creation
.ToList();
@@ -94,7 +94,7 @@ public class Polyline3dToSpeckleConverter
}
}
SOG.Polyline displayValue = segmentValues.ConvertToSpecklePolyline(_contextStack.Current.SpeckleUnits);
SOG.Polyline displayValue = segmentValues.ConvertToSpecklePolyline(_settingsStore.Current.SpeckleUnits);
if (displayValue != null)
{
spline.displayValue = displayValue;
@@ -105,7 +105,7 @@ public class Polyline3dToSpeckleConverter
// for simple polyline3ds just get the polyline segment from the value
else
{
SOG.Polyline polyline = value.ConvertToSpecklePolyline(_contextStack.Current.SpeckleUnits);
SOG.Polyline polyline = value.ConvertToSpecklePolyline(_settingsStore.Current.SpeckleUnits);
if (target.Closed)
{
polyline.closed = true;
@@ -125,7 +125,7 @@ public class Polyline3dToSpeckleConverter
closed = target.Closed,
length = target.Length,
bbox = bbox,
units = _contextStack.Current.SpeckleUnits
units = _settingsStore.Current.SpeckleUnits
};
return polycurve;
@@ -19,21 +19,21 @@ public class PolylineToSpeckleConverter
private readonly ITypedConverter<AG.CircularArc3d, SOG.Arc> _arcConverter;
private readonly ITypedConverter<AG.Vector3d, SOG.Vector> _vectorConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public PolylineToSpeckleConverter(
ITypedConverter<AG.LineSegment3d, SOG.Line> lineConverter,
ITypedConverter<AG.CircularArc3d, SOG.Arc> arcConverter,
ITypedConverter<AG.Vector3d, SOG.Vector> vectorConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_lineConverter = lineConverter;
_arcConverter = arcConverter;
_vectorConverter = vectorConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Polyline)target);
@@ -86,7 +86,7 @@ public class PolylineToSpeckleConverter
length = target.Length,
area = target.Area,
bbox = bbox,
units = _contextStack.Current.SpeckleUnits
units = _settingsStore.Current.SpeckleUnits
};
return polycurve;
@@ -9,17 +9,17 @@ public class DBSubDMeshToSpeckleConverter : IToSpeckleTopLevelConverter
{
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public DBSubDMeshToSpeckleConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => RawConvert((ADB.SubDMesh)target);
@@ -78,7 +78,7 @@ public class DBSubDMeshToSpeckleConverter : IToSpeckleTopLevelConverter
vertices = vertices,
faces = faces,
colors = colors,
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
bbox = bbox
};
@@ -7,15 +7,15 @@ namespace Speckle.Converters.Autocad.ToSpeckle.Raw;
public class BoxToSpeckleRawConverter : ITypedConverter<ADB.Extents3d, SOG.Box>
{
private readonly ITypedConverter<AG.Plane, SOG.Plane> _planeConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public BoxToSpeckleRawConverter(
ITypedConverter<AG.Plane, SOG.Plane> planeConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_planeConverter = planeConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Extents3d)target);
@@ -29,7 +29,7 @@ public class BoxToSpeckleRawConverter : ITypedConverter<ADB.Extents3d, SOG.Box>
double volume = xSize.Length * ySize.Length * zSize.Length;
// get the base plane of the bounding box from extents and current UCS
var ucs = _contextStack.Current.Document.Editor.CurrentUserCoordinateSystem.CoordinateSystem3d;
var ucs = _settingsStore.Current.Document.Editor.CurrentUserCoordinateSystem.CoordinateSystem3d;
AG.Plane acadPlane = new(target.MinPoint, ucs.Xaxis, ucs.Yaxis);
SOG.Plane plane = _planeConverter.Convert(acadPlane);
@@ -40,7 +40,7 @@ public class BoxToSpeckleRawConverter : ITypedConverter<ADB.Extents3d, SOG.Box>
xSize = xSize,
ySize = ySize,
zSize = zSize,
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
volume = volume,
};
@@ -7,17 +7,17 @@ public class CircularArc3dToSpeckleConverter : ITypedConverter<AG.CircularArc3d,
{
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly ITypedConverter<AG.Plane, SOG.Plane> _planeConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public CircularArc3dToSpeckleConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
ITypedConverter<AG.Plane, SOG.Plane> planeConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_planeConverter = planeConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public SOG.Arc Convert(AG.CircularArc3d target)
@@ -37,7 +37,7 @@ public class CircularArc3dToSpeckleConverter : ITypedConverter<AG.CircularArc3d,
target.StartAngle,
target.EndAngle,
target.EndAngle - target.StartAngle, // POC: testing, unsure
_contextStack.Current.SpeckleUnits
_settingsStore.Current.SpeckleUnits
)
{
startPoint = start,
@@ -9,19 +9,19 @@ public class DBArcToSpeckleRawConverter : ITypedConverter<ADB.Arc, SOG.Arc>
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly ITypedConverter<AG.Plane, SOG.Plane> _planeConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public DBArcToSpeckleRawConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
ITypedConverter<AG.Plane, SOG.Plane> planeConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_planeConverter = planeConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Arc)target);
@@ -42,7 +42,7 @@ public class DBArcToSpeckleRawConverter : ITypedConverter<ADB.Arc, SOG.Arc>
target.StartAngle,
target.EndAngle,
target.TotalAngle,
_contextStack.Current.SpeckleUnits
_settingsStore.Current.SpeckleUnits
)
{
startPoint = start,
@@ -8,17 +8,17 @@ public class DBCircleToSpeckleRawConverter : ITypedConverter<ADB.Circle, SOG.Cir
{
private readonly ITypedConverter<AG.Plane, SOG.Plane> _planeConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public DBCircleToSpeckleRawConverter(
ITypedConverter<AG.Plane, SOG.Plane> planeConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_planeConverter = planeConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Circle)target);
@@ -32,7 +32,7 @@ public class DBCircleToSpeckleRawConverter : ITypedConverter<ADB.Circle, SOG.Cir
{
plane = plane,
radius = target.Radius,
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
length = target.Circumference,
bbox = bbox
};
@@ -15,7 +15,7 @@ public class DBCurveToSpeckleRawConverter : ITypedConverter<ADB.Curve, Objects.I
private readonly ITypedConverter<ADB.Circle, SOG.Circle> _circleConverter;
private readonly ITypedConverter<ADB.Ellipse, SOG.Ellipse> _ellipseConverter;
private readonly ITypedConverter<ADB.Spline, SOG.Curve> _splineConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public DBCurveToSpeckleRawConverter(
ITypedConverter<ADB.Line, SOG.Line> lineConverter,
@@ -26,7 +26,7 @@ public class DBCurveToSpeckleRawConverter : ITypedConverter<ADB.Curve, Objects.I
ITypedConverter<ADB.Circle, SOG.Circle> circleConverter,
ITypedConverter<ADB.Ellipse, SOG.Ellipse> ellipseConverter,
ITypedConverter<ADB.Spline, SOG.Curve> splineConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_lineConverter = lineConverter;
@@ -37,7 +37,7 @@ public class DBCurveToSpeckleRawConverter : ITypedConverter<ADB.Curve, Objects.I
_circleConverter = circleConverter;
_ellipseConverter = ellipseConverter;
_splineConverter = splineConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
/// <summary>
@@ -8,17 +8,17 @@ public class DBEllipseToSpeckleRawConverter : ITypedConverter<ADB.Ellipse, SOG.E
{
private readonly ITypedConverter<AG.Plane, SOG.Plane> _planeConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public DBEllipseToSpeckleRawConverter(
ITypedConverter<AG.Plane, SOG.Plane> planeConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_planeConverter = planeConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Ellipse)target);
@@ -37,7 +37,7 @@ public class DBEllipseToSpeckleRawConverter : ITypedConverter<ADB.Ellipse, SOG.E
plane = plane,
firstRadius = target.MajorRadius,
secondRadius = target.MinorRadius,
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
domain = new SOP.Interval { start = 0, end = Math.PI * 2 },
trimDomain = trim,
length = target.GetDistanceAtParameter(target.EndParam),
@@ -8,17 +8,17 @@ public class DBLineToSpeckleRawConverter : ITypedConverter<ADB.Line, SOG.Line>
{
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public DBLineToSpeckleRawConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Line)target);
@@ -28,7 +28,7 @@ public class DBLineToSpeckleRawConverter : ITypedConverter<ADB.Line, SOG.Line>
{
start = _pointConverter.Convert(target.StartPoint),
end = _pointConverter.Convert(target.EndPoint),
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
domain = new SOP.Interval { start = 0, end = target.Length },
bbox = _boxConverter.Convert(target.GeometricExtents)
};
@@ -8,17 +8,17 @@ public class Solid3dToSpeckleRawConverter : ITypedConverter<ADB.Solid3d, SOG.Mes
{
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public Solid3dToSpeckleRawConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Solid3d)target);
@@ -75,7 +75,7 @@ public class Solid3dToSpeckleRawConverter : ITypedConverter<ADB.Solid3d, SOG.Mes
{
vertices = convertedVertices,
faces = faces,
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
bbox = bbox,
area = area,
volume = volume
@@ -10,17 +10,17 @@ public class DBSplineToSpeckleRawConverter : ITypedConverter<ADB.Spline, SOG.Cur
{
private readonly ITypedConverter<AG.Interval, SOP.Interval> _intervalConverter;
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public DBSplineToSpeckleRawConverter(
ITypedConverter<AG.Interval, SOP.Interval> intervalConverter,
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_intervalConverter = intervalConverter;
_boxConverter = boxConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((ADB.Spline)target);
@@ -109,8 +109,8 @@ public class DBSplineToSpeckleRawConverter : ITypedConverter<ADB.Spline, SOG.Cur
length = length,
domain = domain,
bbox = _boxConverter.Convert(target.GeometricExtents),
units = _contextStack.Current.SpeckleUnits,
displayValue = target.Database is not null ? GetDisplayValue(target) : null!,
units = _settingsStore.Current.SpeckleUnits,
displayValue = target.Database is not null ? GetDisplayValue(target) : null!, //TODO change?
};
// POC: get display value if this is a database-resident spline
@@ -129,7 +129,7 @@ public class DBSplineToSpeckleRawConverter : ITypedConverter<ADB.Spline, SOG.Cur
case ADB.Polyline2d o:
verticesList = o.GetSubEntities<ADB.Vertex2d>(
ADB.OpenMode.ForRead,
_contextStack.Current.Document.TransactionManager.TopTransaction
_settingsStore.Current.Document.TransactionManager.TopTransaction
)
.Where(e => e.VertexType != ADB.Vertex2dType.SplineControlVertex) // POC: not validated yet!
.SelectMany(o => o.Position.ToArray())
@@ -139,7 +139,7 @@ public class DBSplineToSpeckleRawConverter : ITypedConverter<ADB.Spline, SOG.Cur
case ADB.Polyline3d o:
verticesList = o.GetSubEntities<ADB.PolylineVertex3d>(
ADB.OpenMode.ForRead,
_contextStack.Current.Document.TransactionManager.TopTransaction
_settingsStore.Current.Document.TransactionManager.TopTransaction
)
.Where(e => e.VertexType != ADB.Vertex3dType.ControlVertex)
.SelectMany(o => o.Position.ToArray())
@@ -147,6 +147,6 @@ public class DBSplineToSpeckleRawConverter : ITypedConverter<ADB.Spline, SOG.Cur
break;
}
return verticesList.ConvertToSpecklePolyline(_contextStack.Current.SpeckleUnits);
return verticesList.ConvertToSpecklePolyline(_settingsStore.Current.SpeckleUnits);
}
}
@@ -6,15 +6,15 @@ namespace Speckle.Converters.Autocad.ToSpeckle.Raw;
public class LineSegment3dToSpeckleRawConverter : ITypedConverter<AG.LineSegment3d, SOG.Line>
{
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public LineSegment3dToSpeckleRawConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public SOG.Line Convert(AG.LineSegment3d target) =>
@@ -22,7 +22,7 @@ public class LineSegment3dToSpeckleRawConverter : ITypedConverter<AG.LineSegment
{
start = _pointConverter.Convert(target.StartPoint),
end = _pointConverter.Convert(target.EndPoint),
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
domain = new SOP.Interval { start = 0, end = target.Length },
};
}
@@ -8,17 +8,17 @@ public class PlaneToSpeckleRawConverter : ITypedConverter<AG.Plane, SOG.Plane>
{
private readonly ITypedConverter<AG.Vector3d, SOG.Vector> _vectorConverter;
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public PlaneToSpeckleRawConverter(
ITypedConverter<AG.Vector3d, SOG.Vector> vectorConverter,
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<AutocadConversionSettings> settingsStore
)
{
_vectorConverter = vectorConverter;
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((AG.Plane)target);
@@ -30,6 +30,6 @@ public class PlaneToSpeckleRawConverter : ITypedConverter<AG.Plane, SOG.Plane>
normal = _vectorConverter.Convert(target.Normal),
xdir = _vectorConverter.Convert(target.GetCoordinateSystem().Xaxis),
ydir = _vectorConverter.Convert(target.GetCoordinateSystem().Yaxis),
units = _contextStack.Current.SpeckleUnits,
units = _settingsStore.Current.SpeckleUnits,
};
}
@@ -5,12 +5,12 @@ namespace Speckle.Converters.Autocad.ToSpeckle.Raw;
public class PointToSpeckleRawConverter : ITypedConverter<AG.Point3d, SOG.Point>
{
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public PointToSpeckleRawConverter(IConversionContextStack<Document, ADB.UnitsValue> contextStack)
public PointToSpeckleRawConverter(IConverterSettingsStore<AutocadConversionSettings> settingsStore)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public SOG.Point Convert(AG.Point3d target) => new(target.X, target.Y, target.Z, _contextStack.Current.SpeckleUnits);
public SOG.Point Convert(AG.Point3d target) => new(target.X, target.Y, target.Z, _settingsStore.Current.SpeckleUnits);
}
@@ -5,13 +5,13 @@ namespace Speckle.Converters.Autocad.ToSpeckle.Raw;
public class VectorToSpeckleRawConverter : ITypedConverter<AG.Vector3d, SOG.Vector>
{
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<AutocadConversionSettings> _settingsStore;
public VectorToSpeckleRawConverter(IConversionContextStack<Document, ADB.UnitsValue> contextStack)
public VectorToSpeckleRawConverter(IConverterSettingsStore<AutocadConversionSettings> settingsStore)
{
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public SOG.Vector Convert(AG.Vector3d target) =>
new(target.X, target.Y, target.Z, _contextStack.Current.SpeckleUnits);
new(target.X, target.Y, target.Z, _settingsStore.Current.SpeckleUnits);
}
@@ -1,4 +1,3 @@
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Speckle.Autofac.DependencyInjection;
using Speckle.Converters.Autocad;
@@ -12,13 +11,22 @@ public class Civil3dConverterModule : ISpeckleModule
{
public void Load(SpeckleContainerBuilder builder)
{
//register types by default
builder.ScanAssemblyOfType<Civil3dConversionSettings>();
builder.ScanAssemblyOfType<AutocadConversionSettings>();
// Register single root
builder.AddRootCommon<Civil3dRootToHostConverter>();
// register all application converters
builder.AddApplicationConverters<Civil3dToSpeckleUnitConverter, Autodesk.Aec.BuiltInUnit>();
builder.AddApplicationConverters<AutocadToSpeckleUnitConverter, UnitsValue>();
builder.AddScoped<IConversionContextStack<Document, Autodesk.Aec.BuiltInUnit>, Civil3dConversionContextStack>();
builder.AddScoped<IConversionContextStack<Document, UnitsValue>, AutocadConversionContextStack>();
builder.AddScoped<
IConverterSettingsStore<Civil3dConversionSettings>,
ConverterSettingsStore<Civil3dConversionSettings>
>();
builder.AddScoped<
IConverterSettingsStore<AutocadConversionSettings>,
ConverterSettingsStore<AutocadConversionSettings>
>();
}
}
@@ -1,38 +0,0 @@
using System.Diagnostics.CodeAnalysis;
using Speckle.Converters.Common;
namespace Speckle.Converters.Civil3d;
// POC: Suppressed naming warning for now, but we should evaluate if we should follow this or disable it.
[SuppressMessage(
"Naming",
"CA1711:Identifiers should not have incorrect suffix",
Justification = "Name ends in Stack but it is in fact a Stack, just not inheriting from `System.Collections.Stack`"
)]
public class Civil3dConversionContextStack : ConversionContextStack<Document, AAEC.BuiltInUnit>
{
public Civil3dConversionContextStack(IHostToSpeckleUnitConverter<AAEC.BuiltInUnit> unitConverter)
: base(
Application.DocumentManager.CurrentDocument,
GetDocBuiltInUnit(Application.DocumentManager.CurrentDocument),
unitConverter
) { }
private static AAEC.BuiltInUnit GetDocBuiltInUnit(Document doc)
{
AAEC.BuiltInUnit unit = AAEC.BuiltInUnit.Dimensionless;
using (ADB.Transaction tr = doc.Database.TransactionManager.StartTransaction())
{
ADB.ObjectId id = AAEC.ApplicationServices.DrawingSetupVariables.GetInstance(doc.Database, false);
if (tr.GetObject(id, ADB.OpenMode.ForRead) is AAEC.ApplicationServices.DrawingSetupVariables setupVariables)
{
unit = setupVariables.LinearUnit;
}
tr.Commit();
}
return unit;
}
}
@@ -0,0 +1,7 @@
namespace Speckle.Converters.Civil3d;
public record Civil3dConversionSettings
{
public Document Document { get; init; }
public string SpeckleUnits { get; init; }
}
@@ -9,15 +9,15 @@ namespace Speckle.Converters.Civil3d;
public class Civil3dRootToHostConverter : IRootToSpeckleConverter
{
private readonly IFactory<IToSpeckleTopLevelConverter> _toSpeckle;
private readonly IConversionContextStack<Document, AAEC.BuiltInUnit> _contextStack;
private readonly IConverterSettingsStore<Civil3dConversionSettings> _settingsStore;
public Civil3dRootToHostConverter(
IFactory<IToSpeckleTopLevelConverter> toSpeckle,
IConversionContextStack<Document, AAEC.BuiltInUnit> contextStack
IConverterSettingsStore<Civil3dConversionSettings> settingsStore
)
{
_toSpeckle = toSpeckle;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target)
@@ -33,9 +33,9 @@ public class Civil3dRootToHostConverter : IRootToSpeckleConverter
try
{
using (var l = _contextStack.Current.Document.LockDocument())
using (var l = _settingsStore.Current.Document.LockDocument())
{
using (var tr = _contextStack.Current.Document.Database.TransactionManager.StartTransaction())
using (var tr = _settingsStore.Current.Document.Database.TransactionManager.StartTransaction())
{
var objectConverter = _toSpeckle.ResolveInstance(type.Name);
@@ -9,7 +9,7 @@
<Import_RootNamespace>Speckle.Converters.Civil3dShared</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)Civil3dConversionContextStack.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Civil3dConversionSettings.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Civil3dRootToHostConverter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Civil3dToSpeckleUnitConverter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)GlobalUsings.cs" />
@@ -15,7 +15,7 @@ public class PipeToSpeckleConverter : IToSpeckleTopLevelConverter
private readonly ITypedConverter<ADB.Extents3d, SOG.Box> _boxConverter;
private readonly ITypedConverter<ADB.Solid3d, SOG.Mesh> _solidConverter;
private readonly ITypedConverter<AECPropDB.PropertySet, List<DataField>> _propertySetConverter;
private readonly IConversionContextStack<Document, AAEC.BuiltInUnit> _contextStack;
private readonly IConverterSettingsStore<Civil3dConversionSettings> _settingsStore;
public PipeToSpeckleConverter(
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
@@ -23,7 +23,7 @@ public class PipeToSpeckleConverter : IToSpeckleTopLevelConverter
ITypedConverter<ADB.Extents3d, SOG.Box> boxConverter,
ITypedConverter<ADB.Solid3d, SOG.Mesh> solidConverter,
ITypedConverter<AECPropDB.PropertySet, List<DataField>> propertySetConverter,
IConversionContextStack<Document, AAEC.BuiltInUnit> contextStack
IConverterSettingsStore<Civil3dConversionSettings> settingsStore
)
{
_pointConverter = pointConverter;
@@ -31,7 +31,7 @@ public class PipeToSpeckleConverter : IToSpeckleTopLevelConverter
_boxConverter = boxConverter;
_solidConverter = solidConverter;
_propertySetConverter = propertySetConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public Base Convert(object target) => Convert((CDB.Pipe)target);
@@ -48,7 +48,7 @@ public class PipeToSpeckleConverter : IToSpeckleTopLevelConverter
diameter = target.InnerDiameterOrWidth,
length = target.Length3DToInsideEdge,
displayValue = new List<SOG.Mesh> { pipeMesh },
units = _contextStack.Current.SpeckleUnits
units = _settingsStore.Current.SpeckleUnits
};
// POC: not setting property sets yet, need to determine connector parameter interoperability
@@ -9,17 +9,17 @@ public class PropertySetToSpeckleRawConverter : ITypedConverter<AECPropDB.Proper
{
private readonly ITypedConverter<AG.Vector3d, SOG.Vector> _vectorConverter;
private readonly ITypedConverter<AG.Point3d, SOG.Point> _pointConverter;
private readonly IConversionContextStack<Document, ADB.UnitsValue> _contextStack;
private readonly IConverterSettingsStore<Civil3dConversionSettings> _settingsStore;
public PropertySetToSpeckleRawConverter(
ITypedConverter<AG.Vector3d, SOG.Vector> vectorConverter,
ITypedConverter<AG.Point3d, SOG.Point> pointConverter,
IConversionContextStack<Document, ADB.UnitsValue> contextStack
IConverterSettingsStore<Civil3dConversionSettings> settingsStore
)
{
_vectorConverter = vectorConverter;
_pointConverter = pointConverter;
_contextStack = contextStack;
_settingsStore = settingsStore;
}
public List<DataField> Convert(object target) => Convert((AECPropDB.PropertySet)target);
@@ -28,7 +28,8 @@ public class PropertySetToSpeckleRawConverter : ITypedConverter<AECPropDB.Proper
{
List<DataField> properties = new();
ADB.Transaction tr = _contextStack.Current.Document.TransactionManager.TopTransaction;
//TODO using?
ADB.Transaction tr = _settingsStore.Current.Document.TransactionManager.TopTransaction;
AECPropDB.PropertySetDefinition setDef = (AECPropDB.PropertySetDefinition)
tr.GetObject(target.PropertySetDefinition, ADB.OpenMode.ForRead);
@@ -25,6 +25,6 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Speckle.Revit2024.Fakes" VersionOverride="0.3.0" />
<PackageReference Include="Speckle.Revit2024.Fakes" VersionOverride="[0.3.0, 1.0.0)" />
</ItemGroup>
</Project>
@@ -78,7 +78,7 @@
},
"Speckle.Revit2024.Fakes": {
"type": "Direct",
"requested": "[0.3.0, )",
"requested": "[0.3.0, 1.0.0)",
"resolved": "0.3.0",
"contentHash": "gBwoXQDphcbfexbNojI+9Isht8M3citP9j3cMMsnDJPlj7l1rXHzFmzZ7sn0OzuKzmcG92sGvyR1RvsGUtfqYw==",
"dependencies": {
@@ -4,6 +4,7 @@ using Speckle.Converters.Common;
using Speckle.Converters.Common.DependencyInjection;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.RevitShared.Services;
using Speckle.Converters.RevitShared.Settings;
namespace Speckle.Converters.RevitShared.DependencyInjection;
@@ -12,7 +13,7 @@ public class RevitConverterModule : ISpeckleModule
public void Load(SpeckleContainerBuilder builder)
{
//register types by default
builder.ScanAssemblyOfType<SlopeArrowExtractor>();
builder.ScanAssemblyOfType<RevitConversionSettings>();
// Register single root
builder.AddRootCommon<RevitRootToSpeckleConverter>();
@@ -29,7 +30,10 @@ public class RevitConverterModule : ISpeckleModule
builder.AddScoped<ScalingServiceToHost>();
// POC: the concrete type can come out if we remove all the reference to it
builder.AddScoped<IRevitConversionContextStack, RevitConversionContextStack>();
builder.AddScoped<
IConverterSettingsStore<RevitConversionSettings>,
ConverterSettingsStore<RevitConversionSettings>
>();
builder.AddScoped<IReferencePointConverter, ReferencePointConverter>();
@@ -2,9 +2,9 @@
using NUnit.Framework;
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.RevitShared.Raw;
using Speckle.Converters.RevitShared.Services;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Objects;
using Speckle.Testing;
@@ -15,7 +15,7 @@ public class ModelCurveArrayToSpeckleConverterTests : MoqTest
[Test]
public void Convert_Empty()
{
var revitConversionContextStack = Create<IRevitConversionContextStack>();
var revitConversionContextStack = Create<IConverterSettingsStore<RevitConversionSettings>>();
var scalingServiceToSpeckle = Create<IScalingServiceToSpeckle>();
var curveConverter = Create<ITypedConverter<DB.Curve, ICurve>>();
@@ -32,7 +32,7 @@ public class ModelCurveArrayToSpeckleConverterTests : MoqTest
[Test]
public void Convert()
{
var revitConversionContextStack = Create<IRevitConversionContextStack>();
var revitConversionContextStack = Create<IConverterSettingsStore<RevitConversionSettings>>();
var scalingServiceToSpeckle = Create<IScalingServiceToSpeckle>();
var curveConverter = Create<ITypedConverter<DB.Curve, ICurve>>();
@@ -50,11 +50,10 @@ public class ModelCurveArrayToSpeckleConverterTests : MoqTest
geometry2.Setup(x => x.Length).Returns(3);
geometry2.Setup(x => x.GetEndPoint(1)).Returns(endpoint2.Object);
var context = Create<IConversionContext<DB.Document>>();
revitConversionContextStack.Setup(x => x.Current).Returns(context.Object);
var units = "units";
context.Setup(x => x.SpeckleUnits).Returns(units);
revitConversionContextStack
.Setup(x => x.Current)
.Returns(new RevitConversionSettings(null!, DetailLevelType.Coarse, null, units));
var scaleLength = 2.2;
scalingServiceToSpeckle.Setup(x => x.ScaleLength(2 + 3)).Returns(scaleLength);
@@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Sdk.Common;
@@ -13,7 +14,7 @@ public sealed class DisplayValueExtractor
List<SOG.Mesh>
> _meshByMaterialConverter;
private readonly ILogger<DisplayValueExtractor> _logger;
private readonly IRevitConversionContextStack _revitConversionContextStack;
private readonly IConverterSettingsStore<RevitConversionSettings> _converterSettings;
public DisplayValueExtractor(
ITypedConverter<
@@ -21,12 +22,12 @@ public sealed class DisplayValueExtractor
List<SOG.Mesh>
> meshByMaterialConverter,
ILogger<DisplayValueExtractor> logger,
IRevitConversionContextStack revitConversionContextStack
IConverterSettingsStore<RevitConversionSettings> converterSettings
)
{
_meshByMaterialConverter = meshByMaterialConverter;
_logger = logger;
_revitConversionContextStack = revitConversionContextStack;
_converterSettings = converterSettings;
}
public List<SOG.Mesh> GetDisplayValue(DB.Element element, DB.Options? options = null)
@@ -86,10 +87,7 @@ public sealed class DisplayValueExtractor
private (List<DB.Solid>, List<DB.Mesh>) GetSolidsAndMeshesFromElement(DB.Element element, DB.Options? options)
{
//options = ViewSpecificOptions ?? options ?? new Options() { DetailLevel = DetailLevelSetting };
options ??= new DB.Options
{
DetailLevel = _detailLevelMap[_revitConversionContextStack.ToSpeckleSettings.DetailLevel]
};
options ??= new DB.Options { DetailLevel = _detailLevelMap[_converterSettings.Current.DetailLevel] };
DB.GeometryElement geom;
try
@@ -1,18 +0,0 @@
using Autodesk.Revit.DB;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
namespace Speckle.Converters.RevitShared.Helpers;
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Naming",
"CA1711:Identifiers should not have incorrect suffix",
Justification = "See base class justification"
)]
// POC: so this should *probably* be Document and NOT UI.UIDocument, the former is Conversion centric
// and the latter is more for connector
public interface IRevitConversionContextStack : IConversionContextStack<Document, ForgeTypeId>
{
public RevitMaterialCacheSingleton RenderMaterialProxyCache { get; }
public ToSpeckleSettings ToSpeckleSettings { get; }
}
@@ -1,45 +0,0 @@
using Autodesk.Revit.DB;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
namespace Speckle.Converters.RevitShared.Helpers;
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Naming",
"CA1711:Identifiers should not have incorrect suffix",
Justification = "See base class justification"
)]
// POC: so this should *probably* be Document and NOT UI.UIDocument, the former is Conversion centric
// and the latter is more for connector
public class RevitConversionContextStack : ConversionContextStack<Document, ForgeTypeId>, IRevitConversionContextStack
{
public ToSpeckleSettings ToSpeckleSettings { get; }
/// <summary>
/// Persistent cache (across conversions) for all generated render material proxies. Note this cache stores a list of render material proxies per element id.
/// </summary>
public RevitMaterialCacheSingleton RenderMaterialProxyCache { get; }
public const double TOLERANCE = 0.0164042; // 5mm in ft
public RevitConversionContextStack(
RevitContext context,
IHostToSpeckleUnitConverter<ForgeTypeId> unitConverter,
RevitMaterialCacheSingleton renderMaterialProxyCache,
ToSpeckleSettings toSpeckleSettings
)
: base(
// POC: we probably should not get here without a valid document
// so should this perpetuate or do we assume this is valid?
// relting on the context.UIApplication?.ActiveUIDocument is not right
// this should be some IActiveDocument I suspect?
context.UIApplication?.ActiveUIDocument?.Document
?? throw new SpeckleConversionException("Active UI document could not be determined"),
context.UIApplication.ActiveUIDocument.Document.GetUnits().GetFormatOptions(SpecTypeId.Length).GetUnitTypeId(),
unitConverter
)
{
ToSpeckleSettings = toSpeckleSettings;
RenderMaterialProxyCache = renderMaterialProxyCache;
}
}
@@ -1,21 +1,18 @@
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
namespace Speckle.Converters.RevitShared.Helpers;
/// <summary>
/// POC: reference point functionality needs to be revisited (we are currently baking in these transforms into all geometry using the point and vector converters, and losing the transform).
/// This converter uses the transform in the reference point setting and provides methods to transform points
/// </summary>
public class ReferencePointConverter : IReferencePointConverter
public class ReferencePointConverter(IConverterSettingsStore<RevitConversionSettings> converterSettings)
: IReferencePointConverter
{
private readonly IRevitConversionContextStack _contextStack;
public ReferencePointConverter(IRevitConversionContextStack contextStack)
{
_contextStack = contextStack;
}
public DB.XYZ ConvertToExternalCoordinates(DB.XYZ p, bool isPoint)
{
if (_contextStack.ToSpeckleSettings.ReferencePointTransform is DB.Transform transform)
if (converterSettings.Current.ReferencePointTransform is DB.Transform transform)
{
return isPoint ? transform.Inverse.OfPoint(p) : transform.Inverse.OfVector(p);
}
@@ -25,7 +22,7 @@ public class ReferencePointConverter : IReferencePointConverter
public DB.XYZ ConvertToInternalCoordinates(DB.XYZ p, bool isPoint)
{
if (_contextStack.ToSpeckleSettings.ReferencePointTransform is DB.Transform transform)
if (converterSettings.Current.ReferencePointTransform is DB.Transform transform)
{
return isPoint ? transform.OfPoint(p) : transform.OfVector(p);
}
@@ -1,6 +1,5 @@
using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Sdk;
using Speckle.Sdk.Models;
@@ -10,21 +9,15 @@ namespace Speckle.Converters.RevitShared;
public class RevitRootToSpeckleConverter : IRootToSpeckleConverter
{
private readonly IConverterResolver<IToSpeckleTopLevelConverter> _toSpeckle;
private readonly ParameterValueExtractor _parameterValueExtractor;
private readonly ITypedConverter<DB.Element, List<Dictionary<string, object>>> _materialQuantityConverter;
private readonly IRevitConversionContextStack _contextStack;
public RevitRootToSpeckleConverter(
IConverterResolver<IToSpeckleTopLevelConverter> toSpeckle,
ParameterValueExtractor parameterValueExtractor,
ITypedConverter<DB.Element, List<Dictionary<string, object>>> materialQuantityConverter,
IRevitConversionContextStack contextStack
ITypedConverter<DB.Element, List<Dictionary<string, object>>> materialQuantityConverter
)
{
_toSpeckle = toSpeckle;
_parameterValueExtractor = parameterValueExtractor;
_materialQuantityConverter = materialQuantityConverter;
_contextStack = contextStack;
}
// POC: our assumption here is target is valid for conversion
@@ -1,5 +1,6 @@
using Autodesk.Revit.DB;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
using Speckle.InterfaceGenerator;
namespace Speckle.Converters.RevitShared.Services;
@@ -12,10 +13,10 @@ public sealed class ScalingServiceToSpeckle : IScalingServiceToSpeckle
private readonly double _defaultLengthConversionFactor;
// POC: this seems like the reverse relationship
public ScalingServiceToSpeckle(IRevitConversionContextStack contextStack)
public ScalingServiceToSpeckle(IConverterSettingsStore<RevitConversionSettings> converterSettings)
{
// POC: this is accurate for the current context stack
Units documentUnits = contextStack.Current.Document.GetUnits();
Units documentUnits = converterSettings.Current.Document.GetUnits();
FormatOptions formatOptions = documentUnits.GetFormatOptions(SpecTypeId.Length);
var lengthUnitsTypeId = formatOptions.GetUnitTypeId();
_defaultLengthConversionFactor = ScaleStatic(1, lengthUnitsTypeId);
@@ -0,0 +1,8 @@
namespace Speckle.Converters.RevitShared.Settings;
public enum DetailLevelType
{
Coarse,
Medium,
Fine
}
@@ -0,0 +1,8 @@
namespace Speckle.Converters.RevitShared.Settings;
public enum ReferencePointType
{
InternalOrigin,
ProjectBase,
Survey
}

Some files were not shown because too many files have changed in this diff Show More