From 4e85a6cccc6c7bbce4cf7eb6076f06ec08ab785d Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 14 May 2025 10:55:00 +0100 Subject: [PATCH] feat(Revit 2026) Add projects and fixes for Revit 2026 usage (#736) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add base revit 26 projects * fix up cef replacement * fix up revit 2026 events * add revit events * fixes for revit 26 * use right version of DI for Revit26 * add Revit26 to local * fmt * use visual studio to fix slns * Add revit to installer constants * move webview stuff to 2026 specific area to avoid build issues * update locks * Revit 2026 wants to invoke scripts with RevitTask. Abstract RevitTask * fmt * fix project copying * use 3.2 SDK * fix build * Revit 2025 is now CEF vulnerable * add SendProgress to not overload revit context * update Revit 26 lock files * update locks --------- Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com> --- Build/Consts.cs | 3 +- .../Plugin/RevitControlWebView.xaml | 19 + .../Plugin/RevitControlWebView.xaml.cs | 84 +++++ .../Plugin/RevitControlWebViewDockable.cs | 22 ++ .../Plugin/RevitWebViewPlugin.cs | 114 ++++++ .../Plugin/Speckle.Connectors.Revit2026.addin | 12 + .../Properties/launchSettings.json | 9 + .../Speckle.Connectors.Revit2026.csproj | 32 ++ .../packages.lock.json | 338 ++++++++++++++++++ .../CefSharpPanel.xaml.cs | 2 + .../Bindings/BasicConnectorBindingRevit.cs | 11 +- .../Bindings/RevitSendBinding.cs | 12 +- .../Bindings/SelectionBinding.cs | 17 +- .../RevitConnectorModule.cs | 16 +- .../HostApp/RevitDocumentStore.cs | 25 +- .../Plugin/RevitCefPlugin.cs | 5 +- .../Plugin/RevitExternalApplication.cs | 7 +- .../Plugin/RevitIdleManager.cs | 7 +- .../Plugin/RevitTask.cs | 21 ++ .../Plugin/RevitThreadContext.cs | 9 +- .../Speckle.Connectors.RevitShared.projitems | 1 + .../Bindings/TeklaSelectionBinding.cs | 2 +- .../Speckle.Converters.Revit2026.csproj | 20 ++ .../packages.lock.json | 277 ++++++++++++++ .../DUI3ControlWebView.xaml.cs | 2 + .../Bindings/OperationProgressManager.cs | 2 +- .../Bridge/BrowserBridge.cs | 4 +- .../Bridge/IBrowserBridge.cs | 2 +- .../Bridge/IBrowserScriptExecutor.cs | 10 +- Local.sln | 23 +- Speckle.Connectors.sln | 95 +++-- 31 files changed, 1102 insertions(+), 101 deletions(-) create mode 100644 Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebView.xaml create mode 100644 Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebView.xaml.cs create mode 100644 Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebViewDockable.cs create mode 100644 Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitWebViewPlugin.cs create mode 100644 Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/Speckle.Connectors.Revit2026.addin create mode 100644 Connectors/Revit/Speckle.Connectors.Revit2026/Properties/launchSettings.json create mode 100644 Connectors/Revit/Speckle.Connectors.Revit2026/Speckle.Connectors.Revit2026.csproj create mode 100644 Connectors/Revit/Speckle.Connectors.Revit2026/packages.lock.json create mode 100644 Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitTask.cs create mode 100644 Converters/Revit/Speckle.Converters.Revit2026/Speckle.Converters.Revit2026.csproj create mode 100644 Converters/Revit/Speckle.Converters.Revit2026/packages.lock.json diff --git a/Build/Consts.cs b/Build/Consts.cs index 87f9b2be5..dd5f39a38 100644 --- a/Build/Consts.cs +++ b/Build/Consts.cs @@ -20,7 +20,8 @@ public static class Consts new("Connectors/Revit/Speckle.Connectors.Revit2022", "net48"), new("Connectors/Revit/Speckle.Connectors.Revit2023", "net48"), new("Connectors/Revit/Speckle.Connectors.Revit2024", "net48"), - new("Connectors/Revit/Speckle.Connectors.Revit2025", "net8.0-windows") + new("Connectors/Revit/Speckle.Connectors.Revit2025", "net8.0-windows"), + new("Connectors/Revit/Speckle.Connectors.Revit2026", "net8.0-windows") ] ), new( diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebView.xaml b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebView.xaml new file mode 100644 index 000000000..4a0955066 --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebView.xaml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebView.xaml.cs b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebView.xaml.cs new file mode 100644 index 000000000..985ca1a2c --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebView.xaml.cs @@ -0,0 +1,84 @@ +using System.Windows.Controls; +using System.Windows.Threading; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Web.WebView2.Core; +using Speckle.Connectors.DUI.Bindings; +using Speckle.Connectors.DUI.Bridge; +using Speckle.Connectors.Revit.Plugin; + +namespace Speckle.Connectors.Revit2026.Plugin; + +public sealed partial class RevitControlWebView : UserControl, IBrowserScriptExecutor, IDisposable +{ + private readonly IServiceProvider _serviceProvider; + private readonly IRevitTask _revitTask; + + public RevitControlWebView(IServiceProvider serviceProvider, IRevitTask revitTask) + { + _serviceProvider = serviceProvider; + _revitTask = revitTask; + InitializeComponent(); + + Browser.CoreWebView2InitializationCompleted += (sender, args) => + _serviceProvider + .GetRequiredService() + .CatchUnhandled(() => OnInitialized(sender, args)); + } + + public bool IsBrowserInitialized => Browser.IsInitialized; + + public object BrowserElement => Browser; + + public void ExecuteScript(string script) + { + if (!Browser.IsInitialized) + { + throw new InvalidOperationException("Failed to execute script, Webview2 is not initialized yet."); + } + _revitTask.Run(() => Browser.ExecuteScriptAsync(script)); + } + + public void SendProgress(string script) + { + if (!Browser.IsInitialized) + { + throw new InvalidOperationException("Failed to execute script, Webview2 is not initialized yet."); + } + //always invoke even on the main thread because it's better somehow + Browser.Dispatcher.Invoke( + //fire and forget + () => Browser.ExecuteScriptAsync(script), + DispatcherPriority.Background + ); + } + + private void OnInitialized(object? sender, CoreWebView2InitializationCompletedEventArgs e) + { + Console.WriteLine(CoreWebView2Environment.GetAvailableBrowserVersionString()); + if (!e.IsSuccess) + { + throw new InvalidOperationException("Webview Failed to initialize", e.InitializationException); + } + + // We use Lazy here to delay creating the binding until after the Browser is fully initialized. + // Otherwise the Browser cannot respond to any requests to ExecuteScriptAsyncMethod + foreach (var binding in _serviceProvider.GetRequiredService>()) + { + SetupBinding(binding); + } + } + + /// + /// This must be called on the Main thread + /// + private void SetupBinding(IBinding binding) + { + binding.Parent.AssociateWithBinding(binding); + Browser.CoreWebView2.AddHostObjectToScript(binding.Name, binding.Parent); + } + + public void ShowDevTools() => Browser.CoreWebView2.OpenDevToolsWindow(); + + //https://github.com/MicrosoftEdge/WebView2Feedback/issues/2161 + public void Dispose() => Browser.Dispatcher.Invoke(() => Browser.Dispose(), DispatcherPriority.Send); +} diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebViewDockable.cs b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebViewDockable.cs new file mode 100644 index 000000000..5e0075390 --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitControlWebViewDockable.cs @@ -0,0 +1,22 @@ +using System.Windows.Controls; +using Autodesk.Revit.UI; + +namespace Speckle.Connectors.Revit2026.Plugin; + +public sealed class RevitControlWebViewDockable : UserControl, Autodesk.Revit.UI.IDockablePaneProvider +{ + public RevitControlWebViewDockable(RevitControlWebView dUI3ControlWebView) + { + Content = dUI3ControlWebView; + } + + public void SetupDockablePane(DockablePaneProviderData data) + { + data.FrameworkElement = this; + data.InitialState = new Autodesk.Revit.UI.DockablePaneState + { + DockPosition = DockPosition.Tabbed, + TabBehind = DockablePanes.BuiltInDockablePanes.ProjectBrowser + }; + } +} diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitWebViewPlugin.cs b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitWebViewPlugin.cs new file mode 100644 index 000000000..f537d4dcd --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/RevitWebViewPlugin.cs @@ -0,0 +1,114 @@ +using System.IO; +using System.Reflection; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using Autodesk.Revit.UI; +using Speckle.Connectors.Common; +using Speckle.Connectors.Revit.Plugin; +using Speckle.Converters.RevitShared.Helpers; +using Speckle.Sdk; + +namespace Speckle.Connectors.Revit2026.Plugin; + +internal sealed class RevitWebViewPlugin( + UIControlledApplication uIControlledApplication, + RevitContext revitContext, + RevitControlWebViewDockable webViewPanel, + ISpeckleApplication speckleApplication +) : IRevitPlugin +{ + public void Initialise() + { + // Create and register panels before app initialized. this is needed for double-click file open + CreateTabAndRibbonPanel(uIControlledApplication); + RegisterDockablePane(); + uIControlledApplication.ControlledApplication.ApplicationInitialized += OnApplicationInitialized; + } + + public void Shutdown() + { + // POC: should we be cleaning up the RibbonPanel etc... + // Should we be indicating to any active in-flight functions that we are being closed? + } + + // POC: Could be injected but maybe not worthwhile + private void CreateTabAndRibbonPanel(UIControlledApplication application) + { + // POC: some top-level handling and feedback here + try + { + application.CreateRibbonTab(Connector.TabName); + } + catch (ArgumentException) + { + // exception occurs when the speckle tab has already been created. + // this happens when both the dui2 and the dui3 connectors are installed. Can be safely ignored. + } + + RibbonPanel specklePanel = application.CreateRibbonPanel(Connector.TabName, Connector.TabTitle); + var dui3Button = (PushButton) + specklePanel.AddItem( + new PushButtonData( + "Speckle (Beta) for Revit", + Connector.TabTitle, + typeof(RevitExternalApplication).Assembly.Location, + typeof(SpeckleRevitCommand).FullName + ) + ); + + string path = typeof(RevitWebViewPlugin).Assembly.Location; + dui3Button.Image = LoadPngImgSource( + $"Speckle.Connectors.Revit{speckleApplication.HostApplicationVersion}.Assets.logo16.png", + path + ); + dui3Button.LargeImage = LoadPngImgSource( + $"Speckle.Connectors.Revit{speckleApplication.HostApplicationVersion}.Assets.logo32.png", + path + ); + dui3Button.ToolTipImage = LoadPngImgSource( + $"Speckle.Connectors.Revit{speckleApplication.HostApplicationVersion}.Assets.logo32.png", + path + ); + dui3Button.ToolTip = "Speckle (Beta) for Revit"; + //dui3Button.AvailabilityClassName = typeof(CmdAvailabilityViews).FullName; + dui3Button.SetContextualHelp(new ContextualHelp(ContextualHelpType.Url, "https://speckle.systems")); + } + + private void OnApplicationInitialized(object? sender, Autodesk.Revit.DB.Events.ApplicationInitializedEventArgs e) + { + var uiApplication = new UIApplication(sender as Autodesk.Revit.ApplicationServices.Application); + revitContext.UIApplication = uiApplication; + + // POC: might be worth to interface this out, we shall see... + global::Revit.Async.RevitTask.Initialize(uiApplication); + } + + private void RegisterDockablePane() + { + // Registering dockable pane should happen before UiApplication is initialized with RevitTask. + // Otherwise pane cannot be registered for double-click file open. + uIControlledApplication.RegisterDockablePane( + RevitExternalApplication.DockablePanelId, + Connector.TabTitle, + webViewPanel + ); + } + + private ImageSource? LoadPngImgSource(string sourceName, string path) + { + try + { + var assembly = Assembly.LoadFrom(Path.Combine(path)); + var icon = assembly.GetManifestResourceStream(sourceName); + PngBitmapDecoder decoder = new(icon, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); + ImageSource source = decoder.Frames[0]; + return source; + } + catch (Exception ex) when (!ex.IsFatal()) + { + // POC: logging + } + + return null; + } +} diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/Speckle.Connectors.Revit2026.addin b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/Speckle.Connectors.Revit2026.addin new file mode 100644 index 000000000..6bd6ed5b0 --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.Revit2026/Plugin/Speckle.Connectors.Revit2026.addin @@ -0,0 +1,12 @@ + + + + Speckle (Beta) for Revit + Speckle (Beta) for Revit + Speckle.Connectors.Revit2026\Speckle.Connectors.Revit2026.dll + Speckle.Connectors.Revit.Plugin.RevitExternalApplication + 27ccff2c-011c-4374-bb79-b93990d0c86a + speckle + Speckle: Empowering your design and construction data. For any problems, visit our community forum https://speckle.community + + diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/Properties/launchSettings.json b/Connectors/Revit/Speckle.Connectors.Revit2026/Properties/launchSettings.json new file mode 100644 index 000000000..741cc39be --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.Revit2026/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "profiles": { + "ConnectorRevit2026": { + "commandName": "Executable", + "executablePath": "C:\\Program Files\\Autodesk\\Revit 2026\\Revit.exe", + "runtime": "net8.0-windows" + } + } +} diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/Speckle.Connectors.Revit2026.csproj b/Connectors/Revit/Speckle.Connectors.Revit2026/Speckle.Connectors.Revit2026.csproj new file mode 100644 index 000000000..f0e7d46d6 --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.Revit2026/Speckle.Connectors.Revit2026.csproj @@ -0,0 +1,32 @@ + + + net8.0-windows + x64 + win-x64 + true + 2026 + $(DefineConstants);REVIT2026;REVIT2022_OR_GREATER;REVIT2023_OR_GREATER;REVIT2024_OR_GREATER;REVIT2025_OR_GREATER;REVIT2026_OR_GREATERtrue + false + Debug;Release;Local + + + + + + + + + + + + + + + + + + + Always + + + diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/packages.lock.json b/Connectors/Revit/Speckle.Connectors.Revit2026/packages.lock.json new file mode 100644 index 000000000..fc6d93d99 --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.Revit2026/packages.lock.json @@ -0,0 +1,338 @@ +{ + "version": 2, + "dependencies": { + "net8.0-windows7.0": { + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "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, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "Microsoft.Web.WebView2": { + "type": "Direct", + "requested": "[1.0.1938.49, )", + "resolved": "1.0.1938.49", + "contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw==" + }, + "PolySharp": { + "type": "Direct", + "requested": "[1.14.1, )", + "resolved": "1.14.1", + "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" + }, + "Revit.Async": { + "type": "Direct", + "requested": "[2.1.1, )", + "resolved": "2.1.1", + "contentHash": "aK6R/fxrn3jpiKc8LYqfWZ+OfEKNnwgkiln1uyuvaPnTWBOvfiisnOfe7+Sgogr4iEuMmuMDsmBRMCycMlUpnw==" + }, + "Speckle.InterfaceGenerator": { + "type": "Direct", + "requested": "[0.9.6, )", + "resolved": "0.9.6", + "contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w==" + }, + "GraphQL.Client": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "8yPNBbuVBpTptivyAlak4GZvbwbUcjeQTL4vN1HKHRuOykZ4r7l5fcLS6vpyPyLn0x8FsL31xbOIKyxbmR9rbA==", + "dependencies": { + "GraphQL.Client.Abstractions": "6.0.0", + "GraphQL.Client.Abstractions.Websocket": "6.0.0", + "System.Reactive": "5.0.0" + } + }, + "GraphQL.Client.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "h7uzWFORHZ+CCjwr/ThAyXMr0DPpzEANDa4Uo54wqCQ+j7qUKwqYTgOrb1W40sqbvNaZm9v/X7It31SUw0maHA==", + "dependencies": { + "GraphQL.Primitives": "6.0.0" + } + }, + "GraphQL.Client.Abstractions.Websocket": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Nr9bPf8gIOvLuXpqEpqr9z9jslYFJOvd0feHth3/kPqeR3uMbjF5pjiwh4jxyMcxHdr8Pb6QiXkV3hsSyt0v7A==", + "dependencies": { + "GraphQL.Client.Abstractions": "6.0.0" + } + }, + "GraphQL.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite": { + "type": "Transitive", + "resolved": "7.0.5", + "contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "7.0.5", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.4" + } + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "7.0.5", + "contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.4" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "2.2.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", + "dependencies": { + "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": "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", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Speckle.Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.2", + "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "EWI1olKDjFEBMJu0+3wuxwziIAdWDVMYLhuZ3Qs84rrz+DHwD00RzWPZCa+bLnHCf3oJwuFZIRsHT5p236QXww==", + "dependencies": { + "SQLitePCLRaw.lib.e_sqlite3": "2.1.4", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.4" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "inBjvSHo9UDKneGNzfUfDjK08JzlcIhn1+SP5Y3m6cgXpCxXKCJDy6Mka7LpgSV+UZmKSnC8rTwB0SQ0xKu5pA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "CSlb5dUp1FMIkez9Iv5EXzpeq7rHryVNqwJMWnpq87j9zWZexaEMdisDktMsnnrzKM6ahNrsTkjqNodTBPBxtQ==", + "dependencies": { + "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", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" + }, + "speckle.connectors.common": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "[2.2.0, )", + "Speckle.Connectors.Logging": "[1.0.0, )", + "Speckle.Objects": "[3.3.3, )", + "Speckle.Sdk": "[3.3.3, )", + "Speckle.Sdk.Dependencies": "[3.3.3, )" + } + }, + "speckle.connectors.dui": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )", + "Speckle.Connectors.Common": "[1.0.0, )" + } + }, + "speckle.connectors.logging": { + "type": "Project" + }, + "speckle.converters.common": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )", + "Speckle.Objects": "[3.3.3, )" + } + }, + "speckle.converters.revit2026": { + "type": "Project", + "dependencies": { + "Speckle.Converters.Common": "[1.0.0, )", + "Speckle.Revit.API": "[2026.0.0, )" + } + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[2.2.0, )", + "resolved": "2.2.0", + "contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", + "dependencies": { + "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": "[2.2.0, )", + "resolved": "2.2.0", + "contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==" + }, + "Speckle.DoubleNumerics": { + "type": "CentralTransitive", + "requested": "[4.1.0, )", + "resolved": "4.1.0", + "contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A==" + }, + "Speckle.Objects": { + "type": "CentralTransitive", + "requested": "[3.3.3, )", + "resolved": "3.3.3", + "contentHash": "JCwkfdY4t7MgyrvxeLRZONRjby3qs6vbAqyyOtp9stoqRZiChNugX2ufEs1h7kXoRleYnZVGGHzy2Fbiy5B1ww==", + "dependencies": { + "Speckle.Sdk": "3.3.3" + } + }, + "Speckle.Revit.API": { + "type": "CentralTransitive", + "requested": "[2023.0.0, )", + "resolved": "2026.0.0", + "contentHash": "SiqqKbF1pXyZWXZhAl2JhjYhTt7RiYO5JaQrAjq+OlleAjT4zatwAp/DnTwQspFbP7UZr3b2Ed2kuWNN0ZFelw==" + }, + "Speckle.Sdk": { + "type": "CentralTransitive", + "requested": "[3.3.3, )", + "resolved": "3.3.3", + "contentHash": "1iC0P2ckeQ7smc9iOf2G1xFR1e1eQBQ122CHTx+b0/4m1LorlyAiW4PYui6erxM72fM6fM4b3r30ey2ceF8ffg==", + "dependencies": { + "GraphQL.Client": "6.0.0", + "Microsoft.CSharp": "4.7.0", + "Microsoft.Data.Sqlite": "7.0.5", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.Logging": "2.2.0", + "Speckle.DoubleNumerics": "4.1.0", + "Speckle.Newtonsoft.Json": "13.0.2", + "Speckle.Sdk.Dependencies": "3.3.3" + } + }, + "Speckle.Sdk.Dependencies": { + "type": "CentralTransitive", + "requested": "[3.3.3, )", + "resolved": "3.3.3", + "contentHash": "mroKNj1mlYLDeBHazsWofp6IHxAOWrRULUEqQd/BfeixXrQswruQ+w6OHEu2IoTqLHyVr/SLhMaBW61WxNG8aw==" + } + }, + "net8.0-windows7.0/win-x64": { + "Microsoft.Web.WebView2": { + "type": "Direct", + "requested": "[1.0.1938.49, )", + "resolved": "1.0.1938.49", + "contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw==" + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg==" + } + } + } +} \ No newline at end of file diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared.Cef/CefSharpPanel.xaml.cs b/Connectors/Revit/Speckle.Connectors.RevitShared.Cef/CefSharpPanel.xaml.cs index 98e98c88f..b521f32e6 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared.Cef/CefSharpPanel.xaml.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared.Cef/CefSharpPanel.xaml.cs @@ -18,6 +18,8 @@ public partial class CefSharpPanel : Page, Autodesk.Revit.UI.IDockablePaneProvid Browser.Dispatcher.Invoke(() => Browser.ExecuteScriptAsync(script), DispatcherPriority.Background); } + public void SendProgress(string script) => ExecuteScript(script); + public bool IsBrowserInitialized => Browser.IsBrowserInitialized; public object BrowserElement => Browser; diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/BasicConnectorBindingRevit.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/BasicConnectorBindingRevit.cs index ce9bc1431..baaa2b748 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/BasicConnectorBindingRevit.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/BasicConnectorBindingRevit.cs @@ -1,8 +1,8 @@ using Autodesk.Revit.DB; -using Revit.Async; using Speckle.Connectors.DUI.Bridge; using Speckle.Connectors.DUI.Models; using Speckle.Connectors.DUI.Models.Card; +using Speckle.Connectors.Revit.Plugin; using Speckle.Connectors.RevitShared; using Speckle.Connectors.RevitShared.Operations.Send.Filters; using Speckle.Converters.RevitShared.Helpers; @@ -23,13 +23,15 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding private readonly RevitContext _revitContext; private readonly ISpeckleApplication _speckleApplication; private readonly ITopLevelExceptionHandler _topLevelExceptionHandler; + private readonly IRevitTask _revitTask; public BasicConnectorBindingRevit( DocumentModelStore store, IBrowserBridge parent, RevitContext revitContext, ISpeckleApplication speckleApplication, - ITopLevelExceptionHandler topLevelExceptionHandler + ITopLevelExceptionHandler topLevelExceptionHandler, + IRevitTask revitTask ) { Name = "baseBinding"; @@ -38,6 +40,7 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding _revitContext = revitContext; _speckleApplication = speckleApplication; _topLevelExceptionHandler = topLevelExceptionHandler; + _revitTask = revitTask; Commands = new BasicConnectorBindingCommands(parent); _store.DocumentChanged += (_, _) => @@ -105,7 +108,7 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding var view = revitViewsFilter.GetView(); if (view is not null) { - await RevitTask + await _revitTask .RunAsync(() => { _revitContext.UIApplication.ActiveUIDocument.ActiveView = view; @@ -170,7 +173,7 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding _revitContext.UIApplication?.ActiveUIDocument ?? throw new SpeckleException("Unable to retrieve active UI document"); - await RevitTask + await _revitTask .RunAsync(() => { activeUIDoc.Selection.SetElementIds(objectIds); diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/RevitSendBinding.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/RevitSendBinding.cs index 92d33c584..a24e07b74 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/RevitSendBinding.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/RevitSendBinding.cs @@ -68,7 +68,8 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding ISpeckleApplication speckleApplication, ITopLevelExceptionHandler topLevelExceptionHandler, LinkedModelHandler linkedModelHandler, - IThreadContext threadContext + IThreadContext threadContext, + IRevitTask revitTask ) : base("sendBinding", bridge) { @@ -92,9 +93,12 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding // TODO expiry events // TODO filters need refresh events - revitContext.UIApplication.NotNull().Application.DocumentChanged += (_, e) => - _topLevelExceptionHandler.CatchUnhandled(() => DocChangeHandler(e)); - _store.DocumentChanged += (_, _) => topLevelExceptionHandler.FireAndForget(async () => await OnDocumentChanged()); + revitTask.Run(() => + { + revitContext.UIApplication.NotNull().Application.DocumentChanged += (_, e) => + _topLevelExceptionHandler.CatchUnhandled(() => DocChangeHandler(e)); + _store.DocumentChanged += (_, _) => topLevelExceptionHandler.FireAndForget(async () => await OnDocumentChanged()); + }); } public List GetSendFilters() => diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/SelectionBinding.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/SelectionBinding.cs index 203c20818..369fcc36e 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/SelectionBinding.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Bindings/SelectionBinding.cs @@ -1,5 +1,6 @@ using Speckle.Connectors.DUI.Bindings; using Speckle.Connectors.DUI.Bridge; +using Speckle.Connectors.Revit.Plugin; using Speckle.Converters.RevitShared.Helpers; using Speckle.Sdk.Common; @@ -12,30 +13,30 @@ internal sealed class SelectionBinding : RevitBaseBinding, ISelectionBinding, ID private readonly System.Timers.Timer _selectionTimer; #endif private readonly RevitContext _revitContext; - private readonly IAppIdleManager _idleManager; - private readonly ITopLevelExceptionHandler _topLevelExceptionHandler; public SelectionBinding( RevitContext revitContext, IBrowserBridge parent, IAppIdleManager idleManager, - ITopLevelExceptionHandler topLevelExceptionHandler + ITopLevelExceptionHandler topLevelExceptionHandler, + IRevitTask revitTask ) : base("selectionBinding", parent) { _revitContext = revitContext; - _idleManager = idleManager; - _topLevelExceptionHandler = topLevelExceptionHandler; #if REVIT2022 // NOTE: getting the selection data should be a fast function all, even for '000s of elements - and having a timer hitting it every 1s is ok. _selectionTimer = new System.Timers.Timer(1000); - _selectionTimer.Elapsed += (_, _) => _topLevelExceptionHandler.CatchUnhandled(OnSelectionChanged); + _selectionTimer.Elapsed += (_, _) => topLevelExceptionHandler.CatchUnhandled(OnSelectionChanged); _selectionTimer.Start(); #else - _revitContext.UIApplication.NotNull().SelectionChanged += (_, _) => - _idleManager.SubscribeToIdle(nameof(OnSelectionChanged), OnSelectionChanged); + revitTask.Run( + () => + _revitContext.UIApplication.NotNull().SelectionChanged += (_, _) => + idleManager.SubscribeToIdle(nameof(OnSelectionChanged), OnSelectionChanged) + ); #endif } diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/DependencyInjection/RevitConnectorModule.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/DependencyInjection/RevitConnectorModule.cs index c1bace9a0..e989d4a54 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/DependencyInjection/RevitConnectorModule.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/DependencyInjection/RevitConnectorModule.cs @@ -1,5 +1,5 @@ +using System.Reflection; using Autodesk.Revit.DB; -using CefSharp; using Microsoft.Extensions.DependencyInjection; using Speckle.Connectors.Common; using Speckle.Connectors.Common.Builders; @@ -15,7 +15,13 @@ using Speckle.Connectors.Revit.Operations.Send; using Speckle.Connectors.Revit.Operations.Send.Settings; using Speckle.Connectors.Revit.Plugin; using Speckle.Converters.Common; +using Speckle.Sdk; using Speckle.Sdk.Models.GraphTraversal; +#if REVIT2026_OR_GREATER +using Speckle.Connectors.Revit2026.Plugin; +#else +using CefSharp; +#endif namespace Speckle.Connectors.Revit.DependencyInjection; @@ -27,6 +33,7 @@ public static class ServiceRegistration serviceCollection.AddConnectors(); serviceCollection.AddDUI(); RegisterUiDependencies(serviceCollection); + serviceCollection.AddMatchingInterfacesAsTransient(Assembly.GetExecutingAssembly()); // Storage Schema serviceCollection.AddScoped(); @@ -80,7 +87,7 @@ public static class ServiceRegistration serviceCollection.AddSingleton(); serviceCollection.AddSingleton(sp => sp.GetRequiredService()); serviceCollection.AddSingleton(); -#else +#elif !REVIT2026_OR_GREATER // different versions for different versions of CEF serviceCollection.AddSingleton(BindingOptions.DefaultBinder); @@ -90,6 +97,11 @@ public static class ServiceRegistration serviceCollection.AddSingleton(panel); serviceCollection.AddSingleton(c => c.GetRequiredService()); serviceCollection.AddSingleton(); +#else + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(c => c.GetRequiredService()); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); #endif } } diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/HostApp/RevitDocumentStore.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/HostApp/RevitDocumentStore.cs index 1d6689cbe..3ebd23788 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/HostApp/RevitDocumentStore.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/HostApp/RevitDocumentStore.cs @@ -7,6 +7,7 @@ using Speckle.Connectors.Common.Threading; using Speckle.Connectors.DUI.Bridge; using Speckle.Connectors.DUI.Models; using Speckle.Connectors.DUI.Utils; +using Speckle.Connectors.Revit.Plugin; using Speckle.Converters.RevitShared.Helpers; using Speckle.Sdk.Common; @@ -33,7 +34,8 @@ internal sealed class RevitDocumentStore : DocumentModelStore DocumentModelStorageSchema documentModelStorageSchema, IdStorageSchema idStorageSchema, ITopLevelExceptionHandler topLevelExceptionHandler, - IThreadContext threadContext + IThreadContext threadContext, + IRevitTask revitTask ) : base(logger, jsonSerializer) { @@ -46,18 +48,21 @@ internal sealed class RevitDocumentStore : DocumentModelStore UIApplication uiApplication = _revitContext.UIApplication.NotNull(); - uiApplication.ViewActivated += (s, e) => _topLevelExceptionHandler.CatchUnhandled(() => OnViewActivated(s, e)); + revitTask.Run(() => + { + uiApplication.ViewActivated += (s, e) => _topLevelExceptionHandler.CatchUnhandled(() => OnViewActivated(s, e)); - uiApplication.Application.DocumentOpening += (_, _) => - _topLevelExceptionHandler.CatchUnhandled(() => IsDocumentInit = false); + uiApplication.Application.DocumentOpening += (_, _) => + _topLevelExceptionHandler.CatchUnhandled(() => IsDocumentInit = false); - uiApplication.Application.DocumentOpened += (_, _) => - _topLevelExceptionHandler.CatchUnhandled(() => IsDocumentInit = false); + uiApplication.Application.DocumentOpened += (_, _) => + _topLevelExceptionHandler.CatchUnhandled(() => IsDocumentInit = false); - // There is no event that we can hook here for double-click file open... - // It is kind of harmless since we create this object as "SingleInstance". - LoadState(); - OnDocumentChanged(); + // There is no event that we can hook here for double-click file open... + // It is kind of harmless since we create this object as "SingleInstance". + LoadState(); + OnDocumentChanged(); + }); } /// diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitCefPlugin.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitCefPlugin.cs index 83b96b18d..7bbbb0c90 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitCefPlugin.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitCefPlugin.cs @@ -1,3 +1,4 @@ +#if !REVIT2026_OR_GREATER using System.Diagnostics; using System.IO; using System.Reflection; @@ -6,7 +7,6 @@ using System.Windows.Media.Imaging; 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; @@ -104,7 +104,7 @@ internal sealed class RevitCefPlugin : IRevitPlugin _revitContext.UIApplication = uiApplication; // POC: might be worth to interface this out, we shall see... - RevitTask.Initialize(uiApplication); + global::Revit.Async.RevitTask.Initialize(uiApplication); PostApplicationInit(); // for double-click file open } @@ -181,3 +181,4 @@ internal sealed class RevitCefPlugin : IRevitPlugin return null; } } +#endif diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitExternalApplication.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitExternalApplication.cs index 7e0200fc6..ef7464e1c 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitExternalApplication.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitExternalApplication.cs @@ -1,7 +1,6 @@ using Autodesk.Revit.UI; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Revit.Async; using Speckle.Connectors.Common; using Speckle.Connectors.DUI; using Speckle.Connectors.Revit.DependencyInjection; @@ -30,6 +29,8 @@ internal sealed class RevitExternalApplication : IExternalApplication return HostAppVersion.v2024; #elif REVIT2025 return HostAppVersion.v2025; +#elif REVIT2026 + return HostAppVersion.v2026; #else throw new NotImplementedException(); #endif @@ -50,7 +51,7 @@ internal sealed class RevitExternalApplication : IExternalApplication _container = services.BuildServiceProvider(); _container.UseDUI(); - RevitTask.Initialize(application); + global::Revit.Async.RevitTask.Initialize(application); // resolve root object _revitPlugin = _container.GetRequiredService(); _revitPlugin.Initialise(); @@ -58,7 +59,7 @@ internal sealed class RevitExternalApplication : IExternalApplication catch (Exception e) when (!e.IsFatal()) { _container - .GetRequiredService() + ?.GetRequiredService() .CreateLogger() .LogCritical(e, "Unhandled exception"); // POC: feedback? diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitIdleManager.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitIdleManager.cs index 3154fb3bd..90096861c 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitIdleManager.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitIdleManager.cs @@ -17,14 +17,17 @@ public sealed class RevitIdleManager : AppIdleManager public RevitIdleManager( RevitContext revitContext, IIdleCallManager idleCallManager, - ITopLevelExceptionHandler topLevelExceptionHandler + ITopLevelExceptionHandler topLevelExceptionHandler, + IRevitTask revitTask ) : base(idleCallManager) { _topLevelExceptionHandler = topLevelExceptionHandler; _uiApplication = revitContext.UIApplication.NotNull(); _idleCallManager = idleCallManager; - _uiApplication.Idling += (s, e) => OnIdle?.Invoke(s, e); // will be called on the main thread always and fixing the Revit exceptions on subscribing/unsubscribing Idle events + revitTask.Run( + () => _uiApplication.Idling += (s, e) => OnIdle?.Invoke(s, e) // will be called on the main thread always and fixing the Revit exceptions on subscribing/unsubscribing Idle events + ); } protected override void AddEvent() diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitTask.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitTask.cs new file mode 100644 index 000000000..7819996b2 --- /dev/null +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitTask.cs @@ -0,0 +1,21 @@ +using Speckle.Connectors.Common.Threading; +using Speckle.Connectors.DUI.Bridge; +using Speckle.InterfaceGenerator; + +namespace Speckle.Connectors.Revit.Plugin; + +[GenerateAutoInterface] +public class RevitTask(ITopLevelExceptionHandler topLevelExceptionHandler) : IRevitTask +{ + public void Run(Func handler) => + global::Revit.Async.RevitTask.RunAsync(() => topLevelExceptionHandler.FireAndForget(handler)).FireAndForget(); + + public void Run(Action handler) => + global::Revit.Async.RevitTask.RunAsync(() => topLevelExceptionHandler.CatchUnhandled(handler)).FireAndForget(); + + public Task RunAsync(Func handler) => + global::Revit.Async.RevitTask.RunAsync(() => topLevelExceptionHandler.CatchUnhandledAsync(handler)); + + public Task RunAsync(Action handler) => + global::Revit.Async.RevitTask.RunAsync(() => topLevelExceptionHandler.CatchUnhandled(handler)); +} diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitThreadContext.cs b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitThreadContext.cs index e3ce30156..0af6b59ce 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitThreadContext.cs +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Plugin/RevitThreadContext.cs @@ -1,4 +1,3 @@ -using Revit.Async; using Speckle.Connectors.Common.Threading; using Speckle.Sdk; @@ -26,7 +25,7 @@ public class RevitThreadContext : ThreadContext { Exception? ex = null; //force the usage of the application overload - var ret = await RevitTask.RunAsync(_ => + var ret = await global::Revit.Async.RevitTask.RunAsync(_ => { try { @@ -49,7 +48,7 @@ public class RevitThreadContext : ThreadContext { Exception? ex = null; //force the usage of the application overload - var ret = await RevitTask.RunAsync(async _ => + var ret = await global::Revit.Async.RevitTask.RunAsync(async _ => { try { @@ -72,7 +71,7 @@ public class RevitThreadContext : ThreadContext { Exception? ex = null; //force the usage of the application overload - await RevitTask.RunAsync(async _ => + await global::Revit.Async.RevitTask.RunAsync(async _ => { try { @@ -93,7 +92,7 @@ public class RevitThreadContext : ThreadContext { Exception? ex = null; //force the usage of the application overload - await RevitTask.RunAsync(() => + await global::Revit.Async.RevitTask.RunAsync(() => { try { diff --git a/Connectors/Revit/Speckle.Connectors.RevitShared/Speckle.Connectors.RevitShared.projitems b/Connectors/Revit/Speckle.Connectors.RevitShared/Speckle.Connectors.RevitShared.projitems index 87c6cfa43..6e1313837 100644 --- a/Connectors/Revit/Speckle.Connectors.RevitShared/Speckle.Connectors.RevitShared.projitems +++ b/Connectors/Revit/Speckle.Connectors.RevitShared/Speckle.Connectors.RevitShared.projitems @@ -51,6 +51,7 @@ + diff --git a/Connectors/Tekla/Speckle.Connector.TeklaShared/Bindings/TeklaSelectionBinding.cs b/Connectors/Tekla/Speckle.Connector.TeklaShared/Bindings/TeklaSelectionBinding.cs index a3d66cc95..03aad488c 100644 --- a/Connectors/Tekla/Speckle.Connector.TeklaShared/Bindings/TeklaSelectionBinding.cs +++ b/Connectors/Tekla/Speckle.Connector.TeklaShared/Bindings/TeklaSelectionBinding.cs @@ -46,7 +46,7 @@ public class TeklaSelectionBinding : ISelectionBinding private void UpdateSelection() { SelectionInfo selInfo = GetSelection(); - Parent.Send2(SELECTION_EVENT, selInfo); + Parent.Send(SELECTION_EVENT, selInfo); } public SelectionInfo GetSelection() diff --git a/Converters/Revit/Speckle.Converters.Revit2026/Speckle.Converters.Revit2026.csproj b/Converters/Revit/Speckle.Converters.Revit2026/Speckle.Converters.Revit2026.csproj new file mode 100644 index 000000000..013b2c561 --- /dev/null +++ b/Converters/Revit/Speckle.Converters.Revit2026/Speckle.Converters.Revit2026.csproj @@ -0,0 +1,20 @@ + + + + net8.0-windows + x64 + Debug;Release;Local + $(DefineConstants);REVIT2025;REVIT2022_OR_GREATER;REVIT2023_OR_GREATER;REVIT2024_OR_GREATER;REVIT2025_OR_GREATER + + + + + + + + + + + + + diff --git a/Converters/Revit/Speckle.Converters.Revit2026/packages.lock.json b/Converters/Revit/Speckle.Converters.Revit2026/packages.lock.json new file mode 100644 index 000000000..b417c9937 --- /dev/null +++ b/Converters/Revit/Speckle.Converters.Revit2026/packages.lock.json @@ -0,0 +1,277 @@ +{ + "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, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "PolySharp": { + "type": "Direct", + "requested": "[1.14.1, )", + "resolved": "1.14.1", + "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" + }, + "Speckle.InterfaceGenerator": { + "type": "Direct", + "requested": "[0.9.6, )", + "resolved": "0.9.6", + "contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w==" + }, + "Speckle.Revit.API": { + "type": "Direct", + "requested": "[2026.0.0, )", + "resolved": "2026.0.0", + "contentHash": "SiqqKbF1pXyZWXZhAl2JhjYhTt7RiYO5JaQrAjq+OlleAjT4zatwAp/DnTwQspFbP7UZr3b2Ed2kuWNN0ZFelw==" + }, + "GraphQL.Client": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "8yPNBbuVBpTptivyAlak4GZvbwbUcjeQTL4vN1HKHRuOykZ4r7l5fcLS6vpyPyLn0x8FsL31xbOIKyxbmR9rbA==", + "dependencies": { + "GraphQL.Client.Abstractions": "6.0.0", + "GraphQL.Client.Abstractions.Websocket": "6.0.0", + "System.Reactive": "5.0.0" + } + }, + "GraphQL.Client.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "h7uzWFORHZ+CCjwr/ThAyXMr0DPpzEANDa4Uo54wqCQ+j7qUKwqYTgOrb1W40sqbvNaZm9v/X7It31SUw0maHA==", + "dependencies": { + "GraphQL.Primitives": "6.0.0" + } + }, + "GraphQL.Client.Abstractions.Websocket": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Nr9bPf8gIOvLuXpqEpqr9z9jslYFJOvd0feHth3/kPqeR3uMbjF5pjiwh4jxyMcxHdr8Pb6QiXkV3hsSyt0v7A==", + "dependencies": { + "GraphQL.Client.Abstractions": "6.0.0" + } + }, + "GraphQL.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite": { + "type": "Transitive", + "resolved": "7.0.5", + "contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "7.0.5", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.4" + } + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "7.0.5", + "contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.4" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "2.2.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", + "dependencies": { + "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": "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", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Speckle.Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.2", + "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "EWI1olKDjFEBMJu0+3wuxwziIAdWDVMYLhuZ3Qs84rrz+DHwD00RzWPZCa+bLnHCf3oJwuFZIRsHT5p236QXww==", + "dependencies": { + "SQLitePCLRaw.lib.e_sqlite3": "2.1.4", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.4" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "inBjvSHo9UDKneGNzfUfDjK08JzlcIhn1+SP5Y3m6cgXpCxXKCJDy6Mka7LpgSV+UZmKSnC8rTwB0SQ0xKu5pA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.4", + "contentHash": "CSlb5dUp1FMIkez9Iv5EXzpeq7rHryVNqwJMWnpq87j9zWZexaEMdisDktMsnnrzKM6ahNrsTkjqNodTBPBxtQ==", + "dependencies": { + "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", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" + }, + "speckle.converters.common": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )", + "Speckle.Objects": "[3.3.3, )" + } + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[2.2.0, )", + "resolved": "2.2.0", + "contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", + "dependencies": { + "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": "[2.2.0, )", + "resolved": "2.2.0", + "contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==" + }, + "Speckle.DoubleNumerics": { + "type": "CentralTransitive", + "requested": "[4.1.0, )", + "resolved": "4.1.0", + "contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A==" + }, + "Speckle.Objects": { + "type": "CentralTransitive", + "requested": "[3.3.3, )", + "resolved": "3.3.3", + "contentHash": "JCwkfdY4t7MgyrvxeLRZONRjby3qs6vbAqyyOtp9stoqRZiChNugX2ufEs1h7kXoRleYnZVGGHzy2Fbiy5B1ww==", + "dependencies": { + "Speckle.Sdk": "3.3.3" + } + }, + "Speckle.Sdk": { + "type": "CentralTransitive", + "requested": "[3.3.3, )", + "resolved": "3.3.3", + "contentHash": "1iC0P2ckeQ7smc9iOf2G1xFR1e1eQBQ122CHTx+b0/4m1LorlyAiW4PYui6erxM72fM6fM4b3r30ey2ceF8ffg==", + "dependencies": { + "GraphQL.Client": "6.0.0", + "Microsoft.CSharp": "4.7.0", + "Microsoft.Data.Sqlite": "7.0.5", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.Logging": "2.2.0", + "Speckle.DoubleNumerics": "4.1.0", + "Speckle.Newtonsoft.Json": "13.0.2", + "Speckle.Sdk.Dependencies": "3.3.3" + } + }, + "Speckle.Sdk.Dependencies": { + "type": "CentralTransitive", + "requested": "[3.3.3, )", + "resolved": "3.3.3", + "contentHash": "mroKNj1mlYLDeBHazsWofp6IHxAOWrRULUEqQd/BfeixXrQswruQ+w6OHEu2IoTqLHyVr/SLhMaBW61WxNG8aw==" + } + } + } +} \ No newline at end of file diff --git a/DUI3/Speckle.Connectors.DUI.WebView/DUI3ControlWebView.xaml.cs b/DUI3/Speckle.Connectors.DUI.WebView/DUI3ControlWebView.xaml.cs index 59307e4bb..bf46475c8 100644 --- a/DUI3/Speckle.Connectors.DUI.WebView/DUI3ControlWebView.xaml.cs +++ b/DUI3/Speckle.Connectors.DUI.WebView/DUI3ControlWebView.xaml.cs @@ -41,6 +41,8 @@ public sealed partial class DUI3ControlWebView : UserControl, IBrowserScriptExec ); } + public void SendProgress(string script) => ExecuteScript(script); + private void OnInitialized(object? sender, CoreWebView2InitializationCompletedEventArgs e) { if (!e.IsSuccess) diff --git a/DUI3/Speckle.Connectors.DUI/Bindings/OperationProgressManager.cs b/DUI3/Speckle.Connectors.DUI/Bindings/OperationProgressManager.cs index 1b6f553ec..c8dd08700 100644 --- a/DUI3/Speckle.Connectors.DUI/Bindings/OperationProgressManager.cs +++ b/DUI3/Speckle.Connectors.DUI/Bindings/OperationProgressManager.cs @@ -75,5 +75,5 @@ public class OperationProgressManager : IOperationProgressManager } private static void SendProgress(IBrowserBridge bridge, string modelCardId, ModelCardProgress progress) => - bridge.Send2(SET_MODEL_PROGRESS_UI_COMMAND_NAME, new { modelCardId, progress }); + bridge.SendProgress(SET_MODEL_PROGRESS_UI_COMMAND_NAME, new { modelCardId, progress }); } diff --git a/DUI3/Speckle.Connectors.DUI/Bridge/BrowserBridge.cs b/DUI3/Speckle.Connectors.DUI/Bridge/BrowserBridge.cs index 228775334..034b44d85 100644 --- a/DUI3/Speckle.Connectors.DUI/Bridge/BrowserBridge.cs +++ b/DUI3/Speckle.Connectors.DUI/Bridge/BrowserBridge.cs @@ -295,7 +295,7 @@ public sealed class BrowserBridge : IBrowserBridge return Task.CompletedTask; } - public void Send2(string eventName, T data) + public void SendProgress(string eventName, T data) where T : class { if (_binding is null) @@ -307,6 +307,6 @@ public sealed class BrowserBridge : IBrowserBridge string requestId = $"{Guid.NewGuid()}_{eventName}"; _resultsStore[requestId] = payload; var script = $"{FrontendBoundName}.emitResponseReady('{eventName}', '{requestId}')"; - _browserScriptExecutor.ExecuteScript(script); + _browserScriptExecutor.SendProgress(script); } } diff --git a/DUI3/Speckle.Connectors.DUI/Bridge/IBrowserBridge.cs b/DUI3/Speckle.Connectors.DUI/Bridge/IBrowserBridge.cs index 20c85708f..08b43a322 100644 --- a/DUI3/Speckle.Connectors.DUI/Bridge/IBrowserBridge.cs +++ b/DUI3/Speckle.Connectors.DUI/Bridge/IBrowserBridge.cs @@ -40,6 +40,6 @@ public interface IBrowserBridge public Task Send(string eventName, T data, CancellationToken cancellationToken = default) where T : class; - public void Send2(string eventName, T data) + public void SendProgress(string eventName, T data) where T : class; } diff --git a/DUI3/Speckle.Connectors.DUI/Bridge/IBrowserScriptExecutor.cs b/DUI3/Speckle.Connectors.DUI/Bridge/IBrowserScriptExecutor.cs index c0979f36c..fccc8aab4 100644 --- a/DUI3/Speckle.Connectors.DUI/Bridge/IBrowserScriptExecutor.cs +++ b/DUI3/Speckle.Connectors.DUI/Bridge/IBrowserScriptExecutor.cs @@ -4,14 +4,16 @@ public interface IBrowserScriptExecutor { /// thrown when is /// The (constant string) script to execute on the browser - public void ExecuteScript(string script); + void ExecuteScript(string script); - public bool IsBrowserInitialized { get; } + void SendProgress(string script); - public object BrowserElement { get; } + bool IsBrowserInitialized { get; } + + object BrowserElement { get; } /// /// Action that opens up the developer tools of the respective browser we're using. While webview2 allows for "right click, inspect", cefsharp does not - hence the need for this. /// - public void ShowDevTools(); + void ShowDevTools(); } diff --git a/Local.sln b/Local.sln index 218cbaa66..e8de830f9 100644 --- a/Local.sln +++ b/Local.sln @@ -289,6 +289,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Connectors.Grasshop EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Connectors.GrasshopperShared", "Connectors\Rhino\Speckle.Connectors.GrasshopperShared\Speckle.Connectors.GrasshopperShared.shproj", "{B6FBB8F4-4E2D-41D9-AC3F-1E30D0C8E87C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2026", "2026", "{6B2DFE65-31AF-474E-87BD-E85E53D290C1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Converters.Revit2026", "Converters\Revit\Speckle.Converters.Revit2026\Speckle.Converters.Revit2026.csproj", "{6006ECF4-FAEC-4200-B3A1-9B5A670AAF42}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Connectors.Revit2026", "Connectors\Revit\Speckle.Connectors.Revit2026\Speckle.Connectors.Revit2026.csproj", "{F98F97AC-D862-4750-B952-FBE4E9EE0EBA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -740,18 +746,6 @@ Global {C4061419-5E61-4A1A-ACA1-EAF4D174D6D3}.Local|Any CPU.Build.0 = Local|Any CPU {C4061419-5E61-4A1A-ACA1-EAF4D174D6D3}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4061419-5E61-4A1A-ACA1-EAF4D174D6D3}.Release|Any CPU.Build.0 = Release|Any CPU - {304DB2B8-7DA9-4A52-98E7-972887D8A4EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {304DB2B8-7DA9-4A52-98E7-972887D8A4EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {304DB2B8-7DA9-4A52-98E7-972887D8A4EF}.Local|Any CPU.ActiveCfg = Local|Any CPU - {304DB2B8-7DA9-4A52-98E7-972887D8A4EF}.Local|Any CPU.Build.0 = Local|Any CPU - {304DB2B8-7DA9-4A52-98E7-972887D8A4EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {304DB2B8-7DA9-4A52-98E7-972887D8A4EF}.Release|Any CPU.Build.0 = Release|Any CPU - {3E24CEFE-FC27-45DA-97BA-544027BB09DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E24CEFE-FC27-45DA-97BA-544027BB09DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E24CEFE-FC27-45DA-97BA-544027BB09DD}.Local|Any CPU.ActiveCfg = Local|Any CPU - {3E24CEFE-FC27-45DA-97BA-544027BB09DD}.Local|Any CPU.Build.0 = Local|Any CPU - {3E24CEFE-FC27-45DA-97BA-544027BB09DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E24CEFE-FC27-45DA-97BA-544027BB09DD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -882,9 +876,6 @@ Global {855008CB-80B6-48E9-82DE-CDA741434E22} = {44C95FA6-B91D-4F67-AB5C-7115032614A5} {2DBE21BB-CE33-449C-A377-D4148D56F810} = {44C95FA6-B91D-4F67-AB5C-7115032614A5} {C4061419-5E61-4A1A-ACA1-EAF4D174D6D3} = {44C95FA6-B91D-4F67-AB5C-7115032614A5} - {304DB2B8-7DA9-4A52-98E7-972887D8A4EF} = {201AF4EA-F049-4332-A746-42D3413DAE08} - {3E24CEFE-FC27-45DA-97BA-544027BB09DD} = {9714467A-AECB-45B5-82D8-3E7BFF6E37C8} - {B6FBB8F4-4E2D-41D9-AC3F-1E30D0C8E87C} = {A5D616EA-1D91-48BE-BAB8-3501A29F1C20} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EE253116-7070-4E9A-BCE8-2911C251B8C8} @@ -929,6 +920,7 @@ Global Connectors\CSi\Speckle.Connectors.ETABSShared\Speckle.Connectors.ETABSShared.projitems*{5d1e0b0d-56a7-4e13-b9a9-8633e02b8f17}*SharedItemsImports = 13 Converters\CSi\Speckle.Converters.CSiShared\Speckle.Converters.CSiShared.projitems*{5e924b13-b3e8-4724-9ba7-ce82e39866eb}*SharedItemsImports = 5 Converters\CSi\Speckle.Converters.ETABSShared\Speckle.Converters.ETABSShared.projitems*{5e924b13-b3e8-4724-9ba7-ce82e39866eb}*SharedItemsImports = 5 + Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{6006ecf4-faec-4200-b3a1-9b5a670aaf42}*SharedItemsImports = 5 Converters\Navisworks\Speckle.Converters.NavisworksShared\Speckle.Converters.NavisworksShared.projitems*{6101b44d-3805-4aa1-b8d0-e06c461ed202}*SharedItemsImports = 5 Connectors\Revit\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.projitems*{617bd3c7-87d9-4d28-8ac9-4910945bb9fc}*SharedItemsImports = 5 Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{617bd3c7-87d9-4d28-8ac9-4910945bb9fc}*SharedItemsImports = 5 @@ -980,6 +972,7 @@ Global Converters\Revit\Speckle.Converters.RevitShared.Tests\Speckle.Converters.RevitShared.Tests.projitems*{e1c43415-3202-45f4-8bf9-a4dd7d7f2ed6}*SharedItemsImports = 13 Connectors\Autocad\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.projitems*{eaad080d-49af-49bf-b8bd-a18ceb210734}*SharedItemsImports = 5 Connectors\Autocad\Speckle.Connectors.Civil3dShared\Speckle.Connectors.Civil3dShared.projitems*{efd01520-93e8-4cca-8e03-9cdc635f55f4}*SharedItemsImports = 13 + Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{f98f97ac-d862-4750-b952-fbe4e9ee0eba}*SharedItemsImports = 5 Connectors\Navisworks\Speckle.Connectors.NavisworksShared\Speckle.Connectors.NavisworksShared.projitems*{fd44e1f0-d20a-49b6-adc9-482d911a74fb}*SharedItemsImports = 5 Connectors\Autocad\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.projitems*{fe4cb79d-4e59-4070-871c-108545537e6c}*SharedItemsImports = 5 Connectors\Autocad\Speckle.Connectors.Civil3dShared\Speckle.Connectors.Civil3dShared.projitems*{fe4cb79d-4e59-4070-871c-108545537e6c}*SharedItemsImports = 5 diff --git a/Speckle.Connectors.sln b/Speckle.Connectors.sln index 88d4b7c36..90280e9bd 100644 --- a/Speckle.Connectors.sln +++ b/Speckle.Connectors.sln @@ -298,6 +298,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Converters.Civil3d2 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Connectors.Civil3d2026", "Connectors\Autocad\Speckle.Connectors.Civil3d2026\Speckle.Connectors.Civil3d2026.csproj", "{EC0E8472-2C5F-424B-B868-7BBA272DF611}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2026", "2026", "{6B2DFE65-31AF-474E-87BD-E85E53D290C1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Converters.Revit2026", "Converters\Revit\Speckle.Converters.Revit2026\Speckle.Converters.Revit2026.csproj", "{6006ECF4-FAEC-4200-B3A1-9B5A670AAF42}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Connectors.Revit2026", "Connectors\Revit\Speckle.Connectors.Revit2026\Speckle.Connectors.Revit2026.csproj", "{F98F97AC-D862-4750-B952-FBE4E9EE0EBA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -499,8 +505,8 @@ Global {8098BAFC-DF1C-4AFA-A93E-08121E6D09D4}.Release|Any CPU.Build.0 = Release|Any CPU {2319C00F-B268-4E4C-9F88-6B379E2BBD22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2319C00F-B268-4E4C-9F88-6B379E2BBD22}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2319C00F-B268-4E4C-9F88-6B379E2BBD22}.Local|Any CPU.ActiveCfg = Release|Any CPU - {2319C00F-B268-4E4C-9F88-6B379E2BBD22}.Local|Any CPU.Build.0 = Release|Any CPU + {2319C00F-B268-4E4C-9F88-6B379E2BBD22}.Local|Any CPU.ActiveCfg = Local|Any CPU + {2319C00F-B268-4E4C-9F88-6B379E2BBD22}.Local|Any CPU.Build.0 = Local|Any CPU {2319C00F-B268-4E4C-9F88-6B379E2BBD22}.Release|Any CPU.ActiveCfg = Release|Any CPU {2319C00F-B268-4E4C-9F88-6B379E2BBD22}.Release|Any CPU.Build.0 = Release|Any CPU {9EF292C6-1333-4502-AD9C-224D99847185}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -511,14 +517,14 @@ Global {9EF292C6-1333-4502-AD9C-224D99847185}.Release|Any CPU.Build.0 = Release|Any CPU {81FCEE13-FEAC-475D-9EF9-71132EF26909}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {81FCEE13-FEAC-475D-9EF9-71132EF26909}.Debug|Any CPU.Build.0 = Debug|Any CPU - {81FCEE13-FEAC-475D-9EF9-71132EF26909}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {81FCEE13-FEAC-475D-9EF9-71132EF26909}.Local|Any CPU.Build.0 = Debug|Any CPU + {81FCEE13-FEAC-475D-9EF9-71132EF26909}.Local|Any CPU.ActiveCfg = Local|Any CPU + {81FCEE13-FEAC-475D-9EF9-71132EF26909}.Local|Any CPU.Build.0 = Local|Any CPU {81FCEE13-FEAC-475D-9EF9-71132EF26909}.Release|Any CPU.ActiveCfg = Release|Any CPU {81FCEE13-FEAC-475D-9EF9-71132EF26909}.Release|Any CPU.Build.0 = Release|Any CPU {AFAB80BD-A4DD-4CAD-9937-ACBFED668A48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AFAB80BD-A4DD-4CAD-9937-ACBFED668A48}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFAB80BD-A4DD-4CAD-9937-ACBFED668A48}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {AFAB80BD-A4DD-4CAD-9937-ACBFED668A48}.Local|Any CPU.Build.0 = Debug|Any CPU + {AFAB80BD-A4DD-4CAD-9937-ACBFED668A48}.Local|Any CPU.ActiveCfg = Local|Any CPU + {AFAB80BD-A4DD-4CAD-9937-ACBFED668A48}.Local|Any CPU.Build.0 = Local|Any CPU {AFAB80BD-A4DD-4CAD-9937-ACBFED668A48}.Release|Any CPU.ActiveCfg = Release|Any CPU {AFAB80BD-A4DD-4CAD-9937-ACBFED668A48}.Release|Any CPU.Build.0 = Release|Any CPU {5CDEC958-708E-4D19-A79E-0C1DB23A6039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -535,26 +541,26 @@ Global {842F4BFD-3997-485D-BAB5-9419C1D982F2}.Release|Any CPU.Build.0 = Release|Any CPU {4459F2B1-A340-488E-A856-EB2AE9C72AD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4459F2B1-A340-488E-A856-EB2AE9C72AD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4459F2B1-A340-488E-A856-EB2AE9C72AD4}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {4459F2B1-A340-488E-A856-EB2AE9C72AD4}.Local|Any CPU.Build.0 = Debug|Any CPU + {4459F2B1-A340-488E-A856-EB2AE9C72AD4}.Local|Any CPU.ActiveCfg = Local|Any CPU + {4459F2B1-A340-488E-A856-EB2AE9C72AD4}.Local|Any CPU.Build.0 = Local|Any CPU {4459F2B1-A340-488E-A856-EB2AE9C72AD4}.Release|Any CPU.ActiveCfg = Release|Any CPU {4459F2B1-A340-488E-A856-EB2AE9C72AD4}.Release|Any CPU.Build.0 = Release|Any CPU {DB31E57B-60FC-49BE-91E0-1374290BCF03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DB31E57B-60FC-49BE-91E0-1374290BCF03}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB31E57B-60FC-49BE-91E0-1374290BCF03}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {DB31E57B-60FC-49BE-91E0-1374290BCF03}.Local|Any CPU.Build.0 = Debug|Any CPU + {DB31E57B-60FC-49BE-91E0-1374290BCF03}.Local|Any CPU.ActiveCfg = Local|Any CPU + {DB31E57B-60FC-49BE-91E0-1374290BCF03}.Local|Any CPU.Build.0 = Local|Any CPU {DB31E57B-60FC-49BE-91E0-1374290BCF03}.Release|Any CPU.ActiveCfg = Release|Any CPU {DB31E57B-60FC-49BE-91E0-1374290BCF03}.Release|Any CPU.Build.0 = Release|Any CPU {ACF75860-7FCE-4AE9-8C45-68AD1043550B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ACF75860-7FCE-4AE9-8C45-68AD1043550B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ACF75860-7FCE-4AE9-8C45-68AD1043550B}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {ACF75860-7FCE-4AE9-8C45-68AD1043550B}.Local|Any CPU.Build.0 = Debug|Any CPU + {ACF75860-7FCE-4AE9-8C45-68AD1043550B}.Local|Any CPU.ActiveCfg = Local|Any CPU + {ACF75860-7FCE-4AE9-8C45-68AD1043550B}.Local|Any CPU.Build.0 = Local|Any CPU {ACF75860-7FCE-4AE9-8C45-68AD1043550B}.Release|Any CPU.ActiveCfg = Release|Any CPU {ACF75860-7FCE-4AE9-8C45-68AD1043550B}.Release|Any CPU.Build.0 = Release|Any CPU {025C85F8-F741-4600-BC46-5FEAD754B65D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {025C85F8-F741-4600-BC46-5FEAD754B65D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {025C85F8-F741-4600-BC46-5FEAD754B65D}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {025C85F8-F741-4600-BC46-5FEAD754B65D}.Local|Any CPU.Build.0 = Debug|Any CPU + {025C85F8-F741-4600-BC46-5FEAD754B65D}.Local|Any CPU.ActiveCfg = Local|Any CPU + {025C85F8-F741-4600-BC46-5FEAD754B65D}.Local|Any CPU.Build.0 = Local|Any CPU {025C85F8-F741-4600-BC46-5FEAD754B65D}.Release|Any CPU.ActiveCfg = Release|Any CPU {025C85F8-F741-4600-BC46-5FEAD754B65D}.Release|Any CPU.Build.0 = Release|Any CPU {8F9181C2-1808-44C0-A33A-5BAE40C49E63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -583,20 +589,20 @@ Global {115D6106-1801-484A-B4E5-BCC94B6E5C7F}.Release|Any CPU.Build.0 = Release|Any CPU {791E3288-8001-4D54-8EAB-03D1D7F51044}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {791E3288-8001-4D54-8EAB-03D1D7F51044}.Debug|Any CPU.Build.0 = Debug|Any CPU - {791E3288-8001-4D54-8EAB-03D1D7F51044}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {791E3288-8001-4D54-8EAB-03D1D7F51044}.Local|Any CPU.Build.0 = Debug|Any CPU + {791E3288-8001-4D54-8EAB-03D1D7F51044}.Local|Any CPU.ActiveCfg = Local|Any CPU + {791E3288-8001-4D54-8EAB-03D1D7F51044}.Local|Any CPU.Build.0 = Local|Any CPU {791E3288-8001-4D54-8EAB-03D1D7F51044}.Release|Any CPU.ActiveCfg = Release|Any CPU {791E3288-8001-4D54-8EAB-03D1D7F51044}.Release|Any CPU.Build.0 = Release|Any CPU {D61ECD90-3D17-4AF0-8B1A-0E0AD302DFF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D61ECD90-3D17-4AF0-8B1A-0E0AD302DFF9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D61ECD90-3D17-4AF0-8B1A-0E0AD302DFF9}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {D61ECD90-3D17-4AF0-8B1A-0E0AD302DFF9}.Local|Any CPU.Build.0 = Debug|Any CPU + {D61ECD90-3D17-4AF0-8B1A-0E0AD302DFF9}.Local|Any CPU.ActiveCfg = Local|Any CPU + {D61ECD90-3D17-4AF0-8B1A-0E0AD302DFF9}.Local|Any CPU.Build.0 = Local|Any CPU {D61ECD90-3D17-4AF0-8B1A-0E0AD302DFF9}.Release|Any CPU.ActiveCfg = Release|Any CPU {D61ECD90-3D17-4AF0-8B1A-0E0AD302DFF9}.Release|Any CPU.Build.0 = Release|Any CPU {8C14D930-03D2-4E2F-9D8D-A6B57F57A659}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C14D930-03D2-4E2F-9D8D-A6B57F57A659}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8C14D930-03D2-4E2F-9D8D-A6B57F57A659}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {8C14D930-03D2-4E2F-9D8D-A6B57F57A659}.Local|Any CPU.Build.0 = Debug|Any CPU + {8C14D930-03D2-4E2F-9D8D-A6B57F57A659}.Local|Any CPU.ActiveCfg = Local|Any CPU + {8C14D930-03D2-4E2F-9D8D-A6B57F57A659}.Local|Any CPU.Build.0 = Local|Any CPU {8C14D930-03D2-4E2F-9D8D-A6B57F57A659}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C14D930-03D2-4E2F-9D8D-A6B57F57A659}.Release|Any CPU.Build.0 = Release|Any CPU {B12D6A2E-51FD-4197-B442-46C7D8F5E4E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -607,8 +613,8 @@ Global {B12D6A2E-51FD-4197-B442-46C7D8F5E4E4}.Release|Any CPU.Build.0 = Release|Any CPU {B6985672-4704-4F86-A3E0-2310BF8E6D73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B6985672-4704-4F86-A3E0-2310BF8E6D73}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B6985672-4704-4F86-A3E0-2310BF8E6D73}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {B6985672-4704-4F86-A3E0-2310BF8E6D73}.Local|Any CPU.Build.0 = Debug|Any CPU + {B6985672-4704-4F86-A3E0-2310BF8E6D73}.Local|Any CPU.ActiveCfg = Local|Any CPU + {B6985672-4704-4F86-A3E0-2310BF8E6D73}.Local|Any CPU.Build.0 = Local|Any CPU {B6985672-4704-4F86-A3E0-2310BF8E6D73}.Release|Any CPU.ActiveCfg = Release|Any CPU {B6985672-4704-4F86-A3E0-2310BF8E6D73}.Release|Any CPU.Build.0 = Release|Any CPU {56680EA7-3599-4D88-83A5-B43BA93AC046}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -643,38 +649,38 @@ Global {0B5AB325-3791-4A81-B0EF-BCA040381BE2}.Release|Any CPU.Build.0 = Release|Any CPU {C635619C-2938-4E6F-9E25-56CE1632A7EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C635619C-2938-4E6F-9E25-56CE1632A7EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C635619C-2938-4E6F-9E25-56CE1632A7EC}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {C635619C-2938-4E6F-9E25-56CE1632A7EC}.Local|Any CPU.Build.0 = Debug|Any CPU + {C635619C-2938-4E6F-9E25-56CE1632A7EC}.Local|Any CPU.ActiveCfg = Local|Any CPU + {C635619C-2938-4E6F-9E25-56CE1632A7EC}.Local|Any CPU.Build.0 = Local|Any CPU {C635619C-2938-4E6F-9E25-56CE1632A7EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {C635619C-2938-4E6F-9E25-56CE1632A7EC}.Release|Any CPU.Build.0 = Release|Any CPU {04FC86A3-2E25-41A1-98C5-10898616CD78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {04FC86A3-2E25-41A1-98C5-10898616CD78}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04FC86A3-2E25-41A1-98C5-10898616CD78}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {04FC86A3-2E25-41A1-98C5-10898616CD78}.Local|Any CPU.Build.0 = Debug|Any CPU + {04FC86A3-2E25-41A1-98C5-10898616CD78}.Local|Any CPU.ActiveCfg = Local|Any CPU + {04FC86A3-2E25-41A1-98C5-10898616CD78}.Local|Any CPU.Build.0 = Local|Any CPU {04FC86A3-2E25-41A1-98C5-10898616CD78}.Release|Any CPU.ActiveCfg = Release|Any CPU {04FC86A3-2E25-41A1-98C5-10898616CD78}.Release|Any CPU.Build.0 = Release|Any CPU {FD44E1F0-D20A-49B6-ADC9-482D911A74FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD44E1F0-D20A-49B6-ADC9-482D911A74FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD44E1F0-D20A-49B6-ADC9-482D911A74FB}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {FD44E1F0-D20A-49B6-ADC9-482D911A74FB}.Local|Any CPU.Build.0 = Debug|Any CPU + {FD44E1F0-D20A-49B6-ADC9-482D911A74FB}.Local|Any CPU.ActiveCfg = Local|Any CPU + {FD44E1F0-D20A-49B6-ADC9-482D911A74FB}.Local|Any CPU.Build.0 = Local|Any CPU {FD44E1F0-D20A-49B6-ADC9-482D911A74FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD44E1F0-D20A-49B6-ADC9-482D911A74FB}.Release|Any CPU.Build.0 = Release|Any CPU {7791806E-7531-41D8-9C9D-4A1249D9F99C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7791806E-7531-41D8-9C9D-4A1249D9F99C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7791806E-7531-41D8-9C9D-4A1249D9F99C}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {7791806E-7531-41D8-9C9D-4A1249D9F99C}.Local|Any CPU.Build.0 = Debug|Any CPU + {7791806E-7531-41D8-9C9D-4A1249D9F99C}.Local|Any CPU.ActiveCfg = Local|Any CPU + {7791806E-7531-41D8-9C9D-4A1249D9F99C}.Local|Any CPU.Build.0 = Local|Any CPU {7791806E-7531-41D8-9C9D-4A1249D9F99C}.Release|Any CPU.ActiveCfg = Release|Any CPU {7791806E-7531-41D8-9C9D-4A1249D9F99C}.Release|Any CPU.Build.0 = Release|Any CPU {E6B7A640-F85C-41C9-8226-B5310A98822D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E6B7A640-F85C-41C9-8226-B5310A98822D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6B7A640-F85C-41C9-8226-B5310A98822D}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {E6B7A640-F85C-41C9-8226-B5310A98822D}.Local|Any CPU.Build.0 = Debug|Any CPU + {E6B7A640-F85C-41C9-8226-B5310A98822D}.Local|Any CPU.ActiveCfg = Local|Any CPU + {E6B7A640-F85C-41C9-8226-B5310A98822D}.Local|Any CPU.Build.0 = Local|Any CPU {E6B7A640-F85C-41C9-8226-B5310A98822D}.Release|Any CPU.ActiveCfg = Release|Any CPU {E6B7A640-F85C-41C9-8226-B5310A98822D}.Release|Any CPU.Build.0 = Release|Any CPU {FCD6CB79-6B41-4448-99E1-787408AD24B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FCD6CB79-6B41-4448-99E1-787408AD24B0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FCD6CB79-6B41-4448-99E1-787408AD24B0}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {FCD6CB79-6B41-4448-99E1-787408AD24B0}.Local|Any CPU.Build.0 = Debug|Any CPU + {FCD6CB79-6B41-4448-99E1-787408AD24B0}.Local|Any CPU.ActiveCfg = Local|Any CPU + {FCD6CB79-6B41-4448-99E1-787408AD24B0}.Local|Any CPU.Build.0 = Local|Any CPU {FCD6CB79-6B41-4448-99E1-787408AD24B0}.Release|Any CPU.ActiveCfg = Release|Any CPU {FCD6CB79-6B41-4448-99E1-787408AD24B0}.Release|Any CPU.Build.0 = Release|Any CPU {17FB6920-DF63-4D94-86A4-F1619D501C6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -685,8 +691,8 @@ Global {17FB6920-DF63-4D94-86A4-F1619D501C6D}.Release|Any CPU.Build.0 = Release|Any CPU {F86DFA8A-E2E0-4EBE-9BAF-72AE2698EDC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F86DFA8A-E2E0-4EBE-9BAF-72AE2698EDC6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F86DFA8A-E2E0-4EBE-9BAF-72AE2698EDC6}.Local|Any CPU.ActiveCfg = Debug|Any CPU - {F86DFA8A-E2E0-4EBE-9BAF-72AE2698EDC6}.Local|Any CPU.Build.0 = Debug|Any CPU + {F86DFA8A-E2E0-4EBE-9BAF-72AE2698EDC6}.Local|Any CPU.ActiveCfg = Local|Any CPU + {F86DFA8A-E2E0-4EBE-9BAF-72AE2698EDC6}.Local|Any CPU.Build.0 = Local|Any CPU {F86DFA8A-E2E0-4EBE-9BAF-72AE2698EDC6}.Release|Any CPU.ActiveCfg = Release|Any CPU {F86DFA8A-E2E0-4EBE-9BAF-72AE2698EDC6}.Release|Any CPU.Build.0 = Release|Any CPU {B740A025-1035-4A75-865B-7825857D610C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -743,6 +749,18 @@ Global {EC0E8472-2C5F-424B-B868-7BBA272DF611}.Local|Any CPU.Build.0 = Local|Any CPU {EC0E8472-2C5F-424B-B868-7BBA272DF611}.Release|Any CPU.ActiveCfg = Release|Any CPU {EC0E8472-2C5F-424B-B868-7BBA272DF611}.Release|Any CPU.Build.0 = Release|Any CPU + {6006ECF4-FAEC-4200-B3A1-9B5A670AAF42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6006ECF4-FAEC-4200-B3A1-9B5A670AAF42}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6006ECF4-FAEC-4200-B3A1-9B5A670AAF42}.Local|Any CPU.ActiveCfg = Local|Any CPU + {6006ECF4-FAEC-4200-B3A1-9B5A670AAF42}.Local|Any CPU.Build.0 = Local|Any CPU + {6006ECF4-FAEC-4200-B3A1-9B5A670AAF42}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6006ECF4-FAEC-4200-B3A1-9B5A670AAF42}.Release|Any CPU.Build.0 = Release|Any CPU + {F98F97AC-D862-4750-B952-FBE4E9EE0EBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F98F97AC-D862-4750-B952-FBE4E9EE0EBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F98F97AC-D862-4750-B952-FBE4E9EE0EBA}.Local|Any CPU.ActiveCfg = Local|Any CPU + {F98F97AC-D862-4750-B952-FBE4E9EE0EBA}.Local|Any CPU.Build.0 = Local|Any CPU + {F98F97AC-D862-4750-B952-FBE4E9EE0EBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F98F97AC-D862-4750-B952-FBE4E9EE0EBA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -876,6 +894,9 @@ Global {57D5EEC9-082C-4882-BA7A-956088A2B820} = {1D9F4468-A382-4D25-8195-F93A884B14DA} {17AFD669-AECB-4A45-AE09-BD1BF8248BDA} = {1D9F4468-A382-4D25-8195-F93A884B14DA} {EC0E8472-2C5F-424B-B868-7BBA272DF611} = {1D9F4468-A382-4D25-8195-F93A884B14DA} + {6B2DFE65-31AF-474E-87BD-E85E53D290C1} = {D92751C8-1039-4005-90B2-913E55E0B8BD} + {6006ECF4-FAEC-4200-B3A1-9B5A670AAF42} = {6B2DFE65-31AF-474E-87BD-E85E53D290C1} + {F98F97AC-D862-4750-B952-FBE4E9EE0EBA} = {6B2DFE65-31AF-474E-87BD-E85E53D290C1} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EE253116-7070-4E9A-BCE8-2911C251B8C8} @@ -915,6 +936,7 @@ Global Converters\Autocad\Speckle.Converters.AutocadShared\Speckle.Converters.AutocadShared.projitems*{5cdec958-708e-4d19-a79e-0c1db23a6039}*SharedItemsImports = 5 Converters\Civil3d\Speckle.Converters.Civil3dShared\Speckle.Converters.Civil3dShared.projitems*{5cdec958-708e-4d19-a79e-0c1db23a6039}*SharedItemsImports = 5 Connectors\CSi\Speckle.Connectors.ETABSShared\Speckle.Connectors.ETABSShared.projitems*{5d1e0b0d-56a7-4e13-b9a9-8633e02b8f17}*SharedItemsImports = 13 + Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{6006ecf4-faec-4200-b3a1-9b5a670aaf42}*SharedItemsImports = 5 Converters\Navisworks\Speckle.Converters.NavisworksShared\Speckle.Converters.NavisworksShared.projitems*{6101b44d-3805-4aa1-b8d0-e06c461ed202}*SharedItemsImports = 5 Connectors\Revit\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.projitems*{617bd3c7-87d9-4d28-8ac9-4910945bb9fc}*SharedItemsImports = 5 Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{617bd3c7-87d9-4d28-8ac9-4910945bb9fc}*SharedItemsImports = 5 @@ -972,6 +994,7 @@ Global Connectors\Autocad\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.projitems*{ec0e8472-2c5f-424b-b868-7bba272df611}*SharedItemsImports = 5 Connectors\Autocad\Speckle.Connectors.Civil3dShared\Speckle.Connectors.Civil3dShared.projitems*{ec0e8472-2c5f-424b-b868-7bba272df611}*SharedItemsImports = 5 Converters\Navisworks\Speckle.Converters.NavisworksShared\Speckle.Converters.NavisworksShared.projitems*{f8cc203d-e0dc-42da-99c1-ca07fdbceccc}*SharedItemsImports = 5 + Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{f98f97ac-d862-4750-b952-fbe4e9ee0eba}*SharedItemsImports = 5 Connectors\Navisworks\Speckle.Connectors.NavisworksShared\Speckle.Connectors.NavisworksShared.projitems*{fd44e1f0-d20a-49b6-adc9-482d911a74fb}*SharedItemsImports = 5 Connectors\Navisworks\Speckle.Connectors.NavisworksShared\Speckle.Connectors.NavisworksShared.projitems*{fe797118-07cb-44a7-a779-68ff3b69ee40}*SharedItemsImports = 5 EndGlobalSection