Files
speckle-sharp-connectors/Connectors/Revit/Speckle.Connectors.RevitShared/Operations/Receive/RevitHostObjectBuilder.cs
T
Adam Hathcock 891a18819b React to sdk renaming (#113)
* react to renamespacing

* merge dev

* fmt

* initialize things with typeloader

* autocad initialization

* add arcgis

* add more projects to local

* instrument rhino more

* update nugets

* fmt
2024-08-08 10:32:01 +00:00

103 lines
3.2 KiB
C#

using Autodesk.Revit.DB;
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.Sdk;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Collections;
using Speckle.Sdk.Models.GraphTraversal;
namespace Speckle.Connectors.Revit.Operations.Receive;
/// <summary>
/// Potentially consolidate all application specific IHostObjectBuilders
/// https://spockle.atlassian.net/browse/DUI3-465
/// </summary>
internal sealed class RevitHostObjectBuilder : IHostObjectBuilder, IDisposable
{
private readonly IRootToHostConverter _converter;
private readonly IRevitConversionContextStack _contextStack;
private readonly GraphTraversal _traverseFunction;
private readonly ITransactionManager _transactionManager;
private readonly ISyncToThread _syncToThread;
public RevitHostObjectBuilder(
IRootToHostConverter converter,
IRevitConversionContextStack contextStack,
GraphTraversal traverseFunction,
ITransactionManager transactionManager,
ISyncToThread syncToThread
)
{
_converter = converter;
_contextStack = contextStack;
_traverseFunction = traverseFunction;
_transactionManager = transactionManager;
_syncToThread = syncToThread;
}
public Task<HostObjectBuilderResult> Build(
Base rootObject,
string projectName,
string modelName,
Action<string, double?>? onOperationProgressed,
CancellationToken cancellationToken
) =>
_syncToThread.RunOnThread(() =>
{
using var activity = SpeckleActivityFactory.Start("Build");
IEnumerable<TraversalContext> objectsToConvert;
using (var _ = SpeckleActivityFactory.Start("Traverse"))
{
objectsToConvert = _traverseFunction.Traverse(rootObject).Where(obj => obj.Current is not Collection);
}
using TransactionGroup transactionGroup =
new(_contextStack.Current.Document, $"Received data from {projectName}");
transactionGroup.Start();
_transactionManager.StartTransaction();
var conversionResults = BakeObjects(objectsToConvert);
using (var _ = SpeckleActivityFactory.Start("Commit"))
{
_transactionManager.CommitTransaction();
transactionGroup.Assimilate();
}
return conversionResults;
});
// POC: Potentially refactor out into an IObjectBaker.
private HostObjectBuilderResult BakeObjects(IEnumerable<TraversalContext> objectsGraph)
{
using (var _ = SpeckleActivityFactory.Start("BakeObjects"))
{
var conversionResults = new List<ReceiveConversionResult>();
var bakedObjectIds = new List<string>();
foreach (TraversalContext tc in objectsGraph)
{
try
{
using var activity = SpeckleActivityFactory.Start("BakeObject");
var result = _converter.Convert(tc.Current);
}
catch (Exception ex) when (!ex.IsFatal())
{
conversionResults.Add(new(Status.ERROR, tc.Current, null, null, ex));
}
}
return new(bakedObjectIds, conversionResults);
}
}
public void Dispose()
{
_transactionManager?.Dispose();
}
}