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