Compare commits
69 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f74328ffc | |||
| 54370f3188 | |||
| 4a51eae628 | |||
| 34241385f9 | |||
| 7ec01ed39f | |||
| 1ff861f9db | |||
| 4c125afd7b | |||
| e561980e7f | |||
| 7c346a3ac5 | |||
| abcf58d369 | |||
| 2211428614 | |||
| 08d31ff0d6 | |||
| e055030291 | |||
| 1e5cca5ffb | |||
| 85abeaf7f0 | |||
| 47480809d0 | |||
| 885bb41f27 | |||
| c74e92fb2e | |||
| a4f27b5c1d | |||
| a7941bb4c8 | |||
| 13c29412eb | |||
| 774e24d441 | |||
| 8822761c48 | |||
| 4215f90456 | |||
| c8ac385b88 | |||
| b1ef5c74c8 | |||
| a5ff2ca780 | |||
| f84c4b2d31 | |||
| b03e848669 | |||
| 76ea67af54 | |||
| 12c80e2d40 | |||
| c013953368 | |||
| 34457ead0a | |||
| 5e92889825 | |||
| b2606d209d | |||
| a18beeca1b | |||
| c1293ff395 | |||
| bc6f6c4c39 | |||
| befb84db5f | |||
| 2403288678 | |||
| cac8e1ba18 | |||
| 06255370f7 | |||
| 6ba70a76c2 | |||
| dd53b70b36 | |||
| 6873af5ac3 | |||
| 35d8c41a2b | |||
| 5f4eebe536 | |||
| ba4cfca45b | |||
| f6e4fcd2d0 | |||
| d5f1f76e24 | |||
| 8a0c9d0128 | |||
| a1ff69502a | |||
| b06cf0a06b | |||
| 5d976141fc | |||
| be8f9e2b5a | |||
| 6bf18096e7 | |||
| b7f0f5df90 | |||
| c4c06f0dc4 | |||
| ed569cde55 | |||
| 558a16d273 | |||
| 9290261fef | |||
| e2251c111c | |||
| 21ed17bb2c | |||
| 8cfe0bfe11 | |||
| 54ce865e45 | |||
| ae6d788aff | |||
| f0cfc860a1 | |||
| becdc060e9 | |||
| 7f91ac734a |
@@ -255,8 +255,6 @@ dotnet_diagnostic.ca1509.severity = warning # Invalid entry in code metrics conf
|
||||
dotnet_diagnostic.ca1861.severity = none # Prefer 'static readonly' fields over constant array arguments if the called method is called repeatedly and is not mutating the passed array (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1861)
|
||||
|
||||
dotnet_diagnostic.cs8618.severity = suggestion # nullable problem
|
||||
dotnet_diagnostic.CS0809.severity = suggestion # obsolete errors
|
||||
dotnet_diagnostic.CS0618.severity = suggestion # obsolete errors
|
||||
|
||||
|
||||
# Performance rules
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.2xx # Align with global.json (including roll forward rules)
|
||||
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
||||
|
||||
- name: Cache Nuget
|
||||
uses: actions/cache@v4
|
||||
@@ -38,7 +38,7 @@ jobs:
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.2xx # Align with global.json (including roll forward rules)
|
||||
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
||||
|
||||
- name: Cache Nuget
|
||||
uses: actions/cache@v4
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
run: ./build.sh test-only
|
||||
|
||||
- name: Upload coverage reports to Codecov with GitHub Action
|
||||
uses: codecov/codecov-action@v4
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
file: Converters/**/coverage.xml
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.2xx # Align with global.json (including roll forward rules)
|
||||
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
||||
|
||||
- name: Cache Nuget
|
||||
uses: actions/cache@v4
|
||||
@@ -79,7 +79,7 @@ jobs:
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.2xx # Align with global.json (including roll forward rules)
|
||||
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
||||
|
||||
- name: Cache Nuget
|
||||
uses: actions/cache@v4
|
||||
@@ -91,7 +91,7 @@ jobs:
|
||||
run: ./build.sh test-only
|
||||
|
||||
- name: Upload coverage reports to Codecov with GitHub Action
|
||||
uses: codecov/codecov-action@v4
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
file: Converters/**/coverage.xml
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
||||
+2
-1
@@ -19,4 +19,5 @@ tools
|
||||
.DS_Store
|
||||
*.snupkg
|
||||
coverage.xml
|
||||
output/
|
||||
output/
|
||||
Images/Thumbs.db
|
||||
|
||||
@@ -40,6 +40,13 @@ public static class Consts
|
||||
new("Connectors/Autocad/Speckle.Connectors.Civil3d2024", "net48"),
|
||||
new("Connectors/Autocad/Speckle.Connectors.Civil3d2025", "net8.0-windows")
|
||||
]
|
||||
),
|
||||
new(
|
||||
"tekla-structures",
|
||||
[
|
||||
new("Connectors/Tekla/Speckle.Connector.Tekla2023", "net48"),
|
||||
new("Connectors/Tekla/Speckle.Connector.Tekla2024", "net48")
|
||||
]
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
+4
-1
@@ -150,7 +150,10 @@ Target(
|
||||
var version = Environment.GetEnvironmentVariable("GitVersion_FullSemVer") ?? "3.0.0-localBuild";
|
||||
var fileVersion = Environment.GetEnvironmentVariable("GitVersion_AssemblySemFileVer") ?? "3.0.0.0";
|
||||
Console.WriteLine($"Version: {version} & {fileVersion}");
|
||||
Run("dotnet", $"build {s} -c Release --no-restore -p:Version={version} -p:FileVersion={fileVersion} -v:m");
|
||||
Run(
|
||||
"dotnet",
|
||||
$"build {s} -c Release --no-restore -warnaserror -p:Version={version} -p:FileVersion={fileVersion} -v:m"
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ public static class Solutions
|
||||
|
||||
CheckAndRemoveKnown("Speckle.Objects");
|
||||
CheckAndRemoveKnown("Speckle.Sdk");
|
||||
CheckAndRemoveKnown("Speckle.Sdk.Dependencies");
|
||||
if (localProjects.Count != 0)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
|
||||
+10
-23
@@ -16,18 +16,16 @@
|
||||
},
|
||||
"Microsoft.Build": {
|
||||
"type": "Direct",
|
||||
"requested": "[17.10.4, )",
|
||||
"resolved": "17.10.4",
|
||||
"contentHash": "ZmGA8vhVXFzC4oo48ybQKlEybVKd0Ntfdr+Enqrn5ES1R6e/krIK9hLk0W33xuT0/G6QYd3YdhJZh+Xle717Ag==",
|
||||
"requested": "[17.11.4, )",
|
||||
"resolved": "17.11.4",
|
||||
"contentHash": "UMC7DfeFEHY2GGHHaghybUuUlLaByFHEFudR2PehMgDBuRuLAUePp1iaa4eFtVzepRzMtIbeSCVJCzzX3NV2Gg==",
|
||||
"dependencies": {
|
||||
"Microsoft.Build.Framework": "17.10.4",
|
||||
"Microsoft.NET.StringTools": "17.10.4",
|
||||
"Microsoft.Build.Framework": "17.11.4",
|
||||
"Microsoft.NET.StringTools": "17.11.4",
|
||||
"System.Collections.Immutable": "8.0.0",
|
||||
"System.Configuration.ConfigurationManager": "8.0.0",
|
||||
"System.Reflection.Metadata": "8.0.0",
|
||||
"System.Reflection.MetadataLoadContext": "8.0.0",
|
||||
"System.Security.Principal.Windows": "5.0.0",
|
||||
"System.Threading.Tasks.Dataflow": "8.0.0"
|
||||
"System.Reflection.MetadataLoadContext": "8.0.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.NETFramework.ReferenceAssemblies": {
|
||||
@@ -69,8 +67,8 @@
|
||||
},
|
||||
"Microsoft.Build.Framework": {
|
||||
"type": "Transitive",
|
||||
"resolved": "17.10.4",
|
||||
"contentHash": "4qXCwNOXBR1dyCzuks9SwTwFJQO/xmf2wcMislotDWJu7MN/r3xDNoU8Ae5QmKIHPaLG1xmfDkYS7qBVzxmeKw=="
|
||||
"resolved": "17.11.4",
|
||||
"contentHash": "u28uDihlqxtt8h2dL1ZJOZ7TRkxBK+HGr+3FgQpILVo7Q7gErkw8mYW9R+RM5PtxvZTdYb/4MWDL66vdIsANBQ=="
|
||||
},
|
||||
"Microsoft.Build.Tasks.Git": {
|
||||
"type": "Transitive",
|
||||
@@ -79,8 +77,8 @@
|
||||
},
|
||||
"Microsoft.NET.StringTools": {
|
||||
"type": "Transitive",
|
||||
"resolved": "17.10.4",
|
||||
"contentHash": "wyABaqY+IHCMMSTQmcc3Ca6vbmg5BaEPgicnEgpll+4xyWZWlkQqUwafweUd9VAhBb4jqplMl6voUHQ6yfdUcg=="
|
||||
"resolved": "17.11.4",
|
||||
"contentHash": "mudqUHhNpeqIdJoUx2YDWZO/I9uEDYVowan89R6wsomfnUJQk6HteoQTlNjZDixhT2B4IXMkMtgZtoceIjLRmA=="
|
||||
},
|
||||
"Microsoft.NETFramework.ReferenceAssemblies.net461": {
|
||||
"type": "Transitive",
|
||||
@@ -132,17 +130,6 @@
|
||||
"type": "Transitive",
|
||||
"resolved": "8.0.0",
|
||||
"contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg=="
|
||||
},
|
||||
"System.Security.Principal.Windows": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[6.0.0, )",
|
||||
"resolved": "8.0.0",
|
||||
"contentHash": "7V0I8tPa9V7UxMx/+7DIwkhls5ouaEMQx6l/GwGm1Y8kJQ61On9B/PxCXFLbgu5/C47g0BP2CUYs+nMv1+Oaqw=="
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -381,7 +381,7 @@ public sealed class ArcGISSendBinding : ISendBinding
|
||||
);
|
||||
List<MapMember> mapMembers = modelCard
|
||||
.SendFilter.NotNull()
|
||||
.GetObjectIds()
|
||||
.RefreshObjectIds()
|
||||
.Select(id => (MapMember)MapView.Active.Map.FindLayer(id) ?? MapView.Active.Map.FindStandaloneTable(id))
|
||||
.Where(obj => obj != null)
|
||||
.ToList();
|
||||
@@ -454,7 +454,7 @@ public sealed class ArcGISSendBinding : ISendBinding
|
||||
|
||||
foreach (SenderModelCard sender in senders)
|
||||
{
|
||||
var objIds = sender.SendFilter.NotNull().GetObjectIds();
|
||||
var objIds = sender.SendFilter.NotNull().RefreshObjectIds();
|
||||
var intersection = objIds.Intersect(objectIdsList).ToList();
|
||||
bool isExpired = intersection.Count != 0;
|
||||
if (isExpired)
|
||||
|
||||
@@ -76,7 +76,7 @@ public class BasicConnectorBinding : IBasicConnectorBinding
|
||||
|
||||
if (model is SenderModelCard senderModelCard)
|
||||
{
|
||||
objectIds = senderModelCard.SendFilter.NotNull().GetObjectIds().Select(x => new ObjectID(x)).ToList();
|
||||
objectIds = senderModelCard.SendFilter.NotNull().RefreshObjectIds().Select(x => new ObjectID(x)).ToList();
|
||||
}
|
||||
|
||||
if (model is ReceiverModelCard receiverModelCard)
|
||||
|
||||
+1
-3
@@ -154,7 +154,6 @@
|
||||
Log.LogErrorFromException(ex);
|
||||
return false;
|
||||
}
|
||||
return Success;
|
||||
]]>
|
||||
</Code>
|
||||
</Task>
|
||||
@@ -190,7 +189,7 @@
|
||||
{
|
||||
Log.LogMessage(MessageImportance.Low, "RelativePaths: " + i.ToString());
|
||||
}
|
||||
return true;
|
||||
Success = true;
|
||||
]]>
|
||||
</Code>
|
||||
</Task>
|
||||
@@ -266,7 +265,6 @@
|
||||
CleanInfo = AssemblyName + extension;
|
||||
}
|
||||
Success = true;
|
||||
return Success;
|
||||
]]>
|
||||
</Code>
|
||||
</Task>
|
||||
|
||||
@@ -9,5 +9,5 @@ public class ArcGISSelectionFilter : DirectSelectionSendFilter
|
||||
IsDefault = true;
|
||||
}
|
||||
|
||||
public override List<string> GetObjectIds() => SelectedObjectIds;
|
||||
public override List<string> RefreshObjectIds() => SelectedObjectIds;
|
||||
}
|
||||
|
||||
@@ -5,18 +5,15 @@ using ArcGIS.Desktop.Mapping;
|
||||
using ArcGIS.Desktop.Mapping.Events;
|
||||
using Speckle.Connectors.DUI.Bridge;
|
||||
using Speckle.Connectors.DUI.Models;
|
||||
using Speckle.Newtonsoft.Json;
|
||||
using Speckle.Connectors.DUI.Utils;
|
||||
using Speckle.Sdk.Common;
|
||||
|
||||
namespace Speckle.Connectors.ArcGIS.Utils;
|
||||
|
||||
public class ArcGISDocumentStore : DocumentModelStore
|
||||
{
|
||||
public ArcGISDocumentStore(
|
||||
JsonSerializerSettings serializerOption,
|
||||
ITopLevelExceptionHandler topLevelExceptionHandler
|
||||
)
|
||||
: base(serializerOption, true)
|
||||
public ArcGISDocumentStore(IJsonSerializer jsonSerializer, ITopLevelExceptionHandler topLevelExceptionHandler)
|
||||
: base(jsonSerializer, true)
|
||||
{
|
||||
ActiveMapViewChangedEvent.Subscribe(a => topLevelExceptionHandler.CatchUnhandled(() => OnMapViewChanged(a)), true);
|
||||
ProjectSavingEvent.Subscribe(
|
||||
|
||||
@@ -93,17 +93,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -132,11 +132,6 @@
|
||||
"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",
|
||||
@@ -231,9 +226,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -241,8 +236,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -267,7 +262,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -279,6 +274,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -299,35 +300,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -91,17 +91,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -130,11 +130,6 @@
|
||||
"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",
|
||||
@@ -264,9 +259,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -274,8 +269,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -300,7 +295,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -312,6 +307,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -338,35 +339,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -91,17 +91,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -130,11 +130,6 @@
|
||||
"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",
|
||||
@@ -264,9 +259,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -274,8 +269,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -300,7 +295,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -312,6 +307,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -338,35 +339,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -91,17 +91,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -130,11 +130,6 @@
|
||||
"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",
|
||||
@@ -264,9 +259,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -274,8 +269,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -301,7 +296,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -313,6 +308,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -339,35 +340,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -70,11 +70,6 @@
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
|
||||
},
|
||||
"Microsoft.Bcl.AsyncInterfaces": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ=="
|
||||
},
|
||||
"Microsoft.Build.Tasks.Git": {
|
||||
"type": "Transitive",
|
||||
"resolved": "8.0.0",
|
||||
@@ -87,17 +82,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -126,11 +121,6 @@
|
||||
"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",
|
||||
@@ -225,9 +215,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -235,8 +225,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -262,7 +252,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -274,6 +264,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -300,35 +296,34 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
+1
-1
@@ -104,7 +104,7 @@ public class AutocadBasicConnectorBinding : IBasicConnectorBinding
|
||||
|
||||
if (model is SenderModelCard senderModelCard)
|
||||
{
|
||||
var dbObjects = doc.GetObjects(senderModelCard.SendFilter.NotNull().GetObjectIds());
|
||||
var dbObjects = doc.GetObjects(senderModelCard.SendFilter.NotNull().RefreshObjectIds());
|
||||
objectIds = dbObjects.Select(tuple => tuple.Root.Id).ToArray();
|
||||
}
|
||||
|
||||
|
||||
+8
-5
@@ -111,10 +111,13 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
||||
private void OnChangeChangedObjectIds(DBObject dBObject)
|
||||
{
|
||||
ChangedObjectIds[dBObject.GetSpeckleApplicationId()] = 1;
|
||||
_idleManager.SubscribeToIdle(nameof(AutocadSendBinding), RunExpirationChecks);
|
||||
_idleManager.SubscribeToIdle(
|
||||
nameof(AutocadSendBinding),
|
||||
async () => await RunExpirationChecks().ConfigureAwait(false)
|
||||
);
|
||||
}
|
||||
|
||||
private void RunExpirationChecks()
|
||||
private async Task RunExpirationChecks()
|
||||
{
|
||||
var senders = _store.GetSenders();
|
||||
string[] objectIdsList = ChangedObjectIds.Keys.ToArray();
|
||||
@@ -124,7 +127,7 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
||||
|
||||
foreach (SenderModelCard modelCard in senders)
|
||||
{
|
||||
var intersection = modelCard.SendFilter.NotNull().GetObjectIds().Intersect(objectIdsList).ToList();
|
||||
var intersection = modelCard.SendFilter.NotNull().RefreshObjectIds().Intersect(objectIdsList).ToList();
|
||||
bool isExpired = intersection.Count != 0;
|
||||
if (isExpired)
|
||||
{
|
||||
@@ -132,7 +135,7 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
||||
}
|
||||
}
|
||||
|
||||
Commands.SetModelsExpired(expiredSenderIds);
|
||||
await Commands.SetModelsExpired(expiredSenderIds).ConfigureAwait(false);
|
||||
ChangedObjectIds = new();
|
||||
}
|
||||
|
||||
@@ -169,7 +172,7 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
||||
|
||||
// Get elements to convert
|
||||
List<AutocadRootObject> autocadObjects = Application.DocumentManager.CurrentDocument.GetObjects(
|
||||
modelCard.SendFilter.NotNull().GetObjectIds()
|
||||
modelCard.SendFilter.NotNull().RefreshObjectIds()
|
||||
);
|
||||
|
||||
if (autocadObjects.Count == 0)
|
||||
|
||||
+1
-1
@@ -9,5 +9,5 @@ public class AutocadSelectionFilter : DirectSelectionSendFilter
|
||||
IsDefault = true;
|
||||
}
|
||||
|
||||
public override List<string> GetObjectIds() => SelectedObjectIds;
|
||||
public override List<string> RefreshObjectIds() => SelectedObjectIds;
|
||||
}
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
using Speckle.Connectors.DUI.Bridge;
|
||||
using Speckle.Connectors.DUI.Models;
|
||||
using Speckle.Newtonsoft.Json;
|
||||
using Speckle.Connectors.DUI.Utils;
|
||||
using Speckle.Sdk.Common;
|
||||
|
||||
namespace Speckle.Connectors.Autocad.HostApp;
|
||||
@@ -12,11 +12,11 @@ public class AutocadDocumentStore : DocumentModelStore
|
||||
private readonly AutocadDocumentManager _autocadDocumentManager;
|
||||
|
||||
public AutocadDocumentStore(
|
||||
JsonSerializerSettings jsonSerializerSettings,
|
||||
IJsonSerializer jsonSerializer,
|
||||
AutocadDocumentManager autocadDocumentManager,
|
||||
ITopLevelExceptionHandler topLevelExceptionHandler
|
||||
)
|
||||
: base(jsonSerializerSettings, true)
|
||||
: base(jsonSerializer, true)
|
||||
{
|
||||
_autocadDocumentManager = autocadDocumentManager;
|
||||
_previousDocName = _nullDocumentName;
|
||||
|
||||
+8
-4
@@ -110,10 +110,14 @@ public class AutocadMaterialUnpacker
|
||||
diffuseColor.Blue
|
||||
);
|
||||
|
||||
string name = material.Name;
|
||||
double opacity = material.Opacity.Percentage;
|
||||
|
||||
RenderMaterial renderMaterial = new(opacity: opacity, diffuse: diffuse) { name = name, applicationId = id };
|
||||
RenderMaterial renderMaterial =
|
||||
new()
|
||||
{
|
||||
name = material.Name,
|
||||
opacity = material.Opacity.Percentage,
|
||||
diffuse = diffuse.ToArgb(),
|
||||
applicationId = id
|
||||
};
|
||||
|
||||
// Add additional properties
|
||||
renderMaterial["ior"] = material.Refraction.Index;
|
||||
|
||||
@@ -100,17 +100,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -139,11 +139,6 @@
|
||||
"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",
|
||||
@@ -273,9 +268,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -283,8 +278,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -310,7 +305,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -322,6 +317,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -348,35 +349,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -100,17 +100,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -139,11 +139,6 @@
|
||||
"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",
|
||||
@@ -273,9 +268,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -283,8 +278,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -310,7 +305,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -322,6 +317,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -348,35 +349,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -100,17 +100,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -139,11 +139,6 @@
|
||||
"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",
|
||||
@@ -273,9 +268,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -283,8 +278,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -310,7 +305,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -322,6 +317,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -348,35 +349,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -79,11 +79,6 @@
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
|
||||
},
|
||||
"Microsoft.Bcl.AsyncInterfaces": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ=="
|
||||
},
|
||||
"Microsoft.Build.Tasks.Git": {
|
||||
"type": "Transitive",
|
||||
"resolved": "8.0.0",
|
||||
@@ -96,17 +91,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -135,11 +130,6 @@
|
||||
"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",
|
||||
@@ -234,9 +224,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -244,8 +234,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -272,7 +262,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -284,6 +274,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -310,35 +306,34 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -119,17 +119,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -158,11 +158,6 @@
|
||||
"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",
|
||||
@@ -292,9 +287,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -302,8 +297,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -314,7 +309,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.revit2022": {
|
||||
@@ -333,6 +328,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -353,11 +354,11 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Revit.API": {
|
||||
@@ -368,26 +369,26 @@
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -119,17 +119,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -158,11 +158,6 @@
|
||||
"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",
|
||||
@@ -292,9 +287,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -302,8 +297,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -314,7 +309,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.revit2023": {
|
||||
@@ -333,6 +328,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -353,11 +354,11 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Revit.API": {
|
||||
@@ -368,26 +369,26 @@
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -119,17 +119,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -158,11 +158,6 @@
|
||||
"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",
|
||||
@@ -292,9 +287,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -302,8 +297,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -314,7 +309,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.revit2024": {
|
||||
@@ -333,6 +328,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -353,11 +354,11 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Revit.API": {
|
||||
@@ -368,26 +369,26 @@
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -92,11 +92,6 @@
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
|
||||
},
|
||||
"Microsoft.Bcl.AsyncInterfaces": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ=="
|
||||
},
|
||||
"Microsoft.Build.Tasks.Git": {
|
||||
"type": "Transitive",
|
||||
"resolved": "8.0.0",
|
||||
@@ -109,17 +104,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -148,11 +143,6 @@
|
||||
"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",
|
||||
@@ -247,9 +237,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -257,8 +247,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -276,7 +266,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.revit2025": {
|
||||
@@ -295,6 +285,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -321,11 +317,11 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Revit.API": {
|
||||
@@ -336,26 +332,25 @@
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
+6
-4
@@ -106,9 +106,13 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding
|
||||
|
||||
if (model is SenderModelCard senderModelCard)
|
||||
{
|
||||
if (senderModelCard.SendFilter is IRevitSendFilter revitFilter)
|
||||
{
|
||||
revitFilter.SetContext(_revitContext, _apiContext);
|
||||
}
|
||||
|
||||
if (senderModelCard.SendFilter is RevitViewsFilter revitViewsFilter)
|
||||
{
|
||||
revitViewsFilter.SetContext(_revitContext, _apiContext);
|
||||
await _apiContext
|
||||
.Run(() =>
|
||||
{
|
||||
@@ -122,9 +126,7 @@ internal sealed class BasicConnectorBindingRevit : IBasicConnectorBinding
|
||||
return;
|
||||
}
|
||||
|
||||
var selectedObjects = await _apiContext
|
||||
.Run(_ => senderModelCard.SendFilter.NotNull().GetObjectIds())
|
||||
.ConfigureAwait(false);
|
||||
var selectedObjects = senderModelCard.SendFilter.NotNull().SelectedObjectIds;
|
||||
|
||||
elementIds = selectedObjects
|
||||
.Select(uid => ElementIdHelper.GetElementIdFromUniqueId(activeUIDoc.Document, uid))
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Collections.Concurrent;
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.DB.ExtensibleStorage;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Speckle.Connectors.Common.Caching;
|
||||
@@ -47,11 +48,6 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
/// </summary>
|
||||
private ConcurrentDictionary<ElementId, byte> ChangedObjectIds { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// We need it to get UniqueId whenever it is not available i.e. GetDeletedElementIds returns ElementId and cannot find its Element to get UniqueId. We store them both just before send to remember later.
|
||||
/// </summary>
|
||||
private ConcurrentDictionary<string, string> IdMap { get; } = new();
|
||||
|
||||
public RevitSendBinding(
|
||||
IRevitIdleManager idleManager,
|
||||
RevitContext revitContext,
|
||||
@@ -96,7 +92,11 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
}
|
||||
|
||||
public List<ISendFilter> GetSendFilters() =>
|
||||
[new RevitSelectionFilter() { IsDefault = true }, new RevitViewsFilter(RevitContext, _apiContext)];
|
||||
[
|
||||
new RevitSelectionFilter() { IsDefault = true },
|
||||
new RevitViewsFilter(RevitContext, _apiContext),
|
||||
new RevitCategoriesFilter(RevitContext, _apiContext)
|
||||
];
|
||||
|
||||
public List<ICardSetting> GetSendSettings() =>
|
||||
[
|
||||
@@ -109,9 +109,7 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
|
||||
public SendBindingUICommands Commands { get; }
|
||||
|
||||
#pragma warning disable CA1506
|
||||
public async Task Send(string modelCardId)
|
||||
#pragma warning restore CA1506
|
||||
{
|
||||
// Note: removed top level handling thing as it was confusing me
|
||||
try
|
||||
@@ -129,35 +127,13 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<RevitConversionSettings>>()
|
||||
.Initialize(
|
||||
_revitConversionSettingsFactory.Create(
|
||||
await _toSpeckleSettingsManager.GetDetailLevelSetting(modelCard).ConfigureAwait(false),
|
||||
await _toSpeckleSettingsManager.GetReferencePointSetting(modelCard).ConfigureAwait(false),
|
||||
await _toSpeckleSettingsManager.GetSendParameterNullOrEmptyStringsSetting(modelCard).ConfigureAwait(false)
|
||||
_toSpeckleSettingsManager.GetDetailLevelSetting(modelCard),
|
||||
_toSpeckleSettingsManager.GetReferencePointSetting(modelCard),
|
||||
_toSpeckleSettingsManager.GetSendParameterNullOrEmptyStringsSetting(modelCard)
|
||||
)
|
||||
);
|
||||
|
||||
var activeUIDoc =
|
||||
RevitContext.UIApplication?.ActiveUIDocument
|
||||
?? throw new SpeckleException("Unable to retrieve active UI document");
|
||||
|
||||
if (modelCard.SendFilter is RevitViewsFilter viewFilter)
|
||||
{
|
||||
viewFilter.SetContext(RevitContext, _apiContext);
|
||||
}
|
||||
|
||||
var selectedObjects = await _apiContext
|
||||
.Run(_ => modelCard.SendFilter.NotNull().GetObjectIds())
|
||||
.ConfigureAwait(false);
|
||||
|
||||
List<Element> elements = selectedObjects
|
||||
.Select(uid => activeUIDoc.Document.GetElement(uid))
|
||||
.Where(el => el is not null)
|
||||
.ToList();
|
||||
|
||||
foreach (Element element in elements)
|
||||
{
|
||||
IdMap[element.Id.ToString()] = element.UniqueId;
|
||||
}
|
||||
|
||||
List<Element> elements = await RefreshElementsOnSender(modelCard.NotNull()).ConfigureAwait(false);
|
||||
List<ElementId> elementIds = elements.Select(el => el.Id).ToList();
|
||||
|
||||
if (elementIds.Count == 0)
|
||||
@@ -193,16 +169,67 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<List<Element>> RefreshElementsOnSender(SenderModelCard modelCard)
|
||||
{
|
||||
var activeUIDoc =
|
||||
RevitContext.UIApplication?.ActiveUIDocument
|
||||
?? throw new SpeckleException("Unable to retrieve active UI document");
|
||||
|
||||
if (modelCard.SendFilter is IRevitSendFilter viewFilter)
|
||||
{
|
||||
viewFilter.SetContext(RevitContext, _apiContext);
|
||||
}
|
||||
|
||||
var selectedObjects = await _apiContext
|
||||
.Run(_ => modelCard.SendFilter.NotNull().RefreshObjectIds())
|
||||
.ConfigureAwait(false);
|
||||
|
||||
List<Element> elements = selectedObjects
|
||||
.Select(uid => activeUIDoc.Document.GetElement(uid))
|
||||
.Where(el => el is not null)
|
||||
.ToList();
|
||||
|
||||
if (modelCard.SendFilter is not null && modelCard.SendFilter.IdMap is not null)
|
||||
{
|
||||
var newSelectedObjectIds = new List<string>();
|
||||
foreach (Element element in elements)
|
||||
{
|
||||
modelCard.SendFilter.IdMap[element.Id.ToString()] = element.UniqueId;
|
||||
newSelectedObjectIds.Add(element.UniqueId);
|
||||
}
|
||||
|
||||
// We update the state on the UI SenderModelCard to prevent potential inconsistencies between hostApp IdMap in sendfilters.
|
||||
await Commands
|
||||
.SetFilterObjectIds(modelCard.ModelCardId.NotNull(), modelCard.SendFilter.IdMap, newSelectedObjectIds)
|
||||
.ConfigureAwait(false);
|
||||
}
|
||||
|
||||
return elements;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Keeps track of the changed element ids as well as checks if any of them need to trigger
|
||||
/// a filter refresh (e.g., views being added).
|
||||
/// </summary>
|
||||
/// <param name="e"></param>
|
||||
private async Task DocChangeHandler(Autodesk.Revit.DB.Events.DocumentChangedEventArgs e)
|
||||
private void DocChangeHandler(Autodesk.Revit.DB.Events.DocumentChangedEventArgs e)
|
||||
{
|
||||
ICollection<ElementId> modifiedElementIds = e.GetModifiedElementIds();
|
||||
|
||||
// NOTE: Whenever we save data into file this event also trigger changes on its DataStorage.
|
||||
// On every add/remove/update model attempt triggers this handler and was causing unnecessary calls on `RunExpirationChecks`
|
||||
// Re-check it once we implement Linked Documents
|
||||
if (modifiedElementIds.Count == 1)
|
||||
{
|
||||
var doc = e.GetDocument();
|
||||
if (modifiedElementIds.All(el => doc.GetElement(el) is DataStorage))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ICollection<ElementId> addedElementIds = e.GetAddedElementIds();
|
||||
ICollection<ElementId> deletedElementIds = e.GetDeletedElementIds();
|
||||
ICollection<ElementId> modifiedElementIds = e.GetModifiedElementIds();
|
||||
|
||||
foreach (ElementId elementId in addedElementIds)
|
||||
{
|
||||
@@ -219,18 +246,22 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
ChangedObjectIds[elementId] = 1;
|
||||
}
|
||||
|
||||
if (addedElementIds.Count > 0)
|
||||
{
|
||||
_idleManager.SubscribeToIdle(nameof(PostSetObjectIds), PostSetObjectIds);
|
||||
}
|
||||
|
||||
if (HaveUnitsChanged(e.GetDocument()))
|
||||
{
|
||||
var objectIds = new List<string>();
|
||||
foreach (var sender in Store.GetSenders())
|
||||
foreach (var sender in Store.GetSenders().ToList())
|
||||
{
|
||||
if (sender.SendFilter is null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var selectedObjects = await _apiContext
|
||||
.Run(_ => sender.SendFilter.NotNull().GetObjectIds())
|
||||
.ConfigureAwait(false);
|
||||
|
||||
var selectedObjects = sender.SendFilter.NotNull().SelectedObjectIds;
|
||||
objectIds.AddRange(selectedObjects);
|
||||
}
|
||||
var unpackedObjectIds = _elementUnpacker.GetUnpackedElementIds(objectIds.ToList());
|
||||
@@ -275,6 +306,14 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
return false;
|
||||
}
|
||||
|
||||
private async Task PostSetObjectIds()
|
||||
{
|
||||
foreach (var sender in Store.GetSenders().ToList())
|
||||
{
|
||||
await RefreshElementsOnSender(sender).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Notifies ui if any filters need refreshing. Currently, this only applies for view filters.
|
||||
/// </summary>
|
||||
@@ -297,7 +336,7 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
|
||||
private async Task RunExpirationChecks()
|
||||
{
|
||||
var senders = Store.GetSenders();
|
||||
var senders = Store.GetSenders().ToList();
|
||||
// string[] objectIdsList = ChangedObjectIds.Keys.ToArray();
|
||||
var doc = RevitContext.UIApplication?.ActiveUIDocument.Document;
|
||||
|
||||
@@ -307,20 +346,38 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
}
|
||||
|
||||
var objUniqueIds = new List<string>();
|
||||
foreach (var changedElementId in ChangedObjectIds.Keys.ToArray())
|
||||
|
||||
foreach (var sender in senders)
|
||||
{
|
||||
if (IdMap.TryGetValue(changedElementId.ToString(), out var uniqueId))
|
||||
// if (sender.SendFilter is null) // NOTE: RunExpirationChecks sometimes triggered unnecessarily before send and, we didn't set up yet IdMap, if so we do not need to deal with it
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
foreach (var changedElementId in ChangedObjectIds.Keys)
|
||||
{
|
||||
objUniqueIds.Add(uniqueId);
|
||||
}
|
||||
else
|
||||
{
|
||||
var uniqId = doc.GetElement(changedElementId).UniqueId;
|
||||
objUniqueIds.Add(uniqId);
|
||||
IdMap[changedElementId.ToString()] = uniqId;
|
||||
if (sender.SendFilter?.IdMap?.TryGetValue(changedElementId.ToString(), out var id) ?? false)
|
||||
{
|
||||
objUniqueIds.Add(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// foreach (var changedElementId in ChangedObjectIds.Keys.ToArray())
|
||||
// {
|
||||
// foreach (var sender in senders)
|
||||
// {
|
||||
// if (sender.SendFilter.NotNull().IdMap is null)
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
// if (sender.SendFilter.NotNull().IdMap.NotNull().ContainsKey(changedElementId.ToString()))
|
||||
// {
|
||||
// objUniqueIds.Add(sender.SendFilter.NotNull().IdMap.NotNull()[changedElementId.ToString()]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
var unpackedObjectIds = _elementUnpacker.GetUnpackedElementIds(objUniqueIds);
|
||||
_sendConversionCache.EvictObjects(unpackedObjectIds);
|
||||
|
||||
@@ -328,13 +385,12 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
List<string> expiredSenderIds = new();
|
||||
foreach (SenderModelCard modelCard in senders)
|
||||
{
|
||||
if (modelCard.SendFilter is RevitViewsFilter viewFilter)
|
||||
if (modelCard.SendFilter is IRevitSendFilter viewFilter)
|
||||
{
|
||||
viewFilter.SetContext(RevitContext, _apiContext);
|
||||
}
|
||||
var selectedObjects = await _apiContext
|
||||
.Run(_ => modelCard.SendFilter.NotNull().GetObjectIds())
|
||||
.ConfigureAwait(false);
|
||||
|
||||
var selectedObjects = modelCard.SendFilter.NotNull().IdMap.NotNull().Values;
|
||||
var intersection = selectedObjects.Intersect(objUniqueIds).ToList();
|
||||
bool isExpired = intersection.Count != 0;
|
||||
if (isExpired)
|
||||
@@ -352,7 +408,6 @@ internal sealed class RevitSendBinding : RevitBaseBinding, ISendBinding
|
||||
private async Task OnDocumentChanged()
|
||||
{
|
||||
_sendConversionCache.ClearCache();
|
||||
IdMap.Clear();
|
||||
|
||||
if (_cancellationManager.NumberOfOperations > 0)
|
||||
{
|
||||
|
||||
@@ -9,4 +9,23 @@ public static class ElementIdHelper
|
||||
Element element = doc.GetElement(uniqueId);
|
||||
return element?.Id;
|
||||
}
|
||||
|
||||
public static ElementId? GetElementId(string elementId)
|
||||
{
|
||||
#if REVIT2024_OR_GREATER
|
||||
if (long.TryParse(elementId, out long elementIdInt))
|
||||
{
|
||||
return new ElementId(elementIdInt);
|
||||
}
|
||||
#else
|
||||
if (int.TryParse(elementId, out int elementIdInt))
|
||||
{
|
||||
return new ElementId(elementIdInt);
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,9 +6,9 @@ using Autodesk.Revit.UI.Events;
|
||||
using Revit.Async;
|
||||
using Speckle.Connectors.DUI.Bridge;
|
||||
using Speckle.Connectors.DUI.Models;
|
||||
using Speckle.Connectors.DUI.Utils;
|
||||
using Speckle.Connectors.Revit.Plugin;
|
||||
using Speckle.Converters.RevitShared.Helpers;
|
||||
using Speckle.Newtonsoft.Json;
|
||||
using Speckle.Sdk;
|
||||
using Speckle.Sdk.Common;
|
||||
|
||||
@@ -28,12 +28,12 @@ internal sealed class RevitDocumentStore : DocumentModelStore
|
||||
public RevitDocumentStore(
|
||||
IRevitIdleManager idleManager,
|
||||
RevitContext revitContext,
|
||||
JsonSerializerSettings serializerSettings,
|
||||
IJsonSerializer jsonSerializer,
|
||||
DocumentModelStorageSchema documentModelStorageSchema,
|
||||
IdStorageSchema idStorageSchema,
|
||||
ITopLevelExceptionHandler topLevelExceptionHandler
|
||||
)
|
||||
: base(serializerSettings, true)
|
||||
: base(jsonSerializer, true)
|
||||
{
|
||||
_idleManager = idleManager;
|
||||
_revitContext = revitContext;
|
||||
|
||||
@@ -25,6 +25,12 @@ public class RevitGroupBaker : TraversalContextUnpacker
|
||||
|
||||
public void BakeGroupForTopLevel(string baseGroupName)
|
||||
{
|
||||
if (_elementIdsForTopLevelGroup.Count == 0)
|
||||
// if no elements were successfully converted, instead of throwing when creating a new group, we should just return and let object conversion exceptions bubble up.
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var docGroup = _converterSettings.Current.Document.Create.NewGroup(_elementIdsForTopLevelGroup);
|
||||
docGroup.GroupType.Name = _revitUtils.RemoveInvalidChars(baseGroupName);
|
||||
docGroup.Pinned = true;
|
||||
|
||||
+3
-3
@@ -180,10 +180,10 @@ internal sealed class RevitHostObjectBuilder : IHostObjectBuilder, IDisposable
|
||||
{
|
||||
using var activity = _activityFactory.Start("BakeObject");
|
||||
|
||||
// POC hack of the ages: try to pre transform curves before baking
|
||||
// POC hack of the ages: try to pre transform curves, points and meshes before baking
|
||||
// we need to bypass the local to global converter as there we don't have access to what we want. that service will/should stop existing.
|
||||
if (
|
||||
localToGlobalMap.AtomicObject is ITransformable transformable and ICurve
|
||||
localToGlobalMap.AtomicObject is ITransformable transformable // and ICurve
|
||||
&& localToGlobalMap.Matrix.Count > 0
|
||||
&& localToGlobalMap.AtomicObject["units"] is string units
|
||||
)
|
||||
@@ -191,7 +191,7 @@ internal sealed class RevitHostObjectBuilder : IHostObjectBuilder, IDisposable
|
||||
ITransformable? newTransformable = null;
|
||||
foreach (var mat in localToGlobalMap.Matrix)
|
||||
{
|
||||
transformable.TransformTo(new Transform(mat, units), out newTransformable);
|
||||
transformable.TransformTo(new Transform() { matrix = mat, units = units }, out newTransformable);
|
||||
}
|
||||
|
||||
localToGlobalMap.AtomicObject = (newTransformable as Base)!;
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
using Speckle.Connectors.Revit.HostApp;
|
||||
using Speckle.Converters.RevitShared.Helpers;
|
||||
|
||||
namespace Speckle.Connectors.RevitShared.Operations.Send.Filters;
|
||||
|
||||
public interface IRevitSendFilter
|
||||
{
|
||||
public void SetContext(RevitContext revitContext, APIContext apiContext);
|
||||
}
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
using Autodesk.Revit.DB;
|
||||
using Speckle.Connectors.DUI.Exceptions;
|
||||
using Speckle.Connectors.DUI.Models.Card.SendFilter;
|
||||
using Speckle.Connectors.DUI.Utils;
|
||||
using Speckle.Connectors.Revit.HostApp;
|
||||
using Speckle.Converters.RevitShared.Helpers;
|
||||
|
||||
namespace Speckle.Connectors.RevitShared.Operations.Send.Filters;
|
||||
|
||||
public record CategoryData(string Name, string Id);
|
||||
|
||||
public class RevitCategoriesFilter : DiscriminatedObject, ISendFilter, IRevitSendFilter
|
||||
{
|
||||
private RevitContext _revitContext;
|
||||
private APIContext _apiContext;
|
||||
private Document? _doc;
|
||||
public string Id { get; set; } = "revitCategories";
|
||||
public string Name { get; set; } = "Categories";
|
||||
public string? Summary { get; set; }
|
||||
public bool IsDefault { get; set; }
|
||||
public List<string> SelectedObjectIds { get; set; } = new();
|
||||
public Dictionary<string, string>? IdMap { get; set; }
|
||||
public List<string>? SelectedCategories { get; set; }
|
||||
public List<CategoryData>? AvailableCategories { get; set; }
|
||||
|
||||
public RevitCategoriesFilter() { }
|
||||
|
||||
public RevitCategoriesFilter(RevitContext revitContext, APIContext apiContext)
|
||||
{
|
||||
_revitContext = revitContext;
|
||||
_apiContext = apiContext;
|
||||
_doc = _revitContext.UIApplication?.ActiveUIDocument.Document;
|
||||
|
||||
GetCategories();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Always need to run on Revit UI thread (main) because of FilteredElementCollector.
|
||||
/// Use it with APIContext.Run
|
||||
/// </summary>
|
||||
/// <exception cref="SpeckleSendFilterException">Whenever no view is found.</exception>
|
||||
public List<string> RefreshObjectIds()
|
||||
{
|
||||
var objectIds = new List<string>();
|
||||
if (SelectedCategories is null)
|
||||
{
|
||||
return objectIds;
|
||||
}
|
||||
|
||||
var elementIds = SelectedCategories.Select(c => ElementIdHelper.GetElementId(c)).Where(e => e is not null).ToList();
|
||||
|
||||
using var categoryFilter = new ElementMulticategoryFilter(elementIds);
|
||||
using var collector = new FilteredElementCollector(_doc);
|
||||
var elements = collector
|
||||
.WhereElementIsNotElementType()
|
||||
.WhereElementIsViewIndependent()
|
||||
.WherePasses(categoryFilter)
|
||||
.ToList();
|
||||
objectIds = elements.Select(e => e.UniqueId).ToList();
|
||||
SelectedObjectIds = objectIds;
|
||||
return objectIds;
|
||||
}
|
||||
|
||||
private void GetCategories()
|
||||
{
|
||||
if (_doc is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var categories = new List<CategoryData>();
|
||||
|
||||
foreach (Category category in _doc.Settings.Categories)
|
||||
{
|
||||
categories.Add(new CategoryData(category.Name, category.Id.ToString()));
|
||||
}
|
||||
|
||||
AvailableCategories = categories;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// NOTE: this is needed since we need doc on `GetObjectIds()` function after it deserialized.
|
||||
/// DI doesn't help here to pass RevitContext from constructor.
|
||||
/// </summary>
|
||||
public void SetContext(RevitContext revitContext, APIContext apiContext)
|
||||
{
|
||||
_revitContext = revitContext;
|
||||
_apiContext = apiContext;
|
||||
_doc = _revitContext.UIApplication?.ActiveUIDocument.Document;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -9,5 +9,5 @@ public class RevitSelectionFilter : DirectSelectionSendFilter
|
||||
IsDefault = true;
|
||||
}
|
||||
|
||||
public override List<string> GetObjectIds() => SelectedObjectIds;
|
||||
public override List<string> RefreshObjectIds() => SelectedObjectIds;
|
||||
}
|
||||
|
||||
+5
-2
@@ -7,7 +7,7 @@ using Speckle.Converters.RevitShared.Helpers;
|
||||
|
||||
namespace Speckle.Connectors.RevitShared.Operations.Send.Filters;
|
||||
|
||||
public class RevitViewsFilter : DiscriminatedObject, ISendFilter
|
||||
public class RevitViewsFilter : DiscriminatedObject, ISendFilter, IRevitSendFilter
|
||||
{
|
||||
private RevitContext _revitContext;
|
||||
private APIContext _apiContext;
|
||||
@@ -17,6 +17,8 @@ public class RevitViewsFilter : DiscriminatedObject, ISendFilter
|
||||
public string? Summary { get; set; }
|
||||
public bool IsDefault { get; set; }
|
||||
public string? SelectedView { get; set; }
|
||||
public List<string> SelectedObjectIds { get; set; }
|
||||
public Dictionary<string, string>? IdMap { get; set; } = new();
|
||||
public List<string>? AvailableViews { get; set; }
|
||||
|
||||
public RevitViewsFilter() { }
|
||||
@@ -52,7 +54,7 @@ public class RevitViewsFilter : DiscriminatedObject, ISendFilter
|
||||
/// Use it with APIContext.Run
|
||||
/// </summary>
|
||||
/// <exception cref="SpeckleSendFilterException">Whenever no view is found.</exception>
|
||||
public List<string> GetObjectIds()
|
||||
public List<string> RefreshObjectIds()
|
||||
{
|
||||
var objectIds = new List<string>();
|
||||
if (SelectedView is null)
|
||||
@@ -78,6 +80,7 @@ public class RevitViewsFilter : DiscriminatedObject, ISendFilter
|
||||
using var viewCollector = new FilteredElementCollector(_doc, view.Id);
|
||||
List<Element> elementsInView = viewCollector.ToElements().ToList();
|
||||
objectIds = elementsInView.Select(e => e.UniqueId).ToList();
|
||||
SelectedObjectIds = objectIds;
|
||||
return objectIds;
|
||||
}
|
||||
|
||||
|
||||
+11
-3
@@ -56,6 +56,13 @@ public class RevitRootObjectBuilder : IRootObjectBuilder<ElementId>
|
||||
SendInfo sendInfo,
|
||||
IProgress<CardProgress> onOperationProgressed,
|
||||
CancellationToken ct = default
|
||||
) => await RevitTask.RunAsync(() => BuildSync(objects, sendInfo, onOperationProgressed, ct)).ConfigureAwait(false);
|
||||
|
||||
private RootObjectBuilderResult BuildSync(
|
||||
IReadOnlyList<ElementId> objects,
|
||||
SendInfo sendInfo,
|
||||
IProgress<CardProgress> onOperationProgressed,
|
||||
CancellationToken ct = default
|
||||
)
|
||||
{
|
||||
var doc = _converterSettings.Current.Document;
|
||||
@@ -110,7 +117,7 @@ public class RevitRootObjectBuilder : IRootObjectBuilder<ElementId>
|
||||
}
|
||||
else
|
||||
{
|
||||
converted = await RevitTask.RunAsync(() => _converter.Convert(revitElement)).ConfigureAwait(false); // Could we run these batched? Is there maybe a performance penalty for running these to speckle conversions individually in revittask.runasync?
|
||||
converted = _converter.Convert(revitElement);
|
||||
converted.applicationId = applicationId;
|
||||
}
|
||||
|
||||
@@ -136,8 +143,9 @@ public class RevitRootObjectBuilder : IRootObjectBuilder<ElementId>
|
||||
var idsAndSubElementIds = _elementUnpacker.GetElementsAndSubelementIdsFromAtomicObjects(atomicObjects);
|
||||
var materialProxies = _revitToSpeckleCacheSingleton.GetRenderMaterialProxyListForObjects(idsAndSubElementIds);
|
||||
rootObject[ProxyKeys.RENDER_MATERIAL] = materialProxies;
|
||||
// NOTE: these are currently not used anywhere, so we could even skip them (?).
|
||||
rootObject[ProxyKeys.PARAMETER_DEFINITIONS] = _parameterDefinitionHandler.Definitions;
|
||||
|
||||
// NOTE: these are currently not used anywhere, we'll skip them until someone calls for it back
|
||||
// rootObject[ProxyKeys.PARAMETER_DEFINITIONS] = _parameterDefinitionHandler.Definitions;
|
||||
|
||||
return new RootObjectBuilderResult(rootObject, results);
|
||||
}
|
||||
|
||||
+8
-11
@@ -36,7 +36,7 @@ public class ToSpeckleSettingsManager : IToSpeckleSettingsManager
|
||||
_sendConversionCache = sendConversionCache;
|
||||
}
|
||||
|
||||
public async Task<DetailLevelType> GetDetailLevelSetting(SenderModelCard modelCard)
|
||||
public DetailLevelType GetDetailLevelSetting(SenderModelCard modelCard)
|
||||
{
|
||||
var fidelityString = modelCard.Settings?.First(s => s.Id == "detailLevel").Value as string;
|
||||
if (
|
||||
@@ -48,7 +48,7 @@ public class ToSpeckleSettingsManager : IToSpeckleSettingsManager
|
||||
{
|
||||
if (previousType != fidelity)
|
||||
{
|
||||
await EvictCacheForModelCard(modelCard).ConfigureAwait(false);
|
||||
EvictCacheForModelCard(modelCard);
|
||||
}
|
||||
}
|
||||
_detailLevelCache[modelCard.ModelCardId.NotNull()] = fidelity;
|
||||
@@ -58,7 +58,7 @@ public class ToSpeckleSettingsManager : IToSpeckleSettingsManager
|
||||
throw new ArgumentException($"Invalid geometry fidelity value: {fidelityString}");
|
||||
}
|
||||
|
||||
public async Task<Transform?> GetReferencePointSetting(SenderModelCard modelCard)
|
||||
public Transform? GetReferencePointSetting(SenderModelCard modelCard)
|
||||
{
|
||||
var referencePointString = modelCard.Settings?.First(s => s.Id == "referencePoint").Value as string;
|
||||
if (
|
||||
@@ -78,7 +78,7 @@ public class ToSpeckleSettingsManager : IToSpeckleSettingsManager
|
||||
// invalidate conversion cache if the transform has changed
|
||||
if (previousTransform != currentTransform)
|
||||
{
|
||||
await EvictCacheForModelCard(modelCard).ConfigureAwait(false);
|
||||
EvictCacheForModelCard(modelCard);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ public class ToSpeckleSettingsManager : IToSpeckleSettingsManager
|
||||
throw new ArgumentException($"Invalid reference point value: {referencePointString}");
|
||||
}
|
||||
|
||||
public async Task<bool> GetSendParameterNullOrEmptyStringsSetting(SenderModelCard modelCard)
|
||||
public bool GetSendParameterNullOrEmptyStringsSetting(SenderModelCard modelCard)
|
||||
{
|
||||
var value = modelCard.Settings?.First(s => s.Id == "nullemptyparams").Value as bool?;
|
||||
var returnValue = value != null && value.NotNull();
|
||||
@@ -97,7 +97,7 @@ public class ToSpeckleSettingsManager : IToSpeckleSettingsManager
|
||||
{
|
||||
if (previousValue != returnValue)
|
||||
{
|
||||
await EvictCacheForModelCard(modelCard).ConfigureAwait(false);
|
||||
EvictCacheForModelCard(modelCard);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,12 +105,9 @@ public class ToSpeckleSettingsManager : IToSpeckleSettingsManager
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private async Task EvictCacheForModelCard(SenderModelCard modelCard)
|
||||
private void EvictCacheForModelCard(SenderModelCard modelCard)
|
||||
{
|
||||
var objectIds =
|
||||
modelCard.SendFilter != null
|
||||
? await _apiContext.Run(_ => modelCard.SendFilter.NotNull().GetObjectIds()).ConfigureAwait(false)
|
||||
: [];
|
||||
var objectIds = modelCard.SendFilter != null ? modelCard.SendFilter.NotNull().SelectedObjectIds : [];
|
||||
var unpackedObjectIds = _elementUnpacker.GetUnpackedElementIds(objectIds);
|
||||
_sendConversionCache.EvictObjects(unpackedObjectIds);
|
||||
}
|
||||
|
||||
+2
@@ -35,6 +35,8 @@
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\ITransactionManager.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\RevitHostObjectBuilder.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\TransactionManager.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Filters\IRevitSendFilter.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Filters\RevitCategoriesFilter.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Filters\RevitSelectionFilter.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Filters\RevitViewsFilter.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\RevitRootObjectBuilder.cs" />
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components.BaseComponents;
|
||||
|
||||
public abstract class SpeckleScopedTaskCapableComponent<TInput, TOutput>(
|
||||
string name,
|
||||
string nickname,
|
||||
string description,
|
||||
string category,
|
||||
string subCategory
|
||||
) : SpeckleTaskCapableComponent<TInput, TOutput>(name, nickname, description, category, subCategory)
|
||||
{
|
||||
protected override Task<TOutput> PerformTask(TInput input, CancellationToken cancellationToken = default)
|
||||
{
|
||||
/*using*/var scope = PriorityLoader.Container.CreateScope(); // NOTE: this component does not work as intended in e.g the receive component; the scope gets disposed before the task completes.
|
||||
return PerformScopedTask(input, scope, cancellationToken);
|
||||
}
|
||||
|
||||
protected abstract Task<TOutput> PerformScopedTask(
|
||||
TInput input,
|
||||
IServiceScope scope,
|
||||
CancellationToken cancellationToken = default
|
||||
);
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Speckle.Sdk;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components.BaseComponents;
|
||||
|
||||
public abstract class SpeckleTaskCapableComponent<TInput, TOutput>(
|
||||
string name,
|
||||
string nickname,
|
||||
string description,
|
||||
string category,
|
||||
string subCategory
|
||||
) : GH_TaskCapableComponent<TOutput>(name, nickname, description, category, subCategory)
|
||||
{
|
||||
protected override void SolveInstance(IGH_DataAccess da)
|
||||
{
|
||||
//TODO: We're missing activity and logging here. Will enable it for all inherited classes.
|
||||
|
||||
if (InPreSolve)
|
||||
{
|
||||
// Collect the data and create the task
|
||||
try
|
||||
{
|
||||
var input = GetInput(da);
|
||||
TaskList.Add(PerformTask(input, CancelToken));
|
||||
}
|
||||
catch (SpeckleException e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!GetSolveResults(da, out TOutput result))
|
||||
{
|
||||
// INFO: This will run synchronously. Useful for Rhino.Compute runs, but can also be enabled by user.
|
||||
try
|
||||
{
|
||||
TInput input = GetInput(da);
|
||||
var syncResult = PerformTask(input).Result;
|
||||
result = syncResult;
|
||||
}
|
||||
catch (SpeckleException e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (result is not null)
|
||||
{
|
||||
SetOutput(da, result);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract TInput GetInput(IGH_DataAccess da);
|
||||
|
||||
protected abstract void SetOutput(IGH_DataAccess da, TOutput result);
|
||||
|
||||
protected abstract Task<TOutput> PerformTask(TInput input, CancellationToken cancellationToken = default);
|
||||
}
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Speckle.Connectors.Grasshopper8.Components.BaseComponents;
|
||||
using Speckle.Connectors.Grasshopper8.Parameters;
|
||||
using Speckle.Sdk;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components.Collections;
|
||||
|
||||
public record CreateCollectionComponentInput(
|
||||
Collection? Collection,
|
||||
string? Name,
|
||||
List<Base>? Elements,
|
||||
List<Collection>? Collections
|
||||
);
|
||||
|
||||
public record CreateCollectionComponentOutput(Collection Collection);
|
||||
|
||||
public class CreateCollectionComponent
|
||||
: SpeckleTaskCapableComponent<CreateCollectionComponentInput, CreateCollectionComponentOutput>
|
||||
{
|
||||
public CreateCollectionComponent()
|
||||
: base("Create Collection", "CrCol", "Creates a new collection", "Speckle", "Collections") { }
|
||||
|
||||
public override Guid ComponentGuid => new("6A9EDFDE-8AC4-4E28-B455-45DF42E2172B");
|
||||
|
||||
protected override void RegisterInputParams(GH_InputParamManager pManager)
|
||||
{
|
||||
var colIndex = pManager.AddParameter(
|
||||
new SpeckleCollectionParam(GH_ParamAccess.item),
|
||||
"collection",
|
||||
"Collection",
|
||||
"Collection",
|
||||
GH_ParamAccess.item
|
||||
);
|
||||
var nameIndex = pManager.AddTextParameter("Name", "Name", "Name of the collection", GH_ParamAccess.item);
|
||||
|
||||
var elementsIndex = pManager.AddParameter(
|
||||
new SpeckleObjectParam(GH_ParamAccess.list),
|
||||
"elements",
|
||||
"Elements",
|
||||
"Elements of the collection",
|
||||
GH_ParamAccess.list
|
||||
);
|
||||
var collectionsIndex = pManager.AddParameter(
|
||||
new SpeckleCollectionParam(GH_ParamAccess.list),
|
||||
"collections",
|
||||
"Collections",
|
||||
"Sub-collections of the collection",
|
||||
GH_ParamAccess.list
|
||||
);
|
||||
|
||||
pManager[colIndex].Optional = true;
|
||||
pManager[nameIndex].Optional = true;
|
||||
pManager[elementsIndex].Optional = true;
|
||||
pManager[collectionsIndex].Optional = true;
|
||||
}
|
||||
|
||||
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
|
||||
{
|
||||
var colIndex = pManager.AddParameter(
|
||||
new SpeckleCollectionParam(GH_ParamAccess.item),
|
||||
"collection",
|
||||
"Collection",
|
||||
"Collection",
|
||||
GH_ParamAccess.item
|
||||
);
|
||||
var nameIndex = pManager.AddTextParameter("Name", "Name", "Name of the collection", GH_ParamAccess.item);
|
||||
|
||||
var elementsIndex = pManager.AddParameter(
|
||||
new SpeckleObjectParam(GH_ParamAccess.list),
|
||||
"elements",
|
||||
"Elements",
|
||||
"Elements of the collection",
|
||||
GH_ParamAccess.list
|
||||
);
|
||||
var collectionsIndex = pManager.AddParameter(
|
||||
new SpeckleCollectionParam(GH_ParamAccess.list),
|
||||
"collections",
|
||||
"Collections",
|
||||
"Sub-collections of the collection",
|
||||
GH_ParamAccess.list
|
||||
);
|
||||
|
||||
pManager[colIndex].Optional = true;
|
||||
pManager[nameIndex].Optional = true;
|
||||
pManager[elementsIndex].Optional = true;
|
||||
pManager[collectionsIndex].Optional = true;
|
||||
}
|
||||
|
||||
protected override CreateCollectionComponentInput GetInput(IGH_DataAccess da)
|
||||
{
|
||||
Collection? collection = null;
|
||||
string? name = "";
|
||||
List<Base>? elements = new List<Base>();
|
||||
List<Collection>? collections = new List<Collection>();
|
||||
|
||||
da.GetData(0, ref collection);
|
||||
da.GetData(1, ref name);
|
||||
da.GetDataList(2, elements);
|
||||
da.GetDataList(3, collections);
|
||||
|
||||
return new CreateCollectionComponentInput(collection, name, elements, collections);
|
||||
}
|
||||
|
||||
protected override void SetOutput(IGH_DataAccess da, CreateCollectionComponentOutput result)
|
||||
{
|
||||
da.SetData(0, result.Collection);
|
||||
da.SetData(1, result.Collection.name);
|
||||
da.SetDataList(2, result.Collection.elements.Where(e => e is not Collection));
|
||||
da.SetDataList(3, result.Collection.elements.Where(e => e is Collection));
|
||||
}
|
||||
|
||||
protected override Task<CreateCollectionComponentOutput> PerformTask(
|
||||
CreateCollectionComponentInput input,
|
||||
CancellationToken cancellationToken = default
|
||||
)
|
||||
{
|
||||
if (input.Collection is null)
|
||||
{
|
||||
// Create new collection
|
||||
if (input.Name is null)
|
||||
{
|
||||
throw new SpeckleException("New collections must have a name");
|
||||
}
|
||||
|
||||
var collection = new Collection(input.Name) { elements = input.Elements ?? new List<Base>() };
|
||||
var result = new CreateCollectionComponentOutput(collection);
|
||||
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
else
|
||||
{
|
||||
var collection = new Collection(input.Collection.name) { elements = input.Collection.elements };
|
||||
|
||||
// Create new collection
|
||||
if (input.Name is not null && input.Name.Length != 0)
|
||||
{
|
||||
collection.name = input.Name;
|
||||
}
|
||||
var elements = new List<Base>();
|
||||
if (input.Elements is not null && input.Elements.Count != 0)
|
||||
{
|
||||
elements.AddRange(input.Elements);
|
||||
}
|
||||
else
|
||||
{
|
||||
elements.AddRange(collection.elements.Where(e => e is not Collection));
|
||||
}
|
||||
|
||||
if (input.Collections is not null && input.Collections.Count != 0)
|
||||
{
|
||||
elements.AddRange(input.Collections);
|
||||
}
|
||||
else
|
||||
{
|
||||
elements.AddRange(collection.elements.Where(e => e is Collection));
|
||||
}
|
||||
|
||||
var result = new CreateCollectionComponentOutput(collection);
|
||||
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
+257
@@ -0,0 +1,257 @@
|
||||
using System.Collections;
|
||||
using Grasshopper.Kernel;
|
||||
using Grasshopper.Kernel.Parameters;
|
||||
using Rhino.Display;
|
||||
using Rhino.Geometry;
|
||||
using Speckle.Connectors.Grasshopper8.HostApp;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components.Collections;
|
||||
|
||||
#pragma warning disable CA1711
|
||||
public class ExpandCollection : GH_Component, IGH_VariableParameterComponent
|
||||
#pragma warning restore CA1711
|
||||
{
|
||||
public override Guid ComponentGuid => new("69BC8CFB-A72F-4A83-9263-F3399DDA2E5E");
|
||||
|
||||
public ExpandCollection()
|
||||
: base("Expand Collection", "expand", "Expands a new collection", "Speckle", "Collections") { }
|
||||
|
||||
protected override void RegisterInputParams(GH_InputParamManager pManager) =>
|
||||
pManager.AddGenericParameter("Collection", "C", "Collection to unpack", GH_ParamAccess.item);
|
||||
|
||||
protected override void RegisterOutputParams(GH_OutputParamManager pManager) { }
|
||||
|
||||
private List<SpeckleGrasshopperObject> _previewObjects = new();
|
||||
|
||||
protected override void SolveInstance(IGH_DataAccess da)
|
||||
{
|
||||
Collection res = new();
|
||||
da.GetData("Collection", ref res);
|
||||
var c = res;
|
||||
|
||||
Name = c.name;
|
||||
NickName = c.name;
|
||||
|
||||
var objects = c.elements.Where(el => el is not Collection).OfType<SpeckleGrasshopperObject>().ToList();
|
||||
var collections = c.elements.Where(el => el is Collection).OfType<Collection>().ToList();
|
||||
|
||||
var outputParams = new List<OutputParamWrapper>();
|
||||
if (objects.Count != 0)
|
||||
{
|
||||
var param = new Param_GenericObject()
|
||||
{
|
||||
Name = "Inner objects",
|
||||
NickName = "OBJS",
|
||||
Description =
|
||||
"Some collections may contain a mix of objects and other collections. Here we output the atomic objects from within this collection.",
|
||||
Access = GH_ParamAccess.list // NOTE: todo check on list if it's tree path-based
|
||||
};
|
||||
|
||||
outputParams.Add(new OutputParamWrapper(param, objects));
|
||||
}
|
||||
|
||||
foreach (var collection in collections)
|
||||
{
|
||||
// skip empty
|
||||
if (collection.elements.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var hasInnerCollections = collection.elements.Any(el => el is Collection);
|
||||
var isPathBasedCollection = collection["treePath"] as string; // Note: this is a reminder for the future
|
||||
var nickName = collection.name;
|
||||
if (collection.name.Length > 12)
|
||||
{
|
||||
nickName = collection.name[..3];
|
||||
nickName += "..." + collection.name[^3..];
|
||||
}
|
||||
|
||||
var param = new Param_GenericObject()
|
||||
{
|
||||
Name = collection.name,
|
||||
NickName = nickName,
|
||||
Access = hasInnerCollections ? GH_ParamAccess.item : GH_ParamAccess.list // we will directly set objects out; note access can be list or tree based on whether it will be a path based collection
|
||||
};
|
||||
if (!hasInnerCollections)
|
||||
{
|
||||
_previewObjects.AddRange(collection.elements.Cast<SpeckleGrasshopperObject>());
|
||||
}
|
||||
outputParams.Add(new OutputParamWrapper(param, hasInnerCollections ? collection : collection.elements));
|
||||
}
|
||||
|
||||
if (da.Iteration == 0 && OutputMismatch(outputParams))
|
||||
{
|
||||
OnPingDocument()
|
||||
.ScheduleSolution(
|
||||
5,
|
||||
_ =>
|
||||
{
|
||||
CreateOutputs(outputParams);
|
||||
}
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
_previewObjects = new();
|
||||
|
||||
FlattenForPreview(c);
|
||||
for (int i = 0; i < outputParams.Count; i++)
|
||||
{
|
||||
var outParam = Params.Output[i];
|
||||
switch (outParam.Access)
|
||||
{
|
||||
case GH_ParamAccess.item:
|
||||
da.SetData(i, outputParams[i].Values);
|
||||
break;
|
||||
case GH_ParamAccess.list:
|
||||
da.SetDataList(i, outputParams[i].Values as IList);
|
||||
break;
|
||||
case GH_ParamAccess.tree:
|
||||
//TODO: means we need to convert the collection to a tree
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void FlattenForPreview(Collection c)
|
||||
{
|
||||
foreach (var element in c.elements)
|
||||
{
|
||||
if (element is Collection subCol)
|
||||
{
|
||||
FlattenForPreview(subCol);
|
||||
}
|
||||
|
||||
if (element is SpeckleGrasshopperObject sg)
|
||||
{
|
||||
_previewObjects.Add(sg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// public override void DrawViewportWires(IGH_PreviewArgs args) => base.DrawViewportWires(args);
|
||||
public override void DrawViewportMeshes(IGH_PreviewArgs args)
|
||||
{
|
||||
if (_previewObjects.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var isSelected = args.Document.SelectedObjects().Contains(this);
|
||||
|
||||
using var displayMat = new DisplayMaterial(Color.CornflowerBlue, 0.1); // note can be coming from the actual render mat
|
||||
|
||||
foreach (var elem in _previewObjects)
|
||||
{
|
||||
switch (elem.GeometryBase)
|
||||
{
|
||||
case Mesh m:
|
||||
args.Display.DrawMeshShaded(m, isSelected ? args.ShadeMaterial_Selected : args.ShadeMaterial);
|
||||
break;
|
||||
case Brep b:
|
||||
args.Display.DrawBrepShaded(b, isSelected ? args.ShadeMaterial_Selected : args.ShadeMaterial);
|
||||
args.Display.DrawBrepWires(
|
||||
b,
|
||||
isSelected ? args.WireColour_Selected : args.WireColour,
|
||||
args.DefaultCurveThickness
|
||||
);
|
||||
break;
|
||||
case Extrusion e:
|
||||
args.Display.DrawMeshShaded(
|
||||
e.GetMesh(MeshType.Any),
|
||||
isSelected ? args.ShadeMaterial_Selected : args.ShadeMaterial
|
||||
);
|
||||
break;
|
||||
case SubD d:
|
||||
args.Display.DrawSubDShaded(d, isSelected ? args.ShadeMaterial_Selected : args.ShadeMaterial);
|
||||
args.Display.DrawSubDWires(
|
||||
d,
|
||||
isSelected ? args.WireColour_Selected : args.WireColour,
|
||||
args.DefaultCurveThickness
|
||||
);
|
||||
break;
|
||||
case Curve c:
|
||||
args.Display.DrawCurve(
|
||||
c,
|
||||
isSelected ? args.WireColour_Selected : args.WireColour,
|
||||
args.DefaultCurveThickness
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool OutputMismatch(List<OutputParamWrapper> outputParams)
|
||||
{
|
||||
if (Params.Output.Count != outputParams.Count)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
var count = 0;
|
||||
foreach (var newParam in outputParams)
|
||||
{
|
||||
var oldParam = Params.Output[count];
|
||||
if (
|
||||
oldParam.NickName != newParam.Param.NickName
|
||||
|| oldParam.Name != newParam.Param.Name
|
||||
|| oldParam.Access != newParam.Param.Access
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void CreateOutputs(List<OutputParamWrapper> outputParams)
|
||||
{
|
||||
while (Params.Output.Count > 0)
|
||||
{
|
||||
Params.UnregisterOutputParameter(Params.Output[^1]);
|
||||
}
|
||||
|
||||
foreach (var newParam in outputParams)
|
||||
{
|
||||
var param = new Param_GenericObject
|
||||
{
|
||||
Name = newParam.Param.Name,
|
||||
NickName = newParam.Param.NickName,
|
||||
MutableNickName = false,
|
||||
Access = newParam.Param.Access // count == 0 ? GH_ParamAccess.list : GH_ParamAccess.item, // TODO: objects should always be a list or a tree, depending on whether the collection is a gh collection with a path prop
|
||||
};
|
||||
Params.RegisterOutputParam(param);
|
||||
}
|
||||
|
||||
Params.OnParametersChanged();
|
||||
VariableParameterMaintenance();
|
||||
ExpireSolution(false);
|
||||
}
|
||||
|
||||
public void VariableParameterMaintenance() { }
|
||||
|
||||
public bool CanInsertParameter(GH_ParameterSide side, int index) => false;
|
||||
|
||||
public bool CanRemoveParameter(GH_ParameterSide side, int index) => false;
|
||||
|
||||
public IGH_Param CreateParameter(GH_ParameterSide side, int index)
|
||||
{
|
||||
var myParam = new Param_GenericObject
|
||||
{
|
||||
Name = GH_ComponentParamServer.InventUniqueNickname("ABCD", Params.Input),
|
||||
MutableNickName = true,
|
||||
Optional = true
|
||||
};
|
||||
myParam.NickName = myParam.Name;
|
||||
return myParam;
|
||||
}
|
||||
|
||||
public bool DestroyParameter(GH_ParameterSide side, int index) => side == GH_ParameterSide.Output;
|
||||
}
|
||||
|
||||
public record OutputParamWrapper(Param_GenericObject Param, object Values);
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Rhino.Geometry;
|
||||
using Speckle.Connectors.Grasshopper8.HostApp;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components.Collections;
|
||||
|
||||
#pragma warning disable CA1711
|
||||
public class FlattenCollection : GH_Component
|
||||
#pragma warning restore CA1711
|
||||
{
|
||||
public override Guid ComponentGuid => new Guid("720ED4BE-BA4B-4E85-8220-412B3DA1D2B7");
|
||||
|
||||
public FlattenCollection()
|
||||
: base("Flatten Collection", "flatten", "Flattens a collection into objects and paths", "Speckle", "Collections")
|
||||
{ }
|
||||
|
||||
protected override void RegisterInputParams(GH_InputParamManager pManager)
|
||||
{
|
||||
pManager.AddGenericParameter("Collection", "C", "Collection to unpack", GH_ParamAccess.item);
|
||||
}
|
||||
|
||||
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
|
||||
{
|
||||
pManager.AddGenericParameter("Objects", "O", "Objects", GH_ParamAccess.list);
|
||||
pManager.AddGenericParameter("Paths", "P", "Collection paths", GH_ParamAccess.list);
|
||||
}
|
||||
|
||||
protected override void SolveInstance(IGH_DataAccess dataAccess)
|
||||
{
|
||||
Collection res = new();
|
||||
dataAccess.GetData("Collection", ref res);
|
||||
|
||||
_sgos = new();
|
||||
Flatten(res);
|
||||
var paths = new List<string>();
|
||||
var objs = new List<GeometryBase>();
|
||||
foreach (var sg in _sgos)
|
||||
{
|
||||
var path = string.Join("::", sg.Path.Select(c => c.name));
|
||||
paths.Add(path);
|
||||
objs.Add(sg.GeometryBase);
|
||||
}
|
||||
|
||||
dataAccess.SetDataList(0, objs);
|
||||
dataAccess.SetDataList(1, paths);
|
||||
}
|
||||
|
||||
private List<SpeckleGrasshopperObject> _sgos = new();
|
||||
|
||||
public void Flatten(Collection c)
|
||||
{
|
||||
foreach (var element in c.elements)
|
||||
{
|
||||
if (element is Collection subCol)
|
||||
{
|
||||
Flatten(subCol);
|
||||
}
|
||||
|
||||
if (element is SpeckleGrasshopperObject sg)
|
||||
{
|
||||
_sgos.Add(sg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+195
@@ -0,0 +1,195 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Speckle.Connectors.Common.Conversion;
|
||||
using Speckle.Connectors.Common.Instances;
|
||||
using Speckle.Connectors.Common.Operations.Receive;
|
||||
using Speckle.Connectors.Grasshopper8.Components.BaseComponents;
|
||||
using Speckle.Connectors.Grasshopper8.Parameters;
|
||||
using Speckle.Sdk;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
using Speckle.Sdk.Models.Instances;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components.Collections;
|
||||
|
||||
public record UnpackRootObjectComponentInput(Base RootObject) { }
|
||||
|
||||
public record UnpackRootObjectComponentOutput(
|
||||
List<Base> Elements,
|
||||
List<string> ElementPaths,
|
||||
List<IInstanceComponent> Instances,
|
||||
List<string> InstancePaths
|
||||
) { }
|
||||
|
||||
public class UnpackRootObjectComponent
|
||||
: SpeckleScopedTaskCapableComponent<UnpackRootObjectComponentInput, UnpackRootObjectComponentOutput>
|
||||
{
|
||||
public UnpackRootObjectComponent()
|
||||
: base("Unpack Root Object", "SURO", "Unpacks the root object from a receive operation", "Speckle", "Collections")
|
||||
{ }
|
||||
|
||||
public override Guid ComponentGuid => new Guid("3C770686-20D5-434C-99E3-BDE735E8267F");
|
||||
|
||||
protected override void RegisterInputParams(GH_InputParamManager pManager)
|
||||
{
|
||||
pManager.AddParameter(new SpeckleObjectParam(GH_ParamAccess.item));
|
||||
}
|
||||
|
||||
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
|
||||
{
|
||||
pManager.AddTextParameter("Element Paths", "EP", "Path to the element in the collection tree", GH_ParamAccess.list);
|
||||
pManager.AddParameter(new SpeckleObjectParam(), "Elements", "E", "Elements", GH_ParamAccess.list);
|
||||
pManager.AddTextParameter(
|
||||
"Instance Paths",
|
||||
"IP",
|
||||
"Path to the instance in the collection tree",
|
||||
GH_ParamAccess.list
|
||||
);
|
||||
pManager.AddParameter(new SpeckleObjectParam(), "Instances", "I", "Instances", GH_ParamAccess.list);
|
||||
}
|
||||
|
||||
protected override UnpackRootObjectComponentInput GetInput(IGH_DataAccess da)
|
||||
{
|
||||
Base? baseObject = null;
|
||||
da.GetData(0, ref baseObject);
|
||||
if (baseObject == null)
|
||||
{
|
||||
throw new SpeckleException("No base object provided");
|
||||
}
|
||||
return new UnpackRootObjectComponentInput(baseObject);
|
||||
}
|
||||
|
||||
protected override void SetOutput(IGH_DataAccess da, UnpackRootObjectComponentOutput result)
|
||||
{
|
||||
da.SetDataList(0, result.ElementPaths);
|
||||
da.SetDataList(1, result.Elements);
|
||||
da.SetDataList(2, result.InstancePaths);
|
||||
da.SetDataList(3, result.Instances);
|
||||
}
|
||||
|
||||
protected override async Task<UnpackRootObjectComponentOutput> PerformScopedTask(
|
||||
UnpackRootObjectComponentInput input,
|
||||
IServiceScope scope,
|
||||
CancellationToken cancellationToken = default
|
||||
)
|
||||
{
|
||||
var rootObjectUnpacker = scope.ServiceProvider.GetRequiredService<RootObjectUnpacker>();
|
||||
var contextUnpacker = scope.ServiceProvider.GetRequiredService<TraversalContextUnpacker>();
|
||||
|
||||
var unpackedRoot = rootObjectUnpacker.Unpack(input.RootObject);
|
||||
|
||||
// 2 - Split atomic objects and instance components with their path
|
||||
var (atomicObjects, instanceComponents) = rootObjectUnpacker.SplitAtomicObjectsAndInstances(
|
||||
unpackedRoot.ObjectsToConvert
|
||||
);
|
||||
|
||||
var atomicObjectsWithPath = contextUnpacker.GetAtomicObjectsWithPath(atomicObjects);
|
||||
var instanceComponentsWithPath = contextUnpacker.GetInstanceComponentsWithPath(instanceComponents);
|
||||
|
||||
// 2.1 - these are not captured by traversal, so we need to re-add them here
|
||||
if (unpackedRoot.DefinitionProxies != null && unpackedRoot.DefinitionProxies.Count > 0)
|
||||
{
|
||||
var transformed = unpackedRoot.DefinitionProxies.Select(proxy =>
|
||||
(Array.Empty<Collection>(), proxy as IInstanceComponent)
|
||||
);
|
||||
instanceComponentsWithPath.AddRange(transformed);
|
||||
}
|
||||
|
||||
var applicationIdMap = new Dictionary<string, Base>();
|
||||
atomicObjectsWithPath.ForEach(a => applicationIdMap.Add(a.current.applicationId ?? a.current.id, a.current));
|
||||
|
||||
var instanceResult = await ProcessInstances(instanceComponentsWithPath, applicationIdMap).ConfigureAwait(false);
|
||||
|
||||
foreach (string objId in instanceResult.ConsumedObjectIds)
|
||||
{
|
||||
var indexAtomic = atomicObjectsWithPath.FindIndex(o => o.current.id == objId);
|
||||
if (indexAtomic != -1)
|
||||
{
|
||||
atomicObjectsWithPath.RemoveAt(indexAtomic);
|
||||
}
|
||||
// HACK: Why is instancecomponent not ISpeckleObject?
|
||||
var indexInstance = instanceComponentsWithPath.FindIndex(o => ((Base)o.instance).id == objId);
|
||||
if (indexInstance != -1)
|
||||
{
|
||||
instanceComponentsWithPath.RemoveAt(indexInstance);
|
||||
}
|
||||
}
|
||||
|
||||
var elements = new List<Base>();
|
||||
var instances = new List<IInstanceComponent>();
|
||||
var elementPaths = new List<string>();
|
||||
var instancePaths = new List<string>();
|
||||
|
||||
atomicObjectsWithPath.ForEach(atomicObj =>
|
||||
{
|
||||
var names = atomicObj.path.Select(p => p.name);
|
||||
elements.Add(atomicObj.current);
|
||||
elementPaths.Add(string.Join("::", names));
|
||||
});
|
||||
|
||||
instanceComponentsWithPath.ForEach(instanceObj =>
|
||||
{
|
||||
var names = instanceObj.path.Select(p => p.name);
|
||||
instances.Add(instanceObj.instance);
|
||||
instancePaths.Add(string.Join("::", names));
|
||||
});
|
||||
|
||||
var output = new UnpackRootObjectComponentOutput(elements, elementPaths, instances, instancePaths);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
public Task<BakeResult> ProcessInstances(
|
||||
IReadOnlyCollection<(Collection[] collectionPath, IInstanceComponent obj)> instanceComponents,
|
||||
Dictionary<string, Base> applicationIdMap
|
||||
)
|
||||
{
|
||||
var sortedInstanceComponents = instanceComponents
|
||||
.OrderByDescending(x => x.obj.maxDepth) // Sort by max depth, so we start baking from the deepest element first
|
||||
.ThenBy(x => x.obj is InstanceDefinitionProxy ? 0 : 1) // Ensure we bake the deepest definition first, then any instances that depend on it
|
||||
.ToList();
|
||||
|
||||
var definitionObjectsMap = new Dictionary<string, (InstanceDefinitionProxy, List<Base>)>();
|
||||
|
||||
var consumedObjectIds = new List<string>();
|
||||
foreach (var (layerCollection, instanceOrDefinition) in sortedInstanceComponents)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (instanceOrDefinition is InstanceDefinitionProxy definitionProxy)
|
||||
{
|
||||
var currentSpeckleObjects = definitionProxy
|
||||
.objects.Where(applicationIdMap.ContainsKey)
|
||||
.Select(x => applicationIdMap[x])
|
||||
.ToList();
|
||||
|
||||
definitionObjectsMap.Add(
|
||||
definitionProxy.applicationId ?? definitionProxy.id,
|
||||
(definitionProxy, currentSpeckleObjects)
|
||||
);
|
||||
|
||||
consumedObjectIds.AddRange(currentSpeckleObjects.Select(o => o.id));
|
||||
consumedObjectIds.Add(definitionProxy.id);
|
||||
}
|
||||
|
||||
if (
|
||||
instanceOrDefinition is InstanceProxy instanceProxy
|
||||
&& definitionObjectsMap.TryGetValue(instanceProxy.definitionId, out var definition)
|
||||
)
|
||||
{
|
||||
instanceProxy["__geometry"] = definition.Item2;
|
||||
instanceProxy["__definition"] = definition.Item1;
|
||||
applicationIdMap[instanceProxy.applicationId ?? instanceProxy.id] = instanceProxy;
|
||||
}
|
||||
}
|
||||
catch (Exception ex) when (!ex.IsFatal())
|
||||
{
|
||||
//_logger.LogError(ex, "Failed to create an instance from proxy");
|
||||
}
|
||||
}
|
||||
|
||||
//await Task.Yield();
|
||||
BakeResult processInstances = new(new List<string>(), consumedObjectIds, new List<ReceiveConversionResult>());
|
||||
return Task.FromResult(processInstances);
|
||||
}
|
||||
}
|
||||
+156
@@ -0,0 +1,156 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Rhino;
|
||||
using Rhino.Geometry;
|
||||
using Speckle.Connectors.Grasshopper8.Components.BaseComponents;
|
||||
using Speckle.Connectors.Grasshopper8.Parameters;
|
||||
using Speckle.Converters.Common;
|
||||
using Speckle.Converters.Rhino;
|
||||
using Speckle.DoubleNumerics;
|
||||
using Speckle.Sdk;
|
||||
using Speckle.Sdk.Common;
|
||||
using Speckle.Sdk.Common.Exceptions;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Models.Instances;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components.Operations.Conversion;
|
||||
|
||||
public static class RhinoUnitsExtension
|
||||
{
|
||||
public static string ToSpeckleString(this UnitSystem unitSystem)
|
||||
{
|
||||
switch (unitSystem)
|
||||
{
|
||||
case UnitSystem.None:
|
||||
return Units.Meters;
|
||||
case UnitSystem.Millimeters:
|
||||
return Units.Millimeters;
|
||||
case UnitSystem.Centimeters:
|
||||
return Units.Centimeters;
|
||||
case UnitSystem.Meters:
|
||||
return Units.Meters;
|
||||
case UnitSystem.Kilometers:
|
||||
return Units.Kilometers;
|
||||
case UnitSystem.Inches:
|
||||
return Units.Inches;
|
||||
case UnitSystem.Feet:
|
||||
return Units.Feet;
|
||||
case UnitSystem.Yards:
|
||||
return Units.Yards;
|
||||
case UnitSystem.Miles:
|
||||
return Units.Miles;
|
||||
case UnitSystem.Unset:
|
||||
return Units.Meters;
|
||||
default:
|
||||
throw new UnitNotSupportedException($"The Unit System \"{unitSystem}\" is unsupported.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ToNativeConversion()
|
||||
: SpeckleScopedTaskCapableComponent<Base, List<GeometryBase>>(
|
||||
"ToNativeConversion",
|
||||
"STN",
|
||||
"Converts a speckle object to rhino",
|
||||
"Speckle",
|
||||
"Conversion"
|
||||
)
|
||||
{
|
||||
public override Guid ComponentGuid => new Guid("38BAB10C-4D80-4E0C-8235-A87C3E66F55F");
|
||||
|
||||
protected override void RegisterInputParams(GH_InputParamManager pManager)
|
||||
{
|
||||
pManager.AddParameter(new SpeckleObjectParam(GH_ParamAccess.item));
|
||||
}
|
||||
|
||||
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
|
||||
{
|
||||
pManager.AddGeometryParameter("Geometry", "Geometry", "Geometry", GH_ParamAccess.list);
|
||||
}
|
||||
|
||||
protected override Base GetInput(IGH_DataAccess da)
|
||||
{
|
||||
Base? input = null;
|
||||
if (!da.GetData(0, ref input) || input is null)
|
||||
{
|
||||
throw new SpeckleException("Input is not valid");
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
protected override void SetOutput(IGH_DataAccess da, List<GeometryBase> result)
|
||||
{
|
||||
da.SetDataList(0, result);
|
||||
}
|
||||
|
||||
protected override Task<List<GeometryBase>> PerformScopedTask(
|
||||
Base input,
|
||||
IServiceScope scope,
|
||||
CancellationToken cancellationToken = default
|
||||
)
|
||||
{
|
||||
var rhinoConversionSettingsFactory = scope.ServiceProvider.GetRequiredService<IRhinoConversionSettingsFactory>();
|
||||
|
||||
scope
|
||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<RhinoConversionSettings>>()
|
||||
.Initialize(rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
|
||||
|
||||
var rootConverter = scope.ServiceProvider.GetRequiredService<IRootToHostConverter>();
|
||||
|
||||
if (input is InstanceProxy proxy)
|
||||
{
|
||||
var geometries = proxy["__geometry"] as List<Base>;
|
||||
var converted = geometries.SelectMany(g => Convert(g, rootConverter)).ToList();
|
||||
var transform = MatrixToTransform(proxy.transform, proxy.units);
|
||||
converted.ForEach(c => c.Transform(transform));
|
||||
return Task.FromResult(converted);
|
||||
}
|
||||
|
||||
return Task.FromResult(Convert(input, rootConverter));
|
||||
}
|
||||
|
||||
private List<GeometryBase> Convert(Base input, IRootToHostConverter rootConverter)
|
||||
{
|
||||
var result = rootConverter.Convert(input);
|
||||
|
||||
if (result is GeometryBase geometry)
|
||||
{
|
||||
return new List<GeometryBase> { geometry };
|
||||
}
|
||||
else if (result is List<GeometryBase> geometryList)
|
||||
{
|
||||
return geometryList;
|
||||
}
|
||||
|
||||
throw new SpeckleException("Failed to convert input to rhino");
|
||||
}
|
||||
|
||||
private Transform MatrixToTransform(Matrix4x4 matrix, string units)
|
||||
{
|
||||
var currentDoc = RhinoDoc.ActiveDoc; // POC: too much right now to interface around
|
||||
var conversionFactor = Units.GetConversionFactor(units, currentDoc.ModelUnitSystem.ToSpeckleString());
|
||||
|
||||
var t = Transform.Identity;
|
||||
t.M00 = matrix.M11;
|
||||
t.M01 = matrix.M12;
|
||||
t.M02 = matrix.M13;
|
||||
t.M03 = matrix.M14 * conversionFactor;
|
||||
|
||||
t.M10 = matrix.M21;
|
||||
t.M11 = matrix.M22;
|
||||
t.M12 = matrix.M23;
|
||||
t.M13 = matrix.M24 * conversionFactor;
|
||||
|
||||
t.M20 = matrix.M31;
|
||||
t.M21 = matrix.M32;
|
||||
t.M22 = matrix.M33;
|
||||
t.M23 = matrix.M34 * conversionFactor;
|
||||
|
||||
t.M30 = matrix.M41;
|
||||
t.M31 = matrix.M42;
|
||||
t.M32 = matrix.M43;
|
||||
t.M33 = matrix.M44;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
+253
@@ -0,0 +1,253 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Rhino;
|
||||
using Rhino.Geometry;
|
||||
using Speckle.Connectors.Common.Instances;
|
||||
using Speckle.Connectors.Common.Operations;
|
||||
using Speckle.Connectors.Common.Operations.Receive;
|
||||
using Speckle.Connectors.Grasshopper8.Components.BaseComponents;
|
||||
using Speckle.Connectors.Grasshopper8.Components.Operations.Conversion;
|
||||
using Speckle.Connectors.Grasshopper8.HostApp;
|
||||
using Speckle.Connectors.Grasshopper8.Parameters;
|
||||
using Speckle.Converters.Common;
|
||||
using Speckle.Converters.Rhino;
|
||||
using Speckle.DoubleNumerics;
|
||||
using Speckle.Sdk;
|
||||
using Speckle.Sdk.Api;
|
||||
using Speckle.Sdk.Common;
|
||||
using Speckle.Sdk.Common.Exceptions;
|
||||
using Speckle.Sdk.Credentials;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components.Operations.Receive;
|
||||
|
||||
public class ReceiveComponentOutput
|
||||
{
|
||||
public Collection RootObject { get; set; }
|
||||
}
|
||||
|
||||
public class ReceiveComponent : SpeckleScopedTaskCapableComponent<SpeckleUrlModelResource, ReceiveComponentOutput>
|
||||
{
|
||||
public ReceiveComponent()
|
||||
: base("Receive from Speckle", "RFS", "Receive objects from speckle", "Speckle", "Operations") { }
|
||||
|
||||
public override Guid ComponentGuid => new("74954F59-B1B7-41FD-97DE-4C6B005F2801");
|
||||
protected override Bitmap Icon => BitmapBuilder.CreateSquareIconBitmap("R");
|
||||
|
||||
protected override void RegisterInputParams(GH_InputParamManager pManager)
|
||||
{
|
||||
pManager.AddParameter(new SpeckleUrlModelResourceParam(GH_ParamAccess.item));
|
||||
}
|
||||
|
||||
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
|
||||
{
|
||||
pManager.AddParameter(
|
||||
new SpeckleObjectParam(GH_ParamAccess.item),
|
||||
"Model",
|
||||
"model",
|
||||
"The model object for the received version",
|
||||
GH_ParamAccess.item
|
||||
);
|
||||
}
|
||||
|
||||
protected override SpeckleUrlModelResource GetInput(IGH_DataAccess da)
|
||||
{
|
||||
SpeckleUrlModelResource? url = null;
|
||||
da.GetData(0, ref url);
|
||||
if (url is null)
|
||||
{
|
||||
throw new SpeckleException("Speckle url is null");
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
protected override void SetOutput(IGH_DataAccess da, ReceiveComponentOutput result)
|
||||
{
|
||||
da.SetData(0, result.RootObject);
|
||||
Message = "Done";
|
||||
}
|
||||
|
||||
protected override async Task<ReceiveComponentOutput> PerformScopedTask(
|
||||
SpeckleUrlModelResource input,
|
||||
IServiceScope scope,
|
||||
CancellationToken cancellationToken = default
|
||||
)
|
||||
{
|
||||
// TODO: Resolving dependencies here may be overkill in most cases. Must re-evaluate.
|
||||
var rhinoConversionSettingsFactory = scope.ServiceProvider.GetRequiredService<IRhinoConversionSettingsFactory>();
|
||||
scope
|
||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<RhinoConversionSettings>>()
|
||||
.Initialize(rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
|
||||
|
||||
var rootConverter = scope.ServiceProvider.GetService<IRootToHostConverter>();
|
||||
|
||||
var accountManager = scope.ServiceProvider.GetRequiredService<AccountService>();
|
||||
var clientFactory = scope.ServiceProvider.GetRequiredService<IClientFactory>();
|
||||
var receiveOperation = scope.ServiceProvider.GetRequiredService<GrasshopperReceiveOperation>();
|
||||
|
||||
// Do the thing 👇🏼
|
||||
|
||||
// TODO: Get any account for this server, as we don't have a mechanism yet to pass accountIds through
|
||||
var account = accountManager.GetAccountWithServerUrlFallback("", new Uri(input.Server));
|
||||
|
||||
if (account is null)
|
||||
{
|
||||
throw new SpeckleAccountManagerException($"No default account was found");
|
||||
}
|
||||
|
||||
using var client = clientFactory.Create(account);
|
||||
var receiveInfo = await input.GetReceiveInfo(client, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
var progress = new Progress<CardProgress>(_ =>
|
||||
{
|
||||
// TODO: Progress only makes sense in non-blocking async receive, which is not supported yet.
|
||||
// Message = $"{progress.Status}: {progress.Progress}";
|
||||
});
|
||||
|
||||
var root = await receiveOperation
|
||||
.ReceiveCommitObject(receiveInfo, progress, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
// We need to rething these lovely unpackers, there's a bit too many of 'em
|
||||
var rootObjectUnpacker = scope.ServiceProvider.GetService<RootObjectUnpacker>();
|
||||
var localToGlobalUnpacker = new LocalToGlobalUnpacker();
|
||||
var traversalContextUnpacker = new TraversalContextUnpacker();
|
||||
|
||||
var unpackedRoot = rootObjectUnpacker.Unpack(root);
|
||||
var localToGlobalMaps = localToGlobalUnpacker.Unpack(
|
||||
unpackedRoot.DefinitionProxies,
|
||||
unpackedRoot.ObjectsToConvert.ToList()
|
||||
);
|
||||
|
||||
var collGen = new CollectionRebuilder((root as Collection) ?? new Collection() { name = "unnamed" });
|
||||
var results = new List<SpeckleGrasshopperObject>();
|
||||
foreach (var map in localToGlobalMaps)
|
||||
{
|
||||
try
|
||||
{
|
||||
var converted = Convert(map.AtomicObject, rootConverter);
|
||||
var path = traversalContextUnpacker.GetCollectionPath(map.TraversalContext).ToList();
|
||||
|
||||
foreach (var matrix in map.Matrix)
|
||||
{
|
||||
var mat = MatrixToTransform(matrix, "meters");
|
||||
converted.ForEach(res => res.Transform(mat));
|
||||
}
|
||||
|
||||
foreach (var geometryBase in converted)
|
||||
{
|
||||
var gh = new SpeckleGrasshopperObject()
|
||||
{
|
||||
OriginalObject = map.AtomicObject,
|
||||
Path = path,
|
||||
GeometryBase = geometryBase
|
||||
};
|
||||
collGen.AppendSpeckleGrasshopperObject(gh);
|
||||
}
|
||||
}
|
||||
catch (ConversionException)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
// var x = new SpeckleCollectionGoo { Value = collGen.RootCollection };
|
||||
return new ReceiveComponentOutput { RootObject = collGen.RootCollection };
|
||||
}
|
||||
|
||||
private List<GeometryBase> Convert(Base input, IRootToHostConverter rootConverter)
|
||||
{
|
||||
var result = rootConverter.Convert(input);
|
||||
|
||||
if (result is GeometryBase geometry)
|
||||
{
|
||||
return new List<GeometryBase> { geometry };
|
||||
}
|
||||
else if (result is List<GeometryBase> geometryList)
|
||||
{
|
||||
return geometryList;
|
||||
}
|
||||
else if (result is IEnumerable<(object, Base)> fallbackConversionResult)
|
||||
{
|
||||
// note special handling for proxying render materials OR we don't care about revit
|
||||
return fallbackConversionResult.Select(t => t.Item1).Cast<GeometryBase>().ToList();
|
||||
}
|
||||
|
||||
throw new SpeckleException("Failed to convert input to rhino");
|
||||
}
|
||||
|
||||
private Transform MatrixToTransform(Matrix4x4 matrix, string units)
|
||||
{
|
||||
var currentDoc = RhinoDoc.ActiveDoc; // POC: too much right now to interface around
|
||||
var conversionFactor = Units.GetConversionFactor(units, currentDoc.ModelUnitSystem.ToSpeckleString());
|
||||
|
||||
var t = Transform.Identity;
|
||||
t.M00 = matrix.M11;
|
||||
t.M01 = matrix.M12;
|
||||
t.M02 = matrix.M13;
|
||||
t.M03 = matrix.M14 * conversionFactor;
|
||||
|
||||
t.M10 = matrix.M21;
|
||||
t.M11 = matrix.M22;
|
||||
t.M12 = matrix.M23;
|
||||
t.M13 = matrix.M24 * conversionFactor;
|
||||
|
||||
t.M20 = matrix.M31;
|
||||
t.M21 = matrix.M32;
|
||||
t.M22 = matrix.M33;
|
||||
t.M23 = matrix.M34 * conversionFactor;
|
||||
|
||||
t.M30 = matrix.M41;
|
||||
t.M31 = matrix.M42;
|
||||
t.M32 = matrix.M43;
|
||||
t.M33 = matrix.M44;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE: We will need GrasshopperCollections (with an extra path element)
|
||||
// these will need to be handled now
|
||||
public class CollectionRebuilder
|
||||
{
|
||||
public Collection RootCollection { get; }
|
||||
|
||||
private readonly Dictionary<string, Collection> _cache = new();
|
||||
|
||||
public CollectionRebuilder(Collection baseCollection)
|
||||
{
|
||||
RootCollection = new Collection() { name = baseCollection.name, applicationId = baseCollection.applicationId };
|
||||
}
|
||||
|
||||
public void AppendSpeckleGrasshopperObject(SpeckleGrasshopperObject speckleGrasshopperObject)
|
||||
{
|
||||
// TODO
|
||||
var collection = GetOrCreateCollectionFromPath(speckleGrasshopperObject.Path);
|
||||
collection.elements.Add(speckleGrasshopperObject);
|
||||
}
|
||||
|
||||
public Collection GetOrCreateCollectionFromPath(IEnumerable<Collection> path)
|
||||
{
|
||||
// TODO - this flows but it can be optimised (ie, concat path first, check cache, iterate only if not in cache)
|
||||
var currentLayerName = "";
|
||||
Collection previousCollection = RootCollection;
|
||||
foreach (var collection in path)
|
||||
{
|
||||
currentLayerName += collection.name;
|
||||
if (_cache.TryGetValue(currentLayerName, out Collection col))
|
||||
{
|
||||
previousCollection = col;
|
||||
continue;
|
||||
}
|
||||
|
||||
var newCollection = new Collection() { name = collection.name };
|
||||
_cache[currentLayerName] = newCollection;
|
||||
previousCollection.elements.Add(newCollection);
|
||||
|
||||
previousCollection = newCollection;
|
||||
}
|
||||
|
||||
return previousCollection;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Rhino;
|
||||
using Rhino.Geometry;
|
||||
using Speckle.Connectors.Common.Operations;
|
||||
using Speckle.Connectors.Grasshopper8.HostApp;
|
||||
using Speckle.Converters.Common;
|
||||
using Speckle.Converters.Rhino;
|
||||
using Speckle.Sdk.Common;
|
||||
using Speckle.Sdk.Credentials;
|
||||
using Speckle.Sdk.Models;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components;
|
||||
|
||||
public class SpeckleFirstComponent : GH_TaskCapableComponent<List<object?>>
|
||||
{
|
||||
private readonly AccountManager _accountManager;
|
||||
|
||||
/// <summary>
|
||||
/// Each implementation of GH_Component must provide a public
|
||||
/// constructor without any arguments.
|
||||
/// Category represents the Tab in which the component will appear,
|
||||
/// Subcategory the panel. If you use non-existing tab or panel names,
|
||||
/// new tabs/panels will automatically be created.
|
||||
/// </summary>
|
||||
public SpeckleFirstComponent()
|
||||
: base("First Speckle Component", "STP", "Sends objects to speckle", "Speckle", "Other")
|
||||
{
|
||||
_accountManager = PriorityLoader.Container.NotNull().GetRequiredService<AccountManager>();
|
||||
}
|
||||
|
||||
protected override void RegisterInputParams(GH_InputParamManager pManager)
|
||||
{
|
||||
pManager.AddTextParameter("Model/Version URL", "url", "The model or version url to receive", GH_ParamAccess.item);
|
||||
}
|
||||
|
||||
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
|
||||
{
|
||||
pManager.AddGenericParameter("Result", "R", "Result", GH_ParamAccess.item);
|
||||
}
|
||||
|
||||
protected override void SolveInstance(IGH_DataAccess da)
|
||||
{
|
||||
if (InPreSolve)
|
||||
{
|
||||
// Collect the data and create the task
|
||||
string url = GetInput(da);
|
||||
Message = "Receiving...";
|
||||
TaskList.Add(PerformReceiveOperation(url, CancelToken));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!GetSolveResults(da, out List<object?> result))
|
||||
{
|
||||
// INFO: This will run synchronously. Useful for Rhino.Compute runs, but can also be enabled by user.
|
||||
string url = GetInput(da);
|
||||
var syncResult = PerformReceiveOperation(url).Result;
|
||||
SetOutput(da, syncResult);
|
||||
}
|
||||
|
||||
if (result is not null)
|
||||
{
|
||||
SetOutput(da, result);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetOutput(IGH_DataAccess da, List<object?> result)
|
||||
{
|
||||
da.SetDataList(0, result);
|
||||
Message = "Done";
|
||||
}
|
||||
|
||||
private string GetInput(IGH_DataAccess da)
|
||||
{
|
||||
string url = "";
|
||||
da.GetData(0, ref url);
|
||||
return url;
|
||||
}
|
||||
|
||||
private async Task<List<object?>> PerformReceiveOperation(string url, CancellationToken cancellationToken = default)
|
||||
{
|
||||
// TODO: URL Parsing must be done here
|
||||
Console.WriteLine($"Receiving from fake url, skipping input: {url}");
|
||||
|
||||
var account = _accountManager.GetDefaultAccount();
|
||||
if (account is null)
|
||||
{
|
||||
throw new SpeckleAccountManagerException($"No default account was found");
|
||||
}
|
||||
|
||||
var receiveInfo = new ReceiveInfo(
|
||||
account.id,
|
||||
new Uri(account.serverInfo.url),
|
||||
"2295cb26a0",
|
||||
"",
|
||||
"bd1fd98086",
|
||||
"",
|
||||
"832e036b91",
|
||||
""
|
||||
);
|
||||
|
||||
var progress = new Progress<CardProgress>(progress =>
|
||||
{
|
||||
// TODO: Progress only makes sense in non-blocking async receive, which is not supported yet.
|
||||
// Message = $"{progress.Status}: {progress.Progress}";
|
||||
});
|
||||
|
||||
using var scope = PriorityLoader.Container.CreateScope();
|
||||
IRhinoConversionSettingsFactory rhinoConversionSettingsFactory =
|
||||
scope.ServiceProvider.GetRequiredService<IRhinoConversionSettingsFactory>();
|
||||
|
||||
scope
|
||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<RhinoConversionSettings>>()
|
||||
.Initialize(rhinoConversionSettingsFactory.Create(RhinoDoc.ActiveDoc));
|
||||
|
||||
var receiveOperation = scope.ServiceProvider.GetRequiredService<ReceiveOperation>();
|
||||
var result = await receiveOperation.Execute(receiveInfo, progress, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
List<object?> results = new();
|
||||
// HACK: GrashhopperHostObjectBuilder returns a specific subclass that contains the result object as well.
|
||||
foreach (var conversionResult in result.ConversionResults)
|
||||
{
|
||||
if (conversionResult is not GrasshopperReceiveConversionResult ghConversionResult)
|
||||
{
|
||||
throw new NotSupportedException($"Unsupported conversion result type: {conversionResult}");
|
||||
}
|
||||
|
||||
//results.Add(ghConversionResult.Source);
|
||||
if (ghConversionResult.Result is GeometryBase geometryBase)
|
||||
{
|
||||
results.Add(geometryBase);
|
||||
}
|
||||
else if (ghConversionResult.Result is List<GeometryBase> geometryBases) // one to many raw encoding case
|
||||
{
|
||||
results.AddRange(geometryBases);
|
||||
}
|
||||
else if (ghConversionResult.Result is IEnumerable<(object, Base)> fallbackConversionResult) // one to many fallback conversion
|
||||
{
|
||||
results.AddRange(fallbackConversionResult.Select(o => o.Item1));
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public override Guid ComponentGuid => new Guid("c123402d-6b40-4619-bb3b-88eb3fc8bb7a");
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Speckle.Connectors.Grasshopper8.Components.BaseComponents;
|
||||
using Speckle.Connectors.Grasshopper8.HostApp;
|
||||
using Speckle.Connectors.Grasshopper8.Parameters;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Components;
|
||||
|
||||
public class SpeckleResourceFromUrlComponent : SpeckleTaskCapableComponent<string, SpeckleUrlModelResource[]>
|
||||
{
|
||||
public SpeckleResourceFromUrlComponent()
|
||||
: base("Speckle Resource From Url", "spcklUrl", "Speckle resource from url", "Speckle", "Resources") { }
|
||||
|
||||
public override Guid ComponentGuid => new("A55C74C6-D955-4822-84BB-2266A2B965EE");
|
||||
|
||||
protected override void RegisterInputParams(GH_InputParamManager pManager)
|
||||
{
|
||||
pManager.AddTextParameter("URL", "URL", "URL to send to resource", GH_ParamAccess.item);
|
||||
}
|
||||
|
||||
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
|
||||
{
|
||||
pManager.AddParameter(new SpeckleUrlModelResourceParam(GH_ParamAccess.list));
|
||||
}
|
||||
|
||||
protected override string GetInput(IGH_DataAccess da)
|
||||
{
|
||||
string url = string.Empty;
|
||||
da.GetData(0, ref url);
|
||||
return url;
|
||||
}
|
||||
|
||||
protected override void SetOutput(IGH_DataAccess da, SpeckleUrlModelResource[] result)
|
||||
{
|
||||
da.SetDataList(0, result);
|
||||
}
|
||||
|
||||
protected override Task<SpeckleUrlModelResource[]> PerformTask(
|
||||
string input,
|
||||
CancellationToken cancellationToken = default
|
||||
)
|
||||
{
|
||||
var resources = SpeckleResourceBuilder.FromUrlString(input);
|
||||
|
||||
// TODO: Here's where we can validate the resources and throw or not?
|
||||
|
||||
return Task.FromResult(resources);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
using System.Drawing.Drawing2D;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.HostApp;
|
||||
|
||||
public static class BitmapBuilder
|
||||
{
|
||||
public static Bitmap CreateSquareIconBitmap(string text, int width = 24, int height = 24)
|
||||
{
|
||||
Bitmap bitmap = new(width, height);
|
||||
using Graphics graphics = Graphics.FromImage(bitmap);
|
||||
|
||||
// Enable high-quality rendering
|
||||
graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
|
||||
// Set background to transparent
|
||||
graphics.Clear(Color.Transparent);
|
||||
|
||||
// Rectangle with a 1px offset
|
||||
Rectangle squareRect = new(1, 1, width - 2, height - 2);
|
||||
|
||||
using (Brush blueBrush = new SolidBrush(Color.Blue))
|
||||
{
|
||||
graphics.FillRectangle(blueBrush, squareRect);
|
||||
}
|
||||
|
||||
// Draw white letters in the center
|
||||
using (Font font = new("Arial", 8, FontStyle.Bold, GraphicsUnit.Pixel))
|
||||
using (Brush whiteBrush = new SolidBrush(Color.White))
|
||||
{
|
||||
StringFormat format = new() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
|
||||
|
||||
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
|
||||
graphics.DrawString(text, font, whiteBrush, new RectangleF(1, 1, width - 2, height - 2), format);
|
||||
}
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
public static Bitmap CreateHexagonalBitmap(string text, int width = 24, int height = 24)
|
||||
{
|
||||
Bitmap bitmap = new(width, height);
|
||||
using Graphics graphics = Graphics.FromImage(bitmap);
|
||||
|
||||
// Enable high-quality rendering
|
||||
graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
|
||||
// Set background to transparent
|
||||
graphics.Clear(Color.Transparent);
|
||||
|
||||
// Calculate hexagon points centered within the bitmap
|
||||
float side = (width - 2) / 2.236f; // 2.236f approximates 4 / √3 for regular hex dimensions
|
||||
float h = side * (float)Math.Sqrt(3) / 2;
|
||||
float centerX = width / 2f;
|
||||
float centerY = height / 2f;
|
||||
|
||||
Point[] hexagonPoints =
|
||||
[
|
||||
new((int)(centerX - side / 2), (int)(centerY - h)),
|
||||
new((int)(centerX + side / 2), (int)(centerY - h)),
|
||||
new((int)(centerX + side), (int)centerY),
|
||||
new((int)(centerX + side / 2), (int)(centerY + h)),
|
||||
new((int)(centerX - side / 2), (int)(centerY + h)),
|
||||
new((int)(centerX - side), (int)centerY)
|
||||
];
|
||||
|
||||
using (Brush blueBrush = new SolidBrush(Color.Blue))
|
||||
{
|
||||
graphics.FillPolygon(blueBrush, hexagonPoints);
|
||||
}
|
||||
|
||||
// Draw white letters in the center
|
||||
using Font font = new("Monospace", 10, FontStyle.Bold, GraphicsUnit.Pixel);
|
||||
using Brush whiteBrush = new SolidBrush(Color.White);
|
||||
StringFormat format = new() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
|
||||
|
||||
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
|
||||
graphics.DrawString(text, font, whiteBrush, new RectangleF(0, 1, width, height), format);
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
}
|
||||
+188
@@ -0,0 +1,188 @@
|
||||
using Rhino.Geometry;
|
||||
using Speckle.Connectors.Common.Builders;
|
||||
using Speckle.Connectors.Common.Conversion;
|
||||
using Speckle.Connectors.Common.Operations;
|
||||
using Speckle.Connectors.Common.Operations.Receive;
|
||||
using Speckle.Converters.Common;
|
||||
using Speckle.Converters.Rhino;
|
||||
using Speckle.Sdk;
|
||||
using Speckle.Sdk.Logging;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
using Speckle.Sdk.Models.Instances;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.HostApp;
|
||||
|
||||
public sealed class GrasshopperReceiveConversionResult : ReceiveConversionResult
|
||||
{
|
||||
public object? Result { get; set; }
|
||||
public Base Source { get; set; }
|
||||
|
||||
public GrasshopperReceiveConversionResult(
|
||||
Status status,
|
||||
Base source,
|
||||
object? result,
|
||||
string? resultId = null,
|
||||
string? resultType = null,
|
||||
Exception? exception = null
|
||||
)
|
||||
: base(status, source, resultId, resultType, exception)
|
||||
{
|
||||
Result = result;
|
||||
Source = source;
|
||||
}
|
||||
}
|
||||
|
||||
public class GrasshopperHostObjectBuilder : IHostObjectBuilder
|
||||
{
|
||||
private readonly IRootToHostConverter _converter;
|
||||
private readonly IConverterSettingsStore<RhinoConversionSettings> _converterSettings;
|
||||
private readonly TraversalContextUnpacker _contextUnpacker;
|
||||
private readonly RootObjectUnpacker _rootObjectUnpacker;
|
||||
private readonly ISdkActivityFactory _activityFactory;
|
||||
|
||||
public GrasshopperHostObjectBuilder(
|
||||
IRootToHostConverter converter,
|
||||
IConverterSettingsStore<RhinoConversionSettings> converterSettings,
|
||||
RootObjectUnpacker rootObjectUnpacker,
|
||||
ISdkActivityFactory activityFactory,
|
||||
TraversalContextUnpacker contextUnpacker
|
||||
)
|
||||
{
|
||||
_converter = converter;
|
||||
_converterSettings = converterSettings;
|
||||
_rootObjectUnpacker = rootObjectUnpacker;
|
||||
_activityFactory = activityFactory;
|
||||
_contextUnpacker = contextUnpacker;
|
||||
}
|
||||
|
||||
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
|
||||
public async Task<HostObjectBuilderResult> Build(
|
||||
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
|
||||
Base rootObject,
|
||||
string projectName,
|
||||
string modelName,
|
||||
IProgress<CardProgress> onOperationProgressed,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
using var activity = _activityFactory.Start("Build");
|
||||
// POC: This is where the top level base-layer name is set. Could be abstracted or injected in the context?
|
||||
var baseLayerName = $"Project {projectName}: Model {modelName}";
|
||||
|
||||
// 1 - Unpack objects and proxies from root commit object
|
||||
|
||||
var unpackedRoot = _rootObjectUnpacker.Unpack(rootObject);
|
||||
|
||||
// 2 - Split atomic objects and instance components with their path
|
||||
var (atomicObjects, instanceComponents) = _rootObjectUnpacker.SplitAtomicObjectsAndInstances(
|
||||
unpackedRoot.ObjectsToConvert
|
||||
);
|
||||
|
||||
var atomicObjectsWithPath = _contextUnpacker.GetAtomicObjectsWithPath(atomicObjects);
|
||||
var instanceComponentsWithPath = _contextUnpacker.GetInstanceComponentsWithPath(instanceComponents);
|
||||
|
||||
// 2.1 - these are not captured by traversal, so we need to re-add them here
|
||||
if (unpackedRoot.DefinitionProxies != null && unpackedRoot.DefinitionProxies.Count > 0)
|
||||
{
|
||||
var transformed = unpackedRoot.DefinitionProxies.Select(proxy =>
|
||||
(Array.Empty<Collection>(), proxy as IInstanceComponent)
|
||||
);
|
||||
instanceComponentsWithPath.AddRange(transformed);
|
||||
}
|
||||
|
||||
// 3 - Bake materials and colors, as they are used later down the line by layers and objects
|
||||
onOperationProgressed.Report(new("Converting materials and colors", null));
|
||||
if (unpackedRoot.RenderMaterialProxies != null)
|
||||
{
|
||||
using var _ = _activityFactory.Start("Render Materials");
|
||||
//_materialBaker.BakeMaterials(unpackedRoot.RenderMaterialProxies, baseLayerName);
|
||||
}
|
||||
|
||||
if (unpackedRoot.ColorProxies != null)
|
||||
{
|
||||
//_colorBaker.ParseColors(unpackedRoot.ColorProxies);
|
||||
}
|
||||
|
||||
// 5 - Convert atomic objects
|
||||
List<ReceiveConversionResult> conversionResults = new();
|
||||
Dictionary<string, List<string>> applicationIdMap = new(); // This map is used in converting blocks in stage 2. keeps track of original app id => resulting new app ids post baking
|
||||
|
||||
int count = 0;
|
||||
using (var _ = _activityFactory.Start("Converting objects"))
|
||||
{
|
||||
foreach (var (path, obj) in atomicObjectsWithPath)
|
||||
{
|
||||
using (var convertActivity = _activityFactory.Start("Converting object"))
|
||||
{
|
||||
onOperationProgressed.Report(new("Converting objects", (double)++count / atomicObjects.Count));
|
||||
try
|
||||
{
|
||||
// 0: get pre-created layer from cache in layer baker
|
||||
// int layerIndex = _layerBaker.GetLayerIndex(path, baseLayerName);
|
||||
|
||||
// 1: create object attributes for baking
|
||||
string name = obj["name"] as string ?? "";
|
||||
|
||||
// 2: convert
|
||||
var result = _converter.Convert(obj);
|
||||
|
||||
// 3: bake
|
||||
if (result is GeometryBase geometryBase)
|
||||
{
|
||||
//var guid = BakeObject(geometryBase, obj, atts);
|
||||
}
|
||||
else if (result is List<GeometryBase> geometryBases) // one to many raw encoding case
|
||||
{
|
||||
foreach (var gb in geometryBases)
|
||||
{
|
||||
//var guid = BakeObject(gb, obj, atts);
|
||||
}
|
||||
}
|
||||
else if (result is IEnumerable<(object, Base)> fallbackConversionResult) // one to many fallback conversion
|
||||
{
|
||||
//var guids = BakeObjectsAsFallbackGroup(fallbackConversionResult, obj, atts, baseLayerName);
|
||||
}
|
||||
|
||||
// 4: log
|
||||
conversionResults.Add(
|
||||
new GrasshopperReceiveConversionResult(Status.SUCCESS, obj, result, null, result.GetType().ToString())
|
||||
);
|
||||
|
||||
// applicationIdMap[obj.applicationId ?? obj.id] = conversionIds;
|
||||
convertActivity?.SetStatus(SdkActivityStatusCode.Ok);
|
||||
}
|
||||
catch (Exception ex) when (!ex.IsFatal())
|
||||
{
|
||||
// TODO: No conversion report yet
|
||||
conversionResults.Add(new GrasshopperReceiveConversionResult(Status.ERROR, obj, null, null, null, ex));
|
||||
convertActivity?.SetStatus(SdkActivityStatusCode.Error);
|
||||
convertActivity?.RecordException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 6 - Convert instances
|
||||
using (var _ = _activityFactory.Start("Converting instances"))
|
||||
{
|
||||
// TODO: No instances yet
|
||||
// var (createdInstanceIds, consumedObjectIds, instanceConversionResults) = await _instanceBaker
|
||||
// .BakeInstances(instanceComponentsWithPath, applicationIdMap, baseLayerName, onOperationProgressed)
|
||||
// .ConfigureAwait(false);
|
||||
|
||||
// TODO: No conversion report yet
|
||||
// conversionResults.RemoveAll(result => result.ResultId != null && consumedObjectIds.Contains(result.ResultId)); // remove all conversion results for atomic objects that have been consumed (POC: not that cool, but prevents problems on object highlighting)
|
||||
// conversionResults.AddRange(instanceConversionResults); // add instance conversion results to our list
|
||||
}
|
||||
|
||||
// 7 - Create groups
|
||||
if (unpackedRoot.GroupProxies is not null)
|
||||
{
|
||||
// TODO: No groups yet
|
||||
// _groupBaker.BakeGroups(unpackedRoot.GroupProxies, applicationIdMap, baseLayerName);
|
||||
}
|
||||
|
||||
return new HostObjectBuilderResult([], conversionResults);
|
||||
}
|
||||
}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
using Speckle.Connectors.Common.Operations;
|
||||
using Speckle.Connectors.Logging;
|
||||
using Speckle.Sdk.Api;
|
||||
using Speckle.Sdk.Credentials;
|
||||
using Speckle.Sdk.Logging;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Transports;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.HostApp;
|
||||
|
||||
public class GrasshopperReceiveOperation
|
||||
{
|
||||
private readonly AccountService _accountService;
|
||||
private readonly IServerTransportFactory _serverTransportFactory;
|
||||
private readonly IProgressDisplayManager _progressDisplayManager;
|
||||
private readonly ISdkActivityFactory _activityFactory;
|
||||
private readonly IOperations _operations;
|
||||
private readonly IClientFactory _clientFactory;
|
||||
|
||||
public GrasshopperReceiveOperation(
|
||||
AccountService accountService,
|
||||
IServerTransportFactory serverTransportFactory,
|
||||
IProgressDisplayManager progressDisplayManager,
|
||||
ISdkActivityFactory activityFactory,
|
||||
IOperations operations,
|
||||
IClientFactory clientFactory
|
||||
)
|
||||
{
|
||||
_accountService = accountService;
|
||||
_serverTransportFactory = serverTransportFactory;
|
||||
_progressDisplayManager = progressDisplayManager;
|
||||
_activityFactory = activityFactory;
|
||||
_operations = operations;
|
||||
_clientFactory = clientFactory;
|
||||
}
|
||||
|
||||
public async Task<Base> ReceiveCommitObject(
|
||||
ReceiveInfo receiveInfo,
|
||||
IProgress<CardProgress> onOperationProgressed,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
using var execute = _activityFactory.Start("Receive Operation");
|
||||
execute?.SetTag("receiveInfo", receiveInfo);
|
||||
// 2 - Check account exist
|
||||
Account account = _accountService.GetAccountWithServerUrlFallback(receiveInfo.AccountId, receiveInfo.ServerUrl);
|
||||
using Client apiClient = _clientFactory.Create(account);
|
||||
using var userScope = ActivityScope.SetTag(Consts.USER_ID, account.GetHashedEmail());
|
||||
|
||||
var version = await apiClient
|
||||
.Version.Get(receiveInfo.SelectedVersionId, receiveInfo.ProjectId, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
using var transport = _serverTransportFactory.Create(account, receiveInfo.ProjectId);
|
||||
|
||||
double? previousPercentage = null;
|
||||
_progressDisplayManager.Begin();
|
||||
Base commitObject = await _operations
|
||||
.Receive2(
|
||||
new Uri(account.serverInfo.url),
|
||||
receiveInfo.ProjectId,
|
||||
version.referencedObject,
|
||||
account.token,
|
||||
onProgressAction: new PassthroughProgress(args =>
|
||||
{
|
||||
if (args.ProgressEvent == ProgressEvent.CacheCheck || args.ProgressEvent == ProgressEvent.DownloadBytes)
|
||||
{
|
||||
switch (args.ProgressEvent)
|
||||
{
|
||||
case ProgressEvent.CacheCheck:
|
||||
previousPercentage = _progressDisplayManager.CalculatePercentage(args);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!_progressDisplayManager.ShouldUpdate())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (args.ProgressEvent)
|
||||
{
|
||||
case ProgressEvent.CacheCheck:
|
||||
case ProgressEvent.DownloadBytes:
|
||||
onOperationProgressed.Report(new("Checking and Downloading... ", previousPercentage));
|
||||
break;
|
||||
case ProgressEvent.DeserializeObject:
|
||||
onOperationProgressed.Report(new("Deserializing ...", _progressDisplayManager.CalculatePercentage(args)));
|
||||
break;
|
||||
}
|
||||
}),
|
||||
cancellationToken: cancellationToken
|
||||
)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
await apiClient
|
||||
.Version.Received(new(version.id, receiveInfo.ProjectId, receiveInfo.SourceApplication), cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
return commitObject;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Grasshopper.Kernel.Types;
|
||||
using Rhino.Geometry;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.HostApp;
|
||||
|
||||
public class SpeckleGrasshopperObject : Base
|
||||
{
|
||||
public Base OriginalObject { get; set; }
|
||||
public GeometryBase GeometryBase { get; set; }
|
||||
public List<Collection> Path { get; set; }
|
||||
|
||||
// RenderMaterial, ColorProxies, Properties (?)
|
||||
public override string ToString() => $"Speckle Wrapper [{GeometryBase.GetType().Name}]";
|
||||
}
|
||||
|
||||
public class SpeckleGrasshopperObjectGoo : GH_Goo<SpeckleGrasshopperObject>
|
||||
{
|
||||
public override IGH_Goo Duplicate() => throw new NotImplementedException();
|
||||
|
||||
public override string ToString() => $@"Speckle Object [{m_value.OriginalObject.speckle_type}]";
|
||||
|
||||
public override bool IsValid => true;
|
||||
public override string TypeName => "Speckle object wrapper";
|
||||
public override string TypeDescription => "A wrapper around speckle grasshopper objects.";
|
||||
|
||||
public override bool CastFrom(object source)
|
||||
{
|
||||
switch (source)
|
||||
{
|
||||
case SpeckleGrasshopperObject speckleGrasshopperObject:
|
||||
Value = speckleGrasshopperObject;
|
||||
return true;
|
||||
case GH_Goo<SpeckleGrasshopperObject> speckleGrasshopperObjectGoo:
|
||||
Value = speckleGrasshopperObjectGoo.Value;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool CastTo<T>(ref T target)
|
||||
{
|
||||
var type = typeof(T);
|
||||
if (type == typeof(IGH_GeometricGoo))
|
||||
{
|
||||
target = (T)(object)GH_Convert.ToGeometricGoo(Value.GeometryBase);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (type == typeof(GH_Extrusion) && Value.GeometryBase is Extrusion)
|
||||
{
|
||||
target = (T)(object)new GH_Extrusion() { Value = Value.GeometryBase as Extrusion };
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public class SpeckleGrasshopperObjectParam : GH_Param<SpeckleGrasshopperObjectGoo>
|
||||
{
|
||||
public SpeckleGrasshopperObjectParam()
|
||||
: this(GH_ParamAccess.item) { }
|
||||
|
||||
public SpeckleGrasshopperObjectParam(IGH_InstanceDescription tag)
|
||||
: base(tag) { }
|
||||
|
||||
public SpeckleGrasshopperObjectParam(IGH_InstanceDescription tag, GH_ParamAccess access)
|
||||
: base(tag, access) { }
|
||||
|
||||
public SpeckleGrasshopperObjectParam(GH_ParamAccess access)
|
||||
: base("Speckle Grasshopper Object", "SGO", "XXXXX", "Speckle", "Params", access) { }
|
||||
|
||||
public override Guid ComponentGuid => new("22FD5510-D5D3-4101-8727-153FFD329E4F");
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
using Speckle.Connectors.Common.Operations;
|
||||
using Speckle.Sdk.Api;
|
||||
using Speckle.Sdk.Api.GraphQL.Models;
|
||||
using Speckle.Sdk.Common;
|
||||
using Version = Speckle.Sdk.Api.GraphQL.Models.Version;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.HostApp;
|
||||
|
||||
public abstract record SpeckleUrlModelResource(string Server, string ProjectId)
|
||||
{
|
||||
public abstract Task<ReceiveInfo> GetReceiveInfo(Client client, CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
public record SpeckleUrlLatestModelVersionResource(string Server, string ProjectId, string ModelId)
|
||||
: SpeckleUrlModelResource(Server, ProjectId)
|
||||
{
|
||||
public override async Task<ReceiveInfo> GetReceiveInfo(Client client, CancellationToken cancellationToken = default)
|
||||
{
|
||||
Project project = await client.Project.Get(ProjectId, cancellationToken).ConfigureAwait(false);
|
||||
ModelWithVersions model = await client
|
||||
.Model.GetWithVersions(ModelId, ProjectId, 1, null, null, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
Version version = model.versions.items[0];
|
||||
|
||||
var info = new ReceiveInfo(
|
||||
client.Account.id,
|
||||
new Uri(Server),
|
||||
ProjectId,
|
||||
project.name,
|
||||
ModelId,
|
||||
model.name,
|
||||
version.id,
|
||||
version.sourceApplication.NotNull()
|
||||
);
|
||||
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
||||
public record SpeckleUrlModelVersionResource(string Server, string ProjectId, string ModelId, string VersionId)
|
||||
: SpeckleUrlModelResource(Server, ProjectId)
|
||||
{
|
||||
public override async Task<ReceiveInfo> GetReceiveInfo(Client client, CancellationToken cancellationToken = default)
|
||||
{
|
||||
Project project = await client.Project.Get(ProjectId, cancellationToken).ConfigureAwait(false);
|
||||
Model model = await client.Model.Get(ModelId, ProjectId, cancellationToken).ConfigureAwait(false);
|
||||
Version version = await client.Version.Get(VersionId, ProjectId, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
var info = new ReceiveInfo(
|
||||
client.Account.id,
|
||||
new Uri(Server),
|
||||
ProjectId,
|
||||
project.name,
|
||||
ModelId,
|
||||
model.name,
|
||||
VersionId,
|
||||
version.sourceApplication.NotNull()
|
||||
);
|
||||
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
||||
public record SpeckleUrlModelObjectResource(string Server, string ProjectId, string ObjectId)
|
||||
: SpeckleUrlModelResource(Server, ProjectId)
|
||||
{
|
||||
public override Task<ReceiveInfo> GetReceiveInfo(Client client, CancellationToken cancellationToken = default) =>
|
||||
throw new NotImplementedException("Object Resources are not supported yet");
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using Speckle.Sdk;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.HostApp;
|
||||
|
||||
public record SpeckleResourceBuilder
|
||||
{
|
||||
/// <summary>
|
||||
/// The ReGex pattern to determine if a URL's AbsolutePath is a Frontend2 URL or not.
|
||||
/// </summary>
|
||||
private static readonly Regex s_fe2UrlRegex =
|
||||
new(
|
||||
@"/projects/(?<projectId>[\w\d]+)(?:/models/(?<model>[\w\d]+(?:@[\w\d]+)?)(?:,(?<additionalModels>[\w\d]+(?:@[\w\d]+)?))*)?"
|
||||
);
|
||||
|
||||
public static SpeckleUrlModelResource[] FromUrlString(string speckleModel)
|
||||
{
|
||||
var uri = new Uri(speckleModel);
|
||||
var serverUrl = uri.GetLeftPart(UriPartial.Authority);
|
||||
var match = s_fe2UrlRegex.Match(speckleModel);
|
||||
var result = ParseFe2RegexMatch(serverUrl, match);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static SpeckleUrlModelResource[] ParseFe2RegexMatch(string serverUrl, Match match)
|
||||
{
|
||||
var projectId = match.Groups["projectId"];
|
||||
var model = match.Groups["model"];
|
||||
var additionalModels = match.Groups["additionalModels"];
|
||||
|
||||
if (!projectId.Success)
|
||||
{
|
||||
throw new SpeckleException("The provided url is not a valid Speckle url");
|
||||
}
|
||||
|
||||
if (!model.Success)
|
||||
{
|
||||
throw new SpeckleException("The provided url is not pointing to any model in the project.");
|
||||
}
|
||||
|
||||
if (model.Value == "all")
|
||||
{
|
||||
throw new NotSupportedException("Fetching all models is not supported.");
|
||||
}
|
||||
|
||||
if (model.Value.StartsWith("$"))
|
||||
{
|
||||
throw new NotSupportedException("Federation model urls are not supported");
|
||||
}
|
||||
|
||||
var modelRes = GetUrlModelResource(serverUrl, projectId.Value, model.Value);
|
||||
|
||||
var result = new List<SpeckleUrlModelResource> { modelRes };
|
||||
|
||||
if (additionalModels.Success)
|
||||
{
|
||||
foreach (Capture additionalModelsCapture in additionalModels.Captures)
|
||||
{
|
||||
var extraModel = GetUrlModelResource(serverUrl, projectId.Value, additionalModelsCapture.Value);
|
||||
result.Add(extraModel);
|
||||
}
|
||||
}
|
||||
|
||||
return result.ToArray();
|
||||
}
|
||||
|
||||
private static SpeckleUrlModelResource GetUrlModelResource(string serverUrl, string projectId, string modelValue)
|
||||
{
|
||||
if (modelValue.Length == 32)
|
||||
{
|
||||
return new SpeckleUrlModelObjectResource(serverUrl, projectId, modelValue); // Model value is an ObjectID
|
||||
}
|
||||
|
||||
if (!modelValue.Contains('@'))
|
||||
{
|
||||
return new SpeckleUrlLatestModelVersionResource(serverUrl, projectId, modelValue); // Model has no version attached
|
||||
}
|
||||
|
||||
var res = modelValue.Split('@');
|
||||
return new SpeckleUrlModelVersionResource(serverUrl, projectId, res[0], res[1]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
using Grasshopper.Kernel.Types;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Parameters;
|
||||
|
||||
public class SpeckleCollectionGoo : GH_Goo<Collection>
|
||||
{
|
||||
// TODO: Massive hack for setup only!!! We need some sort of `ShallowCopy` or a transparent wrapper for Speckle Objects
|
||||
// to prevent backwards propagation of changes of the same instance.
|
||||
public override IGH_Goo Duplicate() => new SpeckleCollectionGoo { Value = m_value };
|
||||
|
||||
public override string ToString() => $"Speckle Collection [{m_value.name}]";
|
||||
|
||||
public override bool IsValid => true;
|
||||
public override string TypeName => "SpeckleCollection";
|
||||
public override string TypeDescription => "A Speckle Collection";
|
||||
|
||||
public override bool CastFrom(object source)
|
||||
{
|
||||
Collection? obj = null;
|
||||
switch (source)
|
||||
{
|
||||
case Collection speckleCollection:
|
||||
obj = speckleCollection;
|
||||
break;
|
||||
case SpeckleObjectGoo speckleObjectGoo:
|
||||
if (speckleObjectGoo.Value is Collection collection)
|
||||
{
|
||||
obj = collection;
|
||||
}
|
||||
break;
|
||||
case SpeckleCollectionGoo speckleCollectionGoo:
|
||||
obj = speckleCollectionGoo.Value;
|
||||
break;
|
||||
case GH_Goo<ISpeckleObject> speckleObjectGoo:
|
||||
if (speckleObjectGoo.Value is Collection collection2)
|
||||
{
|
||||
obj = collection2;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
obj = null;
|
||||
break;
|
||||
}
|
||||
|
||||
if (obj is null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Value = obj;
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool CastTo<TOut>(ref TOut target)
|
||||
{
|
||||
var type = typeof(TOut);
|
||||
var success = false;
|
||||
if (type == typeof(SpeckleObjectGoo))
|
||||
{
|
||||
target = (TOut)(object)new SpeckleObjectGoo { Value = Value };
|
||||
success = true;
|
||||
}
|
||||
else if (type == typeof(SpeckleCollectionGoo))
|
||||
{
|
||||
target = (TOut)(object)new SpeckleObjectGoo { Value = Value };
|
||||
success = true;
|
||||
}
|
||||
else if (type == typeof(Collection))
|
||||
{
|
||||
target = (TOut)(object)Value;
|
||||
success = true;
|
||||
}
|
||||
else if (type == typeof(Base))
|
||||
{
|
||||
target = (TOut)(object)Value;
|
||||
success = true;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Speckle.Connectors.Grasshopper8.HostApp;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Parameters;
|
||||
|
||||
public class SpeckleCollectionParam : GH_Param<SpeckleCollectionGoo>
|
||||
{
|
||||
public SpeckleCollectionParam()
|
||||
: this(GH_ParamAccess.item) { }
|
||||
|
||||
public SpeckleCollectionParam(IGH_InstanceDescription tag)
|
||||
: base(tag) { }
|
||||
|
||||
public SpeckleCollectionParam(IGH_InstanceDescription tag, GH_ParamAccess access)
|
||||
: base(tag, access) { }
|
||||
|
||||
public SpeckleCollectionParam(GH_ParamAccess access)
|
||||
: base("Speckle Collection", "SpcklCol", "XXX", "Speckle", "Params", access) { }
|
||||
|
||||
public override Guid ComponentGuid => new("F397D941-6B4D-4143-B535-A11F7F776BA1");
|
||||
|
||||
protected override Bitmap Icon => BitmapBuilder.CreateHexagonalBitmap("C");
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
using Grasshopper.Kernel.Types;
|
||||
using Speckle.Sdk.Models;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Parameters;
|
||||
|
||||
public class SpeckleObjectGoo : GH_Goo<Base>
|
||||
{
|
||||
// TODO: Massive hack for setup only!!! We need some sort of `ShallowCopy` or a transparent wrapper for Speckle Objects
|
||||
// to prevent backwards propagation of changes of the same instance.
|
||||
public override IGH_Goo Duplicate() => new SpeckleObjectGoo { Value = m_value };
|
||||
|
||||
public override string ToString() => $"Speckle Object [{m_value.GetType().Name}]";
|
||||
|
||||
public override bool IsValid => true;
|
||||
public override string TypeName => "SpeckleObject";
|
||||
public override string TypeDescription => "A Speckle Object";
|
||||
|
||||
public override bool CastFrom(object source)
|
||||
{
|
||||
Base? obj = source switch
|
||||
{
|
||||
Base speckleObject => speckleObject,
|
||||
SpeckleObjectGoo speckleObjectGoo => speckleObjectGoo.Value,
|
||||
SpeckleCollectionGoo speckleCollectionGoo => speckleCollectionGoo.Value,
|
||||
GH_Goo<Base> speckleObjectGoo => speckleObjectGoo.Value,
|
||||
_ => null
|
||||
};
|
||||
|
||||
if (obj is null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Value = obj;
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool CastTo<TOut>(ref TOut target)
|
||||
{
|
||||
var type = typeof(TOut);
|
||||
var success = false;
|
||||
if (type == typeof(SpeckleObjectGoo))
|
||||
{
|
||||
target = (TOut)(object)new SpeckleObjectGoo { Value = Value };
|
||||
success = true;
|
||||
}
|
||||
else if (type == typeof(SpeckleCollectionGoo) && Value is Collection collection)
|
||||
{
|
||||
target = (TOut)(object)new SpeckleCollectionGoo { Value = collection };
|
||||
success = true;
|
||||
}
|
||||
else if (type == typeof(Base))
|
||||
{
|
||||
target = (TOut)(object)Value;
|
||||
success = true;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using Grasshopper.Kernel;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Parameters;
|
||||
|
||||
public class SpeckleObjectParam : GH_Param<SpeckleObjectGoo>
|
||||
{
|
||||
public SpeckleObjectParam()
|
||||
: this(GH_ParamAccess.item) { }
|
||||
|
||||
public SpeckleObjectParam(IGH_InstanceDescription tag)
|
||||
: base(tag) { }
|
||||
|
||||
public SpeckleObjectParam(IGH_InstanceDescription tag, GH_ParamAccess access)
|
||||
: base(tag, access) { }
|
||||
|
||||
public SpeckleObjectParam(GH_ParamAccess access)
|
||||
: base("Speckle Object", "SpklObj", "XXXXX", "Speckle", "Params", access) { }
|
||||
|
||||
public override Guid ComponentGuid => new("F708F88C-FE00-44EF-8D30-02AB6CF5F728");
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
using Grasshopper.Kernel.Types;
|
||||
using Speckle.Connectors.Grasshopper8.HostApp;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Parameters;
|
||||
|
||||
public class SpeckleUrlModelResourceGoo : GH_Goo<SpeckleUrlModelResource>
|
||||
{
|
||||
public override IGH_Goo Duplicate() => new SpeckleUrlModelResourceGoo() { Value = Value };
|
||||
|
||||
public override string ToString() => Value.ToString();
|
||||
|
||||
public override bool IsValid => true;
|
||||
public override string TypeName => "SpeckleUrlModelResource";
|
||||
public override string TypeDescription => "Points to a model/version/object in a Speckle server";
|
||||
|
||||
public override bool CastFrom(object source)
|
||||
{
|
||||
switch (source)
|
||||
{
|
||||
case SpeckleUrlModelResource resource:
|
||||
Value = resource;
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CastTo<TOut>(ref TOut target)
|
||||
{
|
||||
var type = typeof(TOut);
|
||||
var success = false;
|
||||
if (type == typeof(SpeckleUrlModelResource))
|
||||
{
|
||||
target = (TOut)(object)Value;
|
||||
success = true;
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
using Grasshopper.Kernel;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8.Parameters;
|
||||
|
||||
public class SpeckleUrlModelResourceParam : GH_Param<SpeckleUrlModelResourceGoo>
|
||||
{
|
||||
public SpeckleUrlModelResourceParam()
|
||||
: this(GH_ParamAccess.item) { }
|
||||
|
||||
public SpeckleUrlModelResourceParam(IGH_InstanceDescription tag)
|
||||
: base(tag) { }
|
||||
|
||||
public SpeckleUrlModelResourceParam(IGH_InstanceDescription tag, GH_ParamAccess access)
|
||||
: base(tag, access) { }
|
||||
|
||||
public SpeckleUrlModelResourceParam(GH_ParamAccess access)
|
||||
: base("Speckle URL", "spcklUrl", "A Speckle resource", "Speckle", "Resources", access) { }
|
||||
|
||||
public override Guid ComponentGuid => new Guid("E5421FC2-F10D-447F-BF23-5C934ABDB2D3");
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using Grasshopper.Kernel;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Speckle.Connectors.Common;
|
||||
using Speckle.Connectors.Common.Builders;
|
||||
using Speckle.Connectors.Common.Operations.Receive;
|
||||
using Speckle.Connectors.Grasshopper8.HostApp;
|
||||
using Speckle.Converters.Rhino;
|
||||
using Speckle.Sdk;
|
||||
using Speckle.Sdk.Credentials;
|
||||
using Speckle.Sdk.Host;
|
||||
using Speckle.Sdk.Models.GraphTraversal;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8;
|
||||
|
||||
public class PriorityLoader : GH_AssemblyPriority
|
||||
{
|
||||
private IDisposable? _disposableLogger;
|
||||
public static ServiceProvider? Container { get; set; }
|
||||
|
||||
public override GH_LoadingInstruction PriorityLoad()
|
||||
{
|
||||
try
|
||||
{
|
||||
var services = new ServiceCollection();
|
||||
_disposableLogger = services.Initialize(HostApplications.Grasshopper, GetVersion());
|
||||
services.AddRhinoConverters().AddConnectorUtils();
|
||||
|
||||
services.AddTransient<IHostObjectBuilder, GrasshopperHostObjectBuilder>();
|
||||
services.AddTransient<GrasshopperReceiveOperation>();
|
||||
services.AddSingleton(DefaultTraversal.CreateTraversalFunc());
|
||||
services.AddScoped<RootObjectUnpacker>();
|
||||
|
||||
services.AddTransient<TraversalContextUnpacker>();
|
||||
services.AddTransient<AccountManager>();
|
||||
Container = services.BuildServiceProvider();
|
||||
return GH_LoadingInstruction.Proceed;
|
||||
}
|
||||
catch (Exception e) when (!e.IsFatal())
|
||||
{
|
||||
// TODO: Top level exception handling here
|
||||
return GH_LoadingInstruction.Abort;
|
||||
}
|
||||
}
|
||||
|
||||
private HostAppVersion GetVersion()
|
||||
{
|
||||
#if RHINO7
|
||||
return HostAppVersion.v7;
|
||||
#elif RHINO8
|
||||
return HostAppVersion.v8;
|
||||
#else
|
||||
throw new NotImplementedException();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"profiles": {
|
||||
"Rhino8Core": {
|
||||
"commandName": "Executable",
|
||||
"executablePath": "C:\\Program Files\\Rhino 8\\System\\Rhino.exe",
|
||||
"commandLineArgs": "/netcore /runscript=\"_Grasshopper\"",
|
||||
"environmentVariables": {
|
||||
"RHINO_PACKAGE_DIRS": "$(ProjectDir)$(OutputPath)\\"
|
||||
}
|
||||
},
|
||||
"Rhino8NetFx": {
|
||||
"commandName": "Executable",
|
||||
"executablePath": "C:\\Program Files\\Rhino 8\\System\\Rhino.exe",
|
||||
"commandLineArgs": "/netfx /runscript=\"_Grasshopper\"",
|
||||
"environmentVariables": {
|
||||
"RHINO_PACKAGE_DIRS": "$(ProjectDir)$(OutputPath)\\"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<!-- Select the framework(s) you wish to target.
|
||||
Rhino 6: net45
|
||||
Rhino 7: net48
|
||||
Rhino 8 Windows: net48, net7.0, net7.0-windows, net7.0-windows10.0.22000.0, etc
|
||||
Rhino 8 Mac: net7.0, net7.0-macos, net7.0-macos12.0, etc
|
||||
-->
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<Configurations>Debug;Release;Local</Configurations>
|
||||
<TargetExt>.gha</TargetExt>
|
||||
<NoWarn>$(NoWarn);NU1701;NETSDK1086</NoWarn>
|
||||
<EnableWindowsTargeting>true</EnableWindowsTargeting>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<DefineConstants>$(DefineConstants);GRASSHOPPER;RHINO8;RHINO7_OR_GREATER;RHINO8_OR_GREATER</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<Title>Speckle.Connectors.Grasshopper8</Title>
|
||||
<Description>Description of Speckle.Connectors.Grasshopper8</Description>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="RhinoCommon" IncludeAssets="compile; build" PrivateAssets="all" />
|
||||
<PackageReference Include="Grasshopper" IncludeAssets="compile; build" PrivateAssets="all"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\Converters\Rhino\Speckle.Converters.Rhino8\Speckle.Converters.Rhino8.csproj" />
|
||||
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
using Grasshopper.Kernel;
|
||||
|
||||
namespace Speckle.Connectors.Grasshopper8;
|
||||
|
||||
public class Speckle_Connectors_Grasshopper8Info : GH_AssemblyInfo
|
||||
{
|
||||
public override string Name => "Speckle.Connector.Grasshopper8";
|
||||
|
||||
// Return a 24x24 pixel bitmap to represent this GHA library.
|
||||
// public override Bitmap Icon => null;
|
||||
|
||||
// Return a short string describing the purpose of this GHA library.
|
||||
public override string Description => "x";
|
||||
|
||||
public override Guid Id => new Guid("d711dd2a-9c17-483c-a92d-45c1fc736c46");
|
||||
|
||||
// Return a string identifying you or your company.
|
||||
public override string AuthorName => "Speckle";
|
||||
|
||||
// Return a string representing your preferred contact details.
|
||||
public override string AuthorContact => "info@speckle.systems";
|
||||
|
||||
// Return a string representing the version. This returns the same version as the assembly.
|
||||
public override string AssemblyVersion => GetType().Assembly.GetName().Version.ToString();
|
||||
}
|
||||
@@ -0,0 +1,415 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dependencies": {
|
||||
".NETFramework,Version=v4.8": {
|
||||
"Grasshopper": {
|
||||
"type": "Direct",
|
||||
"requested": "[8.9.24194.18121, )",
|
||||
"resolved": "8.9.24194.18121",
|
||||
"contentHash": "ZQ7vT1urn9jG2KLMdT/aVhCsijN349lj2Lrg7+Cd5A84KOW+RIErG6IqH+133hc9HT9D10+7oi/XnIlgYZRzqQ==",
|
||||
"dependencies": {
|
||||
"RhinoCommon": "[8.9.24194.18121]"
|
||||
}
|
||||
},
|
||||
"Microsoft.NETFramework.ReferenceAssemblies": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.0.3, )",
|
||||
"resolved": "1.0.3",
|
||||
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
|
||||
}
|
||||
},
|
||||
"Microsoft.SourceLink.GitHub": {
|
||||
"type": "Direct",
|
||||
"requested": "[8.0.0, )",
|
||||
"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.9.24194.18121, )",
|
||||
"resolved": "8.9.24194.18121",
|
||||
"contentHash": "XRMnm38sBFeMT5AAtRTJdSaql/YNtT02AGi8TEVP1VZ4fkm8VJ1q2nNioWN3tW/+H8Tdi4nV+DuhB/5uE41MCg=="
|
||||
},
|
||||
"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.Net.WebSockets.Client.Managed": "1.0.22",
|
||||
"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.Bcl.AsyncInterfaces": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
|
||||
"dependencies": {
|
||||
"System.Threading.Tasks.Extensions": "4.5.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Build.Tasks.Git": {
|
||||
"type": "Transitive",
|
||||
"resolved": "8.0.0",
|
||||
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
||||
},
|
||||
"Microsoft.CSharp": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.7.0",
|
||||
"contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Abstractions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Primitives": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Binder": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.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.net48": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.3",
|
||||
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
|
||||
},
|
||||
"Microsoft.SourceLink.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "8.0.0",
|
||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||
},
|
||||
"Speckle.DoubleNumerics": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.0.1",
|
||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
||||
},
|
||||
"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.dynamic_cdecl": "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.dynamic_cdecl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.1.4",
|
||||
"contentHash": "ZsaKKhgYF9B1fvcnOGKl3EycNAwd9CRWX7v0rEfuPWhQQ5Jjpvf2VEHahiLIGHio3hxi3EIKFJw9KvyowWOUAw==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
},
|
||||
"System.Buffers": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.4.0",
|
||||
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
|
||||
},
|
||||
"System.ComponentModel.Annotations": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.0",
|
||||
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
|
||||
},
|
||||
"System.Memory": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.3",
|
||||
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
|
||||
"dependencies": {
|
||||
"System.Buffers": "4.4.0",
|
||||
"System.Numerics.Vectors": "4.4.0",
|
||||
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
|
||||
}
|
||||
},
|
||||
"System.Net.WebSockets.Client.Managed": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.22",
|
||||
"contentHash": "WqEOxPlXjuZrIjUtXNE9NxEfU/n5E35iV2PtoZdJSUC4tlrqwHnTee+wvMIM4OUaJWmwrymeqcgYrE0IkGAgLA==",
|
||||
"dependencies": {
|
||||
"System.Buffers": "4.4.0",
|
||||
"System.Numerics.Vectors": "4.4.0"
|
||||
}
|
||||
},
|
||||
"System.Numerics.Vectors": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.4.0",
|
||||
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
|
||||
},
|
||||
"System.Reactive": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||
"dependencies": {
|
||||
"System.Threading.Tasks.Extensions": "4.5.4"
|
||||
}
|
||||
},
|
||||
"System.Runtime.CompilerServices.Unsafe": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.3",
|
||||
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
|
||||
},
|
||||
"System.Threading.Tasks.Extensions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.4",
|
||||
"contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==",
|
||||
"dependencies": {
|
||||
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.common": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.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.rhino7": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"RhinoCommon": "[7.13.21348.13001, )",
|
||||
"RhinoWindows": "[7.13.21348.13001, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Connectors.DUI.WebView": "[1.0.0, )",
|
||||
"Speckle.Converters.Rhino7": "[1.0.0, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.common": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.rhino7": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"RhinoCommon": "[7.13.21348.13001, )",
|
||||
"Speckle.Converters.Common": "[1.0.0, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.rhino8": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"RhinoCommon": "[8.9.24194.18121, )",
|
||||
"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.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"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=="
|
||||
},
|
||||
"RhinoWindows": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.9.24194.18121, )",
|
||||
"resolved": "7.13.21348.13001",
|
||||
"contentHash": "V94T8emmJmFfmbd5cu+uTNS0neZApx1Q5MXvsQGFtt/mEGEbdHE+dFOETNgbOOJXSdNboAnCR3uo0GosOFX+/g==",
|
||||
"dependencies": {
|
||||
"RhinoCommon": "[7.13.21348.13001]"
|
||||
}
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[6.0.0, )",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -100,17 +100,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -139,11 +139,6 @@
|
||||
"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",
|
||||
@@ -273,9 +268,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -283,8 +278,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -302,7 +297,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.rhino7": {
|
||||
@@ -321,6 +316,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -347,35 +348,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<Configurations>Debug;Release;Local</Configurations>
|
||||
<RhinoVersion>8</RhinoVersion>
|
||||
<DefineConstants>$(DefineConstants);RHINO8;RHINO7_OR_GREATER;RHIN08_OR_GREATER</DefineConstants>
|
||||
<DefineConstants>$(DefineConstants);RHINO8;RHINO7_OR_GREATER;RHINO8_OR_GREATER</DefineConstants>
|
||||
<TargetExt>.rhp</TargetExt>
|
||||
<StartProgram>$(ProgramFiles)\Rhino $(RhinoVersion)\System\Rhino.exe</StartProgram>
|
||||
<EnableWindowsTargeting>true</EnableWindowsTargeting>
|
||||
@@ -21,6 +21,7 @@
|
||||
<ProjectReference Include="..\..\..\Converters\Rhino\Speckle.Converters.Rhino8\Speckle.Converters.Rhino8.csproj" />
|
||||
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
|
||||
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
|
||||
<ProjectReference Include="..\Speckle.Connectors.Grasshopper8\Speckle.Connectors.Grasshopper8.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -100,17 +100,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -139,11 +139,6 @@
|
||||
"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",
|
||||
@@ -273,9 +268,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -283,8 +278,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -295,6 +290,13 @@
|
||||
"Speckle.Connectors.DUI": "[1.0.0, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.grasshopper8": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Converters.Rhino8": "[1.0.0, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.logging": {
|
||||
"type": "Project"
|
||||
},
|
||||
@@ -302,7 +304,7 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.rhino8": {
|
||||
@@ -321,6 +323,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -347,35 +355,35 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
+1
-1
@@ -90,7 +90,7 @@ public sealed class RhinoBasicConnectorBinding : IBasicConnectorBinding
|
||||
|
||||
if (myModel is SenderModelCard sender)
|
||||
{
|
||||
objectIds = sender.SendFilter.NotNull().GetObjectIds();
|
||||
objectIds = sender.SendFilter.NotNull().RefreshObjectIds();
|
||||
}
|
||||
|
||||
if (myModel is ReceiverModelCard receiver && receiver.BakedObjectIds != null)
|
||||
|
||||
@@ -50,6 +50,8 @@ public sealed class RhinoSendBinding : ISendBinding
|
||||
/// </summary>
|
||||
private ConcurrentDictionary<string, byte> ChangedObjectIds { get; set; } = new();
|
||||
|
||||
private UnitSystem PreviousUnitSystem { get; set; }
|
||||
|
||||
public RhinoSendBinding(
|
||||
DocumentModelStore store,
|
||||
IAppIdleManager idleManager,
|
||||
@@ -79,6 +81,7 @@ public sealed class RhinoSendBinding : ISendBinding
|
||||
Parent = parent;
|
||||
Commands = new SendBindingUICommands(parent); // POC: Commands are tightly coupled with their bindings, at least for now, saves us injecting a factory.
|
||||
_activityFactory = activityFactory;
|
||||
PreviousUnitSystem = RhinoDoc.ActiveDoc.ModelUnitSystem;
|
||||
SubscribeToRhinoEvents();
|
||||
}
|
||||
|
||||
@@ -93,6 +96,23 @@ public sealed class RhinoSendBinding : ISendBinding
|
||||
}
|
||||
};
|
||||
|
||||
RhinoDoc.ActiveDocumentChanged += (_, e) =>
|
||||
{
|
||||
PreviousUnitSystem = e.Document.ModelUnitSystem;
|
||||
};
|
||||
|
||||
// NOTE: BE CAREFUL handling things in this event handler since it is triggered whenever we save something into file!
|
||||
RhinoDoc.DocumentPropertiesChanged += async (_, e) =>
|
||||
{
|
||||
var newUnit = e.Document.ModelUnitSystem;
|
||||
if (newUnit != PreviousUnitSystem)
|
||||
{
|
||||
PreviousUnitSystem = newUnit;
|
||||
|
||||
await InvalidateAllSender().ConfigureAwait(false);
|
||||
}
|
||||
};
|
||||
|
||||
RhinoDoc.AddRhinoObject += (_, e) =>
|
||||
_topLevelExceptionHandler.CatchUnhandled(() =>
|
||||
{
|
||||
@@ -178,7 +198,7 @@ public sealed class RhinoSendBinding : ISendBinding
|
||||
|
||||
List<RhinoObject> rhinoObjects = modelCard
|
||||
.SendFilter.NotNull()
|
||||
.GetObjectIds()
|
||||
.RefreshObjectIds()
|
||||
.Select(id => RhinoDoc.ActiveDoc.Objects.FindId(new Guid(id)))
|
||||
.Where(obj => obj != null)
|
||||
.ToList();
|
||||
@@ -238,7 +258,7 @@ public sealed class RhinoSendBinding : ISendBinding
|
||||
|
||||
foreach (SenderModelCard modelCard in senders)
|
||||
{
|
||||
var intersection = modelCard.SendFilter.NotNull().GetObjectIds().Intersect(objectIdsList).ToList();
|
||||
var intersection = modelCard.SendFilter.NotNull().SelectedObjectIds.Intersect(objectIdsList).ToList();
|
||||
var isExpired = intersection.Count != 0;
|
||||
if (isExpired)
|
||||
{
|
||||
@@ -249,4 +269,11 @@ public sealed class RhinoSendBinding : ISendBinding
|
||||
await Commands.SetModelsExpired(expiredSenderIds).ConfigureAwait(false);
|
||||
ChangedObjectIds = new();
|
||||
}
|
||||
|
||||
private async Task InvalidateAllSender()
|
||||
{
|
||||
_sendConversionCache.ClearCache();
|
||||
var senderModelCardIds = _store.GetSenders().Select(s => s.ModelCardId.NotNull());
|
||||
await Commands.SetModelsExpired(senderModelCardIds).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,5 +9,5 @@ public class RhinoSelectionFilter : DirectSelectionSendFilter
|
||||
IsDefault = true;
|
||||
}
|
||||
|
||||
public override List<string> GetObjectIds() => SelectedObjectIds;
|
||||
public override List<string> RefreshObjectIds() => SelectedObjectIds;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using Rhino;
|
||||
using Speckle.Connectors.DUI.Bridge;
|
||||
using Speckle.Connectors.DUI.Models;
|
||||
using Speckle.Newtonsoft.Json;
|
||||
using Speckle.Connectors.DUI.Utils;
|
||||
|
||||
namespace Speckle.Connectors.Rhino.HostApp;
|
||||
|
||||
@@ -10,11 +10,8 @@ public class RhinoDocumentStore : DocumentModelStore
|
||||
private const string SPECKLE_KEY = "Speckle_DUI3";
|
||||
public override bool IsDocumentInit { get; set; } = true; // Note: because of rhino implementation details regarding expiry checking of sender cards.
|
||||
|
||||
public RhinoDocumentStore(
|
||||
JsonSerializerSettings jsonSerializerSettings,
|
||||
ITopLevelExceptionHandler topLevelExceptionHandler
|
||||
)
|
||||
: base(jsonSerializerSettings, true)
|
||||
public RhinoDocumentStore(IJsonSerializer jsonSerializer, ITopLevelExceptionHandler topLevelExceptionHandler)
|
||||
: base(jsonSerializer, true)
|
||||
{
|
||||
RhinoDoc.BeginOpenDocument += (_, _) => topLevelExceptionHandler.CatchUnhandled(() => IsDocumentInit = false);
|
||||
RhinoDoc.EndOpenDocument += (_, e) =>
|
||||
|
||||
@@ -118,10 +118,7 @@ public class RhinoInstanceBaker : IInstanceBaker<List<string>>
|
||||
)
|
||||
{
|
||||
var transform = MatrixToTransform(instanceProxy.transform, instanceProxy.units);
|
||||
|
||||
// POC: having layer creation during instance bake means no render materials!!
|
||||
int layerIndex = _layerBaker.GetAndCreateLayerFromPath(layerCollection, baseLayerName);
|
||||
|
||||
int layerIndex = _layerBaker.GetLayerIndex(layerCollection, baseLayerName);
|
||||
string instanceProxyId = instanceProxy.applicationId ?? instanceProxy.id;
|
||||
|
||||
ObjectAttributes atts = new() { LayerIndex = layerIndex };
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Rhino;
|
||||
using Rhino.DocObjects;
|
||||
using Speckle.Connectors.Common.Operations.Receive;
|
||||
using Speckle.Sdk;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
using Layer = Rhino.DocObjects.Layer;
|
||||
|
||||
@@ -15,6 +16,13 @@ public class RhinoLayerBaker : TraversalContextUnpacker
|
||||
private readonly RhinoColorBaker _colorBaker;
|
||||
private readonly Dictionary<string, int> _hostLayerCache = new();
|
||||
|
||||
private static readonly string s_pathSeparator =
|
||||
#if RHINO8_OR_GREATER
|
||||
ModelComponent.NamePathSeparator;
|
||||
#else
|
||||
Layer.PathSeparator;
|
||||
#endif
|
||||
|
||||
public RhinoLayerBaker(RhinoMaterialBaker materialBaker, RhinoColorBaker colorBaker)
|
||||
{
|
||||
_materialBaker = materialBaker;
|
||||
@@ -25,31 +33,72 @@ public class RhinoLayerBaker : TraversalContextUnpacker
|
||||
/// Creates the base layer and adds it to the cache.
|
||||
/// </summary>
|
||||
/// <param name="baseLayerName"></param>
|
||||
public void CreateBaseLayer(string baseLayerName)
|
||||
private void CreateBaseLayer(string baseLayerName)
|
||||
{
|
||||
var index = RhinoDoc.ActiveDoc.Layers.Add(new Layer { Name = baseLayerName }); // POC: too much effort right now to wrap around the interfaced layers and doc
|
||||
_hostLayerCache.Add(baseLayerName, index);
|
||||
_hostLayerCache[baseLayerName] = index;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>For receive: Use this method to construct layers in the host app when receiving. It progressively caches layers while creating them, so a second call to get the same layer will be fast.</para>
|
||||
/// Creates all layers needed for receiving data.
|
||||
/// </summary>
|
||||
public int GetAndCreateLayerFromPath(Collection[] collectionPath, string baseLayerName)
|
||||
/// <param name="paths">Collections of paths</param>
|
||||
/// <param name="baseLayerName">Name of the base layer</param>
|
||||
/// <remarks>Make sure this is executing on the main thread, using e.g RhinoApp.InvokeAndWait.</remarks>
|
||||
public void CreateAllLayersForReceive(IEnumerable<Collection[]> paths, string baseLayerName)
|
||||
{
|
||||
var layerPath = collectionPath.Select(o => string.IsNullOrWhiteSpace(o.name) ? "unnamed" : o.name);
|
||||
var layerFullName = string.Join(Layer.PathSeparator, layerPath);
|
||||
CreateBaseLayer(baseLayerName);
|
||||
var uniquePaths = new Dictionary<string, Collection[]>();
|
||||
foreach (var path in paths)
|
||||
{
|
||||
var names = path.Select(o => string.IsNullOrWhiteSpace(o.name) ? "unnamed" : o.name);
|
||||
var key = string.Join(",", names!);
|
||||
uniquePaths[key] = path;
|
||||
}
|
||||
|
||||
foreach (var uniquePath in uniquePaths)
|
||||
{
|
||||
var layerIndex = CreateLayerFromPath(uniquePath.Value, baseLayerName);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves the index of a layer based on the given collection path and base layer name.
|
||||
/// </summary>
|
||||
/// <param name="collectionPath">The array containing the collection path to the layer.</param>
|
||||
/// <param name="baseLayerName">The name of the base layer.</param>
|
||||
/// <returns>The index of the layer in the cache.</returns>
|
||||
/// <exception cref="SpeckleException">Thrown when the layer is not found in the cache. This can happen if you didn't call previously <see cref="CreateAllLayersForReceive"/></exception>
|
||||
public int GetLayerIndex(Collection[] collectionPath, string baseLayerName)
|
||||
{
|
||||
var layerPath = collectionPath
|
||||
.Select(o => string.IsNullOrWhiteSpace(o.name) ? "unnamed" : o.name)
|
||||
.Prepend(baseLayerName);
|
||||
|
||||
var layerFullName = string.Join(s_pathSeparator, layerPath);
|
||||
|
||||
if (_hostLayerCache.TryGetValue(layerFullName, out int existingLayerIndex))
|
||||
{
|
||||
return existingLayerIndex;
|
||||
}
|
||||
|
||||
throw new SpeckleException("Did not find a layer in the cache.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a layer based on the given collection path and adds it to the Rhino document.
|
||||
/// </summary>
|
||||
/// <param name="collectionPath">An array of Collection objects representing the path to create the layer.</param>
|
||||
/// <param name="baseLayerName">The base layer name to start creating the new layer.</param>
|
||||
/// <returns>The index of the last created layer.</returns>
|
||||
private int CreateLayerFromPath(Collection[] collectionPath, string baseLayerName)
|
||||
{
|
||||
var currentLayerName = baseLayerName;
|
||||
var currentDocument = RhinoDoc.ActiveDoc; // POC: too much effort right now to wrap around the interfaced layers
|
||||
Layer? previousLayer = currentDocument.Layers.FindName(currentLayerName);
|
||||
foreach (Collection collection in collectionPath)
|
||||
{
|
||||
currentLayerName += Layer.PathSeparator + collection.name;
|
||||
currentLayerName += s_pathSeparator + collection.name;
|
||||
currentLayerName = currentLayerName.Replace("{", "").Replace("}", ""); // Rhino specific cleanup for gh (see RemoveInvalidRhinoChars)
|
||||
if (_hostLayerCache.TryGetValue(currentLayerName, out int value))
|
||||
{
|
||||
|
||||
@@ -2,6 +2,9 @@ using Rhino;
|
||||
using Speckle.Sdk.Models.Collections;
|
||||
using Layer = Rhino.DocObjects.Layer;
|
||||
using SpeckleLayer = Speckle.Sdk.Models.Collections.Layer;
|
||||
#if RHINO8_OR_GREATER
|
||||
using Rhino.DocObjects;
|
||||
#endif
|
||||
|
||||
namespace Speckle.Connectors.Rhino.HostApp;
|
||||
|
||||
@@ -12,6 +15,14 @@ public class RhinoLayerUnpacker
|
||||
{
|
||||
private readonly Dictionary<int, Collection> _layerCollectionCache = new();
|
||||
|
||||
private static readonly string s_pathSeparator =
|
||||
#if RHINO8_OR_GREATER
|
||||
ModelComponent.NamePathSeparator;
|
||||
#else
|
||||
Layer.PathSeparator;
|
||||
#endif
|
||||
private static readonly string[] s_pathSeparatorSplit = [s_pathSeparator];
|
||||
|
||||
/// <summary>
|
||||
/// <para>Use this method to construct the root commit object while converting objects.</para>
|
||||
/// <para>Returns the host collection corresponding to the provided layer. If it's the first time that it is being asked for, it will be created and stored in the root object collection.</para>
|
||||
@@ -26,7 +37,7 @@ public class RhinoLayerUnpacker
|
||||
return value;
|
||||
}
|
||||
|
||||
var names = layer.FullPath.Split(new[] { Layer.PathSeparator }, StringSplitOptions.None);
|
||||
var names = layer.FullPath.Split(s_pathSeparatorSplit, StringSplitOptions.None);
|
||||
var path = names[0];
|
||||
var index = 0;
|
||||
var previousCollection = rootObjectCollection;
|
||||
@@ -53,7 +64,7 @@ public class RhinoLayerUnpacker
|
||||
|
||||
if (index < names.Length - 1)
|
||||
{
|
||||
path += Layer.PathSeparator + names[index + 1];
|
||||
path += s_pathSeparator + names[index + 1];
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Rhino;
|
||||
using Rhino.DocObjects;
|
||||
using Rhino.Render;
|
||||
@@ -180,9 +180,14 @@ public class RhinoMaterialUnpacker
|
||||
: pbRenderMaterial.Emission.AsSystemColor(); // pbRenderMaterial.emission gives wrong color for emission materials, and material.emissioncolor gives the wrong value for most others *shrug*
|
||||
|
||||
SpeckleRenderMaterial speckleRenderMaterial =
|
||||
new(opacity, pbRenderMaterial.Metallic, pbRenderMaterial.Roughness, diffuse, emissive)
|
||||
new()
|
||||
{
|
||||
name = renderMaterialName,
|
||||
opacity = opacity,
|
||||
metalness = pbRenderMaterial.Metallic,
|
||||
roughness = pbRenderMaterial.Roughness,
|
||||
diffuse = diffuse.ToArgb(),
|
||||
emissive = emissive.ToArgb(),
|
||||
applicationId = renderMaterial.Id.ToString()
|
||||
};
|
||||
|
||||
|
||||
+1
@@ -21,5 +21,6 @@ public sealed class DisableRedrawScope : IDisposable
|
||||
public void Dispose()
|
||||
{
|
||||
_viewTable.RedrawEnabled = _returnToStatus;
|
||||
_viewTable.Redraw();
|
||||
}
|
||||
}
|
||||
|
||||
+29
-24
@@ -54,7 +54,9 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
|
||||
_activityFactory = activityFactory;
|
||||
}
|
||||
|
||||
#pragma warning disable CA1506
|
||||
public async Task<HostObjectBuilderResult> Build(
|
||||
#pragma warning restore CA1506
|
||||
Base rootObject,
|
||||
string projectName,
|
||||
string modelName,
|
||||
@@ -68,9 +70,9 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
|
||||
|
||||
// 0 - Clean then Rock n Roll!
|
||||
PreReceiveDeepClean(baseLayerName);
|
||||
_layerBaker.CreateBaseLayer(baseLayerName);
|
||||
|
||||
// 1 - Unpack objects and proxies from root commit object
|
||||
|
||||
var unpackedRoot = _rootObjectUnpacker.Unpack(rootObject);
|
||||
|
||||
// 2 - Split atomic objects and instance components with their path
|
||||
@@ -107,11 +109,11 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
|
||||
onOperationProgressed.Report(new("Baking layers (redraw disabled)", null));
|
||||
using (var _ = _activityFactory.Start("Pre baking layers"))
|
||||
{
|
||||
using var layerNoDraw = new DisableRedrawScope(_converterSettings.Current.Document.Views);
|
||||
foreach (var (path, _) in atomicObjectsWithPath)
|
||||
RhinoApp.InvokeAndWait(() =>
|
||||
{
|
||||
_layerBaker.GetAndCreateLayerFromPath(path, baseLayerName);
|
||||
}
|
||||
using var layerNoDraw = new DisableRedrawScope(_converterSettings.Current.Document.Views);
|
||||
_layerBaker.CreateAllLayersForReceive(atomicObjectsWithPath.Select(t => t.path), baseLayerName);
|
||||
});
|
||||
}
|
||||
|
||||
// 5 - Convert atomic objects
|
||||
@@ -130,7 +132,7 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
|
||||
try
|
||||
{
|
||||
// 0: get pre-created layer from cache in layer baker
|
||||
int layerIndex = _layerBaker.GetAndCreateLayerFromPath(path, baseLayerName);
|
||||
int layerIndex = _layerBaker.GetLayerIndex(path, baseLayerName);
|
||||
|
||||
// 1: create object attributes for baking
|
||||
string name = obj["name"] as string ?? "";
|
||||
@@ -217,7 +219,6 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
|
||||
}
|
||||
|
||||
_converterSettings.Current.Document.Views.Redraw();
|
||||
|
||||
return new HostObjectBuilderResult(bakedObjectIds, conversionResults);
|
||||
}
|
||||
|
||||
@@ -230,31 +231,35 @@ public class RhinoHostObjectBuilder : IHostObjectBuilder
|
||||
RhinoMath.UnsetIntIndex
|
||||
);
|
||||
|
||||
_instanceBaker.PurgeInstances(baseLayerName);
|
||||
_materialBaker.PurgeMaterials(baseLayerName);
|
||||
|
||||
var doc = _converterSettings.Current.Document;
|
||||
// Cleans up any previously received objects
|
||||
if (rootLayerIndex != RhinoMath.UnsetIntIndex)
|
||||
RhinoApp.InvokeAndWait(() =>
|
||||
{
|
||||
var documentLayer = doc.Layers[rootLayerIndex];
|
||||
var childLayers = documentLayer.GetChildren();
|
||||
if (childLayers != null)
|
||||
_instanceBaker.PurgeInstances(baseLayerName);
|
||||
_materialBaker.PurgeMaterials(baseLayerName);
|
||||
|
||||
var doc = _converterSettings.Current.Document;
|
||||
// Cleans up any previously received objects
|
||||
if (rootLayerIndex != RhinoMath.UnsetIntIndex)
|
||||
{
|
||||
using var layerNoDraw = new DisableRedrawScope(doc.Views);
|
||||
foreach (var layer in childLayers)
|
||||
var documentLayer = doc.Layers[rootLayerIndex];
|
||||
var childLayers = documentLayer.GetChildren();
|
||||
if (childLayers != null)
|
||||
{
|
||||
var purgeSuccess = doc.Layers.Purge(layer.Index, true);
|
||||
if (!purgeSuccess)
|
||||
using var layerNoDraw = new DisableRedrawScope(doc.Views);
|
||||
foreach (var layer in childLayers)
|
||||
{
|
||||
Console.WriteLine($"Failed to purge layer: {layer}");
|
||||
var purgeSuccess = doc.Layers.Purge(layer.Index, true);
|
||||
if (!purgeSuccess)
|
||||
{
|
||||
Console.WriteLine($"Failed to purge layer: {layer}");
|
||||
}
|
||||
}
|
||||
}
|
||||
doc.Layers.Purge(documentLayer.Index, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Cleans up any previously received group
|
||||
_groupBaker.PurgeGroups(baseLayerName);
|
||||
// Cleans up any previously received group
|
||||
_groupBaker.PurgeGroups(baseLayerName);
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"profiles": {
|
||||
"Tekla2023": {
|
||||
"commandName": "Executable",
|
||||
"executablePath": "C:\\TeklaStructures\\2023.0\\bin\\TeklaStructures.exe"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<TeklaVersion>2023</TeklaVersion>
|
||||
<UseWpf>true</UseWpf>
|
||||
<DefineConstants>$(DefineConstants);TEKLA2023</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<Target AfterTargets="Build" Name="AfterBuildTekla" Condition="'$(TeklaVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true'">
|
||||
<ItemGroup>
|
||||
<TeklaDlls Include="$(TargetDir)\**\*.*" Exclude="$(TargetDir)*.bmp" />
|
||||
<TeklaBmp Include="$(TargetDir)\Assets\et_element_Speckle.bmp"/>
|
||||
</ItemGroup>
|
||||
|
||||
<Message Text="TeklaVersion $(TeklaVersion)" Importance="high"/>
|
||||
<Copy Condition="Exists('$(ProgramData)\Trimble\Tekla Structures\$(TeklaVersion).0')"
|
||||
DestinationFolder="$(ProgramData)\Trimble\Tekla Structures\$(TeklaVersion).0\Environments\common\extensions\Speckle3TeklaStructures\%(RecursiveDir)"
|
||||
SourceFiles="@(TeklaDlls)" />
|
||||
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
|
||||
<Copy Condition="Exists('$(ProgramData)\Trimble\Tekla Structures\$(TeklaVersion).0')"
|
||||
DestinationFolder="$(ProgramData)\Trimble\Tekla Structures\$(TeklaVersion).0\Bitmaps"
|
||||
SourceFiles="@(TeklaBmp)" />
|
||||
</ItemGroup>
|
||||
<Copy Condition="Exists('C:\TeklaStructures\2023.0')"
|
||||
DestinationFolder="C:\TeklaStructures\2023.0\Environments\common\extensions\Speckle3TeklaStructures\%(RecursiveDir)"
|
||||
SourceFiles="@(TeklaDlls)" />
|
||||
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
|
||||
<Copy Condition="Exists('C:\TeklaStructures\2023.0')"
|
||||
DestinationFolder="$(ProgramFiles)\TeklaStructures\2023.0\bin\Env\Bitmaps"
|
||||
SourceFiles="@(TeklaBmp)" />
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Speckle.Objects" />
|
||||
<PackageReference Include="Tekla.Structures.Dialog" IncludeAssets="compile; build" VersionOverride =" 2023.0.1" />
|
||||
<PackageReference Include="Tekla.Structures.Drawing" IncludeAssets="compile; build" VersionOverride =" 2023.0.1"/>
|
||||
<PackageReference Include="Tekla.Structures.Model" IncludeAssets="compile; build" VersionOverride =" 2023.0.1" />
|
||||
<PackageReference Include="Tekla.Structures.Plugins" IncludeAssets="compile; build" VersionOverride =" 2023.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\Converters\Tekla\Speckle.Converter.Tekla2023\Speckle.Converter.Tekla2023.csproj" />
|
||||
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="WindowsFormsIntegration" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="..\Speckle.Connector.TeklaShared\Speckle.Connectors.TeklaShared.projitems" Label="Shared" />
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,440 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dependencies": {
|
||||
".NETFramework,Version=v4.8": {
|
||||
"Microsoft.NETFramework.ReferenceAssemblies": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.0.3, )",
|
||||
"resolved": "1.0.3",
|
||||
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
|
||||
}
|
||||
},
|
||||
"Microsoft.SourceLink.GitHub": {
|
||||
"type": "Direct",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "8.0.0",
|
||||
"contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
|
||||
"dependencies": {
|
||||
"Microsoft.Build.Tasks.Git": "8.0.0",
|
||||
"Microsoft.SourceLink.Common": "8.0.0"
|
||||
}
|
||||
},
|
||||
"PolySharp": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.14.1, )",
|
||||
"resolved": "1.14.1",
|
||||
"contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ=="
|
||||
},
|
||||
"Speckle.InterfaceGenerator": {
|
||||
"type": "Direct",
|
||||
"requested": "[0.9.6, )",
|
||||
"resolved": "0.9.6",
|
||||
"contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w=="
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "Direct",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Dialog": {
|
||||
"type": "Direct",
|
||||
"requested": "[2023.0.1, )",
|
||||
"resolved": "2023.0.1",
|
||||
"contentHash": "gtU7dwMvnGe1+JnERp4ve6vHAIX55zNDg4VpoPKNMH75s8eV8qVPYD3ThFj9mhAylFPaQWVohXIqHXpNaDSJ5A==",
|
||||
"dependencies": {
|
||||
"Tekla.Structures": "2023.0.1",
|
||||
"Tekla.Structures.Catalogs": "2023.0.1",
|
||||
"Tekla.Structures.Datatype": "2023.0.1",
|
||||
"Tekla.Structures.Model": "2023.0.1",
|
||||
"Tekla.Structures.Plugins": "2023.0.1"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Drawing": {
|
||||
"type": "Direct",
|
||||
"requested": "[2023.0.1, )",
|
||||
"resolved": "2023.0.1",
|
||||
"contentHash": "YAOYc0L1Tvjls1tFlpUTmLE2K3urq4XSxtxa2UtX6hC7XDiblRmwJTXAcBeiQ/mbB67k//WH8wh7QR/2h5nBAQ==",
|
||||
"dependencies": {
|
||||
"Tekla.Structures": "2023.0.1",
|
||||
"Tekla.Structures.Datatype": "2023.0.1",
|
||||
"Tekla.Structures.Dialog": "2023.0.1",
|
||||
"Tekla.Structures.Model": "2023.0.1",
|
||||
"Tekla.Structures.Plugins": "2023.0.1"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Model": {
|
||||
"type": "Direct",
|
||||
"requested": "[2023.0.1, )",
|
||||
"resolved": "2023.0.1",
|
||||
"contentHash": "99e9lyTcW+Me4c4wUKqLbXoxHusPGSeBJGf01Upzg2lzXzaw5pUmVxEikNvievoN9Qt3Y09NTvhuL87UML7OIQ==",
|
||||
"dependencies": {
|
||||
"Tekla.Structures": "2023.0.1",
|
||||
"Tekla.Structures.Datatype": "2023.0.1"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Plugins": {
|
||||
"type": "Direct",
|
||||
"requested": "[2023.0.1, )",
|
||||
"resolved": "2023.0.1",
|
||||
"contentHash": "Wap1V8Fri3VAirfX51tqaQk6yPqPGj9Y9Y2FGPdyXg+7wZy+S1H+3DxtzEmh7ZuCHqCv5gIP0r+1yLE9fcjHdw==",
|
||||
"dependencies": {
|
||||
"Tekla.Structures": "2023.0.1"
|
||||
}
|
||||
},
|
||||
"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.Net.WebSockets.Client.Managed": "1.0.22",
|
||||
"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.Bcl.AsyncInterfaces": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==",
|
||||
"dependencies": {
|
||||
"System.Threading.Tasks.Extensions": "4.5.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Build.Tasks.Git": {
|
||||
"type": "Transitive",
|
||||
"resolved": "8.0.0",
|
||||
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
||||
},
|
||||
"Microsoft.CSharp": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.7.0",
|
||||
"contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Abstractions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Primitives": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Binder": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.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.net48": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.3",
|
||||
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
|
||||
},
|
||||
"Microsoft.SourceLink.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "8.0.0",
|
||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||
},
|
||||
"Speckle.DoubleNumerics": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.0.1",
|
||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
||||
},
|
||||
"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.dynamic_cdecl": "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.dynamic_cdecl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.1.4",
|
||||
"contentHash": "ZsaKKhgYF9B1fvcnOGKl3EycNAwd9CRWX7v0rEfuPWhQQ5Jjpvf2VEHahiLIGHio3hxi3EIKFJw9KvyowWOUAw==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
},
|
||||
"System.Buffers": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.4.0",
|
||||
"contentHash": "AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw=="
|
||||
},
|
||||
"System.ComponentModel.Annotations": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.0",
|
||||
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
|
||||
},
|
||||
"System.Memory": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.3",
|
||||
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==",
|
||||
"dependencies": {
|
||||
"System.Buffers": "4.4.0",
|
||||
"System.Numerics.Vectors": "4.4.0",
|
||||
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
|
||||
}
|
||||
},
|
||||
"System.Net.WebSockets.Client.Managed": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.22",
|
||||
"contentHash": "WqEOxPlXjuZrIjUtXNE9NxEfU/n5E35iV2PtoZdJSUC4tlrqwHnTee+wvMIM4OUaJWmwrymeqcgYrE0IkGAgLA==",
|
||||
"dependencies": {
|
||||
"System.Buffers": "4.4.0",
|
||||
"System.Numerics.Vectors": "4.4.0"
|
||||
}
|
||||
},
|
||||
"System.Numerics.Vectors": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.4.0",
|
||||
"contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
|
||||
},
|
||||
"System.Reactive": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||
"dependencies": {
|
||||
"System.Threading.Tasks.Extensions": "4.5.4"
|
||||
}
|
||||
},
|
||||
"System.Runtime.CompilerServices.Unsafe": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.3",
|
||||
"contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw=="
|
||||
},
|
||||
"System.Threading.Tasks.Extensions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.4",
|
||||
"contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==",
|
||||
"dependencies": {
|
||||
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2023.0.1",
|
||||
"contentHash": "M+3JfeWQsgYH3Lukhkfb/7nDOuANymde1HBYeyv+qG98vuIsgiU6u66vJv3XXiYM2islRodCBn7+ZI3vaJ1Tug=="
|
||||
},
|
||||
"Tekla.Structures.Catalogs": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2023.0.1",
|
||||
"contentHash": "jrsQDTiy/Xy72rI/s+olNzgN98WEDAcAj4TPT5opM0dvcnqMlf3uEGrEOKciO4tjSTmKfL9EJ8GZODsARKgKpw==",
|
||||
"dependencies": {
|
||||
"Tekla.Structures": "2023.0.1",
|
||||
"Tekla.Structures.Datatype": "2023.0.1",
|
||||
"Tekla.Structures.Model": "2023.0.1"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Datatype": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2023.0.1",
|
||||
"contentHash": "24KbR++C2WYEIyDymIHX/AVuHYcgwyQrvgExMKDnMobQPNM+AmMNnwdyYxBbw4AvYXd8QHoi+lmmavhTCL8E3w=="
|
||||
},
|
||||
"speckle.connectors.common": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.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.converter.tekla2023": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Speckle.Converters.Common": "[1.0.0, )",
|
||||
"Tekla.Structures.Drawing": "[2023.0.1, )",
|
||||
"Tekla.Structures.Model": "[2023.0.1, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.common": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"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.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"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.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[6.0.0, )",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
using Speckle.Connectors.DUI.Bindings;
|
||||
using Speckle.Connectors.DUI.Bridge;
|
||||
using Speckle.Connectors.DUI.Models;
|
||||
using Speckle.Connectors.DUI.Models.Card;
|
||||
using Speckle.Sdk;
|
||||
|
||||
namespace Speckle.Connector.Tekla2024.Bindings;
|
||||
|
||||
public class TeklaBasicConnectorBinding : IBasicConnectorBinding
|
||||
{
|
||||
private readonly ISpeckleApplication _speckleApplication;
|
||||
private readonly DocumentModelStore _store;
|
||||
public string Name => "baseBinding";
|
||||
public IBrowserBridge Parent { get; }
|
||||
|
||||
public TeklaBasicConnectorBinding(
|
||||
IBrowserBridge parent,
|
||||
ISpeckleApplication speckleApplication,
|
||||
DocumentModelStore store
|
||||
)
|
||||
{
|
||||
_speckleApplication = speckleApplication;
|
||||
_store = store;
|
||||
Parent = parent;
|
||||
}
|
||||
|
||||
public string GetSourceApplicationName() => _speckleApplication.Slug;
|
||||
|
||||
public string GetSourceApplicationVersion() => _speckleApplication.HostApplicationVersion;
|
||||
|
||||
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
|
||||
|
||||
public DocumentInfo? GetDocumentInfo() => new DocumentInfo("Test", "Test", "Test");
|
||||
|
||||
public DocumentModelStore GetDocumentState() => _store;
|
||||
|
||||
public void AddModel(ModelCard model) => _store.Models.Add(model);
|
||||
|
||||
public void UpdateModel(ModelCard model) => _store.UpdateModel(model);
|
||||
|
||||
public void RemoveModel(ModelCard model) => _store.RemoveModel(model);
|
||||
|
||||
public Task HighlightModel(string modelCardId) => throw new NotImplementedException();
|
||||
|
||||
public Task HighlightObjects(IReadOnlyList<string> objectIds) => throw new NotImplementedException();
|
||||
|
||||
public BasicConnectorBindingCommands Commands { get; }
|
||||
}
|
||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 148 KiB |
@@ -1 +0,0 @@
|
||||
global using TSM = Tekla.Structures.Model;
|
||||
@@ -1,55 +0,0 @@
|
||||
using Speckle.Converter.Tekla2024.Extensions;
|
||||
using Speckle.Sdk.Models.Proxies;
|
||||
|
||||
namespace Speckle.Connector.Tekla2024.HostApp;
|
||||
|
||||
public class ComponentUnpacker
|
||||
{
|
||||
// POC: should add ILogger here in the case that component unpacker fails to unpack a component
|
||||
|
||||
/// <summary>
|
||||
/// Stores processed Base Components as group proxies. These include Components and Connections.
|
||||
/// Expects to be scoped per send operation. Should be added to the root collection.
|
||||
/// </summary>
|
||||
public Dictionary<string, GroupProxy> ComponentProxiesCache { get; } = new();
|
||||
|
||||
public ComponentUnpacker() { }
|
||||
|
||||
public IEnumerable<TSM.ModelObject> UnpackComponents(IReadOnlyList<TSM.ModelObject> modelObjects)
|
||||
{
|
||||
foreach (TSM.ModelObject modelObject in modelObjects)
|
||||
{
|
||||
if (modelObject is TSM.BaseComponent component)
|
||||
{
|
||||
// create a group proxy for this component
|
||||
string appId = component.GetSpeckleApplicationId();
|
||||
List<string> childIds = new();
|
||||
|
||||
foreach (TSM.ModelObject child in component.GetChildren())
|
||||
{
|
||||
childIds.Add(child.GetSpeckleApplicationId());
|
||||
yield return child;
|
||||
}
|
||||
|
||||
GroupProxy componentProxy =
|
||||
new()
|
||||
{
|
||||
name = component.Name,
|
||||
objects = childIds,
|
||||
applicationId = appId
|
||||
};
|
||||
|
||||
componentProxy["number"] = component.Number;
|
||||
|
||||
if (!ComponentProxiesCache.ContainsKey(appId))
|
||||
{
|
||||
ComponentProxiesCache.Add(appId, componentProxy);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
yield return modelObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using Speckle.Connectors.DUI.Models;
|
||||
using Speckle.Newtonsoft.Json;
|
||||
|
||||
namespace Speckle.Connector.Tekla2024.HostApp;
|
||||
|
||||
public class TeklaDocumentModelStore : DocumentModelStore
|
||||
{
|
||||
public TeklaDocumentModelStore(
|
||||
JsonSerializerSettings jsonSerializerSettings
|
||||
// ITopLevelExceptionHandler topLevelExceptionHandler
|
||||
)
|
||||
: base(jsonSerializerSettings, true) { }
|
||||
|
||||
public override void WriteToFile() { }
|
||||
|
||||
public override void ReadFromFile() { }
|
||||
}
|
||||
@@ -2,22 +2,39 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<TeklaVersion>2024</TeklaVersion>
|
||||
<UseWpf>true</UseWpf>
|
||||
<DefineConstants>$(DefineConstants);TEKLA2024</DefineConstants>
|
||||
<PostBuildEvent>RD /S /Q "$(TargetDir)arm64\"
|
||||
if EXIST "C:\Program Files\Tekla Structures\2024.0\" (
|
||||
xcopy "$(TargetDir)*.*" "C:\ProgramData\Trimble\Tekla Structures\2024.0\Environments\common\extensions\Speckle3TeklaStructures" /Y /I /E
|
||||
)
|
||||
if EXIST "C:\TeklaStructures\2024.0\" (
|
||||
xcopy "$(TargetDir)*.*" "C:\TeklaStructures\2024.0\Environments\common\extensions\Speckle3TeklaStructures" /Y /I /E
|
||||
)
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
|
||||
<Target AfterTargets="Build" Name="AfterBuildTekla" Condition="'$(TeklaVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true'">
|
||||
<ItemGroup>
|
||||
<TeklaDlls Include="$(TargetDir)\**\*.*" Exclude="$(TargetDir)*.bmp" />
|
||||
<TeklaBmp Include="$(TargetDir)\Assets\et_element_Speckle.bmp"/>
|
||||
</ItemGroup>
|
||||
<Message Text="TeklaVersion $(TeklaVersion)" Importance="high"/>
|
||||
<Copy Condition="Exists('$(ProgramData)\Trimble\Tekla Structures\$(TeklaVersion).0')"
|
||||
DestinationFolder="$(ProgramData)\Trimble\Tekla Structures\$(TeklaVersion).0\Environments\common\extensions\Speckle3TeklaStructures\%(RecursiveDir)"
|
||||
SourceFiles="@(TeklaDlls)" />
|
||||
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
|
||||
<Copy Condition="Exists('$(ProgramData)\Trimble\Tekla Structures\$(TeklaVersion).0')"
|
||||
DestinationFolder="$(ProgramData)\Trimble\Tekla Structures\$(TeklaVersion).0\Bitmaps"
|
||||
SourceFiles="@(TeklaBmp)" />
|
||||
</ItemGroup>
|
||||
<Copy Condition="Exists('C:\TeklaStructures\2024.0')"
|
||||
DestinationFolder="C:\TeklaStructures\2024.0\Environments\common\extensions\Speckle3TeklaStructures\%(RecursiveDir)"
|
||||
SourceFiles="@(TeklaDlls)" />
|
||||
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
|
||||
<Copy Condition="Exists('C:\TeklaStructures\2024.0')"
|
||||
DestinationFolder="$(ProgramFiles)\TeklaStructures\2024.0\bin\Env\Bitmaps"
|
||||
SourceFiles="@(TeklaBmp)" />
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Speckle.Objects" />
|
||||
<PackageReference Include="Tekla.Structures.Dialog" IncludeAssets="compile; build" PrivateAssets="all" />
|
||||
<PackageReference Include="Tekla.Structures.Drawing" />
|
||||
<PackageReference Include="Tekla.Structures.Drawing" IncludeAssets="compile; build" PrivateAssets="all"/>
|
||||
<PackageReference Include="Tekla.Structures.Model" IncludeAssets="compile; build" PrivateAssets="all" />
|
||||
<PackageReference Include="Tekla.Structures.Plugins" IncludeAssets="compile; build" PrivateAssets="all" />
|
||||
</ItemGroup>
|
||||
@@ -31,4 +48,6 @@
|
||||
<Reference Include="WindowsFormsIntegration" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="..\Speckle.Connector.TeklaShared\Speckle.Connectors.TeklaShared.projitems" Label="Shared" />
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Forms.Integration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Speckle.Connectors.Common;
|
||||
using Speckle.Connectors.DUI.WebView;
|
||||
using Speckle.Converter.Tekla2024;
|
||||
using Speckle.Sdk.Host;
|
||||
using Tekla.Structures.Dialog;
|
||||
using Tekla.Structures.Model;
|
||||
using Tekla.Structures.Model.Operations;
|
||||
|
||||
namespace Speckle.Connector.Tekla2024;
|
||||
|
||||
public class SpeckleTeklaPanelHost : PluginFormBase
|
||||
{
|
||||
private ElementHost Host { get; }
|
||||
public Model Model { get; private set; }
|
||||
|
||||
public static new ServiceProvider? Container { get; private set; }
|
||||
|
||||
// TODO: private IDisposable? _disposableLogger;
|
||||
|
||||
public SpeckleTeklaPanelHost()
|
||||
{
|
||||
var services = new ServiceCollection();
|
||||
services.Initialize(HostApplications.TeklaStructures, GetVersion());
|
||||
services.AddTekla();
|
||||
services.AddTeklaConverters();
|
||||
|
||||
// TODO: Add Tekla converters
|
||||
|
||||
Container = services.BuildServiceProvider();
|
||||
|
||||
Model = new Model(); // don't know what is this..
|
||||
if (!Model.GetConnectionStatus())
|
||||
{
|
||||
MessageBox.Show(
|
||||
"Speckle connector connection failed. Please try again.",
|
||||
"Error",
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error
|
||||
);
|
||||
}
|
||||
var webview = Container.GetRequiredService<DUI3ControlWebView>();
|
||||
Host = new() { Child = webview, Dock = DockStyle.Fill };
|
||||
Controls.Add(Host);
|
||||
Operation.DisplayPrompt("Speckle connector initialized.");
|
||||
|
||||
Show();
|
||||
Activate();
|
||||
Focus();
|
||||
}
|
||||
|
||||
private HostAppVersion GetVersion()
|
||||
{
|
||||
#if TEKLA2024
|
||||
return HostAppVersion.v2024;
|
||||
#else
|
||||
throw new NotImplementedException();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -35,25 +35,25 @@
|
||||
},
|
||||
"Speckle.Objects": {
|
||||
"type": "Direct",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "VpMlOcApkQPLn90Xb5K+2nH64wN3NJ906u/YaM1oGAMw7v1SoYPbb5i03bFLuOw/Ho1KSGI0ccU82Jpi9p+n8A==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "+m7jRFm0ABbkcSz2UphdxAsislY10IpQ1u79c8a3aVvegLjnsVQZ1sXfRIRO1aFdulkhjYKXYpB3N9M8Z+epgQ==",
|
||||
"dependencies": {
|
||||
"Speckle.Sdk": "3.1.0-dev.167"
|
||||
"Speckle.Sdk": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Dialog": {
|
||||
"type": "Direct",
|
||||
"requested": "[2024.0.2, )",
|
||||
"resolved": "2024.0.2",
|
||||
"contentHash": "VY1n7ROsUMHomHwJBYbmTt58M9qSuGqkcdWS8GTJUU5NOZsIsoS746fT7E+YBpUyP+9tyzibv4OW9vQj1sDEAA==",
|
||||
"requested": "[2024.0.4, )",
|
||||
"resolved": "2024.0.4",
|
||||
"contentHash": "pBovjVxSzm9k87637Jaw684M4LdXZgolJv2xsPYcgBrVzNaoLojwag1YzTXXR+/iqM3XBy7/J0F3czkh3aZj1Q==",
|
||||
"dependencies": {
|
||||
"Tekla.Common.Geometry": "4.6.2",
|
||||
"Tekla.Structures": "2024.0.2",
|
||||
"Tekla.Structures.Catalogs": "2024.0.2",
|
||||
"Tekla.Structures.Datatype": "2024.0.2",
|
||||
"Tekla.Structures.Model": "2024.0.2",
|
||||
"Tekla.Structures.Plugins": "2024.0.2",
|
||||
"Tekla.Structures": "2024.0.4",
|
||||
"Tekla.Structures.Catalogs": "2024.0.4",
|
||||
"Tekla.Structures.Datatype": "2024.0.4",
|
||||
"Tekla.Structures.Model": "2024.0.4",
|
||||
"Tekla.Structures.Plugins": "2024.0.4",
|
||||
"Tekla.Technology.Akit5": "5.15.0",
|
||||
"Tekla.Technology.Scripting.Plugins": "5.5.0",
|
||||
"Tekla.Technology.Serialization": "4.1.1",
|
||||
@@ -63,39 +63,39 @@
|
||||
},
|
||||
"Tekla.Structures.Drawing": {
|
||||
"type": "Direct",
|
||||
"requested": "[2024.0.2, )",
|
||||
"resolved": "2024.0.2",
|
||||
"contentHash": "1/rlqkt/Wy9sdMvGXm8GH6fUm9fEASnRPCftvAn0nrtV5qinKbbwEpcxfWrlDneoSVAZY8qL/V8UsXztqO2YRQ==",
|
||||
"requested": "[2024.0.4, )",
|
||||
"resolved": "2024.0.4",
|
||||
"contentHash": "66xsZ+WTNlKgFEh2oa2+cc+F2XK/UrbiwUnp4vgEgTVbxMwquAKIVvnW/PYaGs55393FiS3fIGSfG/lHUp7qHA==",
|
||||
"dependencies": {
|
||||
"Tekla.Common.Geometry": "4.6.2",
|
||||
"Tekla.Structures": "2024.0.2",
|
||||
"Tekla.Structures.Datatype": "2024.0.2",
|
||||
"Tekla.Structures.Model": "2024.0.2",
|
||||
"Tekla.Structures.Plugins": "2024.0.2",
|
||||
"Tekla.Structures": "2024.0.4",
|
||||
"Tekla.Structures.Datatype": "2024.0.4",
|
||||
"Tekla.Structures.Model": "2024.0.4",
|
||||
"Tekla.Structures.Plugins": "2024.0.4",
|
||||
"Tekla.Technology.Serialization": "4.1.1",
|
||||
"Trimble.Remoting": "1.0.2"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Model": {
|
||||
"type": "Direct",
|
||||
"requested": "[2024.0.2, )",
|
||||
"resolved": "2024.0.2",
|
||||
"contentHash": "GV7mqc3TX7h3QeCLmjCI8GlnbhAMYOvLMEED1TY+hpdeWtMuHxGS7GwfLgG10iUdjumqy5Qmn2VE3PIRhw5hWg==",
|
||||
"requested": "[2024.0.4, )",
|
||||
"resolved": "2024.0.4",
|
||||
"contentHash": "cjSNpSEtz6kB9SwMry/t5m7xrgYHsL5G5JhLqcpBW0W9Id9GnC0hn6rEfJIld2y4dHuA2UvVDvjIX9RBSfZg3A==",
|
||||
"dependencies": {
|
||||
"Tekla.Common.Geometry": "4.6.2",
|
||||
"Tekla.Structures": "2024.0.2",
|
||||
"Tekla.Structures.Datatype": "2024.0.2",
|
||||
"Tekla.Structures": "2024.0.4",
|
||||
"Tekla.Structures.Datatype": "2024.0.4",
|
||||
"Tekla.Technology.Serialization": "4.1.1",
|
||||
"Trimble.Remoting": "1.0.2"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Plugins": {
|
||||
"type": "Direct",
|
||||
"requested": "[2024.0.2, )",
|
||||
"resolved": "2024.0.2",
|
||||
"contentHash": "40Dn4sAcfLJc1Gi6sK95tVz8BwmB4vvRjcZcFJ55F3HMr2mwtcJhvDQED0exlZuU3pbibjhUZaNz0/I16Mms/w==",
|
||||
"requested": "[2024.0.4, )",
|
||||
"resolved": "2024.0.4",
|
||||
"contentHash": "GUzN5Vs/PwgusrTMRFDnfoW+LNmbjquqCFRIuslbswMSJDA1kLUs8pJAFHGBl6ZuarQ37O4Wb2n8hudQ+lluGg==",
|
||||
"dependencies": {
|
||||
"Tekla.Structures": "2024.0.2",
|
||||
"Tekla.Structures": "2024.0.4",
|
||||
"Tekla.Technology.Scripting.Plugins": "5.5.0",
|
||||
"Tekla.Technology.Serialization": "4.1.1",
|
||||
"Trimble.Remoting": "1.0.2"
|
||||
@@ -153,17 +153,17 @@
|
||||
},
|
||||
"Microsoft.Data.Sqlite": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "tiNmV1oPy+Z2R7Wd0bPB/FxCr8B+/5q11OpDMG751GA/YuOL7MZrBFfzv5oFRlFe08K6sjrnbrauzzGIeNrzLQ==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.7",
|
||||
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.Sqlite.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "7.0.7",
|
||||
"contentHash": "21FRzcJhaTrlv7kTrqr/ltFcSQM2TyuTTPhUcjO8H73od7Bb3QraNW90c7lUucNI/245XPkKZG4fp7/7OsKCSg==",
|
||||
"resolved": "7.0.5",
|
||||
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||
"dependencies": {
|
||||
"SQLitePCLRaw.core": "2.1.4"
|
||||
}
|
||||
@@ -192,11 +192,6 @@
|
||||
"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",
|
||||
@@ -338,8 +333,8 @@
|
||||
},
|
||||
"Tekla.Structures": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2024.0.2",
|
||||
"contentHash": "m7URRYK7sEzumr/+TJRNd4q2nutF9qMUbIIPmbr36cbaKiBGW0xxAgveTL8+7kkDqodhAGyUTVai5gOtvYi2SQ==",
|
||||
"resolved": "2024.0.4",
|
||||
"contentHash": "Y55enG2I2C0drdHubnAavjzUjEPyTRjOMfoce63F4cM7Oqb5KS8j4v9/iE1bENmJ0Yyt5f7z3o7a8Bv9dWE1Pw==",
|
||||
"dependencies": {
|
||||
"Tekla.Common.Geometry": "4.6.2",
|
||||
"Tekla.Technology.Serialization": "4.1.1",
|
||||
@@ -348,21 +343,21 @@
|
||||
},
|
||||
"Tekla.Structures.Catalogs": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2024.0.2",
|
||||
"contentHash": "1VUbPKtzTUMwUP21jqN+c1gLEtxi31+KYPis/n2Plty2k5Zj4gM3Q428KhjMgyHOoc7bWJX/kjfUQBCYuhqAsQ==",
|
||||
"resolved": "2024.0.4",
|
||||
"contentHash": "sqQjP3t+3NSS606Pj85jf6Ao/zxOEG4VDhAzoJGtm9NBbwIWeBjl5CySNaaAVsBUdQDnQM29tC8u8sBQsZ7bRw==",
|
||||
"dependencies": {
|
||||
"Tekla.Common.Geometry": "4.6.2",
|
||||
"Tekla.Structures": "2024.0.2",
|
||||
"Tekla.Structures.Datatype": "2024.0.2",
|
||||
"Tekla.Structures.Model": "2024.0.2",
|
||||
"Tekla.Structures": "2024.0.4",
|
||||
"Tekla.Structures.Datatype": "2024.0.4",
|
||||
"Tekla.Structures.Model": "2024.0.4",
|
||||
"Tekla.Technology.Serialization": "4.1.1",
|
||||
"Trimble.Remoting": "1.0.2"
|
||||
}
|
||||
},
|
||||
"Tekla.Structures.Datatype": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2024.0.2",
|
||||
"contentHash": "LtLUtkYuni+R1F0UAPXWmgjAPBZORabG+/2YVOhJBj6+0x6Fg0PxgDtABNMNniN7A7BFXaYQRI/fuP35VL8BFQ=="
|
||||
"resolved": "2024.0.4",
|
||||
"contentHash": "mtJQmPBQ4d+LnJdpgjljGeNmnFTkZoZhYJhRmU3I4nCo6vzvuKb+eIAlzBQ6QJnHnTdpyUT7Hr/Xph5YZbCKVw=="
|
||||
},
|
||||
"Tekla.Technology.Akit5": {
|
||||
"type": "Transitive",
|
||||
@@ -413,9 +408,9 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"speckle.connectors.dui": {
|
||||
@@ -423,8 +418,8 @@
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.167, )",
|
||||
"Speckle.Sdk": "[3.1.0-dev.191, )",
|
||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.191, )",
|
||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
||||
}
|
||||
},
|
||||
@@ -442,15 +437,15 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Speckle.Converters.Common": "[1.0.0, )",
|
||||
"Tekla.Structures.Drawing": "[2024.0.2, )",
|
||||
"Tekla.Structures.Model": "[2024.0.2, )"
|
||||
"Tekla.Structures.Drawing": "[2024.0.4, )",
|
||||
"Tekla.Structures.Model": "[2024.0.4, )"
|
||||
}
|
||||
},
|
||||
"speckle.converters.common": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||
"Speckle.Objects": "[3.1.0-dev.167, )"
|
||||
"Speckle.Objects": "[3.1.0-dev.191, )"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection": {
|
||||
@@ -462,6 +457,12 @@
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[8.0.0, )",
|
||||
"resolved": "2.2.0",
|
||||
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[2.2.0, )",
|
||||
@@ -488,26 +489,26 @@
|
||||
},
|
||||
"Speckle.Sdk": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "KGbynDH2vFca7NqpVTp3KvNDE5zdX/ZuCtjdtqGG7rS8r5x2YMT6Ptk2RKJrpPNCaNL/YnuiZ425JLWua4lfqw==",
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "VVT3LJiYlhqnggxxdeTt1QLrqfxDb044x0yX6kxS9b5MRzeDvK2Vz86pLDfuHs+SXvDimRVfYx1M42IW/aPcTQ==",
|
||||
"dependencies": {
|
||||
"GraphQL.Client": "6.0.0",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.Data.Sqlite": "7.0.7",
|
||||
"Microsoft.Data.Sqlite": "7.0.5",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||
"Microsoft.Extensions.Logging": "2.2.0",
|
||||
"Speckle.DoubleNumerics": "4.0.1",
|
||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.167"
|
||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.191"
|
||||
}
|
||||
},
|
||||
"Speckle.Sdk.Dependencies": {
|
||||
"type": "CentralTransitive",
|
||||
"requested": "[3.1.0-dev.167, )",
|
||||
"resolved": "3.1.0-dev.167",
|
||||
"contentHash": "LOV43Wn6IYWfK+ifz/XfcYDaL5ZFF6wLVJQGgSkaNEpGOBitCg6bQc2AuNuy5QHk85dbB1QS9XXEXjeoMxugLg=="
|
||||
"requested": "[3.1.0-dev.191, )",
|
||||
"resolved": "3.1.0-dev.191",
|
||||
"contentHash": "EmEOyjsGsNi56Z/ZoBOn8WirTmIT2yqWvlUeUh0BSPX2TDMZXHTKOM/kHmP6HSd10KVFn2Zo/ItY7/K9iRtL1Q=="
|
||||
},
|
||||
"System.Threading.Tasks.Dataflow": {
|
||||
"type": "CentralTransitive",
|
||||
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
using System.Collections;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Speckle.Connectors.DUI.Bindings;
|
||||
using Speckle.Connectors.DUI.Bridge;
|
||||
using Speckle.Connectors.DUI.Models;
|
||||
using Speckle.Connectors.DUI.Models.Card;
|
||||
using Speckle.Sdk;
|
||||
using Tekla.Structures;
|
||||
using Tekla.Structures.Geometry3d;
|
||||
|
||||
namespace Speckle.Connector.Tekla2024.Bindings;
|
||||
|
||||
public class TeklaBasicConnectorBinding : IBasicConnectorBinding
|
||||
{
|
||||
public BasicConnectorBindingCommands Commands { get; }
|
||||
private readonly ISpeckleApplication _speckleApplication;
|
||||
private readonly DocumentModelStore _store;
|
||||
public string Name => "baseBinding";
|
||||
public IBrowserBridge Parent { get; }
|
||||
private readonly ILogger<TeklaBasicConnectorBinding> _logger;
|
||||
private readonly TSM.Model _model;
|
||||
|
||||
public TeklaBasicConnectorBinding(
|
||||
IBrowserBridge parent,
|
||||
ISpeckleApplication speckleApplication,
|
||||
DocumentModelStore store,
|
||||
ILogger<TeklaBasicConnectorBinding> logger,
|
||||
TSM.Model model
|
||||
)
|
||||
{
|
||||
_speckleApplication = speckleApplication;
|
||||
_store = store;
|
||||
Parent = parent;
|
||||
_logger = logger;
|
||||
_model = model;
|
||||
Commands = new BasicConnectorBindingCommands(parent);
|
||||
_store.DocumentChanged += (_, _) =>
|
||||
parent.TopLevelExceptionHandler.FireAndForget(async () =>
|
||||
{
|
||||
await Commands.NotifyDocumentChanged().ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
|
||||
public string GetSourceApplicationName() => _speckleApplication.Slug;
|
||||
|
||||
public string GetSourceApplicationVersion() => _speckleApplication.HostApplicationVersion;
|
||||
|
||||
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
|
||||
|
||||
public DocumentInfo? GetDocumentInfo() => new DocumentInfo("Test", "Test", "Test");
|
||||
|
||||
public DocumentModelStore GetDocumentState() => _store;
|
||||
|
||||
public void AddModel(ModelCard model) => _store.Models.Add(model);
|
||||
|
||||
public void UpdateModel(ModelCard model) => _store.UpdateModel(model);
|
||||
|
||||
public void RemoveModel(ModelCard model) => _store.RemoveModel(model);
|
||||
|
||||
public async Task HighlightModel(string modelCardId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var model = _store.GetModelById(modelCardId);
|
||||
if (model == null)
|
||||
{
|
||||
_logger.LogError("Model was null when highlighting received model");
|
||||
return;
|
||||
}
|
||||
|
||||
List<string> objectIds = new();
|
||||
if (model is SenderModelCard senderModel)
|
||||
{
|
||||
objectIds = senderModel.SendFilter?.RefreshObjectIds() ?? new List<string>();
|
||||
}
|
||||
else if (model is ReceiverModelCard receiverModel)
|
||||
{
|
||||
objectIds = receiverModel.BakedObjectIds?.ToList() ?? new List<string>();
|
||||
}
|
||||
|
||||
if (objectIds.Count == 0)
|
||||
{
|
||||
await Commands
|
||||
.SetModelError(modelCardId, new OperationCanceledException("No objects found to highlight."))
|
||||
.ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
await HighlightObjects(objectIds).ConfigureAwait(false);
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
_logger.LogError(ex, "Failed to highlight model");
|
||||
await Commands.SetModelError(modelCardId, ex).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task HighlightObjects(IReadOnlyList<string> objectIds)
|
||||
{
|
||||
try
|
||||
{
|
||||
await Task.Run(() =>
|
||||
{
|
||||
// passing an empty list to create current selection
|
||||
var selector = new TSMUI.ModelObjectSelector();
|
||||
selector.Select(new ArrayList());
|
||||
|
||||
if (objectIds.Count > 0)
|
||||
{
|
||||
var modelObjects = objectIds
|
||||
.Select(id => _model.SelectModelObject(new Identifier(new Guid(id))))
|
||||
.Where(obj => obj != null)
|
||||
.ToList();
|
||||
|
||||
selector.Select(new ArrayList(modelObjects));
|
||||
|
||||
// to find the min and max coordinates of the selected objects
|
||||
// with that we can create a bounding box and zoom selected
|
||||
var points = new List<Point>();
|
||||
foreach (var obj in modelObjects)
|
||||
{
|
||||
points.Add(obj.GetCoordinateSystem().Origin);
|
||||
foreach (TSM.ModelObject child in obj.GetChildren())
|
||||
{
|
||||
points.Add(child.GetCoordinateSystem().Origin);
|
||||
}
|
||||
}
|
||||
|
||||
var minX = points.Min(p => p.X);
|
||||
var minY = points.Min(p => p.Y);
|
||||
var minZ = points.Min(p => p.Z);
|
||||
var maxX = points.Max(p => p.X);
|
||||
var maxY = points.Max(p => p.Y);
|
||||
var maxZ = points.Max(p => p.Z);
|
||||
|
||||
// create the bounding box
|
||||
var bounds = new AABB { MinPoint = new Point(minX, minY, minZ), MaxPoint = new Point(maxX, maxY, maxZ) };
|
||||
|
||||
// zoom in to bounding box
|
||||
TSMUI.ViewHandler.ZoomToBoundingBox(bounds);
|
||||
}
|
||||
_model.CommitChanges();
|
||||
})
|
||||
.ConfigureAwait(false);
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
_logger.LogError(ex, "Failed to highlight objects");
|
||||
}
|
||||
}
|
||||
}
|
||||
+21
-11
@@ -1,6 +1,7 @@
|
||||
using System.Collections.Concurrent;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Speckle.Connector.Tekla2024.Operations.Send.Settings;
|
||||
using Speckle.Connectors.Common.Caching;
|
||||
using Speckle.Connectors.Common.Cancellation;
|
||||
using Speckle.Connectors.Common.Operations;
|
||||
@@ -42,6 +43,7 @@ public sealed class TeklaSendBinding : ISendBinding, IDisposable
|
||||
private readonly ISdkActivityFactory _activityFactory;
|
||||
private readonly Model _model;
|
||||
private readonly Events _events;
|
||||
private readonly ToSpeckleSettingsManager _toSpeckleSettingsManager;
|
||||
|
||||
private ConcurrentDictionary<string, byte> ChangedObjectIds { get; set; } = new();
|
||||
|
||||
@@ -57,7 +59,8 @@ public sealed class TeklaSendBinding : ISendBinding, IDisposable
|
||||
ILogger<TeklaSendBinding> logger,
|
||||
ITeklaConversionSettingsFactory teklaConversionSettingsFactory,
|
||||
ISpeckleApplication speckleApplication,
|
||||
ISdkActivityFactory activityFactory
|
||||
ISdkActivityFactory activityFactory,
|
||||
ToSpeckleSettingsManager toSpeckleSettingsManager
|
||||
)
|
||||
{
|
||||
_store = store;
|
||||
@@ -73,6 +76,7 @@ public sealed class TeklaSendBinding : ISendBinding, IDisposable
|
||||
Parent = parent;
|
||||
Commands = new SendBindingUICommands(parent);
|
||||
_activityFactory = activityFactory;
|
||||
_toSpeckleSettingsManager = toSpeckleSettingsManager;
|
||||
|
||||
_model = new Model();
|
||||
_events = new Events();
|
||||
@@ -85,33 +89,32 @@ public sealed class TeklaSendBinding : ISendBinding, IDisposable
|
||||
_events.Register();
|
||||
}
|
||||
|
||||
// subscribes the all changes in a modelobject
|
||||
private void ModelHandler_OnChange(List<ChangeData> changes)
|
||||
{
|
||||
foreach (var change in changes)
|
||||
{
|
||||
if (change.Object is { } modelObj)
|
||||
{
|
||||
ChangedObjectIds[modelObj.Identifier.ID.ToString()] = 1;
|
||||
ChangedObjectIds[modelObj.Identifier.GUID.ToString()] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (changes.Count > 0)
|
||||
{
|
||||
_idleManager.SubscribeToIdle(nameof(TeklaSendBinding), () => RunExpirationChecks());
|
||||
// directly calling the RunExpirationChecks, not triggering the idle
|
||||
// TODO: Figure out how idleing works in Tekla
|
||||
Task.FromResult(RunExpirationChecks());
|
||||
}
|
||||
}
|
||||
|
||||
public List<ISendFilter> GetSendFilters() => _sendFilters;
|
||||
|
||||
public List<ICardSetting> GetSendSettings() => [];
|
||||
public List<ICardSetting> GetSendSettings() => [new SendRebarsAsSolidSetting(false)];
|
||||
|
||||
public async Task Send(string modelCardId)
|
||||
{
|
||||
using var activity = _activityFactory.Start();
|
||||
using var scope = _serviceProvider.CreateScope();
|
||||
scope
|
||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<TeklaConversionSettings>>()
|
||||
.Initialize(_teklaConversionSettingsFactory.Create(_model));
|
||||
|
||||
try
|
||||
{
|
||||
@@ -119,12 +122,18 @@ public sealed class TeklaSendBinding : ISendBinding, IDisposable
|
||||
{
|
||||
throw new InvalidOperationException("No publish model card was found.");
|
||||
}
|
||||
using var scope = _serviceProvider.CreateScope();
|
||||
scope
|
||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<TeklaConversionSettings>>()
|
||||
.Initialize(
|
||||
_teklaConversionSettingsFactory.Create(_model, _toSpeckleSettingsManager.GetSendRebarsAsSolid(modelCard))
|
||||
);
|
||||
|
||||
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
|
||||
|
||||
List<ModelObject> teklaObjects = modelCard
|
||||
.SendFilter.NotNull()
|
||||
.GetObjectIds()
|
||||
.RefreshObjectIds()
|
||||
.Select(id => _model.SelectModelObject(new Identifier(new Guid(id))))
|
||||
.Where(obj => obj != null)
|
||||
.ToList();
|
||||
@@ -177,7 +186,7 @@ public sealed class TeklaSendBinding : ISendBinding, IDisposable
|
||||
|
||||
foreach (SenderModelCard modelCard in senders)
|
||||
{
|
||||
var intersection = modelCard.SendFilter.NotNull().GetObjectIds().Intersect(objectIdsList).ToList();
|
||||
var intersection = modelCard.SendFilter.NotNull().SelectedObjectIds.Intersect(objectIdsList).ToList();
|
||||
var isExpired = intersection.Count != 0;
|
||||
if (isExpired)
|
||||
{
|
||||
@@ -186,7 +195,8 @@ public sealed class TeklaSendBinding : ISendBinding, IDisposable
|
||||
}
|
||||
|
||||
await Commands.SetModelsExpired(expiredSenderIds).ConfigureAwait(false);
|
||||
ChangedObjectIds = new();
|
||||
|
||||
ChangedObjectIds = new ConcurrentDictionary<string, byte>();
|
||||
}
|
||||
|
||||
private bool _disposed;
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace Speckle.Connector.Tekla2024.Extensions;
|
||||
|
||||
public static class ModelObjectExtensions
|
||||
{
|
||||
private static readonly IReadOnlyList<Type> s_excludedTypes = new[]
|
||||
{
|
||||
typeof(TSM.ControlPoint),
|
||||
typeof(TSM.Weld),
|
||||
typeof(TSM.Fitting),
|
||||
typeof(TSM.BooleanPart)
|
||||
};
|
||||
|
||||
public static IEnumerable<TSM.ModelObject> GetSupportedChildren(this TSM.ModelObject modelObject)
|
||||
{
|
||||
foreach (TSM.ModelObject childObject in modelObject.GetChildren())
|
||||
{
|
||||
if (!s_excludedTypes.Contains(childObject.GetType()))
|
||||
{
|
||||
yield return childObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
namespace Speckle.Connector.Tekla2024.Extensions;
|
||||
|
||||
public static class SpeckleApplicationIdExtensions
|
||||
{
|
||||
public static string GetSpeckleApplicationId(this TSM.ModelObject modelObject) =>
|
||||
modelObject.Identifier.GUID.ToString();
|
||||
|
||||
public static string GetSpeckleApplicationId(this TSMUI.Color color) =>
|
||||
$"color_{color.Red}_{color.Green}_{color.Blue}_{color.Transparency}";
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user