diff --git a/Connectors/Autocad/Speckle.Connectors.Autocad2022/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Autocad2022/packages.lock.json
index ef5a4df56..1f5498abb 100644
--- a/Connectors/Autocad/Speckle.Connectors.Autocad2022/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Autocad2022/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -292,7 +292,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -336,18 +336,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -357,14 +357,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Autocad/Speckle.Connectors.Autocad2023/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Autocad2023/packages.lock.json
index 522715e48..98ecde002 100644
--- a/Connectors/Autocad/Speckle.Connectors.Autocad2023/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Autocad2023/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -292,7 +292,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -336,18 +336,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -357,14 +357,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Autocad/Speckle.Connectors.Autocad2024/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Autocad2024/packages.lock.json
index 772a0ee13..8343bb0db 100644
--- a/Connectors/Autocad/Speckle.Connectors.Autocad2024/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Autocad2024/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -293,7 +293,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -337,18 +337,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -358,14 +358,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Autocad/Speckle.Connectors.Autocad2025/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Autocad2025/packages.lock.json
index 51655d26e..bfa79cfb0 100644
--- a/Connectors/Autocad/Speckle.Connectors.Autocad2025/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Autocad2025/packages.lock.json
@@ -210,9 +210,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -244,7 +244,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -288,18 +288,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -307,14 +307,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
"net8.0-windows7.0/win-x64": {
diff --git a/Connectors/Autocad/Speckle.Connectors.Autocad2026/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Autocad2026/packages.lock.json
index 6923864e9..1ee2d2f04 100644
--- a/Connectors/Autocad/Speckle.Connectors.Autocad2026/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Autocad2026/packages.lock.json
@@ -210,9 +210,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -244,7 +244,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -288,18 +288,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -307,14 +307,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
"net8.0-windows7.0/win-x64": {
diff --git a/Connectors/Autocad/Speckle.Connectors.AutocadShared/Speckle.Connectors.AutocadShared.shproj b/Connectors/Autocad/Speckle.Connectors.AutocadShared/Speckle.Connectors.AutocadShared.shproj
index afec409d7..152cf3693 100644
--- a/Connectors/Autocad/Speckle.Connectors.AutocadShared/Speckle.Connectors.AutocadShared.shproj
+++ b/Connectors/Autocad/Speckle.Connectors.AutocadShared/Speckle.Connectors.AutocadShared.shproj
@@ -3,6 +3,15 @@
{41BC679F-887F-44CF-971D-A5502EE87DB0}
+
+ bin\Debug\
+
+
+ bin\Local\
+
+
+ bin\Release\
+
diff --git a/Connectors/Autocad/Speckle.Connectors.Civil3d2022/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Civil3d2022/packages.lock.json
index 969fd7c42..1748c301d 100644
--- a/Connectors/Autocad/Speckle.Connectors.Civil3d2022/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Civil3d2022/packages.lock.json
@@ -268,9 +268,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -302,7 +302,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -346,18 +346,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -367,14 +367,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Autocad/Speckle.Connectors.Civil3d2023/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Civil3d2023/packages.lock.json
index b31a7c4ca..b5d6b1477 100644
--- a/Connectors/Autocad/Speckle.Connectors.Civil3d2023/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Civil3d2023/packages.lock.json
@@ -268,9 +268,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -302,7 +302,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -346,18 +346,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -367,14 +367,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Autocad/Speckle.Connectors.Civil3d2024/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Civil3d2024/packages.lock.json
index 83635cc1b..3845cc1ef 100644
--- a/Connectors/Autocad/Speckle.Connectors.Civil3d2024/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Civil3d2024/packages.lock.json
@@ -268,9 +268,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -302,7 +302,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -346,18 +346,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -367,14 +367,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Autocad/Speckle.Connectors.Civil3d2025/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Civil3d2025/packages.lock.json
index 7fe309a2b..c59c43308 100644
--- a/Connectors/Autocad/Speckle.Connectors.Civil3d2025/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Civil3d2025/packages.lock.json
@@ -219,9 +219,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -254,7 +254,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -298,18 +298,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -317,14 +317,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
"net8.0-windows7.0/win-x64": {
diff --git a/Connectors/Autocad/Speckle.Connectors.Civil3d2026/packages.lock.json b/Connectors/Autocad/Speckle.Connectors.Civil3d2026/packages.lock.json
index 27a39cd0d..c322e3717 100644
--- a/Connectors/Autocad/Speckle.Connectors.Civil3d2026/packages.lock.json
+++ b/Connectors/Autocad/Speckle.Connectors.Civil3d2026/packages.lock.json
@@ -219,9 +219,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -254,7 +254,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -298,18 +298,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -317,14 +317,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
"net8.0-windows7.0/win-x64": {
diff --git a/Connectors/CSi/Speckle.Connectors.ETABS21/packages.lock.json b/Connectors/CSi/Speckle.Connectors.ETABS21/packages.lock.json
index 94a115013..8ef15cc15 100644
--- a/Connectors/CSi/Speckle.Connectors.ETABS21/packages.lock.json
+++ b/Connectors/CSi/Speckle.Connectors.ETABS21/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -285,7 +285,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.etabs21": {
@@ -335,18 +335,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -356,14 +356,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/CSi/Speckle.Connectors.ETABS22/packages.lock.json b/Connectors/CSi/Speckle.Connectors.ETABS22/packages.lock.json
index 329631181..110b991f3 100644
--- a/Connectors/CSi/Speckle.Connectors.ETABS22/packages.lock.json
+++ b/Connectors/CSi/Speckle.Connectors.ETABS22/packages.lock.json
@@ -210,9 +210,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -236,7 +236,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.etabs22": {
@@ -286,18 +286,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -305,14 +305,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Navisworks/Speckle.Connectors.Navisworks2020/packages.lock.json b/Connectors/Navisworks/Speckle.Connectors.Navisworks2020/packages.lock.json
index 10f66ea73..1e5aa0fdd 100644
--- a/Connectors/Navisworks/Speckle.Connectors.Navisworks2020/packages.lock.json
+++ b/Connectors/Navisworks/Speckle.Connectors.Navisworks2020/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -285,7 +285,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.navisworks2020": {
@@ -337,18 +337,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -358,14 +358,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
".NETFramework,Version=v4.8/win-x64": {
diff --git a/Connectors/Navisworks/Speckle.Connectors.Navisworks2021/packages.lock.json b/Connectors/Navisworks/Speckle.Connectors.Navisworks2021/packages.lock.json
index 4f28df53f..35249759a 100644
--- a/Connectors/Navisworks/Speckle.Connectors.Navisworks2021/packages.lock.json
+++ b/Connectors/Navisworks/Speckle.Connectors.Navisworks2021/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -285,7 +285,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.navisworks2021": {
@@ -337,18 +337,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -358,14 +358,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
".NETFramework,Version=v4.8/win-x64": {
diff --git a/Connectors/Navisworks/Speckle.Connectors.Navisworks2022/packages.lock.json b/Connectors/Navisworks/Speckle.Connectors.Navisworks2022/packages.lock.json
index e3d3a2438..81d8f1ed5 100644
--- a/Connectors/Navisworks/Speckle.Connectors.Navisworks2022/packages.lock.json
+++ b/Connectors/Navisworks/Speckle.Connectors.Navisworks2022/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -285,7 +285,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.navisworks2022": {
@@ -337,18 +337,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -358,14 +358,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
".NETFramework,Version=v4.8/win-x64": {
diff --git a/Connectors/Navisworks/Speckle.Connectors.Navisworks2023/packages.lock.json b/Connectors/Navisworks/Speckle.Connectors.Navisworks2023/packages.lock.json
index 5d27f5009..331efd2b7 100644
--- a/Connectors/Navisworks/Speckle.Connectors.Navisworks2023/packages.lock.json
+++ b/Connectors/Navisworks/Speckle.Connectors.Navisworks2023/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -285,7 +285,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.navisworks2023": {
@@ -337,18 +337,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -358,14 +358,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
".NETFramework,Version=v4.8/win-x64": {
diff --git a/Connectors/Navisworks/Speckle.Connectors.Navisworks2024/packages.lock.json b/Connectors/Navisworks/Speckle.Connectors.Navisworks2024/packages.lock.json
index 3c7fd9795..360cd2ec3 100644
--- a/Connectors/Navisworks/Speckle.Connectors.Navisworks2024/packages.lock.json
+++ b/Connectors/Navisworks/Speckle.Connectors.Navisworks2024/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -285,7 +285,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.navisworks2024": {
@@ -337,18 +337,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -358,14 +358,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
".NETFramework,Version=v4.8/win-x64": {
diff --git a/Connectors/Navisworks/Speckle.Connectors.Navisworks2025/packages.lock.json b/Connectors/Navisworks/Speckle.Connectors.Navisworks2025/packages.lock.json
index 76bf0f2a3..1195980e3 100644
--- a/Connectors/Navisworks/Speckle.Connectors.Navisworks2025/packages.lock.json
+++ b/Connectors/Navisworks/Speckle.Connectors.Navisworks2025/packages.lock.json
@@ -265,9 +265,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -291,7 +291,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.navisworks2025": {
@@ -337,18 +337,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -358,14 +358,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
".NETFramework,Version=v4.8/win-x64": {
diff --git a/Connectors/Navisworks/Speckle.Connectors.Navisworks2026/packages.lock.json b/Connectors/Navisworks/Speckle.Connectors.Navisworks2026/packages.lock.json
index 9e8f8fd6c..6c657dc3f 100644
--- a/Connectors/Navisworks/Speckle.Connectors.Navisworks2026/packages.lock.json
+++ b/Connectors/Navisworks/Speckle.Connectors.Navisworks2026/packages.lock.json
@@ -266,9 +266,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -292,7 +292,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.navisworks2026": {
@@ -339,18 +339,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -360,14 +360,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
".NETFramework,Version=v4.8/win-x64": {
diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSendBinding.cs b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSendBinding.cs
index cdab0dc93..2dbf1352b 100644
--- a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSendBinding.cs
+++ b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Bindings/NavisworksSendBinding.cs
@@ -73,6 +73,7 @@ public class NavisworksSendBinding : ISendBinding
new IncludeInternalPropertiesSetting(false),
new ConvertHiddenElementsSetting(false),
new PreserveModelHierarchySetting(false),
+ new RevitCategoryMappingSetting(false)
];
public async Task Send(string modelCardId) =>
@@ -93,7 +94,8 @@ public class NavisworksSendBinding : ISendBinding
visualRepresentationMode: _toSpeckleSettingsManagerNavisworks.GetVisualRepresentationMode(modelCard),
convertHiddenElements: _toSpeckleSettingsManagerNavisworks.GetConvertHiddenElements(modelCard),
includeInternalProperties: _toSpeckleSettingsManagerNavisworks.GetIncludeInternalProperties(modelCard),
- preserveModelHierarchy: _toSpeckleSettingsManagerNavisworks.GetPreserveModelHierarchy(modelCard)
+ preserveModelHierarchy: _toSpeckleSettingsManagerNavisworks.GetPreserveModelHierarchy(modelCard),
+ mappingToRevitCategories: _toSpeckleSettingsManagerNavisworks.GetMappingToRevitCategories(modelCard)
)
);
diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/ConvertHiddenEleementsSetting.cs b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/ConvertHiddenElementsSetting.cs
similarity index 100%
rename from Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/ConvertHiddenEleementsSetting.cs
rename to Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/ConvertHiddenElementsSetting.cs
diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/RevitCategoryMapping.cs b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/RevitCategoryMapping.cs
new file mode 100644
index 000000000..48c514f7e
--- /dev/null
+++ b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/RevitCategoryMapping.cs
@@ -0,0 +1,12 @@
+using Speckle.Connectors.DUI.Settings;
+
+namespace Speckle.Connector.Navisworks.Operations.Send.Settings;
+
+public class RevitCategoryMappingSetting(bool value) : ICardSetting
+{
+ public string? Id { get; set; } = "mappingToRevitCategories";
+ public string? Title { get; set; } = "Map to Revit Categories";
+ public string? Type { get; set; } = "boolean";
+ public List? Enum { get; set; }
+ public object? Value { get; set; } = value;
+}
diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/ToSpeckleSettingsManagerNavisworks.cs b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/ToSpeckleSettingsManagerNavisworks.cs
index d9be2010f..fedfc5b0a 100644
--- a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/ToSpeckleSettingsManagerNavisworks.cs
+++ b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Operations/Send/Settings/ToSpeckleSettingsManagerNavisworks.cs
@@ -18,6 +18,7 @@ public class ToSpeckleSettingsManagerNavisworks : IToSpeckleSettingsManagerNavis
private readonly Dictionary _convertHiddenElementsCache = [];
private readonly Dictionary _includeInternalPropertiesCache = [];
private readonly Dictionary _preserveModelHierarchyCache = [];
+ private readonly Dictionary _revitCategoryMappingCache = [];
public ToSpeckleSettingsManagerNavisworks(ISendConversionCache sendConversionCache)
{
@@ -78,6 +79,28 @@ public class ToSpeckleSettingsManagerNavisworks : IToSpeckleSettingsManagerNavis
return origin;
}
+ public bool GetMappingToRevitCategories(SenderModelCard modelCard)
+ {
+ if (modelCard == null)
+ {
+ throw new ArgumentNullException(nameof(modelCard));
+ }
+
+ var value = modelCard.Settings?.FirstOrDefault(s => s.Id == "mappingToRevitCategories")?.Value as bool?;
+
+ var returnValue = value != null && value.NotNull();
+ if (_revitCategoryMappingCache.TryGetValue(modelCard.ModelCardId.NotNull(), out var previousValue))
+ {
+ if (previousValue != returnValue)
+ {
+ EvictCacheForModelCard(modelCard);
+ }
+ }
+
+ _revitCategoryMappingCache[modelCard.ModelCardId] = returnValue;
+ return returnValue;
+ }
+
public bool GetConvertHiddenElements(SenderModelCard modelCard)
{
if (modelCard == null)
diff --git a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.projitems b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.projitems
index 53aa9d3dd..9e2fd10e7 100644
--- a/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.projitems
+++ b/Connectors/Navisworks/Speckle.Connectors.NavisworksShared/Speckle.Connectors.NavisworksShared.projitems
@@ -25,10 +25,11 @@
-
+
+
diff --git a/Connectors/Revit/Speckle.Connectors.Revit2022/packages.lock.json b/Connectors/Revit/Speckle.Connectors.Revit2022/packages.lock.json
index 273a8e94a..102304bad 100644
--- a/Connectors/Revit/Speckle.Connectors.Revit2022/packages.lock.json
+++ b/Connectors/Revit/Speckle.Connectors.Revit2022/packages.lock.json
@@ -281,9 +281,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -306,7 +306,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.revit2022": {
@@ -351,11 +351,11 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Revit.API": {
@@ -366,9 +366,9 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -378,14 +378,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Revit/Speckle.Connectors.Revit2023/packages.lock.json b/Connectors/Revit/Speckle.Connectors.Revit2023/packages.lock.json
index 37f8041d6..b04ef393b 100644
--- a/Connectors/Revit/Speckle.Connectors.Revit2023/packages.lock.json
+++ b/Connectors/Revit/Speckle.Connectors.Revit2023/packages.lock.json
@@ -281,9 +281,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -306,7 +306,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.revit2023": {
@@ -351,11 +351,11 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Revit.API": {
@@ -366,9 +366,9 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -378,14 +378,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Revit/Speckle.Connectors.Revit2024/packages.lock.json b/Connectors/Revit/Speckle.Connectors.Revit2024/packages.lock.json
index 8538d2823..7b8f6d1df 100644
--- a/Connectors/Revit/Speckle.Connectors.Revit2024/packages.lock.json
+++ b/Connectors/Revit/Speckle.Connectors.Revit2024/packages.lock.json
@@ -281,9 +281,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -306,7 +306,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.revit2024": {
@@ -351,11 +351,11 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Revit.API": {
@@ -366,9 +366,9 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -378,14 +378,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Revit/Speckle.Connectors.Revit2025/packages.lock.json b/Connectors/Revit/Speckle.Connectors.Revit2025/packages.lock.json
index bb864460a..63bca162c 100644
--- a/Connectors/Revit/Speckle.Connectors.Revit2025/packages.lock.json
+++ b/Connectors/Revit/Speckle.Connectors.Revit2025/packages.lock.json
@@ -226,9 +226,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -251,7 +251,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.revit2025": {
@@ -296,11 +296,11 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Revit.API": {
@@ -311,9 +311,9 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -321,14 +321,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
"net8.0-windows7.0/win-x64": {
diff --git a/Connectors/Revit/Speckle.Connectors.Revit2026/packages.lock.json b/Connectors/Revit/Speckle.Connectors.Revit2026/packages.lock.json
index ad5e1f8fc..5763da37e 100644
--- a/Connectors/Revit/Speckle.Connectors.Revit2026/packages.lock.json
+++ b/Connectors/Revit/Speckle.Connectors.Revit2026/packages.lock.json
@@ -219,9 +219,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -244,7 +244,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.revit2026": {
@@ -280,11 +280,11 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Revit.API": {
@@ -295,9 +295,9 @@
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -305,14 +305,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
"net8.0-windows7.0/win-x64": {
diff --git a/Connectors/Rhino/Speckle.Connectors.Grasshopper7/packages.lock.json b/Connectors/Rhino/Speckle.Connectors.Grasshopper7/packages.lock.json
index 8ce2c26c7..acdbbc29b 100644
--- a/Connectors/Rhino/Speckle.Connectors.Grasshopper7/packages.lock.json
+++ b/Connectors/Rhino/Speckle.Connectors.Grasshopper7/packages.lock.json
@@ -325,9 +325,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.logging": {
@@ -337,7 +337,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.rhino7": {
@@ -382,18 +382,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -403,14 +403,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Rhino/Speckle.Connectors.Grasshopper8/packages.lock.json b/Connectors/Rhino/Speckle.Connectors.Grasshopper8/packages.lock.json
index 3ded2f46e..ebfa8c5bf 100644
--- a/Connectors/Rhino/Speckle.Connectors.Grasshopper8/packages.lock.json
+++ b/Connectors/Rhino/Speckle.Connectors.Grasshopper8/packages.lock.json
@@ -325,9 +325,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.logging": {
@@ -337,13 +337,12 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.rhino8": {
"type": "Project",
"dependencies": {
- "RhinoCommon": "[8.9.24194.18121, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
@@ -382,18 +381,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -403,14 +402,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Parameters/SpecklePropertyGroupGoo.ModelObjects.cs b/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Parameters/SpecklePropertyGroupGoo.ModelObjects.cs
index eeff7fc47..cbd901ef1 100644
--- a/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Parameters/SpecklePropertyGroupGoo.ModelObjects.cs
+++ b/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Parameters/SpecklePropertyGroupGoo.ModelObjects.cs
@@ -22,21 +22,51 @@ public partial class SpecklePropertyGroupGoo : GH_Goo dictionary = new();
- foreach (KeyValuePair entry in userText)
- {
- SpecklePropertyGoo value = new() { Value = entry.Value };
- dictionary.Add(entry.Key, value);
- }
-
- Value = dictionary;
- return true;
+ var processedDictionary = ConvertToNested(userText.ToDictionary(o => o.Key, o => (object)o.Value));
+ return CastFrom(processedDictionary);
default:
return false;
}
}
+ // Property keys may already be concatenated with the `.` char, eg if baked from grasshopper.
+ public Dictionary ConvertToNested(Dictionary flatDict)
+ {
+ var nestedDict = new Dictionary();
+
+ foreach (string keyPath in flatDict.Keys)
+ {
+ var keys = keyPath.Split('.');
+ var current = nestedDict;
+
+ for (int i = 0; i < keys.Length; i++)
+ {
+ var key = keys[i];
+
+ if (i == keys.Length - 1)
+ {
+ current[key] = flatDict[keyPath];
+ }
+ else
+ {
+ if (!current.TryGetValue(key, out var next))
+ {
+ var newDict = new Dictionary();
+ current[key] = newDict;
+ current = newDict;
+ }
+ else
+ {
+ current = (Dictionary)next;
+ }
+ }
+ }
+ }
+
+ return nestedDict;
+ }
+
private bool CastToModelObject(ref T target)
{
var type = typeof(T);
diff --git a/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Parameters/Wrappers/SpeckleGeometryWrapperGoo.ModelObjects.cs b/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Parameters/Wrappers/SpeckleGeometryWrapperGoo.ModelObjects.cs
index 481f25b2c..43d54a838 100644
--- a/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Parameters/Wrappers/SpeckleGeometryWrapperGoo.ModelObjects.cs
+++ b/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Parameters/Wrappers/SpeckleGeometryWrapperGoo.ModelObjects.cs
@@ -35,19 +35,20 @@ public partial class SpeckleGeometryWrapperGoo : GH_Goo,
private bool HandleModelObject(ModelObject modelObject)
{
- modelObject.CastTo(out GeometryBase? geometryBase);
- if (geometryBase is null)
+ modelObject.CastTo(out IGH_GeometricGoo? geometryGoo);
+ if (geometryGoo is null)
{
throw new InvalidOperationException($"Could not retrieve geometry from model object.");
}
+ GeometryBase geometryBase = geometryGoo.ToGeometryBase();
Base converted = SpeckleConversionContext.Current.ConvertToSpeckle(geometryBase);
// get layer, props, color, and mat
SpeckleCollectionWrapper? collection = GetLayerCollectionFromModelObject(modelObject);
SpecklePropertyGroupGoo? props = GetPropsFromModelObjectAndAssignToBase(modelObject, converted);
- Color? color = GetColorFromModelObject(modelObject);
SpeckleMaterialWrapper? material = GetMaterialFromModelObject(modelObject);
+ Color? color = GetColorFromModelObject(modelObject, material);
// get the definition if this is an instance
SpeckleBlockDefinitionWrapper? definition = GetBlockDefinition(geometryBase);
@@ -189,6 +190,7 @@ public partial class SpeckleGeometryWrapperGoo : GH_Goo,
Transform = instance.Xform,
Definition = definition, // May be null in pure Grasshopper workflows
Parent = parent,
+ Path = parent?.Path ?? new(),
Name = name,
Color = color,
Material = mat,
@@ -200,6 +202,7 @@ public partial class SpeckleGeometryWrapperGoo : GH_Goo,
GeometryBase = geometryBase,
Base = @base,
Parent = parent,
+ Path = parent?.Path ?? new(),
Name = name,
Color = color,
Material = mat,
@@ -268,7 +271,7 @@ public partial class SpeckleGeometryWrapperGoo : GH_Goo,
return null;
}
- private Color? GetColorFromModelObject(ModelObject modelObject)
+ private Color? GetColorFromModelObject(ModelObject modelObject, SpeckleMaterialWrapper? material)
{
// we need to retrieve the actual color by the color source (otherwise will return default color for anything other than by object)
int? argb = null;
@@ -281,8 +284,10 @@ public partial class SpeckleGeometryWrapperGoo : GH_Goo,
argb = modelObject.Display.Color?.Color.ToArgb();
break;
case ObjectColorSource.ColorFromMaterial:
- Rhino.Render.RenderMaterial? mat = GetRenderMaterial(modelObject);
- argb = mat?.ToMaterial(Rhino.Render.RenderTexture.TextureGeneration.Skip)?.DiffuseColor.ToArgb();
+ if (material is not null)
+ {
+ argb = material.Material.diffuse;
+ }
break;
default:
break;
diff --git a/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Registration/PriorityLoader.cs b/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Registration/PriorityLoader.cs
index 51ef699f7..c774f8c17 100644
--- a/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Registration/PriorityLoader.cs
+++ b/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Registration/PriorityLoader.cs
@@ -33,11 +33,12 @@ public class PriorityLoader : GH_AssemblyPriority
public static IServiceScope CreateScopeForActiveDocument()
{
+ // NOTE: introduction of AddVisualizationProperties setting not accounted for in GH, hence hardcoded as true (i.e. "as before")
var scope = Container.CreateScope();
var rhinoConversionSettingsFactory = scope.ServiceProvider.GetRequiredService();
scope
.ServiceProvider.GetRequiredService>()
- .Initialize(rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
+ .Initialize(rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc, true));
return scope;
}
diff --git a/Connectors/Rhino/Speckle.Connectors.Rhino7/packages.lock.json b/Connectors/Rhino/Speckle.Connectors.Rhino7/packages.lock.json
index 42c893162..9780e996a 100644
--- a/Connectors/Rhino/Speckle.Connectors.Rhino7/packages.lock.json
+++ b/Connectors/Rhino/Speckle.Connectors.Rhino7/packages.lock.json
@@ -306,9 +306,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -341,7 +341,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.rhino7": {
@@ -401,18 +401,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -422,14 +422,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
},
"System.Resources.Extensions": {
"type": "CentralTransitive",
diff --git a/Connectors/Rhino/Speckle.Connectors.Rhino8/packages.lock.json b/Connectors/Rhino/Speckle.Connectors.Rhino8/packages.lock.json
index e302ced6a..cbcf73df8 100644
--- a/Connectors/Rhino/Speckle.Connectors.Rhino8/packages.lock.json
+++ b/Connectors/Rhino/Speckle.Connectors.Rhino8/packages.lock.json
@@ -306,9 +306,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -341,13 +341,12 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"speckle.converters.rhino8": {
"type": "Project",
"dependencies": {
- "RhinoCommon": "[8.9.24194.18121, )",
"Speckle.Converters.Common": "[1.0.0, )"
}
},
@@ -401,18 +400,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -422,14 +421,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
},
"System.Resources.Extensions": {
"type": "CentralTransitive",
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoImporter/EmbeddedResources/plugin-utility.ico b/Connectors/Rhino/Speckle.Connectors.RhinoImporter/EmbeddedResources/plugin-utility.ico
new file mode 100644
index 000000000..022d1f788
Binary files /dev/null and b/Connectors/Rhino/Speckle.Connectors.RhinoImporter/EmbeddedResources/plugin-utility.ico differ
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoImporter/Speckle.Connectors.RhinoImporter.csproj b/Connectors/Rhino/Speckle.Connectors.RhinoImporter/Speckle.Connectors.RhinoImporter.csproj
new file mode 100644
index 000000000..e7c0406a3
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoImporter/Speckle.Connectors.RhinoImporter.csproj
@@ -0,0 +1,42 @@
+
+
+
+
+
+ net8.0-windows
+ Debug;Release;Local
+ 8
+ $(DefineConstants);RHINO8;RHINO7_OR_GREATER;RHINO8_OR_GREATER
+ .dll
+ true
+ true
+ true
+ true
+
+
+ win-x64
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoImporter/packages.lock.json b/Connectors/Rhino/Speckle.Connectors.RhinoImporter/packages.lock.json
new file mode 100644
index 000000000..268b26fd9
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoImporter/packages.lock.json
@@ -0,0 +1,370 @@
+{
+ "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=="
+ },
+ "RhinoCommon": {
+ "type": "Direct",
+ "requested": "[8.21.25188.17001, )",
+ "resolved": "8.21.25188.17001",
+ "contentHash": "Wo6JXheyDBvilyIwDY6xZCQJC4170jzAlTSlMgh8yokUY+vYyCl4KJVXZofIOynNt/xx5wLqb2On5gZZekXR6w==",
+ "dependencies": {
+ "System.Drawing.Common": "7.0.0"
+ }
+ },
+ "RhinoWindows": {
+ "type": "Direct",
+ "requested": "[8.21.25188.17001, )",
+ "resolved": "8.21.25188.17001",
+ "contentHash": "9zqCorcLRBeiW/j1RTwUS4E7bnZetAdA9WDdtd/AQccjOpxdtw76wdN+ciyQ6qslseWkwZ9qSBeh7QaM800Ntw==",
+ "dependencies": {
+ "RhinoCommon": "[8.21.25188.17001]"
+ }
+ },
+ "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.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=="
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
+ },
+ "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.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "7.0.0"
+ }
+ },
+ "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.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
+ }
+ },
+ "speckle.connectors.dui": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
+ "Speckle.Connectors.Common": "[1.0.0, )"
+ }
+ },
+ "speckle.connectors.dui.webview": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Web.WebView2": "[1.0.1938.49, )",
+ "Speckle.Connectors.DUI": "[1.0.0, )"
+ }
+ },
+ "speckle.connectors.logging": {
+ "type": "Project"
+ },
+ "speckle.converters.common": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
+ "Speckle.Objects": "[3.5.1, )"
+ }
+ },
+ "speckle.converters.rhino8": {
+ "type": "Project",
+ "dependencies": {
+ "Speckle.Converters.Common": "[1.0.0, )"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "CentralTransitive",
+ "requested": "[2.2.0, )",
+ "resolved": "2.2.0",
+ "contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "CentralTransitive",
+ "requested": "[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=="
+ },
+ "Microsoft.Web.WebView2": {
+ "type": "CentralTransitive",
+ "requested": "[1.0.1938.49, )",
+ "resolved": "1.0.1938.49",
+ "contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
+ },
+ "Speckle.DoubleNumerics": {
+ "type": "CentralTransitive",
+ "requested": "[4.1.0, )",
+ "resolved": "4.1.0",
+ "contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
+ },
+ "Speckle.Objects": {
+ "type": "CentralTransitive",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
+ "dependencies": {
+ "Speckle.Sdk": "3.5.1"
+ }
+ },
+ "Speckle.Sdk": {
+ "type": "CentralTransitive",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
+ "dependencies": {
+ "GraphQL.Client": "6.0.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.5.1"
+ }
+ },
+ "Speckle.Sdk.Dependencies": {
+ "type": "CentralTransitive",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
+ }
+ },
+ "net8.0-windows7.0/win-x64": {
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
+ },
+ "SQLitePCLRaw.lib.e_sqlite3": {
+ "type": "Transitive",
+ "resolved": "2.1.4",
+ "contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg=="
+ },
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "7.0.0"
+ }
+ },
+ "Microsoft.Web.WebView2": {
+ "type": "CentralTransitive",
+ "requested": "[1.0.1938.49, )",
+ "resolved": "1.0.1938.49",
+ "contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoMapperBinding.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoMapperBinding.cs
new file mode 100644
index 000000000..be63a6f1f
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoMapperBinding.cs
@@ -0,0 +1,394 @@
+using Rhino;
+using Rhino.DocObjects;
+using Rhino.DocObjects.Tables;
+using Speckle.Connectors.DUI.Bindings;
+using Speckle.Connectors.DUI.Bridge;
+using Speckle.Connectors.DUI.Models;
+using Speckle.Connectors.Rhino.HostApp;
+using Speckle.Connectors.Rhino.Mapper.Revit;
+
+namespace Speckle.Connectors.Rhino.Bindings;
+
+///
+/// Binding for managing Rhino object mappings to Revit categories.
+///
+public class RhinoMapperBinding : IBinding
+{
+ private const string MAPPINGS_CHANGED_EVENT = "mappingsChanged";
+ private const string LAYERS_CHANGED_EVENT = "layersChanged";
+ private readonly DocumentModelStore _store;
+ private readonly IAppIdleManager _idleManager;
+ private readonly IBasicConnectorBinding _basicConnectorBinding;
+ private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
+ private readonly RevitMappingResolver _revitMappingResolver;
+ private readonly RhinoLayerHelper _rhinoLayerHelper;
+ private readonly RhinoObjectHelper _rhinoObjectHelper;
+ public string Name => "revitMapperBinding";
+ public IBrowserBridge Parent { get; }
+
+ public RhinoMapperBinding(
+ DocumentModelStore store,
+ IAppIdleManager idleManager,
+ IBrowserBridge parent,
+ IBasicConnectorBinding basicConnectorBinding,
+ ITopLevelExceptionHandler topLevelExceptionHandler,
+ RevitMappingResolver revitMappingResolver,
+ RhinoLayerHelper rhinoLayerHelper,
+ RhinoObjectHelper rhinoObjectHelper
+ )
+ {
+ _store = store;
+ _idleManager = idleManager;
+ Parent = parent;
+ _basicConnectorBinding = basicConnectorBinding;
+ _topLevelExceptionHandler = topLevelExceptionHandler;
+ _revitMappingResolver = revitMappingResolver;
+ _rhinoLayerHelper = rhinoLayerHelper;
+ _rhinoObjectHelper = rhinoObjectHelper;
+
+ // Subscribe to Rhino events so we know about changes
+ // Events fire on delete, undo delete, add and modify objects
+ RhinoDoc.DeleteRhinoObject += OnObjectChanged;
+ RhinoDoc.UndeleteRhinoObject += OnObjectChanged;
+ RhinoDoc.AddRhinoObject += OnObjectChanged;
+ RhinoDoc.ModifyObjectAttributes += OnObjectAttributesChanged;
+
+ // Subscribe to layer events so we know about layer changes
+ RhinoDoc.LayerTableEvent += OnLayerTableEvent;
+
+ // Subscribe to document changes to refresh mappings when switching documents
+ _store.DocumentChanged += OnDocumentChanged;
+ }
+
+ #region UI Methods - General
+
+ ///
+ /// Gets list of available layers for the UI dropdown.
+ ///
+ public LayerOption[] GetAvailableLayers()
+ {
+ var doc = RhinoDoc.ActiveDoc;
+ if (doc == null)
+ {
+ return [];
+ }
+
+ return doc
+ .Layers.Where(layer => !layer.IsDeleted)
+ .Select(layer => new LayerOption(layer.Id.ToString(), _rhinoLayerHelper.GetFullLayerPath(layer)))
+ .OrderBy(layer => layer.Name)
+ .ToArray();
+ }
+
+ ///
+ /// Selects/highlights specific objects in Rhino.
+ ///
+ public async Task HighlightObjects(string[] objectIds) => await _basicConnectorBinding.HighlightObjects(objectIds);
+
+ #endregion
+
+ #region UI Methods - Object Mapping Methods
+
+ ///
+ /// Assigns selected objects to a specific Revit category.
+ ///
+ public void AssignObjectsToCategory(string[] objectIds, string categoryValue)
+ {
+ foreach (var objectIdString in objectIds)
+ {
+ // NOTE: should we be checking if key already exists?
+ // For POC, straightforward set on object
+ var rhinoObject = _rhinoObjectHelper.GetRhinoObject(objectIdString);
+ var attrs = rhinoObject?.Attributes.Duplicate();
+ attrs?.SetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY, categoryValue);
+ RhinoDoc.ActiveDoc.Objects.ModifyAttributes(rhinoObject, attrs, true);
+ }
+
+ // Trigger single update after all changes
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+
+ ///
+ /// Removes category assignments from specific objects.
+ ///
+ public void ClearObjectsCategoryAssignment(string[] objectIds)
+ {
+ foreach (var objectIdString in objectIds)
+ {
+ var rhinoObject = _rhinoObjectHelper.GetRhinoObject(objectIdString);
+ var attrs = rhinoObject?.Attributes.Duplicate();
+ attrs?.DeleteUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY);
+ RhinoDoc.ActiveDoc.Objects.ModifyAttributes(rhinoObject, attrs, true);
+ }
+
+ // Trigger single update after all changes
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+
+ ///
+ /// Removes all category assignments in the doc.
+ ///
+ public void ClearAllObjectsCategoryAssignments()
+ {
+ foreach (var rhinoObject in RhinoDoc.ActiveDoc.Objects)
+ {
+ if (!string.IsNullOrEmpty(rhinoObject.Attributes.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY)))
+ {
+ var attrs = rhinoObject.Attributes.Duplicate();
+ attrs.DeleteUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY);
+ RhinoDoc.ActiveDoc.Objects.ModifyAttributes(rhinoObject, attrs, true);
+ }
+ }
+
+ // Trigger single update
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+
+ ///
+ /// Gets all current mappings to show in the UI table.
+ ///
+ ///
+ public CategoryMapping[] GetCurrentObjectsMappings()
+ {
+ var mappedObjects = RhinoDoc
+ .ActiveDoc.Objects.Where(obj =>
+ !string.IsNullOrEmpty(obj.Attributes.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY))
+ )
+ .GroupBy(obj => obj.Attributes.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY))
+ .Select(group => new CategoryMapping(
+ group.Key,
+ group.Key,
+ group.Select(obj => obj.Id.ToString()).ToArray(),
+ group.Count()
+ ))
+ .ToArray();
+
+ return mappedObjects;
+ }
+
+ ///
+ /// Gets category mappings for specific object IDs.
+ ///
+ public string[] GetCategoryMappingsForObjects(string[] objectIds) =>
+ objectIds
+ .Select(id =>
+ _rhinoObjectHelper.GetRhinoObject(id)?.Attributes.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY)
+ )
+ .Where(category => category != null)
+ .Cast()
+ .Distinct()
+ .ToArray();
+
+ #endregion
+
+ #region UI Methods - Layer Mapping Methods
+
+ ///
+ /// Assigns selected layers to a specific Revit category.
+ ///
+ public void AssignLayerToCategory(string[] layerIds, string categoryValue)
+ {
+ foreach (var layerId in layerIds)
+ {
+ var layer = _rhinoLayerHelper.GetLayer(layerId);
+ layer?.SetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY, categoryValue);
+ }
+
+ // Trigger single update
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+
+ ///
+ /// Removes category assignments from specific layer(s).
+ ///
+ public void ClearLayerCategoryAssignment(string[] layerIds)
+ {
+ foreach (var layerId in layerIds)
+ {
+ // NOTE: clear user string by setting to null. Layer has not DeleteUserString() method 🙄
+ var layer = _rhinoLayerHelper.GetLayer(layerId);
+ layer?.SetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY, null);
+ }
+
+ // Trigger single update
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+
+ ///
+ /// Removes all layer category assignments in the doc.
+ ///
+ public void ClearAllLayerCategoryAssignments()
+ {
+ foreach (var layer in RhinoDoc.ActiveDoc.Layers)
+ {
+ if (!string.IsNullOrEmpty(layer.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY)))
+ {
+ // NOTE: clear user string by setting to null. Layer has not DeleteUserString() method 🙄
+ layer.SetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY, null);
+ }
+ }
+
+ // Trigger single update
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+
+ ///
+ /// Gets all current layer mappings to show in the UI table.
+ /// Layers with the same category mapping are grouped together.
+ ///
+ public LayerCategoryMapping[] GetCurrentLayerMappings()
+ {
+ var mappedLayers = RhinoDoc
+ .ActiveDoc.Layers.Where(layer =>
+ !layer.IsDeleted && !string.IsNullOrEmpty(layer.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY))
+ )
+ .GroupBy(layer => layer.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY))
+ .Select(group => new LayerCategoryMapping(
+ group.Key,
+ group.Key,
+ group.Select(layer => layer.Id.ToString()).ToArray(),
+ group.Select(layer => _rhinoLayerHelper.GetFullLayerPath(layer)).ToArray(),
+ group.Count()
+ ))
+ .ToArray();
+
+ return mappedLayers;
+ }
+
+ ///
+ /// Gets category mappings for specific layer IDs.
+ ///
+ public string[] GetCategoryMappingsForLayers(string[] layerIds) =>
+ layerIds
+ .Select(id => _rhinoLayerHelper.GetLayer(id)?.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY))
+ .Where(category => !string.IsNullOrEmpty(category))
+ .Cast()
+ .Distinct()
+ .ToArray();
+
+ public string[] GetEffectiveObjectsForLayerMapping(string[] layerIds, string categoryValue) =>
+ _revitMappingResolver.GetEffectiveObjectsForLayerMapping(layerIds, categoryValue);
+
+ #endregion
+
+ #region Event Handling
+
+ ///
+ /// Called when objects are added, deleted, or undeleted in Rhino.
+ ///
+ private void OnObjectChanged(object? sender, RhinoObjectEventArgs e)
+ {
+ if (!_store.IsDocumentInit)
+ {
+ return;
+ }
+
+ var rhinoObject = e.TheObject;
+ if (!string.IsNullOrEmpty(rhinoObject.Attributes.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY)))
+ {
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+ }
+
+ ///
+ /// Called when object attributes are modified in Rhino.
+ ///
+ ///
+ /// Includes detection for when objects move between layers with mappings.
+ ///
+ private void OnObjectAttributesChanged(object? sender, RhinoModifyObjectAttributesEventArgs e)
+ {
+ if (!_store.IsDocumentInit)
+ {
+ return;
+ }
+
+ var rhinoObject = e.RhinoObject;
+
+ // check if mapping user string changed (added, removed, or modified)
+ var oldMapping = e.OldAttributes.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY);
+ var newMapping = rhinoObject.Attributes.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY);
+ bool mappingChanged = !string.Equals(oldMapping, newMapping, StringComparison.Ordinal);
+
+ // check if layer change affects mappings
+ bool hasOldLayerMapping = _rhinoLayerHelper.HasLayerMapping(e.OldAttributes.LayerIndex);
+ bool hasNewLayerMapping = _rhinoLayerHelper.HasLayerMapping(rhinoObject.Attributes.LayerIndex);
+
+ // refresh if mapping changed OR layer change affects mapped layers
+ if (mappingChanged || hasOldLayerMapping || hasNewLayerMapping)
+ {
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+ }
+
+ ///
+ /// Called when the document changes (e.g., switching to a different Rhino model).
+ /// Refreshes the mappings table and defined layers to reflect the new document's state.
+ ///
+ private void OnDocumentChanged(object? sender, EventArgs e)
+ {
+ if (!_store.IsDocumentInit)
+ {
+ return;
+ }
+
+ // Refresh mappings for the new document
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+
+ // Refresh layer list for the new document
+ _idleManager.SubscribeToIdle(nameof(NotifyLayersChanged), NotifyLayersChanged);
+ }
+
+ ///
+ /// Called when layer table events occur in Rhino.
+ /// Refreshes layer list when layer structure changes.
+ ///
+ ///
+ /// Layer mapping changes are handled by OnObjectAttributesChanged
+ ///
+ private void OnLayerTableEvent(object? sender, LayerTableEventArgs e) =>
+ _topLevelExceptionHandler.CatchUnhandled(() =>
+ {
+ if (!_store.IsDocumentInit)
+ {
+ return;
+ }
+
+ // Refresh layer list for structural changes
+ if (
+ e.EventType == LayerTableEventType.Added
+ || e.EventType == LayerTableEventType.Deleted
+ || e.EventType == LayerTableEventType.Modified
+ )
+ {
+ _idleManager.SubscribeToIdle(nameof(NotifyLayersChanged), NotifyLayersChanged);
+ }
+
+ // Refresh mappings when layers are deleted or modified
+ // This ensures that mappings table updates when mapped layers are removed
+ if (e.EventType == LayerTableEventType.Deleted || e.EventType == LayerTableEventType.Modified)
+ {
+ _idleManager.SubscribeToIdle(nameof(NotifyMappingsChanged), NotifyMappingsChanged);
+ }
+ });
+
+ ///
+ /// Sends updated mappings to the frontend.
+ ///
+ private void NotifyMappingsChanged()
+ {
+ var currentMappings = GetCurrentObjectsMappings();
+ Parent.Send(MAPPINGS_CHANGED_EVENT, currentMappings);
+ }
+
+ ///
+ /// Sends updated layer list to the frontend.
+ ///
+ private void NotifyLayersChanged()
+ {
+ var availableLayers = GetAvailableLayers();
+ Parent.Send(LAYERS_CHANGED_EVENT, availableLayers);
+ }
+
+ #endregion
+}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoReceiveBinding.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoReceiveBinding.cs
index 959d43afc..b5e36a8b0 100644
--- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoReceiveBinding.cs
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoReceiveBinding.cs
@@ -24,6 +24,7 @@ public class RhinoReceiveBinding(
public async Task Receive(string modelCardId)
{
+ // NOTE: introduction of AddVisualizationProperties setting not accounted for in receive pipeline, hence hardcoded as true (i.e. "as before")
using var manager = receiveOperationManagerFactory.Create();
await manager.Process(
Commands,
@@ -31,7 +32,7 @@ public class RhinoReceiveBinding(
(sp, card) =>
{
sp.GetRequiredService>()
- .Initialize(rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
+ .Initialize(rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc, true));
},
async (modelName, processor) =>
{
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoSendBinding.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoSendBinding.cs
index cd5c332f3..12b9198de 100644
--- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoSendBinding.cs
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Bindings/RhinoSendBinding.cs
@@ -13,7 +13,9 @@ using Speckle.Connectors.DUI.Models;
using Speckle.Connectors.DUI.Models.Card;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
using Speckle.Connectors.DUI.Settings;
+using Speckle.Connectors.Rhino.HostApp;
using Speckle.Connectors.Rhino.Operations.Send.Filters;
+using Speckle.Connectors.Rhino.Operations.Send.Settings;
using Speckle.Converters.Common;
using Speckle.Converters.Rhino;
using Speckle.Sdk.Common;
@@ -29,11 +31,13 @@ public sealed class RhinoSendBinding : ISendBinding
private readonly DocumentModelStore _store;
private readonly ICancellationManager _cancellationManager;
private readonly ISendConversionCache _sendConversionCache;
+ private readonly ToSpeckleSettingsManager _toSpeckleSettingsManager;
private readonly ILogger _logger;
private readonly IRhinoConversionSettingsFactory _rhinoConversionSettingsFactory;
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
private readonly IAppIdleManager _idleManager;
private readonly ISendOperationManagerFactory _sendOperationManagerFactory;
+ private readonly RhinoLayerHelper _rhinoLayerHelper;
///
/// Used internally to aggregate the changed objects' id. Objects in this list will be reconverted.
@@ -59,21 +63,25 @@ public sealed class RhinoSendBinding : ISendBinding
IBrowserBridge parent,
ICancellationManager cancellationManager,
ISendConversionCache sendConversionCache,
+ ToSpeckleSettingsManager toSpeckleSettingsManager,
ILogger logger,
IRhinoConversionSettingsFactory rhinoConversionSettingsFactory,
ITopLevelExceptionHandler topLevelExceptionHandler,
- ISendOperationManagerFactory sendOperationManagerFactory
+ ISendOperationManagerFactory sendOperationManagerFactory,
+ RhinoLayerHelper rhinoLayerHelper
)
{
_store = store;
_idleManager = idleManager;
_cancellationManager = cancellationManager;
_sendConversionCache = sendConversionCache;
+ _toSpeckleSettingsManager = toSpeckleSettingsManager;
_logger = logger;
_rhinoConversionSettingsFactory = rhinoConversionSettingsFactory;
Parent = parent;
_topLevelExceptionHandler = topLevelExceptionHandler;
_sendOperationManagerFactory = sendOperationManagerFactory;
+ _rhinoLayerHelper = rhinoLayerHelper;
Commands = new SendBindingUICommands(parent); // POC: Commands are tightly coupled with their bindings, at least for now, saves us injecting a factory.
PreviousUnitSystem = RhinoDoc.ActiveDoc.ModelUnitSystem;
SubscribeToRhinoEvents();
@@ -271,9 +279,9 @@ public sealed class RhinoSendBinding : ISendBinding
}
public List GetSendFilters() =>
- [new RhinoSelectionFilter() { IsDefault = true }, new RhinoLayersFilter()];
+ [new RhinoSelectionFilter() { IsDefault = true }, new RhinoLayersFilter(_rhinoLayerHelper)];
- public List GetSendSettings() => [];
+ public List GetSendSettings() => [new AddVisualizationProperties(false)];
public async Task Send(string modelCardId)
{
@@ -282,9 +290,14 @@ public sealed class RhinoSendBinding : ISendBinding
await manager.Process(
Commands,
modelCardId,
- (sp, _) =>
+ (sp, card) =>
sp.GetRequiredService>()
- .Initialize(_rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc)),
+ .Initialize(
+ _rhinoConversionSettingsFactory.Create(
+ RhinoDoc.ActiveDoc,
+ _toSpeckleSettingsManager.GetAddVisualizationPropertiesSetting(card)
+ )
+ ),
card =>
{
return Task.FromResult>(
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/Properties/PropertiesExtractor.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/Properties/PropertiesExtractor.cs
index 15c85089e..e5d07080a 100644
--- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/Properties/PropertiesExtractor.cs
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/Properties/PropertiesExtractor.cs
@@ -1,5 +1,6 @@
using Rhino;
using Rhino.DocObjects;
+using Speckle.Connectors.Rhino.Mapper.Revit;
using Speckle.Sdk;
namespace Speckle.Connectors.Rhino.HostApp.Properties;
@@ -9,12 +10,24 @@ namespace Speckle.Connectors.Rhino.HostApp.Properties;
///
public class PropertiesExtractor
{
+ private readonly RevitMappingResolver _revitMappingResolver;
+
+ public PropertiesExtractor(RevitMappingResolver revitMappingResolver)
+ {
+ _revitMappingResolver = revitMappingResolver;
+ }
+
public Dictionary GetProperties(RhinoObject rhObject)
{
Dictionary properties = new();
var userStrings = rhObject.Attributes.GetUserStrings();
- foreach (var key in userStrings.AllKeys)
+ foreach (string? key in userStrings.AllKeys)
{
+ if (key == null)
+ {
+ continue;
+ }
+
try
{
if (key == "$block-instance-original-object-id$") // skip: this seems to be an invisible user string that shows up on block instances
@@ -22,7 +35,7 @@ public class PropertiesExtractor
continue;
}
- if (userStrings[key].StartsWith("%<"))
+ if (userStrings[key]?.StartsWith("%<") ?? false)
{
var value = RhinoApp.ParseTextField(userStrings[key], rhObject, null);
properties[key] = value;
@@ -37,6 +50,16 @@ public class PropertiesExtractor
properties[key] = userStrings[key];
}
+ // NOTE: if no mapping was found on the object, check layer(s) recursively
+ if (!properties.ContainsKey(RevitMappingConstants.CATEGORY_USER_STRING_KEY))
+ {
+ var layerMapping = _revitMappingResolver.SearchLayerHierarchyForMapping(rhObject);
+ if (!string.IsNullOrEmpty(layerMapping))
+ {
+ properties[RevitMappingConstants.CATEGORY_USER_STRING_KEY] = layerMapping;
+ }
+ }
+
return properties;
}
}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoGroupBaker.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoGroupBaker.cs
index bf719ccb2..dea94abe5 100644
--- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoGroupBaker.cs
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoGroupBaker.cs
@@ -54,7 +54,7 @@ public class RhinoGroupBaker
Dictionary> applicationIdMap
)
{
- if (applicationIdMap.TryGetValue(oldObjId, out IReadOnlyCollection value))
+ if (applicationIdMap.TryGetValue(oldObjId, out IReadOnlyCollection? value))
{
return value;
}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoLayerHelper.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoLayerHelper.cs
new file mode 100644
index 000000000..b3ebcedfd
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoLayerHelper.cs
@@ -0,0 +1,134 @@
+using Rhino;
+using Rhino.DocObjects;
+using Speckle.Connectors.Rhino.Mapper.Revit;
+
+namespace Speckle.Connectors.Rhino.HostApp;
+
+///
+/// Helper class for common Rhino layer and object operations.
+/// Consolidates layer utilities to eliminate duplication across the codebase.
+///
+public class RhinoLayerHelper
+{
+ ///
+ /// Gets list of available layers for UI dropdowns.
+ ///
+ public LayerOption[] GetAvailableLayers()
+ {
+ var doc = RhinoDoc.ActiveDoc;
+ if (doc == null)
+ {
+ return [];
+ }
+
+ return doc
+ .Layers.Where(layer => !layer.IsDeleted)
+ .Select(layer => new LayerOption(layer.Id.ToString(), GetFullLayerPath(layer)))
+ .OrderBy(layer => layer.Name)
+ .ToArray();
+ }
+
+ ///
+ /// Gets the full layer path with / delimiter
+ ///
+ public string GetFullLayerPath(Layer layer)
+ {
+ string fullPath = layer.Name;
+ Guid parentIndex = layer.ParentLayerId;
+ while (parentIndex != Guid.Empty)
+ {
+ Layer? parentLayer = RhinoDoc.ActiveDoc.Layers.FindId(parentIndex);
+ if (parentLayer == null)
+ {
+ break;
+ }
+
+ fullPath = parentLayer.Name + "/" + fullPath; // use "/" delimiter
+ parentIndex = parentLayer.ParentLayerId;
+ }
+ return fullPath;
+ }
+
+ ///
+ /// Converts a string layer ID to a Layer.
+ ///
+ /// Layer if found and valid, null otherwise
+ public Layer? GetLayer(string layerIdString) =>
+ Guid.TryParse(layerIdString, out var layerId) ? RhinoDoc.ActiveDoc.Layers.FindId(layerId) : null;
+
+ ///
+ /// Helper to check if a layer (by index) has a category mapping.
+ ///
+ ///
+ /// This is arguably a very specific method pertaining to mapper and maybe shouldn't be in this class?
+ ///
+ public bool HasLayerMapping(int layerIndex)
+ {
+ if (layerIndex < 0 || layerIndex >= RhinoDoc.ActiveDoc.Layers.Count)
+ {
+ return false;
+ }
+
+ var layer = RhinoDoc.ActiveDoc.Layers[layerIndex];
+ return !string.IsNullOrEmpty(layer.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY));
+ }
+
+ ///
+ /// Gets all RhinoObjects in the specified layer and all its child layers recursively.
+ ///
+ public IEnumerable GetObjectsInLayerHierarchy(Layer rootLayer)
+ {
+ var allObjects = new List();
+ var layersToSearch = GetLayerAndAllChildren(rootLayer);
+
+ foreach (var layer in layersToSearch)
+ {
+ var objectsOnLayer = RhinoDoc.ActiveDoc.Objects.FindByLayer(layer);
+ allObjects.AddRange(objectsOnLayer);
+ }
+
+ return allObjects;
+ }
+
+ ///
+ /// Gets the specified layer and all its child layers recursively.
+ ///
+ public IEnumerable GetLayerAndAllChildren(Layer rootLayer)
+ {
+ // Return the root layer itself
+ yield return rootLayer;
+
+ // Get all child layers recursively
+ foreach (var childLayer in GetAllChildLayers(rootLayer))
+ {
+ yield return childLayer;
+ }
+ }
+
+ ///
+ /// Recursively gets all child layers of the specified parent layer.
+ ///
+ public IEnumerable GetAllChildLayers(Layer parentLayer)
+ {
+ var doc = RhinoDoc.ActiveDoc;
+ if (doc?.Layers == null)
+ {
+ yield break;
+ }
+
+ // Find all direct child layers
+ var directChildren = doc.Layers.Where(layer => layer.ParentLayerId == parentLayer.Id);
+
+ foreach (var childLayer in directChildren)
+ {
+ // Return the direct child
+ yield return childLayer;
+
+ // Recursively get grandchildren
+ foreach (var grandChild in GetAllChildLayers(childLayer))
+ {
+ yield return grandChild;
+ }
+ }
+ }
+}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoLayerUnpacker.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoLayerUnpacker.cs
index ea465669d..3a921eea9 100644
--- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoLayerUnpacker.cs
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoLayerUnpacker.cs
@@ -14,6 +14,7 @@ namespace Speckle.Connectors.Rhino.HostApp;
///
public class RhinoLayerUnpacker
{
+ private readonly RhinoLayerHelper _rhinoLayerHelper;
private readonly Dictionary _layerCollectionCache = new();
private static readonly string s_pathSeparator =
@@ -24,6 +25,11 @@ public class RhinoLayerUnpacker
#endif
private static readonly string[] s_pathSeparatorSplit = [s_pathSeparator];
+ public RhinoLayerUnpacker(RhinoLayerHelper rhinoLayerHelper)
+ {
+ _rhinoLayerHelper = rhinoLayerHelper;
+ }
+
///
/// Use this method to get all of the layers that correspond to collection created in the root collection.
///
@@ -31,20 +37,16 @@ public class RhinoLayerUnpacker
/// Throws when a layer could not be retrieved from a stored collection application id
public IEnumerable GetUsedLayers()
{
- var currentDoc = RhinoDoc.ActiveDoc; // POC: too much right now to interface around
-
foreach (string layerId in _layerCollectionCache.Values.Select(o => o.applicationId ?? string.Empty).ToList())
{
- if (Guid.TryParse(layerId, out Guid layerGuid))
+ var layer = _rhinoLayerHelper.GetLayer(layerId);
+ if (layer != null)
{
- if (currentDoc.Layers.FindId(layerGuid) is Layer layer)
- {
- yield return layer;
- }
- else
- {
- throw new SpeckleException($"Could not retrieve layer with guid: {layerId}.");
- }
+ yield return layer;
+ }
+ else if (Guid.TryParse(layerId, out _))
+ {
+ throw new SpeckleException($"Could not retrieve layer with guid: {layerId}.");
}
else
{
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoObjectHelper.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoObjectHelper.cs
new file mode 100644
index 000000000..15437556a
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/HostApp/RhinoObjectHelper.cs
@@ -0,0 +1,17 @@
+using Rhino;
+using Rhino.DocObjects;
+
+namespace Speckle.Connectors.Rhino.HostApp;
+
+///
+/// Helper class for common Rhino object operations.
+///
+public class RhinoObjectHelper
+{
+ ///
+ /// Converts a string object ID to a RhinoObject.
+ ///
+ /// RhinoObject if found and valid, null otherwise
+ public RhinoObject? GetRhinoObject(string objectIdString) =>
+ Guid.TryParse(objectIdString, out var objectId) ? RhinoDoc.ActiveDoc.Objects.FindId(objectId) : null;
+}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/CategoryMapping.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/CategoryMapping.cs
new file mode 100644
index 000000000..f71b5e667
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/CategoryMapping.cs
@@ -0,0 +1,11 @@
+namespace Speckle.Connectors.Rhino.Mapper.Revit;
+
+///
+/// Represents a group of objects that are all assigned to the same category.
+///
+public record CategoryMapping(
+ string CategoryValue,
+ string CategoryLabel,
+ IReadOnlyList ObjectIds,
+ int ObjectCount
+);
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/LayerCategoryMapping.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/LayerCategoryMapping.cs
new file mode 100644
index 000000000..c2dae609b
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/LayerCategoryMapping.cs
@@ -0,0 +1,12 @@
+namespace Speckle.Connectors.Rhino.Mapper.Revit;
+
+///
+/// Represents layers that are all assigned to the same category.
+///
+public record LayerCategoryMapping(
+ string CategoryValue,
+ string CategoryLabel,
+ IReadOnlyList LayerIds,
+ IReadOnlyList LayerNames,
+ int LayerCount
+);
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/LayerOption.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/LayerOption.cs
new file mode 100644
index 000000000..e7463985f
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/LayerOption.cs
@@ -0,0 +1,6 @@
+namespace Speckle.Connectors.Rhino.Mapper.Revit;
+
+///
+/// Represents a layer option for the UI dropdown.
+///
+public record LayerOption(string Id, string Name);
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/RevitMappingConstants.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/RevitMappingConstants.cs
new file mode 100644
index 000000000..909abcc43
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/RevitMappingConstants.cs
@@ -0,0 +1,10 @@
+namespace Speckle.Connectors.Rhino.Mapper.Revit;
+
+///
+/// Shared constants for the Rhino-to-Revit mapping system.
+/// Centralizes string constant(s) to avoid duplication across three using classes.
+///
+public static class RevitMappingConstants
+{
+ public const string CATEGORY_USER_STRING_KEY = "builtInCategory";
+}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/RevitMappingResolver.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/RevitMappingResolver.cs
new file mode 100644
index 000000000..a036d0c80
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Mapper/Revit/RevitMappingResolver.cs
@@ -0,0 +1,113 @@
+using Rhino;
+using Rhino.DocObjects;
+using Speckle.Connectors.Rhino.HostApp;
+
+namespace Speckle.Connectors.Rhino.Mapper.Revit;
+
+///
+/// Responsible for resolving category mappings from layer hierarchy.
+/// Used by the send pipeline to resolve mappings during property extraction.
+///
+///
+/// This gets called when no mapping found on the object level.
+///
+public class RevitMappingResolver
+{
+ private readonly RhinoLayerHelper _rhinoLayerHelper;
+
+ public RevitMappingResolver(RhinoLayerHelper rhinoLayerHelper)
+ {
+ _rhinoLayerHelper = rhinoLayerHelper;
+ }
+
+ ///
+ /// Gets all objects that would effectively receive the specified layer mapping during send.
+ /// Takes into account hierarchical resolution - only returns objects that would actually
+ /// resolve to this specific category value through the layer hierarchy.
+ ///
+ public string[] GetEffectiveObjectsForLayerMapping(string[] layerIds, string categoryValue)
+ {
+ var effectiveObjects = new List();
+
+ foreach (var layerId in layerIds)
+ {
+ var layer = _rhinoLayerHelper.GetLayer(layerId);
+ if (layer == null)
+ {
+ continue;
+ }
+
+ // Get all objects in this layer and its child layers
+ var allObjectsInHierarchy = _rhinoLayerHelper.GetObjectsInLayerHierarchy(layer);
+
+ foreach (var obj in allObjectsInHierarchy)
+ {
+ // Since we're in Layer mode, objects don't have direct mappings
+ // Check what category this object would actually resolve to through layer hierarchy
+ var resolvedCategory = SearchLayerHierarchyForMapping(obj);
+
+ // Only include if it resolves to THIS specific category
+ if (resolvedCategory == categoryValue)
+ {
+ effectiveObjects.Add(obj.Id.ToString());
+ }
+ }
+ }
+
+ return effectiveObjects.ToArray();
+ }
+
+ ///
+ /// Traverses layer hierarchy, returns first mapping found or null
+ ///
+ public string? SearchLayerHierarchyForMapping(RhinoObject rhinoObject)
+ {
+ // NOTE: we agreed on a hierarchical resolution strategy:
+ // - Object-level mappings have highest precedence
+ // - Layer-level mappings are fallback when no object mapping exists
+ // - Traverses layer hierarchy and stops at first mapping found
+
+ var layer = GetLayerByIndex(rhinoObject.Attributes.LayerIndex);
+ while (layer != null)
+ {
+ var layerMapping = layer.GetUserString(RevitMappingConstants.CATEGORY_USER_STRING_KEY);
+ if (!string.IsNullOrEmpty(layerMapping))
+ {
+ return layerMapping; // returns first mapping found
+ }
+
+ // move to parent layer
+ layer = GetParentLayer(layer);
+ }
+
+ return null;
+ }
+
+ ///
+ /// Gets a layer by its index from the active doc.
+ ///
+ private Layer? GetLayerByIndex(int layerIndex)
+ {
+ var doc = RhinoDoc.ActiveDoc;
+ if (doc?.Layers == null || layerIndex < 0 || layerIndex >= doc.Layers.Count)
+ {
+ return null;
+ }
+
+ return doc.Layers[layerIndex];
+ }
+
+ ///
+ /// Gets the parent layer of the given layer.
+ ///
+ private Layer? GetParentLayer(Layer layer)
+ {
+ if (layer.ParentLayerId == Guid.Empty)
+ {
+ return null; // no parent layer
+ }
+
+ var doc = RhinoDoc.ActiveDoc;
+ return doc?.Layers?.FindId(layer.ParentLayerId);
+ }
+}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Filters/RhinoLayersFilter.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Filters/RhinoLayersFilter.cs
index 3a2109153..1ed954c42 100644
--- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Filters/RhinoLayersFilter.cs
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Filters/RhinoLayersFilter.cs
@@ -2,11 +2,14 @@ using Rhino;
using Rhino.DocObjects;
using Speckle.Connectors.DUI.Models.Card.SendFilter;
using Speckle.Connectors.DUI.Utils;
+using Speckle.Connectors.Rhino.HostApp;
namespace Speckle.Connectors.Rhino.Operations.Send.Filters;
public class RhinoLayersFilter : DiscriminatedObject, ISendFilter
{
+ private readonly RhinoLayerHelper _rhinoLayerHelper;
+
public string Id { get; set; } = "rhinoLayers";
public string Name { get; set; } = "Layers";
public string Type { get; set; } = "Select";
@@ -19,7 +22,10 @@ public class RhinoLayersFilter : DiscriminatedObject, ISendFilter
public List SelectedItems { get; set; }
public List Items => GetFilterItems();
- public RhinoLayersFilter() { }
+ public RhinoLayersFilter(RhinoLayerHelper rhinoLayerHelper)
+ {
+ _rhinoLayerHelper = rhinoLayerHelper;
+ }
public List RefreshObjectIds()
{
@@ -32,14 +38,11 @@ public class RhinoLayersFilter : DiscriminatedObject, ISendFilter
foreach (var item in SelectedItems)
{
- if (Guid.TryParse(item.Id, out Guid layerId))
+ Layer? layer = _rhinoLayerHelper.GetLayer(item.Id);
+ if (layer != null)
{
- Layer layer = doc.Layers.FindId(layerId);
- if (layer != null)
- {
- var objectIds = doc.Objects.FindByLayer(layer).Select(obj => obj.Id.ToString());
- SelectedObjectIds.AddRange(objectIds);
- }
+ var objectIds = doc.Objects.FindByLayer(layer).Select(obj => obj.Id.ToString());
+ SelectedObjectIds.AddRange(objectIds);
}
}
@@ -59,28 +62,10 @@ public class RhinoLayersFilter : DiscriminatedObject, ISendFilter
{
if (!layer.IsDeleted)
{
- filterItems.Add(new SendFilterSelectItem(layer.Id.ToString(), GetFullLayerPath(layer)));
+ filterItems.Add(new SendFilterSelectItem(layer.Id.ToString(), _rhinoLayerHelper.GetFullLayerPath(layer)));
}
}
return filterItems;
}
-
- private string GetFullLayerPath(Layer layer)
- {
- string fullPath = layer.Name;
- Guid parentIndex = layer.ParentLayerId;
- while (parentIndex != Guid.Empty)
- {
- Layer parentLayer = RhinoDoc.ActiveDoc.Layers.FindId(parentIndex);
- if (parentLayer == null)
- {
- break;
- }
-
- fullPath = parentLayer.Name + "/" + fullPath;
- parentIndex = parentLayer.ParentLayerId;
- }
- return fullPath;
- }
}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Settings/AddVisualizationProperties.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Settings/AddVisualizationProperties.cs
new file mode 100644
index 000000000..47f325090
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Settings/AddVisualizationProperties.cs
@@ -0,0 +1,12 @@
+using Speckle.Connectors.DUI.Settings;
+
+namespace Speckle.Connectors.Rhino.Operations.Send.Settings;
+
+public class AddVisualizationProperties(bool value) : ICardSetting
+{
+ public string? Id { get; set; } = "addVisualizationProperties";
+ public string? Title { get; set; } = "Add visualization properties for meshes (will increase model size)";
+ public string? Type { get; set; } = "boolean";
+ public object? Value { get; set; } = value;
+ public List? Enum { get; set; }
+}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Settings/ToSpeckleSettingsManager.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Settings/ToSpeckleSettingsManager.cs
new file mode 100644
index 000000000..0c91bf3e3
--- /dev/null
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Operations/Send/Settings/ToSpeckleSettingsManager.cs
@@ -0,0 +1,38 @@
+using Speckle.Connectors.Common.Caching;
+using Speckle.Connectors.DUI.Models.Card;
+using Speckle.Sdk.Common;
+
+namespace Speckle.Connectors.Rhino.Operations.Send.Settings;
+
+public class ToSpeckleSettingsManager
+{
+ private readonly ISendConversionCache _sendConversionCache;
+ private readonly Dictionary _addVisualizationPropertiesCache = [];
+
+ public ToSpeckleSettingsManager(ISendConversionCache sendConversionCache)
+ {
+ _sendConversionCache = sendConversionCache;
+ }
+
+ public bool GetAddVisualizationPropertiesSetting(SenderModelCard modelCard)
+ {
+ var value = modelCard.Settings?.First(s => s.Id == "addVisualizationProperties").Value as bool?;
+ var returnValue = value != null && value.NotNull();
+ if (_addVisualizationPropertiesCache.TryGetValue(modelCard.ModelCardId.NotNull(), out bool? previousValue))
+ {
+ if (previousValue != returnValue)
+ {
+ EvictCacheForModelCard(modelCard);
+ }
+ }
+
+ _addVisualizationPropertiesCache[modelCard.ModelCardId] = returnValue;
+ return returnValue;
+ }
+
+ private void EvictCacheForModelCard(SenderModelCard modelCard)
+ {
+ var objectIds = modelCard.SendFilter != null ? modelCard.SendFilter.NotNull().SelectedObjectIds : [];
+ _sendConversionCache.EvictObjects(objectIds);
+ }
+}
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Registration/ServiceRegistration.cs b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Registration/ServiceRegistration.cs
index 6a8a96ea4..9d2d86a6f 100644
--- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Registration/ServiceRegistration.cs
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Registration/ServiceRegistration.cs
@@ -17,8 +17,10 @@ using Speckle.Connectors.Rhino.Bindings;
using Speckle.Connectors.Rhino.Filters;
using Speckle.Connectors.Rhino.HostApp;
using Speckle.Connectors.Rhino.HostApp.Properties;
+using Speckle.Connectors.Rhino.Mapper.Revit;
using Speckle.Connectors.Rhino.Operations.Receive;
using Speckle.Connectors.Rhino.Operations.Send;
+using Speckle.Connectors.Rhino.Operations.Send.Settings;
using Speckle.Connectors.Rhino.Plugin;
using Speckle.Sdk.Models.GraphTraversal;
@@ -34,10 +36,10 @@ public static class ServiceRegistration
serviceCollection.AddSingleton(SpeckleConnectorsRhinoPlugin.Instance);
serviceCollection.AddSingleton(SpeckleConnectorsRhinoCommand.Instance);
serviceCollection.AddDUI();
+ serviceCollection.AddDUIView();
}
serviceCollection.AddConnectors();
- serviceCollection.AddDUIView();
// Register bindings
serviceCollection.AddSingleton();
@@ -50,11 +52,15 @@ public static class ServiceRegistration
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
// register send filters
serviceCollection.AddScoped();
serviceCollection.AddScoped();
+ // register send settings
+ serviceCollection.AddScoped();
+
// register send conversion cache
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
@@ -86,6 +92,11 @@ public static class ServiceRegistration
serviceCollection.AddScoped();
serviceCollection.AddScoped();
+ serviceCollection.AddScoped();
+
+ // register helpers
+ serviceCollection.AddScoped();
+ serviceCollection.AddScoped();
// operation progress manager
serviceCollection.AddSingleton();
diff --git a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Speckle.Connectors.RhinoShared.projitems b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Speckle.Connectors.RhinoShared.projitems
index f04b4fd1d..0bbaa2ab9 100644
--- a/Connectors/Rhino/Speckle.Connectors.RhinoShared/Speckle.Connectors.RhinoShared.projitems
+++ b/Connectors/Rhino/Speckle.Connectors.RhinoShared/Speckle.Connectors.RhinoShared.projitems
@@ -18,15 +18,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Connectors/Tekla/Speckle.Connector.Tekla2023/packages.lock.json b/Connectors/Tekla/Speckle.Connector.Tekla2023/packages.lock.json
index 19507f437..574d5e4a3 100644
--- a/Connectors/Tekla/Speckle.Connector.Tekla2023/packages.lock.json
+++ b/Connectors/Tekla/Speckle.Connector.Tekla2023/packages.lock.json
@@ -325,9 +325,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -360,7 +360,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"LibTessDotNet": {
@@ -410,18 +410,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -431,14 +431,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Tekla/Speckle.Connector.Tekla2024/packages.lock.json b/Connectors/Tekla/Speckle.Connector.Tekla2024/packages.lock.json
index b43c4806d..32731ea6b 100644
--- a/Connectors/Tekla/Speckle.Connector.Tekla2024/packages.lock.json
+++ b/Connectors/Tekla/Speckle.Connector.Tekla2024/packages.lock.json
@@ -406,9 +406,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -441,7 +441,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"LibTessDotNet": {
@@ -491,18 +491,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -512,14 +512,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Connectors/Tekla/Speckle.Connector.Tekla2025/packages.lock.json b/Connectors/Tekla/Speckle.Connector.Tekla2025/packages.lock.json
index ba2483b4c..649cce6f1 100644
--- a/Connectors/Tekla/Speckle.Connector.Tekla2025/packages.lock.json
+++ b/Connectors/Tekla/Speckle.Connector.Tekla2025/packages.lock.json
@@ -406,9 +406,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -441,7 +441,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"LibTessDotNet": {
@@ -491,18 +491,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -512,14 +512,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Autocad/Speckle.Converters.Autocad2022/packages.lock.json b/Converters/Autocad/Speckle.Converters.Autocad2022/packages.lock.json
index 5492cf7a4..7256cd387 100644
--- a/Converters/Autocad/Speckle.Converters.Autocad2022/packages.lock.json
+++ b/Converters/Autocad/Speckle.Converters.Autocad2022/packages.lock.json
@@ -258,7 +258,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -287,18 +287,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Autocad/Speckle.Converters.Autocad2023/packages.lock.json b/Converters/Autocad/Speckle.Converters.Autocad2023/packages.lock.json
index 85e96735a..bfd02d940 100644
--- a/Converters/Autocad/Speckle.Converters.Autocad2023/packages.lock.json
+++ b/Converters/Autocad/Speckle.Converters.Autocad2023/packages.lock.json
@@ -258,7 +258,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -287,18 +287,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Autocad/Speckle.Converters.Autocad2024/packages.lock.json b/Converters/Autocad/Speckle.Converters.Autocad2024/packages.lock.json
index 8a0ef7da3..e17305e22 100644
--- a/Converters/Autocad/Speckle.Converters.Autocad2024/packages.lock.json
+++ b/Converters/Autocad/Speckle.Converters.Autocad2024/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -285,7 +285,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -329,18 +329,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -350,14 +350,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Autocad/Speckle.Converters.Autocad2025/packages.lock.json b/Converters/Autocad/Speckle.Converters.Autocad2025/packages.lock.json
index 46573bb41..88e025109 100644
--- a/Converters/Autocad/Speckle.Converters.Autocad2025/packages.lock.json
+++ b/Converters/Autocad/Speckle.Converters.Autocad2025/packages.lock.json
@@ -210,9 +210,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -236,7 +236,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -280,18 +280,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -299,14 +299,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Autocad/Speckle.Converters.Autocad2026/packages.lock.json b/Converters/Autocad/Speckle.Converters.Autocad2026/packages.lock.json
index 9bf4b990a..2be562c8a 100644
--- a/Converters/Autocad/Speckle.Converters.Autocad2026/packages.lock.json
+++ b/Converters/Autocad/Speckle.Converters.Autocad2026/packages.lock.json
@@ -210,9 +210,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -236,7 +236,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -280,18 +280,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -299,14 +299,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/CSi/Speckle.Converters.ETABS21/packages.lock.json b/Converters/CSi/Speckle.Converters.ETABS21/packages.lock.json
index 2f643899d..3c8d2afef 100644
--- a/Converters/CSi/Speckle.Converters.ETABS21/packages.lock.json
+++ b/Converters/CSi/Speckle.Converters.ETABS21/packages.lock.json
@@ -258,7 +258,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -287,18 +287,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/CSi/Speckle.Converters.ETABS22/packages.lock.json b/Converters/CSi/Speckle.Converters.ETABS22/packages.lock.json
index 764994c50..6bf6b18f2 100644
--- a/Converters/CSi/Speckle.Converters.ETABS22/packages.lock.json
+++ b/Converters/CSi/Speckle.Converters.ETABS22/packages.lock.json
@@ -209,7 +209,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -238,18 +238,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -257,14 +257,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Civil3d/Speckle.Converters.Civil3d2022/packages.lock.json b/Converters/Civil3d/Speckle.Converters.Civil3d2022/packages.lock.json
index 349f56d84..58ca88601 100644
--- a/Converters/Civil3d/Speckle.Converters.Civil3d2022/packages.lock.json
+++ b/Converters/Civil3d/Speckle.Converters.Civil3d2022/packages.lock.json
@@ -267,7 +267,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -296,18 +296,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -317,14 +317,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Civil3d/Speckle.Converters.Civil3d2023/packages.lock.json b/Converters/Civil3d/Speckle.Converters.Civil3d2023/packages.lock.json
index 2ea9ed457..38885e6a5 100644
--- a/Converters/Civil3d/Speckle.Converters.Civil3d2023/packages.lock.json
+++ b/Converters/Civil3d/Speckle.Converters.Civil3d2023/packages.lock.json
@@ -267,7 +267,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -296,18 +296,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -317,14 +317,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Civil3d/Speckle.Converters.Civil3d2024/packages.lock.json b/Converters/Civil3d/Speckle.Converters.Civil3d2024/packages.lock.json
index ed005e456..ef5f3f3f4 100644
--- a/Converters/Civil3d/Speckle.Converters.Civil3d2024/packages.lock.json
+++ b/Converters/Civil3d/Speckle.Converters.Civil3d2024/packages.lock.json
@@ -267,7 +267,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -296,18 +296,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -317,14 +317,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Civil3d/Speckle.Converters.Civil3d2025/packages.lock.json b/Converters/Civil3d/Speckle.Converters.Civil3d2025/packages.lock.json
index 6e2440c41..c5cc045af 100644
--- a/Converters/Civil3d/Speckle.Converters.Civil3d2025/packages.lock.json
+++ b/Converters/Civil3d/Speckle.Converters.Civil3d2025/packages.lock.json
@@ -219,9 +219,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -245,7 +245,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -289,18 +289,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Civil3d/Speckle.Converters.Civil3d2026/packages.lock.json b/Converters/Civil3d/Speckle.Converters.Civil3d2026/packages.lock.json
index 6793a37fe..1818337ad 100644
--- a/Converters/Civil3d/Speckle.Converters.Civil3d2026/packages.lock.json
+++ b/Converters/Civil3d/Speckle.Converters.Civil3d2026/packages.lock.json
@@ -219,9 +219,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -245,7 +245,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -289,18 +289,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Navisworks/Speckle.Converters.Navisworks2020/packages.lock.json b/Converters/Navisworks/Speckle.Converters.Navisworks2020/packages.lock.json
index db15010d2..3c9735c81 100644
--- a/Converters/Navisworks/Speckle.Converters.Navisworks2020/packages.lock.json
+++ b/Converters/Navisworks/Speckle.Converters.Navisworks2020/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -278,7 +278,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -316,18 +316,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -337,14 +337,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Navisworks/Speckle.Converters.Navisworks2021/packages.lock.json b/Converters/Navisworks/Speckle.Converters.Navisworks2021/packages.lock.json
index f45017354..41ba46882 100644
--- a/Converters/Navisworks/Speckle.Converters.Navisworks2021/packages.lock.json
+++ b/Converters/Navisworks/Speckle.Converters.Navisworks2021/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -278,7 +278,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -316,18 +316,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -337,14 +337,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Navisworks/Speckle.Converters.Navisworks2022/packages.lock.json b/Converters/Navisworks/Speckle.Converters.Navisworks2022/packages.lock.json
index c8efdd5ee..684f98847 100644
--- a/Converters/Navisworks/Speckle.Converters.Navisworks2022/packages.lock.json
+++ b/Converters/Navisworks/Speckle.Converters.Navisworks2022/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -278,7 +278,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -316,18 +316,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -337,14 +337,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Navisworks/Speckle.Converters.Navisworks2023/packages.lock.json b/Converters/Navisworks/Speckle.Converters.Navisworks2023/packages.lock.json
index b0b0423ca..cb017a588 100644
--- a/Converters/Navisworks/Speckle.Converters.Navisworks2023/packages.lock.json
+++ b/Converters/Navisworks/Speckle.Converters.Navisworks2023/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -278,7 +278,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -316,18 +316,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -337,14 +337,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Navisworks/Speckle.Converters.Navisworks2024/packages.lock.json b/Converters/Navisworks/Speckle.Converters.Navisworks2024/packages.lock.json
index 9f3c036f1..d05e07af0 100644
--- a/Converters/Navisworks/Speckle.Converters.Navisworks2024/packages.lock.json
+++ b/Converters/Navisworks/Speckle.Converters.Navisworks2024/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -278,7 +278,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -316,18 +316,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -337,14 +337,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Navisworks/Speckle.Converters.Navisworks2025/packages.lock.json b/Converters/Navisworks/Speckle.Converters.Navisworks2025/packages.lock.json
index 6dddb069b..bb3dfcf54 100644
--- a/Converters/Navisworks/Speckle.Converters.Navisworks2025/packages.lock.json
+++ b/Converters/Navisworks/Speckle.Converters.Navisworks2025/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -278,7 +278,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -316,18 +316,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -337,14 +337,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Navisworks/Speckle.Converters.Navisworks2026/packages.lock.json b/Converters/Navisworks/Speckle.Converters.Navisworks2026/packages.lock.json
index 5787cdd70..d4399aa06 100644
--- a/Converters/Navisworks/Speckle.Converters.Navisworks2026/packages.lock.json
+++ b/Converters/Navisworks/Speckle.Converters.Navisworks2026/packages.lock.json
@@ -260,9 +260,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -279,7 +279,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -317,18 +317,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -338,14 +338,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Navisworks/Speckle.Converters.NavisworksShared/DataExtractors/RevitBuiltInCategoryExtractor.cs b/Converters/Navisworks/Speckle.Converters.NavisworksShared/DataExtractors/RevitBuiltInCategoryExtractor.cs
new file mode 100644
index 000000000..5b50dd4e6
--- /dev/null
+++ b/Converters/Navisworks/Speckle.Converters.NavisworksShared/DataExtractors/RevitBuiltInCategoryExtractor.cs
@@ -0,0 +1,182 @@
+using static Speckle.Converter.Navisworks.Helpers.PropertyHelpers;
+
+namespace Speckle.Converter.Navisworks.ToSpeckle;
+
+public sealed class RevitBuiltInCategoryExtractor
+{
+ private const int ANCESTOR_AND_SELF_COUNT = 4; // It seems like this is the maximum depth found needed in practice
+ private const string REVIT_CAT_GROUP = "LcRevitData_Element";
+ private const string REVIT_CAT_NAME = "LcRevitPropertyElementCategory";
+ internal const string DEFAULT_DICT_KEY = "builtInCategory";
+
+ ///
+ /// Attempts to map a Navisworks/Revit display category from the given model item or its ancestors
+ /// to a known Revit built-in category constant (e.g., "OST_Walls").
+ ///
+ internal static bool TryGetBuiltInCategory(
+ NAV.ModelItem item,
+ out string mapped,
+ int maxDepth = ANCESTOR_AND_SELF_COUNT
+ )
+ {
+ mapped = string.Empty;
+
+ // Look up the category value, starting at this item and walking up to maxDepth ancestors
+ var v = FindRevitCategoryInHierarchy(item, maxDepth);
+ if (v == null)
+ {
+ return false;
+ }
+
+ var name = ConvertPropertyValue(v, "")?.ToString();
+ if (string.IsNullOrWhiteSpace(name))
+ {
+ return false;
+ }
+
+ name = name?.Trim();
+
+ // Map display name to OST_* built-in category constant
+ var builtInCategory = DisplayNameToRevitBuiltInCategory(name);
+ if (string.Equals(builtInCategory, name, StringComparison.OrdinalIgnoreCase))
+ {
+ return false; // no mapping
+ }
+
+ mapped = builtInCategory;
+ return true;
+ }
+
+ ///
+ /// Walks up the model item hierarchy to find the first Revit element category property.
+ ///
+ private static NAV.VariantData? FindRevitCategoryInHierarchy(NAV.ModelItem modelItem, int maxDepth)
+ {
+ var current = modelItem;
+
+ // Walk up the model item hierarchy to find the first matching Revit category property
+ for (int i = 0; i < maxDepth && current != null; i++, current = current.Parent)
+ {
+ var val = current.PropertyCategories.FindPropertyByName(REVIT_CAT_GROUP, REVIT_CAT_NAME)?.Value;
+
+ if (val != null)
+ {
+ return val;
+ }
+ }
+
+ // No category property found in self or ancestors
+ return null;
+ }
+
+ // Mapping of Navisworks/Revit display category names (from the importer)
+ // to Revit BuiltInCategory constants. Case-insensitive.
+ // Note: Some mapped categories are not assignable via Revit DirectShape;
+ // the receiver will ignore them and apply its own fallback.
+ private static readonly Dictionary s_revitCatMap =
+ new(StringComparer.OrdinalIgnoreCase)
+ {
+ // Architectural
+ ["Walls"] = "OST_Walls",
+ ["Floors"] = "OST_Floors",
+ ["Roofs"] = "OST_Roofs",
+ ["Ceilings"] = "OST_Ceilings",
+ ["Doors"] = "OST_Doors",
+ ["Windows"] = "OST_Windows",
+ ["Curtain Panels"] = "OST_CurtainWallPanels",
+ ["Curtain Wall Mullions"] = "OST_CurtainWallMullions",
+ ["Wall Sweeps"] = "OST_Cornices",
+ ["Hardscape"] = "OST_Hardscape",
+ ["Site"] = "OST_Site",
+ ["Parking"] = "OST_Parking",
+ ["Toposolid"] = "OST_Toposolid",
+ ["Levels"] = "OST_Levels",
+ ["Lines"] = "OST_Lines",
+ ["Center line"] = "OST_CenterLines",
+ ["Center Line"] = "OST_CenterLines",
+
+ // Stairs & Railings
+ ["Stairs"] = "OST_Stairs",
+ ["Supports"] = "OST_Stairs",
+ ["Runs"] = "OST_Stairs",
+ ["Railings"] = "OST_StairsRailing",
+ ["Handrails"] = "OST_RailingHandRail",
+ ["Landings"] = "OST_StairsLandings",
+ ["Vertical Circulation"] = "OST_VerticalCirculation",
+
+ // Structural
+ ["Structural Connections"] = "OST_StructConnections",
+ ["Structural Foundations"] = "OST_StructuralFoundation",
+ ["Structural Columns"] = "OST_StructuralColumns",
+ ["Structural Framing"] = "OST_StructuralFraming",
+ ["Structural Loads"] = "OST_Loads",
+ ["Structural Rebar"] = "OST_Rebar",
+ ["Structural Fabric Areas"] = "OST_FabricAreas",
+ ["Structural Fabric Reinforcement"] = "OST_FabricReinforcement",
+ ["Boundary Conditions"] = "OST_BoundaryConditions",
+ ["Slab Edges"] = "OST_EdgeSlab",
+ ["Fascias"] = "OST_Fascia",
+ ["Roof Soffits"] = "OST_RoofSoffit",
+
+ // MEP - HVAC
+ ["Air Terminals"] = "OST_DuctTerminal",
+ ["Duct Fittings"] = "OST_DuctFitting",
+ ["Ducts"] = "OST_DuctCurves",
+ ["Flex Ducts"] = "OST_FlexDuctCurves",
+ ["Duct Accessories"] = "OST_DuctAccessory",
+ ["Mechanical Equipment"] = "OST_MechanicalEquipment",
+
+ // MEP - Plumbing
+ ["Plumbing Fixtures"] = "OST_PlumbingFixtures",
+ ["Plumbing Equipment"] = "OST_PlumbingEquipment",
+ ["Pipe Accessories"] = "OST_PipeAccessory",
+ ["Pipe Fittings"] = "OST_PipeFitting",
+ ["Pipes"] = "OST_PipeCurves",
+ ["Flex Pipes"] = "OST_FlexPipeCurves",
+ ["Pipe Insulations"] = "OST_PipeInsulations",
+
+ // MEP - Electrical
+ ["Electrical Equipment"] = "OST_ElectricalEquipment",
+ ["Electrical Fixtures"] = "OST_ElectricalFixtures",
+ ["Lighting Fixtures"] = "OST_LightingFixtures",
+ ["Lighting Devices"] = "OST_LightingDevices",
+ ["Data Devices"] = "OST_DataDevices",
+ ["Communication Devices"] = "OST_CommunicationDevices",
+
+ // MEP - Conduits & Cable Trays
+ ["Conduit Fittings"] = "OST_ConduitFitting",
+ ["Conduits"] = "OST_Conduit",
+ ["Conduit Accessories"] = "OST_ConduitAccessory",
+ ["Cable Tray Fittings"] = "OST_CableTrayFitting",
+ ["Cable Trays"] = "OST_CableTray",
+
+ // Equipment & Furniture
+ ["Casework"] = "OST_Casework",
+ ["Specialty Equipment"] = "OST_SpecialityEquipment",
+ ["Food Service Equipment"] = "OST_FoodServiceEquipment",
+ ["Furniture"] = "OST_Furniture",
+ ["Generic Models"] = "OST_GenericModel",
+ ["Planting"] = "OST_Planting",
+ ["Entourage"] = "OST_Entourage",
+
+ // Separations & Rooms
+ [""] = "OST_MEPSpaceSeparationLines",
+ [""] = "OST_RoomSeparationLines",
+ ["Rooms"] = "OST_Rooms",
+
+ // Misc
+ ["Ramps"] = "OST_Ramps"
+ };
+
+ ///
+ /// Maps a Navisworks/Revit display category name to a Revit BuiltInCategory.
+ /// Assumes importer emits canonical names. Case-insensitive lookup.
+ /// Returns the original name when no mapping exists.
+ ///
+ private static string DisplayNameToRevitBuiltInCategory(string displayName) =>
+ string.IsNullOrEmpty(displayName)
+ ? displayName
+ : s_revitCatMap.TryGetValue(displayName, out var builtInCategory)
+ ? builtInCategory
+ : displayName;
+}
diff --git a/Converters/Navisworks/Speckle.Converters.NavisworksShared/DataHandlers/HierarchicalPropertyHandler.cs b/Converters/Navisworks/Speckle.Converters.NavisworksShared/DataHandlers/HierarchicalPropertyHandler.cs
index 68d583bd3..e882cd5f9 100644
--- a/Converters/Navisworks/Speckle.Converters.NavisworksShared/DataHandlers/HierarchicalPropertyHandler.cs
+++ b/Converters/Navisworks/Speckle.Converters.NavisworksShared/DataHandlers/HierarchicalPropertyHandler.cs
@@ -1,4 +1,8 @@
-namespace Speckle.Converter.Navisworks.ToSpeckle.PropertyHandlers;
+using Speckle.Converter.Navisworks.Helpers;
+using Speckle.Converter.Navisworks.Settings;
+using Speckle.Converters.Common;
+
+namespace Speckle.Converter.Navisworks.ToSpeckle.PropertyHandlers;
///
/// Handles property assignment with hierarchy merging for objects that require ancestor properties.
@@ -6,14 +10,26 @@
public class HierarchicalPropertyHandler(
PropertySetsExtractor propertySetsExtractor,
ModelPropertiesExtractor modelPropertiesExtractor,
- ClassPropertiesExtractor classPropertiesExtractor
+ ClassPropertiesExtractor classPropertiesExtractor,
+ IConverterSettingsStore settingsStore
) : BasePropertyHandler(propertySetsExtractor, modelPropertiesExtractor)
{
- private string PseudoClassPropertiesKey => "_pseudoClassProperties";
+ private static string PseudoClassPropertiesKey => "_pseudoClassProperties";
+ private readonly bool _mapRevit = settingsStore.Current.User.RevitCategoryMapping;
public override Dictionary GetProperties(NAV.ModelItem modelItem)
{
- var propertyDict = classPropertiesExtractor.GetClassProperties(modelItem) ?? new Dictionary();
+ var propertyDict = classPropertiesExtractor.GetClassProperties(modelItem) ?? [];
+
+ // Interop-lite mapping for Revit built-in categories
+ if (_mapRevit && RevitBuiltInCategoryExtractor.TryGetBuiltInCategory(modelItem, out var builtInCategory))
+ {
+ PropertyHelpers.AddPropertyIfNotNullOrEmpty(
+ propertyDict,
+ RevitBuiltInCategoryExtractor.DEFAULT_DICT_KEY,
+ builtInCategory
+ );
+ }
var hierarchy = GetObjectHierarchy(modelItem);
var propertyCollection = new Dictionary>>();
diff --git a/Converters/Navisworks/Speckle.Converters.NavisworksShared/Helpers/PropertyHelpers.cs b/Converters/Navisworks/Speckle.Converters.NavisworksShared/Helpers/PropertyHelpers.cs
index a9e771d64..9ede12e6a 100644
--- a/Converters/Navisworks/Speckle.Converters.NavisworksShared/Helpers/PropertyHelpers.cs
+++ b/Converters/Navisworks/Speckle.Converters.NavisworksShared/Helpers/PropertyHelpers.cs
@@ -35,8 +35,13 @@ public static class PropertyHelpers
}
};
- internal static dynamic? ConvertPropertyValue(NAV.VariantData value, string units)
+ internal static dynamic? ConvertPropertyValue(NAV.VariantData? value, string units)
{
+ if (value == null)
+ {
+ return null;
+ }
+
if (s_typeHandlers.TryGetValue(value.DataType, out var handler))
{
return handler(value, units);
@@ -54,10 +59,12 @@ public static class PropertyHelpers
/// The object to which the property is to be added. Can be either a Base object or a Dictionary.
/// The name of the property to add.
/// The value of the property.
- internal static void AddPropertyIfNotNullOrEmpty(object baseObject, string propertyName, object value)
+ internal static void AddPropertyIfNotNullOrEmpty(object baseObject, string propertyName, object? value)
{
switch (value)
{
+ case null:
+ break; // Do not add null values
case string stringValue:
{
if (!string.IsNullOrEmpty(stringValue))
diff --git a/Converters/Navisworks/Speckle.Converters.NavisworksShared/Settings/NavisworksConversionSettings.cs b/Converters/Navisworks/Speckle.Converters.NavisworksShared/Settings/NavisworksConversionSettings.cs
index 6705a12ef..8c07eff69 100644
--- a/Converters/Navisworks/Speckle.Converters.NavisworksShared/Settings/NavisworksConversionSettings.cs
+++ b/Converters/Navisworks/Speckle.Converters.NavisworksShared/Settings/NavisworksConversionSettings.cs
@@ -24,5 +24,6 @@ public record User(
RepresentationMode VisualRepresentationMode, // Specifies the visual representation mode.
bool CoalescePropertiesFromFirstObjectAncestor, // Whether to merge properties from the first object ancestor.
bool ExcludeProperties, // Whether to exclude properties from the output.
- bool PreserveModelHierarchy // Whether to maintain the full model hierarchy during conversion.
+ bool PreserveModelHierarchy, // Whether to maintain the full model hierarchy during conversion.
+ bool RevitCategoryMapping // Optional mapping to Revit categories (if applicable).
);
diff --git a/Converters/Navisworks/Speckle.Converters.NavisworksShared/Settings/NavisworksConversionSettingsFactory.cs b/Converters/Navisworks/Speckle.Converters.NavisworksShared/Settings/NavisworksConversionSettingsFactory.cs
index e71b16d38..ddc3bbe58 100644
--- a/Converters/Navisworks/Speckle.Converters.NavisworksShared/Settings/NavisworksConversionSettingsFactory.cs
+++ b/Converters/Navisworks/Speckle.Converters.NavisworksShared/Settings/NavisworksConversionSettingsFactory.cs
@@ -45,7 +45,8 @@ public class NavisworksConversionSettingsFactory : INavisworksConversionSettings
RepresentationMode visualRepresentationMode,
bool convertHiddenElements,
bool includeInternalProperties,
- bool preserveModelHierarchy
+ bool preserveModelHierarchy,
+ bool mappingToRevitCategories
)
{
_convertHiddenElements = convertHiddenElements;
@@ -86,7 +87,8 @@ public class NavisworksConversionSettingsFactory : INavisworksConversionSettings
VisualRepresentationMode: visualRepresentationMode,
CoalescePropertiesFromFirstObjectAncestor: false, // Not yet exposed in the UI
ExcludeProperties: false, // Not yet exposed in the UI
- PreserveModelHierarchy: preserveModelHierarchy
+ PreserveModelHierarchy: preserveModelHierarchy,
+ RevitCategoryMapping: mappingToRevitCategories
)
);
}
diff --git a/Converters/Navisworks/Speckle.Converters.NavisworksShared/Speckle.Converters.NavisworksShared.projitems b/Converters/Navisworks/Speckle.Converters.NavisworksShared/Speckle.Converters.NavisworksShared.projitems
index d791e58b9..5500fe7e5 100644
--- a/Converters/Navisworks/Speckle.Converters.NavisworksShared/Speckle.Converters.NavisworksShared.projitems
+++ b/Converters/Navisworks/Speckle.Converters.NavisworksShared/Speckle.Converters.NavisworksShared.projitems
@@ -13,6 +13,7 @@
+
diff --git a/Converters/Revit/Speckle.Converters.Revit2022/packages.lock.json b/Converters/Revit/Speckle.Converters.Revit2022/packages.lock.json
index 2b71f6bbb..bf099a8da 100644
--- a/Converters/Revit/Speckle.Converters.Revit2022/packages.lock.json
+++ b/Converters/Revit/Speckle.Converters.Revit2022/packages.lock.json
@@ -258,7 +258,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -287,18 +287,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Revit/Speckle.Converters.Revit2023/packages.lock.json b/Converters/Revit/Speckle.Converters.Revit2023/packages.lock.json
index 3a7ee3e2a..1e9e1cdfe 100644
--- a/Converters/Revit/Speckle.Converters.Revit2023/packages.lock.json
+++ b/Converters/Revit/Speckle.Converters.Revit2023/packages.lock.json
@@ -258,7 +258,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -287,18 +287,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Revit/Speckle.Converters.Revit2024/packages.lock.json b/Converters/Revit/Speckle.Converters.Revit2024/packages.lock.json
index c71980343..1855b6d3f 100644
--- a/Converters/Revit/Speckle.Converters.Revit2024/packages.lock.json
+++ b/Converters/Revit/Speckle.Converters.Revit2024/packages.lock.json
@@ -258,7 +258,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -287,18 +287,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Revit/Speckle.Converters.Revit2025/packages.lock.json b/Converters/Revit/Speckle.Converters.Revit2025/packages.lock.json
index 1a3362e35..e9b9bcee3 100644
--- a/Converters/Revit/Speckle.Converters.Revit2025/packages.lock.json
+++ b/Converters/Revit/Speckle.Converters.Revit2025/packages.lock.json
@@ -209,7 +209,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -238,18 +238,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -257,14 +257,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Revit/Speckle.Converters.Revit2026/packages.lock.json b/Converters/Revit/Speckle.Converters.Revit2026/packages.lock.json
index 539588374..534cd6e8f 100644
--- a/Converters/Revit/Speckle.Converters.Revit2026/packages.lock.json
+++ b/Converters/Revit/Speckle.Converters.Revit2026/packages.lock.json
@@ -209,7 +209,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -238,18 +238,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -257,14 +257,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Revit/Speckle.Converters.RevitShared/ToHost/Raw/LocalToGlobalToDirectShapeConverter.cs b/Converters/Revit/Speckle.Converters.RevitShared/ToHost/Raw/LocalToGlobalToDirectShapeConverter.cs
index 1c3962ed3..cc424f8f0 100644
--- a/Converters/Revit/Speckle.Converters.RevitShared/ToHost/Raw/LocalToGlobalToDirectShapeConverter.cs
+++ b/Converters/Revit/Speckle.Converters.RevitShared/ToHost/Raw/LocalToGlobalToDirectShapeConverter.cs
@@ -2,7 +2,6 @@ using Speckle.Converters.Common;
using Speckle.Converters.Common.Objects;
using Speckle.Converters.RevitShared.Settings;
using Speckle.DoubleNumerics;
-using Speckle.Objects.Data;
using Speckle.Sdk.Common;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Extensions;
@@ -35,12 +34,15 @@ public class LocalToGlobalToDirectShapeConverter
// NOTE: previously, builtInCategory was on the atomicObject level. this was subsequently moved to properties
string? category = null;
- if (target.atomicObject is DataObject dataObject)
+ // NOTE: no longer limited to DataObject since the introduction of mapper
+ // The change from `if (target.atomicObject is DataObject dataObject)` is very hacky, but nothing else to do for now
+ // TODO: better define prop interfaces for different applications
+ if (
+ target.atomicObject["properties"] is Dictionary properties
+ && properties.TryGetValue("builtInCategory", out var builtInCategory)
+ )
{
- if (dataObject.properties.TryGetValue("builtInCategory", out var builtInCategory))
- {
- category = builtInCategory?.ToString();
- }
+ category = builtInCategory?.ToString();
}
var dsCategory = DB.BuiltInCategory.OST_GenericModel;
diff --git a/Converters/Rhino/Speckle.Converters.Rhino7/packages.lock.json b/Converters/Rhino/Speckle.Converters.Rhino7/packages.lock.json
index 4055ccb2f..afdd2a2b6 100644
--- a/Converters/Rhino/Speckle.Converters.Rhino7/packages.lock.json
+++ b/Converters/Rhino/Speckle.Converters.Rhino7/packages.lock.json
@@ -258,7 +258,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -287,18 +287,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -308,14 +308,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Rhino/Speckle.Converters.Rhino8/Speckle.Converters.Rhino8.csproj b/Converters/Rhino/Speckle.Converters.Rhino8/Speckle.Converters.Rhino8.csproj
index 22ea3ed42..b4cf6b84a 100644
--- a/Converters/Rhino/Speckle.Converters.Rhino8/Speckle.Converters.Rhino8.csproj
+++ b/Converters/Rhino/Speckle.Converters.Rhino8/Speckle.Converters.Rhino8.csproj
@@ -1,14 +1,19 @@
- net48
+ net48;net8.0
Debug;Release;Local
$(DefineConstants);RHINO8;RHINO7_OR_GREATER;RHINO8_OR_GREATER
-
-
+
+
+
+
+
+
+
diff --git a/Converters/Rhino/Speckle.Converters.Rhino8/packages.lock.json b/Converters/Rhino/Speckle.Converters.Rhino8/packages.lock.json
index a936bd2aa..49ba02c01 100644
--- a/Converters/Rhino/Speckle.Converters.Rhino8/packages.lock.json
+++ b/Converters/Rhino/Speckle.Converters.Rhino8/packages.lock.json
@@ -258,7 +258,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"Microsoft.Extensions.Logging": {
@@ -287,18 +287,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -308,14 +308,296 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
+ }
+ },
+ "net8.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=="
+ },
+ "RhinoCommon": {
+ "type": "Direct",
+ "requested": "[8.21.25188.17001, )",
+ "resolved": "8.21.25188.17001",
+ "contentHash": "Wo6JXheyDBvilyIwDY6xZCQJC4170jzAlTSlMgh8yokUY+vYyCl4KJVXZofIOynNt/xx5wLqb2On5gZZekXR6w==",
+ "dependencies": {
+ "System.Drawing.Common": "7.0.0"
+ }
+ },
+ "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.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=="
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
+ },
+ "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.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "7.0.0"
+ }
+ },
+ "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.5.1, )"
+ }
+ },
+ "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.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
+ "dependencies": {
+ "Speckle.Sdk": "3.5.1"
+ }
+ },
+ "Speckle.Sdk": {
+ "type": "CentralTransitive",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
+ "dependencies": {
+ "GraphQL.Client": "6.0.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.5.1"
+ }
+ },
+ "Speckle.Sdk.Dependencies": {
+ "type": "CentralTransitive",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Converters/Rhino/Speckle.Converters.RhinoShared/RhinoConversionSettings.cs b/Converters/Rhino/Speckle.Converters.RhinoShared/RhinoConversionSettings.cs
index 6255f6009..455555cb4 100644
--- a/Converters/Rhino/Speckle.Converters.RhinoShared/RhinoConversionSettings.cs
+++ b/Converters/Rhino/Speckle.Converters.RhinoShared/RhinoConversionSettings.cs
@@ -5,4 +5,9 @@ namespace Speckle.Converters.Rhino;
///
/// Represents the settings used for Rhino and Grasshopper conversions.
///
-public record RhinoConversionSettings(RhinoDoc Document, string SpeckleUnits, bool ModelFarFromOrigin);
+public record RhinoConversionSettings(
+ RhinoDoc Document,
+ string SpeckleUnits,
+ bool ModelFarFromOrigin,
+ bool AddVisualizationProperties
+);
diff --git a/Converters/Rhino/Speckle.Converters.RhinoShared/RhinoConversionSettingsFactory.cs b/Converters/Rhino/Speckle.Converters.RhinoShared/RhinoConversionSettingsFactory.cs
index 91e68540f..8b46a7091 100644
--- a/Converters/Rhino/Speckle.Converters.RhinoShared/RhinoConversionSettingsFactory.cs
+++ b/Converters/Rhino/Speckle.Converters.RhinoShared/RhinoConversionSettingsFactory.cs
@@ -12,8 +12,13 @@ public class RhinoConversionSettingsFactory(
{
public RhinoConversionSettings Current => settingsStore.Current;
- public RhinoConversionSettings Create(RhinoDoc document) =>
- new(document, unitsConverter.ConvertOrThrow(RhinoDoc.ActiveDoc.ModelUnitSystem), ModelFarFromOrigin());
+ public RhinoConversionSettings Create(RhinoDoc document, bool addVisualizationProperties) =>
+ new(
+ document,
+ unitsConverter.ConvertOrThrow(RhinoDoc.ActiveDoc.ModelUnitSystem),
+ ModelFarFromOrigin(),
+ addVisualizationProperties
+ );
///
/// Quick check whether any of the objects in the scene might be located too far from origin and cause precision issues during meshing.
diff --git a/Converters/Rhino/Speckle.Converters.RhinoShared/ToSpeckle/Raw/MeshToSpeckleConverter.cs b/Converters/Rhino/Speckle.Converters.RhinoShared/ToSpeckle/Raw/MeshToSpeckleConverter.cs
index 078a830e0..2bbe4f676 100644
--- a/Converters/Rhino/Speckle.Converters.RhinoShared/ToSpeckle/Raw/MeshToSpeckleConverter.cs
+++ b/Converters/Rhino/Speckle.Converters.RhinoShared/ToSpeckle/Raw/MeshToSpeckleConverter.cs
@@ -80,14 +80,6 @@ public class MeshToSpeckleConverter : ITypedConverter
}
}
- var textureCoordinates = new double[target.TextureCoordinates.Count * 2];
- x = 0;
- foreach (var textureCoord in target.TextureCoordinates)
- {
- textureCoordinates[x++] = textureCoord.X;
- textureCoordinates[x++] = textureCoord.Y;
- }
-
var colors = new int[target.VertexColors.Count];
x = 0;
foreach (var c in target.VertexColors)
@@ -95,13 +87,27 @@ public class MeshToSpeckleConverter : ITypedConverter
colors[x++] = c.ToArgb();
}
- var vertexNormals = new double[target.Normals.Count * 3];
- x = 0;
- foreach (var n in target.Normals)
+ // NOTE: textureCoordinates and vertexNormals will be empty array when setting is false
+ double[] textureCoordinates = [];
+ double[] vertexNormals = [];
+ if (_settingsStore.Current.AddVisualizationProperties)
{
- vertexNormals[x++] = n.X;
- vertexNormals[x++] = n.Y;
- vertexNormals[x++] = n.Z;
+ textureCoordinates = new double[target.TextureCoordinates.Count * 2];
+ x = 0;
+ foreach (var textureCoord in target.TextureCoordinates)
+ {
+ textureCoordinates[x++] = textureCoord.X;
+ textureCoordinates[x++] = textureCoord.Y;
+ }
+
+ vertexNormals = new double[target.Normals.Count * 3];
+ x = 0;
+ foreach (var n in target.Normals)
+ {
+ vertexNormals[x++] = n.X;
+ vertexNormals[x++] = n.Y;
+ vertexNormals[x++] = n.Z;
+ }
}
double volume = target.IsClosed ? target.Volume() : 0;
@@ -112,8 +118,8 @@ public class MeshToSpeckleConverter : ITypedConverter
vertices = [.. vertexCoordinates],
faces = faces,
colors = [.. colors],
- textureCoordinates = [.. textureCoordinates],
- vertexNormals = [.. vertexNormals],
+ textureCoordinates = [.. textureCoordinates], // this will be empty array when setting is false
+ vertexNormals = [.. vertexNormals], // this will be empty array when setting is false
units = _settingsStore.Current.SpeckleUnits,
volume = volume,
bbox = bbox
diff --git a/Converters/Tekla/Speckle.Converter.Tekla2023/packages.lock.json b/Converters/Tekla/Speckle.Converter.Tekla2023/packages.lock.json
index 03f50083e..13fef4f06 100644
--- a/Converters/Tekla/Speckle.Converter.Tekla2023/packages.lock.json
+++ b/Converters/Tekla/Speckle.Converter.Tekla2023/packages.lock.json
@@ -302,7 +302,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"LibTessDotNet": {
@@ -337,18 +337,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -358,14 +358,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
},
"Tekla.Structures.Dialog": {
"type": "CentralTransitive",
diff --git a/Converters/Tekla/Speckle.Converter.Tekla2024/packages.lock.json b/Converters/Tekla/Speckle.Converter.Tekla2024/packages.lock.json
index d7c798e9b..48b345568 100644
--- a/Converters/Tekla/Speckle.Converter.Tekla2024/packages.lock.json
+++ b/Converters/Tekla/Speckle.Converter.Tekla2024/packages.lock.json
@@ -343,7 +343,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"LibTessDotNet": {
@@ -378,18 +378,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -399,14 +399,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
},
"Tekla.Structures.Plugins": {
"type": "CentralTransitive",
diff --git a/Converters/Tekla/Speckle.Converter.Tekla2025/packages.lock.json b/Converters/Tekla/Speckle.Converter.Tekla2025/packages.lock.json
index d7c798e9b..48b345568 100644
--- a/Converters/Tekla/Speckle.Converter.Tekla2025/packages.lock.json
+++ b/Converters/Tekla/Speckle.Converter.Tekla2025/packages.lock.json
@@ -343,7 +343,7 @@
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
- "Speckle.Objects": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )"
}
},
"LibTessDotNet": {
@@ -378,18 +378,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -399,14 +399,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
},
"Tekla.Structures.Plugins": {
"type": "CentralTransitive",
diff --git a/DUI3/Speckle.Connectors.DUI.Tests/packages.lock.json b/DUI3/Speckle.Connectors.DUI.Tests/packages.lock.json
index 95b78154b..14bf8aa57 100644
--- a/DUI3/Speckle.Connectors.DUI.Tests/packages.lock.json
+++ b/DUI3/Speckle.Connectors.DUI.Tests/packages.lock.json
@@ -314,9 +314,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -335,7 +335,7 @@
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Moq": "[4.20.70, )",
"NUnit": "[4.1.0, )",
- "Speckle.Sdk": "[3.5.0, )"
+ "Speckle.Sdk": "[3.5.1, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -373,18 +373,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -392,14 +392,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/DUI3/Speckle.Connectors.DUI.WebView/packages.lock.json b/DUI3/Speckle.Connectors.DUI.WebView/packages.lock.json
index 1f6fe89ee..c193ec8a1 100644
--- a/DUI3/Speckle.Connectors.DUI.WebView/packages.lock.json
+++ b/DUI3/Speckle.Connectors.DUI.WebView/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -309,18 +309,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -330,14 +330,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
"net8.0-windows7.0": {
@@ -549,9 +549,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.dui": {
@@ -599,18 +599,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -618,14 +618,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/DUI3/Speckle.Connectors.DUI/packages.lock.json b/DUI3/Speckle.Connectors.DUI/packages.lock.json
index 482e3e661..740cdf0f1 100644
--- a/DUI3/Speckle.Connectors.DUI/packages.lock.json
+++ b/DUI3/Speckle.Connectors.DUI/packages.lock.json
@@ -259,9 +259,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.logging": {
@@ -296,18 +296,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
@@ -317,14 +317,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
},
"net8.0": {
@@ -536,9 +536,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.logging": {
@@ -573,18 +573,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -592,14 +592,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 1189776ac..8f56531f5 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -6,6 +6,7 @@
+
@@ -17,6 +18,7 @@
+
@@ -26,6 +28,7 @@
+
@@ -50,9 +53,9 @@
-
-
-
+
+
+
diff --git a/Importers/Ifc/Speckle.Importers.Ifc.Tester/packages.lock.json b/Importers/Ifc/Speckle.Importers.Ifc.Tester/packages.lock.json
index ea5161cf2..cb22516d3 100644
--- a/Importers/Ifc/Speckle.Importers.Ifc.Tester/packages.lock.json
+++ b/Importers/Ifc/Speckle.Importers.Ifc.Tester/packages.lock.json
@@ -204,9 +204,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.logging": {
@@ -220,8 +220,8 @@
"Ara3D.Utils": "[1.4.5, )",
"Microsoft.Extensions.DependencyInjection": "[8.0.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )"
}
},
"Ara3D.Buffers": {
@@ -283,18 +283,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -302,14 +302,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Importers/Ifc/Speckle.Importers.Ifc.Tester2/packages.lock.json b/Importers/Ifc/Speckle.Importers.Ifc.Tester2/packages.lock.json
index ea5161cf2..cb22516d3 100644
--- a/Importers/Ifc/Speckle.Importers.Ifc.Tester2/packages.lock.json
+++ b/Importers/Ifc/Speckle.Importers.Ifc.Tester2/packages.lock.json
@@ -204,9 +204,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.logging": {
@@ -220,8 +220,8 @@
"Ara3D.Utils": "[1.4.5, )",
"Microsoft.Extensions.DependencyInjection": "[8.0.0, )",
"Speckle.Connectors.Common": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )"
}
},
"Ara3D.Buffers": {
@@ -283,18 +283,18 @@
},
"Speckle.Objects": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -302,14 +302,14 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Importers/Ifc/Speckle.Importers.Ifc/packages.lock.json b/Importers/Ifc/Speckle.Importers.Ifc/packages.lock.json
index 522732d41..ae31606b2 100644
--- a/Importers/Ifc/Speckle.Importers.Ifc/packages.lock.json
+++ b/Importers/Ifc/Speckle.Importers.Ifc/packages.lock.json
@@ -68,18 +68,18 @@
},
"Speckle.Objects": {
"type": "Direct",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "k76bpvFvArisd0DbdtpLQbonkl57CYG3szD0sDw0fWZolh8nogw2hRrNL6U2KcrJqCvYVc+zGYSXTJfv9xgntA==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
"dependencies": {
- "Speckle.Sdk": "3.5.0"
+ "Speckle.Sdk": "3.5.1"
}
},
"Speckle.Sdk": {
"type": "Direct",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "mOLFubk+co9rDtRLsB1wobvmkYaiEMvDV+3hRPlhnqe8WhV+vbBSjzj58EpKEprWXLwjyc0kVzsrvlM++PnL0g==",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
"dependencies": {
"GraphQL.Client": "6.0.0",
"Microsoft.Data.Sqlite": "7.0.5",
@@ -87,7 +87,7 @@
"Microsoft.Extensions.Logging": "2.2.0",
"Speckle.DoubleNumerics": "4.1.0",
"Speckle.Newtonsoft.Json": "13.0.2",
- "Speckle.Sdk.Dependencies": "3.5.0"
+ "Speckle.Sdk.Dependencies": "3.5.1"
}
},
"GraphQL.Client": {
@@ -261,9 +261,9 @@
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
"Speckle.Connectors.Logging": "[1.0.0, )",
- "Speckle.Objects": "[3.5.0, )",
- "Speckle.Sdk": "[3.5.0, )",
- "Speckle.Sdk.Dependencies": "[3.5.0, )"
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
}
},
"speckle.connectors.logging": {
@@ -295,9 +295,9 @@
},
"Speckle.Sdk.Dependencies": {
"type": "CentralTransitive",
- "requested": "[3.5.0, )",
- "resolved": "3.5.0",
- "contentHash": "lPYk1E97tWJ5qO6B8F30VZ+vgOxMYQ5cspyUOALwWoyFloM1KZkvwyeBlm8FiQDx0su5KbTS4S10LQvnS2AqKg=="
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
}
}
}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/FileimportJob.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/FileimportJob.cs
new file mode 100644
index 000000000..6a52696de
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/FileimportJob.cs
@@ -0,0 +1,16 @@
+namespace Speckle.Importers.JobProcessor.Domain;
+
+///
+/// DB model for the fileimport job.
+///
+internal sealed class FileimportJob
+{
+ public required string Id { get; init; }
+ public required string JobType { get; init; }
+ public required FileimportPayload Payload { get; init; }
+ public required JobStatus Status { get; init; }
+ public required int Attempt { get; init; }
+ public required int MaxAttempt { get; init; }
+ public required DateTime CreatedAt { get; init; }
+ public required DateTime UpdatedAt { get; init; }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/FileimportPayload.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/FileimportPayload.cs
new file mode 100644
index 000000000..05536617e
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/FileimportPayload.cs
@@ -0,0 +1,19 @@
+namespace Speckle.Importers.JobProcessor.Domain;
+
+///
+/// Payload for the fileimport job
+///
+internal sealed class FileimportPayload
+{
+ public required string JobId { get; init; }
+ public required string Token { get; init; }
+ public required string BlobId { get; init; }
+ public required string JobType { get; init; }
+ public required string ModelId { get; init; }
+ public required string FileName { get; init; }
+ public required string FileType { get; init; }
+ public required string ProjectId { get; init; }
+ public required Uri ServerUrl { get; init; }
+ public required int PayloadVersion { get; init; }
+ public required int TimeOutSeconds { get; init; }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/JobStatus.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/JobStatus.cs
new file mode 100644
index 000000000..03105fafc
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/Domain/JobStatus.cs
@@ -0,0 +1,12 @@
+namespace Speckle.Importers.JobProcessor.Domain;
+
+///
+/// Status enumeration for the job.
+///
+internal enum JobStatus
+{
+ QUEUED,
+ PROCESSING,
+ SUCCEEDED,
+ FAILED,
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/Exceptions.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/Exceptions.cs
new file mode 100644
index 000000000..158e71d63
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/Exceptions.cs
@@ -0,0 +1,23 @@
+namespace Speckle.Importers.JobProcessor.JobHandlers;
+
+public sealed class MaxAttemptsExceededException : Exception
+{
+ public MaxAttemptsExceededException() { }
+
+ public MaxAttemptsExceededException(string? message)
+ : base(message) { }
+
+ public MaxAttemptsExceededException(string? message, Exception? innerException)
+ : base(message, innerException) { }
+}
+
+public sealed class JobTimeoutException : Exception
+{
+ public JobTimeoutException() { }
+
+ public JobTimeoutException(string? message)
+ : base(message) { }
+
+ public JobTimeoutException(string? message, Exception? innerException)
+ : base(message, innerException) { }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/IJobHandler.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/IJobHandler.cs
new file mode 100644
index 000000000..6a812bbdb
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/IJobHandler.cs
@@ -0,0 +1,10 @@
+using Speckle.Importers.JobProcessor.Domain;
+using Speckle.Sdk.Api;
+using Version = Speckle.Sdk.Api.GraphQL.Models.Version;
+
+namespace Speckle.Importers.JobProcessor.JobHandlers;
+
+internal interface IJobHandler
+{
+ public Task ProcessJob(FileimportJob job, IClient client, CancellationToken cancellationToken);
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/RhinoJobHandler.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/RhinoJobHandler.cs
new file mode 100644
index 000000000..6384323fc
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/JobHandlers/RhinoJobHandler.cs
@@ -0,0 +1,37 @@
+using Speckle.Importers.JobProcessor.Domain;
+using Speckle.Importers.Rhino;
+using Speckle.Sdk.Api;
+using Version = Speckle.Sdk.Api.GraphQL.Models.Version;
+
+namespace Speckle.Importers.JobProcessor.JobHandlers;
+
+internal sealed class RhinoJobHandler : IJobHandler
+{
+ public async Task ProcessJob(FileimportJob job, IClient client, CancellationToken cancellationToken)
+ {
+ var directory = Directory.CreateTempSubdirectory("speckle-file-import");
+ try
+ {
+ string targetFilePath = $"{directory.FullName}/{job.Payload.JobId}.{job.Payload.FileType}";
+ await client.FileImport.DownloadFile(
+ job.Payload.ProjectId,
+ job.Payload.BlobId,
+ targetFilePath,
+ null,
+ cancellationToken
+ );
+
+ return await Importer.Import(
+ targetFilePath,
+ job.Payload.ProjectId,
+ job.Payload.ModelId,
+ client.Account,
+ cancellationToken
+ );
+ }
+ finally
+ {
+ Directory.Delete(directory.FullName, true);
+ }
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/JobProcessor.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/JobProcessor.cs
new file mode 100644
index 000000000..cd2c638f7
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/JobProcessor.cs
@@ -0,0 +1,204 @@
+using System.Diagnostics.CodeAnalysis;
+using Microsoft.Extensions.Logging;
+using Speckle.Connectors.Common.Extensions;
+using Speckle.Connectors.Logging;
+using Speckle.Importers.JobProcessor.Domain;
+using Speckle.Importers.JobProcessor.JobHandlers;
+using Speckle.Importers.JobProcessor.JobQueue;
+using Speckle.Sdk.Api;
+using Speckle.Sdk.Api.GraphQL.Inputs;
+using Speckle.Sdk.Credentials;
+using Speckle.Sdk.Logging;
+using Version = Speckle.Sdk.Api.GraphQL.Models.Version;
+
+namespace Speckle.Importers.JobProcessor;
+
+internal sealed class JobProcessorInstance(
+ Repository repository,
+ ILogger logger,
+ IJobHandler jobHandler,
+ IAccountFactory accountFactory,
+ IClientFactory clientFactory,
+ ISdkActivityFactory activityFactory
+)
+{
+ private static readonly TimeSpan s_idleTimeout = TimeSpan.FromSeconds(1);
+
+ public async Task StartProcessing(CancellationToken cancellationToken = default)
+ {
+ await using var connection = await repository.SetupConnection(cancellationToken).ConfigureAwait(false);
+
+ while (true)
+ {
+ logger.LogInformation("Listening for jobs...");
+
+ FileimportJob? job = await repository.GetNextJob(connection, cancellationToken);
+ if (job == null)
+ {
+ logger.LogDebug("No job found, sleeping for {timeout}", s_idleTimeout);
+ await Task.Delay(s_idleTimeout, cancellationToken);
+ continue;
+ }
+ logger.LogInformation("Starting {jobId}", job.Id);
+
+ using var activity = activityFactory.Start();
+ ActivityScope.SetTag("jobId", job.Id);
+ ActivityScope.SetTag("jobType", job.Payload.JobType);
+ ActivityScope.SetTag("job.attempt", job.Attempt.ToString());
+ ActivityScope.SetTag("serverUrl", job.Payload.ServerUrl.ToString());
+ ActivityScope.SetTag("projectId", job.Payload.ProjectId);
+ ActivityScope.SetTag("modelId", job.Payload.ModelId);
+ ActivityScope.SetTag("blobId", job.Payload.BlobId);
+
+ try
+ {
+ JobStatus jobStatus = await AttemptJob(job, cancellationToken);
+ await repository.SetJobStatus(connection, job.Id, jobStatus, cancellationToken);
+ activity?.SetStatus(SdkActivityStatusCode.Ok);
+ }
+ catch (Exception ex)
+ {
+ activity?.RecordException(ex);
+ activity?.SetStatus(SdkActivityStatusCode.Error);
+ throw;
+ }
+ }
+ }
+
+ private static async Task ReportSuccess(
+ FileimportJob job,
+ Version version,
+ IClient client,
+ CancellationToken cancellationToken
+ )
+ {
+ var input = new FileImportSuccessInput
+ {
+ projectId = job.Payload.ProjectId,
+ jobId = job.Payload.BlobId,
+ warnings = [],
+ result = new FileImportResult(0, 0, 0, "Rhino Importer", versionId: version.id)
+ };
+ await client.FileImport.FinishFileImportJob(input, cancellationToken);
+ }
+
+ private static async Task ReportFailed(
+ FileimportJob job,
+ IClient client,
+ Exception ex,
+ CancellationToken cancellationToken
+ )
+ {
+ var input = new FileImportErrorInput()
+ {
+ projectId = job.Payload.ProjectId,
+ jobId = job.Payload.BlobId,
+ warnings = [],
+ reason = ex.ToString(),
+ result = new FileImportResult(0, 0, 0, "Rhino Importer", versionId: null)
+ };
+ await client.FileImport.FinishFileImportJob(input, cancellationToken);
+ }
+
+ private async Task SetupClient(FileimportJob job, CancellationToken cancellationToken)
+ {
+ var account = await accountFactory.CreateAccount(
+ job.Payload.ServerUrl,
+ job.Payload.Token,
+ cancellationToken: cancellationToken
+ );
+
+ return clientFactory.Create(account);
+ }
+
+ [SuppressMessage("Design", "CA1031:Do not catch general exception types")]
+ private async Task AttemptJob(FileimportJob job, CancellationToken cancellationToken)
+ {
+ using var activity = activityFactory.Start();
+
+ IClient? speckleClient = null;
+ try
+ {
+ speckleClient = await SetupClient(job, cancellationToken);
+ UserActivityScope.AddUserScope(speckleClient.Account);
+
+ if (job.Attempt > job.MaxAttempt)
+ {
+ //something went wrong, it should have been marked as failed
+ throw new MaxAttemptsExceededException("Unhandled error silently failed the job multiple times");
+ }
+
+ try
+ {
+ Version version = await ExecuteJobWithTimeout(job, speckleClient, cancellationToken);
+ await ReportSuccess(job, version, speckleClient, cancellationToken);
+ logger.LogInformation("Job {jobId} has succeeded creating {versionId}", job.Id, version.id);
+
+ activity?.SetStatus(SdkActivityStatusCode.Ok);
+ return JobStatus.SUCCEEDED;
+ }
+ catch (JobTimeoutException ex)
+ {
+ logger.LogInformation(ex, "Executing job timed out");
+
+ if (job.Attempt >= job.MaxAttempt)
+ {
+ throw new MaxAttemptsExceededException("The final attempt to process the job failed", ex);
+ }
+
+ activity?.RecordException(ex);
+ activity?.SetStatus(SdkActivityStatusCode.Error);
+ return JobStatus.QUEUED;
+ }
+ }
+ catch (Exception ex)
+ {
+ logger.LogError(ex, "Attempt {attempt} to process {jobId} failed", job.Attempt, job.Id);
+
+ if (speckleClient is not null)
+ {
+ await ReportFailed(job, speckleClient, ex, cancellationToken);
+ }
+
+ activity?.RecordException(ex);
+ activity?.SetStatus(SdkActivityStatusCode.Error);
+ return JobStatus.FAILED;
+ }
+ finally
+ {
+ speckleClient?.Dispose();
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// if attempt was successful, if job timedout, but can be re-attempted without exceeding
+ /// Timeout was reached AND MaxAttempt was reached
+ private async Task ExecuteJobWithTimeout(
+ FileimportJob job,
+ IClient client,
+ CancellationToken cancellationToken
+ )
+ {
+ using CancellationTokenSource timeout = new();
+ timeout.CancelAfter(TimeSpan.FromSeconds(job.Payload.TimeOutSeconds));
+ using CancellationTokenSource linkedSource = CancellationTokenSource.CreateLinkedTokenSource(
+ timeout.Token,
+ cancellationToken
+ );
+ try
+ {
+ return await jobHandler.ProcessJob(job, client, linkedSource.Token);
+ }
+ catch (OperationCanceledException ex) when (timeout.IsCancellationRequested)
+ {
+ throw new JobTimeoutException(
+ $"Job was cancelled due to reaching the {job.Payload.TimeOutSeconds} second timeout",
+ ex
+ );
+ }
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/JobQueue/JsonHandler.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/JobQueue/JsonHandler.cs
new file mode 100644
index 000000000..bc42fdc71
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/JobQueue/JsonHandler.cs
@@ -0,0 +1,25 @@
+using System.Data;
+using System.Text.Json;
+using Dapper;
+
+namespace Speckle.Importers.JobProcessor.JobQueue;
+
+internal sealed class JsonHandler : SqlMapper.TypeHandler
+{
+ private readonly JsonSerializerOptions _options = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, };
+
+ public override void SetValue(IDbDataParameter parameter, T? value)
+ {
+ parameter.Value = JsonSerializer.Serialize(value);
+ }
+
+ public override T? Parse(object value)
+ {
+ if (value is string json)
+ {
+ return JsonSerializer.Deserialize(json, _options);
+ }
+
+ throw new DataException($"Cannot convert {value.GetType()} to {typeof(T)}");
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/JobQueue/Repository.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/JobQueue/Repository.cs
new file mode 100644
index 000000000..ef32fe7d6
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/JobQueue/Repository.cs
@@ -0,0 +1,114 @@
+using System.Data;
+using Dapper;
+using Microsoft.Extensions.Logging;
+using Npgsql;
+using Speckle.Importers.JobProcessor.Domain;
+
+namespace Speckle.Importers.JobProcessor.JobQueue;
+
+internal sealed class Repository(ILogger logger)
+{
+ public async Task SetupConnection(CancellationToken cancellationToken)
+ {
+ string fileImportQueuePostgresUrl =
+ Environment.GetEnvironmentVariable("FILEIMPORT_QUEUE_POSTGRES_URL")
+ ?? throw new ArgumentException("Expected FILEIMPORT_QUEUE_POSTGRES_URL environment variable to be set");
+
+ string connectionString = ParseConnectionString(new(fileImportQueuePostgresUrl));
+ var connection = new NpgsqlConnection(connectionString);
+ await connection.OpenAsync(cancellationToken).ConfigureAwait(false);
+ return connection;
+ }
+
+ private static string ParseConnectionString(Uri connectionUrl)
+ {
+ if (connectionUrl.Scheme is not "postgres" and not "postgresql")
+ {
+ throw new ArgumentException("Invalid URI scheme. Expected 'postgres' or 'postgresql'.", nameof(connectionUrl));
+ }
+ var userInfo = connectionUrl.UserInfo.Split(':');
+ if (userInfo.Length != 2)
+ {
+ throw new ArgumentException("Invalid URI format: missing username or password.");
+ }
+
+ var builder = new NpgsqlConnectionStringBuilder
+ {
+ Host = connectionUrl.Host,
+ Port = connectionUrl.Port > 0 ? connectionUrl.Port : 5432, // Default to 5432 if not specified
+ Username = userInfo[0],
+ Password = userInfo[1],
+ Database = connectionUrl.AbsolutePath.TrimStart('/')
+ };
+ return builder.ConnectionString;
+ }
+
+ public async Task GetNextJob(IDbConnection connection, CancellationToken cancellationToken)
+ {
+ //lang=postgresql
+ const string COMMAND_TEXT = """
+ WITH next_job AS (
+ UPDATE background_jobs
+ SET
+ "attempt" = "attempt" + 1,
+ "status" = @Status1,
+ "updatedAt" = NOW()
+ WHERE id = (
+ SELECT id FROM background_jobs
+ WHERE ( --queued job
+ (payload ->> 'fileType') = ANY(@FileTypes)
+ AND status = @Status2
+ )
+ OR ( --timed job left on processing state
+ (payload ->> 'fileType') = ANY(@FileTypes)
+ AND status = @Status1
+ AND "updatedAt" < NOW() - ("timeoutMs" * interval '1 millisecond')
+ )
+ ORDER BY "createdAt"
+ FOR UPDATE SKIP LOCKED
+ LIMIT 1
+ )
+ RETURNING *
+ )
+ SELECT * FROM next_job;
+ """;
+
+ var command = new CommandDefinition(
+ commandText: COMMAND_TEXT,
+ parameters: new
+ {
+ Status1 = nameof(JobStatus.PROCESSING).ToLowerInvariant(),
+ Status2 = nameof(JobStatus.QUEUED).ToLowerInvariant(),
+ FileTypes = SupportedFileTypes.FileTypes,
+ },
+ cancellationToken: cancellationToken
+ );
+
+ return await connection.QueryFirstOrDefaultAsync(command);
+ }
+
+ public async Task SetJobStatus(
+ IDbConnection connection,
+ string jobId,
+ JobStatus jobStatus,
+ CancellationToken cancellationToken
+ )
+ {
+ logger.LogInformation("Updating job: {jobId}'s status to {jobStatus}", jobId, jobStatus);
+
+ //lang=postgresql
+ const string COMMAND_TEXT = """
+ UPDATE background_jobs
+ SET status = @status, "updatedAt" = NOW()
+ WHERE id = @jobId
+ """;
+
+ var command = new CommandDefinition(
+ commandText: COMMAND_TEXT,
+ parameters: new { status = jobStatus.ToString().ToLowerInvariant(), jobId, },
+ cancellationToken: cancellationToken
+ );
+
+ await connection.ExecuteAsync(command);
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/Program.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/Program.cs
new file mode 100644
index 000000000..0bcc2ea83
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/Program.cs
@@ -0,0 +1,78 @@
+// See https://aka.ms/new-console-template for more information
+
+using Dapper;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Rhino.Runtime.InProcess;
+using RhinoInside;
+using Speckle.Importers.JobProcessor.Domain;
+using Speckle.Importers.JobProcessor.JobHandlers;
+using Speckle.Importers.JobProcessor.JobQueue;
+
+namespace Speckle.Importers.JobProcessor;
+
+public static class Program
+{
+ static Program()
+ {
+ Resolver.Initialize();
+ }
+
+ [STAThread]
+ public static async Task Main()
+ {
+ ILogger? logger = null;
+ try
+ {
+ // Dapper doesn't understand how to handle JSON deserialization, so we need to tell it what types can be deserialzied
+ SqlMapper.AddTypeHandler(new JsonHandler());
+
+ // DI setup
+ var serviceCollection = new ServiceCollection();
+ serviceCollection.AddJobProcessor();
+
+ serviceCollection.AddTransient();
+
+ var serviceProvider = serviceCollection.BuildServiceProvider();
+
+ var processor = serviceProvider.GetRequiredService();
+ logger = serviceProvider.GetRequiredService>();
+
+ TaskScheduler.UnobservedTaskException += (sender, args) =>
+ logger.LogCritical(args.Exception, "Unobserved Task Exception");
+
+ using (new RhinoCore(["/netcore-8"], WindowStyle.NoWindow))
+ {
+ //What ever thread RhinoCore is created on it will grab as soon as it's available, and it will hog it forever.
+ //Right now, we're giving it the main STA thread (not 100% if it needs STA or if it could work on any thread)
+ await Task.Run(async () =>
+ {
+ logger.LogInformation("Job processor has started!");
+ try
+ {
+ await processor.StartProcessing();
+ }
+ catch (Exception ex)
+ {
+ logger.LogCritical(ex, "Unhandled exception in Main");
+ throw;
+ }
+ })
+ .ConfigureAwait(false);
+ }
+ }
+ catch (Exception ex)
+ {
+ if (logger is not null)
+ {
+ logger.LogCritical(ex, "Unhandled exception reached entry point");
+ }
+ else
+ {
+ Console.WriteLine($"Unhandled exception reached entry point: {ex}");
+ }
+
+ throw;
+ }
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/Properties/launchSettings.json b/Importers/Rhino/Speckle.Importers.JobProcessor/Properties/launchSettings.json
new file mode 100644
index 000000000..6dcb9cfd1
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/Properties/launchSettings.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "http://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "Local Docker DB": {
+ "commandName": "Project",
+ "environmentVariables": {
+ "FILEIMPORT_QUEUE_POSTGRES_URL": "postgresql://speckle:speckle@127.0.0.1:5432/speckle"
+ }
+ }
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/ServiceRegistration.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/ServiceRegistration.cs
new file mode 100644
index 000000000..7536e483a
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/ServiceRegistration.cs
@@ -0,0 +1,26 @@
+using Microsoft.Extensions.DependencyInjection;
+using Speckle.Connectors.Common;
+using Speckle.Importers.JobProcessor.JobQueue;
+using Speckle.Sdk;
+
+namespace Speckle.Importers.JobProcessor;
+
+internal static class ServiceRegistration
+{
+ private static readonly Application s_application = new(".NET File Import Job Processor", "jobprocessor");
+
+ public static IServiceCollection AddJobProcessor(this IServiceCollection serviceCollection)
+ {
+ serviceCollection.AddLoggingConfig();
+ serviceCollection.AddTransient();
+ serviceCollection.AddTransient();
+ return serviceCollection;
+ }
+
+ private static IServiceCollection AddLoggingConfig(this IServiceCollection serviceCollection)
+ {
+ serviceCollection.Initialize(s_application, HostAppVersion.v3);
+
+ return serviceCollection;
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/Speckle.Importers.JobProcessor.csproj b/Importers/Rhino/Speckle.Importers.JobProcessor/Speckle.Importers.JobProcessor.csproj
new file mode 100644
index 000000000..6e4e7653e
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/Speckle.Importers.JobProcessor.csproj
@@ -0,0 +1,23 @@
+
+
+
+ net8.0-windows
+ x64
+ Exe
+ Debug;Release;Local
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/SupportedFileTypes.cs b/Importers/Rhino/Speckle.Importers.JobProcessor/SupportedFileTypes.cs
new file mode 100644
index 000000000..0476c3527
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/SupportedFileTypes.cs
@@ -0,0 +1,65 @@
+namespace Speckle.Importers.JobProcessor;
+
+public static class SupportedFileTypes
+{
+ ///
+ /// This is the full list of file extensions that this job processor will look for jobs with that extension
+ /// This also happens to be the full list of file types that Rhino 8 supports.,
+ ///
+ public static readonly string[] FileTypes =
+ [
+ "3dm", // Rhino 3D Model (except ver 1.x save)
+ "3dmbak", // Rhino 3D Model Backup
+ "rws", // Rhino Worksession
+ "3mf", // 3MF
+ "3ds", // 3D Studio
+ "amf", // AMF
+ "ai", // Adobe Illustrator
+ "dwg", // AutoCAD Drawing
+ "dxf", // AutoCAD Drawing Exchange
+ "x", // DirectX
+ "e57", // E57
+ "dst", // Embroidery
+ "exp",
+ "dst", // Encapsulated PostScript
+ "exp",
+ "off", // Geomview OFF
+ "gf", // GHS Geometry
+ "gft",
+ "gltf", // GL Transmission Format
+ "glb",
+ "gts", // GTS (GNU Triangulated Surface)
+ "igs", // IGES
+ "iges",
+ "lwo", // Lightwave
+ "dgn", // Microstation
+ "fbx", // MotionBuilder
+ "scn", // NextEngine Scan
+ "obj", // OBJ (Wavefront)
+ "pdf", // PDF
+ "ply", // PLY
+ "asc", // Points
+ "csv",
+ "xyz",
+ "pts",
+ "cgo_ascii", // Points
+ "cgo_asci",
+ "txt", // Points
+ "raw", // Raw Triangles
+ "m", // Recon M
+ "svg", // Scalable Vector Graphics
+ "skp", // SketchUp
+ "slc", // Slice
+ "sldprt", // SOLIDWORKS
+ "sldasm",
+ "stp", // STEP
+ "step",
+ "stl", // STL (Stereolithography)
+ "vda", // VDA
+ "wrl", // VRML/Open Inventor
+ "vrml",
+ "iv",
+ "gdf", // WAMIT
+ "zpr", // Zcorp (3D Systems)
+ ];
+}
diff --git a/Importers/Rhino/Speckle.Importers.JobProcessor/packages.lock.json b/Importers/Rhino/Speckle.Importers.JobProcessor/packages.lock.json
new file mode 100644
index 000000000..9958aee9d
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.JobProcessor/packages.lock.json
@@ -0,0 +1,382 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net8.0-windows7.0": {
+ "Dapper": {
+ "type": "Direct",
+ "requested": "[2.1.66, )",
+ "resolved": "2.1.66",
+ "contentHash": "/q77jUgDOS+bzkmk3Vy9SiWMaetTw+NOoPAV0xPBsGVAyljd5S6P+4RUW7R3ZUGGr9lDRyPKgAMj2UAOwvqZYw=="
+ },
+ "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"
+ }
+ },
+ "Npgsql": {
+ "type": "Direct",
+ "requested": "[9.0.3, )",
+ "resolved": "9.0.3",
+ "contentHash": "tPvY61CxOAWxNsKLEBg+oR646X4Bc8UmyQ/tJszL/7mEmIXQnnBhVJZrZEEUv0Bstu0mEsHZD5At3EO8zQRAYw==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2"
+ }
+ },
+ "PolySharp": {
+ "type": "Direct",
+ "requested": "[1.14.1, )",
+ "resolved": "1.14.1",
+ "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ=="
+ },
+ "RhinoCommon": {
+ "type": "Direct",
+ "requested": "[8.21.25188.17001, )",
+ "resolved": "8.21.25188.17001",
+ "contentHash": "Wo6JXheyDBvilyIwDY6xZCQJC4170jzAlTSlMgh8yokUY+vYyCl4KJVXZofIOynNt/xx5wLqb2On5gZZekXR6w==",
+ "dependencies": {
+ "System.Drawing.Common": "7.0.0"
+ }
+ },
+ "RhinoWindows": {
+ "type": "Direct",
+ "requested": "[8.21.25188.17001, )",
+ "resolved": "8.21.25188.17001",
+ "contentHash": "9zqCorcLRBeiW/j1RTwUS4E7bnZetAdA9WDdtd/AQccjOpxdtw76wdN+ciyQ6qslseWkwZ9qSBeh7QaM800Ntw==",
+ "dependencies": {
+ "RhinoCommon": "[8.21.25188.17001]"
+ }
+ },
+ "Serilog.Extensions.Logging": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging": "8.0.0",
+ "Serilog": "3.1.1"
+ }
+ },
+ "Serilog.Formatting.Compact": {
+ "type": "Direct",
+ "requested": "[3.0.0, )",
+ "resolved": "3.0.0",
+ "contentHash": "wQsv14w9cqlfB5FX2MZpNsTawckN4a8dryuNGbebB/3Nh1pXnROHZov3swtu3Nj5oNG7Ba+xdu7Et/ulAUPanQ==",
+ "dependencies": {
+ "Serilog": "4.0.0"
+ }
+ },
+ "Serilog.Sinks.Console": {
+ "type": "Direct",
+ "requested": "[6.0.0, )",
+ "resolved": "6.0.0",
+ "contentHash": "fQGWqVMClCP2yEyTXPIinSr5c+CBGUvBybPxjAGcf7ctDhadFhrQw03Mv8rJ07/wR5PDfFjewf2LimvXCDzpbA==",
+ "dependencies": {
+ "Serilog": "4.0.0"
+ }
+ },
+ "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.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.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g=="
+ },
+ "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=="
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
+ },
+ "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.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "7.0.0"
+ }
+ },
+ "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=="
+ },
+ "speckle.connectors.common": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
+ "Speckle.Connectors.Logging": "[1.0.0, )",
+ "Speckle.Objects": "[3.5.1, )",
+ "Speckle.Sdk": "[3.5.1, )",
+ "Speckle.Sdk.Dependencies": "[3.5.1, )"
+ }
+ },
+ "speckle.connectors.dui": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
+ "Speckle.Connectors.Common": "[1.0.0, )"
+ }
+ },
+ "speckle.connectors.dui.webview": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Web.WebView2": "[1.0.1938.49, )",
+ "Speckle.Connectors.DUI": "[1.0.0, )"
+ }
+ },
+ "speckle.connectors.logging": {
+ "type": "Project"
+ },
+ "speckle.connectors.rhinoimporter": {
+ "type": "Project",
+ "dependencies": {
+ "Speckle.Connectors.Common": "[1.0.0, )",
+ "Speckle.Connectors.DUI.WebView": "[1.0.0, )",
+ "Speckle.Converters.Rhino8": "[1.0.0, )"
+ }
+ },
+ "speckle.converters.common": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
+ "Speckle.Objects": "[3.5.1, )"
+ }
+ },
+ "speckle.converters.rhino8": {
+ "type": "Project",
+ "dependencies": {
+ "Speckle.Converters.Common": "[1.0.0, )"
+ }
+ },
+ "speckle.importers.rhino": {
+ "type": "Project",
+ "dependencies": {
+ "Rhino.Inside": "[8.0.7-beta, )",
+ "Speckle.Connectors.RhinoImporter": "[1.0.0, )",
+ "Speckle.Converters.Rhino8": "[1.0.0, )"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "CentralTransitive",
+ "requested": "[2.2.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "CentralTransitive",
+ "requested": "[2.2.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "8.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "CentralTransitive",
+ "requested": "[2.2.0, )",
+ "resolved": "8.0.2",
+ "contentHash": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Web.WebView2": {
+ "type": "CentralTransitive",
+ "requested": "[1.0.1938.49, )",
+ "resolved": "1.0.1938.49",
+ "contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
+ },
+ "Rhino.Inside": {
+ "type": "CentralTransitive",
+ "requested": "[8.0.7-beta, )",
+ "resolved": "8.0.7-beta",
+ "contentHash": "PNZdWysS2zI9vaxJ8HQig3iZA3Xg1yG1hnq09VPStQpceoj94iJ6xk0Ubddaw5oswkYYUIJRmQ8xr+bLTROs/g==",
+ "dependencies": {
+ "Grasshopper": "8.0.23304.9001",
+ "RhinoCommon": "8.0.23304.9001"
+ }
+ },
+ "Serilog": {
+ "type": "CentralTransitive",
+ "requested": "[4.0.1, )",
+ "resolved": "4.0.0",
+ "contentHash": "2jDkUrSh5EofOp7Lx5Zgy0EB+7hXjjxE2ktTb1WVQmU00lDACR2TdROGKU0K1pDTBSJBN1PqgYpgOZF8mL7NJw=="
+ },
+ "Speckle.DoubleNumerics": {
+ "type": "CentralTransitive",
+ "requested": "[4.1.0, )",
+ "resolved": "4.1.0",
+ "contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
+ },
+ "Speckle.Objects": {
+ "type": "CentralTransitive",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "pBFTwdc49aQgE6Sho/9uYoqRRnkRyqEp9Sg+xBKWJ2i+XdKts91n//GgolUT2i9Xh46MJiZXgezWQx3ne6kr7w==",
+ "dependencies": {
+ "Speckle.Sdk": "3.5.1"
+ }
+ },
+ "Speckle.Sdk": {
+ "type": "CentralTransitive",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "J//TnVqZ+RzvMoRu0x3HjVb+7rnYTRMCLQ0bN05fagl0UwyHYrc+Lwn19eyTPMnRoAQIFPXIdZjb2Yk7fyd0FA==",
+ "dependencies": {
+ "GraphQL.Client": "6.0.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.5.1"
+ }
+ },
+ "Speckle.Sdk.Dependencies": {
+ "type": "CentralTransitive",
+ "requested": "[3.5.1, )",
+ "resolved": "3.5.1",
+ "contentHash": "jNFvbO0CVzBKSGAPtN2J20aixChyqVetLSU/4TwjVERY8UJdbhbvoxYIalaBZoTSIXdQoHshNC7Ul1o6+vTCcA=="
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Importers/Rhino/Speckle.Importers.Rhino/Importer.cs b/Importers/Rhino/Speckle.Importers.Rhino/Importer.cs
new file mode 100644
index 000000000..b60ff23d7
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.Rhino/Importer.cs
@@ -0,0 +1,31 @@
+using Microsoft.Extensions.DependencyInjection;
+using Speckle.Importers.Rhino.Internal;
+using Speckle.Sdk.Credentials;
+using Version = Speckle.Sdk.Api.GraphQL.Models.Version;
+
+namespace Speckle.Importers.Rhino;
+
+///
+/// Entry point for the rhino import.
+/// Is a wrapper around an internal DI container.
+/// It's very important that the state of services doesn't bleed between job,
+/// So every import creates a new container for its processing
+/// I don't trust the current services to not hold on to caches or state that could influence the next run
+///
+public static class Importer
+{
+ public static async Task Import(
+ string filePath,
+ string projectId,
+ string modelId,
+ Account account,
+ CancellationToken cancellationToken
+ )
+ {
+ var serviceCollection = new ServiceCollection();
+ serviceCollection.AddRhinoImporter();
+ using var serviceProvider = serviceCollection.BuildServiceProvider();
+ var instance = serviceProvider.GetRequiredService();
+ return await instance.RunRhinoImport(filePath, projectId, modelId, account, cancellationToken);
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/DefaultConfig.cs b/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/DefaultConfig.cs
new file mode 100644
index 000000000..882de073a
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/DefaultConfig.cs
@@ -0,0 +1,11 @@
+using Rhino;
+using Rhino.Collections;
+
+namespace Speckle.Importers.Rhino.Internal.FileTypeConfig;
+
+public sealed class DefaultConfig : IFileTypeConfig
+{
+ public ArchivableDictionary? ImportOptions => null;
+
+ public void PreProcessDocument(RhinoDoc doc) { }
+}
diff --git a/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/IFileTypeConfig.cs b/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/IFileTypeConfig.cs
new file mode 100644
index 000000000..a8742bfc0
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/IFileTypeConfig.cs
@@ -0,0 +1,24 @@
+using Rhino;
+using Rhino.Collections;
+
+namespace Speckle.Importers.Rhino.Internal.FileTypeConfig;
+
+///
+/// Represents configuration for a specific file type (e.g. .skp) to customise the import behaviour
+///
+internal interface IFileTypeConfig
+{
+ ///
+ /// Options to pass to the command
+ ///
+ public ArchivableDictionary? ImportOptions { get; }
+
+ ///
+ /// Run any operations on objects in the rhino document to clean up the export before converting to speckle
+ ///
+ ///
+ /// Ran on the document after importing, but before any Speckle conversion
+ ///
+ ///
+ public void PreProcessDocument(RhinoDoc doc);
+}
diff --git a/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/SketchupConfig.cs b/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/SketchupConfig.cs
new file mode 100644
index 000000000..289fbe458
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.Rhino/Internal/FileTypeConfig/SketchupConfig.cs
@@ -0,0 +1,46 @@
+using Rhino;
+using Rhino.Collections;
+using Rhino.DocObjects;
+using Rhino.Geometry;
+
+namespace Speckle.Importers.Rhino.Internal.FileTypeConfig;
+
+public sealed class SketchupConfig : IFileTypeConfig
+{
+ public ArchivableDictionary? ImportOptions => null;
+
+ ///
+ /// Clean up step to strip imported meshes of their NGon data, leaving only the triangle/quad data behind.
+ /// This works around a bug in the sketchup importer creating invalid ngons.
+ ///
+ ///
+ /// Without this cleanup step, skp imports send incorrect meshes to speckle
+ /// I believe there is a bug in Rhino's skp file importing logic
+ /// The function documents that it will return ccw faces,
+ /// and this holds true for native modeled rhino meshes, but not meshes from sketchup imports.
+ /// Since Speckle's conversions rely on this function returning how it's documented, the resulting speckle geometry
+ /// would be invalid without this step
+ ///
+ ///
+ public void PreProcessDocument(RhinoDoc doc)
+ {
+ // Process regular meshes in the document
+ foreach (var obj in doc.Objects.GetObjectList(ObjectType.Mesh))
+ {
+ if (obj.Geometry is not Mesh mesh)
+ {
+ continue;
+ }
+
+ if (mesh.Ngons.Count <= 0)
+ {
+ continue;
+ }
+
+ mesh.Ngons.Clear();
+ _ = doc.Objects.Replace(obj.Id, mesh);
+ }
+
+ //TODO: same for meshes inside blocks
+ }
+}
diff --git a/Importers/Rhino/Speckle.Importers.Rhino/Internal/ImporterInstance.cs b/Importers/Rhino/Speckle.Importers.Rhino/Internal/ImporterInstance.cs
new file mode 100644
index 000000000..3ec008add
--- /dev/null
+++ b/Importers/Rhino/Speckle.Importers.Rhino/Internal/ImporterInstance.cs
@@ -0,0 +1,50 @@
+using Rhino;
+using Speckle.Importers.Rhino.Internal.FileTypeConfig;
+using Speckle.Sdk;
+using Speckle.Sdk.Credentials;
+using Version = Speckle.Sdk.Api.GraphQL.Models.Version;
+
+namespace Speckle.Importers.Rhino.Internal;
+
+internal sealed class ImporterInstance(Sender sender)
+{
+ public async Task RunRhinoImport(
+ string filePath,
+ string projectId,
+ string modelId,
+ Account account,
+ CancellationToken cancellationToken
+ )
+ {
+ using RhinoDoc open = RhinoDoc.CreateHeadless(null);
+ try
+ {
+ var config = GetConfig(Path.GetExtension(filePath));
+
+ RhinoDoc.ActiveDoc = open;
+ if (!open.Import(filePath, config.ImportOptions))
+ {
+ throw new SpeckleException("Rhino could not import this file");
+ }
+
+ config.PreProcessDocument(open);
+
+ var version = await sender.Send(projectId, modelId, account, cancellationToken);
+ return version;
+ }
+ finally
+ {
+ //Being a bit extra defensive that we're cleaning up the old doc
+ RhinoDoc.ActiveDoc?.Dispose();
+ RhinoDoc.ActiveDoc = null;
+ GC.Collect();
+ }
+ }
+
+ private static IFileTypeConfig GetConfig(string extension) =>
+ extension.ToLowerInvariant() switch
+ {
+ ".skp" => new SketchupConfig(),
+ _ => new DefaultConfig(),
+ };
+}
diff --git a/Importers/Rhino/Speckle.Importers.Rhino/ImporterThreadContext.cs b/Importers/Rhino/Speckle.Importers.Rhino/Internal/ImporterThreadContext.cs
similarity index 80%
rename from Importers/Rhino/Speckle.Importers.Rhino/ImporterThreadContext.cs
rename to Importers/Rhino/Speckle.Importers.Rhino/Internal/ImporterThreadContext.cs
index 97f842c43..2516a2d4c 100644
--- a/Importers/Rhino/Speckle.Importers.Rhino/ImporterThreadContext.cs
+++ b/Importers/Rhino/Speckle.Importers.Rhino/Internal/ImporterThreadContext.cs
@@ -1,8 +1,11 @@
using Speckle.Connectors.Common.Threading;
-namespace Speckle.Importers.Rhino;
+namespace Speckle.Importers.Rhino.Internal;
-public class ImporterThreadContext : ThreadContext
+///
+/// A custom implementation of the ThreadContext to behave correctly with windowless rhino
+///
+internal sealed class ImporterThreadContext : ThreadContext
{
protected override Task WorkerToMainAsync(Func> action)
{
diff --git a/Importers/Rhino/Speckle.Importers.Rhino/Progress.cs b/Importers/Rhino/Speckle.Importers.Rhino/Internal/Progress.cs
similarity index 77%
rename from Importers/Rhino/Speckle.Importers.Rhino/Progress.cs
rename to Importers/Rhino/Speckle.Importers.Rhino/Internal/Progress.cs
index fc49354a2..e99f8a54a 100644
--- a/Importers/Rhino/Speckle.Importers.Rhino/Progress.cs
+++ b/Importers/Rhino/Speckle.Importers.Rhino/Internal/Progress.cs
@@ -1,9 +1,9 @@
using Microsoft.Extensions.Logging;
using Speckle.Connectors.Common.Operations;
-namespace Speckle.Importers.Rhino;
+namespace Speckle.Importers.Rhino.Internal;
-public class Progress(ILogger