diff --git a/Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Operations/Send/ArcGISRootObjectBuilder.cs b/Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Operations/Send/ArcGISRootObjectBuilder.cs index aae2c1c24..da9b437ff 100644 --- a/Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Operations/Send/ArcGISRootObjectBuilder.cs +++ b/Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Operations/Send/ArcGISRootObjectBuilder.cs @@ -5,7 +5,6 @@ using Speckle.Connectors.ArcGIS.HostApp.Extensions; using Speckle.Connectors.ArcGIS.Utils; using Speckle.Connectors.Common.Builders; -using Speckle.Connectors.Common.Caching; using Speckle.Connectors.Common.Conversion; using Speckle.Connectors.Common.Extensions; using Speckle.Connectors.Common.Operations; @@ -24,7 +23,6 @@ namespace Speckle.Connectors.ArcGis.Operations.Send; public class ArcGISRootObjectBuilder : IRootObjectBuilder { private readonly IRootToSpeckleConverter _rootToSpeckleConverter; - private readonly ISendConversionCache _sendConversionCache; private readonly ArcGISLayerUnpacker _layerUnpacker; private readonly ArcGISColorUnpacker _colorUnpacker; private readonly IConverterSettingsStore _converterSettings; @@ -33,7 +31,6 @@ public class ArcGISRootObjectBuilder : IRootObjectBuilder private readonly MapMembersUtils _mapMemberUtils; public ArcGISRootObjectBuilder( - ISendConversionCache sendConversionCache, ArcGISLayerUnpacker layerUnpacker, ArcGISColorUnpacker colorUnpacker, IConverterSettingsStore converterSettings, @@ -43,7 +40,6 @@ public ArcGISRootObjectBuilder( MapMembersUtils mapMemberUtils ) { - _sendConversionCache = sendConversionCache; _layerUnpacker = layerUnpacker; _colorUnpacker = colorUnpacker; _converterSettings = converterSettings; @@ -53,9 +49,9 @@ MapMembersUtils mapMemberUtils _mapMemberUtils = mapMemberUtils; } - public RootObjectBuilderResult Build( + public async Task BuildAsync( IReadOnlyList layers, - SendInfo sendInfo, + SendInfo __, IProgress onOperationProgressed, CancellationToken cancellationToken ) @@ -171,6 +167,7 @@ out ObjectReference? value } onOperationProgressed.Report(new("Converting", (double)++count / layers.Count)); + await Task.Yield(); } } diff --git a/Connectors/Autocad/Speckle.Connectors.AutocadShared/Operations/Send/AutocadRootObjectBaseBuilder.cs b/Connectors/Autocad/Speckle.Connectors.AutocadShared/Operations/Send/AutocadRootObjectBaseBuilder.cs index b1de30e12..ea43660f3 100644 --- a/Connectors/Autocad/Speckle.Connectors.AutocadShared/Operations/Send/AutocadRootObjectBaseBuilder.cs +++ b/Connectors/Autocad/Speckle.Connectors.AutocadShared/Operations/Send/AutocadRootObjectBaseBuilder.cs @@ -16,7 +16,7 @@ namespace Speckle.Connectors.Autocad.Operations.Send; -public abstract class AutocadRootObjectBaseBuilder : IRootObjectBuilder +public abstract class AutocadRootObjectBaseBuilder : RootObjectBuilderBase { private readonly IRootToSpeckleConverter _converter; private readonly string[] _documentPathSeparator = ["\\"]; @@ -58,7 +58,7 @@ It is already simplified but has many different references since it is a builder proxy classes yet. So I'm supressing this one now!!! """ )] - public RootObjectBuilderResult Build( + public override RootObjectBuilderResult Build( IReadOnlyList objects, SendInfo sendInfo, IProgress onOperationProgressed, diff --git a/Connectors/CSi/Speckle.Connectors.CSiShared/Operations/Send/CsiRootObjectBuilder.cs b/Connectors/CSi/Speckle.Connectors.CSiShared/Operations/Send/CsiRootObjectBuilder.cs index 07386452d..c76aa8dfd 100644 --- a/Connectors/CSi/Speckle.Connectors.CSiShared/Operations/Send/CsiRootObjectBuilder.cs +++ b/Connectors/CSi/Speckle.Connectors.CSiShared/Operations/Send/CsiRootObjectBuilder.cs @@ -42,7 +42,7 @@ ICsiApplicationService csiApplicationService _csiApplicationService = csiApplicationService; } - public RootObjectBuilderResult Build( + public async Task BuildAsync( IReadOnlyList csiObjects, SendInfo sendInfo, IProgress onOperationProgressed, @@ -70,6 +70,7 @@ CancellationToken cancellationToken count++; onOperationProgressed.Report(new("Converting", (double)count / csiObjects.Count)); + await Task.Yield(); } } diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSelectionBinding.cs b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSelectionBinding.cs index d3334383e..e7920c205 100644 --- a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSelectionBinding.cs +++ b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSelectionBinding.cs @@ -28,12 +28,6 @@ IElementSelectionService selectionService private void OnSelectionChange(object? o, EventArgs eventArgs) => _appIdleManager.SubscribeToIdle(nameof(NavisworksSelectionBinding), async () => await UpdateSelectionAsync()); - private void UpdateSelection() - { - SelectionInfo selInfo = GetSelection(); - Parent.Send(SELECTION_EVENT, selInfo); - } - private async Task UpdateSelectionAsync() { var selInfo = GetSelection(); diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSendBinding.cs b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSendBinding.cs index e67d8a7be..47675b88a 100644 --- a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSendBinding.cs +++ b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSendBinding.cs @@ -163,7 +163,7 @@ await scope .Execute( navisworksModelItems, modelCard.GetSendInfo(_speckleApplication.Slug), - _operationProgressManager.CreateOperationProgressEventHandler(Parent, modelCard.ModelCardId!, token), + _operationProgressManager.CreateOperationProgressEventHandler(Parent, modelCard.ModelCardId.NotNull(), token), token ); diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/NavisworksRootObjectBuilder.cs b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/NavisworksRootObjectBuilder.cs index ecd28e0c5..685188554 100644 --- a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/NavisworksRootObjectBuilder.cs +++ b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/NavisworksRootObjectBuilder.cs @@ -30,7 +30,7 @@ IElementSelectionService elementSelectionService internal NavisworksConversionSettings GetCurrentSettings() => converterSettings.Current; - public RootObjectBuilderResult Build( + public async Task BuildAsync( IReadOnlyList navisworksModelItems, SendInfo sendInfo, IProgress onOperationProgressed, @@ -79,6 +79,7 @@ CancellationToken cancellationToken results.Add(converted); processedCount++; onOperationProgressed.Report(new CardProgress("Converting", (double)processedCount / totalCount)); + await Task.Yield(); } if (results.All(x => x.Status == Status.ERROR)) diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.projitems b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.projitems index 099d2c611..1c74c547e 100644 --- a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.projitems +++ b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.projitems @@ -54,7 +54,4 @@ Always - - - \ No newline at end of file diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Operations/Send/RevitRootObjectBuilder.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Operations/Send/RevitRootObjectBuilder.cs index 0e1fcd55e..aa9b467cb 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Operations/Send/RevitRootObjectBuilder.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Operations/Send/RevitRootObjectBuilder.cs @@ -24,11 +24,11 @@ public class RevitRootObjectBuilder( SendCollectionManager sendCollectionManager, ILogger logger, RevitToSpeckleCacheSingleton revitToSpeckleCacheSingleton -) : IRootObjectBuilder +) : RootObjectBuilderBase { // POC: SendSelection and RevitConversionContextStack should be interfaces, former needs interfaces - public RootObjectBuilderResult Build( + public override RootObjectBuilderResult Build( IReadOnlyList objects, SendInfo sendInfo, IProgress onOperationProgressed, diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/RhinoRootObjectBuilder.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/RhinoRootObjectBuilder.cs index ceec97b2c..c3f5c33c9 100644 --- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/RhinoRootObjectBuilder.cs +++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/RhinoRootObjectBuilder.cs @@ -60,7 +60,7 @@ ISdkActivityFactory activityFactory _activityFactory = activityFactory; } - public RootObjectBuilderResult Build( + public async Task BuildAsync( IReadOnlyList rhinoObjects, SendInfo sendInfo, IProgress onOperationProgressed, @@ -108,6 +108,7 @@ CancellationToken cancellationToken ++count; onOperationProgressed.Report(new("Converting", (double)count / atomicObjects.Count)); + await Task.Yield(); // NOTE: useful for testing ui states, pls keep for now so we can easily uncomment // Thread.Sleep(550); diff --git a/Connectors/Tekla/Speckle.Connector.TeklaShared/Operations/Send/TeklaRootObjectBuilder.cs b/Connectors/Tekla/Speckle.Connector.TeklaShared/Operations/Send/TeklaRootObjectBuilder.cs index 1f5bb8a2c..5cbfc1961 100644 --- a/Connectors/Tekla/Speckle.Connector.TeklaShared/Operations/Send/TeklaRootObjectBuilder.cs +++ b/Connectors/Tekla/Speckle.Connector.TeklaShared/Operations/Send/TeklaRootObjectBuilder.cs @@ -43,7 +43,7 @@ TeklaMaterialUnpacker materialUnpacker _materialUnpacker = materialUnpacker; } - public RootObjectBuilderResult Build( + public async Task BuildAsync( IReadOnlyList teklaObjects, SendInfo sendInfo, IProgress onOperationProgressed, @@ -73,6 +73,7 @@ CancellationToken cancellationToken ++count; onOperationProgressed.Report(new("Converting", (double)count / teklaObjects.Count)); + await Task.Yield(); } } diff --git a/DUI3/Speckle.Connectors.DUI/Models/Card/ModelCardProgress.cs b/DUI3/Speckle.Connectors.DUI/Models/Card/ModelCardProgress.cs index 1d2dbdeb7..aff002bd2 100644 --- a/DUI3/Speckle.Connectors.DUI/Models/Card/ModelCardProgress.cs +++ b/DUI3/Speckle.Connectors.DUI/Models/Card/ModelCardProgress.cs @@ -4,4 +4,7 @@ /// Progress value between 0 and 1 to calculate UI progress bar width. /// If it is null it will swooshing on UI. /// -public record ModelCardProgress(string ModelCardId, string Status, double? Progress); +public record ModelCardProgress(string ModelCardId, string Status, double? Progress) +{ + public override string ToString() => $"{ModelCardId} - {Status} - {Progress}"; +} diff --git a/Sdk/Speckle.Connectors.Common/Builders/IRootObjectBuilder.cs b/Sdk/Speckle.Connectors.Common/Builders/IRootObjectBuilder.cs index 747df3acd..f1d9acff4 100644 --- a/Sdk/Speckle.Connectors.Common/Builders/IRootObjectBuilder.cs +++ b/Sdk/Speckle.Connectors.Common/Builders/IRootObjectBuilder.cs @@ -6,7 +6,24 @@ namespace Speckle.Connectors.Common.Builders; public interface IRootObjectBuilder { - public RootObjectBuilderResult Build( + public Task BuildAsync( + IReadOnlyList objects, + SendInfo sendInfo, + IProgress onOperationProgressed, + CancellationToken cancellationToken + ); +} + +public abstract class RootObjectBuilderBase : IRootObjectBuilder +{ + public Task BuildAsync( + IReadOnlyList objects, + SendInfo sendInfo, + IProgress onOperationProgressed, + CancellationToken cancellationToken + ) => Task.FromResult(Build(objects, sendInfo, onOperationProgressed, cancellationToken)); + + public abstract RootObjectBuilderResult Build( IReadOnlyList objects, SendInfo sendInfo, IProgress onOperationProgressed, diff --git a/Sdk/Speckle.Connectors.Common/Operations/SendOperation.cs b/Sdk/Speckle.Connectors.Common/Operations/SendOperation.cs index 3f432ddbf..c131d0058 100644 --- a/Sdk/Speckle.Connectors.Common/Operations/SendOperation.cs +++ b/Sdk/Speckle.Connectors.Common/Operations/SendOperation.cs @@ -31,8 +31,8 @@ public async Task Execute( CancellationToken ct = default ) { - var buildResult = await threadContext.RunOnMain( - () => rootObjectBuilder.Build(objects, sendInfo, onOperationProgressed, ct) + var buildResult = await threadContext.RunOnMainAsync( + async () => await rootObjectBuilder.BuildAsync(objects, sendInfo, onOperationProgressed, ct) ); // POC: Jonathon asks on behalf of willow twin - let's explore how this can work