83 lines
2.9 KiB
C#
83 lines
2.9 KiB
C#
using Speckle.Connectors.DUI.Bindings;
|
|
using Speckle.Connectors.DUI.Bridge;
|
|
using Speckle.Connectors.DUI.Models.Card;
|
|
using Speckle.Connectors.DUI.Models;
|
|
using Speckle.Connectors.Utils.Builders;
|
|
using Speckle.Connectors.Utils.Cancellation;
|
|
using Speckle.Connectors.Utils.Operations;
|
|
using Speckle.Autofac.DependencyInjection;
|
|
using Speckle.Connectors.Utils;
|
|
|
|
namespace Speckle.Connectors.Revit.Bindings;
|
|
|
|
internal class RevitReceiveBinding : IReceiveBinding
|
|
{
|
|
public string Name => "receiveBinding";
|
|
public IBridge Parent { get; }
|
|
|
|
private readonly CancellationManager _cancellationManager;
|
|
private readonly DocumentModelStore _store;
|
|
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
|
|
public ReceiveBindingUICommands Commands { get; }
|
|
|
|
public RevitReceiveBinding(
|
|
DocumentModelStore store,
|
|
CancellationManager cancellationManager,
|
|
IBridge parent,
|
|
IUnitOfWorkFactory unitOfWorkFactory
|
|
)
|
|
{
|
|
Parent = parent;
|
|
_store = store;
|
|
_unitOfWorkFactory = unitOfWorkFactory;
|
|
_cancellationManager = cancellationManager;
|
|
Commands = new ReceiveBindingUICommands(parent);
|
|
}
|
|
|
|
public void CancelReceive(string modelCardId) => _cancellationManager.CancelOperation(modelCardId);
|
|
|
|
public async Task Receive(string modelCardId)
|
|
{
|
|
using var unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
|
|
try
|
|
{
|
|
// Get receiver card
|
|
if (_store.GetModelById(modelCardId) is not ReceiverModelCard modelCard)
|
|
{
|
|
// Handle as GLOBAL ERROR at BrowserBridge
|
|
throw new InvalidOperationException("No download model card was found.");
|
|
}
|
|
|
|
// Init cancellation token source -> Manager also cancel it if exist before
|
|
CancellationTokenSource cts = _cancellationManager.InitCancellationTokenSource(modelCardId);
|
|
|
|
// Receive host objects
|
|
HostObjectBuilderResult conversionResults = await unitOfWork.Service
|
|
.Execute(
|
|
modelCard.AccountId.NotNull(), // POC: I hear -you are saying why we're passing them separately. Not sure pass the DUI3-> Connectors.DUI project dependency to the SDK-> Connector.Utils
|
|
modelCard.ProjectId.NotNull(),
|
|
modelCard.ProjectName.NotNull(),
|
|
modelCard.ModelName.NotNull(),
|
|
modelCard.SelectedVersionId.NotNull(),
|
|
cts.Token,
|
|
(status, progress) =>
|
|
Commands.SetModelProgress(modelCardId, new ModelCardProgress(modelCardId, status, progress), cts)
|
|
)
|
|
.ConfigureAwait(false);
|
|
|
|
modelCard.BakedObjectIds = conversionResults.BakedObjectIds.ToList();
|
|
Commands.SetModelReceiveResult(
|
|
modelCardId,
|
|
conversionResults.BakedObjectIds,
|
|
conversionResults.ConversionResults
|
|
);
|
|
}
|
|
// Catch here specific exceptions if they related to model card.
|
|
catch (OperationCanceledException)
|
|
{
|
|
// SWALLOW -> UI handles it immediately, so we do not need to handle anything
|
|
return;
|
|
}
|
|
}
|
|
}
|