Compare commits

...

66 Commits

Author SHA1 Message Date
Dogukan Karatas 6aed475a4d call the function 2024-10-03 13:33:38 +02:00
Dogukan Karatas 6b0819ecca AddCommitView added 2024-10-03 12:58:36 +02:00
oguzhankoral 20020b6fa0 URL for hackathon UI 2024-10-03 13:19:48 +03:00
oguzhankoral a798baea4e wip 2024-10-03 12:27:27 +03:00
Dimitrie Stefanescu b821a15701 Merge pull request #280 from specklesystems/claire/cnx-540-store-units-next-to-values
chore(revit): adds units to object params
2024-09-27 15:58:53 +01:00
Oğuzhan Koral 79b907f014 Merge branch 'dev' into claire/cnx-540-store-units-next-to-values 2024-09-27 13:06:57 +03:00
Adam Hathcock 6115620d7d Try to pass log info to serilog without rendering the log statement (#266)
* Try to pass log info to serilog without rendering the log statement

* formatting

* remove redundant from new
2024-09-26 10:37:22 +00:00
Oğuzhan Koral b086d16faf Feat(tekla): plugin structure and bind UI (#282)
* Fun 101

* Update package.lock for tekla project

* Align tekla with new DI

* More alignment

* Add launch setting

* Message for init

* Move project to connectors folder

* Show, activate, focus

* Post build action

* NOT_DEPENDENT for inputs

on slides said that it useful on imports and exports and faster around 20x

* Add doc for InputObjectDependency.NOT_DEPENDENT

* Disable conditions on post build action

* Make it work!

* Move packages to Directory.Packages.props

* Bump tekla package.json to sdk 3.1.0-dev.146

* Add tekla project to Local.sln too

* Update packages.lock
2024-09-26 10:10:06 +00:00
Alan Rynne 9f402e852e CXPLA-89: Replace AutomaticallyUseReferenceAssemblyPackages with nuget (#284)
* feat: replace AutomaticallyUseReferenceAssemblyPackages with package instead

* chore: Update package lock files

* No privateAssets needed in global package ref
2024-09-26 09:52:22 +00:00
Jedd Morgan 2bb558548b Jedd/cxpla 84 add commit context to receive trace (#248)
* context

* rename activity

* Fixed build

* remove crap

* Fixed issue with CallerMemberName
2024-09-26 09:36:07 +00:00
Alan Rynne 7f6029d757 fix: Removes some properties from the .targets file and puts them into each csproj (#283)
* fix: Removes some properties from the .targets file and puts them into each csproj

> repetition but also much > clarity on what's going on.

* fix: Undo props changes
2024-09-26 08:07:23 +00:00
Claire Kuang df1b972d72 sends integer values as string when non-integer (#281) 2024-09-25 16:26:48 +00:00
Claire Kuang 7a3013dcaf Merge branch 'dev' into claire/cnx-540-store-units-next-to-values 2024-09-25 17:23:54 +01:00
Oğuzhan Koral fa31283d94 Chore(revit): Refactor material cache to ToHost ToSpeckle singletons (#262)
* A bit better

* Post conflict errors

* Remove old notes
2024-09-25 17:27:15 +03:00
Claire Kuang 2bf6c834c1 adds units to object params 2024-09-25 11:46:24 +01:00
Alan Rynne d8f3fa73ee fix: Use ConversionNotSupportedException instead of system one (#279)
* fix: Use ConversionNotSupportedException instead of system one

* fix: Equivalent fix for civil
2024-09-25 09:23:10 +00:00
Dimitrie Stefanescu f59a3744b0 Merge pull request #276 from specklesystems/claire/cnx-550-fix-closed-curve-to-direct-shape-conversion
fix(revit): receives circles
2024-09-24 18:19:29 +01:00
Dimitrie Stefanescu 51a0d62723 Merge branch 'dev' into claire/cnx-550-fix-closed-curve-to-direct-shape-conversion 2024-09-24 18:14:29 +01:00
Dimitrie Stefanescu c802e77acb Merge pull request #277 from specklesystems/dimitrie/cnx-572-revit-sloped-glazing-missing
fix(revit): handles curtain grids hosted on roof elements
2024-09-24 17:58:35 +01:00
Dimitrie Stefanescu db9637bd4d Merge branch 'dev' into dimitrie/cnx-572-revit-sloped-glazing-missing 2024-09-24 17:52:15 +01:00
Dimitrie Stefanescu 304ce7e703 fix(revit): handles curtain grids hosted on roof elements 2024-09-24 17:50:04 +01:00
Claire Kuang 9ff60f3108 Update Speckle.Converters.RevitShared.projitems 2024-09-24 17:17:56 +01:00
Claire Kuang 41c8e4e4bd Merge branch 'claire/cnx-550-fix-closed-curve-to-direct-shape-conversion' of https://github.com/specklesystems/speckle-sharp-connectors into claire/cnx-550-fix-closed-curve-to-direct-shape-conversion 2024-09-24 17:13:27 +01:00
Claire Kuang 02a1e3fe06 Update Speckle.Connectors.sln 2024-09-24 17:13:16 +01:00
Claire Kuang f5f8e46f6e Merge branch 'dev' into claire/cnx-550-fix-closed-curve-to-direct-shape-conversion 2024-09-24 17:06:17 +01:00
kekesidavid 09502028ee sending worksetId and workset name + groups named after full path (#275) 2024-09-24 18:03:11 +02:00
Claire Kuang 49e918ff93 Merge branch 'dev' into claire/cnx-550-fix-closed-curve-to-direct-shape-conversion 2024-09-24 17:01:27 +01:00
Claire Kuang 1c90a8aa12 removes splitting logic and just bounds created arcs 2024-09-24 16:47:42 +01:00
Claire Kuang 6eba1939ef fixes closed curve in ds bug and refactors root converter 2024-09-24 15:52:06 +01:00
Adam Hathcock 3227d09958 Simplify DI/assembly structure part deux (#270)
* Rename utils to common

* fix namespaces

* Rhino kind of works

* Fix converter registration

* Fixed circular referece with lazy resolving

* Fixed Rhino8

* Revit 2022 builds

* revit 2023 compiles

* working on revit

* use speckle app for info instead of statics

* lazy init bindings

* Rhino compiles

* Revit compiles

* Autocad 2022 builds

* Autocad/Civil builds

* ArcGIS compiles

* Remove Autofac completely

* format

* React to SDK renames

* fixes for merge

* Update nuget and official sln

* Remove extra projects

* AutoActivate IBrowserBridge and rename it

* add extra null check

* Merge fixes

* Fix convertermanager problem and add tests

* Add new test project to local sln

* Use recursion

* formatting

* resolve circular dep with lazy get
2024-09-24 16:15:01 +03:00
Adam Hathcock c805ff0650 add deep clean doc (#273)
Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-09-24 11:57:36 +00:00
Adam Hathcock 7ee5d9ec0e Use AutomaticallyUseReferenceAssemblyPackages (#271) 2024-09-24 11:01:28 +00:00
Adam Hathcock b98e564cd1 Add null check for revit API (#272) 2024-09-24 13:57:14 +03:00
Oğuzhan Koral fd992d6471 Fix(autocad): TryGetMaterialId for both cases (#259)
* Covers both cases on render materials

* Remove unneccessary return result list

---------

Co-authored-by: Dimitrie Stefanescu <didimitrie@gmail.com>
2024-09-23 16:58:06 +00:00
Oğuzhan Koral 50414e95ad Add units info to root object on send (#260)
Co-authored-by: KatKatKateryna <89912278+KatKatKateryna@users.noreply.github.com>
Co-authored-by: Dimitrie Stefanescu <didimitrie@gmail.com>
2024-09-23 16:52:23 +00:00
Dimitrie Stefanescu 6d3eb88b20 Dimitrie/cnx 430 re evaluate parameters (#255)
* wip

* feat(dui3): simpler parameter extraction logic + parameter definitions

* chore: refactoring

* wip

* feat(revit): removes parameter definition handler from context stack and relies on DI

cc oguzhan, we'll need to refactor a few things with this in mind

* chore: adds comments

* feat: comments and logging

* feat(revit): WIP adds setting for null/empty param sending, and other refactors

* feat: respects setting in extraction logic

* chore(dui3): adds extra comments

* Fix build errors

* feat: removes dead code

---------

Co-authored-by: oguzhankoral <oguzhankoral@gmail.com>
2024-09-23 16:45:49 +00:00
Adam Hathcock 33bf13602a Revert new DI simplification (#269) 2024-09-23 17:08:00 +01:00
Dimitrie Stefanescu 0c007d33ae Merge pull request #268 from specklesystems/add-deep-clean
add deep clean
2024-09-23 16:33:34 +01:00
Dimitrie Stefanescu 61ea029d76 Merge branch 'dev' into add-deep-clean 2024-09-23 16:28:34 +01:00
Dimitrie Stefanescu ef7ff4b42a Merge pull request #267 from specklesystems/fix-DI-internal
DI classes should be public
2024-09-23 16:23:36 +01:00
Adam Hathcock f99eca8537 add deep clean 2024-09-23 16:20:43 +01:00
Adam Hathcock c8c50fa4be DI classes should be public 2024-09-23 16:18:08 +01:00
Adam Hathcock 7307e83860 Simplify DI assembly structure (#256)
* Rename utils to common

* fix namespaces

* Rhino kind of works

* Fix converter registration

* Fixed circular referece with lazy resolving

* Fixed Rhino8

* Revit 2022 builds

* revit 2023 compiles

* working on revit

* use speckle app for info instead of statics

* lazy init bindings

* Rhino compiles

* Revit compiles

* Autocad 2022 builds

* Autocad/Civil builds

* ArcGIS compiles

* Remove Autofac completely

* format

* React to SDK renames

* fixes for merge

* Update nuget and official sln

* Remove extra projects

* AutoActivate IBrowserBridge and rename it

* add extra null check
2024-09-23 15:27:46 +01:00
kekesidavid e1e762642a Fix(Revit): Delete Previous Model Groups on Multiple Receive (#263)
* fix: Delete Previous Model Groups on Multiple Receive

* made GetGroupsByName private
2024-09-20 13:24:44 +02:00
Jedd Morgan 6deb59e7f0 WIP on jedd/cnx-462-async-ify-executescriptasync-calls-to-ensure-solid-threading (#261) 2024-09-19 15:50:56 +02:00
Alan Rynne cb78f42c41 fix: Tweak logging to console on debug and seq on release (#258) 2024-09-19 12:58:03 +00:00
Dimitrie Stefanescu 4e48427bee Revit receive first pass: reference geometry workflow (CNX-403) (#254)
* feat(dui3): re-enables receive binding

probably the fourth time

* chore(revit): drastic cleanup

maybe too drastic, we will see soon

* feat(revit): starts scaffolding revit root to host converter

* RenderMaterialToHostConverter added back

* casting to GeometryObject instead of GeometryElement

* feat(dui3): fallback display values and refactors out material converter

* feat(dui3): creates DS and adds point support

* feat(dui3): closed nurbs fallback to display values

* David/cnx 443 selection (#231)

* highlight works

* use status.success on receive success

* question comment

* wip

* feat(revit): wraps receive in correct context

* wip

* feat(dui3): adds prototype grouping by collection

and adds todos

* remove invalid characters from group name

* hide warnings preprocessor

* exception handling and error log

* added cancellation and progress reporting

* chore: comments and minor cleanup

* David/cnx 409 2 add rendermaterial and color manager to connector (#242)

* materials wip

* Make it work receiving render materials

* MaterialBaker mods, cleanup

* Address the PR comments

* Remove invalid chars from structured material names

---------

Co-authored-by: oguzhankoral <oguzhankoral@gmail.com>

* Minor cleanup

* Add object application id into objects of its layer render material proxy

* feat(dui3): adds compatibility for objects with display values

* Use LocalToGlobal logic for revit receive

* Use common local to global util for arcgis too

* Remove unnecessary registration

* Remove using

* Remove unnecessart ToList

* Register LocalToGlobalConverterUtils for connectors not as common

* purge materials and groups in Revit before update (#245)

* purge materials and groups in Revit before update

* cleaner linq

* renamed _groupManager to _groupBaker

* assign categories to DirectShapes after receive, updated revit invalid chars (#253)

* Post conflict resolving problems

* minor changes, logging, comments (#257)

* minor changes, logging, comments

* typo

---------

Co-authored-by: David Kekesi <david@speckle.systems>
Co-authored-by: kekesidavid <david.kekesi@gmail.com>
Co-authored-by: oguzhankoral <oguzhankoral@gmail.com>
2024-09-19 14:09:17 +03:00
Oğuzhan Koral 2418b3e564 Fix(rhino): missing render material of layers on second send (#252)
* Fix the missing RenderMaterial prop of Layer

* Continue if RenderMaterial is set
2024-09-18 18:47:54 +03:00
Adam Hathcock 4a2233e167 SDK is non static and logging/tracing controls are moved to the connectors (#239)
* use new containerized SDK

* Use containered Tracing and Logging

* Autocad loads

* logging builds

* fmt

* Remove console logger and hook up merged logging

* cleanup

* Clean up logging

* use nuget

* Add Logging project to solution then consolidate getting assembly version

* don't need this project anymore

* merge fixes

* add new seq config

---------

Co-authored-by: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com>
2024-09-18 14:13:18 +00:00
Adam Hathcock 1dbb2b6abe Dispose Containers (except for Autocad) (#250) 2024-09-18 16:03:56 +02:00
Oğuzhan Koral b52d66c522 Pass base object not mesh under displayValues (#249) 2024-09-18 14:57:52 +03:00
Adam Hathcock 3454587330 Add tracing around conversions and success/failure exceptions (#241)
* Add tracing around conversions and success/failure exceptions

* merge fixes
2024-09-18 10:03:09 +00:00
Adam Hathcock 8d0d7a89f7 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>
2024-09-17 14:42:00 +02:00
Oğuzhan Koral cc285e99ee Add WorkspaceId to model card (#236)
it is needed to store information between sessions
2024-09-16 16:49:11 +03:00
Jedd Morgan eb8f8defc0 Jedd/cxpla 55 add required keyword for more geometry types (#220)
* Nullability of TryGet function

* blip

* Connector side changes

* Fixes

* Fixed other SDK changes

* Fixed Meters defaulting in Revit

* Agis fix required units (#224)

* fix arcgis units

* usings

* correct units

---------

Co-authored-by: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com>

* Fixed compiler errors

* Resolved PR Comments

* Fixed last revit units issue

* extras

* Bumped sdk deps

---------

Co-authored-by: KatKatKateryna <89912278+KatKatKateryna@users.noreply.github.com>
2024-09-16 11:09:49 +02:00
KatKatKateryna 466ac5e49d AGIS mesh boundaries (#222) 2024-09-16 16:47:06 +08:00
Dimitrie Stefanescu 359954cd11 Merge pull request #238 from specklesystems/oguzhan/cnx-436-autocad-wrong-arc-conversions-again
Fix(autocad): Evaluate mid point with angle
2024-09-13 12:24:58 +01:00
oguzhankoral 55e8ad8493 Evaluate mid point with angle 2024-09-12 19:22:56 +03:00
Oğuzhan Koral 3d64a3c4b7 Feat(dui3): improve root and host builders (#226)
* Remove SyncToThread from connectors

* Run only conversion under RevitTask.RunAsync

* Remove SyncToThread from RhinoHostObjectBuilder

* Introduce RootObjectUnpacker

* Split bakers and unpackers for Rhino

* Remove unnecessary out

* Use RootObjectUnpacker for proxies

* Extract proxy keys to outside

* Remove redundant comment

* Add logger for unpackers and bakers

* Add steps to RhinoRootObjectBuilder

* Pass only projectId instead of all SendInfo to ConvertRhinoObject function

* Align AutocadRootObjectBuilder with RhinoRootObjectBuilder

* Align AutocadHostObjectBuilder with RhinoHostObjectBuilder

* Use ProxyKeys on arcgis and revit

* Split unpackers and bakers for autocad

* Note to Autocad SyncToThread

* Add logger to autocad unpackers and bakers

* Notes

* Reimplemented Async builder (#229)

* Split layer manager into bakers and unpackers

Also introduces LayerPathUnpacker as abstract class to handle GetLayerPath

* Remove redundant notes

* Make GetLayerPath logic same for autocad and rhino

* Use ex instead e for exception

* chore: fixes PR comments

---------

Co-authored-by: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com>
Co-authored-by: Dimitrie Stefanescu <didimitrie@gmail.com>
2024-09-11 20:26:21 +03:00
Oğuzhan Koral 75ebf8f549 Add new properties to ReceiverModelCard for mixpanel tracking (#234) 2024-09-11 12:53:10 +01:00
Oğuzhan Koral 4c462923f2 Use default CancellationTokenSource.None (#233) 2024-09-11 11:16:35 +01:00
Oğuzhan Koral 53522a8307 Increase time span for ActionBlock (#232) 2024-09-11 08:48:59 +00:00
Adam Hathcock 7e4125cb93 Switch tracing to seq dev. Turn off tracing to console when debugging (#228) 2024-09-10 14:03:21 +00:00
Alan Rynne 0a568ac9fd fix(gitversion): Use GitFlow defaults (#230) 2024-09-10 13:50:26 +00:00
Alan Rynne 859193be37 fix: Delete build artifacts after build-installers job is done (#225)
Do so regardless of fail/success of the deployment
2024-09-10 14:52:48 +02:00
Adam Hathcock 49c2494d3c Build Revit 2022 on Local (#227) 2024-09-09 14:24:22 +02:00
508 changed files with 11538 additions and 13589 deletions
+3
View File
@@ -239,6 +239,9 @@ dotnet_diagnostic.ide0290.severity = suggestion # primary constructors: subjecti
dotnet_diagnostic.ide0290.severity = suggestion # Use primary constructor: Subjective
dotnet_diagnostic.ide0037.severity = suggestion # Use inferred member names: Sometimes its nice to be explicit
dotnet_diagnostic.ide0301.severity = suggestion # Use collection expression for empty: Subjective, intent
dotnet_diagnostic.ide0021.severity = suggestion # Use expression body for constructors : Subjective
dotnet_diagnostic.ide0090.severity = suggestion # Simplify new expression : Subjective
dotnet_diagnostic.ide0047.severity = suggestion # Parentheses preferences: IDEs don't properly pick it up
# Maintainability rules
+5
View File
@@ -52,6 +52,7 @@ jobs:
steps:
- name: 🔫 Trigger Build Installers
uses: ALEEF02/workflow-dispatch@v3.0.0
continue-on-error: true
with:
workflow: Build Installers
repo: specklesystems/connector-installers
@@ -64,6 +65,10 @@ jobs:
display-workflow-run-url: true
display-workflow-run-url-interval: 10s
- uses: geekyeggo/delete-artifact@v5
with:
name: output-*
test:
runs-on: ubuntu-latest
steps:
+28
View File
@@ -16,6 +16,7 @@ const string RESTORE_TOOLS = "restore-tools";
const string BUILD_SERVER_VERSION = "build-server-version";
const string CLEAN_LOCKS = "clean-locks";
const string CHECK_SOLUTIONS = "check-solutions";
const string DEEP_CLEAN = "deep-clean";
//need to pass arguments
/*var arguments = new List<string>();
@@ -40,6 +41,33 @@ Target(
}
);
Target(
DEEP_CLEAN,
() =>
{
foreach (var f in Glob.Directories(".", "**/bin"))
{
if (f.StartsWith("Build"))
{
continue;
}
Console.WriteLine("Found and will delete: " + f);
Directory.Delete(f, true);
}
foreach (var f in Glob.Directories(".", "**/obj"))
{
if (f.StartsWith("Build"))
{
continue;
}
Console.WriteLine("Found and will delete: " + f);
Directory.Delete(f, true);
}
Console.WriteLine("Running restore now.");
Run("dotnet", "restore .\\Speckle.Connectors.sln --no-cache");
}
);
Target(
CLEAN,
ForEach("**/output"),
-1
View File
@@ -45,7 +45,6 @@ public static class Solutions
CheckAndRemoveKnown("Speckle.Objects");
CheckAndRemoveKnown("Speckle.Sdk");
CheckAndRemoveKnown("Speckle.Sdk.Logging");
if (localProjects.Count != 0)
{
throw new InvalidOperationException(
+14
View File
@@ -30,6 +30,15 @@
"System.Threading.Tasks.Dataflow": "8.0.0"
}
},
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net461": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -73,6 +82,11 @@
"resolved": "17.10.4",
"contentHash": "wyABaqY+IHCMMSTQmcc3Ca6vbmg5BaEPgicnEgpll+4xyWZWlkQqUwafweUd9VAhBb4jqplMl6voUHQ6yfdUcg=="
},
"Microsoft.NETFramework.ReferenceAssemblies.net461": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "AmOJZwCqnOCNp6PPcf9joyogScWLtwy0M1WkqfEQ0M9nYwyDD7EX9ZjscKS5iYnyvteX7kzSKFCKt9I9dXA6mA=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -1,12 +1,18 @@
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Mapping;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.Common.Cancellation;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Logging;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Connectors.DUI.Settings;
using Speckle.Converters.ArcGIS3;
using Speckle.Converters.ArcGIS3.Utils;
using Speckle.Converters.Common;
using Speckle.Sdk;
namespace Speckle.Connectors.ArcGIS.Bindings;
@@ -16,31 +22,38 @@ public sealed class ArcGISReceiveBinding : IReceiveBinding
public string Name { get; } = "receiveBinding";
private readonly CancellationManager _cancellationManager;
private readonly DocumentModelStore _store;
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IServiceProvider _serviceProvider;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<ArcGISReceiveBinding> _logger;
private readonly IArcGISConversionSettingsFactory _arcGISConversionSettingsFactory;
private ReceiveBindingUICommands Commands { get; }
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
public ArcGISReceiveBinding(
DocumentModelStore store,
IBridge parent,
IBrowserBridge parent,
CancellationManager cancellationManager,
IUnitOfWorkFactory unitOfWorkFactory,
IServiceProvider serviceProvider,
IOperationProgressManager operationProgressManager,
ILogger<ArcGISReceiveBinding> logger
ILogger<ArcGISReceiveBinding> logger,
IArcGISConversionSettingsFactory arcGisConversionSettingsFactory
)
{
_store = store;
_cancellationManager = cancellationManager;
Parent = parent;
Commands = new ReceiveBindingUICommands(parent);
_unitOfWorkFactory = unitOfWorkFactory;
_serviceProvider = serviceProvider;
_operationProgressManager = operationProgressManager;
_logger = logger;
_arcGISConversionSettingsFactory = arcGisConversionSettingsFactory;
}
#pragma warning disable CA1024
public List<ICardSetting> GetReceiveSettings() => [];
#pragma warning restore CA1024
public async Task Receive(string modelCardId)
{
try
@@ -53,12 +66,20 @@ public sealed class ArcGISReceiveBinding : IReceiveBinding
}
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
using IUnitOfWork<ReceiveOperation> unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
using var scope = _serviceProvider.CreateScope();
scope
.ServiceProvider.GetRequiredService<IConverterSettingsStore<ArcGISConversionSettings>>()
.Initialize(
_arcGISConversionSettingsFactory.Create(
Project.Current,
MapView.Active.Map,
new CRSoffsetRotation(MapView.Active.Map)
)
);
// Receive host objects
var receiveOperationResults = await unitOfWork
.Service.Execute(
var receiveOperationResults = await scope
.ServiceProvider.GetRequiredService<ReceiveOperation>()
.Execute(
modelCard.GetReceiveInfo("ArcGIS"), // POC: get host app name from settings? same for GetSendInfo
cancellationToken,
(status, progress) =>
@@ -8,9 +8,9 @@ namespace Speckle.Connectors.ArcGIS.Bindings;
public class ArcGISSelectionBinding : ISelectionBinding
{
public string Name => "selectionBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
public ArcGISSelectionBinding(IBridge parent)
public ArcGISSelectionBinding(IBrowserBridge parent)
{
Parent = parent;
var topLevelHandler = parent.TopLevelExceptionHandler;
@@ -1,14 +1,17 @@
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;
using ArcGIS.Desktop.Mapping.Events;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.ArcGIS.Filters;
using Speckle.Connectors.ArcGIS.Utils;
using Speckle.Connectors.Common.Caching;
using Speckle.Connectors.Common.Cancellation;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Exceptions;
@@ -17,9 +20,9 @@ using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
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;
@@ -29,17 +32,17 @@ public sealed class ArcGISSendBinding : ISendBinding
{
public string Name => "sendBinding";
public SendBindingUICommands Commands { get; }
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
private readonly DocumentModelStore _store;
private readonly IUnitOfWorkFactory _unitOfWorkFactory; // POC: unused? :D
private readonly IServiceProvider _serviceProvider;
private readonly List<ISendFilter> _sendFilters;
private readonly CancellationManager _cancellationManager;
private readonly ISendConversionCache _sendConversionCache;
private readonly IOperationProgressManager _operationProgressManager;
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:
@@ -54,25 +57,25 @@ public sealed class ArcGISSendBinding : ISendBinding
public ArcGISSendBinding(
DocumentModelStore store,
IBridge parent,
IBrowserBridge parent,
IEnumerable<ISendFilter> sendFilters,
IUnitOfWorkFactory unitOfWorkFactory,
IServiceProvider serviceProvider,
CancellationManager cancellationManager,
ISendConversionCache sendConversionCache,
IOperationProgressManager operationProgressManager,
ILogger<ArcGISSendBinding> logger,
MapMembersUtils mapMemberUtils
IArcGISConversionSettingsFactory arcGisConversionSettingsFactory
)
{
_store = store;
_unitOfWorkFactory = unitOfWorkFactory;
_serviceProvider = serviceProvider;
_sendFilters = sendFilters.ToList();
_cancellationManager = cancellationManager;
_sendConversionCache = sendConversionCache;
_operationProgressManager = operationProgressManager;
_logger = logger;
_topLevelExceptionHandler = parent.TopLevelExceptionHandler;
_mapMemberUtils = mapMemberUtils;
_arcGISConversionSettingsFactory = arcGisConversionSettingsFactory;
Parent = parent;
Commands = new SendBindingUICommands(parent);
@@ -357,7 +360,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 +374,16 @@ public sealed class ArcGISSendBinding : ISendBinding
var sendResult = await QueuedTask
.Run(async () =>
{
using var scope = _serviceProvider.CreateScope();
scope
.ServiceProvider.GetRequiredService<IConverterSettingsStore<ArcGISConversionSettings>>()
.Initialize(
_arcGISConversionSettingsFactory.Create(
Project.Current,
MapView.Active.Map,
new CRSoffsetRotation(MapView.Active.Map)
)
);
List<MapMember> mapMembers = modelCard
.SendFilter.NotNull()
.GetObjectIds()
@@ -399,8 +412,9 @@ public sealed class ArcGISSendBinding : ISendBinding
}
}
var result = await unitOfWork
.Service.Execute(
var result = await scope
.ServiceProvider.GetRequiredService<SendOperation<MapMember>>()
.Execute(
mapMembers,
modelCard.GetSendInfo("ArcGIS"), // POC: get host app name from settings? same for GetReceiveInfo
(status, progress) =>
@@ -6,7 +6,7 @@ using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Common;
using Speckle.Sdk;
using Speckle.Sdk.Common;
using ArcProject = ArcGIS.Desktop.Core.Project;
@@ -16,14 +16,16 @@ namespace Speckle.Connectors.ArcGIS.Bindings;
public class BasicConnectorBinding : IBasicConnectorBinding
{
public string Name => "baseBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
public BasicConnectorBindingCommands Commands { get; }
private readonly DocumentModelStore _store;
private readonly ISpeckleApplication _speckleApplication;
public BasicConnectorBinding(DocumentModelStore store, IBridge parent)
public BasicConnectorBinding(DocumentModelStore store, IBrowserBridge parent, ISpeckleApplication speckleApplication)
{
_store = store;
_speckleApplication = speckleApplication;
Parent = parent;
Commands = new BasicConnectorBindingCommands(parent);
@@ -33,11 +35,11 @@ public class BasicConnectorBinding : IBasicConnectorBinding
};
}
public string GetSourceApplicationName() => Speckle.Connectors.Utils.Connector.Slug;
public string GetSourceApplicationName() => _speckleApplication.Slug;
public string GetSourceApplicationVersion() => Speckle.Connectors.Utils.Connector.VersionString;
public string GetSourceApplicationVersion() => _speckleApplication.HostApplicationVersion;
public string GetConnectorVersion() => typeof(BasicConnectorBinding).Assembly.GetVersion();
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
public DocumentInfo? GetDocumentInfo()
{
@@ -1,24 +1,21 @@
using ArcGIS.Desktop.Mapping;
using Autofac;
using Speckle.Autofac;
using Speckle.Autofac.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Speckle.Connectors.ArcGIS.Bindings;
using Speckle.Connectors.ArcGIS.Filters;
using Speckle.Connectors.ArcGIS.HostApp;
using Speckle.Connectors.ArcGIS.Operations.Receive;
using Speckle.Connectors.ArcGis.Operations.Send;
using Speckle.Connectors.ArcGIS.Utils;
using Speckle.Connectors.Common;
using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Caching;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
using Speckle.Connectors.DUI.WebView;
using Speckle.Connectors.Utils;
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;
// POC: This is a temp reference to root object senders to tweak CI failing after having generic interfaces into common project.
@@ -26,58 +23,47 @@ using Speckle.Sdk.Models.GraphTraversal;
namespace Speckle.Connectors.ArcGIS.DependencyInjection;
public class ArcGISConnectorModule : ISpeckleModule
public static class ArcGISConnectorModule
{
public void Load(SpeckleContainerBuilder builder)
public static void AddArcGIS(this IServiceCollection serviceCollection)
{
builder.AddAutofac();
builder.AddConnectorUtils();
builder.AddDUI();
builder.AddDUIView();
serviceCollection.AddConnectorUtils();
serviceCollection.AddDUI();
serviceCollection.AddDUIView();
// POC: Overwriting the SyncToMainThread to SyncToCurrentThread for ArcGIS only!
// On SendOperation, once we called QueuedTask, it expect to run everything on same thread.
// builder.AddSingletonInstance<ISyncToThread, SyncToQueuedTask>();
builder.AddSingleton<DocumentModelStore, ArcGISDocumentStore>();
serviceCollection.AddSingleton<DocumentModelStore, ArcGISDocumentStore>();
// Register bindings
builder.AddSingleton<IBinding, TestBinding>();
builder.AddSingleton<IBinding, ConfigBinding>("connectorName", "ArcGIS"); // POC: Easier like this for now, should be cleaned up later
builder.AddSingleton<IBinding, AccountBinding>();
serviceCollection.AddSingleton<IBinding, TestBinding>();
serviceCollection.AddSingleton<IBinding, ConfigBinding>();
serviceCollection.AddSingleton<IBinding, AccountBinding>();
builder.ContainerBuilder.RegisterType<TopLevelExceptionHandlerBinding>().As<IBinding>().AsSelf().SingleInstance();
builder.AddSingleton<ITopLevelExceptionHandler>(c =>
c.Resolve<TopLevelExceptionHandlerBinding>().Parent.TopLevelExceptionHandler
);
serviceCollection.RegisterTopLevelExceptionHandler();
builder
.ContainerBuilder.RegisterType<BasicConnectorBinding>()
.As<IBinding>()
.As<IBasicConnectorBinding>()
.SingleInstance();
serviceCollection.AddSingleton<IBinding>(sp => sp.GetRequiredService<IBasicConnectorBinding>());
serviceCollection.AddSingleton<IBasicConnectorBinding, BasicConnectorBinding>();
builder.AddSingleton<IBinding, ArcGISSelectionBinding>();
builder.AddSingleton<IBinding, ArcGISSendBinding>();
builder.AddSingleton<IBinding, ArcGISReceiveBinding>();
serviceCollection.AddSingleton<IBinding, ArcGISSelectionBinding>();
serviceCollection.AddSingleton<IBinding, ArcGISSendBinding>();
serviceCollection.AddSingleton<IBinding, ArcGISReceiveBinding>();
builder.AddTransient<ISendFilter, ArcGISSelectionFilter>();
builder.AddScoped<IHostObjectBuilder, ArcGISHostObjectBuilder>();
builder.AddSingleton(DefaultTraversal.CreateTraversalFunc());
serviceCollection.AddTransient<ISendFilter, ArcGISSelectionFilter>();
serviceCollection.AddScoped<IHostObjectBuilder, ArcGISHostObjectBuilder>();
serviceCollection.AddSingleton(DefaultTraversal.CreateTraversalFunc());
// register send operation and dependencies
builder.AddScoped<SendOperation<MapMember>>();
builder.AddScoped<ArcGISRootObjectBuilder>();
builder.AddScoped<IRootObjectBuilder<MapMember>, ArcGISRootObjectBuilder>();
serviceCollection.AddScoped<SendOperation<MapMember>>();
serviceCollection.AddScoped<ArcGISRootObjectBuilder>();
serviceCollection.AddScoped<IRootObjectBuilder<MapMember>, ArcGISRootObjectBuilder>();
builder.AddScoped<ArcGISColorManager>();
builder.AddScoped<MapMembersUtils>();
serviceCollection.AddScoped<LocalToGlobalConverterUtils>();
builder.AddScoped<ILocalToGlobalUnpacker, LocalToGlobalUnpacker>();
serviceCollection.AddScoped<ArcGISColorManager>();
serviceCollection.AddScoped<MapMembersUtils>();
// register send conversion cache
builder.AddSingleton<ISendConversionCache, SendConversionCache>();
serviceCollection.AddSingleton<ISendConversionCache, SendConversionCache>();
// operation progress manager
builder.AddSingleton<IOperationProgressManager, OperationProgressManager>();
serviceCollection.AddSingleton<IOperationProgressManager, OperationProgressManager>();
}
}
@@ -204,8 +204,8 @@
<CleanInfo ParameterType="System.String" Output="true"/>
</ParameterGroup>
<Task>
<Reference Include="System.Xml.Linq"/>
<Reference Include="System.Xml"/>
<!-- <Reference Include="System.Xml.Linq"/>-->
<!-- <Reference Include="System.Xml"/>-->
<Using Namespace="System"/>
<Using Namespace="System.IO"/>
<Using Namespace="System.Xml.Linq"/>
@@ -1,5 +1,5 @@
using ArcGIS.Desktop.Framework.Threading.Tasks;
using Speckle.Connectors.Utils.Operations;
using Speckle.Connectors.Common.Operations;
namespace Speckle.Connectors.ArcGIS.HostApp;
@@ -5,9 +5,10 @@ using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Mapping;
using Speckle.Connectors.ArcGIS.HostApp;
using Speckle.Connectors.ArcGIS.Utils;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Instances;
using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Conversion;
using Speckle.Connectors.Common.Instances;
using Speckle.Connectors.Common.Operations;
using Speckle.Converters.ArcGIS3;
using Speckle.Converters.ArcGIS3.Utils;
using Speckle.Converters.Common;
@@ -28,27 +29,27 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
private readonly IRootToHostConverter _converter;
private readonly IFeatureClassUtils _featureClassUtils;
private readonly ILocalToGlobalUnpacker _localToGlobalUnpacker;
private readonly ILocalToGlobalConverterUtils _localToGlobalConverterUtils;
private readonly LocalToGlobalConverterUtils _localToGlobalConverterUtils;
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,
LocalToGlobalConverterUtils localToGlobalConverterUtils,
ICrsUtils crsUtils,
GraphTraversal traverseFunction,
ArcGISColorManager colorManager
)
{
_converter = converter;
_contextStack = contextStack;
_settingsStore = settingsStore;
_featureClassUtils = featureClassUtils;
_localToGlobalUnpacker = localToGlobalUnpacker;
_localToGlobalConverterUtils = localToGlobalConverterUtils;
@@ -72,7 +73,7 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
onOperationProgressed?.Invoke("Converting", null);
// get materials
List<RenderMaterialProxy>? materials = (rootObject["renderMaterialProxies"] as List<object>)
List<RenderMaterialProxy>? materials = (rootObject[ProxyKeys.RENDER_MATERIAL] as List<object>)
?.Cast<RenderMaterialProxy>()
.ToList();
if (materials != null)
@@ -81,7 +82,7 @@ public class ArcGISHostObjectBuilder : IHostObjectBuilder
}
// get colors
List<ColorProxy>? colors = (rootObject["colorProxies"] as List<object>)?.Cast<ColorProxy>().ToList();
List<ColorProxy>? colors = (rootObject[ProxyKeys.COLOR] as List<object>)?.Cast<ColorProxy>().ToList();
if (colors != null)
{
_colorManager.ParseColors(colors, onOperationProgressed);
@@ -239,12 +240,12 @@ 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();
var instanceDefinitionProxies = (rootObject["instanceDefinitionProxies"] as List<object>)
var instanceDefinitionProxies = (rootObject[ProxyKeys.INSTANCE_DEFINITION] as List<object>)
?.Cast<InstanceDefinitionProxy>()
.ToList();
@@ -305,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
@@ -316,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
@@ -339,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,19 +1,19 @@
using System.Diagnostics;
using ArcGIS.Core.Geometry;
using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Mapping;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.ArcGIS.HostApp;
using Speckle.Connectors.ArcGIS.Utils;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Extensions;
using Speckle.Connectors.Utils.Operations;
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;
using Speckle.Converters.ArcGIS3;
using Speckle.Converters.Common;
using Speckle.Objects.GIS;
using Speckle.Sdk;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Collections;
using Speckle.Sdk.Models.Proxies;
@@ -28,28 +28,33 @@ 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> _converterSettings;
private readonly MapMembersUtils _mapMemberUtils;
private readonly ILogger<ArcGISRootObjectBuilder> _logger;
private readonly ISdkActivityFactory _activityFactory;
public ArcGISRootObjectBuilder(
ISendConversionCache sendConversionCache,
ArcGISColorManager colorManager,
IConversionContextStack<ArcGISDocument, Unit> contextStack,
IConverterSettingsStore<ArcGISConversionSettings> converterSettings,
IRootToSpeckleConverter rootToSpeckleConverter,
MapMembersUtils mapMemberUtils,
ILogger<ArcGISRootObjectBuilder> logger
ILogger<ArcGISRootObjectBuilder> logger,
ISdkActivityFactory activityFactory
)
{
_sendConversionCache = sendConversionCache;
_colorManager = colorManager;
_contextStack = contextStack;
_converterSettings = converterSettings;
_rootToSpeckleConverter = rootToSpeckleConverter;
_mapMemberUtils = mapMemberUtils;
_logger = logger;
_activityFactory = activityFactory;
}
#pragma warning disable CA1506
public async Task<RootObjectBuilderResult> Build(
#pragma warning restore CA1506
IReadOnlyList<MapMember> objects,
SendInfo sendInfo,
Action<string, double?>? onOperationProgressed = null,
@@ -62,6 +67,7 @@ public class ArcGISRootObjectBuilder : IRootObjectBuilder<MapMember>
int count = 0;
Collection rootObjectCollection = new() { name = MapView.Active.Map.Name }; //TODO: Collections
rootObjectCollection["units"] = _converterSettings.Current.SpeckleUnits;
List<SendConversionResult> results = new(objects.Count);
var cacheHitCount = 0;
@@ -74,99 +80,111 @@ public class ArcGISRootObjectBuilder : IRootObjectBuilder<MapMember>
);
onOperationProgressed?.Invoke("Converting", null);
foreach ((MapMember mapMember, _) in layersWithDisplayPriority)
using (var __ = _activityFactory.Start("Converting objects"))
{
ct.ThrowIfCancellationRequested();
var collectionHost = rootObjectCollection;
string applicationId = mapMember.URI;
string sourceType = mapMember.GetType().Name;
Base converted;
try
foreach ((MapMember mapMember, _) in layersWithDisplayPriority)
{
int groupCount = nestedGroups.Count; // bake here, because count will change in the loop
// if the layer is not a part of the group, reset groups
for (int i = 0; i < groupCount; i++)
{
if (nestedGroups.Count > 0 && !nestedGroups[0].Item1.Layers.Select(x => x.URI).Contains(applicationId))
{
nestedGroups.RemoveAt(0);
}
else
{
// break at the first group, which contains current layer
break;
}
}
ct.ThrowIfCancellationRequested();
// don't use cache for group layers
if (
mapMember is not GroupLayer
&& _sendConversionCache.TryGetValue(sendInfo.ProjectId, applicationId, out ObjectReference? value)
)
using (var convertingActivity = _activityFactory.Start("Converting object"))
{
converted = value;
cacheHitCount++;
}
else
{
if (mapMember is GroupLayer group)
{
// group layer will always come before it's contained layers
// keep active group last in the list
converted = new Collection();
nestedGroups.Insert(0, (group, (Collection)converted));
}
else
{
converted = await QueuedTask
.Run(() => (Collection)_rootToSpeckleConverter.Convert(mapMember))
.ConfigureAwait(false);
var collectionHost = rootObjectCollection;
string applicationId = mapMember.URI;
string sourceType = mapMember.GetType().Name;
// get units & Active CRS (for writing geometry coords)
converted["units"] = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpeckleUnitString;
var spatialRef = _contextStack.Current.Document.ActiveCRSoffsetRotation.SpatialReference;
converted["crs"] = new CRS
Base converted;
try
{
int groupCount = nestedGroups.Count; // bake here, because count will change in the loop
// if the layer is not a part of the group, reset groups
for (int i = 0; i < groupCount; i++)
{
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,
};
if (nestedGroups.Count > 0 && !nestedGroups[0].Item1.Layers.Select(x => x.URI).Contains(applicationId))
{
nestedGroups.RemoveAt(0);
}
else
{
// break at the first group, which contains current layer
break;
}
}
// don't use cache for group layers
if (
mapMember is not GroupLayer
&& _sendConversionCache.TryGetValue(sendInfo.ProjectId, applicationId, out ObjectReference? value)
)
{
converted = value;
cacheHitCount++;
}
else
{
if (mapMember is GroupLayer group)
{
// group layer will always come before it's contained layers
// keep active group last in the list
converted = new Collection();
nestedGroups.Insert(0, (group, (Collection)converted));
}
else
{
converted = await QueuedTask
.Run(() => (Collection)_rootToSpeckleConverter.Convert(mapMember))
.ConfigureAwait(false);
// get units & Active CRS (for writing geometry coords)
converted["units"] = _converterSettings.Current.SpeckleUnits;
var spatialRef = _converterSettings.Current.ActiveCRSoffsetRotation.SpatialReference;
converted["crs"] = new CRS
{
wkt = spatialRef.Wkt,
name = spatialRef.Name,
offset_y = Convert.ToSingle(_converterSettings.Current.ActiveCRSoffsetRotation.LatOffset),
offset_x = Convert.ToSingle(_converterSettings.Current.ActiveCRSoffsetRotation.LonOffset),
rotation = Convert.ToSingle(_converterSettings.Current.ActiveCRSoffsetRotation.TrueNorthRadians),
units_native = _converterSettings.Current.SpeckleUnits
};
}
// other common properties for layers and groups
converted["name"] = mapMember.Name;
converted.applicationId = applicationId;
}
if (
nestedGroups.Count == 0
|| nestedGroups.Count == 1 && nestedGroups[0].Item2.applicationId == applicationId
)
{
// add to host if no groups, or current root group
collectionHost.elements.Add(converted);
}
else
{
// if we are adding a layer inside the group
var parentCollection = nestedGroups.FirstOrDefault(x =>
x.Item1.Layers.Select(y => y.URI).Contains(applicationId)
);
parentCollection.Item2.elements.Add(converted);
}
results.Add(new(Status.SUCCESS, applicationId, sourceType, converted));
convertingActivity?.SetStatus(SdkActivityStatusCode.Ok);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogSendConversionError(ex, sourceType);
results.Add(new(Status.ERROR, applicationId, sourceType, null, ex));
convertingActivity?.SetStatus(SdkActivityStatusCode.Error);
convertingActivity?.RecordException(ex);
}
// other common properties for layers and groups
converted["name"] = mapMember.Name;
converted.applicationId = applicationId;
}
if (nestedGroups.Count == 0 || nestedGroups.Count == 1 && nestedGroups[0].Item2.applicationId == applicationId)
{
// add to host if no groups, or current root group
collectionHost.elements.Add(converted);
}
else
{
// if we are adding a layer inside the group
var parentCollection = nestedGroups.FirstOrDefault(x =>
x.Item1.Layers.Select(y => y.URI).Contains(applicationId)
);
parentCollection.Item2.elements.Add(converted);
}
results.Add(new(Status.SUCCESS, applicationId, sourceType, converted));
onOperationProgressed?.Invoke("Converting", (double)++count / objects.Count);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogSendConversionError(ex, sourceType);
results.Add(new(Status.ERROR, applicationId, sourceType, null, ex));
}
onOperationProgressed?.Invoke("Converting", (double)++count / objects.Count);
}
if (results.All(x => x.Status == Status.ERROR))
@@ -176,7 +194,7 @@ public class ArcGISRootObjectBuilder : IRootObjectBuilder<MapMember>
// POC: Add Color Proxies
List<ColorProxy> colorProxies = _colorManager.UnpackColors(layersWithDisplayPriority);
rootObjectCollection["colorProxies"] = colorProxies;
rootObjectCollection[ProxyKeys.COLOR] = colorProxies;
// POC: Log would be nice, or can be removed.
Debug.WriteLine(
@@ -27,9 +27,9 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\ArcGIS\Speckle.Converters.ArcGIS3.DependencyInjection\Speckle.Converters.ArcGIS3.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Converters\ArcGIS\Speckle.Converters.ArcGIS3\Speckle.Converters.ArcGIS3.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Utils\Speckle.Connectors.Utils.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
</ItemGroup>
<Import Project="Esri.ArcGISPro.Extensions30.Speckle.targets" />
@@ -1,4 +1,5 @@
using System.Windows.Controls;
using Microsoft.Extensions.DependencyInjection;
using Speckle.Connectors.DUI.WebView;
namespace Speckle.Connectors.ArcGIS;
@@ -12,6 +13,6 @@ public class SpeckleDUI3Wrapper : UserControl
private void Initialize()
{
Content = SpeckleModule.Current.Container.Resolve<DUI3ControlWebView>();
Content = SpeckleModule.Current.Container.GetRequiredService<DUI3ControlWebView>();
}
}
@@ -1,10 +1,9 @@
using System.IO;
using System.Reflection;
using ArcGIS.Desktop.Framework;
using Speckle.Autofac;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.Utils;
using Speckle.Sdk.Common;
using Microsoft.Extensions.DependencyInjection;
using Speckle.Connectors.ArcGIS.DependencyInjection;
using Speckle.Connectors.Common;
using Speckle.Connectors.DUI;
using Speckle.Converters.ArcGIS3;
using Speckle.Sdk.Host;
using Module = ArcGIS.Desktop.Framework.Contracts.Module;
@@ -24,22 +23,19 @@ internal sealed class SpeckleModule : Module
public static SpeckleModule Current =>
s_this ??= (SpeckleModule)FrameworkApplication.FindModule("ConnectorArcGIS_Module");
public SpeckleContainer Container { get; }
public ServiceProvider Container { get; }
public SpeckleModule()
{
AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver.OnAssemblyResolve<SpeckleModule>;
var builder = SpeckleContainerBuilder.CreateInstance();
var services = new ServiceCollection();
// init DI
_disposableLogger = Connector.Initialize(HostApplications.ArcGIS, GetVersion());
Container = builder
.LoadAutofacModules(
Assembly.GetExecutingAssembly(),
[Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).NotNull()]
)
.Build();
_disposableLogger = services.Initialize(HostApplications.ArcGIS, GetVersion());
services.AddArcGIS();
services.AddArcGISConverters();
Container = services.BuildServiceProvider();
Container.UseDUI();
}
private HostAppVersion GetVersion()
@@ -60,6 +56,7 @@ internal sealed class SpeckleModule : Module
//TODO - add your business logic
//return false to ~cancel~ Application close
_disposableLogger?.Dispose();
Container.Dispose();
return true;
}
}
@@ -10,9 +10,18 @@
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Direct",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net461": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
@@ -96,54 +105,56 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg=="
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net461": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "AmOJZwCqnOCNp6PPcf9joyogScWLtwy0M1WkqfEQ0M9nYwyDD7EX9ZjscKS5iYnyvteX7kzSKFCKt9I9dXA6mA=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
@@ -178,11 +189,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -213,6 +219,11 @@
"SQLitePCLRaw.core": "2.1.4"
}
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.3",
@@ -223,24 +234,26 @@
"resolved": "5.0.0",
"contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ=="
},
"System.Text.Json": {
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ=="
"resolved": "4.5.1",
"contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -251,14 +264,8 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.arcgis3": {
"type": "Project",
@@ -267,44 +274,32 @@
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"speckle.converters.arcgis3.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Converters.ArcGIS3": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )"
}
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Web.WebView2": {
@@ -315,29 +310,29 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -2,17 +2,20 @@
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<PlatformTarget>x64</PlatformTarget>
<UseWpf>true</UseWpf>
<AutoCADVersion>2022</AutoCADVersion>
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2022;AUTOCAD2022_OR_GREATER</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<StartAction>Program</StartAction>
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2022.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2022.DependencyInjection\Speckle.Converters.Autocad2022.DependencyInjection.csproj" />
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2022\Speckle.Converters.Autocad2022.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
</ItemGroup>
@@ -2,6 +2,15 @@
"version": 2,
"dependencies": {
".NETFramework,Version=v4.8": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -62,14 +71,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -99,61 +100,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -187,11 +184,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -224,22 +216,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -253,8 +245,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -266,32 +258,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -301,24 +269,21 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -329,14 +294,8 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.autocad2022": {
"type": "Project",
@@ -345,55 +304,39 @@
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"speckle.converters.autocad2022.dependencyinjection": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )",
"Speckle.Converters.Autocad2022": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )"
}
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.Web.WebView2": {
"type": "CentralTransitive",
@@ -403,29 +346,29 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -2,17 +2,20 @@
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<PlatformTarget>x64</PlatformTarget>
<UseWpf>true</UseWpf>
<AutoCADVersion>2023</AutoCADVersion>
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2023;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<StartAction>Program</StartAction>
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2023.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2023.DependencyInjection\Speckle.Converters.Autocad2023.DependencyInjection.csproj" />
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2023\Speckle.Converters.Autocad2023.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
</ItemGroup>
@@ -2,6 +2,15 @@
"version": 2,
"dependencies": {
".NETFramework,Version=v4.8": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -62,14 +71,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -99,61 +100,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -187,11 +184,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -224,22 +216,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -253,8 +245,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -266,32 +258,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -301,24 +269,21 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -329,14 +294,8 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.autocad2023": {
"type": "Project",
@@ -345,55 +304,39 @@
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"speckle.converters.autocad2023.dependencyinjection": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )",
"Speckle.Converters.Autocad2023": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )"
}
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.Web.WebView2": {
"type": "CentralTransitive",
@@ -403,29 +346,29 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -2,9 +2,12 @@
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<PlatformTarget>x64</PlatformTarget>
<UseWpf>true</UseWpf>
<AutoCADVersion>2024</AutoCADVersion>
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2024;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER;AUTOCAD2024_OR_GREATER</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<StartAction>Program</StartAction>
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
</PropertyGroup>
<ItemGroup>
@@ -12,7 +15,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2024.DependencyInjection\Speckle.Converters.Autocad2024.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2024\Speckle.Converters.Autocad2024.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
</ItemGroup>
@@ -2,6 +2,15 @@
"version": 2,
"dependencies": {
".NETFramework,Version=v4.8": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -62,14 +71,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -99,61 +100,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -187,11 +184,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -224,22 +216,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -253,8 +245,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -266,32 +258,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -301,24 +269,21 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -329,14 +294,8 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.autocad2024": {
"type": "Project",
@@ -346,55 +305,39 @@
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"speckle.converters.autocad2024.dependencyinjection": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )",
"Speckle.Converters.Autocad2024": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )"
}
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.Web.WebView2": {
"type": "CentralTransitive",
@@ -404,29 +347,29 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -2,11 +2,14 @@
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<PlatformTarget>x64</PlatformTarget>
<UseWpf>true</UseWpf>
<AutoCADVersion>2025</AutoCADVersion>
<DefineConstants>$(DefineConstants);AUTOCAD2025;AUTOCAD</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
<StartAction>Program</StartAction>
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
</PropertyGroup>
<ItemGroup>
@@ -15,7 +18,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2025.DependencyInjection\Speckle.Converters.Autocad2025.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2025\Speckle.Converters.Autocad2025.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
</ItemGroup>
@@ -2,6 +2,15 @@
"version": 2,
"dependencies": {
"net8.0-windows7.0": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net461": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -90,54 +99,56 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg=="
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net461": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "AmOJZwCqnOCNp6PPcf9joyogScWLtwy0M1WkqfEQ0M9nYwyDD7EX9ZjscKS5iYnyvteX7kzSKFCKt9I9dXA6mA=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
@@ -172,11 +183,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -207,6 +213,11 @@
"SQLitePCLRaw.core": "2.1.4"
}
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.3",
@@ -217,24 +228,26 @@
"resolved": "5.0.0",
"contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ=="
},
"System.Text.Json": {
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ=="
"resolved": "4.5.1",
"contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -245,14 +258,8 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.autocad2025": {
"type": "Project",
@@ -262,52 +269,39 @@
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"speckle.converters.autocad2025.dependencyinjection": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )",
"Speckle.Converters.Autocad2025": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )"
}
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.Web.WebView2": {
"type": "CentralTransitive",
@@ -317,29 +311,29 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -1,10 +1,10 @@
using Autodesk.AutoCAD.DatabaseServices;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Common;
using Speckle.Sdk;
using Speckle.Sdk.Common;
using Speckle.Sdk.Credentials;
@@ -13,31 +13,44 @@ namespace Speckle.Connectors.Autocad.Bindings;
public class AutocadBasicConnectorBinding : IBasicConnectorBinding
{
private readonly IAccountManager _accountManager;
public string Name { get; set; } = "baseBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
private readonly DocumentModelStore _store;
private readonly ISpeckleApplication _speckleApplication;
private readonly ILogger<AutocadBasicConnectorBinding> _logger;
public BasicConnectorBindingCommands Commands { get; }
public AutocadBasicConnectorBinding(DocumentModelStore store, IBridge parent)
public AutocadBasicConnectorBinding(
DocumentModelStore store,
IBrowserBridge parent,
IAccountManager accountManager,
ISpeckleApplication speckleApplication,
ILogger<AutocadBasicConnectorBinding> logger
)
{
_store = store;
Parent = parent;
_accountManager = accountManager;
_speckleApplication = speckleApplication;
Commands = new BasicConnectorBindingCommands(parent);
_store.DocumentChanged += (_, _) =>
{
Commands.NotifyDocumentChanged();
};
_logger = logger;
}
public string GetConnectorVersion() => typeof(AutocadBasicConnectorBinding).Assembly.GetVersion();
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
public string GetSourceApplicationName() => Utils.Connector.Slug;
public string GetSourceApplicationName() => _speckleApplication.Slug;
public string GetSourceApplicationVersion() => Utils.Connector.VersionString;
public string GetSourceApplicationVersion() => _speckleApplication.HostApplicationVersion;
public Account[] GetAccounts() => AccountManager.GetAccounts().ToArray();
public Account[] GetAccounts() => _accountManager.GetAccounts().ToArray();
public DocumentInfo? GetDocumentInfo()
{
@@ -82,8 +95,10 @@ public class AutocadBasicConnectorBinding : IBasicConnectorBinding
var objectIds = Array.Empty<ObjectId>();
var model = _store.GetModelById(modelCardId);
if (model == null)
{
_logger.LogError("Model was null when highlighting received model");
return;
}
@@ -1,12 +1,15 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.Common.Cancellation;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Logging;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Connectors.DUI.Settings;
using Speckle.Converters.Autocad;
using Speckle.Converters.Common;
using Speckle.Sdk;
namespace Speckle.Connectors.Autocad.Bindings;
@@ -14,39 +17,52 @@ namespace Speckle.Connectors.Autocad.Bindings;
public sealed class AutocadReceiveBinding : IReceiveBinding
{
public string Name => "receiveBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
private readonly DocumentModelStore _store;
private readonly CancellationManager _cancellationManager;
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IServiceProvider _serviceProvider;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<AutocadReceiveBinding> _logger;
private readonly IAutocadConversionSettingsFactory _autocadConversionSettingsFactory;
private readonly ISpeckleApplication _speckleApplication;
private ReceiveBindingUICommands Commands { get; }
public AutocadReceiveBinding(
DocumentModelStore store,
IBridge parent,
IBrowserBridge parent,
CancellationManager cancellationManager,
IUnitOfWorkFactory unitOfWorkFactory,
IServiceProvider serviceProvider,
IOperationProgressManager operationProgressManager,
ILogger<AutocadReceiveBinding> logger
ILogger<AutocadReceiveBinding> logger,
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
ISpeckleApplication speckleApplication
)
{
_store = store;
_cancellationManager = cancellationManager;
_unitOfWorkFactory = unitOfWorkFactory;
_serviceProvider = serviceProvider;
_operationProgressManager = operationProgressManager;
_logger = logger;
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
_speckleApplication = speckleApplication;
Parent = parent;
Commands = new ReceiveBindingUICommands(parent);
}
#pragma warning disable CA1024
public List<ICardSetting> GetReceiveSettings() => [];
#pragma warning restore CA1024
public void CancelReceive(string modelCardId) => _cancellationManager.CancelOperation(modelCardId);
public async Task Receive(string modelCardId)
{
using var unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
using var scope = _serviceProvider.CreateScope();
scope
.ServiceProvider.GetRequiredService<IConverterSettingsStore<AutocadConversionSettings>>()
.Initialize(_autocadConversionSettingsFactory.Create(Application.DocumentManager.CurrentDocument));
try
{
// Get receiver card
@@ -64,9 +80,10 @@ public sealed class AutocadReceiveBinding : IReceiveBinding
Application.DocumentManager.DocumentActivationEnabled = false;
// Receive host objects
var operationResults = await unitOfWork
.Service.Execute(
modelCard.GetReceiveInfo(Speckle.Connectors.Utils.Connector.Slug),
var operationResults = await scope
.ServiceProvider.GetRequiredService<ReceiveOperation>()
.Execute(
modelCard.GetReceiveInfo(_speckleApplication.Slug),
cancellationToken,
(status, progress) =>
_operationProgressManager.SetModelProgress(
@@ -14,9 +14,9 @@ public class AutocadSelectionBinding : ISelectionBinding
public string Name => "selectionBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
public AutocadSelectionBinding(IBridge parent)
public AutocadSelectionBinding(IBrowserBridge parent)
{
_topLevelExceptionHandler = parent.TopLevelExceptionHandler;
Parent = parent;
@@ -1,10 +1,13 @@
using System.Collections.Concurrent;
using Autodesk.AutoCAD.DatabaseServices;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.Autocad.HostApp;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Connectors.Common.Caching;
using Speckle.Connectors.Common.Cancellation;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Exceptions;
@@ -13,9 +16,8 @@ using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
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;
@@ -26,17 +28,19 @@ public sealed class AutocadSendBinding : ISendBinding
public string Name => "sendBinding";
public SendBindingUICommands Commands { get; }
private OperationProgressManager OperationProgressManager { get; }
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
private readonly DocumentModelStore _store;
private readonly IAutocadIdleManager _idleManager;
private readonly List<ISendFilter> _sendFilters;
private readonly CancellationManager _cancellationManager;
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IServiceProvider _serviceProvider;
private readonly ISendConversionCache _sendConversionCache;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<AutocadSendBinding> _logger;
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
private readonly IAutocadConversionSettingsFactory _autocadConversionSettingsFactory;
private readonly ISpeckleApplication _speckleApplication;
/// <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:
@@ -49,23 +53,27 @@ public sealed class AutocadSendBinding : ISendBinding
public AutocadSendBinding(
DocumentModelStore store,
IAutocadIdleManager idleManager,
IBridge parent,
IBrowserBridge parent,
IEnumerable<ISendFilter> sendFilters,
CancellationManager cancellationManager,
IUnitOfWorkFactory unitOfWorkFactory,
IServiceProvider serviceProvider,
ISendConversionCache sendConversionCache,
IOperationProgressManager operationProgressManager,
ILogger<AutocadSendBinding> logger
ILogger<AutocadSendBinding> logger,
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
ISpeckleApplication speckleApplication
)
{
_store = store;
_idleManager = idleManager;
_unitOfWorkFactory = unitOfWorkFactory;
_serviceProvider = serviceProvider;
_cancellationManager = cancellationManager;
_sendFilters = sendFilters.ToList();
_sendConversionCache = sendConversionCache;
_operationProgressManager = operationProgressManager;
_logger = logger;
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
_speckleApplication = speckleApplication;
_topLevelExceptionHandler = parent.TopLevelExceptionHandler;
Parent = parent;
Commands = new SendBindingUICommands(parent);
@@ -153,7 +161,10 @@ public sealed class AutocadSendBinding : ISendBinding
throw new InvalidOperationException("No publish model card was found.");
}
using var uow = _unitOfWorkFactory.Resolve<SendOperation<AutocadRootObject>>();
using var scope = _serviceProvider.CreateScope();
scope
.ServiceProvider.GetRequiredService<IConverterSettingsStore<AutocadConversionSettings>>()
.Initialize(_autocadConversionSettingsFactory.Create(Application.DocumentManager.CurrentDocument));
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
@@ -173,10 +184,11 @@ 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 scope
.ServiceProvider.GetRequiredService<SendOperation<AutocadRootObject>>()
.Execute(
autocadObjects,
modelCard.GetSendInfo(Speckle.Connectors.Utils.Connector.Slug),
modelCard.GetSendInfo(_speckleApplication.Slug),
(status, progress) =>
_operationProgressManager.SetModelProgress(
Parent,
@@ -1,21 +1,17 @@
#if AUTOCAD
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.DUI.Bindings;
using Microsoft.Extensions.DependencyInjection;
namespace Speckle.Connectors.Autocad.DependencyInjection;
public class AutocadConnectorModule : ISpeckleModule
public static class AutocadConnectorModule
{
public void Load(SpeckleContainerBuilder builder)
public static void AddAutocad(this IServiceCollection serviceCollection)
{
SharedRegistration.Load(builder);
serviceCollection.AddAutocadBase();
// Operations
SharedRegistration.LoadSend(builder);
SharedRegistration.LoadReceive(builder);
// Register bindings
builder.AddSingleton<IBinding, ConfigBinding>("connectorName", "Autocad"); // POC: Easier like this for now, should be cleaned up later
serviceCollection.LoadSend();
serviceCollection.LoadReceive();
}
}
#endif
@@ -1,19 +1,14 @@
#if CIVIL3D
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.DUI.Bindings;
using Microsoft.Extensions.DependencyInjection;
namespace Speckle.Connectors.Autocad.DependencyInjection;
public class Civil3dConnectorModule : ISpeckleModule
public static class Civil3dConnectorModule
{
public void Load(SpeckleContainerBuilder builder)
public static void AddCivil3d(this IServiceCollection serviceCollection)
{
SharedRegistration.Load(builder);
SharedRegistration.LoadSend(builder);
// Register bindings
builder.AddSingleton<IBinding, ConfigBinding>("connectorName", "Civil3d"); // POC: Easier like this for now, should be cleaned up later
serviceCollection.AddAutocadBase();
serviceCollection.LoadSend();
}
}
#endif
@@ -1,101 +1,101 @@
using Autodesk.AutoCAD.DatabaseServices;
using Autofac;
using Speckle.Autofac;
using Speckle.Autofac.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Speckle.Connectors.Autocad.Bindings;
using Speckle.Connectors.Autocad.Filters;
using Speckle.Connectors.Autocad.HostApp;
using Speckle.Connectors.Autocad.Operations.Receive;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Connectors.Common;
using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Caching;
using Speckle.Connectors.Common.Instances;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
using Speckle.Connectors.DUI.WebView;
using Speckle.Connectors.Utils;
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;
public static class SharedRegistration
{
public static void Load(SpeckleContainerBuilder builder)
public static void AddAutocadBase(this IServiceCollection serviceCollection)
{
builder.AddAutofac();
builder.AddConnectorUtils();
builder.AddDUI();
builder.AddDUIView();
serviceCollection.AddConnectorUtils();
serviceCollection.AddDUI();
serviceCollection.AddDUIView();
// Register other connector specific types
builder.AddTransient<TransactionContext>();
builder.AddSingleton(new AutocadDocumentManager()); // TODO: Dependent to TransactionContext, can be moved to AutocadContext
builder.AddSingleton<DocumentModelStore, AutocadDocumentStore>();
builder.AddSingleton<AutocadContext>();
builder.AddScoped<AutocadGroupManager>();
builder.AddScoped<AutocadLayerManager>();
builder.AddScoped<AutocadColorManager>();
builder.AddScoped<AutocadMaterialManager>();
builder.AddSingleton<IAutocadIdleManager, AutocadIdleManager>();
builder.AddSingleton<IHostToSpeckleUnitConverter<UnitsValue>>();
serviceCollection.AddTransient<TransactionContext>();
serviceCollection.AddSingleton(new AutocadDocumentManager()); // TODO: Dependent to TransactionContext, can be moved to AutocadContext
serviceCollection.AddSingleton<DocumentModelStore, AutocadDocumentStore>();
serviceCollection.AddSingleton<AutocadContext>();
// Unpackers and builders
serviceCollection.AddScoped<AutocadLayerUnpacker>();
serviceCollection.AddScoped<AutocadLayerBaker>();
serviceCollection.AddScoped<AutocadInstanceUnpacker>();
serviceCollection.AddScoped<AutocadInstanceBaker>();
serviceCollection.AddScoped<AutocadGroupUnpacker>();
serviceCollection.AddScoped<AutocadGroupBaker>();
serviceCollection.AddScoped<AutocadColorUnpacker>();
serviceCollection.AddScoped<AutocadColorBaker>();
serviceCollection.AddScoped<AutocadMaterialUnpacker>();
serviceCollection.AddScoped<AutocadMaterialBaker>();
serviceCollection.AddSingleton<IAutocadIdleManager, AutocadIdleManager>();
// operation progress manager
builder.AddSingleton<IOperationProgressManager, OperationProgressManager>();
serviceCollection.AddSingleton<IOperationProgressManager, OperationProgressManager>();
// Register bindings
builder.AddSingleton<IBinding, TestBinding>();
builder.AddSingleton<IBinding, AccountBinding>();
builder.AddSingleton<IBinding, AutocadSelectionBinding>();
builder
.ContainerBuilder.RegisterType<AutocadBasicConnectorBinding>()
.As<IBinding>()
.As<IBasicConnectorBinding>()
.SingleInstance();
serviceCollection.AddSingleton<IBinding, TestBinding>();
serviceCollection.AddSingleton<IBinding, AccountBinding>();
serviceCollection.AddSingleton<IBinding, AutocadSelectionBinding>();
serviceCollection.AddSingleton<IBinding>(sp => sp.GetRequiredService<IBasicConnectorBinding>());
serviceCollection.AddSingleton<IBasicConnectorBinding, AutocadBasicConnectorBinding>();
serviceCollection.AddSingleton<IBinding, ConfigBinding>();
//Top Level ExceptionHandler
builder.ContainerBuilder.RegisterType<TopLevelExceptionHandlerBinding>().As<IBinding>().AsSelf().SingleInstance();
builder.AddSingleton<ITopLevelExceptionHandler>(c =>
c.Resolve<TopLevelExceptionHandlerBinding>().Parent.TopLevelExceptionHandler
);
serviceCollection.RegisterTopLevelExceptionHandler();
}
public static void LoadSend(SpeckleContainerBuilder builder)
public static void LoadSend(this IServiceCollection serviceCollection)
{
// Operations
builder.AddScoped<SendOperation<AutocadRootObject>>();
serviceCollection.AddScoped<SendOperation<AutocadRootObject>>();
// Object Builders
builder.AddScoped<IRootObjectBuilder<AutocadRootObject>, AutocadRootObjectBuilder>();
serviceCollection.AddScoped<IRootObjectBuilder<AutocadRootObject>, AutocadRootObjectBuilder>();
// Register bindings
builder.AddSingleton<IBinding, AutocadSendBinding>();
serviceCollection.AddSingleton<IBinding, AutocadSendBinding>();
// register send filters
builder.AddTransient<ISendFilter, AutocadSelectionFilter>();
serviceCollection.AddTransient<ISendFilter, AutocadSelectionFilter>();
// register send conversion cache
builder.AddSingleton<ISendConversionCache, SendConversionCache>();
builder.AddScoped<
serviceCollection.AddSingleton<ISendConversionCache, SendConversionCache>();
serviceCollection.AddScoped<
IInstanceObjectsManager<AutocadRootObject, List<Entity>>,
InstanceObjectsManager<AutocadRootObject, List<Entity>>
>();
builder.AddScoped<AutocadInstanceObjectManager>();
}
public static void LoadReceive(SpeckleContainerBuilder builder)
public static void LoadReceive(this IServiceCollection serviceCollection)
{
// traversal
builder.AddSingleton(DefaultTraversal.CreateTraversalFunc());
serviceCollection.AddSingleton(DefaultTraversal.CreateTraversalFunc());
// Object Builders
builder.AddScoped<IHostObjectBuilder, AutocadHostObjectBuilder>();
serviceCollection.AddScoped<IHostObjectBuilder, AutocadHostObjectBuilder>();
// Register bindings
builder.AddSingleton<IBinding, AutocadReceiveBinding>();
serviceCollection.AddSingleton<IBinding, AutocadReceiveBinding>();
}
}
@@ -0,0 +1,78 @@
using Autodesk.AutoCAD.Colors;
using Microsoft.Extensions.Logging;
using Speckle.Sdk;
using Speckle.Sdk.Models.Proxies;
using AutocadColor = Autodesk.AutoCAD.Colors.Color;
namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
/// </summary>
public class AutocadColorBaker
{
private readonly ILogger<AutocadColorBaker> _logger;
public AutocadColorBaker(ILogger<AutocadColorBaker> logger)
{
_logger = logger;
}
/// <summary>
/// For receive operations
/// </summary>
public Dictionary<string, AutocadColor> ObjectColorsIdMap { get; } = new();
/// <summary>
/// Parse Color Proxies and stores in ObjectColorIdMap the relationship between object ids and colors
/// </summary>
/// <param name="colorProxies"></param>
/// <param name="onOperationProgressed"></param>
public void ParseColors(List<ColorProxy> colorProxies, Action<string, double?>? onOperationProgressed)
{
var count = 0;
foreach (ColorProxy colorProxy in colorProxies)
{
try
{
onOperationProgressed?.Invoke("Converting colors", (double)++count / colorProxies.Count);
// skip any colors with source = layer, since object color default source is by layer
if (colorProxy["source"] is string source && source == "layer")
{
continue;
}
foreach (string objectId in colorProxy.objects)
{
AutocadColor convertedColor = ConvertColorProxyToColor(colorProxy);
#if NET8_0
ObjectColorsIdMap.TryAdd(objectId, convertedColor);
#else
if (!ObjectColorsIdMap.ContainsKey(objectId))
{
ObjectColorsIdMap.Add(objectId, convertedColor);
}
#endif
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed parsing color proxy");
}
}
}
private AutocadColor ConvertColorProxyToColor(ColorProxy colorProxy)
{
// if source = block, return a default ByBlock color
if (colorProxy["source"] is string source && source == "block")
{
return AutocadColor.FromColorIndex(ColorMethod.ByBlock, 0);
}
return colorProxy["autocadColorIndex"] is long index
? AutocadColor.FromColorIndex(ColorMethod.ByAci, (short)index)
: AutocadColor.FromColor(System.Drawing.Color.FromArgb(colorProxy.value));
}
}
@@ -1,7 +1,9 @@
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Sdk;
using Speckle.Sdk.Models.Proxies;
using AutocadColor = Autodesk.AutoCAD.Colors.Color;
@@ -10,21 +12,61 @@ namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
/// </summary>
public class AutocadColorManager
public class AutocadColorUnpacker
{
// POC: Will be addressed to move it into AutocadContext!
private Document Doc => Application.DocumentManager.MdiActiveDocument;
private readonly ILogger<AutocadColorUnpacker> _logger;
/// <summary>
/// For receive operations
/// </summary>
public Dictionary<string, AutocadColor> ObjectColorsIdMap { get; } = new();
public AutocadColorUnpacker(ILogger<AutocadColorUnpacker> logger)
{
_logger = logger;
}
/// <summary>
/// For send operations
/// </summary>
private Dictionary<string, ColorProxy> ColorProxies { get; } = new();
/// <summary>
/// Iterates through a given set of autocad objects and layers to collect colors.
/// </summary>
/// <param name="unpackedAutocadRootObjects">atomic root objects, including instance objects</param>
/// <param name="layers">layers used by atomic objects</param>
/// <returns></returns>
public List<ColorProxy> UnpackColors(
List<AutocadRootObject> unpackedAutocadRootObjects,
List<LayerTableRecord> layers
)
{
// Stage 1: unpack colors from objects
foreach (AutocadRootObject rootObj in unpackedAutocadRootObjects)
{
try
{
Entity entity = rootObj.Root;
ProcessObjectColor(rootObj.ApplicationId, entity.Color);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to unpack colors from Autocad Entity");
}
}
// Stage 2: make sure we collect layer colors as well
foreach (LayerTableRecord layer in layers)
{
try
{
ProcessObjectColor(layer.GetSpeckleApplicationId(), layer.Color);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to unpack colors from Autocad Layer");
}
}
return ColorProxies.Values.ToList();
}
/// <summary>
/// Processes an object's color and adds the object id to a color proxy in <see cref="ColorProxies"/> if object color is set ByAci, ByColor, or ByBlock.
/// Skips processing ByPen for now, because I don't understand what this means.
@@ -68,7 +110,14 @@ public class AutocadColorManager
string name = color.ColorNameForDisplay;
string id = color.GetSpeckleApplicationId();
ColorProxy colorProxy = new(argb, id, name) { objects = new() };
ColorProxy colorProxy =
new()
{
value = argb,
applicationId = id,
name = name,
objects = new()
};
// add the color source as well for receiving in other apps
// POC: in order to support full fidelity color support across autocad and rhino, we need to keep track of the color source property. Not sure if this is the best place to keep track of the source, vs on a ColorSourceProxy or as a property on the atomic object.
@@ -92,77 +141,4 @@ public class AutocadColorManager
return colorProxy;
}
/// <summary>
/// Iterates through a given set of autocad objects and layers to collect colors.
/// </summary>
/// <param name="unpackedAutocadRootObjects">atomic root objects, including instance objects</param>
/// <param name="layers">layers used by atomic objects</param>
/// <returns></returns>
public List<ColorProxy> UnpackColors(
List<AutocadRootObject> unpackedAutocadRootObjects,
List<LayerTableRecord> layers
)
{
// Stage 1: unpack colors from objects
foreach (AutocadRootObject rootObj in unpackedAutocadRootObjects)
{
Entity entity = rootObj.Root;
ProcessObjectColor(rootObj.ApplicationId, entity.Color);
}
// Stage 2: make sure we collect layer colors as well
foreach (LayerTableRecord layer in layers)
{
ProcessObjectColor(layer.GetSpeckleApplicationId(), layer.Color);
}
return ColorProxies.Values.ToList();
}
public AutocadColor ConvertColorProxyToColor(ColorProxy colorProxy)
{
// if source = block, return a default ByBlock color
if (colorProxy["source"] is string source && source == "block")
{
return AutocadColor.FromColorIndex(ColorMethod.ByBlock, 0);
}
return colorProxy["autocadColorIndex"] is long index
? AutocadColor.FromColorIndex(ColorMethod.ByAci, (short)index)
: AutocadColor.FromColor(System.Drawing.Color.FromArgb(colorProxy.value));
}
/// <summary>
/// Parse Color Proxies and stores in ObjectColorIdMap the relationship between object ids and colors
/// </summary>
/// <param name="colorProxies"></param>
/// <param name="onOperationProgressed"></param>
public void ParseColors(List<ColorProxy> colorProxies, Action<string, double?>? onOperationProgressed)
{
var count = 0;
foreach (ColorProxy colorProxy in colorProxies)
{
onOperationProgressed?.Invoke("Converting colors", (double)++count / colorProxies.Count);
// skip any colors with source = layer, since object color default source is by layer
if (colorProxy["source"] is string source && source == "layer")
{
continue;
}
foreach (string objectId in colorProxy.objects)
{
AutocadColor convertedColor = ConvertColorProxyToColor(colorProxy);
#if NET8_0
ObjectColorsIdMap.TryAdd(objectId, convertedColor);
#else
if (!ObjectColorsIdMap.ContainsKey(objectId))
{
ObjectColorsIdMap.Add(objectId, convertedColor);
}
#endif
}
}
}
}
@@ -1,63 +1,25 @@
using Autodesk.AutoCAD.DatabaseServices;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Connectors.Utils.Conversion;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Common.Conversion;
using Speckle.Sdk;
using Speckle.Sdk.Models.Proxies;
namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// This resource expects to be injected "fresh" in each send/receive operation (scoped lifetime). Extracts group information from a set of objects into proxies in send operations; also creates groups from a set of proxies in receive operations.
/// This resource expects to be injected "fresh" in each receive operation (scoped lifetime).
/// Extracts group information from a set of objects into proxies in send operations; also creates groups from a set of proxies in receive operations.
/// TODO: Oguzhan! Check whats happening on second receive unless purge groups? naming etc..
/// </summary>
public class AutocadGroupManager
public class AutocadGroupBaker
{
private readonly ILogger<AutocadGroupBaker> _logger;
private readonly AutocadContext _autocadContext;
public AutocadGroupManager(AutocadContext autocadContext)
public AutocadGroupBaker(AutocadContext autocadContext, ILogger<AutocadGroupBaker> logger)
{
_autocadContext = autocadContext;
}
/// <summary>
/// Unpacks a selection of atomic objects into their groups
/// </summary>
/// <param name="autocadObjects"></param>
/// <returns></returns>
public List<GroupProxy> UnpackGroups(IEnumerable<AutocadRootObject> autocadObjects)
{
var groupProxies = new Dictionary<string, GroupProxy>();
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
foreach (var (dbObject, applicationId) in autocadObjects)
{
var persistentReactorIds = dbObject.GetPersistentReactorIds();
foreach (ObjectId oReactorId in persistentReactorIds)
{
var obj = transaction.GetObject(oReactorId, OpenMode.ForRead);
if (obj is not Group group)
{
continue;
}
var groupAppId = group.GetSpeckleApplicationId();
if (groupProxies.TryGetValue(groupAppId, out GroupProxy? groupProxy))
{
groupProxy.objects.Add(applicationId);
}
else
{
groupProxies[groupAppId] = new()
{
applicationId = groupAppId,
name = group.Name,
objects = [applicationId]
};
}
}
}
return groupProxies.Values.ToList();
_logger = logger;
}
/// <summary>
@@ -66,6 +28,7 @@ public class AutocadGroupManager
/// <param name="groupProxies"></param>
/// <param name="applicationIdMap"></param>
/// <returns></returns>
// TODO: Oguzhan! Do not report here too! But this is TBD that we don't know the shape of the report yet.
public List<ReceiveConversionResult> CreateGroups(
IEnumerable<GroupProxy> groupProxies,
Dictionary<string, List<Entity>> applicationIdMap
@@ -103,9 +66,10 @@ public class AutocadGroupManager
groupCreationTransaction.AddNewlyCreatedDBObject(newGroup, true);
}
catch (Exception e) when (!e.IsFatal())
catch (Exception ex) when (!ex.IsFatal())
{
results.Add(new ReceiveConversionResult(Status.ERROR, gp, null, null, e));
results.Add(new ReceiveConversionResult(Status.ERROR, gp, null, null, ex));
_logger.LogError(ex, "Failed to bake Autocad Group");
}
}
@@ -0,0 +1,69 @@
using Autodesk.AutoCAD.DatabaseServices;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Sdk;
using Speckle.Sdk.Models.Proxies;
namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// This resource expects to be injected "fresh" in each send/receive operation (scoped lifetime). Extracts group information from a set of objects into proxies in send operations; also creates groups from a set of proxies in receive operations.
/// </summary>
public class AutocadGroupUnpacker
{
private readonly ILogger<AutocadGroupUnpacker> _logger;
public AutocadGroupUnpacker(ILogger<AutocadGroupUnpacker> logger)
{
_logger = logger;
}
/// <summary>
/// Unpacks a selection of atomic objects into their groups
/// </summary>
/// <param name="autocadObjects"></param>
/// <returns></returns>
public List<GroupProxy> UnpackGroups(IEnumerable<AutocadRootObject> autocadObjects)
{
var groupProxies = new Dictionary<string, GroupProxy>();
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
foreach (var (dbObject, applicationId) in autocadObjects)
{
try
{
var persistentReactorIds = dbObject.GetPersistentReactorIds();
foreach (ObjectId oReactorId in persistentReactorIds)
{
var obj = transaction.GetObject(oReactorId, OpenMode.ForRead);
if (obj is not Group group)
{
continue;
}
var groupAppId = group.GetSpeckleApplicationId();
if (groupProxies.TryGetValue(groupAppId, out GroupProxy? groupProxy))
{
groupProxy.objects.Add(applicationId);
}
else
{
groupProxies[groupAppId] = new()
{
applicationId = groupAppId,
name = group.Name,
objects = [applicationId]
};
}
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed on unpacking Autocad group");
}
}
return groupProxies.Values.ToList();
}
}
@@ -1,9 +1,10 @@
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Instances;
using Speckle.Connectors.Common.Conversion;
using Speckle.Connectors.Common.Instances;
using Speckle.Converters.Autocad;
using Speckle.Converters.Common;
using Speckle.DoubleNumerics;
using Speckle.Sdk;
@@ -16,151 +17,32 @@ using AutocadColor = Autodesk.AutoCAD.Colors.Color;
namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// Expects to be a scoped dependency per send or receive operation.
/// POC: Split later unpacker and baker.
/// Expects to be a scoped dependency receive operation.
/// </summary>
public class AutocadInstanceObjectManager : IInstanceUnpacker<AutocadRootObject>, IInstanceBaker<List<Entity>>
public class AutocadInstanceBaker : IInstanceBaker<List<Entity>>
{
private readonly AutocadLayerManager _autocadLayerManager;
private readonly AutocadColorManager _autocadColorManager;
private readonly AutocadMaterialManager _autocadMaterialManager;
private readonly IHostToSpeckleUnitConverter<UnitsValue> _unitsConverter;
private readonly AutocadLayerBaker _layerBaker;
private readonly AutocadColorBaker _colorBaker;
private readonly AutocadMaterialBaker _materialBaker;
private readonly AutocadContext _autocadContext;
private readonly ILogger<AutocadInstanceBaker> _logger;
private readonly IConverterSettingsStore<AutocadConversionSettings> _converterSettings;
private readonly IInstanceObjectsManager<AutocadRootObject, List<Entity>> _instanceObjectsManager;
public AutocadInstanceObjectManager(
AutocadLayerManager autocadLayerManager,
AutocadColorManager autocadColorManager,
AutocadMaterialManager autocadMaterialManager,
IHostToSpeckleUnitConverter<UnitsValue> unitsConverter,
public AutocadInstanceBaker(
AutocadLayerBaker layerBaker,
AutocadColorBaker colorBaker,
AutocadMaterialBaker materialBaker,
AutocadContext autocadContext,
IInstanceObjectsManager<AutocadRootObject, List<Entity>> instanceObjectsManager
ILogger<AutocadInstanceBaker> logger,
IConverterSettingsStore<AutocadConversionSettings> converterSettings
)
{
_autocadLayerManager = autocadLayerManager;
_autocadColorManager = autocadColorManager;
_autocadMaterialManager = autocadMaterialManager;
_unitsConverter = unitsConverter;
_layerBaker = layerBaker;
_colorBaker = colorBaker;
_materialBaker = materialBaker;
_autocadContext = autocadContext;
_instanceObjectsManager = instanceObjectsManager;
}
public UnpackResult<AutocadRootObject> UnpackSelection(IEnumerable<AutocadRootObject> objects)
{
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
foreach (var obj in objects)
{
// Note: isDynamicBlock always returns false for a selection of doc objects. Instances of dynamic blocks are represented in the document as blocks that have
// a definition reference to the anonymous block table record.
if (obj.Root is BlockReference blockReference && !blockReference.IsDynamicBlock)
{
UnpackInstance(blockReference, 0, transaction);
}
_instanceObjectsManager.AddAtomicObject(obj.ApplicationId, obj);
}
return _instanceObjectsManager.GetUnpackResult();
}
private void UnpackInstance(BlockReference instance, int depth, Transaction transaction)
{
string instanceId = instance.GetSpeckleApplicationId();
// If this instance has a reference to an anonymous block, it means it's spawned from a dynamic block. Anonymous blocks are
// used to represent specific "instances" of dynamic ones.
// We do not want to send the full dynamic block definition, but its current "instance", as such here we're making sure we
// take up the anon block table reference definition (if it exists). If it's not an instance of a dynamic block, we're
// using the normal def reference.
ObjectId definitionId = !instance.AnonymousBlockTableRecord.IsNull
? instance.AnonymousBlockTableRecord
: instance.BlockTableRecord;
InstanceProxy instanceProxy =
new()
{
applicationId = instanceId,
definitionId = definitionId.ToString(),
maxDepth = depth,
transform = GetMatrix(instance.BlockTransform.ToArray()),
units = _unitsConverter.ConvertOrThrow(Application.DocumentManager.CurrentDocument.Database.Insunits)
};
_instanceObjectsManager.AddInstanceProxy(instanceId, instanceProxy);
// For each block instance that has the same definition, we need to keep track of the "maximum depth" at which is found.
// This will enable on receive to create them in the correct order (descending by max depth, interleaved definitions and instances).
// We need to interleave the creation of definitions and instances, as some definitions may depend on instances.
if (
!_instanceObjectsManager.TryGetInstanceProxiesFromDefinitionId(
definitionId.ToString(),
out List<InstanceProxy> instanceProxiesWithSameDefinition
)
)
{
instanceProxiesWithSameDefinition = new List<InstanceProxy>();
_instanceObjectsManager.AddInstanceProxiesByDefinitionId(
definitionId.ToString(),
instanceProxiesWithSameDefinition
);
}
// We ensure that all previous instance proxies that have the same definition are at this max depth. I kind of have a feeling this can be done more elegantly, but YOLO
foreach (var instanceProxyWithSameDefinition in instanceProxiesWithSameDefinition)
{
if (instanceProxyWithSameDefinition.maxDepth < depth)
{
instanceProxyWithSameDefinition.maxDepth = depth;
}
}
instanceProxiesWithSameDefinition.Add(_instanceObjectsManager.GetInstanceProxy(instanceId));
if (
_instanceObjectsManager.TryGetInstanceDefinitionProxy(definitionId.ToString(), out InstanceDefinitionProxy value)
)
{
int depthDifference = depth - value.maxDepth;
if (depthDifference > 0)
{
// all MaxDepth of children definitions and its instances should be increased with difference of depth
_instanceObjectsManager.UpdateChildrenMaxDepth(value, depthDifference);
}
return;
}
var definition = (BlockTableRecord)transaction.GetObject(definitionId, OpenMode.ForRead);
var definitionProxy = new InstanceDefinitionProxy()
{
applicationId = definitionId.ToString(),
objects = new(),
maxDepth = depth,
name = !instance.AnonymousBlockTableRecord.IsNull ? "Dynamic instance " + definitionId : definition.Name,
["comments"] = definition.Comments
};
// Go through each definition object
foreach (ObjectId id in definition)
{
Entity obj = (Entity)transaction.GetObject(id, OpenMode.ForRead);
// In the case of dynamic blocks, this prevents sending objects that are not visibile in its current state.
if (!obj.Visible)
{
continue;
}
string appId = obj.GetSpeckleApplicationId();
definitionProxy.objects.Add(appId);
if (obj is BlockReference blockReference)
{
UnpackInstance(blockReference, depth + 1, transaction);
}
_instanceObjectsManager.AddAtomicObject(appId, new(obj, appId));
}
_instanceObjectsManager.AddDefinitionProxy(definitionId.ToString(), definitionProxy);
_logger = logger;
_converterSettings = converterSettings;
}
public BakeResult BakeInstances(
@@ -238,20 +120,14 @@ public class AutocadInstanceObjectManager : IInstanceUnpacker<AutocadRootObject>
);
// POC: collectionPath for instances should be an array of size 1, because we are flattening collections on traversal
string layerName = _autocadLayerManager.CreateLayerForReceive(collectionPath, baseLayerName);
string layerName = _layerBaker.CreateLayerForReceive(collectionPath, baseLayerName);
// get color and material if any
string instanceId = instanceProxy.applicationId ?? instanceProxy.id;
AutocadColor? objColor = _autocadColorManager.ObjectColorsIdMap.TryGetValue(
instanceId,
out AutocadColor? color
)
AutocadColor? objColor = _colorBaker.ObjectColorsIdMap.TryGetValue(instanceId, out AutocadColor? color)
? color
: null;
ObjectId objMaterial = _autocadMaterialManager.ObjectMaterialsIdMap.TryGetValue(
instanceId,
out ObjectId matId
)
ObjectId objMaterial = _materialBaker.ObjectMaterialsIdMap.TryGetValue(instanceId, out ObjectId matId)
? matId
: ObjectId.Null;
@@ -280,6 +156,7 @@ public class AutocadInstanceObjectManager : IInstanceUnpacker<AutocadRootObject>
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to create an instance from proxy");
conversionResults.Add(new(Status.ERROR, instanceOrDefinition as Base ?? new Base(), null, null, ex));
}
}
@@ -346,34 +223,9 @@ public class AutocadInstanceObjectManager : IInstanceUnpacker<AutocadRootObject>
transaction.Commit();
}
private Matrix4x4 GetMatrix(double[] t)
{
return new Matrix4x4(
t[0],
t[1],
t[2],
t[3],
t[4],
t[5],
t[6],
t[7],
t[8],
t[9],
t[10],
t[11],
t[12],
t[13],
t[14],
t[15]
);
}
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[]
{
@@ -405,7 +257,7 @@ public class AutocadInstanceObjectManager : IInstanceUnpacker<AutocadRootObject>
}
// https://forums.autodesk.com/t5/net/set-blocktransform-values/m-p/6452121#M49479
private static double[] MakePerpendicular(Matrix3d matrix)
private double[] MakePerpendicular(Matrix3d matrix)
{
// Get the basis vectors of the matrix
Vector3d right = new(matrix[0, 0], matrix[1, 0], matrix[2, 0]);
@@ -414,8 +266,8 @@ public class AutocadInstanceObjectManager : IInstanceUnpacker<AutocadRootObject>
Vector3d newForward = right.CrossProduct(up).GetNormal();
Vector3d newUp = newForward.CrossProduct(right).GetNormal();
return new[]
{
return
[
right.X,
newUp.X,
newForward.X,
@@ -431,7 +283,7 @@ public class AutocadInstanceObjectManager : IInstanceUnpacker<AutocadRootObject>
0.0,
0.0,
0.0,
matrix[3, 3],
};
matrix[3, 3]
];
}
}
@@ -0,0 +1,161 @@
using Autodesk.AutoCAD.DatabaseServices;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Connectors.Common.Instances;
using Speckle.Converters.Common;
using Speckle.DoubleNumerics;
using Speckle.Sdk;
using Speckle.Sdk.Models.Instances;
namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// Expects to be a scoped dependency per send operation.
/// </summary>
public class AutocadInstanceUnpacker : IInstanceUnpacker<AutocadRootObject>
{
private readonly IHostToSpeckleUnitConverter<UnitsValue> _unitsConverter;
private readonly IInstanceObjectsManager<AutocadRootObject, List<Entity>> _instanceObjectsManager;
private readonly ILogger<AutocadInstanceUnpacker> _logger;
public AutocadInstanceUnpacker(
IHostToSpeckleUnitConverter<UnitsValue> unitsConverter,
IInstanceObjectsManager<AutocadRootObject, List<Entity>> instanceObjectsManager,
ILogger<AutocadInstanceUnpacker> logger
)
{
_unitsConverter = unitsConverter;
_instanceObjectsManager = instanceObjectsManager;
_logger = logger;
}
public UnpackResult<AutocadRootObject> UnpackSelection(IEnumerable<AutocadRootObject> objects)
{
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
foreach (var obj in objects)
{
// Note: isDynamicBlock always returns false for a selection of doc objects. Instances of dynamic blocks are represented in the document as blocks that have
// a definition reference to the anonymous block table record.
if (obj.Root is BlockReference blockReference && !blockReference.IsDynamicBlock)
{
UnpackInstance(blockReference, 0, transaction);
}
_instanceObjectsManager.AddAtomicObject(obj.ApplicationId, obj);
}
return _instanceObjectsManager.GetUnpackResult();
}
private void UnpackInstance(BlockReference instance, int depth, Transaction transaction)
{
try
{
string instanceId = instance.GetSpeckleApplicationId();
// If this instance has a reference to an anonymous block, it means it's spawned from a dynamic block. Anonymous blocks are
// used to represent specific "instances" of dynamic ones.
// We do not want to send the full dynamic block definition, but its current "instance", as such here we're making sure we
// take up the anon block table reference definition (if it exists). If it's not an instance of a dynamic block, we're
// using the normal def reference.
ObjectId definitionId = !instance.AnonymousBlockTableRecord.IsNull
? instance.AnonymousBlockTableRecord
: instance.BlockTableRecord;
InstanceProxy instanceProxy =
new()
{
applicationId = instanceId,
definitionId = definitionId.ToString(),
maxDepth = depth,
transform = GetMatrix(instance.BlockTransform.ToArray()),
units = _unitsConverter.ConvertOrThrow(Application.DocumentManager.CurrentDocument.Database.Insunits)
};
_instanceObjectsManager.AddInstanceProxy(instanceId, instanceProxy);
// For each block instance that has the same definition, we need to keep track of the "maximum depth" at which is found.
// This will enable on receive to create them in the correct order (descending by max depth, interleaved definitions and instances).
// We need to interleave the creation of definitions and instances, as some definitions may depend on instances.
if (
!_instanceObjectsManager.TryGetInstanceProxiesFromDefinitionId(
definitionId.ToString(),
out List<InstanceProxy>? instanceProxiesWithSameDefinition
)
)
{
instanceProxiesWithSameDefinition = new List<InstanceProxy>();
_instanceObjectsManager.AddInstanceProxiesByDefinitionId(
definitionId.ToString(),
instanceProxiesWithSameDefinition
);
}
// We ensure that all previous instance proxies that have the same definition are at this max depth. I kind of have a feeling this can be done more elegantly, but YOLO
foreach (var instanceProxyWithSameDefinition in instanceProxiesWithSameDefinition)
{
if (instanceProxyWithSameDefinition.maxDepth < depth)
{
instanceProxyWithSameDefinition.maxDepth = depth;
}
}
instanceProxiesWithSameDefinition.Add(_instanceObjectsManager.GetInstanceProxy(instanceId));
if (
_instanceObjectsManager.TryGetInstanceDefinitionProxy(
definitionId.ToString(),
out InstanceDefinitionProxy? value
)
)
{
int depthDifference = depth - value.maxDepth;
if (depthDifference > 0)
{
// all MaxDepth of children definitions and its instances should be increased with difference of depth
_instanceObjectsManager.UpdateChildrenMaxDepth(value, depthDifference);
}
return;
}
var definition = (BlockTableRecord)transaction.GetObject(definitionId, OpenMode.ForRead);
var definitionProxy = new InstanceDefinitionProxy()
{
applicationId = definitionId.ToString(),
objects = new(),
maxDepth = depth,
name = !instance.AnonymousBlockTableRecord.IsNull ? "Dynamic instance " + definitionId : definition.Name
};
// Go through each definition object
foreach (ObjectId id in definition)
{
Entity obj = (Entity)transaction.GetObject(id, OpenMode.ForRead);
// In the case of dynamic blocks, this prevents sending objects that are not visibile in its current state.
if (!obj.Visible)
{
continue;
}
string appId = obj.GetSpeckleApplicationId();
definitionProxy.objects.Add(appId);
if (obj is BlockReference blockReference)
{
UnpackInstance(blockReference, depth + 1, transaction);
}
_instanceObjectsManager.AddAtomicObject(appId, new(obj, appId));
}
_instanceObjectsManager.AddDefinitionProxy(definitionId.ToString(), definitionProxy);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed unpacking Autocad instance");
}
}
private Matrix4x4 GetMatrix(double[] t) =>
new(t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9], t[10], t[11], t[12], t[13], t[14], t[15]);
}
@@ -1,59 +1,30 @@
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.LayerManager;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Converters.Common;
using Speckle.Connectors.Common.Operations.Receive;
using Speckle.Sdk.Models.Collections;
using Speckle.Sdk.Models.GraphTraversal;
using AutocadColor = Autodesk.AutoCAD.Colors.Color;
namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
/// </summary>
public class AutocadLayerManager
public class AutocadLayerBaker : TraversalContextUnpacker
{
private readonly AutocadContext _autocadContext;
private readonly AutocadMaterialManager _materialManager;
private readonly AutocadColorManager _colorManager;
private readonly string _layerFilterName = "Speckle";
public Dictionary<string, Layer> CollectionCache { get; } = new();
// POC: Will be addressed to move it into AutocadContext!
private readonly AutocadContext _autocadContext;
private readonly AutocadMaterialBaker _materialBaker;
private readonly AutocadColorBaker _colorBaker;
private Document Doc => Application.DocumentManager.MdiActiveDocument;
private readonly HashSet<string> _uniqueLayerNames = new();
public AutocadLayerManager(
public AutocadLayerBaker(
AutocadContext autocadContext,
AutocadMaterialManager materialManager,
AutocadColorManager colorManager
AutocadMaterialBaker materialBaker,
AutocadColorBaker colorBaker
)
{
_autocadContext = autocadContext;
_materialManager = materialManager;
_colorManager = colorManager;
}
public Layer GetOrCreateSpeckleLayer(Entity entity, Transaction tr, out LayerTableRecord? layer)
{
string layerName = entity.Layer;
layer = null;
if (CollectionCache.TryGetValue(layerName, out Layer? speckleLayer))
{
return speckleLayer;
}
if (tr.GetObject(entity.LayerId, OpenMode.ForRead) is LayerTableRecord autocadLayer)
{
// Layers and geometries can have same application ids.....
// We should prevent it for sketchup converter. Because when it happens "objects_to_bake" definition
// is changing on the way if it happens.
speckleLayer = new Layer(layerName) { applicationId = autocadLayer.GetSpeckleApplicationId() }; // Do not use handle directly, see note in the 'GetSpeckleApplicationId' method
CollectionCache[layerName] = speckleLayer;
layer = autocadLayer;
return speckleLayer;
}
throw new SpeckleConversionException("Unexpected condition in GetOrCreateSpeckleLayer");
_materialBaker = materialBaker;
_colorBaker = colorBaker;
}
/// <summary>
@@ -73,7 +44,7 @@ public class AutocadLayerManager
// get the color and material if any, of the leaf collection with a color
AutocadColor? layerColor = null;
ObjectId layerMaterial = ObjectId.Null;
if (_colorManager.ObjectColorsIdMap.Count > 0 || _materialManager.ObjectMaterialsIdMap.Count > 0)
if (_colorBaker.ObjectColorsIdMap.Count > 0 || _materialBaker.ObjectMaterialsIdMap.Count > 0)
{
bool foundColor = false;
bool foundMaterial = false;
@@ -85,12 +56,12 @@ public class AutocadLayerManager
if (!foundColor)
{
foundColor = _colorManager.ObjectColorsIdMap.TryGetValue(layerId, out layerColor);
foundColor = _colorBaker.ObjectColorsIdMap.TryGetValue(layerId, out layerColor);
}
if (!foundMaterial)
{
foundMaterial = _materialManager.ObjectMaterialsIdMap.TryGetValue(layerId, out layerMaterial);
foundMaterial = _materialBaker.ObjectMaterialsIdMap.TryGetValue(layerId, out layerMaterial);
}
if (foundColor && foundMaterial)
@@ -227,22 +198,4 @@ public class AutocadLayerManager
groupFilter.NestedFilters.Add(layerFilter);
Doc.Database.LayerFilters = layerFilterTree;
}
/// <summary>
/// Gets a valid collection representing a layer for a given context.
/// </summary>
/// <param name="context"></param>
/// <returns>A new Speckle Layer object</returns>
public Collection[] GetLayerPath(TraversalContext context)
{
Collection[] collectionBasedPath = context.GetAscendantOfType<Collection>().Reverse().ToArray();
if (collectionBasedPath.Length == 0)
{
string[] path = context.GetPropertyPath().Reverse().ToArray();
collectionBasedPath = [new Collection(string.Join("-", path))];
}
return collectionBasedPath;
}
}
@@ -0,0 +1,32 @@
using Autodesk.AutoCAD.DatabaseServices;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Converters.Common;
using Speckle.Sdk.Models.Collections;
namespace Speckle.Connectors.Autocad.HostApp;
public class AutocadLayerUnpacker
{
private readonly Dictionary<string, Layer> _layerCollectionCache = new();
public Layer GetOrCreateSpeckleLayer(Entity entity, Transaction tr, out LayerTableRecord? layer)
{
string layerName = entity.Layer;
layer = null;
if (_layerCollectionCache.TryGetValue(layerName, out Layer? speckleLayer))
{
return speckleLayer;
}
if (tr.GetObject(entity.LayerId, OpenMode.ForRead) is LayerTableRecord autocadLayer)
{
// Layers and geometries can have same application ids.....
// We should prevent it for sketchup converter. Because when it happens "objects_to_bake" definition
// is changing on the way if it happens.
speckleLayer = new Layer(layerName) { applicationId = autocadLayer.GetSpeckleApplicationId() }; // Do not use handle directly, see note in the 'GetSpeckleApplicationId' method
_layerCollectionCache[layerName] = speckleLayer;
layer = autocadLayer;
return speckleLayer;
}
throw new SpeckleConversionException("Unexpected condition in GetOrCreateSpeckleLayer");
}
}
@@ -1,11 +1,11 @@
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.GraphicsInterface;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Connectors.Utils.Conversion;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Common.Conversion;
using Speckle.Objects.Other;
using Speckle.Sdk;
using Speckle.Sdk.Models;
using Material = Autodesk.AutoCAD.DatabaseServices.Material;
using RenderMaterial = Speckle.Objects.Other.RenderMaterial;
@@ -14,104 +14,131 @@ namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
/// </summary>
public class AutocadMaterialManager
public class AutocadMaterialBaker
{
private readonly ILogger<AutocadMaterialBaker> _logger;
private readonly AutocadContext _autocadContext;
// POC: Will be addressed to move it into AutocadContext!
private Document Doc => Application.DocumentManager.MdiActiveDocument;
public Dictionary<string, ObjectId> ObjectMaterialsIdMap { get; } = new();
public AutocadMaterialManager(AutocadContext autocadContext)
public AutocadMaterialBaker(AutocadContext autocadContext, ILogger<AutocadMaterialBaker> logger)
{
_autocadContext = autocadContext;
}
private RenderMaterialProxy ConvertMaterialToRenderMaterialProxy(Material material, string id)
{
EntityColor diffuseColor = material.Diffuse.Color.Color;
System.Drawing.Color diffuse = System.Drawing.Color.FromArgb(
diffuseColor.Red,
diffuseColor.Green,
diffuseColor.Blue
);
string name = material.Name;
double opacity = material.Opacity.Percentage;
RenderMaterial renderMaterial = new(opacity: opacity, diffuse: diffuse) { name = name, applicationId = id };
// Add additional properties
renderMaterial["ior"] = material.Refraction.Index;
renderMaterial["reflectivity"] = material.Reflectivity;
return new(renderMaterial, new()) { applicationId = id };
_logger = logger;
}
/// <summary>
/// Iterates through a given set of autocad objects and collects their materials. Note: expects objects to be "atomic", and extracted out of their instances already.
/// Try to get material id from original object or its parent (if provided) as fallback).
/// It covers one-to-many problem, i.e.
/// - rhino: Brep (material id is extracted into render material proxy objects) -> [Mesh, Mesh, ...] (child objects application ids ARE NOT EXIST in render material proxy objects)
/// - revit : RevitElement (material IS NOT extracted into render material proxy objects) -> [Mesh, Mesh...] (child objects application ids EXIST in render material proxy objects)
/// </summary>
/// <param name="unpackedAutocadObjects"></param>
/// <param name="layers"></param>
/// <returns></returns>
public List<RenderMaterialProxy> UnpackMaterials(
List<AutocadRootObject> unpackedAutocadObjects,
List<LayerTableRecord> layers
/// <remarks>
/// This is a question that we need to answer where to handle these cases.
/// We alsa do reverse search for layer render materials on Revit Receive, and mutating the proxy list accordingly.
/// These cases are increasing, and need some ideation around it before going more messy.
/// </remarks>
public bool TryGetMaterialId(Base originalObject, Base? parentObject, out ObjectId materialId)
{
materialId = ObjectId.Null;
var originalObjectId = originalObject.applicationId ?? originalObject.id;
if (ObjectMaterialsIdMap.TryGetValue(originalObjectId, out ObjectId originalObjectMaterialId))
{
materialId = originalObjectMaterialId;
return true;
}
if (parentObject is null)
{
return false;
}
var subObjectId = parentObject.applicationId ?? parentObject.id;
if (ObjectMaterialsIdMap.TryGetValue(subObjectId, out ObjectId subObjectMaterialId))
{
materialId = subObjectMaterialId;
return true;
}
return false;
}
/// <summary>
/// Removes all materials with a name starting with <paramref name="namePrefix"/> from the active document
/// </summary>
/// <param name="namePrefix"></param>
public void PurgeMaterials(string namePrefix)
{
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
if (transaction.GetObject(Doc.Database.MaterialDictionaryId, OpenMode.ForWrite) is DBDictionary materialDict)
{
foreach (var entry in materialDict)
{
try
{
if (entry.Key.Contains(namePrefix))
{
materialDict.Remove(entry.Value);
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to purge a material from the document");
}
}
}
transaction.Commit();
}
public void ParseAndBakeRenderMaterials(
List<RenderMaterialProxy> materialProxies,
string baseLayerPrefix,
Action<string, double?>? onOperationProgressed
)
{
Dictionary<string, RenderMaterialProxy> materialProxies = new();
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
var materialDict = transaction.GetObject(Doc.Database.MaterialDictionaryId, OpenMode.ForWrite) as DBDictionary;
// Stage 1: unpack materials from objects
foreach (AutocadRootObject rootObj in unpackedAutocadObjects)
if (materialDict == null)
{
Entity entity = rootObj.Root;
// POC: we should report failed conversion here if material dict is not accessible, but it is not linked to a Base source
transaction.Commit();
return;
}
// skip inherited materials
if (entity.Material == "ByLayer" || entity.Material == "ByBlock")
var count = 0;
foreach (RenderMaterialProxy materialProxy in materialProxies)
{
onOperationProgressed?.Invoke("Converting render materials", (double)++count / materialProxies.Count);
// bake render material
RenderMaterial renderMaterial = materialProxy.value;
string renderMaterialId = renderMaterial.applicationId ?? renderMaterial.id;
ObjectId materialId = ObjectId.Null;
if (!ObjectMaterialsIdMap.TryGetValue(renderMaterialId, out materialId))
{
(materialId, ReceiveConversionResult result) = BakeMaterial(
renderMaterial,
baseLayerPrefix,
materialDict,
transaction
);
}
if (materialId == ObjectId.Null)
{
continue;
}
if (transaction.GetObject(entity.MaterialId, OpenMode.ForRead) is Material material)
// parse render material object ids
foreach (string objectId in materialProxy.objects)
{
string materialId = material.GetSpeckleApplicationId();
if (materialProxies.TryGetValue(materialId, out RenderMaterialProxy? value))
{
value.objects.Add(rootObj.ApplicationId);
}
else
{
RenderMaterialProxy materialProxy = ConvertMaterialToRenderMaterialProxy(material, materialId);
materialProxy.objects.Add(rootObj.ApplicationId);
materialProxies[materialId] = materialProxy;
}
}
}
// Stage 2: make sure we collect layer colors as well
foreach (LayerTableRecord layer in layers)
{
if (transaction.GetObject(layer.MaterialId, OpenMode.ForRead) is Material material)
{
string materialId = material.GetSpeckleApplicationId();
string layerId = layer.GetSpeckleApplicationId(); // Do not use handle directly, see note in the 'GetSpeckleApplicationId' method
if (materialProxies.TryGetValue(materialId, out RenderMaterialProxy? value))
{
value.objects.Add(layerId);
}
else
{
RenderMaterialProxy materialProxy = ConvertMaterialToRenderMaterialProxy(material, materialId);
materialProxy.objects.Add(layerId);
materialProxies[materialId] = materialProxy;
}
ObjectMaterialsIdMap[objectId] = materialId;
}
}
transaction.Commit();
return materialProxies.Values.ToList();
}
private (ObjectId, ReceiveConversionResult) BakeMaterial(
@@ -165,103 +192,8 @@ public class AutocadMaterialManager
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to add a material to the document");
return (materialId, new(Status.ERROR, renderMaterial, null, null, ex));
}
}
/// <summary>
/// Removes all materials with a name starting with <paramref name="namePrefix"/> from the active document
/// </summary>
/// <param name="namePrefix"></param>
public void PurgeMaterials(string namePrefix)
{
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
if (transaction.GetObject(Doc.Database.MaterialDictionaryId, OpenMode.ForWrite) is DBDictionary materialDict)
{
foreach (var entry in materialDict)
{
if (entry.Key.Contains(namePrefix))
{
materialDict.Remove(entry.Value);
}
}
}
transaction.Commit();
}
public List<ReceiveConversionResult> ParseAndBakeRenderMaterials(
List<RenderMaterialProxy> materialProxies,
string baseLayerPrefix,
Action<string, double?>? onOperationProgressed
)
{
List<ReceiveConversionResult> results = new();
Dictionary<string, string> objectRenderMaterialsIdMap = new();
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
var materialDict = transaction.GetObject(Doc.Database.MaterialDictionaryId, OpenMode.ForWrite) as DBDictionary;
if (materialDict == null)
{
// POC: we should report failed conversion here if material dict is not accessible, but it is not linked to a Base source
transaction.Commit();
return results;
}
var count = 0;
foreach (RenderMaterialProxy materialProxy in materialProxies)
{
onOperationProgressed?.Invoke("Converting render materials", (double)++count / materialProxies.Count);
// bake render material
RenderMaterial renderMaterial = materialProxy.value;
string renderMaterialId = renderMaterial.applicationId ?? renderMaterial.id;
ObjectId materialId = ObjectId.Null;
if (!ObjectMaterialsIdMap.TryGetValue(renderMaterialId, out materialId))
{
(materialId, ReceiveConversionResult result) = BakeMaterial(
renderMaterial,
baseLayerPrefix,
materialDict,
transaction
);
results.Add(result);
}
else
{
// POC: this shouldn't happen, but will if there are render materials with the same applicationID
results.Add(
new(
Status.ERROR,
renderMaterial,
exception: new ArgumentException("Another render material of the same id has already been created.")
)
);
}
if (materialId == ObjectId.Null)
{
results.Add(
new(
Status.ERROR,
renderMaterial,
exception: new InvalidOperationException("Render material failed to be added to document.")
)
);
continue;
}
// parse render material object ids
foreach (string objectId in materialProxy.objects)
{
ObjectMaterialsIdMap[objectId] = materialId;
}
}
transaction.Commit();
return results;
}
}
@@ -0,0 +1,129 @@
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Autocad.Operations.Send;
using Speckle.Objects.Other;
using Speckle.Sdk;
using Material = Autodesk.AutoCAD.DatabaseServices.Material;
using RenderMaterial = Speckle.Objects.Other.RenderMaterial;
namespace Speckle.Connectors.Autocad.HostApp;
/// <summary>
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
/// </summary>
public class AutocadMaterialUnpacker
{
private readonly ILogger<AutocadMaterialUnpacker> _logger;
public AutocadMaterialUnpacker(ILogger<AutocadMaterialUnpacker> logger)
{
_logger = logger;
}
/// <summary>
/// Iterates through a given set of autocad objects and collects their materials. Note: expects objects to be "atomic", and extracted out of their instances already.
/// </summary>
/// <param name="unpackedAutocadObjects"></param>
/// <param name="layers"></param>
/// <returns></returns>
public List<RenderMaterialProxy> UnpackMaterials(
List<AutocadRootObject> unpackedAutocadObjects,
List<LayerTableRecord> layers
)
{
Dictionary<string, RenderMaterialProxy> materialProxies = new();
using var transaction = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
// Stage 1: unpack materials from objects
foreach (AutocadRootObject rootObj in unpackedAutocadObjects)
{
try
{
Entity entity = rootObj.Root;
// skip inherited materials
if (entity.Material == "ByLayer" || entity.Material == "ByBlock")
{
continue;
}
if (transaction.GetObject(entity.MaterialId, OpenMode.ForRead) is Material material)
{
string materialId = material.GetSpeckleApplicationId();
if (materialProxies.TryGetValue(materialId, out RenderMaterialProxy? value))
{
value.objects.Add(rootObj.ApplicationId);
}
else
{
RenderMaterialProxy materialProxy = ConvertMaterialToRenderMaterialProxy(material, materialId);
materialProxy.objects.Add(rootObj.ApplicationId);
materialProxies[materialId] = materialProxy;
}
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to unpack render material from Autocad Entity");
}
}
// Stage 2: make sure we collect layer colors as well
foreach (LayerTableRecord layer in layers)
{
try
{
if (transaction.GetObject(layer.MaterialId, OpenMode.ForRead) is Material material)
{
string materialId = material.GetSpeckleApplicationId();
string layerId = layer.GetSpeckleApplicationId(); // Do not use handle directly, see note in the 'GetSpeckleApplicationId' method
if (materialProxies.TryGetValue(materialId, out RenderMaterialProxy? value))
{
value.objects.Add(layerId);
}
else
{
RenderMaterialProxy materialProxy = ConvertMaterialToRenderMaterialProxy(material, materialId);
materialProxy.objects.Add(layerId);
materialProxies[materialId] = materialProxy;
}
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to unpack render material from Autocad Layer");
}
}
transaction.Commit();
return materialProxies.Values.ToList();
}
private RenderMaterialProxy ConvertMaterialToRenderMaterialProxy(Material material, string id)
{
EntityColor diffuseColor = material.Diffuse.Color.Color;
System.Drawing.Color diffuse = System.Drawing.Color.FromArgb(
diffuseColor.Red,
diffuseColor.Green,
diffuseColor.Blue
);
string name = material.Name;
double opacity = material.Opacity.Percentage;
RenderMaterial renderMaterial = new(opacity: opacity, diffuse: diffuse) { name = name, applicationId = id };
// Add additional properties
renderMaterial["ior"] = material.Refraction.Index;
renderMaterial["reflectivity"] = material.Reflectivity;
return new RenderMaterialProxy()
{
value = renderMaterial,
objects = new(),
applicationId = id
};
}
}
@@ -1,17 +1,15 @@
using Autodesk.AutoCAD.DatabaseServices;
using Speckle.Connectors.Autocad.HostApp;
using Speckle.Connectors.Autocad.HostApp.Extensions;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Operations;
using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Conversion;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.Common.Operations.Receive;
using Speckle.Converters.Common;
using Speckle.Objects.Other;
using Speckle.Sdk;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Collections;
using Speckle.Sdk.Models.GraphTraversal;
using Speckle.Sdk.Models.Instances;
using Speckle.Sdk.Models.Proxies;
using AutocadColor = Autodesk.AutoCAD.Colors.Color;
namespace Speckle.Connectors.Autocad.Operations.Receive;
@@ -21,37 +19,37 @@ namespace Speckle.Connectors.Autocad.Operations.Receive;
/// </summary>
public class AutocadHostObjectBuilder : IHostObjectBuilder
{
private readonly AutocadLayerManager _autocadLayerManager;
private readonly AutocadLayerBaker _layerBaker;
private readonly IRootToHostConverter _converter;
private readonly GraphTraversal _traversalFunction;
private readonly ISyncToThread _syncToThread;
private readonly AutocadGroupManager _groupManager;
private readonly AutocadMaterialManager _materialManager;
private readonly AutocadColorManager _colorManager;
private readonly AutocadInstanceObjectManager _instanceObjectsManager;
private readonly AutocadGroupBaker _groupBaker;
private readonly AutocadMaterialBaker _materialBaker;
private readonly AutocadColorBaker _colorBaker;
private readonly AutocadInstanceBaker _instanceBaker;
private readonly AutocadContext _autocadContext;
private readonly RootObjectUnpacker _rootObjectUnpacker;
public AutocadHostObjectBuilder(
IRootToHostConverter converter,
GraphTraversal traversalFunction,
AutocadLayerManager autocadLayerManager,
AutocadGroupManager groupManager,
AutocadInstanceObjectManager instanceObjectsManager,
AutocadMaterialManager materialManager,
AutocadColorManager colorManager,
AutocadLayerBaker layerBaker,
AutocadGroupBaker groupBaker,
AutocadInstanceBaker instanceBaker,
AutocadMaterialBaker materialBaker,
AutocadColorBaker colorBaker,
ISyncToThread syncToThread,
AutocadContext autocadContext
AutocadContext autocadContext,
RootObjectUnpacker rootObjectUnpacker
)
{
_converter = converter;
_traversalFunction = traversalFunction;
_autocadLayerManager = autocadLayerManager;
_groupManager = groupManager;
_instanceObjectsManager = instanceObjectsManager;
_materialManager = materialManager;
_colorManager = colorManager;
_layerBaker = layerBaker;
_groupBaker = groupBaker;
_instanceBaker = instanceBaker;
_materialBaker = materialBaker;
_colorBaker = colorBaker;
_syncToThread = syncToThread;
_autocadContext = autocadContext;
_rootObjectUnpacker = rootObjectUnpacker;
}
public Task<HostObjectBuilderResult> Build(
@@ -60,89 +58,61 @@ public class AutocadHostObjectBuilder : IHostObjectBuilder
string modelName,
Action<string, double?>? onOperationProgressed,
CancellationToken _
)
{
return _syncToThread.RunOnThread(() =>
) =>
// NOTE: This is the only place we apply ISyncToThread across connectors. We need to sync up with main thread here
// after GetObject and Deserialization. It is anti-pattern now. Happiness level 3/10 but works.
_syncToThread.RunOnThread(() =>
{
// Prompt the UI conversion started. Progress bar will swoosh.
onOperationProgressed?.Invoke("Converting", null);
// Layer filter for received commit with project and model name
_autocadLayerManager.CreateLayerFilter(projectName, modelName);
_layerBaker.CreateLayerFilter(projectName, modelName);
// 0 - Clean then Rock n Roll!
string baseLayerPrefix = _autocadContext.RemoveInvalidChars($"SPK-{projectName}-{modelName}-");
PreReceiveDeepClean(baseLayerPrefix);
List<ReceiveConversionResult> results = new();
List<string> bakedObjectIds = new();
// 1 - Unpack objects and proxies from root commit object
var unpackedRoot = _rootObjectUnpacker.Unpack(rootObject);
var objectGraph = _traversalFunction.Traverse(rootObject).Where(obj => obj.Current is not Collection);
// 2 - Split atomic objects and instance components with their path
var (atomicObjects, instanceComponents) = _rootObjectUnpacker.SplitAtomicObjectsAndInstances(
unpackedRoot.ObjectsToConvert
);
var atomicObjectsWithPath = _layerBaker.GetAtomicObjectsWithPath(atomicObjects);
var instanceComponentsWithPath = _layerBaker.GetInstanceComponentsWithPath(instanceComponents);
// POC: these are not captured by traversal, so we need to re-add them here
var instanceDefinitionProxies = (rootObject["instanceDefinitionProxies"] as List<object>)
?.Cast<InstanceDefinitionProxy>()
.ToList();
var instanceComponents = new List<(Collection[] path, IInstanceComponent obj)>();
// POC: these are not captured by traversal, so we need to re-add them here
if (instanceDefinitionProxies != null && instanceDefinitionProxies.Count > 0)
if (unpackedRoot.DefinitionProxies != null && unpackedRoot.DefinitionProxies.Count > 0)
{
var transformed = instanceDefinitionProxies.Select(proxy =>
var transformed = unpackedRoot.DefinitionProxies.Select(proxy =>
(Array.Empty<Collection>(), proxy as IInstanceComponent)
);
instanceComponents.AddRange(transformed);
instanceComponentsWithPath.AddRange(transformed);
}
// POC: get colors
List<ColorProxy>? colors = (rootObject["colorProxies"] as List<object>)?.Cast<ColorProxy>().ToList();
if (colors != null)
// 3 - Bake materials and colors, as they are used later down the line by layers and objects
if (unpackedRoot.RenderMaterialProxies != null)
{
_colorManager.ParseColors(colors, onOperationProgressed);
}
// POC: get render materials
List<RenderMaterialProxy>? renderMaterials = (rootObject["renderMaterialProxies"] as List<object>)
?.Cast<RenderMaterialProxy>()
.ToList();
if (renderMaterials != null)
{
List<ReceiveConversionResult> materialResults = _materialManager.ParseAndBakeRenderMaterials(
renderMaterials,
_materialBaker.ParseAndBakeRenderMaterials(
unpackedRoot.RenderMaterialProxies,
baseLayerPrefix,
onOperationProgressed
);
results.AddRange(materialResults);
}
// POC: get group proxies
var groupProxies = (rootObject["groupProxies"] as List<object>)?.Cast<GroupProxy>().ToList();
var atomicObjects = new List<(Collection[] layerPath, Base obj)>();
foreach (TraversalContext tc in objectGraph)
if (unpackedRoot.ColorProxies != null)
{
// create new speckle layer from layer path
Collection[] layerPath = _autocadLayerManager.GetLayerPath(tc);
switch (tc.Current)
{
case IInstanceComponent instanceComponent:
instanceComponents.Add((layerPath, instanceComponent));
break;
case GroupProxy:
continue;
default:
atomicObjects.Add((layerPath, tc.Current));
break;
}
_colorBaker.ParseColors(unpackedRoot.ColorProxies, onOperationProgressed);
}
// Stage 1: Convert atomic objects
// 5 - Convert atomic objects
List<ReceiveConversionResult> results = new();
List<string> bakedObjectIds = new();
Dictionary<string, List<Entity>> applicationIdMap = new();
var count = 0;
foreach (var (layerPath, atomicObject) in atomicObjects)
foreach (var (layerPath, atomicObject) in atomicObjectsWithPath)
{
string objectId = atomicObject.applicationId ?? atomicObject.id;
onOperationProgressed?.Invoke("Converting objects", (double)++count / atomicObjects.Count);
@@ -169,9 +139,9 @@ public class AutocadHostObjectBuilder : IHostObjectBuilder
}
}
// Stage 2: Convert instances
var (createdInstanceIds, consumedObjectIds, instanceConversionResults) = _instanceObjectsManager.BakeInstances(
instanceComponents,
// 6 - Convert instances
var (createdInstanceIds, consumedObjectIds, instanceConversionResults) = _instanceBaker.BakeInstances(
instanceComponentsWithPath,
applicationIdMap,
baseLayerPrefix,
onOperationProgressed
@@ -182,27 +152,29 @@ public class AutocadHostObjectBuilder : IHostObjectBuilder
results.RemoveAll(result => result.ResultId != null && consumedObjectIds.Contains(result.ResultId));
results.AddRange(instanceConversionResults);
// Stage 3: Create group
if (groupProxies != null)
// 7 - Create groups
if (unpackedRoot.GroupProxies != null)
{
List<ReceiveConversionResult> groupResults = _groupManager.CreateGroups(groupProxies, applicationIdMap);
List<ReceiveConversionResult> groupResults = _groupBaker.CreateGroups(
unpackedRoot.GroupProxies,
applicationIdMap
);
results.AddRange(groupResults);
}
return new HostObjectBuilderResult(bakedObjectIds, results);
});
}
private void PreReceiveDeepClean(string baseLayerPrefix)
{
_autocadLayerManager.DeleteAllLayersByPrefix(baseLayerPrefix);
_instanceObjectsManager.PurgeInstances(baseLayerPrefix);
_materialManager.PurgeMaterials(baseLayerPrefix);
_layerBaker.DeleteAllLayersByPrefix(baseLayerPrefix);
_instanceBaker.PurgeInstances(baseLayerPrefix);
_materialBaker.PurgeMaterials(baseLayerPrefix);
}
private IEnumerable<Entity> ConvertObject(Base obj, Collection[] layerPath, string baseLayerNamePrefix)
{
string layerName = _autocadLayerManager.CreateLayerForReceive(layerPath, baseLayerNamePrefix);
string layerName = _layerBaker.CreateLayerForReceive(layerPath, baseLayerNamePrefix);
var convertedEntities = new List<Entity>();
using var tr = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
@@ -226,15 +198,15 @@ public class AutocadHostObjectBuilder : IHostObjectBuilder
return convertedEntities;
}
private Entity BakeObject(Entity entity, Base originalObject, string layerName)
private Entity BakeObject(Entity entity, Base originalObject, string layerName, Base? parentObject = null)
{
var objId = originalObject.applicationId ?? originalObject.id;
if (_colorManager.ObjectColorsIdMap.TryGetValue(objId, out AutocadColor? color))
if (_colorBaker.ObjectColorsIdMap.TryGetValue(objId, out AutocadColor? color))
{
entity.Color = color;
}
if (_materialManager.ObjectMaterialsIdMap.TryGetValue(objId, out ObjectId matId))
if (_materialBaker.TryGetMaterialId(originalObject, parentObject, out ObjectId matId))
{
entity.MaterialId = matId;
}
@@ -245,14 +217,14 @@ public class AutocadHostObjectBuilder : IHostObjectBuilder
private List<Entity> BakeObjectsAsGroup(
IEnumerable<(object, Base)> fallbackConversionResult,
Base originatingObject,
Base parentObject,
string layerName,
string baseLayerName
)
{
var ids = new ObjectIdCollection();
var entities = new List<Entity>();
foreach (var (conversionResult, originalBaseObject) in fallbackConversionResult)
foreach (var (conversionResult, originalObject) in fallbackConversionResult)
{
if (conversionResult is not Entity entity)
{
@@ -260,7 +232,7 @@ public class AutocadHostObjectBuilder : IHostObjectBuilder
continue;
}
BakeObject(entity, originalBaseObject, layerName);
BakeObject(entity, originalObject, layerName, parentObject);
ids.Add(entity.ObjectId);
entities.Add(entity);
}
@@ -270,7 +242,7 @@ public class AutocadHostObjectBuilder : IHostObjectBuilder
tr.GetObject(Application.DocumentManager.CurrentDocument.Database.GroupDictionaryId, OpenMode.ForWrite);
var groupName = _autocadContext.RemoveInvalidChars(
$@"{originatingObject.speckle_type.Split('.').Last()} - {originatingObject.applicationId ?? originatingObject.id} ({baseLayerName})"
$@"{parentObject.speckle_type.Split('.').Last()} - {parentObject.applicationId ?? parentObject.id} ({baseLayerName})"
);
var newGroup = new Group(groupName, true);
@@ -1,20 +1,19 @@
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using Autodesk.AutoCAD.DatabaseServices;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Autocad.HostApp;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Extensions;
using Speckle.Connectors.Utils.Operations;
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;
using Speckle.Converters.Autocad;
using Speckle.Converters.Common;
using Speckle.Objects.Other;
using Speckle.Sdk;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Collections;
using Speckle.Sdk.Models.Instances;
using Speckle.Sdk.Models.Proxies;
namespace Speckle.Connectors.Autocad.Operations.Send;
@@ -22,38 +21,48 @@ public class AutocadRootObjectBuilder : IRootObjectBuilder<AutocadRootObject>
{
private readonly IRootToSpeckleConverter _converter;
private readonly string[] _documentPathSeparator = ["\\"];
private readonly IConverterSettingsStore<AutocadConversionSettings> _converterSettings;
private readonly ISendConversionCache _sendConversionCache;
private readonly AutocadInstanceObjectManager _instanceObjectsManager;
private readonly AutocadMaterialManager _materialManager;
private readonly AutocadColorManager _colorManager;
private readonly AutocadLayerManager _layerManager;
private readonly AutocadGroupManager _groupManager;
private readonly ISyncToThread _syncToThread;
private readonly AutocadInstanceUnpacker _instanceUnpacker;
private readonly AutocadMaterialUnpacker _materialUnpacker;
private readonly AutocadColorUnpacker _colorUnpacker;
private readonly AutocadLayerUnpacker _layerUnpacker;
private readonly AutocadGroupUnpacker _groupUnpacker;
private readonly ILogger<AutocadRootObjectBuilder> _logger;
private readonly ISdkActivityFactory _activityFactory;
public AutocadRootObjectBuilder(
IRootToSpeckleConverter converter,
ISendConversionCache sendConversionCache,
AutocadInstanceObjectManager instanceObjectManager,
AutocadMaterialManager materialManager,
AutocadColorManager colorManager,
AutocadLayerManager layerManager,
AutocadGroupManager groupManager,
ISyncToThread syncToThread,
ILogger<AutocadRootObjectBuilder> logger
AutocadInstanceUnpacker instanceObjectManager,
AutocadMaterialUnpacker materialUnpacker,
AutocadColorUnpacker colorUnpacker,
AutocadLayerUnpacker layerUnpacker,
AutocadGroupUnpacker groupUnpacker,
ILogger<AutocadRootObjectBuilder> logger,
ISdkActivityFactory activityFactory,
IConverterSettingsStore<AutocadConversionSettings> converterSettings
)
{
_converter = converter;
_sendConversionCache = sendConversionCache;
_instanceObjectsManager = instanceObjectManager;
_materialManager = materialManager;
_colorManager = colorManager;
_layerManager = layerManager;
_groupManager = groupManager;
_syncToThread = syncToThread;
_instanceUnpacker = instanceObjectManager;
_materialUnpacker = materialUnpacker;
_colorUnpacker = colorUnpacker;
_layerUnpacker = layerUnpacker;
_groupUnpacker = groupUnpacker;
_logger = logger;
_activityFactory = activityFactory;
_converterSettings = converterSettings;
}
public Task<RootObjectBuilderResult> Build(
IReadOnlyList<AutocadRootObject> objects,
SendInfo sendInfo,
Action<string, double?>? onOperationProgressed = null,
CancellationToken ct = default
) => Task.FromResult(BuildSync(objects, sendInfo, onOperationProgressed, ct));
[SuppressMessage(
"Maintainability",
"CA1506:Avoid excessive class coupling",
@@ -63,80 +72,59 @@ public class AutocadRootObjectBuilder : IRootObjectBuilder<AutocadRootObject>
proxy classes yet. So I'm supressing this one now!!!
"""
)]
public Task<RootObjectBuilderResult> Build(
private RootObjectBuilderResult BuildSync(
IReadOnlyList<AutocadRootObject> objects,
SendInfo sendInfo,
Action<string, double?>? onOperationProgressed = null,
CancellationToken ct = default
Action<string, double?>? onOperationProgressed,
CancellationToken ct
)
{
return _syncToThread.RunOnThread(() =>
// 0 - Init the root
Collection root =
new()
{
name = Application
.DocumentManager.CurrentDocument.Name // POC: https://spockle.atlassian.net/browse/CNX-9319
.Split(_documentPathSeparator, StringSplitOptions.None)
.Reverse()
.First()
};
root["units"] = _converterSettings.Current.SpeckleUnits;
// TODO: better handling for document and transactions!!
Document doc = Application.DocumentManager.CurrentDocument;
using Transaction tr = doc.Database.TransactionManager.StartTransaction();
// 1 - Unpack the instances
var (atomicObjects, instanceProxies, instanceDefinitionProxies) = _instanceUnpacker.UnpackSelection(objects);
root[ProxyKeys.INSTANCE_DEFINITION] = instanceDefinitionProxies;
// 2 - Unpack the groups
root[ProxyKeys.GROUP] = _groupUnpacker.UnpackGroups(atomicObjects);
using (var _ = _activityFactory.Start("Converting objects"))
{
Collection modelWithLayers =
new()
{
name = Application
.DocumentManager.CurrentDocument.Name // POC: https://spockle.atlassian.net/browse/CNX-9319
.Split(_documentPathSeparator, StringSplitOptions.None)
.Reverse()
.First()
};
// TODO: better handling for document and transactions!!
Document doc = Application.DocumentManager.CurrentDocument;
using Transaction tr = doc.Database.TransactionManager.StartTransaction();
// Keeps track of autocad layers used, so we can pass them on later to the material and color unpacker.
List<LayerTableRecord> usedAcadLayers = new();
int count = 0;
var (atomicObjects, instanceProxies, instanceDefinitionProxies) = _instanceObjectsManager.UnpackSelection(
objects
);
// 3 - Convert atomic objects
List<LayerTableRecord> usedAcadLayers = new(); // Keeps track of autocad layers used, so we can pass them on later to the material and color unpacker.
List<SendConversionResult> results = new();
var cacheHitCount = 0;
int count = 0;
foreach (var (entity, applicationId) in atomicObjects)
{
ct.ThrowIfCancellationRequested();
string sourceType = entity.GetType().ToString();
try
using (var convertActivity = _activityFactory.Start("Converting object"))
{
Base converted;
if (entity is BlockReference && instanceProxies.TryGetValue(applicationId, out InstanceProxy? instanceProxy))
{
converted = instanceProxy;
}
else if (_sendConversionCache.TryGetValue(sendInfo.ProjectId, applicationId, out ObjectReference? value))
{
converted = value;
cacheHitCount++;
}
else
{
converted = _converter.Convert(entity);
converted.applicationId = applicationId;
}
// Create and add a collection for each layer if not done so already.
Layer layer = _layerManager.GetOrCreateSpeckleLayer(entity, tr, out LayerTableRecord? autocadLayer);
Layer layer = _layerUnpacker.GetOrCreateSpeckleLayer(entity, tr, out LayerTableRecord? autocadLayer);
if (autocadLayer is not null)
{
usedAcadLayers.Add(autocadLayer);
modelWithLayers.elements.Add(layer);
root.elements.Add(layer);
}
layer.elements.Add(converted);
results.Add(new(Status.SUCCESS, applicationId, sourceType, converted));
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogSendConversionError(ex, sourceType);
var result = ConvertAutocadEntity(entity, applicationId, layer, instanceProxies, sendInfo.ProjectId);
results.Add(result);
results.Add(new(Status.ERROR, applicationId, sourceType, null, ex));
onOperationProgressed?.Invoke("Converting", (double)++count / atomicObjects.Count);
}
onOperationProgressed?.Invoke("Converting", (double)++count / atomicObjects.Count);
}
if (results.All(x => x.Status == Status.ERROR))
@@ -144,37 +132,49 @@ public class AutocadRootObjectBuilder : IRootObjectBuilder<AutocadRootObject>
throw new SpeckleConversionException("Failed to convert all objects."); // fail fast instead creating empty commit! It will appear as model card error with red color.
}
// POC: Log would be nice, or can be removed.
Debug.WriteLine(
$"Cache hit count {cacheHitCount} out of {objects.Count} ({(double)cacheHitCount / objects.Count})"
);
// 4 - Unpack the render material proxies
root[ProxyKeys.RENDER_MATERIAL] = _materialUnpacker.UnpackMaterials(atomicObjects, usedAcadLayers);
var conversionFailedAppIds = results
.FindAll(result => result.Status == Status.ERROR)
.Select(result => result.SourceId);
// 5 - Unpack the color proxies
root[ProxyKeys.COLOR] = _colorUnpacker.UnpackColors(atomicObjects, usedAcadLayers);
// Cleans up objects that failed to convert from definition proxies.
// see https://linear.app/speckle/issue/CNX-115/viewer-handle-gracefully-instances-with-elements-that-failed-to
foreach (var definitionProxy in instanceDefinitionProxies)
return new RootObjectBuilderResult(root, results);
}
}
private SendConversionResult ConvertAutocadEntity(
Entity entity,
string applicationId,
Collection collectionHost,
IReadOnlyDictionary<string, InstanceProxy> instanceProxies,
string projectId
)
{
string sourceType = entity.GetType().ToString();
try
{
Base converted;
if (entity is BlockReference && instanceProxies.TryGetValue(applicationId, out InstanceProxy? instanceProxy))
{
definitionProxy.objects.RemoveAll(id => conversionFailedAppIds.Contains(id));
converted = instanceProxy;
}
else if (_sendConversionCache.TryGetValue(projectId, applicationId, out ObjectReference? value))
{
converted = value;
}
else
{
converted = _converter.Convert(entity);
converted.applicationId = applicationId;
}
// Set definition proxies
modelWithLayers["instanceDefinitionProxies"] = instanceDefinitionProxies;
// set groups
List<GroupProxy> groupProxies = _groupManager.UnpackGroups(atomicObjects);
modelWithLayers["groupProxies"] = groupProxies;
// set materials
List<RenderMaterialProxy> materialProxies = _materialManager.UnpackMaterials(atomicObjects, usedAcadLayers);
modelWithLayers["renderMaterialProxies"] = materialProxies;
// set colors
List<ColorProxy> colorProxies = _colorManager.UnpackColors(atomicObjects, usedAcadLayers);
modelWithLayers["colorProxies"] = colorProxies;
return new RootObjectBuilderResult(modelWithLayers, results);
});
collectionHost.elements.Add(converted);
return new(Status.SUCCESS, applicationId, sourceType, converted);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogSendConversionError(ex, sourceType);
return new(Status.ERROR, applicationId, sourceType, null, ex);
}
}
}
@@ -1,20 +1,23 @@
using System.Drawing;
using System.IO;
using System.Reflection;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
using Speckle.Autofac.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Speckle.Connectors.Autocad.DependencyInjection;
using Speckle.Connectors.Common;
using Speckle.Connectors.DUI;
using Speckle.Connectors.DUI.WebView;
using Speckle.Connectors.Utils;
using Speckle.Sdk.Common;
#if AUTOCAD
using Speckle.Converters.Autocad;
#elif CIVIL3D
using Speckle.Converters.Civil3d;
#endif
namespace Speckle.Connectors.Autocad.Plugin;
public class AutocadCommand
{
private static PaletteSet? PaletteSet { get; set; }
private static readonly Guid s_id = new("3223E594-1B09-4E54-B3DD-8EA0BECE7BA5");
public SpeckleContainer? Container { get; private set; }
public ServiceProvider? Container { get; private set; }
private IDisposable? _disposableLogger;
public const string COMMAND_STRING = "SpeckleBeta";
@@ -33,18 +36,20 @@ public class AutocadCommand
DockEnabled = (DockSides)((int)DockSides.Left + (int)DockSides.Right)
};
var builder = SpeckleContainerBuilder.CreateInstance();
// init DI
_disposableLogger = Connector.Initialize(AppUtils.App, AppUtils.Version);
Container = builder
.LoadAutofacModules(
Assembly.GetExecutingAssembly(),
[Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).NotNull()]
)
.Build();
var services = new ServiceCollection();
_disposableLogger = services.Initialize(AppUtils.App, AppUtils.Version);
#if AUTOCAD
services.AddAutocad();
services.AddAutocadConverters();
#elif CIVIL3D
services.AddCivil3d();
services.AddCivil3dConverters();
#endif
Container = services.BuildServiceProvider();
Container.UseDUI();
var panelWebView = Container.Resolve<DUI3ControlWebView>();
var panelWebView = Container.GetRequiredService<DUI3ControlWebView>();
PaletteSet.AddVisual("Speckle (Beta) for Autocad WebView", panelWebView);
@@ -1,5 +1,5 @@
using Autodesk.AutoCAD.Runtime;
using Speckle.Autofac;
using Speckle.Connectors.Common;
namespace Speckle.Connectors.Autocad.Plugin;
@@ -4,7 +4,6 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using Autodesk.Windows;
using Speckle.Sdk;
using Speckle.Sdk.Logging;
namespace Speckle.Connectors.Autocad.Plugin;
@@ -178,18 +177,9 @@ public class AutocadRibbon
{
stream = assembly.GetManifestResourceStream(resource);
}
catch (FileLoadException flEx)
{
SpeckleLog.Logger.Error(flEx, "Could not load app image source: {exceptionMessage}");
}
catch (FileNotFoundException fnfEx)
{
SpeckleLog.Logger.Error(fnfEx, "Could not find app image source: {exceptionMessage}");
}
catch (NotImplementedException niEx)
{
SpeckleLog.Logger.Error(niEx, "App image source could not be loaded: {exceptionMessage}");
}
catch (FileLoadException) { }
catch (FileNotFoundException) { }
catch (NotImplementedException) { }
if (stream is null)
{
@@ -17,15 +17,20 @@
<Compile Include="$(MSBuildThisFileDirectory)DependencyInjection\AutocadConnectorModule.cs" />
<Compile Include="$(MSBuildThisFileDirectory)DependencyInjection\Civil3dConnectorModule.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Filters\AutocadSelectionFilter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadMaterialManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadGroupManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadInstanceObjectManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadColorBaker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadColorUnpacker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadGroupBaker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadGroupUnpacker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadInstanceBaker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadInstanceUnpacker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadLayerBaker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadLayerUnpacker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadMaterialBaker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadContext.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadDocumentManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadDocumentModelStore.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadIdleManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadColorManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadLayerManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadMaterialUnpacker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\DatabaseExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\DocumentExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\EditorExtensions.cs" />
@@ -2,9 +2,12 @@
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<PlatformTarget>x64</PlatformTarget>
<UseWpf>true</UseWpf>
<Civil3DVersion>2024</Civil3DVersion>
<DefineConstants>$(DefineConstants);CIVIL3D;CIVIL3D2024;CIVIL3D2024_OR_GREATER</DefineConstants>
<Configurations>Debug;Release;Local</Configurations>
<StartAction>Program</StartAction>
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(Civil3DVersion)\acad.exe</StartProgram>
</PropertyGroup>
<ItemGroup>
@@ -13,7 +16,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2023.DependencyInjection\Speckle.Converters.Autocad2023.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Converters\Civil3d\Speckle.Converters.Civil3d2024\Speckle.Converters.Civil3d2024.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
</ItemGroup>
@@ -2,6 +2,15 @@
"version": 2,
"dependencies": {
".NETFramework,Version=v4.8": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -71,14 +80,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -108,61 +109,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -196,11 +193,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -233,22 +225,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -262,8 +254,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -275,32 +267,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -310,24 +278,21 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -338,71 +303,50 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.autocad2023": {
"speckle.converters.civil3d2024": {
"type": "Project",
"dependencies": {
"Speckle.AutoCAD.API": "[2023.0.0, )",
"Speckle.AutoCAD.API": "[2024.0.0, )",
"Speckle.Civil3D.API": "[2024.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"speckle.converters.autocad2023.dependencyinjection": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )",
"Speckle.Converters.Autocad2023": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )"
}
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.Web.WebView2": {
"type": "CentralTransitive",
@@ -412,29 +356,29 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -25,13 +25,9 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Revit\Speckle.Converters.Revit2022.DependencyInjection\Speckle.Converters.Revit2022.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Converters\Revit\Speckle.Converters.Revit2022\Speckle.Converters.Revit2022.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI\Speckle.Connectors.DUI.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common.DependencyInjection\Speckle.Converters.Common.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Autofac\Speckle.Autofac.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Utils\Speckle.Connectors.Utils.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
</ItemGroup>
<ItemGroup>
@@ -11,6 +11,15 @@
"CefSharp.Common": "[65.0.1]"
}
},
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -90,14 +99,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -127,61 +128,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -215,11 +212,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -252,22 +244,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -281,8 +273,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -294,32 +286,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -329,101 +297,75 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.revit2022": {
"type": "Project",
"dependencies": {
"Speckle.Converters.Common": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )",
"Speckle.Revit.API": "[2022.0.2.1, )"
}
},
"speckle.converters.revit2022.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Converters.Common": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )",
"Speckle.Converters.Revit2022": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Revit.API": {
@@ -434,20 +376,20 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -24,13 +24,9 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Revit\Speckle.Converters.Revit2023.DependencyInjection\Speckle.Converters.Revit2023.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Converters\Revit\Speckle.Converters.Revit2023\Speckle.Converters.Revit2023.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI\Speckle.Connectors.DUI.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common.DependencyInjection\Speckle.Converters.Common.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Autofac\Speckle.Autofac.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Utils\Speckle.Connectors.Utils.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
</ItemGroup>
<ItemGroup>
@@ -39,7 +35,6 @@
</ItemGroup>
<ItemGroup>
<None Remove="Plugin\Speckle.Connectors.Revit2023.addin" />
<Content Include="Plugin\Speckle.Connectors.Revit2023.addin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
@@ -11,6 +11,15 @@
"CefSharp.Common": "[92.0.260]"
}
},
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -90,14 +99,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -127,61 +128,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -215,11 +212,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -252,22 +244,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -281,8 +273,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -294,32 +286,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -329,49 +297,32 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.revit2023": {
@@ -381,48 +332,40 @@
"Speckle.Revit.API": "[2023.0.0, )"
}
},
"speckle.converters.revit2023.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Converters.Common": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )",
"Speckle.Converters.Revit2023": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Revit.API": {
@@ -433,20 +376,20 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -24,13 +24,9 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Revit\Speckle.Converters.Revit2024.DependencyInjection\Speckle.Converters.Revit2024.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Converters\Revit\Speckle.Converters.Revit2024\Speckle.Converters.Revit2024.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI\Speckle.Connectors.DUI.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common.DependencyInjection\Speckle.Converters.Common.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Autofac\Speckle.Autofac.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Utils\Speckle.Connectors.Utils.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
</ItemGroup>
<ItemGroup>
@@ -11,6 +11,15 @@
"CefSharp.Common": "[105.3.390]"
}
},
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -90,14 +99,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -127,61 +128,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -215,11 +212,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -252,22 +244,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -281,8 +273,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -294,32 +286,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -329,49 +297,32 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.revit2024": {
@@ -381,48 +332,40 @@
"Speckle.Revit.API": "[2024.0.0, )"
}
},
"speckle.converters.revit2024.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Converters.Common": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )",
"Speckle.Converters.Revit2024": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Revit.API": {
@@ -433,20 +376,20 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -17,13 +17,9 @@
<Import Project="..\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.projitems" Label="Shared" />
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Revit\Speckle.Converters.Revit2025.DependencyInjection\Speckle.Converters.Revit2025.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Converters\Revit\Speckle.Converters.Revit2025\Speckle.Converters.Revit2025.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common.DependencyInjection\Speckle.Converters.Common.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Autofac\Speckle.Autofac.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Utils\Speckle.Connectors.Utils.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
</ItemGroup>
<ItemGroup>
@@ -11,6 +11,15 @@
"CefSharp.Common.NETCore": "[119.4.30]"
}
},
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net461": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -112,54 +121,56 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg=="
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net461": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "AmOJZwCqnOCNp6PPcf9joyogScWLtwy0M1WkqfEQ0M9nYwyDD7EX9ZjscKS5iYnyvteX7kzSKFCKt9I9dXA6mA=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
@@ -194,11 +205,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -229,6 +235,11 @@
"SQLitePCLRaw.core": "2.1.4"
}
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.3",
@@ -239,24 +250,26 @@
"resolved": "5.0.0",
"contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ=="
},
"System.Text.Json": {
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ=="
"resolved": "4.5.1",
"contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -267,28 +280,14 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.revit2025": {
@@ -298,37 +297,32 @@
"Speckle.Revit.API": "[2025.0.0, )"
}
},
"speckle.converters.revit2025.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Converters.Common": "[1.0.0, )",
"Speckle.Converters.Common.DependencyInjection": "[1.0.0, )",
"Speckle.Converters.Revit2025": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.Web.WebView2": {
"type": "CentralTransitive",
@@ -338,11 +332,11 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Revit.API": {
@@ -353,20 +347,20 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -1,11 +1,10 @@
using System.Reflection;
using Autodesk.Revit.DB;
using Microsoft.Extensions.Logging;
using Revit.Async;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.RevitShared;
using Speckle.Connectors.Utils.Common;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Sdk;
using Speckle.Sdk.Common;
@@ -16,19 +15,29 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding
{
// POC: name and bridge might be better for them to be protected props?
public string Name { get; private set; }
public IBridge Parent { get; private set; }
public IBrowserBridge Parent { get; private set; }
public BasicConnectorBindingCommands Commands { get; }
private readonly DocumentModelStore _store;
private readonly RevitContext _revitContext;
private readonly ISpeckleApplication _speckleApplication;
private readonly ILogger<BasicConnectorBindingRevit> _logger;
public BasicConnectorBindingRevit(DocumentModelStore store, IBridge parent, RevitContext revitContext)
public BasicConnectorBindingRevit(
DocumentModelStore store,
IBrowserBridge parent,
RevitContext revitContext,
ISpeckleApplication speckleApplication,
ILogger<BasicConnectorBindingRevit> logger
)
{
Name = "baseBinding";
Parent = parent;
_store = store;
_revitContext = revitContext;
_speckleApplication = speckleApplication;
_logger = logger;
Commands = new BasicConnectorBindingCommands(parent);
// POC: event binding?
@@ -38,11 +47,11 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding
};
}
public string GetConnectorVersion() => Assembly.GetAssembly(GetType()).NotNull().GetVersion();
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
public string GetSourceApplicationName() => Speckle.Connectors.Utils.Connector.Slug.ToLower(); // POC: maybe not right place but... // ANOTHER POC: We should align this naming from somewhere in common DUI projects instead old structs. I know there are other POC comments around this
public string GetSourceApplicationName() => _speckleApplication.Slug;
public string GetSourceApplicationVersion() => Speckle.Connectors.Utils.Connector.VersionString; // POC: maybe not right place but...
public string GetSourceApplicationVersion() => _speckleApplication.HostApplicationVersion;
public DocumentInfo? GetDocumentInfo()
{
@@ -75,17 +84,37 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding
public void HighlightModel(string modelCardId)
{
SenderModelCard model = (SenderModelCard)_store.GetModelById(modelCardId);
var model = _store.GetModelById(modelCardId);
if (model is null)
{
_logger.LogError("Model was null when highlighting received model");
return;
}
var activeUIDoc =
_revitContext.UIApplication?.ActiveUIDocument
?? throw new SpeckleException("Unable to retrieve active UI document");
var elementIds = model
.SendFilter.NotNull()
.GetObjectIds()
.Select(uid => ElementIdHelper.GetElementIdFromUniqueId(activeUIDoc.Document, uid))
.ToList();
var elementIds = new List<ElementId>();
if (model is SenderModelCard senderModelCard)
{
elementIds = senderModelCard
.SendFilter.NotNull()
.GetObjectIds()
.Select(uid => ElementIdHelper.GetElementIdFromUniqueId(activeUIDoc.Document, uid))
.ToList();
}
if (model is ReceiverModelCard receiverModelCard)
{
elementIds = receiverModelCard
.BakedObjectIds.NotNull()
.Select(uid => ElementIdHelper.GetElementIdFromUniqueId(activeUIDoc.Document, uid))
.ToList();
}
if (elementIds.Count == 0)
{
Commands.SetModelError(modelCardId, new InvalidOperationException("No objects found to highlight."));
@@ -9,12 +9,12 @@ internal abstract class RevitBaseBinding : IBinding
{
// POC: name and bridge might be better for them to be protected props?
public string Name { get; }
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
protected readonly DocumentModelStore Store;
protected readonly RevitContext RevitContext;
protected RevitBaseBinding(string name, DocumentModelStore store, IBridge parent, RevitContext revitContext)
protected RevitBaseBinding(string name, DocumentModelStore store, IBrowserBridge parent, RevitContext revitContext)
{
Name = name;
Parent = parent;
@@ -1,13 +1,16 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Cancellation;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Logging;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Connectors.DUI.Settings;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Sdk;
namespace Speckle.Connectors.Revit.Bindings;
@@ -15,39 +18,48 @@ namespace Speckle.Connectors.Revit.Bindings;
internal sealed class RevitReceiveBinding : IReceiveBinding
{
public string Name => "receiveBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<RevitReceiveBinding> _logger;
private readonly CancellationManager _cancellationManager;
private readonly DocumentModelStore _store;
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IServiceProvider _serviceProvider;
private readonly IRevitConversionSettingsFactory _revitConversionSettingsFactory;
private readonly ISpeckleApplication _speckleApplication;
private ReceiveBindingUICommands Commands { get; }
public RevitReceiveBinding(
DocumentModelStore store,
CancellationManager cancellationManager,
IBridge parent,
IUnitOfWorkFactory unitOfWorkFactory,
IBrowserBridge parent,
IServiceProvider serviceProvider,
IOperationProgressManager operationProgressManager,
ILogger<RevitReceiveBinding> logger
ILogger<RevitReceiveBinding> logger,
IRevitConversionSettingsFactory revitConversionSettingsFactory,
ISpeckleApplication speckleApplication
)
{
Parent = parent;
_store = store;
_unitOfWorkFactory = unitOfWorkFactory;
_serviceProvider = serviceProvider;
_operationProgressManager = operationProgressManager;
_logger = logger;
_revitConversionSettingsFactory = revitConversionSettingsFactory;
_speckleApplication = speckleApplication;
_cancellationManager = cancellationManager;
Commands = new ReceiveBindingUICommands(parent);
}
#pragma warning disable CA1024
public List<ICardSetting> GetReceiveSettings() => [];
#pragma warning restore CA1024
public void CancelReceive(string modelCardId) => _cancellationManager.CancelOperation(modelCardId);
public async Task Receive(string modelCardId)
{
using var unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
try
{
// Get receiver card
@@ -59,10 +71,21 @@ internal sealed class RevitReceiveBinding : IReceiveBinding
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
using var scope = _serviceProvider.CreateScope();
scope
.ServiceProvider.GetRequiredService<IConverterSettingsStore<RevitConversionSettings>>()
.Initialize(
_revitConversionSettingsFactory.Create(
DetailLevelType.Coarse, //TODO figure out
null,
false
)
);
// Receive host objects
HostObjectBuilderResult conversionResults = await unitOfWork
.Service.Execute(
modelCard.GetReceiveInfo(Speckle.Connectors.Utils.Connector.Slug),
HostObjectBuilderResult conversionResults = await scope
.ServiceProvider.GetRequiredService<ReceiveOperation>()
.Execute(
modelCard.GetReceiveInfo(_speckleApplication.Slug),
cancellationToken,
(status, progress) =>
_operationProgressManager.SetModelProgress(
@@ -1,8 +1,10 @@
using System.Collections.Concurrent;
using Autodesk.Revit.DB;
using Autofac;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.Common.Caching;
using Speckle.Connectors.Common.Cancellation;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Exceptions;
@@ -14,9 +16,7 @@ using Speckle.Connectors.DUI.Settings;
using Speckle.Connectors.Revit.HostApp;
using Speckle.Connectors.Revit.Operations.Send.Settings;
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;
@@ -28,12 +28,14 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
{
private readonly IRevitIdleManager _idleManager;
private readonly CancellationManager _cancellationManager;
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IServiceProvider _serviceProvider;
private readonly ISendConversionCache _sendConversionCache;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ToSpeckleSettingsManager _toSpeckleSettingsManager;
private readonly ILogger<RevitSendBinding> _logger;
private readonly ElementUnpacker _elementUnpacker;
private readonly IRevitConversionSettingsFactory _revitConversionSettingsFactory;
private readonly ISpeckleApplication _speckleApplication;
/// <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:
@@ -48,24 +50,28 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
RevitContext revitContext,
DocumentModelStore store,
CancellationManager cancellationManager,
IBridge bridge,
IUnitOfWorkFactory unitOfWorkFactory,
IBrowserBridge bridge,
IServiceProvider serviceProvider,
ISendConversionCache sendConversionCache,
IOperationProgressManager operationProgressManager,
ToSpeckleSettingsManager toSpeckleSettingsManager,
ILogger<RevitSendBinding> logger,
ElementUnpacker elementUnpacker
ElementUnpacker elementUnpacker,
IRevitConversionSettingsFactory revitConversionSettingsFactory,
ISpeckleApplication speckleApplication
)
: base("sendBinding", store, bridge, revitContext)
{
_idleManager = idleManager;
_cancellationManager = cancellationManager;
_unitOfWorkFactory = unitOfWorkFactory;
_serviceProvider = serviceProvider;
_sendConversionCache = sendConversionCache;
_operationProgressManager = operationProgressManager;
_toSpeckleSettingsManager = toSpeckleSettingsManager;
_logger = logger;
_elementUnpacker = elementUnpacker;
_revitConversionSettingsFactory = revitConversionSettingsFactory;
_speckleApplication = speckleApplication;
var topLevelExceptionHandler = Parent.TopLevelExceptionHandler;
Commands = new SendBindingUICommands(bridge);
@@ -85,7 +91,11 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
}
public List<ICardSetting> GetSendSettings() =>
[new DetailLevelSetting(DetailLevelType.Medium), new ReferencePointSetting(ReferencePointType.InternalOrigin)];
[
new DetailLevelSetting(DetailLevelType.Medium),
new ReferencePointSetting(ReferencePointType.InternalOrigin),
new SendParameterNullOrEmptyStringsSetting(false)
];
public void CancelSend(string modelCardId) => _cancellationManager.CancelOperation(modelCardId);
@@ -107,18 +117,20 @@ 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 scope = _serviceProvider.CreateScope();
scope
.ServiceProvider.GetRequiredService<IConverterSettingsStore<RevitConversionSettings>>()
.Initialize(
_revitConversionSettingsFactory.Create(
_toSpeckleSettingsManager.GetDetailLevelSetting(modelCard),
_toSpeckleSettingsManager.GetReferencePointSetting(modelCard),
_toSpeckleSettingsManager.GetSendParameterNullOrEmptyStringsSetting(modelCard)
)
);
var activeUIDoc =
RevitContext.UIApplication?.ActiveUIDocument
?? throw new SpeckleException("Unable to retrieve active UI document");
List<ElementId> revitObjects = modelCard
.SendFilter.NotNull()
.GetObjectIds()
@@ -131,10 +143,11 @@ 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 scope
.ServiceProvider.GetRequiredService<SendOperation<ElementId>>()
.Execute(
revitObjects,
modelCard.GetSendInfo(Speckle.Connectors.Utils.Connector.Slug),
modelCard.GetSendInfo(_speckleApplication.Slug),
(status, progress) =>
_operationProgressManager.SetModelProgress(
Parent,
@@ -18,7 +18,7 @@ internal sealed class SelectionBinding : RevitBaseBinding, ISelectionBinding, ID
RevitContext revitContext,
DocumentModelStore store,
IRevitIdleManager revitIdleManager,
IBridge parent
IBrowserBridge parent
)
: base("selectionBinding", store, parent, revitContext)
{
@@ -1,8 +1,10 @@
using Autodesk.Revit.DB;
using Autofac;
using CefSharp;
using Speckle.Autofac;
using Speckle.Autofac.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Speckle.Connectors.Common;
using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Caching;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
@@ -13,89 +15,84 @@ using Speckle.Connectors.Revit.Operations.Receive;
using Speckle.Connectors.Revit.Operations.Send;
using Speckle.Connectors.Revit.Operations.Send.Settings;
using Speckle.Connectors.Revit.Plugin;
using Speckle.Connectors.Utils;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Operations;
using Speckle.Converters.Common;
using Speckle.Sdk.Models.GraphTraversal;
namespace Speckle.Connectors.Revit.DependencyInjection;
// POC: should interface out things that are not
public class RevitConnectorModule : ISpeckleModule
public static class ServiceRegistration
{
public void Load(SpeckleContainerBuilder builder)
public static void AddRevit(this IServiceCollection serviceCollection)
{
builder.AddAutofac();
builder.AddConnectorUtils();
builder.AddDUI();
RegisterUiDependencies(builder);
serviceCollection.AddConnectorUtils();
serviceCollection.AddDUI();
RegisterUiDependencies(serviceCollection);
builder.AddSingletonInstance<ISyncToThread, RevitContextAccessor>();
// register
builder.AddSingleton<DocumentModelStore, RevitDocumentStore>();
serviceCollection.AddSingleton<DocumentModelStore, RevitDocumentStore>();
// Storage Schema
builder.AddScoped<DocumentModelStorageSchema>();
builder.AddScoped<IdStorageSchema>();
serviceCollection.AddScoped<DocumentModelStorageSchema>();
serviceCollection.AddScoped<IdStorageSchema>();
// POC: we need to review the scopes and create a document on what the policy is
// and where the UoW should be
// register UI bindings
builder.AddSingleton<IBinding, TestBinding>();
builder.AddSingleton<IBinding, ConfigBinding>("connectorName", "Revit"); // POC: Easier like this for now, should be cleaned up later
builder.AddSingleton<IBinding, AccountBinding>();
builder.AddSingleton<IBinding, SelectionBinding>();
builder.AddSingleton<IBinding, RevitSendBinding>();
// builder.AddSingleton<IBinding, RevitReceiveBinding>(); // TODO: Have it back once we comfortable enough!
builder.AddSingleton<IRevitIdleManager, RevitIdleManager>();
serviceCollection.AddSingleton<IBinding, TestBinding>();
serviceCollection.AddSingleton<IBinding, ConfigBinding>();
serviceCollection.AddSingleton<IBinding, AccountBinding>();
serviceCollection.AddSingleton<IBinding, SelectionBinding>();
serviceCollection.AddSingleton<IBinding, RevitSendBinding>();
serviceCollection.AddSingleton<IBinding, RevitReceiveBinding>();
serviceCollection.AddSingleton<IRevitIdleManager, RevitIdleManager>();
builder.ContainerBuilder.RegisterType<TopLevelExceptionHandlerBinding>().As<IBinding>().AsSelf().SingleInstance();
builder.AddSingleton<ITopLevelExceptionHandler>(c =>
c.Resolve<TopLevelExceptionHandlerBinding>().Parent.TopLevelExceptionHandler
);
serviceCollection.RegisterTopLevelExceptionHandler();
builder
.ContainerBuilder.RegisterType<BasicConnectorBindingRevit>()
.As<IBinding>()
.As<IBasicConnectorBinding>()
.SingleInstance();
serviceCollection.AddSingleton<IBinding>(sp => sp.GetRequiredService<IBasicConnectorBinding>());
serviceCollection.AddSingleton<IBasicConnectorBinding, BasicConnectorBindingRevit>();
// send operation and dependencies
builder.AddScoped<SendOperation<ElementId>>();
builder.AddScoped<ElementUnpacker>();
builder.AddScoped<SendCollectionManager>();
builder.AddScoped<IRootObjectBuilder<ElementId>, RevitRootObjectBuilder>();
builder.AddSingleton<ISendConversionCache, SendConversionCache>();
builder.AddSingleton<ToSpeckleSettingsManager>();
serviceCollection.AddScoped<SendOperation<ElementId>>();
serviceCollection.AddScoped<ElementUnpacker>();
serviceCollection.AddScoped<SendCollectionManager>();
serviceCollection.AddScoped<IRootObjectBuilder<ElementId>, RevitRootObjectBuilder>();
serviceCollection.AddSingleton<ISendConversionCache, SendConversionCache>();
serviceCollection.AddSingleton<ToSpeckleSettingsManager>();
// receive operation and dependencies
builder.AddScoped<IHostObjectBuilder, RevitHostObjectBuilder>();
builder.AddScoped<ITransactionManager, TransactionManager>();
builder.AddSingleton(DefaultTraversal.CreateTraversalFunc());
serviceCollection.AddScoped<IHostObjectBuilder, RevitHostObjectBuilder>();
serviceCollection.AddScoped<ITransactionManager, TransactionManager>();
serviceCollection.AddScoped<RevitGroupBaker>();
serviceCollection.AddScoped<RevitMaterialBaker>();
serviceCollection.AddSingleton<RevitUtils>();
serviceCollection.AddSingleton<IFailuresPreprocessor, HideWarningsFailuresPreprocessor>();
serviceCollection.AddSingleton(DefaultTraversal.CreateTraversalFunc());
serviceCollection.AddScoped<LocalToGlobalConverterUtils>();
// operation progress manager
builder.AddSingleton<IOperationProgressManager, OperationProgressManager>();
serviceCollection.AddSingleton<IOperationProgressManager, OperationProgressManager>();
}
public void RegisterUiDependencies(SpeckleContainerBuilder builder)
public static void RegisterUiDependencies(IServiceCollection serviceCollection)
{
#if REVIT2022
//different versons for different versions of CEF
builder.AddSingleton(new BindingOptions() { CamelCaseJavascriptNames = false });
builder.AddSingleton<CefSharpPanel>();
builder.AddSingleton<IBrowserScriptExecutor>(c => c.Resolve<CefSharpPanel>());
builder.AddSingleton<IRevitPlugin, RevitCefPlugin>();
serviceCollection.AddSingleton(new BindingOptions() { CamelCaseJavascriptNames = false });
serviceCollection.AddSingleton<CefSharpPanel>();
serviceCollection.AddSingleton<IBrowserScriptExecutor>(sp => sp.GetRequiredService<CefSharpPanel>());
serviceCollection.AddSingleton<IRevitPlugin, RevitCefPlugin>();
#else
// POC: different versons for different versions of CEF
builder.AddSingleton(BindingOptions.DefaultBinder);
// different versions for different versions of CEF
serviceCollection.AddSingleton(BindingOptions.DefaultBinder);
var panel = new CefSharpPanel();
panel.Browser.JavascriptObjectRepository.NameConverter = null;
builder.AddSingleton(panel);
builder.AddSingleton<IBrowserScriptExecutor>(c => c.Resolve<CefSharpPanel>());
builder.AddSingleton<IRevitPlugin, RevitCefPlugin>();
serviceCollection.AddSingleton(panel);
serviceCollection.AddSingleton<IBrowserScriptExecutor>(c => c.GetRequiredService<CefSharpPanel>());
serviceCollection.AddSingleton<IRevitPlugin, RevitCefPlugin>();
#endif
}
}
@@ -132,6 +132,22 @@ public class ElementUnpacker
}
}
break;
case FootPrintRoof footPrintRoof:
if (footPrintRoof.CurtainGrids is { } gs)
{
foreach (CurtainGrid roofGrid in gs)
{
foreach (var mullionId in roofGrid.GetMullionIds())
{
ids.Add(mullionId.ToString());
}
foreach (var panelId in roofGrid.GetPanelIds())
{
ids.Add(panelId.ToString());
}
}
}
break;
default:
break;
}
@@ -0,0 +1,133 @@
using Autodesk.Revit.DB;
using Speckle.Connectors.Common.Operations.Receive;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Sdk.Models.GraphTraversal;
namespace Speckle.Connectors.Revit.HostApp;
/// <summary>
/// <para>On receive, this class will help structure atomic objects into nested revit groups based on the hierarchy that they're coming from. Expects to be a scoped dependency per receive operation.</para>
/// <para>How to use: during atomic object conversion, on each succesful conversion call <see cref="AddToGroupMapping"/>. Afterward, at the end of the recieve operation, call <see cref="BakeGroups"/> to actually create the groups in the revit document.</para>
/// </summary>
public class RevitGroupBaker : TraversalContextUnpacker
{
private readonly IConverterSettingsStore<RevitConversionSettings> _converterSettings;
private readonly RevitUtils _revitUtils;
public RevitGroupBaker(IConverterSettingsStore<RevitConversionSettings> converterSettings, RevitUtils revitUtils)
{
_converterSettings = converterSettings;
_revitUtils = revitUtils;
}
/// <summary>
/// Adds the object to the correct group in preparation for <see cref="BakeGroups"/> at the end of the receive operation.
/// </summary>
/// <param name="traversalContext"></param>
/// <param name="revitElement"></param>
public void AddToGroupMapping(TraversalContext traversalContext, Element revitElement)
{
var collectionPath = GetCollectionPath(traversalContext);
var currentLayerName = string.Empty;
FakeGroup? previousGroup = null;
var currentDepth = 0;
foreach (var collection in collectionPath)
{
currentLayerName += collection.name + "-";
if (_groupCache.TryGetValue(currentLayerName, out var g))
{
previousGroup = g;
currentDepth++;
continue;
}
var group = new FakeGroup()
{
// POC group names should be unique
Name = _revitUtils.RemoveInvalidChars(currentLayerName[..^1]),
Depth = currentDepth++,
Parent = previousGroup!
};
_groupCache[currentLayerName] = group;
previousGroup = group;
}
previousGroup!.Ids.Add(revitElement.Id);
}
private readonly Dictionary<string, FakeGroup> _groupCache = new();
/// <summary>
/// Bakes the accumulated groups in Revit, with their objects.
/// </summary>
/// <param name="baseGroupName"></param>
public void BakeGroups(string baseGroupName)
{
var orderedGroups = _groupCache.Values.OrderByDescending(group => group.Depth);
Group? lastGroup = null;
foreach (var group in orderedGroups)
{
var docGroup = _converterSettings.Current.Document.Create.NewGroup(group.Ids);
group.Parent?.Ids.Add(docGroup.Id);
docGroup.GroupType.Name = group.Name;
lastGroup = docGroup;
}
lastGroup!.GroupType.Name = _revitUtils.RemoveInvalidChars(baseGroupName);
}
public void PurgeGroups(string baseGroupName)
{
var document = _converterSettings.Current.Document;
var groups = GetGroupsByName(document, baseGroupName);
foreach (var group in groups)
{
List<ElementId> subgroupTypeIds = new List<ElementId>();
CollectSubGroupTypeIds(document, group, subgroupTypeIds);
document.Delete(subgroupTypeIds);
}
}
private List<Group> GetGroupsByName(Autodesk.Revit.DB.Document doc, string groupName)
{
var validGroupName = _revitUtils.RemoveInvalidChars(groupName);
using (var collector = new FilteredElementCollector(doc))
{
ICollection<Element> groupElements = collector.OfClass(typeof(Group)).ToElements();
List<Group> groups = groupElements.Cast<Group>().Where(g => g.GroupType.Name == validGroupName).ToList();
return groups;
}
}
private void CollectSubGroupTypeIds(Autodesk.Revit.DB.Document document, Group group, List<ElementId> subGroupTypeIds)
{
ICollection<ElementId> groupMemberIds = group.GetMemberIds();
foreach (ElementId memberId in groupMemberIds)
{
Element element = document.GetElement(memberId);
if (element is Group subgroup)
{
subGroupTypeIds.Add(subgroup.GroupType.Id);
CollectSubGroupTypeIds(document, subgroup, subGroupTypeIds);
}
}
}
/// <summary>
/// Little intermediate data structure that helps with the operations above.
/// </summary>
private sealed class FakeGroup
{
public List<ElementId> Ids { get; set; } = new();
public int Depth { get; set; }
public string Name { get; set; }
public FakeGroup Parent { get; set; }
}
}
@@ -0,0 +1,166 @@
using Autodesk.Revit.DB;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Common.Operations.Receive;
using Speckle.Converters.Common;
using Speckle.Converters.RevitShared.Settings;
using Speckle.Objects.Other;
using Speckle.Sdk;
using Speckle.Sdk.Models.Collections;
using Speckle.Sdk.Models.Extensions;
using Speckle.Sdk.Models.GraphTraversal;
namespace Speckle.Connectors.Revit.HostApp;
/// <summary>
/// Utility class that converts and bakes materials in Revit. Expects to be a scoped dependency per unit of work.
/// </summary>
public class RevitMaterialBaker
{
private readonly IConverterSettingsStore<RevitConversionSettings> _converterSettings;
private readonly ILogger<RevitMaterialBaker> _logger;
private readonly RevitUtils _revitUtils;
public RevitMaterialBaker(
ILogger<RevitMaterialBaker> logger,
RevitUtils revitUtils,
IConverterSettingsStore<RevitConversionSettings> converterSettings
)
{
_logger = logger;
_revitUtils = revitUtils;
_converterSettings = converterSettings;
}
/// <summary>
/// Checks the every atomic object has render material or not, if not it tries to find it from its layer tree and mutates
/// its render material proxy objects list with the traversal current. It will also map displayable objects' display values to their
/// respective material proxy.
/// </summary>
public void MapLayersRenderMaterials(RootObjectUnpackerResult unpackedRoot)
{
if (unpackedRoot.RenderMaterialProxies is null)
{
return;
}
foreach (var context in unpackedRoot.ObjectsToConvert)
{
if (context.Current.applicationId is null)
{
continue;
}
var targetRenderMaterialProxy = unpackedRoot.RenderMaterialProxies.FirstOrDefault(rmp =>
rmp.objects.Contains(context.Current.applicationId)
);
if (targetRenderMaterialProxy is null)
{
var layerParents = context.GetAscendants().Where(parent => parent is Layer);
var layer = layerParents.FirstOrDefault(layer =>
unpackedRoot.RenderMaterialProxies.Any(rmp => rmp.objects.Contains(layer.applicationId!))
);
if (layer is not null)
{
var layerRenderMaterialProxy = unpackedRoot.RenderMaterialProxies.First(rmp =>
rmp.objects.Contains(layer.applicationId!)
);
targetRenderMaterialProxy = layerRenderMaterialProxy;
}
}
if (targetRenderMaterialProxy is null)
{
continue; // exit fast, no proxy, we can't do much more.
}
// We mutate the existing proxy list that comes from source application. Because we do not keep track of parent-child relationship of objects in terms of render materials.
targetRenderMaterialProxy.objects.Add(context.Current.applicationId!);
// This is somewhat evil: we're unpacking here displayable elements by adding their display value to the target render material proxy.
// If the display value items do not have an application id, we will generate one.
var displayable = context.Current.TryGetDisplayValue();
if (displayable != null)
{
foreach (var @base in displayable)
{
if (@base.applicationId == null)
{
var guid = Guid.NewGuid().ToString();
@base.applicationId = guid;
targetRenderMaterialProxy.objects.Add(guid);
}
else
{
targetRenderMaterialProxy.objects.Add(@base.applicationId);
}
}
}
}
}
/// <summary>
/// Will bake render materials in the revit document.
/// </summary>
/// <param name="speckleRenderMaterialProxies"></param>
/// <param name="baseLayerName"></param>
/// <returns></returns>
public Dictionary<string, ElementId> BakeMaterials(
List<RenderMaterialProxy> speckleRenderMaterialProxies,
string baseLayerName
)
{
Dictionary<string, ElementId> objectIdAndMaterialIndexMap = new();
foreach (var proxy in speckleRenderMaterialProxies)
{
var speckleRenderMaterial = proxy.value;
try
{
var diffuse = System.Drawing.Color.FromArgb(speckleRenderMaterial.diffuse);
double transparency = 1 - speckleRenderMaterial.opacity;
double smoothness = 1 - speckleRenderMaterial.roughness;
string materialId = speckleRenderMaterial.applicationId ?? speckleRenderMaterial.id;
string matName = _revitUtils.RemoveInvalidChars($"{speckleRenderMaterial.name}-({materialId})-{baseLayerName}");
var newMaterialId = Autodesk.Revit.DB.Material.Create(_converterSettings.Current.Document, matName);
var revitMaterial = (Autodesk.Revit.DB.Material)_converterSettings.Current.Document.GetElement(newMaterialId);
revitMaterial.Color = new Color(diffuse.R, diffuse.G, diffuse.B);
revitMaterial.Transparency = (int)(transparency * 100);
revitMaterial.Shininess = (int)(speckleRenderMaterial.metalness * 128);
revitMaterial.Smoothness = (int)(smoothness * 128);
foreach (var objectId in proxy.objects)
{
objectIdAndMaterialIndexMap[objectId] = revitMaterial.Id;
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to create material in Revit");
}
}
return objectIdAndMaterialIndexMap;
}
public void PurgeMaterials(string baseGroupName)
{
var validBaseGroupName = _revitUtils.RemoveInvalidChars(baseGroupName);
var document = _converterSettings.Current.Document;
using (var collector = new FilteredElementCollector(document))
{
var materialIds = collector
.OfClass(typeof(Autodesk.Revit.DB.Material))
.Where(m => m.Name.Contains(validBaseGroupName))
.Select(m => m.Id)
.ToList();
document.Delete(materialIds);
}
}
}
@@ -0,0 +1,18 @@
namespace Speckle.Connectors.Revit.HostApp;
public class RevitUtils
{
// see Revit Parameter Name Limitations here
// https://www.autodesk.com/support/technical/article/caas/tsarticles/ts/3RVyShGL7OMlDJPLasuKFL.html
private const string REVIT_INVALID_CHARS = @"\:{}[]|;<>?`~";
public string RemoveInvalidChars(string str)
{
foreach (char c in REVIT_INVALID_CHARS)
{
str = str.Replace(c.ToString(), string.Empty);
}
return str;
}
}
@@ -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
@@ -0,0 +1,17 @@
using Autodesk.Revit.DB;
namespace Speckle.Connectors.Revit.Operations.Receive;
/// <summary>
/// This class will suppress warnings on the Revit UI
/// Currently we use it after Revit receive when we create the group hierarchy
/// </summary>
public class HideWarningsFailuresPreprocessor : IFailuresPreprocessor
{
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
failuresAccessor.DeleteAllWarnings();
return FailureProcessingResult.Continue;
}
}
@@ -9,5 +9,7 @@ public interface ITransactionManager : IDisposable
void RollbackSubTransaction();
void RollbackTransaction();
void StartSubtransaction();
void StartTransaction();
// POC improve how the error handling behaviour is selected
void StartTransaction(bool enableFailurePreprocessor = false);
}
@@ -1,5 +1,5 @@
using Revit.Async;
using Speckle.Connectors.Utils.Operations;
using Speckle.Connectors.Common.Operations;
namespace Speckle.Connectors.Revit.Operations.Receive;
@@ -1,42 +1,60 @@
using Autodesk.Revit.DB;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Operations;
using Microsoft.Extensions.Logging;
using Revit.Async;
using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Conversion;
using Speckle.Connectors.Common.Instances;
using Speckle.Connectors.Common.Operations.Receive;
using Speckle.Connectors.Revit.HostApp;
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;
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 IConverterSettingsStore<RevitConversionSettings> _converterSettings;
private readonly RevitToHostCacheSingleton _revitToHostCacheSingleton;
private readonly ITransactionManager _transactionManager;
private readonly ISyncToThread _syncToThread;
private readonly ILocalToGlobalUnpacker _localToGlobalUnpacker;
private readonly LocalToGlobalConverterUtils _localToGlobalConverterUtils;
private readonly RevitGroupBaker _groupBaker;
private readonly RevitMaterialBaker _materialBaker;
private readonly ILogger<RevitHostObjectBuilder> _logger;
private readonly RootObjectUnpacker _rootObjectUnpacker;
private readonly ISdkActivityFactory _activityFactory;
public RevitHostObjectBuilder(
IRootToHostConverter converter,
IRevitConversionContextStack contextStack,
GraphTraversal traverseFunction,
IConverterSettingsStore<RevitConversionSettings> converterSettings,
ITransactionManager transactionManager,
ISyncToThread syncToThread
ISdkActivityFactory activityFactory,
ILocalToGlobalUnpacker localToGlobalUnpacker,
LocalToGlobalConverterUtils localToGlobalConverterUtils,
RevitGroupBaker groupManager,
RevitMaterialBaker materialBaker,
RootObjectUnpacker rootObjectUnpacker,
ILogger<RevitHostObjectBuilder> logger,
RevitToHostCacheSingleton revitToHostCacheSingleton
)
{
_converter = converter;
_contextStack = contextStack;
_traverseFunction = traverseFunction;
_converterSettings = converterSettings;
_transactionManager = transactionManager;
_syncToThread = syncToThread;
_localToGlobalUnpacker = localToGlobalUnpacker;
_localToGlobalConverterUtils = localToGlobalConverterUtils;
_groupBaker = groupManager;
_materialBaker = materialBaker;
_rootObjectUnpacker = rootObjectUnpacker;
_logger = logger;
_revitToHostCacheSingleton = revitToHostCacheSingleton;
_activityFactory = activityFactory;
}
public Task<HostObjectBuilderResult> Build(
@@ -46,55 +64,144 @@ internal sealed class RevitHostObjectBuilder : IHostObjectBuilder, IDisposable
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);
}
RevitTask.RunAsync(() => BuildSync(rootObject, projectName, modelName, onOperationProgressed, cancellationToken));
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)
private HostObjectBuilderResult BuildSync(
Base rootObject,
string projectName,
string modelName,
Action<string, double?>? onOperationProgressed,
CancellationToken cancellationToken
)
{
using (var _ = SpeckleActivityFactory.Start("BakeObjects"))
var baseGroupName = $"Project {projectName}: Model {modelName}"; // TODO: unify this across connectors!
onOperationProgressed?.Invoke("Converting", null);
using var activity = _activityFactory.Start("Build");
// 0 - Clean then Rock n Roll! 🎸
using TransactionGroup preReceiveCleanTransaction = new(_converterSettings.Current.Document, "Pre-receive clean");
preReceiveCleanTransaction.Start();
_transactionManager.StartTransaction(true);
try
{
var conversionResults = new List<ReceiveConversionResult>();
// NOTE!!!! Add 'UniqueId' of the elements once we have receiving in place, otherwise highlight logic will fail.
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);
PreReceiveDeepClean(baseGroupName);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to clean up before receive in Revit");
}
using (var _ = _activityFactory.Start("Commit"))
{
_transactionManager.CommitTransaction();
preReceiveCleanTransaction.Assimilate();
}
// 1 - Unpack objects and proxies from root commit object
var unpackedRoot = _rootObjectUnpacker.Unpack(rootObject);
var localToGlobalMaps = _localToGlobalUnpacker.Unpack(
unpackedRoot.DefinitionProxies,
unpackedRoot.ObjectsToConvert.ToList()
);
using TransactionGroup transactionGroup =
new(_converterSettings.Current.Document, $"Received data from {projectName}");
transactionGroup.Start();
_transactionManager.StartTransaction();
if (unpackedRoot.RenderMaterialProxies != null)
{
_materialBaker.MapLayersRenderMaterials(unpackedRoot);
// NOTE: do not set _contextStack.RenderMaterialProxyCache directly, things stop working. Ogu/Dim do not know why :) not a problem as we hopefully will refactor some of these hacks out.
var map = _materialBaker.BakeMaterials(unpackedRoot.RenderMaterialProxies, baseGroupName);
foreach (var kvp in map)
{
_revitToHostCacheSingleton.MaterialsByObjectId.Add(kvp.Key, kvp.Value);
}
}
var conversionResults = BakeObjects(localToGlobalMaps, onOperationProgressed, cancellationToken);
using (var _ = _activityFactory.Start("Commit"))
{
_transactionManager.CommitTransaction();
transactionGroup.Assimilate();
}
using TransactionGroup createGroupTransaction = new(_converterSettings.Current.Document, "Creating group");
createGroupTransaction.Start();
_transactionManager.StartTransaction(true);
try
{
_groupBaker.BakeGroups(baseGroupName);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to create group after receiving elements in Revit");
}
using (var _ = _activityFactory.Start("Commit"))
{
_transactionManager.CommitTransaction();
createGroupTransaction.Assimilate();
}
_revitToHostCacheSingleton.MaterialsByObjectId.Clear(); // Massive hack!
return conversionResults;
}
private HostObjectBuilderResult BakeObjects(
List<LocalToGlobalMap> localToGlobalMaps,
Action<string, double?>? onOperationProgressed,
CancellationToken cancellationToken
)
{
using var _ = _activityFactory.Start("BakeObjects");
var conversionResults = new List<ReceiveConversionResult>();
var bakedObjectIds = new List<string>();
int count = 0;
foreach (LocalToGlobalMap localToGlobalMap in localToGlobalMaps)
{
cancellationToken.ThrowIfCancellationRequested();
try
{
using var activity = _activityFactory.Start("BakeObject");
var atomicObject = _localToGlobalConverterUtils.TransformObjects(
localToGlobalMap.AtomicObject,
localToGlobalMap.Matrix
);
var result = _converter.Convert(atomicObject);
onOperationProgressed?.Invoke("Converting", (double)++count / localToGlobalMaps.Count);
// Note: our current converter always returns a DS for now
if (result is DirectShape ds)
{
bakedObjectIds.Add(ds.UniqueId.ToString());
_groupBaker.AddToGroupMapping(localToGlobalMap.TraversalContext, ds);
}
else
{
throw new SpeckleConversionException($"Failed to cast {result.GetType()} to Direct Shape.");
}
conversionResults.Add(new(Status.SUCCESS, atomicObject, ds.UniqueId, "Direct Shape"));
}
catch (Exception ex) when (!ex.IsFatal())
{
conversionResults.Add(new(Status.ERROR, localToGlobalMap.AtomicObject, null, null, ex));
}
}
return new(bakedObjectIds, conversionResults);
}
private void PreReceiveDeepClean(string baseGroupName)
{
_groupBaker.PurgeGroups(baseGroupName);
_materialBaker.PurgeMaterials(baseGroupName);
}
public void Dispose()
@@ -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,17 @@ 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 readonly IFailuresPreprocessor _errorPreprocessingService;
private Document Document => _converterSettings.Current.Document;
public TransactionManager(IRevitConversionContextStack contextStack)
public TransactionManager(
IConverterSettingsStore<RevitConversionSettings> converterSettings,
IFailuresPreprocessor errorPreprocessingService
)
{
_contextStack = contextStack;
_converterSettings = converterSettings;
_errorPreprocessingService = errorPreprocessingService;
}
// poc : these are being disposed. I'm not sure why I need to supress this warning
@@ -23,17 +29,21 @@ public sealed class TransactionManager : ITransactionManager
private SubTransaction? _subTransaction;
#pragma warning restore CA2213 // Disposable fields should be disposed
public void StartTransaction()
// POC find a better way to use IFailuresPreprocessor
public void StartTransaction(bool enableFailurePreprocessor = false)
{
if (_transaction == null || !_transaction.IsValidObject || _transaction.GetStatus() != TransactionStatus.Started)
{
_transaction = new Transaction(Document, "Speckle Transaction");
var failOpts = _transaction.GetFailureHandlingOptions();
// POC: make sure to implement and add the failure preprocessor
// https://spockle.atlassian.net/browse/DUI3-461
//failOpts.SetFailuresPreprocessor(_errorPreprocessingService);
failOpts.SetClearAfterRollback(true);
_transaction.SetFailureHandlingOptions(failOpts);
if (enableFailurePreprocessor)
{
var failOpts = _transaction.GetFailureHandlingOptions();
failOpts.SetFailuresPreprocessor(_errorPreprocessingService);
failOpts.SetClearAfterRollback(true);
_transaction.SetFailureHandlingOptions(failOpts);
}
_transaction.Start();
}
}
@@ -1,15 +1,17 @@
using System.Diagnostics;
using Autodesk.Revit.DB;
using Microsoft.Extensions.Logging;
using Revit.Async;
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;
using Speckle.Connectors.DUI.Exceptions;
using Speckle.Connectors.Revit.HostApp;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Conversion;
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.Converters.RevitShared.ToSpeckle;
using Speckle.Sdk;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Collections;
@@ -20,124 +22,124 @@ 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 ISyncToThread _syncToThread;
private readonly ElementUnpacker _elementUnpacker;
private readonly SendCollectionManager _sendCollectionManager;
private readonly RevitToSpeckleCacheSingleton _revitToSpeckleCacheSingleton;
private readonly ILogger<RevitRootObjectBuilder> _logger;
private readonly ParameterDefinitionHandler _parameterDefinitionHandler;
public RevitRootObjectBuilder(
IRootToSpeckleConverter converter,
IRevitConversionContextStack conversionContextStack,
IConverterSettingsStore<RevitConversionSettings> converterSettings,
ISendConversionCache sendConversionCache,
ISyncToThread syncToThread,
ElementUnpacker elementUnpacker,
SendCollectionManager sendCollectionManager,
ILogger<RevitRootObjectBuilder> logger
ILogger<RevitRootObjectBuilder> logger,
ParameterDefinitionHandler parameterDefinitionHandler,
RevitToSpeckleCacheSingleton revitToSpeckleCacheSingleton
)
{
_converter = converter;
_conversionContextStack = conversionContextStack;
_converterSettings = converterSettings;
_sendConversionCache = sendConversionCache;
_syncToThread = syncToThread;
_elementUnpacker = elementUnpacker;
_sendCollectionManager = sendCollectionManager;
_revitToSpeckleCacheSingleton = revitToSpeckleCacheSingleton;
_logger = logger;
_parameterDefinitionHandler = parameterDefinitionHandler;
_rootObject = new Collection()
{
name = _conversionContextStack.Current.Document.PathName.Split('\\').Last().Split('.').First()
name = _converterSettings.Current.Document.PathName.Split('\\').Last().Split('.').First()
};
_rootObject["units"] = _converterSettings.Current.SpeckleUnits;
}
public Task<RootObjectBuilderResult> Build(
public async Task<RootObjectBuilderResult> Build(
IReadOnlyList<ElementId> objects,
SendInfo sendInfo,
Action<string, double?>? onOperationProgressed = null,
CancellationToken ct = default
) =>
_syncToThread.RunOnThread(() =>
)
{
var doc = _converterSettings.Current.Document;
if (doc.IsFamilyDocument)
{
var doc = _conversionContextStack.Current.Document;
throw new SpeckleException("Family Environment documents are not supported.");
}
if (doc.IsFamilyDocument)
var revitElements = new List<Element>();
// Convert ids to actual revit elements
foreach (var id in objects)
{
var el = _converterSettings.Current.Document.GetElement(id);
if (el != null)
{
throw new SpeckleException("Family Environment documents are not supported.");
revitElements.Add(el);
}
}
var revitElements = new List<Element>();
if (revitElements.Count == 0)
{
throw new SpeckleSendFilterException("No objects were found. Please update your send filter!");
}
// Convert ids to actual revit elements
foreach (var id in objects)
List<SendConversionResult> results = new(revitElements.Count);
// Unpack groups (& other complex data structures)
var atomicObjects = _elementUnpacker.UnpackSelectionForConversion(revitElements).ToList();
var countProgress = 0;
var cacheHitCount = 0;
foreach (Element revitElement in atomicObjects)
{
ct.ThrowIfCancellationRequested();
string applicationId = revitElement.UniqueId;
string sourceType = revitElement.GetType().Name;
try
{
var el = _conversionContextStack.Current.Document.GetElement(id);
if (el != null)
Base converted;
if (_sendConversionCache.TryGetValue(sendInfo.ProjectId, applicationId, out ObjectReference? value))
{
revitElements.Add(el);
converted = value;
cacheHitCount++;
}
}
if (revitElements.Count == 0)
{
throw new SpeckleSendFilterException("No objects were found. Please update your send filter!");
}
// Unpack groups (& other complex data structures)
var atomicObjects = _elementUnpacker.UnpackSelectionForConversion(revitElements).ToList();
var countProgress = 0;
var cacheHitCount = 0;
List<SendConversionResult> results = new(revitElements.Count);
foreach (Element revitElement in atomicObjects)
{
ct.ThrowIfCancellationRequested();
string applicationId = revitElement.UniqueId; // NOTE: converter set applicationIds to unique ids; if we ever change this in the converter, behaviour here needs to match.
string sourceType = revitElement.GetType().Name;
try
else
{
Base converted;
if (_sendConversionCache.TryGetValue(sendInfo.ProjectId, applicationId, out ObjectReference? value))
{
converted = value;
cacheHitCount++;
}
else
{
converted = _converter.Convert(revitElement);
converted.applicationId = applicationId;
}
var collection = _sendCollectionManager.GetAndCreateObjectHostCollection(revitElement, _rootObject);
collection.elements.Add(converted);
results.Add(new(Status.SUCCESS, applicationId, sourceType, converted));
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogSendConversionError(ex, sourceType);
results.Add(new(Status.ERROR, applicationId, sourceType, null, ex));
converted = await RevitTask.RunAsync(() => _converter.Convert(revitElement)).ConfigureAwait(false); // Could we run these batched? Is there maybe a performance penalty for running these to speckle conversions individually in revittask.runasync?
converted.applicationId = applicationId;
}
onOperationProgressed?.Invoke("Converting", (double)++countProgress / atomicObjects.Count);
var collection = _sendCollectionManager.GetAndCreateObjectHostCollection(revitElement, _rootObject);
collection.elements.Add(converted);
results.Add(new(Status.SUCCESS, applicationId, sourceType, converted));
}
if (results.All(x => x.Status == Status.ERROR))
catch (Exception ex) when (!ex.IsFatal())
{
throw new SpeckleConversionException("Failed to convert all objects."); // fail fast instead creating empty commit! It will appear as model card error with red color.
_logger.LogSendConversionError(ex, sourceType);
results.Add(new(Status.ERROR, applicationId, sourceType, null, ex));
}
var idsAndSubElementIds = _elementUnpacker.GetElementsAndSubelementIdsFromAtomicObjects(atomicObjects);
var materialProxies = _conversionContextStack.RenderMaterialProxyCache.GetRenderMaterialProxyListForObjects(
idsAndSubElementIds
);
_rootObject["renderMaterialProxies"] = materialProxies;
onOperationProgressed?.Invoke("Converting", (double)++countProgress / atomicObjects.Count);
}
Debug.WriteLine(
$"Cache hit count {cacheHitCount} out of {objects.Count} ({(double)cacheHitCount / objects.Count})"
);
if (results.All(x => x.Status == Status.ERROR))
{
throw new SpeckleConversionException("Failed to convert all objects.");
}
return new RootObjectBuilderResult(_rootObject, results);
});
var idsAndSubElementIds = _elementUnpacker.GetElementsAndSubelementIdsFromAtomicObjects(atomicObjects);
var materialProxies = _revitToSpeckleCacheSingleton.GetRenderMaterialProxyListForObjects(idsAndSubElementIds);
_rootObject[ProxyKeys.RENDER_MATERIAL] = materialProxies;
// NOTE: these are currently not used anywhere, so we could even skip them (?).
_rootObject[ProxyKeys.PARAMETER_DEFINITIONS] = _parameterDefinitionHandler.Definitions;
return new RootObjectBuilderResult(_rootObject, results);
}
}
@@ -0,0 +1,12 @@
using Speckle.Connectors.DUI.Settings;
namespace Speckle.Connectors.Revit.Operations.Send.Settings;
public class SendParameterNullOrEmptyStringsSetting(bool value) : ICardSetting
{
public string? Id { get; set; } = "nullemptyparams";
public string? Title { get; set; } = "Send null/empty parameters";
public string? Type { get; set; } = "boolean";
public List<string>? Enum { get; set; }
public object? Value { get; set; } = value;
}
@@ -1,15 +1,17 @@
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Speckle.Connectors.Common.Caching;
using Speckle.Connectors.DUI.Models.Card;
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;
@@ -18,6 +20,7 @@ public class ToSpeckleSettingsManager
// cache invalidation process run with ModelCardId since the settings are model specific
private readonly Dictionary<string, DetailLevelType> _detailLevelCache = new();
private readonly Dictionary<string, Transform?> _referencePointCache = new();
private readonly Dictionary<string, bool?> _sendNullParamsCache = new();
public ToSpeckleSettingsManager(
RevitContext revitContext,
@@ -30,15 +33,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 (
@@ -50,9 +45,7 @@ public class ToSpeckleSettingsManager
{
if (previousType != fidelity)
{
var objectIds = modelCard.SendFilter != null ? modelCard.SendFilter.GetObjectIds() : [];
var unpackedObjectIds = _elementUnpacker.GetUnpackedElementIds(objectIds);
_sendConversionCache.EvictObjects(unpackedObjectIds);
EvictCacheForModelCard(modelCard);
}
}
_detailLevelCache[modelCard.ModelCardId.NotNull()] = fidelity;
@@ -62,7 +55,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 (
@@ -82,9 +75,7 @@ public class ToSpeckleSettingsManager
// invalidate conversion cache if the transform has changed
if (previousTransform != currentTransform)
{
var objectIds = modelCard.SendFilter != null ? modelCard.SendFilter.GetObjectIds() : [];
var unpackedObjectIds = _elementUnpacker.GetUnpackedElementIds(objectIds);
_sendConversionCache.EvictObjects(unpackedObjectIds);
EvictCacheForModelCard(modelCard);
}
}
@@ -95,6 +86,29 @@ public class ToSpeckleSettingsManager
throw new ArgumentException($"Invalid reference point value: {referencePointString}");
}
public bool GetSendParameterNullOrEmptyStringsSetting(SenderModelCard modelCard)
{
var value = modelCard.Settings?.First(s => s.Id == "nullemptyparams").Value as bool?;
var returnValue = value != null && value.NotNull();
if (_sendNullParamsCache.TryGetValue(modelCard.ModelCardId.NotNull(), out bool? previousValue))
{
if (previousValue != returnValue)
{
EvictCacheForModelCard(modelCard);
}
}
_sendNullParamsCache[modelCard.ModelCardId] = returnValue;
return returnValue;
}
private void EvictCacheForModelCard(SenderModelCard modelCard)
{
var objectIds = modelCard.SendFilter != null ? modelCard.SendFilter.GetObjectIds() : [];
var unpackedObjectIds = _elementUnpacker.GetUnpackedElementIds(objectIds);
_sendConversionCache.EvictObjects(unpackedObjectIds);
}
private Transform? GetTransform(RevitContext context, ReferencePointType referencePointType)
{
Transform? referencePointTransform = null;
@@ -6,10 +6,11 @@ using System.Windows.Media.Imaging;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.UI;
using CefSharp;
using Microsoft.Extensions.DependencyInjection;
using Revit.Async;
using Speckle.Connectors.Common;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.Utils;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Sdk;
@@ -18,24 +19,27 @@ namespace Speckle.Connectors.Revit.Plugin;
internal sealed class RevitCefPlugin : IRevitPlugin
{
private readonly UIControlledApplication _uIControlledApplication;
private readonly IEnumerable<Lazy<IBinding>> _bindings; // should be lazy to ensure the bindings are not created too early
private readonly IServiceProvider _serviceProvider; // should be lazy to ensure the bindings are not created too early
private readonly BindingOptions _bindingOptions;
private readonly RevitContext _revitContext;
private readonly CefSharpPanel _cefSharpPanel;
private readonly ISpeckleApplication _speckleApplication;
public RevitCefPlugin(
UIControlledApplication uIControlledApplication,
IEnumerable<Lazy<IBinding>> bindings,
IServiceProvider serviceProvider,
BindingOptions bindingOptions,
RevitContext revitContext,
CefSharpPanel cefSharpPanel
CefSharpPanel cefSharpPanel,
ISpeckleApplication speckleApplication
)
{
_uIControlledApplication = uIControlledApplication;
_bindings = bindings;
_serviceProvider = serviceProvider;
_bindingOptions = bindingOptions;
_revitContext = revitContext;
_cefSharpPanel = cefSharpPanel;
_speckleApplication = speckleApplication;
}
public void Initialise()
@@ -70,7 +74,7 @@ internal sealed class RevitCefPlugin : IRevitPlugin
var dui3Button = (PushButton)
specklePanel.AddItem(
new PushButtonData(
Connector.Name,
_speckleApplication.HostApplication,
Connector.TabTitle,
typeof(RevitExternalApplication).Assembly.Location,
typeof(SpeckleRevitCommand).FullName
@@ -78,13 +82,16 @@ internal sealed class RevitCefPlugin : IRevitPlugin
);
string path = typeof(RevitCefPlugin).Assembly.Location;
dui3Button.Image = LoadPngImgSource($"Speckle.Connectors.Revit{Connector.VersionString}.Assets.logo16.png", path);
dui3Button.Image = LoadPngImgSource(
$"Speckle.Connectors.Revit{_speckleApplication.HostApplicationVersion}.Assets.logo16.png",
path
);
dui3Button.LargeImage = LoadPngImgSource(
$"Speckle.Connectors.Revit{Connector.VersionString}.Assets.logo32.png",
$"Speckle.Connectors.Revit{_speckleApplication.HostApplicationVersion}.Assets.logo32.png",
path
);
dui3Button.ToolTipImage = LoadPngImgSource(
$"Speckle.Connectors.Revit{Connector.VersionString}.Assets.logo32.png",
$"Speckle.Connectors.Revit{_speckleApplication.HostApplicationVersion}.Assets.logo32.png",
path
);
dui3Button.ToolTip = "Speckle (Beta) for Revit";
@@ -108,8 +115,9 @@ internal sealed class RevitCefPlugin : IRevitPlugin
/// </summary>
private void PostApplicationInit()
{
var bindings = _serviceProvider.GetRequiredService<IEnumerable<IBinding>>();
// binding the bindings to each bridge
foreach (IBinding binding in _bindings.Select(x => x.Value))
foreach (IBinding binding in bindings)
{
Debug.WriteLine(binding.Name);
binding.Parent.AssociateWithBinding(binding);
@@ -122,12 +130,12 @@ internal sealed class RevitCefPlugin : IRevitPlugin
return;
}
#if DEBUG
#if DEBUG || LOCAL
_cefSharpPanel.Browser.ShowDevTools();
#endif
foreach (IBinding binding in _bindings.Select(x => x.Value))
foreach (IBinding binding in bindings)
{
IBridge bridge = binding.Parent;
IBrowserBridge bridge = binding.Parent;
#if REVIT2025_OR_GREATER
_cefSharpPanel.Browser.JavascriptObjectRepository.Register(bridge.FrontendBoundName, bridge, _bindingOptions);
@@ -1,11 +1,11 @@
using System.IO;
using System.Reflection;
using Autodesk.Revit.UI;
using Speckle.Autofac;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.Utils;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Common;
using Speckle.Connectors.DUI;
using Speckle.Connectors.Revit.DependencyInjection;
using Speckle.Converters.RevitShared;
using Speckle.Sdk;
using Speckle.Sdk.Common;
using Speckle.Sdk.Host;
namespace Speckle.Connectors.Revit.Plugin;
@@ -14,7 +14,7 @@ internal sealed class RevitExternalApplication : IExternalApplication
{
private IRevitPlugin? _revitPlugin;
private SpeckleContainer? _container;
private ServiceProvider? _container;
private IDisposable? _disposableLogger;
// POC: move to somewhere central?
@@ -41,23 +41,25 @@ internal sealed class RevitExternalApplication : IExternalApplication
{
// POC: not sure what this is doing... could be messing up our Aliasing????
AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver.OnAssemblyResolve<RevitExternalApplication>;
var services = new ServiceCollection();
// init DI
_disposableLogger = Connector.Initialize(HostApplications.Revit, GetVersion());
_container = SpeckleContainerBuilder
.CreateInstance()
.LoadAutofacModules(
Assembly.GetExecutingAssembly(),
[Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).NotNull()]
)
.AddSingleton(application) // inject UIControlledApplication application
.Build();
_disposableLogger = services.Initialize(HostApplications.Revit, GetVersion());
services.AddRevit();
services.AddRevitConverters();
services.AddSingleton(application);
_container = services.BuildServiceProvider();
_container.UseDUI();
// resolve root object
_revitPlugin = _container.Resolve<IRevitPlugin>();
_revitPlugin = _container.GetRequiredService<IRevitPlugin>();
_revitPlugin.Initialise();
}
catch (Exception e) when (!e.IsFatal())
{
_container
.GetRequiredService<ILoggerFactory>()
.CreateLogger<RevitExternalApplication>()
.LogCritical(e, "Unhandled exception");
// POC: feedback?
return Result.Failed;
}
@@ -74,6 +76,7 @@ internal sealed class RevitExternalApplication : IExternalApplication
// need to look for commonality
_revitPlugin?.Shutdown();
_disposableLogger?.Dispose();
_container?.Dispose();
}
catch (Exception e) when (!e.IsFatal())
{
@@ -7,7 +7,7 @@ using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.UI;
using Revit.Async;
using Speckle.Connectors.DUI.WebView;
using Speckle.Connectors.Utils;
using Speckle.Connectors.Common;
using Speckle.Converters.RevitShared.Helpers;
using Speckle.Sdk;
@@ -18,6 +18,7 @@ internal sealed class RevitWebViewPlugin : IRevitPlugin
private readonly UIControlledApplication _uIControlledApplication;
private readonly RevitContext _revitContext;
private readonly DUI3ControlWebViewDockable _webViewPanel;
private readonly ISpeckleApplication _speckleApplication;
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Style",
@@ -27,12 +28,14 @@ internal sealed class RevitWebViewPlugin : IRevitPlugin
public RevitWebViewPlugin(
UIControlledApplication uIControlledApplication,
RevitContext revitContext,
DUI3ControlWebViewDockable webViewPanel
DUI3ControlWebViewDockable webViewPanel,
ISpeckleApplication speckleApplication
)
{
_uIControlledApplication = uIControlledApplication;
_revitContext = revitContext;
_webViewPanel = webViewPanel;
_speckleApplication = speckleApplication;
}
public void Initialise()
@@ -75,13 +78,16 @@ internal sealed class RevitWebViewPlugin : IRevitPlugin
);
string path = typeof(RevitWebViewPlugin).Assembly.Location;
dui3Button.Image = LoadPngImgSource($"Speckle.Connectors.Revit{Connector.VersionString}.Assets.logo16.png", path);
dui3Button.Image = LoadPngImgSource(
$"Speckle.Connectors.Revit{_speckleApplication.HostApplicationVersion}.Assets.logo16.png",
path
);
dui3Button.LargeImage = LoadPngImgSource(
$"Speckle.Connectors.Revit{Connector.VersionString}.Assets.logo32.png",
$"Speckle.Connectors.Revit{_speckleApplication.HostApplicationVersion}.Assets.logo32.png",
path
);
dui3Button.ToolTipImage = LoadPngImgSource(
$"Speckle.Connectors.Revit{Connector.VersionString}.Assets.logo32.png",
$"Speckle.Connectors.Revit{_speckleApplication.HostApplicationVersion}.Assets.logo32.png",
path
);
dui3Button.ToolTip = "Speckle (Beta) for Revit";
@@ -22,10 +22,14 @@
<Compile Include="$(MSBuildThisFileDirectory)ElementIdHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\DocumentModelStorageSchema.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Elements.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\RevitMaterialBaker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\HideWarningsFailuresPreprocessor.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\IdStorageSchema.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\IStorageSchema.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\RevitDocumentStore.cs" />
<Compile Include="$(MSBuildThisFileDirectory)DependencyInjection\RevitConnectorModule.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\RevitGroupBaker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\RevitUtils.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\SendCollectionManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)HostApp\ElementUnpacker.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\ITransactionManager.cs" />
@@ -33,6 +37,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\RevitHostObjectBuilder.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\TransactionManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\RevitRootObjectBuilder.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Settings\SendParameterNullOrEmptyStringsSetting.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Settings\ToSpeckleSettingsManager.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Settings\ReferencePointSetting.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Settings\DetailLevelSetting.cs" />
@@ -4,6 +4,12 @@
<Configurations>Debug;Release;Local</Configurations>
<RhinoVersion>7</RhinoVersion>
<DefineConstants>$(DefineConstants);RHINO7;RHINO7_OR_GREATER</DefineConstants>
<TargetExt>.rhp</TargetExt>
<StartProgram>$(ProgramFiles)\Rhino $(RhinoVersion)\System\Rhino.exe</StartProgram>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
<UseWpf>true</UseWpf>
<UseWindowsForms>true</UseWindowsForms>
<GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources>
</PropertyGroup>
<ItemGroup>
@@ -12,13 +18,15 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Rhino\Speckle.Converters.Rhino7.DependencyInjection\Speckle.Converters.Rhino7.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Autofac\Speckle.Autofac.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Utils\Speckle.Connectors.Utils.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common.DependencyInjection\Speckle.Converters.Common.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
<ProjectReference Include="..\..\..\Converters\Rhino\Speckle.Converters.Rhino7\Speckle.Converters.Rhino7.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="EmbeddedResources\**\*" />
<EmbeddedResource Include="Resources\**\*.ico" />
</ItemGroup>
<Import Project="..\Speckle.Connectors.RhinoShared\Speckle.Connectors.RhinoShared.projitems" Label="Shared" />
</Project>
@@ -2,6 +2,15 @@
"version": 2,
"dependencies": {
".NETFramework,Version=v4.8": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -71,14 +80,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -108,61 +109,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -196,11 +193,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -233,22 +225,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -262,8 +254,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -275,32 +267,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -310,24 +278,21 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -338,28 +303,14 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.rhino7": {
@@ -369,38 +320,32 @@
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"speckle.converters.rhino7.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Converters.Rhino7": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.Web.WebView2": {
"type": "CentralTransitive",
@@ -410,29 +355,29 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -4,21 +4,29 @@
<Configurations>Debug;Release;Local</Configurations>
<RhinoVersion>8</RhinoVersion>
<DefineConstants>$(DefineConstants);RHINO8;RHINO7_OR_GREATER;RHIN08_OR_GREATER</DefineConstants>
<TargetExt>.rhp</TargetExt>
<StartProgram>$(ProgramFiles)\Rhino $(RhinoVersion)\System\Rhino.exe</StartProgram>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
<UseWpf>true</UseWpf>
<UseWindowsForms>true</UseWindowsForms>
<GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RhinoCommon" NoWarn="NU1701" IncludeAssets="compile; build" PrivateAssets="all" />
<PackageReference Include="RhinoWindows" NoWarn="NU1701" IncludeAssets="compile; build" PrivateAssets="all" />
<PackageReference Include="RhinoCommon" IncludeAssets="compile; build" PrivateAssets="all" />
<PackageReference Include="RhinoWindows" IncludeAssets="compile; build" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Converters\Rhino\Speckle.Converters.Rhino8.DependencyInjection\Speckle.Converters.Rhino8.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Autofac\Speckle.Autofac.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Utils\Speckle.Connectors.Utils.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common.DependencyInjection\Speckle.Converters.Common.DependencyInjection.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
<ProjectReference Include="..\..\..\Converters\Rhino\Speckle.Converters.Rhino8\Speckle.Converters.Rhino8.csproj" />
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="EmbeddedResources\**\*" />
<EmbeddedResource Include="Resources\**\*.ico" />
</ItemGroup>
<Import Project="..\Speckle.Connectors.RhinoShared\Speckle.Connectors.RhinoShared.projitems" Label="Shared" />
@@ -2,6 +2,15 @@
"version": 2,
"dependencies": {
".NETFramework,Version=v4.8": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct",
"requested": "[1.0.3, )",
"resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
@@ -71,14 +80,6 @@
"resolved": "6.0.0",
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
"dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -108,61 +109,57 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "Lu41BWNmwhKr6LgyQvcYBOge0pPvmiaK8R5UHXX4//wBhonJyWcT2OK1mqYfEM5G7pTf31fPrpIHOT6sN7EGOA==",
"resolved": "2.2.0",
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "ESz6bVoDQX7sgWdKHF6G9Pq672T8k+19AFb/txDXwdz7MoqaNQj2/in3agm/3qae9V+WvQZH86LLTNVo0it8vQ==",
"resolved": "2.2.0",
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"dependencies": {
"Microsoft.Extensions.Primitives": "3.1.0"
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "o9eELDBfNkR7sUtYysFZ1Q7BQ1mYt27DMkups/3vu7xgPyOpMD+iAfrBZFzUXT2iw0fmFb8s1gfNBZS+IgjKdQ==",
"resolved": "2.2.0",
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "3.1.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "KVkv3aF2MQpmGFRh4xRx2CNbc2sjDFk+lH4ySrjWSOS+XoY1Xc+sJphw3N0iYOpoeCCq8976ceVYDH8sdx2qIQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0"
"Microsoft.Extensions.Configuration": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "44rDtOf1JXXAFpNT2EXMExaDm/4OJ2RXOL9i9lE4bK427nzC7Exphv+beB6IgluyE2GIoo8zezTStMXI7MQ8WA=="
"resolved": "2.2.0",
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "9b6JHY7TAXrSfZ6EEGf+j8XnqKIiMPErfmaNXhJYSCb+BUW2H4RtzkNJvwLJzwgzqBP0wtTjyA6Uw4BPPdmkMw==",
"resolved": "2.2.0",
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.0",
"Microsoft.Extensions.Primitives": "3.1.0",
"System.ComponentModel.Annotations": "4.7.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "3.1.0",
"contentHash": "LEKAnX7lhUhSoIc2XraCTK3M4IU/LdVUzCe464Sa4+7F4ZJuXHHRzZli2mDbiT4xzAZhgqXbvfnb5+CNDcQFfg==",
"resolved": "2.2.0",
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"dependencies": {
"System.Memory": "4.5.2",
"System.Runtime.CompilerServices.Unsafe": "4.7.0"
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
"type": "Transitive",
"resolved": "1.0.3",
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
@@ -196,11 +193,6 @@
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
},
"Speckle.Sdk.Logging": {
"type": "Transitive",
"resolved": "3.0.1-rc.118",
"contentHash": "rzzJTTlTyeC7O2XOBAGqTrAbd7vk245mXat1v2okqlnEIvoAQj+kiId53v69i+3jv9svoqohkvaWJ2ZD8MkDXA=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -233,22 +225,22 @@
},
"System.Buffers": {
"type": "Transitive",
"resolved": "4.5.1",
"contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
"resolved": "4.4.0",
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
},
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "0YFqjhp/mYkDGpU0Ye1GjE53HMp9UVfGN7seGpAMttAC0C40v5gw598jCgpbBLMmCo0E5YRLBv5Z2doypO49ZQ=="
"resolved": "4.5.0",
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
"resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
"System.Buffers": "4.4.0",
"System.Numerics.Vectors": "4.4.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"System.Net.WebSockets.Client.Managed": {
@@ -262,8 +254,8 @@
},
"System.Numerics.Vectors": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
"resolved": "4.4.0",
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
},
"System.Reactive": {
"type": "Transitive",
@@ -275,32 +267,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ==",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4"
}
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "5.0.2",
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Buffers": "4.5.1",
"System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
"System.Text.Encodings.Web": "5.0.1",
"System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0"
}
"resolved": "4.5.3",
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
@@ -310,24 +278,21 @@
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
}
},
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
},
"speckle.autofac": {
"speckle.connectors.common": {
"type": "Project",
"dependencies": {
"Autofac": "[5.2.0, )"
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )",
"Speckle.Sdk": "[3.1.0-dev.146, )"
}
},
"speckle.connectors.dui": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Connectors.Utils": "[1.0.0, )",
"Speckle.Sdk": "[3.0.1-rc.118, )",
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
"Speckle.Sdk": "[3.1.0-dev.146, )",
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
}
},
@@ -338,28 +303,14 @@
"Speckle.Connectors.DUI": "[1.0.0, )"
}
},
"speckle.connectors.utils": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )",
"Speckle.Sdk": "[3.0.1-rc.118, )"
}
"speckle.connectors.logging": {
"type": "Project"
},
"speckle.converters.common": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[3.1.0, )",
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Objects": "[3.0.1-rc.118, )"
}
},
"speckle.converters.common.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Autofac": "[1.0.0, )",
"Speckle.Converters.Common": "[1.0.0, )"
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
"Speckle.Objects": "[3.1.0-dev.146, )"
}
},
"speckle.converters.rhino8": {
@@ -369,38 +320,32 @@
"Speckle.Converters.Common": "[1.0.0, )"
}
},
"speckle.converters.rhino8.dependencyinjection": {
"type": "Project",
"dependencies": {
"Speckle.Converters.Rhino8": "[1.0.0, )"
}
},
"Autofac": {
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[5.2.0, )",
"resolved": "5.2.0",
"contentHash": "V8dBH0dsv75uDzl7Sw+HkhKDPUw2eXnlMjcSVMH+tLo2s67MpTKGyDj1pDcpR+IF2u4YRs0s3/x7R88YJzIWvg==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "1.1.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "P+8sKQ8L4ooL79sxxqwFPxGGC3aBrUDLB/dZqhs4J0XjTyrkeeyJQ4D4nzJB6OnAhy78HIIgQ/RbD6upOXLynw==",
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "3.1.0",
"Microsoft.Extensions.DependencyInjection": "3.1.0",
"Microsoft.Extensions.Logging.Abstractions": "3.1.0",
"Microsoft.Extensions.Options": "3.1.0"
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[3.1.0, )",
"resolved": "3.1.0",
"contentHash": "jjo4YXRx6MIpv6DiRxJjSpl+sPP0+5VW0clMEdLyIAz44PPwrDTFrd5PZckIxIXl1kKZ2KK6IL2nkt0+ug2MQg=="
"requested": "[2.2.0, )",
"resolved": "2.2.0",
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
},
"Microsoft.Web.WebView2": {
"type": "CentralTransitive",
@@ -410,29 +355,29 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "5VgLOrOMGsdGqZJwZXjyUrLX+kO+wb6qy0nQgDWuHG+aZdPyGmjyLW3YeaCnDQBu/uDJnQu7ddj5LqbIlTif0w==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "xuv5LaU6j8ODGHyClHbbK78bOJid8LGuwfVcEega1q3sYwmLWOWIDP9lO0QA1tyctE+2CZDH3sOUChleAFC4fg==",
"dependencies": {
"Speckle.Sdk": "3.0.1-rc.118"
"Speckle.Sdk": "3.1.0-dev.146"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
"requested": "[3.0.1-rc.118, )",
"resolved": "3.0.1-rc.118",
"contentHash": "cKiVG0LMRmF4vgTWq2L8xOYoTGiAF9n8OyycmWHCdW6l7wLTre6B4AOWtW9j9NA427C3sJmZ4R9dSbNYRLxDRQ==",
"requested": "[3.1.0-dev.146, )",
"resolved": "3.1.0-dev.146",
"contentHash": "vNaWJkt7/xcIH/CraOrEumGn8A6gAlyl1RHfRI8B8qAGylSlEhuvuBSatS1gUPI35p9omO63yYQFKaIKEIsa3Q==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.Data.Sqlite": "7.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging": "2.2.0",
"Polly": "7.2.3",
"Polly.Contrib.WaitAndRetry": "1.1.1",
"Polly.Extensions.Http": "3.0.0",
"Speckle.DoubleNumerics": "4.0.1",
"Speckle.Newtonsoft.Json": "13.0.2",
"Speckle.Sdk.Logging": "3.0.1-rc.118",
"System.Text.Json": "5.0.2"
"Speckle.Newtonsoft.Json": "13.0.2"
}
},
"System.Threading.Tasks.Dataflow": {
@@ -6,7 +6,7 @@ using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Rhino.Extensions;
using Speckle.Connectors.Utils.Common;
using Speckle.Sdk;
using Speckle.Sdk.Common;
namespace Speckle.Connectors.Rhino.Bindings;
@@ -14,15 +14,21 @@ namespace Speckle.Connectors.Rhino.Bindings;
public class RhinoBasicConnectorBinding : IBasicConnectorBinding
{
public string Name => "baseBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
public BasicConnectorBindingCommands Commands { get; }
private readonly DocumentModelStore _store;
private readonly ISpeckleApplication _speckleApplication;
public RhinoBasicConnectorBinding(DocumentModelStore store, IBridge parent)
public RhinoBasicConnectorBinding(
DocumentModelStore store,
IBrowserBridge parent,
ISpeckleApplication speckleApplication
)
{
_store = store;
Parent = parent;
_speckleApplication = speckleApplication;
Commands = new BasicConnectorBindingCommands(parent);
_store.DocumentChanged += (_, _) =>
@@ -31,11 +37,11 @@ public class RhinoBasicConnectorBinding : IBasicConnectorBinding
};
}
public string GetConnectorVersion() => typeof(RhinoBasicConnectorBinding).Assembly.GetVersion();
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
public string GetSourceApplicationName() => Speckle.Connectors.Utils.Connector.Slug;
public string GetSourceApplicationName() => _speckleApplication.Slug;
public string GetSourceApplicationVersion() => "7";
public string GetSourceApplicationVersion() => _speckleApplication.HostApplicationVersion;
public DocumentInfo? GetDocumentInfo()
{
@@ -1,13 +1,18 @@
using Microsoft.Extensions.Logging;
using Speckle.Autofac.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Rhino;
using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Cancellation;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Logging;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Connectors.DUI.Settings;
using Speckle.Connectors.Rhino.Operations.Send.Settings;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
namespace Speckle.Connectors.Rhino.Bindings;
@@ -15,38 +20,51 @@ namespace Speckle.Connectors.Rhino.Bindings;
public class RhinoReceiveBinding : IReceiveBinding
{
public string Name => "receiveBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
private readonly CancellationManager _cancellationManager;
private readonly DocumentModelStore _store;
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IServiceProvider _serviceProvider;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<RhinoReceiveBinding> _logger;
private readonly IRhinoConversionSettingsFactory _rhinoConversionSettingsFactory;
private readonly ISpeckleApplication _speckleApplication;
private ReceiveBindingUICommands Commands { get; }
public RhinoReceiveBinding(
DocumentModelStore store,
CancellationManager cancellationManager,
IBridge parent,
IUnitOfWorkFactory unitOfWorkFactory,
IBrowserBridge parent,
IOperationProgressManager operationProgressManager,
ILogger<RhinoReceiveBinding> logger
ILogger<RhinoReceiveBinding> logger,
IRhinoConversionSettingsFactory rhinoConversionSettingsFactory,
IServiceProvider serviceProvider,
ISpeckleApplication speckleApplication
)
{
Parent = parent;
_store = store;
_unitOfWorkFactory = unitOfWorkFactory;
_operationProgressManager = operationProgressManager;
_logger = logger;
_rhinoConversionSettingsFactory = rhinoConversionSettingsFactory;
_serviceProvider = serviceProvider;
_speckleApplication = speckleApplication;
_cancellationManager = cancellationManager;
Commands = new ReceiveBindingUICommands(parent);
}
#pragma warning disable CA1024
public List<ICardSetting> GetReceiveSettings() => [new EnableLiveSession(false)];
#pragma warning restore CA1024
public void CancelReceive(string modelCardId) => _cancellationManager.CancelOperation(modelCardId);
public async Task Receive(string modelCardId)
{
using var unitOfWork = _unitOfWorkFactory.Resolve<ReceiveOperation>();
using var scope = _serviceProvider.CreateScope();
scope
.ServiceProvider.GetRequiredService<IConverterSettingsStore<RhinoConversionSettings>>()
.Initialize(_rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
try
{
// Get receiver card
@@ -59,9 +77,10 @@ public class RhinoReceiveBinding : IReceiveBinding
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
// Receive host objects
HostObjectBuilderResult conversionResults = await unitOfWork
.Service.Execute(
modelCard.GetReceiveInfo(Speckle.Connectors.Utils.Connector.Slug),
HostObjectBuilderResult conversionResults = await scope
.ServiceProvider.GetRequiredService<ReceiveOperation>()
.Execute(
modelCard.GetReceiveInfo(_speckleApplication.Slug),
cancellationToken,
(status, progress) =>
_operationProgressManager.SetModelProgress(
@@ -12,9 +12,9 @@ public class RhinoSelectionBinding : ISelectionBinding
private const string SELECTION_EVENT = "setSelection";
public string Name => "selectionBinding";
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
public RhinoSelectionBinding(IRhinoIdleManager idleManager, IBridge parent)
public RhinoSelectionBinding(IRhinoIdleManager idleManager, IBrowserBridge parent)
{
_idleManager = idleManager;
Parent = parent;
@@ -1,9 +1,12 @@
using System.Collections.Concurrent;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Rhino;
using Rhino.Commands;
using Rhino.DocObjects;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.Common.Caching;
using Speckle.Connectors.Common.Cancellation;
using Speckle.Connectors.Common.Operations;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Exceptions;
@@ -13,9 +16,9 @@ using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
using Speckle.Connectors.DUI.Settings;
using Speckle.Connectors.Rhino.HostApp;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Operations;
using Speckle.Connectors.Rhino.Operations.Send.Settings;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
using Speckle.Sdk.Common;
@@ -25,17 +28,19 @@ public sealed class RhinoSendBinding : ISendBinding
{
public string Name => "sendBinding";
public SendBindingUICommands Commands { get; }
public IBridge Parent { get; }
public IBrowserBridge Parent { get; }
private readonly DocumentModelStore _store;
private readonly IRhinoIdleManager _idleManager;
private readonly IUnitOfWorkFactory _unitOfWorkFactory;
private readonly IServiceProvider _serviceProvider;
private readonly List<ISendFilter> _sendFilters;
private readonly CancellationManager _cancellationManager;
private readonly ISendConversionCache _sendConversionCache;
private readonly IOperationProgressManager _operationProgressManager;
private readonly ILogger<RhinoSendBinding> _logger;
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
private readonly IRhinoConversionSettingsFactory _rhinoConversionSettingsFactory;
private readonly ISpeckleApplication _speckleApplication;
/// <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:
@@ -48,23 +53,27 @@ public sealed class RhinoSendBinding : ISendBinding
public RhinoSendBinding(
DocumentModelStore store,
IRhinoIdleManager idleManager,
IBridge parent,
IBrowserBridge parent,
IEnumerable<ISendFilter> sendFilters,
IUnitOfWorkFactory unitOfWorkFactory,
IServiceProvider serviceProvider,
CancellationManager cancellationManager,
ISendConversionCache sendConversionCache,
IOperationProgressManager operationProgressManager,
ILogger<RhinoSendBinding> logger
ILogger<RhinoSendBinding> logger,
IRhinoConversionSettingsFactory rhinoConversionSettingsFactory,
ISpeckleApplication speckleApplication
)
{
_store = store;
_idleManager = idleManager;
_unitOfWorkFactory = unitOfWorkFactory;
_serviceProvider = serviceProvider;
_sendFilters = sendFilters.ToList();
_cancellationManager = cancellationManager;
_sendConversionCache = sendConversionCache;
_operationProgressManager = operationProgressManager;
_logger = logger;
_rhinoConversionSettingsFactory = rhinoConversionSettingsFactory;
_speckleApplication = speckleApplication;
_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.
@@ -142,11 +151,14 @@ public sealed class RhinoSendBinding : ISendBinding
public List<ISendFilter> GetSendFilters() => _sendFilters;
public List<ICardSetting> GetSendSettings() => [];
public List<ICardSetting> GetSendSettings() => [new EnableLiveSession(false)];
public async Task Send(string modelCardId)
{
using var unitOfWork = _unitOfWorkFactory.Resolve<SendOperation<RhinoObject>>();
using var scope = _serviceProvider.CreateScope();
scope
.ServiceProvider.GetRequiredService<IConverterSettingsStore<RhinoConversionSettings>>()
.Initialize(_rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
try
{
if (_store.GetModelById(modelCardId) is not SenderModelCard modelCard)
@@ -170,10 +182,11 @@ public sealed class RhinoSendBinding : ISendBinding
throw new SpeckleSendFilterException("No objects were found to convert. Please update your publish filter!");
}
var sendResult = await unitOfWork
.Service.Execute(
var sendResult = await scope
.ServiceProvider.GetRequiredService<SendOperation<RhinoObject>>()
.Execute(
rhinoObjects,
modelCard.GetSendInfo(Speckle.Connectors.Utils.Connector.Slug),
modelCard.GetSendInfo(_speckleApplication.Slug),
(status, progress) =>
_operationProgressManager.SetModelProgress(
Parent,
@@ -1,98 +0,0 @@
using Autofac;
using Rhino.Commands;
using Rhino.DocObjects;
using Rhino.PlugIns;
using Speckle.Autofac;
using Speckle.Autofac.DependencyInjection;
using Speckle.Connectors.DUI;
using Speckle.Connectors.DUI.Bindings;
using Speckle.Connectors.DUI.Bridge;
using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
using Speckle.Connectors.DUI.WebView;
using Speckle.Connectors.Rhino.Bindings;
using Speckle.Connectors.Rhino.Filters;
using Speckle.Connectors.Rhino.HostApp;
using Speckle.Connectors.Rhino.Operations.Receive;
using Speckle.Connectors.Rhino.Operations.Send;
using Speckle.Connectors.Rhino.Plugin;
using Speckle.Connectors.Utils;
using Speckle.Connectors.Utils.Builders;
using Speckle.Connectors.Utils.Caching;
using Speckle.Connectors.Utils.Cancellation;
using Speckle.Connectors.Utils.Instances;
using Speckle.Connectors.Utils.Operations;
using Speckle.Sdk.Models.GraphTraversal;
namespace Speckle.Connectors.Rhino.DependencyInjection;
public class RhinoConnectorModule : ISpeckleModule
{
public void Load(SpeckleContainerBuilder builder)
{
// Register instances initialised by Rhino
builder.AddSingleton<PlugIn>(SpeckleConnectorsRhinoPlugin.Instance);
builder.AddSingleton<Command>(SpeckleConnectorsRhinoCommand.Instance);
builder.AddAutofac();
builder.AddConnectorUtils();
builder.AddDUI();
builder.AddDUIView();
// POC: Overwriting the SyncToMainThread to SyncToCurrentThread for Rhino!
builder.AddSingletonInstance<ISyncToThread, SyncToCurrentThread>();
// Register other connector specific types
builder.AddSingleton<IRhinoPlugin, RhinoPlugin>();
builder.AddSingleton<DocumentModelStore, RhinoDocumentStore>();
builder.AddSingleton<IRhinoIdleManager, RhinoIdleManager>();
// Register bindings
builder.AddSingleton<IBinding, TestBinding>();
builder.AddSingleton<IBinding, ConfigBinding>("connectorName", "Rhino"); // POC: Easier like this for now, should be cleaned up later
builder.AddSingleton<IBinding, AccountBinding>();
builder.ContainerBuilder.RegisterType<TopLevelExceptionHandlerBinding>().As<IBinding>().AsSelf().SingleInstance();
builder.AddSingleton<ITopLevelExceptionHandler>(c =>
c.Resolve<TopLevelExceptionHandlerBinding>().Parent.TopLevelExceptionHandler
);
builder
.ContainerBuilder.RegisterType<RhinoBasicConnectorBinding>()
.As<IBinding>()
.As<IBasicConnectorBinding>()
.SingleInstance();
builder.AddSingleton<IBinding, RhinoSelectionBinding>();
builder.AddSingleton<IBinding, RhinoSendBinding>();
builder.AddSingleton<IBinding, RhinoReceiveBinding>();
// binding dependencies
builder.AddTransient<CancellationManager>();
// register send filters
builder.AddScoped<ISendFilter, RhinoSelectionFilter>();
builder.AddScoped<IHostObjectBuilder, RhinoHostObjectBuilder>();
// register send conversion cache
builder.AddSingleton<ISendConversionCache, SendConversionCache>();
// register send operation and dependencies
builder.AddScoped<SendOperation<RhinoObject>>();
builder.AddSingleton(DefaultTraversal.CreateTraversalFunc());
builder.AddScoped<IRootObjectBuilder<RhinoObject>, RhinoRootObjectBuilder>();
builder.AddScoped<
IInstanceObjectsManager<RhinoObject, List<string>>,
InstanceObjectsManager<RhinoObject, List<string>>
>();
builder.AddScoped<RhinoInstanceObjectsManager>();
builder.AddScoped<RhinoGroupManager>();
builder.AddScoped<RhinoLayerManager>();
builder.AddScoped<RhinoMaterialManager>();
builder.AddScoped<RhinoColorManager>();
// operation progress manager
builder.AddSingleton<IOperationProgressManager, OperationProgressManager>();
}
}
@@ -0,0 +1,63 @@
using Microsoft.Extensions.Logging;
using Rhino.DocObjects;
using Speckle.Sdk;
using Speckle.Sdk.Models.Proxies;
namespace Speckle.Connectors.Rhino.HostApp;
public class RhinoColorBaker
{
private readonly ILogger<RhinoColorBaker> _logger;
public RhinoColorBaker(ILogger<RhinoColorBaker> logger)
{
_logger = logger;
}
/// <summary>
/// For receive operations
/// </summary>
public Dictionary<string, (Color, ObjectColorSource)> ObjectColorsIdMap { get; } = new();
/// <summary>
/// Parse Color Proxies and stores in ObjectColorsIdMap the relationship between object ids and colors
/// </summary>
/// <param name="colorProxies"></param>
public void ParseColors(List<ColorProxy> colorProxies)
{
foreach (ColorProxy colorProxy in colorProxies)
{
try
{
ObjectColorSource source = ObjectColorSource.ColorFromObject;
if (colorProxy["source"] is string proxySource)
{
switch (proxySource)
{
case "layer":
continue; // skip any colors with source = layer, since object color default source is by layer
case "block":
source = ObjectColorSource.ColorFromParent;
break;
case "material":
source = ObjectColorSource.ColorFromMaterial;
break;
}
}
foreach (string objectId in colorProxy.objects)
{
Color convertedColor = Color.FromArgb(colorProxy.value);
if (!ObjectColorsIdMap.TryGetValue(objectId, out (Color, ObjectColorSource) _))
{
ObjectColorsIdMap.Add(objectId, (convertedColor, source));
}
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Error parsing color proxy"); // TODO: Check with Jedd!
}
}
}
}
@@ -1,19 +1,20 @@
using Microsoft.Extensions.Logging;
using Rhino;
using Rhino.DocObjects;
using Speckle.Connectors.Rhino.Extensions;
using Speckle.Sdk;
using Speckle.Sdk.Models.Proxies;
namespace Speckle.Connectors.Rhino.HostApp;
/// <summary>
/// Utility class managing colors on objects and layers. Expects to be a scoped dependency per send or receive operation.
/// </summary>
public class RhinoColorManager
public class RhinoColorUnpacker
{
/// <summary>
/// For receive operations
/// </summary>
public Dictionary<string, (Color, ObjectColorSource)> ObjectColorsIdMap { get; } = new();
private readonly ILogger<RhinoColorUnpacker> _logger;
public RhinoColorUnpacker(ILogger<RhinoColorUnpacker> logger)
{
_logger = logger;
}
/// <summary>
/// For send operations
@@ -65,7 +66,14 @@ public class RhinoColorManager
string id = color.GetSpeckleApplicationId(source);
string? name = color.IsNamedColor ? color.Name : null;
ColorProxy colorProxy = new(argb, id, name) { objects = new() };
ColorProxy colorProxy =
new()
{
value = argb,
applicationId = id,
name = name,
objects = new()
};
// add the color source as well for receiving in other apps
// POC: in order to have high-fidelity color props, we need to send the source somewhere. Currently this is attached to the color proxy, but have discussed sending it as a separate proxy or as an property on the atomic object. TBD if this is the best place for it.
@@ -98,55 +106,34 @@ public class RhinoColorManager
// Stage 1: unpack colors from objects
foreach (RhinoObject rootObj in atomicObjects)
{
ProcessObjectColor(
rootObj.Id.ToString(),
rootObj.Attributes.ObjectColor,
rootObj.Attributes.ColorSource,
rootObj.Attributes.MaterialIndex
);
try
{
ProcessObjectColor(
rootObj.Id.ToString(),
rootObj.Attributes.ObjectColor,
rootObj.Attributes.ColorSource,
rootObj.Attributes.MaterialIndex
);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to unpack colors from Rhino Object");
}
}
// Stage 2: make sure we collect layer colors as well
foreach (Layer layer in layers)
{
ProcessObjectColor(layer.Id.ToString(), layer.Color, ObjectColorSource.ColorFromObject);
try
{
ProcessObjectColor(layer.Id.ToString(), layer.Color, ObjectColorSource.ColorFromObject);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to unpack colors from Rhino Layer");
}
}
return ColorProxies.Values.ToList();
}
/// <summary>
/// Parse Color Proxies and stores in ObjectColorsIdMap the relationship between object ids and colors
/// </summary>
/// <param name="colorProxies"></param>
public void ParseColors(List<ColorProxy> colorProxies)
{
foreach (ColorProxy colorProxy in colorProxies)
{
ObjectColorSource source = ObjectColorSource.ColorFromObject;
if (colorProxy["source"] is string proxySource)
{
switch (proxySource)
{
case "layer":
continue; // skip any colors with source = layer, since object color default source is by layer
case "block":
source = ObjectColorSource.ColorFromParent;
break;
case "material":
source = ObjectColorSource.ColorFromMaterial;
break;
}
}
foreach (string objectId in colorProxy.objects)
{
Color convertedColor = Color.FromArgb(colorProxy.value);
if (!ObjectColorsIdMap.TryGetValue(objectId, out (Color, ObjectColorSource) _))
{
ObjectColorsIdMap.Add(objectId, (convertedColor, source));
}
}
}
}
}
@@ -0,0 +1,67 @@
using Microsoft.Extensions.Logging;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models.Proxies;
namespace Speckle.Connectors.Rhino.HostApp;
public class RhinoGroupBaker
{
private readonly IConverterSettingsStore<RhinoConversionSettings> _converterSettings;
private readonly ILogger<RhinoGroupBaker> _logger;
private readonly ISdkActivityFactory _activityFactory;
public RhinoGroupBaker(
IConverterSettingsStore<RhinoConversionSettings> converterSettings,
ILogger<RhinoGroupBaker> logger,
ISdkActivityFactory activityFactory
)
{
_converterSettings = converterSettings;
_logger = logger;
_activityFactory = activityFactory;
}
public void BakeGroups(
List<GroupProxy> groupProxies,
Dictionary<string, List<string>> applicationIdMap,
string baseLayerName
)
{
using var _ = _activityFactory.Start();
foreach (GroupProxy groupProxy in groupProxies.OrderBy(g => g.objects.Count))
{
try
{
var appIds = groupProxy.objects.SelectMany(oldObjId => applicationIdMap[oldObjId]).Select(id => new Guid(id));
var groupName = (groupProxy.name ?? "No Name Group") + $" ({baseLayerName})";
_converterSettings.Current.Document.Groups.Add(groupName, appIds);
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to bake Rhino Group");
}
}
}
public void PurgeGroups(string baseLayerName)
{
for (int i = _converterSettings.Current.Document.Groups.Count; i >= 0; i--)
{
try
{
var group = _converterSettings.Current.Document.Groups.FindIndex(i);
if (group is { Name: not null } && group.Name.Contains(baseLayerName))
{
_converterSettings.Current.Document.Groups.Delete(i);
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to purge Rhino Group");
}
}
}
}
@@ -1,84 +0,0 @@
using Rhino;
using Rhino.DocObjects;
using Speckle.Converters.Common;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models.Proxies;
namespace Speckle.Connectors.Rhino.HostApp;
/// <summary>
/// Unpacks the group lists for each object and sub-objects.
/// POC: Split me into group unpacker and group baker classes please!
/// It should be in scoped lifetime.
/// </summary>
public class RhinoGroupManager // POC: later make it more clean with RhinoGroupUnpacker Packer??? + see same POC comments in instance managers
{
private readonly IConversionContextStack<RhinoDoc, UnitSystem> _contextStack;
public RhinoGroupManager(IConversionContextStack<RhinoDoc, UnitSystem> contextStack)
{
_contextStack = contextStack;
}
public Dictionary<string, GroupProxy> GroupProxies { get; } = new();
public void UnpackGroups(IEnumerable<RhinoObject> rhinoObjects)
{
foreach (RhinoObject rhinoObject in rhinoObjects)
{
if (rhinoObject is InstanceObject instanceObject)
{
UnpackGroups(instanceObject.GetSubObjects());
}
var groupList = rhinoObject.GetGroupList();
if (groupList is null)
{
continue;
}
var groups = groupList.Select(gi => RhinoDoc.ActiveDoc.Groups.FindIndex(gi));
foreach (Group group in groups)
{
if (GroupProxies.TryGetValue(group.Id.ToString(), out GroupProxy? groupProxy))
{
groupProxy.objects.Add(rhinoObject.Id.ToString());
}
else
{
GroupProxies[group.Id.ToString()] = new GroupProxy()
{
applicationId = group.Id.ToString(),
name = group.Name,
objects = [rhinoObject.Id.ToString()]
};
}
}
}
}
public void BakeGroups(
List<GroupProxy> groupProxies,
Dictionary<string, List<string>> applicationIdMap,
string baseLayerName
)
{
using var _ = SpeckleActivityFactory.Start();
foreach (GroupProxy groupProxy in groupProxies.OrderBy(g => g.objects.Count))
{
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);
}
}
public void PurgeGroups(string baseLayerName)
{
for (int i = _contextStack.Current.Document.Groups.Count; i >= 0; i--)
{
var group = _contextStack.Current.Document.Groups.FindIndex(i);
if (group is { Name: not null } && group.Name.Contains(baseLayerName))
{
_contextStack.Current.Document.Groups.Delete(i);
}
}
}
}
@@ -0,0 +1,59 @@
using Microsoft.Extensions.Logging;
using Rhino;
using Rhino.DocObjects;
using Speckle.Sdk;
using Speckle.Sdk.Models.Proxies;
namespace Speckle.Connectors.Rhino.HostApp;
public class RhinoGroupUnpacker
{
private readonly ILogger<RhinoGroupUnpacker> _logger;
public RhinoGroupUnpacker(ILogger<RhinoGroupUnpacker> logger)
{
_logger = logger;
}
public Dictionary<string, GroupProxy> GroupProxies { get; } = new();
public void UnpackGroups(IEnumerable<RhinoObject> rhinoObjects)
{
foreach (RhinoObject rhinoObject in rhinoObjects)
{
try
{
if (rhinoObject is InstanceObject instanceObject)
{
UnpackGroups(instanceObject.GetSubObjects());
}
var groupList = rhinoObject.GetGroupList();
if (groupList is null)
{
continue;
}
var groups = groupList.Select(gi => RhinoDoc.ActiveDoc.Groups.FindIndex(gi));
foreach (Group group in groups)
{
if (GroupProxies.TryGetValue(group.Id.ToString(), out GroupProxy? groupProxy))
{
groupProxy.objects.Add(rhinoObject.Id.ToString());
}
else
{
GroupProxies[group.Id.ToString()] = new GroupProxy()
{
applicationId = group.Id.ToString(),
name = group.Name,
objects = [rhinoObject.Id.ToString()]
};
}
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed on unpacking Rhino group");
}
}
}
}
@@ -1,9 +1,10 @@
using Microsoft.Extensions.Logging;
using Rhino;
using Rhino.DocObjects;
using Rhino.Geometry;
using Speckle.Connectors.Common.Conversion;
using Speckle.Connectors.Common.Instances;
using Speckle.Connectors.Rhino.Extensions;
using Speckle.Connectors.Utils.Conversion;
using Speckle.Connectors.Utils.Instances;
using Speckle.DoubleNumerics;
using Speckle.Sdk;
using Speckle.Sdk.Common;
@@ -13,116 +14,24 @@ using Speckle.Sdk.Models.Instances;
namespace Speckle.Connectors.Rhino.HostApp;
/// <summary>
/// Expects to be a scoped dependency per send or receive operation.
/// POC: Split later unpacker and baker.
/// </summary>
public class RhinoInstanceObjectsManager : IInstanceUnpacker<RhinoObject>, IInstanceBaker<List<string>>
public class RhinoInstanceBaker : IInstanceBaker<List<string>>
{
private readonly RhinoLayerManager _layerManager;
private readonly RhinoMaterialManager _materialManager;
private readonly RhinoColorManager _colorManager;
private readonly IInstanceObjectsManager<RhinoObject, List<string>> _instanceObjectsManager;
private readonly RhinoMaterialBaker _materialBaker;
private readonly RhinoLayerBaker _layerBaker;
private readonly RhinoColorBaker _colorBaker;
private readonly ILogger<RhinoInstanceBaker> _logger;
public RhinoInstanceObjectsManager(
RhinoLayerManager layerManager,
RhinoMaterialManager materialManager,
RhinoColorManager colorManager,
IInstanceObjectsManager<RhinoObject, List<string>> instanceObjectsManager
public RhinoInstanceBaker(
RhinoLayerBaker layerBaker,
RhinoMaterialBaker rhinoMaterialBaker,
RhinoColorBaker colorBaker,
ILogger<RhinoInstanceBaker> logger
)
{
_layerManager = layerManager;
_materialManager = materialManager;
_colorManager = colorManager;
_instanceObjectsManager = instanceObjectsManager;
}
public UnpackResult<RhinoObject> UnpackSelection(IEnumerable<RhinoObject> objects)
{
foreach (var obj in objects)
{
if (obj is InstanceObject instanceObject)
{
UnpackInstance(instanceObject);
}
_instanceObjectsManager.AddAtomicObject(obj.Id.ToString(), obj);
}
return _instanceObjectsManager.GetUnpackResult();
}
private void UnpackInstance(InstanceObject instance, int depth = 0)
{
var instanceId = instance.Id.ToString();
var instanceDefinitionId = instance.InstanceDefinition.Id.ToString();
var currentDoc = RhinoDoc.ActiveDoc; // POC: too much right now to interface around
InstanceProxy instanceProxy =
new()
{
applicationId = instanceId,
definitionId = instance.InstanceDefinition.Id.ToString(),
transform = XFormToMatrix(instance.InstanceXform),
maxDepth = depth,
units = currentDoc.ModelUnitSystem.ToSpeckleString()
};
_instanceObjectsManager.AddInstanceProxy(instanceId, instanceProxy);
// For each block instance that has the same definition, we need to keep track of the "maximum depth" at which is found.
// This will enable on receive to create them in the correct order (descending by max depth, interleaved definitions and instances).
// We need to interleave the creation of definitions and instances, as some definitions may depend on instances.
if (
!_instanceObjectsManager.TryGetInstanceProxiesFromDefinitionId(
instanceDefinitionId,
out List<InstanceProxy> instanceProxiesWithSameDefinition
)
)
{
instanceProxiesWithSameDefinition = new List<InstanceProxy>();
_instanceObjectsManager.AddInstanceProxiesByDefinitionId(instanceDefinitionId, instanceProxiesWithSameDefinition);
}
// We ensure that all previous instance proxies that have the same definition are at this max depth. I kind of have a feeling this can be done more elegantly, but YOLO
foreach (var instanceProxyWithSameDefinition in instanceProxiesWithSameDefinition)
{
if (instanceProxyWithSameDefinition.maxDepth < depth)
{
instanceProxyWithSameDefinition.maxDepth = depth;
}
}
instanceProxiesWithSameDefinition.Add(_instanceObjectsManager.GetInstanceProxy(instanceId));
if (_instanceObjectsManager.TryGetInstanceDefinitionProxy(instanceDefinitionId, out InstanceDefinitionProxy value))
{
int depthDifference = depth - value.maxDepth;
if (depthDifference > 0)
{
// all MaxDepth of children definitions and its instances should be increased with difference of depth
_instanceObjectsManager.UpdateChildrenMaxDepth(value, depthDifference);
}
return;
}
var definition = new InstanceDefinitionProxy
{
applicationId = instanceDefinitionId,
objects = new List<string>(),
maxDepth = depth,
name = instance.InstanceDefinition.Name,
["description"] = instance.InstanceDefinition.Description
};
_instanceObjectsManager.AddDefinitionProxy(instance.InstanceDefinition.Id.ToString(), definition);
foreach (var obj in instance.InstanceDefinition.GetObjects())
{
definition.objects.Add(obj.Id.ToString());
if (obj is InstanceObject localInstance)
{
UnpackInstance(localInstance, depth + 1);
}
_instanceObjectsManager.AddAtomicObject(obj.Id.ToString(), obj);
}
_layerBaker = layerBaker;
_materialBaker = rhinoMaterialBaker;
_colorBaker = colorBaker;
_logger = logger;
}
/// <summary>
@@ -209,18 +118,18 @@ public class RhinoInstanceObjectsManager : IInstanceUnpacker<RhinoObject>, IInst
var transform = MatrixToTransform(instanceProxy.transform, instanceProxy.units);
// POC: having layer creation during instance bake means no render materials!!
int layerIndex = _layerManager.GetAndCreateLayerFromPath(layerCollection, baseLayerName, out bool _);
int layerIndex = _layerBaker.GetAndCreateLayerFromPath(layerCollection, baseLayerName);
string instanceProxyId = instanceProxy.applicationId ?? instanceProxy.id;
ObjectAttributes atts = new() { LayerIndex = layerIndex };
if (_materialManager.ObjectIdAndMaterialIndexMap.TryGetValue(instanceProxyId, out int mIndex))
if (_materialBaker.ObjectIdAndMaterialIndexMap.TryGetValue(instanceProxyId, out int mIndex))
{
atts.MaterialIndex = mIndex;
atts.MaterialSource = ObjectMaterialSource.MaterialFromObject;
}
if (_colorManager.ObjectColorsIdMap.TryGetValue(instanceProxyId, out (Color, ObjectColorSource) color))
if (_colorBaker.ObjectColorsIdMap.TryGetValue(instanceProxyId, out (Color, ObjectColorSource) color))
{
atts.ObjectColor = color.Item1;
atts.ColorSource = color.Item2;
@@ -240,6 +149,7 @@ public class RhinoInstanceObjectsManager : IInstanceUnpacker<RhinoObject>, IInst
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed to create an instance from proxy");
conversionResults.Add(new(Status.ERROR, instanceOrDefinition as Base ?? new Base(), null, null, ex));
}
}
@@ -259,9 +169,6 @@ public class RhinoInstanceObjectsManager : IInstanceUnpacker<RhinoObject>, IInst
}
}
private Matrix4x4 XFormToMatrix(Transform t) =>
new(t.M00, t.M01, t.M02, t.M03, t.M10, t.M11, t.M12, t.M13, t.M20, t.M21, t.M22, t.M23, t.M30, t.M31, t.M32, t.M33);
private Transform MatrixToTransform(Matrix4x4 matrix, string units)
{
var currentDoc = RhinoDoc.ActiveDoc; // POC: too much right now to interface around
@@ -0,0 +1,131 @@
using Microsoft.Extensions.Logging;
using Rhino;
using Rhino.DocObjects;
using Rhino.Geometry;
using Speckle.Connectors.Common.Instances;
using Speckle.Connectors.Rhino.Extensions;
using Speckle.DoubleNumerics;
using Speckle.Sdk;
using Speckle.Sdk.Models.Instances;
namespace Speckle.Connectors.Rhino.HostApp;
public class RhinoInstanceUnpacker : IInstanceUnpacker<RhinoObject>
{
private readonly IInstanceObjectsManager<RhinoObject, List<string>> _instanceObjectsManager;
private readonly ILogger<RhinoInstanceUnpacker> _logger;
public RhinoInstanceUnpacker(
IInstanceObjectsManager<RhinoObject, List<string>> instanceObjectsManager,
ILogger<RhinoInstanceUnpacker> logger
)
{
_instanceObjectsManager = instanceObjectsManager;
_logger = logger;
}
public UnpackResult<RhinoObject> UnpackSelection(IEnumerable<RhinoObject> objects)
{
foreach (var obj in objects)
{
if (obj is InstanceObject instanceObject)
{
UnpackInstance(instanceObject);
}
_instanceObjectsManager.AddAtomicObject(obj.Id.ToString(), obj);
}
return _instanceObjectsManager.GetUnpackResult();
}
private void UnpackInstance(InstanceObject instance, int depth = 0)
{
try
{
var instanceId = instance.Id.ToString();
var instanceDefinitionId = instance.InstanceDefinition.Id.ToString();
var currentDoc = RhinoDoc.ActiveDoc; // POC: too much right now to interface around
InstanceProxy instanceProxy =
new()
{
applicationId = instanceId,
definitionId = instance.InstanceDefinition.Id.ToString(),
transform = XFormToMatrix(instance.InstanceXform),
maxDepth = depth,
units = currentDoc.ModelUnitSystem.ToSpeckleString()
};
_instanceObjectsManager.AddInstanceProxy(instanceId, instanceProxy);
// For each block instance that has the same definition, we need to keep track of the "maximum depth" at which is found.
// This will enable on receive to create them in the correct order (descending by max depth, interleaved definitions and instances).
// We need to interleave the creation of definitions and instances, as some definitions may depend on instances.
if (
!_instanceObjectsManager.TryGetInstanceProxiesFromDefinitionId(
instanceDefinitionId,
out List<InstanceProxy>? instanceProxiesWithSameDefinition
)
)
{
instanceProxiesWithSameDefinition = new List<InstanceProxy>();
_instanceObjectsManager.AddInstanceProxiesByDefinitionId(
instanceDefinitionId,
instanceProxiesWithSameDefinition
);
}
// We ensure that all previous instance proxies that have the same definition are at this max depth. I kind of have a feeling this can be done more elegantly, but YOLO
foreach (var instanceProxyWithSameDefinition in instanceProxiesWithSameDefinition)
{
if (instanceProxyWithSameDefinition.maxDepth < depth)
{
instanceProxyWithSameDefinition.maxDepth = depth;
}
}
instanceProxiesWithSameDefinition.Add(_instanceObjectsManager.GetInstanceProxy(instanceId));
if (
_instanceObjectsManager.TryGetInstanceDefinitionProxy(instanceDefinitionId, out InstanceDefinitionProxy? value)
)
{
int depthDifference = depth - value.maxDepth;
if (depthDifference > 0)
{
// all MaxDepth of children definitions and its instances should be increased with difference of depth
_instanceObjectsManager.UpdateChildrenMaxDepth(value, depthDifference);
}
return;
}
var definition = new InstanceDefinitionProxy
{
applicationId = instanceDefinitionId,
objects = new List<string>(),
maxDepth = depth,
name = instance.InstanceDefinition.Name,
["description"] = instance.InstanceDefinition.Description
};
_instanceObjectsManager.AddDefinitionProxy(instance.InstanceDefinition.Id.ToString(), definition);
foreach (var obj in instance.InstanceDefinition.GetObjects())
{
definition.objects.Add(obj.Id.ToString());
if (obj is InstanceObject localInstance)
{
UnpackInstance(localInstance, depth + 1);
}
_instanceObjectsManager.AddAtomicObject(obj.Id.ToString(), obj);
}
}
catch (Exception ex) when (!ex.IsFatal())
{
_logger.LogError(ex, "Failed unpacking Rhino instance");
}
}
private Matrix4x4 XFormToMatrix(Transform t) =>
new(t.M00, t.M01, t.M02, t.M03, t.M10, t.M11, t.M12, t.M13, t.M20, t.M21, t.M22, t.M23, t.M30, t.M31, t.M32, t.M33);
}
@@ -0,0 +1,93 @@
using Rhino;
using Rhino.DocObjects;
using Speckle.Connectors.Common.Operations.Receive;
using Speckle.Sdk.Models.Collections;
using Layer = Rhino.DocObjects.Layer;
namespace Speckle.Connectors.Rhino.HostApp;
/// <summary>
/// Utility class managing layer creation. Expects to be a scoped dependency per receive operation.
/// </summary>
public class RhinoLayerBaker : TraversalContextUnpacker
{
private readonly RhinoMaterialBaker _materialBaker;
private readonly RhinoColorBaker _colorBaker;
private readonly Dictionary<string, int> _hostLayerCache = new();
public RhinoLayerBaker(RhinoMaterialBaker materialBaker, RhinoColorBaker colorBaker)
{
_materialBaker = materialBaker;
_colorBaker = colorBaker;
}
/// <summary>
/// Creates the base layer and adds it to the cache.
/// </summary>
/// <param name="baseLayerName"></param>
public void CreateBaseLayer(string baseLayerName)
{
var index = RhinoDoc.ActiveDoc.Layers.Add(new Layer { Name = baseLayerName }); // POC: too much effort right now to wrap around the interfaced layers and doc
_hostLayerCache.Add(baseLayerName, index);
}
/// <summary>
/// <para>For receive: Use this method to construct layers in the host app when receiving. It progressively caches layers while creating them, so a second call to get the same layer will be fast.</para>
/// </summary>
public int GetAndCreateLayerFromPath(Collection[] collectionPath, string baseLayerName)
{
var layerPath = collectionPath.Select(o => string.IsNullOrWhiteSpace(o.name) ? "unnamed" : o.name);
var layerFullName = string.Join(Layer.PathSeparator, layerPath);
if (_hostLayerCache.TryGetValue(layerFullName, out int existingLayerIndex))
{
return existingLayerIndex;
}
var currentLayerName = baseLayerName;
var currentDocument = RhinoDoc.ActiveDoc; // POC: too much effort right now to wrap around the interfaced layers
Layer previousLayer = currentDocument.Layers.FindName(currentLayerName);
foreach (Collection collection in collectionPath)
{
currentLayerName += Layer.PathSeparator + collection.name;
currentLayerName = currentLayerName.Replace("{", "").Replace("}", ""); // Rhino specific cleanup for gh (see RemoveInvalidRhinoChars)
if (_hostLayerCache.TryGetValue(currentLayerName, out int value))
{
previousLayer = currentDocument.Layers.FindIndex(value);
continue;
}
var cleanNewLayerName = collection.name.Replace("{", "").Replace("}", "");
Layer newLayer = new() { Name = cleanNewLayerName, ParentLayerId = previousLayer.Id };
// set material
if (
_materialBaker.ObjectIdAndMaterialIndexMap.TryGetValue(
collection.applicationId ?? collection.id,
out int mIndex
)
)
{
newLayer.RenderMaterialIndex = mIndex;
}
// set color
if (
_colorBaker.ObjectColorsIdMap.TryGetValue(
collection.applicationId ?? collection.id,
out (Color, ObjectColorSource) color
)
)
{
newLayer.Color = color.Item1;
}
int index = currentDocument.Layers.Add(newLayer);
_hostLayerCache.Add(currentLayerName, index);
previousLayer = currentDocument.Layers.FindIndex(index); // note we need to get the correct id out, hence why we're double calling this
}
return previousLayer.Index;
}
}
@@ -1,172 +0,0 @@
using System.Diagnostics.Contracts;
using Rhino;
using Rhino.DocObjects;
using Speckle.Sdk.Models.Collections;
using Speckle.Sdk.Models.GraphTraversal;
using Layer = Rhino.DocObjects.Layer;
using SpeckleLayer = Speckle.Sdk.Models.Collections.Layer;
namespace Speckle.Connectors.Rhino.HostApp;
/// <summary>
/// Utility class managing layer creation and/or extraction from rhino. Expects to be a scoped dependency per send or receive operation.
/// </summary>
public class RhinoLayerManager
{
private readonly RhinoMaterialManager _materialManager;
private readonly RhinoColorManager _colorManager;
private readonly Dictionary<string, int> _hostLayerCache = new();
private readonly Dictionary<int, Collection> _layerCollectionCache = new();
public RhinoLayerManager(RhinoMaterialManager materialManager, RhinoColorManager colorManager)
{
_materialManager = materialManager;
_colorManager = colorManager;
}
/// <summary>
/// Creates the base layer and adds it to the cache.
/// </summary>
/// <param name="baseLayerName"></param>
public void CreateBaseLayer(string baseLayerName)
{
var index = RhinoDoc.ActiveDoc.Layers.Add(new Layer { Name = baseLayerName }); // POC: too much effort right now to wrap around the interfaced layers and doc
// var index = _contextStack.Current.Document.Layers.Add(new Layer { Name = baseLayerName });
_hostLayerCache.Add(baseLayerName, index);
}
/// <summary>
/// <para>For receive: Use this method to construct layers in the host app when receiving. It progressively caches layers while creating them, so a second call to get the same layer will be fast.</para>
/// </summary>
public int GetAndCreateLayerFromPath(Collection[] collectionPath, string baseLayerName, out bool isNewLayer)
{
isNewLayer = true;
var layerPath = collectionPath.Select(o => string.IsNullOrWhiteSpace(o.name) ? "unnamed" : o.name);
var layerFullName = string.Join(Layer.PathSeparator, layerPath);
if (_hostLayerCache.TryGetValue(layerFullName, out int existingLayerIndex))
{
isNewLayer = false;
return existingLayerIndex;
}
var currentLayerName = baseLayerName;
var currentDocument = RhinoDoc.ActiveDoc; // POC: too much effort right now to wrap around the interfaced layers
Layer previousLayer = currentDocument.Layers.FindName(currentLayerName);
foreach (Collection collection in collectionPath)
{
currentLayerName += Layer.PathSeparator + collection.name;
currentLayerName = currentLayerName.Replace("{", "").Replace("}", ""); // Rhino specific cleanup for gh (see RemoveInvalidRhinoChars)
if (_hostLayerCache.TryGetValue(currentLayerName, out int value))
{
previousLayer = currentDocument.Layers.FindIndex(value);
continue;
}
var cleanNewLayerName = collection.name.Replace("{", "").Replace("}", "");
Layer newLayer = new() { Name = cleanNewLayerName, ParentLayerId = previousLayer.Id };
// set material
if (
_materialManager.ObjectIdAndMaterialIndexMap.TryGetValue(
collection.applicationId ?? collection.id,
out int mIndex
)
)
{
newLayer.RenderMaterialIndex = mIndex;
}
// set color
if (
_colorManager.ObjectColorsIdMap.TryGetValue(
collection.applicationId ?? collection.id,
out (Color, ObjectColorSource) color
)
)
{
newLayer.Color = color.Item1;
}
int index = currentDocument.Layers.Add(newLayer);
_hostLayerCache.Add(currentLayerName, index);
previousLayer = currentDocument.Layers.FindIndex(index); // note we need to get the correct id out, hence why we're double calling this
}
return previousLayer.Index;
}
/// <summary>
/// <para>For send: Use this method to construct the root commit object while converting objects.</para>
/// <para>Returns the host collection corresponding to the provided layer. If it's the first time that it is being asked for, it will be created and stored in the root object collection.</para>
/// </summary>
/// <param name="layer">The layer you want the equivalent collection for.</param>
/// <param name="rootObjectCollection">The root object that will be sent to Speckle, and will host all collections.</param>
/// <returns></returns>
public Collection GetHostObjectCollection(Layer layer, Collection rootObjectCollection)
{
if (_layerCollectionCache.TryGetValue(layer.Index, out Collection? value))
{
return value;
}
var names = layer.FullPath.Split(new[] { Layer.PathSeparator }, StringSplitOptions.None);
var path = names[0];
var index = 0;
var previousCollection = rootObjectCollection;
foreach (var layerName in names)
{
var existingLayerIndex = RhinoDoc.ActiveDoc.Layers.FindByFullPath(path, -1);
Collection? childCollection = null;
if (_layerCollectionCache.TryGetValue(existingLayerIndex, out Collection? collection))
{
childCollection = collection;
}
else
{
childCollection = new SpeckleLayer(layerName)
{
applicationId = RhinoDoc.ActiveDoc.Layers[existingLayerIndex].Id.ToString()
};
previousCollection.elements.Add(childCollection);
_layerCollectionCache[existingLayerIndex] = childCollection;
}
previousCollection = childCollection;
if (index < names.Length - 1)
{
path += Layer.PathSeparator + names[index + 1];
}
index++;
}
_layerCollectionCache[layer.Index] = previousCollection;
return previousCollection;
}
/// <summary>
/// Gets the full path of the layer, concatenated with Rhino's Layer.
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
[Pure]
//POC test me!
public Collection[] GetLayerPath(TraversalContext context)
{
Collection[] collectionBasedPath = context.GetAscendantOfType<Collection>().Reverse().ToArray();
Collection[] collectionPath =
collectionBasedPath.Length != 0
? collectionBasedPath
: context
.GetPropertyPath()
.Reverse()
.Select(o => new Collection() { applicationId = Guid.NewGuid().ToString(), name = o })
.ToArray();
return collectionPath;
}
}

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