Compare commits

...

69 Commits

Author SHA1 Message Date
Dimitrie Stefanescu 4f74328ffc wip 2024-12-07 15:34:49 +00:00
Dimitrie Stefanescu 54370f3188 wip 2024-12-07 14:27:48 +00:00
Dimitrie Stefanescu 4a51eae628 feat: total wip expand collection node 2024-12-06 14:52:23 +00:00
Dimitrie Stefanescu 34241385f9 feat: unpacking logic wip 2024-12-06 11:56:33 +00:00
Alan Rynne 7ec01ed39f feat: Working initial nodes
Receive, Collection, URL parsing for models, root object unpacking
2024-12-05 11:00:37 +01:00
Alan Rynne 1ff861f9db v3 Receive outputs most objects, very basic 2024-11-28 12:42:44 +01:00
Alan Rynne 4c125afd7b Working POC receive with working Rhino conversions 2024-11-28 11:35:27 +01:00
Alan Rynne e561980e7f feat: Boilerplate project for Grasshopper v3 2024-11-25 16:04:52 +01:00
Adam Hathcock 7c346a3ac5 update SDK to fix local sln (#404)
* update SDK to fix local

* fix using new types from sdk
2024-11-22 12:43:37 +00:00
Adam Hathcock abcf58d369 DiscriminatedObjectConverter needs DI (#363)
* DiscriminatedObjectConverter needs DI

* settings shouldn't be injected...use injected serializer

* format

* make the factory a singleton

* fix build issue
2024-11-22 15:16:19 +03:00
Dimitrie Stefanescu 2211428614 Merge pull request #401 from specklesystems/oguzhan/fix-unnecessary-expiration-triggers
Fix(revit): escape fast from doc change event handler after WriteToFile
2024-11-21 12:12:24 +00:00
oguzhankoral 08d31ff0d6 Adjust if check more specific 2024-11-21 14:58:37 +03:00
oguzhankoral e055030291 We escape fast from doc change event handler 2024-11-21 14:47:16 +03:00
Dogukan Karatas 1e5cca5ffb adds object tracking (#398)
Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-21 11:12:03 +03:00
Björn Steinhagen 85abeaf7f0 Bjorn/cnx 798 rendermaterialproxy owerritten (#397)
* renderMaterial overwrites

Avoiding type booleanPart alleviates the problem of renderMaterial being overwritten

* logging

Adding a LogError should the problem be not just related to BooelanPart. This won't break the send though and user won't be prompted

---------

Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-21 11:01:13 +03:00
Adam Hathcock 47480809d0 Avoiding some reference null exceptions (#394) 2024-11-20 16:09:04 +00:00
Adam Hathcock 885bb41f27 Update SDK reference to fix external references (#396) 2024-11-20 13:06:17 +03:00
Oğuzhan Koral c74e92fb2e Fix(tekla): Read write model cards to/from appdata + fixes double UI (#395)
* Fix multiple problems

* Connect windows each other

* Add note
2024-11-20 12:14:10 +03:00
Dogukan Karatas a4f27b5c1d dogukan/cnx-744-model-card-highlight-in-tekla (#392)
* adds highlighting methods

* clears selection before highlighting

* adds a functionality to zoom selected

---------

Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-19 23:15:49 +03:00
Adam Hathcock a7941bb4c8 update SDK (#393) 2024-11-19 19:42:14 +03:00
Jedd Morgan 13c29412eb Use of obsolete members now generates warning (#378)
* Use of obsolete members now generates warning

* format

---------

Co-authored-by: Claire Kuang <kuang.claire@gmail.com>
2024-11-19 13:18:47 +00:00
dependabot[bot] 774e24d441 chore(deps): bump codecov/codecov-action from 4 to 5 (#390)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Adam Hathcock <adamhathcock@users.noreply.github.com>
2024-11-19 09:51:22 +00:00
Björn Steinhagen 8822761c48 CNX-751: Add Units to reportProperties (#389)
* Datatype

Main change is the switch from Tekla.Structures.Drawing to Tekla.Structures.Datatype for units. Problem is, that Settings > Options > Units and decimals don't seem to affect API returns. Will confirm with Tekla team. Rudimentary fix applied for now.

* Weight Unit

* Weight Unit

* Consisten representation of internal units

* Distance.CurrentUnitType

As discussed

---------

Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-19 09:38:39 +00:00
Björn Steinhagen 4215f90456 CNX-755: Create Collections by Category (#387)
* sendCollectionManager

* path Builder

Removing iteration where path (currently) only contains 1 item

---------

Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-18 17:06:13 +01:00
Adam Hathcock c8ac385b88 Use Send2 again! (#372)
* Use Send2 again!

* tweaking progress

* Update SDK

* format
2024-11-18 12:29:56 +00:00
Dogukan Karatas b1ef5c74c8 Dogukan/cnx 790 version independent plugin icon (#386)
* adds decimal agnostic grid conversion

* fixes versioning in icon

* formatting

* adds notes

---------

Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-17 21:39:43 +00:00
Oğuzhan Koral a5ff2ca780 Attach parent applicationId to meshes (#385)
- seems like TSM.Solid object doesn't have any Identifier
2024-11-15 15:07:35 +00:00
Jedd Morgan f84c4b2d31 Bump SDK and enforce msbuild warnings (#379)
* Bump SDK

* Updated Tekla structures nugets

* Tekla architecture targeting

* Fixed remaining warnings
2024-11-14 21:16:46 +00:00
Oğuzhan Koral b03e848669 Handle unit changes (#384) 2024-11-13 18:59:10 +00:00
Dogukan Karatas 76ea67af54 dogukan/tekla2023 installer (#382)
* build for 2023

* fix: Delete Assets/*.bmp from csproj as it is referenced in shproj now

* updates the icon

* fix: Revert changes to build.sh

* adds notes

---------

Co-authored-by: Alan Rynne <alan@speckle.systems>
2024-11-12 15:47:06 +01:00
Oğuzhan Koral 12c80e2d40 Fix(dui3): do not pass selectedobjectids from idmap (#380)
* Do not reset selectedObjectIds from IdMap

* Format
2024-11-11 15:19:17 +00:00
Dogukan Karatas c013953368 Dogukan/cnx 679 double UI at the first plugin button click (#381)
* tracks ui instances

* adds icon to the plugin form
2024-11-11 13:59:22 +00:00
Oğuzhan Koral 34457ead0a remove useless code (#377) 2024-11-08 18:06:07 +00:00
Dimitrie Stefanescu 5e92889825 Rhino stability fixes (#375)
* fix: (wip) ensures layer creation is happening where it should (InvokeAndWait)

* fix: ensures polylines with null domains still convert ok

* feat: comments and makes non-public function private

* feat: wraps up fixes

makes layer purging quiet, and removes stale comments
2024-11-08 17:54:41 +00:00
Oğuzhan Koral b2606d209d Feat(revit): CNX-543 category filter (#373)
* POC categories filter

* Set context regardless

* WIP

* More WIP

* More more WIP

* Fix highlight

* Remove RevitSenderModelCard

* Make all working

* Rename SetObjectIds to RefreshObjectIds

* Rename the function for Tekla

* Remove ObjectIds from filters

* Fix RefreshObjectIds return
2024-11-08 13:34:16 +00:00
Dogukan Karatas a18beeca1b Oguzhan/cnx 747 add support for tekla 2023 (#371)
* Create shared project for Tekla connector

* adds shared project

* sync w/ local

* update csproj

* update csproj

---------

Co-authored-by: oguzhankoral <oguzhankoral@gmail.com>
Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-08 12:22:16 +00:00
Jedd Morgan c1293ff395 Fixed autocad async (#370)
Co-authored-by: Alan Rynne <alan@speckle.systems>
2024-11-07 18:49:47 +00:00
Dimitrie Stefanescu bc6f6c4c39 Merge pull request #369 from specklesystems/dimitrie/cnx-643-arcs-in-blocks-are-not-received
Dimitrie/cnx 643 arcs in blocks are not received
2024-11-07 18:43:25 +00:00
Dimitrie Stefanescu befb84db5f chore: comments 2024-11-07 17:46:53 +00:00
Dimitrie Stefanescu 2403288678 fix: allows pre-transformation of all ITransformable objects 2024-11-07 17:46:37 +00:00
Dogukan Karatas cac8e1ba18 adds a setting to send rebars as line or solid (#367)
Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-07 16:54:23 +00:00
Adam Hathcock 06255370f7 Update SDK and dependencies (#366)
* Use new send to have new sqlite paths

* update SDK and dependencies

* fix microsoft.build
2024-11-07 16:04:38 +00:00
Jedd Morgan 6ba70a76c2 Jrm/parameter extraction (#365)
* follow pattern from receive for async

* category can be null

* optimization for try get

* fmt

* Optimised Revit Parameter extraction

* returned the basic solid invalid check

---------

Co-authored-by: Adam Hathcock <adam@hathcock.uk>
Co-authored-by: Adam Hathcock <adamhathcock@users.noreply.github.com>
2024-11-07 12:03:50 +00:00
Dogukan Karatas dd53b70b36 dogukan/cnx-753-normals-are-flipped (#364)
* flips the normals

* adds note
2024-11-07 11:17:49 +00:00
Dogukan Karatas 6873af5ac3 Dogukan/cnx 691 extract appropriate class properties by type (#352)
* adds new properties

* displayValue updated

* adds report properties

* updates report properties

* removes the null parameters

* resolves a conflict

* renames the report property extractor

* updates csproj

* Revert "updates csproj"

This reverts commit b42a21f151.

* updates csproj

* updates rebar displayValue
2024-11-07 10:12:24 +00:00
Adam Hathcock 35d8c41a2b Revit async fix for sending (#362)
* follow pattern from receive for async

* category can be null

* optimization for try get

* fmt
2024-11-07 09:37:21 +00:00
Dimitrie Stefanescu 5f4eebe536 Merge pull request #361 from specklesystems/dimitrie/cnx-634-some-elements-are-received-as-generic-models-ignoring
Dimitrie/cnx 634 some elements are received as generic models ignoring
2024-11-06 19:51:48 +00:00
Dimitrie Stefanescu ba4cfca45b Merge branch 'dev' into dimitrie/cnx-634-some-elements-are-received-as-generic-models-ignoring 2024-11-06 19:27:26 +00:00
Dimitrie Stefanescu f6e4fcd2d0 feat: adds top level converter for railings
and fixes a different bug
2024-11-06 19:26:14 +00:00
Dogukan Karatas d5f1f76e24 dogukan/cnx-748-send-grids-from-tekla (#353)
* create displayValue for grids

* injects gridToSpeckleConverter

---------

Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-06 19:15:37 +00:00
Dimitrie Stefanescu 8a0c9d0128 fix: adds built in category for setting ds cat on receive reliably
note: this is not backwards compatible
2024-11-06 18:33:11 +00:00
Alan Rynne a1ff69502a feat: CXPLA-120 Added tekla zip packaging prior to installers (#357)
* feat: Added tekla zip packaging

Plus tekla Icon and postbuild action refactor

* fix: teaks to post build event

* Make all tekla dependencies private

* fix: update logo
2024-11-06 18:38:18 +01:00
KatKatKateryna b06cf0a06b add appId (#358) 2024-11-07 01:14:06 +08:00
Dogukan Karatas 5d976141fc adds logic for rendering rebars as lines and arcs (#356)
Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com>
2024-11-06 16:26:33 +00:00
Jedd Morgan be8f9e2b5a Fixed test failing on german culture (#355) 2024-11-06 13:25:22 +00:00
KatKatKateryna 6bf18096e7 CNX-501 Temp folder arcgis (#351)
* fixed path

* fixes
2024-11-05 18:15:17 +00:00
KatKatKateryna b7f0f5df90 receive operation fix (#350) 2024-11-06 01:45:13 +08:00
KatKatKateryna c4c06f0dc4 supporting ICurves as fallback (#339)
Co-authored-by: Alan Rynne <alan@speckle.systems>
2024-11-05 16:31:20 +00:00
Claire Kuang ed569cde55 fix(revit): handles plane origin out of bounds and creating group with no elements exceptions (#346)
* handles plane origin out of bounds exception and does not create group when no objects have been successfully converted

also makes room display values transparent

* fixes transparent render material for rooms

* Update DisplayValueExtractor.cs
2024-11-05 16:22:11 +00:00
Claire Kuang 558a16d273 moves pointcloud converter to top level (#349) 2024-11-05 16:54:48 +01:00
Dimitrie Stefanescu 9290261fef Merge pull request #348 from specklesystems/oguzhan/cnx-680-warn-users-on-receiving-v2-commits-in-v3
Chore: Add version info to root object
2024-11-05 13:07:53 +00:00
Dimitrie Stefanescu e2251c111c Merge branch 'dev' into oguzhan/cnx-680-warn-users-on-receiving-v2-commits-in-v3 2024-11-05 13:02:09 +00:00
Claire Kuang 21ed17bb2c refactor(objects): cnx 687 purge unused classes from objects (#333)
* updates constructors and deprecates any unused code & functionality

* updates arcs and polycurves

* removes set only circle props

* updates box conversions

* fixes model curves and transforms

* Update ModelCurveToSpeckleTopLevelConverter.cs

* bumps nugets

* fixes package locks and arc

* updates rhino arc test
2024-11-05 19:59:29 +08:00
Claire Kuang 8cfe0bfe11 removes start angle and end angle reliance in revit arc converter (#345) 2024-11-04 12:01:24 +00:00
Claire Kuang 54ce865e45 Updates README.md to align with github repo (#343)
https://linear.app/speckle/issue/CNX-699/update-github-links-to-point-to-v3
2024-11-01 16:50:15 +00:00
Dogukan Karatas ae6d788aff adds vertices every edge of a face (#342) 2024-11-01 15:20:05 +00:00
Dogukan Karatas f0cfc860a1 Feat(tekla): cnx 703 add color proxies (#341)
* adds geometry conversions and colors

* build fix

* Update ModelObjectToSpeckleConverter.cs

* fixes app id bug in connector

* Update ModelObjectToSpeckleConverter.cs

* excludes unnecessary object types

* adds rendermaterialproxy

* TeklaMaterialUnpacker

* updates argb values

* adds extensions and removes colorhandler

* adds excluded types as a list

---------

Co-authored-by: Claire Kuang <kuang.claire@gmail.com>
Co-authored-by: oguzhankoral <oguzhankoral@gmail.com>
2024-11-01 16:02:48 +01:00
Adam Hathcock becdc060e9 Update SDK (#336)
* Update SDK

* update sqlite to match v2
2024-10-31 15:41:34 +00:00
oguzhankoral 7f91ac734a Add version info to root object 2024-10-26 22:26:58 +03:00
264 changed files with 7765 additions and 3008 deletions
-2
View File
@@ -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
+3 -3
View File
@@ -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 }}
+3 -3
View File
@@ -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
View File
@@ -19,4 +19,5 @@ tools
.DS_Store
*.snupkg
coverage.xml
output/
output/
Images/Thumbs.db
+7
View File
@@ -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
View File
@@ -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"
);
}
);
+1
View File
@@ -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
View File
@@ -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)
@@ -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",
@@ -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();
}
@@ -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)
@@ -9,5 +9,5 @@ public class AutocadSelectionFilter : DirectSelectionSendFilter
IsDefault = true;
}
public override List<string> GetObjectIds() => SelectedObjectIds;
public override List<string> RefreshObjectIds() => SelectedObjectIds;
}
@@ -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;
@@ -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",
@@ -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;
@@ -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)!;
@@ -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);
}
@@ -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;
}
}
@@ -9,5 +9,5 @@ public class RevitSelectionFilter : DirectSelectionSendFilter
IsDefault = true;
}
public override List<string> GetObjectIds() => SelectedObjectIds;
public override List<string> RefreshObjectIds() => SelectedObjectIds;
}
@@ -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;
}
@@ -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);
}
@@ -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);
}
@@ -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" />
@@ -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
);
}
@@ -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);
}
@@ -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);
}
}
}
@@ -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);
@@ -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);
}
}
}
}
@@ -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);
}
}
@@ -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;
}
}
@@ -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");
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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");
}
@@ -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;
}
}
@@ -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)\\"
}
}
}
}
@@ -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>
@@ -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",
@@ -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()
};
@@ -21,5 +21,6 @@ public sealed class DisableRedrawScope : IDisposable
public void Dispose()
{
_viewTable.RedrawEnabled = _returnToStatus;
_viewTable.Redraw();
}
}
@@ -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; }
}
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",
@@ -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");
}
}
}
@@ -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;
}
}
}
}
@@ -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