From abfe2d036c7e795c419f410628b4aba994e0d71a Mon Sep 17 00:00:00 2001 From: Jonathon Broughton Date: Fri, 16 Dec 2022 19:33:24 +0000 Subject: [PATCH] Add Navisworks (alpha): Connector, Converter and DUI2 additions (#2008) * Ported project in from speckle-navis * Adding Navisworks as a HostApplication * Adding ConverterNavisworks * Adding net48 as a target for use in Navisworks * Shuffling the Filters * Implementing a TreeSelectFilter in Connector and DUI * Nips and Tucks * Launch with command line flags to open Sample Model * feat(dui): adds support for hiding the receive tab * fix: loads receive modes before checking for them :) * fix(dui): hides setting button if none is available * chore: removes unused bindings * Logging * Working NWF * Clashes * Differentiation of generic solution to specific * Store states in file * Tidy up * further integration for treeviewfilter * Binding tidyups * Example Model Changes * Fix: Saved StreamStates with TreeViewFilter objects recall correctly and restore intact * Basic Send Implementation in-lieu of the Converter being ready TODO: Needs more Navisworks like traversal * Code Cleanup * GetUnits * test build * Postbuild events switched to per user targets * Convert Selections from SavedStream Filters to ObjectIds Saved Sets and Clash Results stubbed only * Sample Model saves * Fix: Actual Units returned * Convert 1-based Array to addressable Array * Remove ConvertableObject Shifted to more the lightweight pseudoId from ModelItem InwOaPaths * Get Select Objects Uses a pseudoId generated from the InwOaPath ArrayData object. TODO: Longer term this should imply a guard function to detect if the path structure is still valid * Handle converted pseudoId addressed objects and Send The toConvertDict and the While loop addresses the need to have recursion and a tree of Base objects, while also allowing for the flat list to represent all objects * Stubbed non implemented Receive methods * tidying up * Convert 1-based Array to 0-based Array * First port of conversions from Rimshot * Remove ConvertableObject * Wrapper for ConvertToSpeckle to address the future recursive conversion methods * Stubbed CanConvertToSpeckle - returns true for Geometry Elements * Magic gathering of ModelItem from the pseudoId * Initial Send Traversal * ToSpeckle Fundamentals * Object Sorter * SavedStreams * Simple displayValue addition. Geometry only at this point. Bare properties. * Sample Model Update * Add Navisworks projects to All.sln * Added 2020, 2021, 2022 Navisworks versions * Expand CanConvert to all Geometry Nodes TODO: Some nodes are parent nodes that artificially report HasGeometry=True - leading to dupe elements. * Adoption of Speckle.Navisworks.Api Nugets * Rebuild of Connector Solution * Send traversal refactor 1 Thread safety, memory guards, Navisworks progress bar * Remove local assembly references * Additional Converter Versions added for Navisworks * style: Renaming Bindings partials * delete: cruft file * style: renaming Version Projects for Connector and Converter * fix: remove errant dependency and missing file * fix: repoint solution to renamed version projects * fix: repointing to renamed projects * fix: repointing to renamed projects * fix: Remove Colorful.Console package * style: remove unused directives * fix: adapting logging helpers to do without Colurful.Console Co-authored-by: Matteo Cominetti --- .gitignore | 1 + All.sln | 248 +++++--- ConnectorNavisworks/ConnectorNavisworks.sln | 179 ++++++ .../ConnectorNavisworksBindings.Events.cs | 60 ++ .../ConnectorNavisworksBindings.File.cs | 21 + .../ConnectorNavisworksBindings.Filters.cs | 97 ++++ .../ConnectorNavisworksBindings.Mapping.cs | 18 + .../ConnectorNavisworksBindings.Objects.cs | 62 ++ .../ConnectorNavisworksBindings.Receive.cs | 36 ++ .../ConnectorNavisworksBindings.Selections.cs | 74 +++ .../ConnectorNavisworksBindings.Send.cs | 293 ++++++++++ .../Bindings/ConnectorNavisworksBindings.cs | 105 ++++ .../ConnectorNavisworks/Commands/Commands.cs | 18 + .../ConnectorNavisworks.Shared.projitems | 77 +++ .../ConnectorNavisworks.shproj | 13 + .../Entry/PackageContents.xml | 27 + .../ConnectorNavisworks/Entry/Ribbon.name | 9 + .../ConnectorNavisworks/Entry/Ribbon.xaml | 19 + .../ConnectorNavisworks/Entry/Ribbon.xaml.cs | 178 ++++++ .../Entry/SpeckleHostPane.xaml | 13 + .../Entry/SpeckleHostPane.xaml.cs | 43 ++ .../Entry/SpeckleNavisworksCommand.cs | 108 ++++ .../ConnectorNavisworks/Resources/forum16.png | Bin 0 -> 799 bytes .../ConnectorNavisworks/Resources/forum32.png | Bin 0 -> 1859 bytes .../ConnectorNavisworks/Resources/logo16.ico | Bin 0 -> 1150 bytes .../ConnectorNavisworks/Resources/logo16.png | Bin 0 -> 708 bytes .../ConnectorNavisworks/Resources/logo32.ico | Bin 0 -> 4286 bytes .../ConnectorNavisworks/Resources/logo32.png | Bin 0 -> 864 bytes .../Storage/SpeckleStreamManager.cs | 160 ++++++ .../ConnectorNavisworks/Utils.cs | 68 +++ .../ConnectorNavisworks2020.csproj | 179 ++++++ .../Properties/launchSettings.json | 10 + .../ConnectorNavisworks2021.csproj | 179 ++++++ .../Properties/launchSettings.json | 10 + .../ConnectorNavisworks2022.csproj | 178 ++++++ .../Properties/launchSettings.json | 10 + .../ConnectorNavisworks2023.csproj | 178 ++++++ .../Properties/launchSettings.json | 10 + Core/Core/Kits/Applications.cs | 4 +- Core/Core/Kits/KitManager.cs | 22 +- .../AvaloniaHwndHost/AvaloniaHwndHost.csproj | 4 +- DesktopUI2/DesktopUI2/DesktopUI2.csproj | 4 + .../Models/Filters/ISelectionFilter.cs | 90 +-- .../Filters/SelectionFilterConverter.cs | 11 +- .../Models/Filters/TreeSelectionFilter.cs | 151 +++++ .../DesktopUI2/ViewModels/FilterViewModel.cs | 7 + .../Views/Filters/TreeFilterView.xaml | 41 ++ .../Views/Filters/TreeFilterView.xaml.cs | 37 ++ .../ConverterNavisworks.Geometry.cs | 534 ++++++++++++++++++ .../ConverterNavisworks.Other.cs | 249 ++++++++ .../ConverterNavisworks.ToNative.cs | 15 + .../ConverterNavisworks.ToSpeckle.cs | 192 +++++++ .../ConverterNavisworks.Utils.cs | 36 ++ .../ConverterNavisworks.cs | 79 +++ .../ConverterNavisworks.shproj | 13 + .../ConverterNavisworksShared.projitems | 19 + .../ConverterNavisworks2020.csproj | 48 ++ .../ConverterNavisworks2021.csproj | 50 ++ .../ConverterNavisworks2022.csproj | 48 ++ .../ConverterNavisworks2023.csproj | 48 ++ Objects/Objects.sln | 173 ++++++ 61 files changed, 4421 insertions(+), 135 deletions(-) create mode 100644 ConnectorNavisworks/ConnectorNavisworks.sln create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Events.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.File.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Filters.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Mapping.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Objects.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Receive.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Selections.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Send.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Commands/Commands.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/ConnectorNavisworks.Shared.projitems create mode 100644 ConnectorNavisworks/ConnectorNavisworks/ConnectorNavisworks.shproj create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Entry/PackageContents.xml create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.name create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleHostPane.xaml create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleHostPane.xaml.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleNavisworksCommand.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Resources/forum16.png create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Resources/forum32.png create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Resources/logo16.ico create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Resources/logo16.png create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Resources/logo32.ico create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Resources/logo32.png create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Storage/SpeckleStreamManager.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks/Utils.cs create mode 100644 ConnectorNavisworks/ConnectorNavisworks2020/ConnectorNavisworks2020.csproj create mode 100644 ConnectorNavisworks/ConnectorNavisworks2020/Properties/launchSettings.json create mode 100644 ConnectorNavisworks/ConnectorNavisworks2021/ConnectorNavisworks2021.csproj create mode 100644 ConnectorNavisworks/ConnectorNavisworks2021/Properties/launchSettings.json create mode 100644 ConnectorNavisworks/ConnectorNavisworks2022/ConnectorNavisworks2022.csproj create mode 100644 ConnectorNavisworks/ConnectorNavisworks2022/Properties/launchSettings.json create mode 100644 ConnectorNavisworks/ConnectorNavisworks2023/ConnectorNavisworks2023.csproj create mode 100644 ConnectorNavisworks/ConnectorNavisworks2023/Properties/launchSettings.json create mode 100644 DesktopUI2/DesktopUI2/Models/Filters/TreeSelectionFilter.cs create mode 100644 DesktopUI2/DesktopUI2/Views/Filters/TreeFilterView.xaml create mode 100644 DesktopUI2/DesktopUI2/Views/Filters/TreeFilterView.xaml.cs create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Geometry.cs create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Other.cs create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.ToNative.cs create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.ToSpeckle.cs create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Utils.cs create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.cs create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.shproj create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworksShared.projitems create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks2020/ConverterNavisworks2020.csproj create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks2021/ConverterNavisworks2021.csproj create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks2022/ConverterNavisworks2022.csproj create mode 100644 Objects/Converters/ConverterNavisworks/ConverterNavisworks2023/ConverterNavisworks2023.csproj diff --git a/.gitignore b/.gitignore index 21a7ed7cb5..f02c29e045 100644 --- a/.gitignore +++ b/.gitignore @@ -370,3 +370,4 @@ speckle-sharp-ci-tools .circleci/continuation-config.yml .circleci/contiuation-config.yml +ConnectorNavisworks/ConnectorNavisworks/Sample Models diff --git a/All.sln b/All.sln index 5b9730c336..63531ca6d2 100644 --- a/All.sln +++ b/All.sln @@ -207,76 +207,31 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterRevit2023", "Objec EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Objects\Tests\Tests.csproj", "{4BED69F3-5835-4224-BD2C-50FA65C11395}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConverterNavisworks", "ConverterNavisworks", "{B6C38DB9-7B20-4B7E-BC90-6A8CAFC16807}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2023", "Objects\Converters\ConverterNavisworks\ConverterNavisworks2023\ConverterNavisworks2023.csproj", "{EC2436DB-B7F4-4D78-807B-8D91D7D5165C}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ConverterNavisworks", "Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworks.shproj", "{C3232EF3-2000-44C6-A330-B94531C9CC83}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Navisworks", "Navisworks", "{B6887DDC-B9B9-4B00-95DC-1DD930A1E901}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2023", "ConnectorNavisworks\ConnectorNavisworks2023\ConnectorNavisworks2023.csproj", "{74E39841-B2FA-494D-AC40-A6E505DE6B33}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ConnectorNavisworks", "ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.shproj", "{A517A609-CAB1-4B33-B83C-1B13B34E4560}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2022", "ConnectorNavisworks\ConnectorNavisworks2022\ConnectorNavisworks2022.csproj", "{77D4F346-ACA5-42C8-8522-5EF176F3ADF1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2021", "ConnectorNavisworks\ConnectorNavisworks2021\ConnectorNavisworks2021.csproj", "{DEBC2174-5E31-4B6E-8680-690D75E50E2D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2020", "ConnectorNavisworks\ConnectorNavisworks2020\ConnectorNavisworks2020.csproj", "{9A7D7F9A-4FE1-4053-950B-50B43BC81087}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2020", "Objects\Converters\ConverterNavisworks\ConverterNavisworks2020\ConverterNavisworks2020.csproj", "{8B467FF4-6A6C-4071-87A7-0DD7B9822251}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2021", "Objects\Converters\ConverterNavisworks\ConverterNavisworks2021\ConverterNavisworks2021.csproj", "{CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2022", "Objects\Converters\ConverterNavisworks\ConverterNavisworks2022\ConverterNavisworks2022.csproj", "{CD334556-BA2B-4272-A1EB-628E8152204A}" +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{02a24dd8-e0ca-4657-baa7-b033a4563709}*SharedItemsImports = 5 - ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{0420d74a-2997-4b92-844b-c3769deaa1ad}*SharedItemsImports = 4 - Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{208b25e4-2d0e-4534-b197-4c5c96cc53ce}*SharedItemsImports = 13 - Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{21223ba5-c6e8-405d-b581-106c4726edc0}*SharedItemsImports = 5 - ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{23be6e54-96c1-4373-89f3-e18a1c9807fd}*SharedItemsImports = 4 - ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{2639e37d-80d3-415a-b4d1-20d7f321f27f}*SharedItemsImports = 4 - Objects\Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{26eca1be-f5b2-4a41-9658-46a4a917bfe6}*SharedItemsImports = 5 - ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{27a79aca-7ea8-4406-8bb8-216578cc3ab7}*SharedItemsImports = 4 - ConnectorTeklaStructures\ConnectorTeklaStructuresShared\ConnectorTeklaStructuresShared.projitems*{28e2ea7f-ffd1-4e13-9165-0243b5ac82f5}*SharedItemsImports = 13 - Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{2d0f9f8a-2e89-4780-978a-cd92d6d7b843}*SharedItemsImports = 13 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{2dcd648d-dca5-4d2a-8b14-ad2cb85d24b0}*SharedItemsImports = 13 - ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{31e0c098-6813-4571-ab96-a245e0fc1c23}*SharedItemsImports = 4 - ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{372d9f0f-ede9-4050-bf8c-758911c5c2e0}*SharedItemsImports = 13 - ConnectorTeklaStructures\ConnectorTeklaStructuresShared\ConnectorTeklaStructuresShared.projitems*{3af1ef30-0906-4926-a02c-4e3ad666352a}*SharedItemsImports = 4 - Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{3af1ef30-0906-4926-a02c-4e3ad666352a}*SharedItemsImports = 4 - Objects\Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{3cdef4cc-2cfa-4939-8427-3ed00fa9db55}*SharedItemsImports = 5 - Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{3df12639-78b6-41b3-a046-a675035369be}*SharedItemsImports = 5 - Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{442116f3-0f4a-4136-894e-ff5f4295500b}*SharedItemsImports = 5 - ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{464f2220-d7d9-4d8c-bb3d-b93a1c603469}*SharedItemsImports = 4 - Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{4dbf45ee-3bce-47f4-b399-963b36a31951}*SharedItemsImports = 5 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{4dbf45ee-3bce-47f4-b399-963b36a31951}*SharedItemsImports = 5 - Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{50bc1552-3e7e-4c77-ac3a-aa7c572dfe09}*SharedItemsImports = 5 - ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{57bf94a8-8f73-4d1a-91d2-b10cc64178b6}*SharedItemsImports = 4 - ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{586a5a37-93f6-427e-8df8-c10db4d6822a}*SharedItemsImports = 4 - ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{58a88f1a-7489-46d2-949d-2fc3f68c8d84}*SharedItemsImports = 4 - Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{5bab09dc-b0fc-4004-9fd5-6496a9634071}*SharedItemsImports = 13 - Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{5bbde14e-50f8-4d6e-8e35-747667ad4a09}*SharedItemsImports = 13 - ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{5fd0d810-03e9-4fd2-93e4-b1b51e5d82c5}*SharedItemsImports = 13 - ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{61374cd0-e774-4dcd-bfab-6356b0931283}*SharedItemsImports = 13 - ConnectorTeklaStructures\ConnectorTeklaStructuresShared\ConnectorTeklaStructuresShared.projitems*{67157264-aaa5-46a8-a38b-16254b49b892}*SharedItemsImports = 4 - Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{67157264-aaa5-46a8-a38b-16254b49b892}*SharedItemsImports = 4 - Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{67a463d3-e98b-4b16-b069-d7bbb05386a1}*SharedItemsImports = 5 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{67a463d3-e98b-4b16-b069-d7bbb05386a1}*SharedItemsImports = 5 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{76937388-bc9e-4083-9d6e-59cc627e3804}*SharedItemsImports = 5 - Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{78573adc-87a5-489f-8134-fb4a435a05f0}*SharedItemsImports = 5 - Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{7ffdab72-145d-4490-9892-fac5f1d72b17}*SharedItemsImports = 13 - ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{81299d15-5788-414d-a962-1a568c251323}*SharedItemsImports = 4 - Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{8581b4bb-a8bc-4328-99fe-d18615af2554}*SharedItemsImports = 5 - ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{8a53b084-20d8-48f6-9591-9d53cfa74130}*SharedItemsImports = 4 - Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{907aed7a-719b-4157-8cc9-d21cb26e9243}*SharedItemsImports = 5 - ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{9d188843-8841-4a76-a844-efbe8e32ee05}*SharedItemsImports = 4 - ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{a3a0ee09-6055-4009-ab8e-13fbc1a403a9}*SharedItemsImports = 4 - ConnectorRhino\ConnectorRhino\ConnectorRhinoShared\ConnectorRhinoShared.projitems*{a64acbf9-db82-4839-af99-57ed2e7989f4}*SharedItemsImports = 5 - Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{aaa05c3d-856d-4f22-971e-5e3f066d0eae}*SharedItemsImports = 5 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{aaa05c3d-856d-4f22-971e-5e3f066d0eae}*SharedItemsImports = 5 - Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{aacd5d91-99f1-4e69-b23b-e25239e5fb59}*SharedItemsImports = 5 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{aacd5d91-99f1-4e69-b23b-e25239e5fb59}*SharedItemsImports = 5 - ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{ad10c167-937f-4706-9eb5-c99f86c35e8f}*SharedItemsImports = 4 - ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{b47492d9-2eda-4016-a930-7fa708c85c3d}*SharedItemsImports = 13 - ConnectorRhino\ConnectorRhino\ConnectorRhinoShared\ConnectorRhinoShared.projitems*{b7376ec8-5d3e-47d2-96a7-748552f14c39}*SharedItemsImports = 13 - Objects\Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{b74cb8c1-187b-46a6-b20b-92b8c129f3ee}*SharedItemsImports = 13 - Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{bd2287fa-8272-4d14-9a26-889092aebfe0}*SharedItemsImports = 5 - ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{c091e499-597d-4077-b83f-08e069091090}*SharedItemsImports = 4 - Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{c1d53822-b11f-4772-996e-1e6d485e0702}*SharedItemsImports = 5 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{c21a6553-b4ec-4ec3-b82a-c7a83cffb809}*SharedItemsImports = 5 - Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{c96d609b-b210-401c-8ffc-5d17f324e9e8}*SharedItemsImports = 5 - Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{cc10bbc6-09da-4bbb-ae92-3f6097a022f1}*SharedItemsImports = 5 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{cc790553-8088-41a9-83cd-b29f7141f408}*SharedItemsImports = 5 - Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{d06f557c-452a-4bbe-9b79-a10db03f3832}*SharedItemsImports = 5 - Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{d1d0f986-12be-4fd5-8925-c96b1f86427d}*SharedItemsImports = 5 - ConnectorRhino\ConnectorRhino\ConnectorRhinoShared\ConnectorRhinoShared.projitems*{d648bb69-b992-4d34-906e-7a547374b86c}*SharedItemsImports = 5 - Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{d9f443b5-c55b-4ad8-9c70-bc3d2be781be}*SharedItemsImports = 5 - ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{dfdfdbb8-018b-4dcb-a012-54227abf53a7}*SharedItemsImports = 4 - ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{f4bfb155-7ba9-4e46-8240-9c825060c904}*SharedItemsImports = 4 - ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{fc044d89-0ff3-441d-b35d-87454a693c16}*SharedItemsImports = 4 - ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{ff1793e1-77f5-4a92-b3f2-6d8b104e479b}*SharedItemsImports = 4 - Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{ffbc46f0-1874-42e9-8270-bbf962ef32d1}*SharedItemsImports = 5 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 @@ -820,6 +775,70 @@ Global {4BED69F3-5835-4224-BD2C-50FA65C11395}.Release|Any CPU.Build.0 = Release|Any CPU {4BED69F3-5835-4224-BD2C-50FA65C11395}.Release|x64.ActiveCfg = Release|Any CPU {4BED69F3-5835-4224-BD2C-50FA65C11395}.Release|x64.Build.0 = Release|Any CPU + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C}.Debug|x64.ActiveCfg = Debug|Any CPU + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C}.Debug|x64.Build.0 = Debug|Any CPU + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C}.Release|Any CPU.Build.0 = Release|Any CPU + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C}.Release|x64.ActiveCfg = Release|Any CPU + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C}.Release|x64.Build.0 = Release|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Debug|x64.ActiveCfg = Debug|x64 + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Debug|x64.Build.0 = Debug|x64 + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Release|Any CPU.Build.0 = Release|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Release|x64.ActiveCfg = Release|x64 + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Release|x64.Build.0 = Release|x64 + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Debug|x64.ActiveCfg = Debug|x64 + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Debug|x64.Build.0 = Debug|x64 + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Release|Any CPU.Build.0 = Release|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Release|x64.ActiveCfg = Release|x64 + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Release|x64.Build.0 = Release|x64 + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Debug|x64.ActiveCfg = Debug|x64 + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Debug|x64.Build.0 = Debug|x64 + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Release|Any CPU.Build.0 = Release|Any CPU + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Release|x64.ActiveCfg = Release|x64 + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Release|x64.Build.0 = Release|x64 + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Debug|x64.ActiveCfg = Debug|x64 + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Debug|x64.Build.0 = Debug|x64 + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Release|Any CPU.Build.0 = Release|Any CPU + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Release|x64.ActiveCfg = Release|x64 + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Release|x64.Build.0 = Release|x64 + {8B467FF4-6A6C-4071-87A7-0DD7B9822251}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B467FF4-6A6C-4071-87A7-0DD7B9822251}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B467FF4-6A6C-4071-87A7-0DD7B9822251}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B467FF4-6A6C-4071-87A7-0DD7B9822251}.Debug|x64.Build.0 = Debug|Any CPU + {8B467FF4-6A6C-4071-87A7-0DD7B9822251}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B467FF4-6A6C-4071-87A7-0DD7B9822251}.Release|Any CPU.Build.0 = Release|Any CPU + {8B467FF4-6A6C-4071-87A7-0DD7B9822251}.Release|x64.ActiveCfg = Release|Any CPU + {8B467FF4-6A6C-4071-87A7-0DD7B9822251}.Release|x64.Build.0 = Release|Any CPU + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}.Debug|x64.ActiveCfg = Debug|Any CPU + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}.Debug|x64.Build.0 = Debug|Any CPU + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}.Release|Any CPU.Build.0 = Release|Any CPU + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}.Release|x64.ActiveCfg = Release|Any CPU + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3}.Release|x64.Build.0 = Release|Any CPU + {CD334556-BA2B-4272-A1EB-628E8152204A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD334556-BA2B-4272-A1EB-628E8152204A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD334556-BA2B-4272-A1EB-628E8152204A}.Debug|x64.ActiveCfg = Debug|Any CPU + {CD334556-BA2B-4272-A1EB-628E8152204A}.Debug|x64.Build.0 = Debug|Any CPU + {CD334556-BA2B-4272-A1EB-628E8152204A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD334556-BA2B-4272-A1EB-628E8152204A}.Release|Any CPU.Build.0 = Release|Any CPU + {CD334556-BA2B-4272-A1EB-628E8152204A}.Release|x64.ActiveCfg = Release|Any CPU + {CD334556-BA2B-4272-A1EB-628E8152204A}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -923,8 +942,99 @@ Global {67A463D3-E98B-4B16-B069-D7BBB05386A1} = {F0DD5C38-083B-43EA-8654-96247028D8AC} {CC790553-8088-41A9-83CD-B29F7141F408} = {925C0BF6-A0B1-4699-9C4B-078E01D652CC} {4BED69F3-5835-4224-BD2C-50FA65C11395} = {E3916A0F-68D5-4C84-ACAE-41547F75E454} + {B6C38DB9-7B20-4B7E-BC90-6A8CAFC16807} = {4DE5ED81-2A55-4C23-A05F-3C9B9B06F85D} + {EC2436DB-B7F4-4D78-807B-8D91D7D5165C} = {B6C38DB9-7B20-4B7E-BC90-6A8CAFC16807} + {C3232EF3-2000-44C6-A330-B94531C9CC83} = {B6C38DB9-7B20-4B7E-BC90-6A8CAFC16807} + {B6887DDC-B9B9-4B00-95DC-1DD930A1E901} = {DD7DA7E3-FBB7-4216-852B-A4A5BF3AB9AB} + {74E39841-B2FA-494D-AC40-A6E505DE6B33} = {B6887DDC-B9B9-4B00-95DC-1DD930A1E901} + {A517A609-CAB1-4B33-B83C-1B13B34E4560} = {B6887DDC-B9B9-4B00-95DC-1DD930A1E901} + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1} = {B6887DDC-B9B9-4B00-95DC-1DD930A1E901} + {DEBC2174-5E31-4B6E-8680-690D75E50E2D} = {B6887DDC-B9B9-4B00-95DC-1DD930A1E901} + {9A7D7F9A-4FE1-4053-950B-50B43BC81087} = {B6887DDC-B9B9-4B00-95DC-1DD930A1E901} + {8B467FF4-6A6C-4071-87A7-0DD7B9822251} = {B6C38DB9-7B20-4B7E-BC90-6A8CAFC16807} + {CAFD4EAC-75A8-4FC8-94E5-91CADC39F5B3} = {B6C38DB9-7B20-4B7E-BC90-6A8CAFC16807} + {CD334556-BA2B-4272-A1EB-628E8152204A} = {B6C38DB9-7B20-4B7E-BC90-6A8CAFC16807} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1D43D91B-4F01-4A78-8250-CC6F9BD93A14} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{02a24dd8-e0ca-4657-baa7-b033a4563709}*SharedItemsImports = 5 + ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{0420d74a-2997-4b92-844b-c3769deaa1ad}*SharedItemsImports = 4 + Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{208b25e4-2d0e-4534-b197-4c5c96cc53ce}*SharedItemsImports = 13 + Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{21223ba5-c6e8-405d-b581-106c4726edc0}*SharedItemsImports = 5 + ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{23be6e54-96c1-4373-89f3-e18a1c9807fd}*SharedItemsImports = 4 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{2639e37d-80d3-415a-b4d1-20d7f321f27f}*SharedItemsImports = 4 + Objects\Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{26eca1be-f5b2-4a41-9658-46a4a917bfe6}*SharedItemsImports = 5 + ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{27a79aca-7ea8-4406-8bb8-216578cc3ab7}*SharedItemsImports = 4 + ConnectorTeklaStructures\ConnectorTeklaStructuresShared\ConnectorTeklaStructuresShared.projitems*{28e2ea7f-ffd1-4e13-9165-0243b5ac82f5}*SharedItemsImports = 13 + Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{2d0f9f8a-2e89-4780-978a-cd92d6d7b843}*SharedItemsImports = 13 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{2dcd648d-dca5-4d2a-8b14-ad2cb85d24b0}*SharedItemsImports = 13 + ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{31e0c098-6813-4571-ab96-a245e0fc1c23}*SharedItemsImports = 4 + ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{372d9f0f-ede9-4050-bf8c-758911c5c2e0}*SharedItemsImports = 13 + ConnectorTeklaStructures\ConnectorTeklaStructuresShared\ConnectorTeklaStructuresShared.projitems*{3af1ef30-0906-4926-a02c-4e3ad666352a}*SharedItemsImports = 4 + Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{3af1ef30-0906-4926-a02c-4e3ad666352a}*SharedItemsImports = 4 + Objects\Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{3cdef4cc-2cfa-4939-8427-3ed00fa9db55}*SharedItemsImports = 5 + Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{3df12639-78b6-41b3-a046-a675035369be}*SharedItemsImports = 5 + Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{442116f3-0f4a-4136-894e-ff5f4295500b}*SharedItemsImports = 5 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{464f2220-d7d9-4d8c-bb3d-b93a1c603469}*SharedItemsImports = 4 + Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{4dbf45ee-3bce-47f4-b399-963b36a31951}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{4dbf45ee-3bce-47f4-b399-963b36a31951}*SharedItemsImports = 5 + Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{50bc1552-3e7e-4c77-ac3a-aa7c572dfe09}*SharedItemsImports = 5 + ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{57bf94a8-8f73-4d1a-91d2-b10cc64178b6}*SharedItemsImports = 4 + ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{586a5a37-93f6-427e-8df8-c10db4d6822a}*SharedItemsImports = 4 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{58a88f1a-7489-46d2-949d-2fc3f68c8d84}*SharedItemsImports = 4 + Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{5bab09dc-b0fc-4004-9fd5-6496a9634071}*SharedItemsImports = 13 + Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{5bbde14e-50f8-4d6e-8e35-747667ad4a09}*SharedItemsImports = 13 + ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{5fd0d810-03e9-4fd2-93e4-b1b51e5d82c5}*SharedItemsImports = 13 + ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{61374cd0-e774-4dcd-bfab-6356b0931283}*SharedItemsImports = 13 + ConnectorTeklaStructures\ConnectorTeklaStructuresShared\ConnectorTeklaStructuresShared.projitems*{67157264-aaa5-46a8-a38b-16254b49b892}*SharedItemsImports = 4 + Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{67157264-aaa5-46a8-a38b-16254b49b892}*SharedItemsImports = 4 + Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{67a463d3-e98b-4b16-b069-d7bbb05386a1}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{67a463d3-e98b-4b16-b069-d7bbb05386a1}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{74e39841-b2fa-494d-ac40-a6e505de6b33}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{76937388-bc9e-4083-9d6e-59cc627e3804}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{77d4f346-aca5-42c8-8522-5ef176f3adf1}*SharedItemsImports = 5 + Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{78573adc-87a5-489f-8134-fb4a435a05f0}*SharedItemsImports = 5 + Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{7ffdab72-145d-4490-9892-fac5f1d72b17}*SharedItemsImports = 13 + ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{81299d15-5788-414d-a962-1a568c251323}*SharedItemsImports = 4 + Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{8581b4bb-a8bc-4328-99fe-d18615af2554}*SharedItemsImports = 5 + ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{8a53b084-20d8-48f6-9591-9d53cfa74130}*SharedItemsImports = 4 + Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{8b467ff4-6a6c-4071-87a7-0dd7b9822251}*SharedItemsImports = 5 + Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{907aed7a-719b-4157-8cc9-d21cb26e9243}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{9a7d7f9a-4fe1-4053-950b-50b43bc81087}*SharedItemsImports = 5 + ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{9d188843-8841-4a76-a844-efbe8e32ee05}*SharedItemsImports = 4 + ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{a3a0ee09-6055-4009-ab8e-13fbc1a403a9}*SharedItemsImports = 4 + ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{a517a609-cab1-4b33-b83c-1b13b34e4560}*SharedItemsImports = 13 + ConnectorRhino\ConnectorRhino\ConnectorRhinoShared\ConnectorRhinoShared.projitems*{a64acbf9-db82-4839-af99-57ed2e7989f4}*SharedItemsImports = 5 + Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{aaa05c3d-856d-4f22-971e-5e3f066d0eae}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{aaa05c3d-856d-4f22-971e-5e3f066d0eae}*SharedItemsImports = 5 + Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{aacd5d91-99f1-4e69-b23b-e25239e5fb59}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{aacd5d91-99f1-4e69-b23b-e25239e5fb59}*SharedItemsImports = 5 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{ad10c167-937f-4706-9eb5-c99f86c35e8f}*SharedItemsImports = 4 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{b47492d9-2eda-4016-a930-7fa708c85c3d}*SharedItemsImports = 13 + ConnectorRhino\ConnectorRhino\ConnectorRhinoShared\ConnectorRhinoShared.projitems*{b7376ec8-5d3e-47d2-96a7-748552f14c39}*SharedItemsImports = 13 + Objects\Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{b74cb8c1-187b-46a6-b20b-92b8c129f3ee}*SharedItemsImports = 13 + Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{bd2287fa-8272-4d14-9a26-889092aebfe0}*SharedItemsImports = 5 + ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{c091e499-597d-4077-b83f-08e069091090}*SharedItemsImports = 4 + Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{c1d53822-b11f-4772-996e-1e6d485e0702}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{c21a6553-b4ec-4ec3-b82a-c7a83cffb809}*SharedItemsImports = 5 + Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{c3232ef3-2000-44c6-a330-b94531c9cc83}*SharedItemsImports = 13 + Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{c96d609b-b210-401c-8ffc-5d17f324e9e8}*SharedItemsImports = 5 + Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{cafd4eac-75a8-4fc8-94e5-91cadc39f5b3}*SharedItemsImports = 5 + Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{cc10bbc6-09da-4bbb-ae92-3f6097a022f1}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{cc790553-8088-41a9-83cd-b29f7141f408}*SharedItemsImports = 5 + Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{cd334556-ba2b-4272-a1eb-628e8152204a}*SharedItemsImports = 5 + Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{d06f557c-452a-4bbe-9b79-a10db03f3832}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{d1d0f986-12be-4fd5-8925-c96b1f86427d}*SharedItemsImports = 5 + ConnectorRhino\ConnectorRhino\ConnectorRhinoShared\ConnectorRhinoShared.projitems*{d648bb69-b992-4d34-906e-7a547374b86c}*SharedItemsImports = 5 + Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{d9f443b5-c55b-4ad8-9c70-bc3d2be781be}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{debc2174-5e31-4b6e-8680-690d75e50e2d}*SharedItemsImports = 5 + ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{dfdfdbb8-018b-4dcb-a012-54227abf53a7}*SharedItemsImports = 4 + Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{ec2436db-b7f4-4d78-807b-8d91d7d5165c}*SharedItemsImports = 5 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{f4bfb155-7ba9-4e46-8240-9c825060c904}*SharedItemsImports = 4 + ConnectorMicroStation\ConnectorMicroStationOpenShared\ConnectorMicroStationOpenShared.projitems*{fc044d89-0ff3-441d-b35d-87454a693c16}*SharedItemsImports = 4 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{ff1793e1-77f5-4a92-b3f2-6d8b104e479b}*SharedItemsImports = 4 + Objects\Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{ffbc46f0-1874-42e9-8270-bbf962ef32d1}*SharedItemsImports = 5 + EndGlobalSection EndGlobal diff --git a/ConnectorNavisworks/ConnectorNavisworks.sln b/ConnectorNavisworks/ConnectorNavisworks.sln new file mode 100644 index 0000000000..ae541a0972 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks.sln @@ -0,0 +1,179 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33122.133 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ConverterNavisworks", "..\Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworks.shproj", "{C3232EF3-2000-44C6-A330-B94531C9CC83}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2023", "..\Objects\Converters\ConverterNavisworks\ConverterNavisworks2023\ConverterNavisworks2023.csproj", "{DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "..\Core\Core\Core.csproj", "{5608C994-F66C-4E3A-B9A5-2D41481C2419}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Objects", "..\Objects\Objects\Objects.csproj", "{A9973282-2096-4626-BCE6-B479B955CC2C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AvaloniaHwndHost", "..\DesktopUI2\AvaloniaHwndHost\AvaloniaHwndHost.csproj", "{B22C0E7D-ED45-4E2B-992F-4EC621F2935F}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ConnectorNavisworks", "ConnectorNavisworks\ConnectorNavisworks.shproj", "{A517A609-CAB1-4B33-B83C-1B13B34E4560}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2023", "ConnectorNavisworks2023\ConnectorNavisworks2023.csproj", "{74E39841-B2FA-494D-AC40-A6E505DE6B33}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConverterNavisworks", "ConverterNavisworks", "{09B8CBD5-94AC-4EB6-9B59-D830CE66F691}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LocalDependencies", "LocalDependencies", "{1ED8C11D-0045-43D4-A92F-0A94D5F10871}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DesktopUI2", "..\DesktopUI2\DesktopUI2\DesktopUI2.csproj", "{60E18D14-C4F7-452D-A67B-575529DFAC2F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NavisworksVersions", "NavisworksVersions", "{95E1C221-D77A-4EA7-82DF-81A8A3794276}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2022", "ConnectorNavisworks2022\ConnectorNavisworks2022.csproj", "{77D4F346-ACA5-42C8-8522-5EF176F3ADF1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2021", "ConnectorNavisworks2021\ConnectorNavisworks2021.csproj", "{DEBC2174-5E31-4B6E-8680-690D75E50E2D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2020", "ConnectorNavisworks2020\ConnectorNavisworks2020.csproj", "{9A7D7F9A-4FE1-4053-950B-50B43BC81087}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2020", "..\Objects\Converters\ConverterNavisworks\ConverterNavisworks2020\ConverterNavisworks2020.csproj", "{FE762627-F1E3-47F7-AB6A-BB350AD4950A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2021", "..\Objects\Converters\ConverterNavisworks\ConverterNavisworks2021\ConverterNavisworks2021.csproj", "{E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2022", "..\Objects\Converters\ConverterNavisworks\ConverterNavisworks2022\ConverterNavisworks2022.csproj", "{632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}.Debug|x64.ActiveCfg = Debug|x64 + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}.Debug|x64.Build.0 = Debug|x64 + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}.Release|Any CPU.Build.0 = Release|Any CPU + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}.Release|x64.ActiveCfg = Release|x64 + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C}.Release|x64.Build.0 = Release|x64 + {5608C994-F66C-4E3A-B9A5-2D41481C2419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5608C994-F66C-4E3A-B9A5-2D41481C2419}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5608C994-F66C-4E3A-B9A5-2D41481C2419}.Debug|x64.ActiveCfg = Debug|Any CPU + {5608C994-F66C-4E3A-B9A5-2D41481C2419}.Debug|x64.Build.0 = Debug|Any CPU + {5608C994-F66C-4E3A-B9A5-2D41481C2419}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5608C994-F66C-4E3A-B9A5-2D41481C2419}.Release|Any CPU.Build.0 = Release|Any CPU + {5608C994-F66C-4E3A-B9A5-2D41481C2419}.Release|x64.ActiveCfg = Release|Any CPU + {5608C994-F66C-4E3A-B9A5-2D41481C2419}.Release|x64.Build.0 = Release|Any CPU + {A9973282-2096-4626-BCE6-B479B955CC2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A9973282-2096-4626-BCE6-B479B955CC2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A9973282-2096-4626-BCE6-B479B955CC2C}.Debug|x64.ActiveCfg = Debug|Any CPU + {A9973282-2096-4626-BCE6-B479B955CC2C}.Debug|x64.Build.0 = Debug|Any CPU + {A9973282-2096-4626-BCE6-B479B955CC2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A9973282-2096-4626-BCE6-B479B955CC2C}.Release|Any CPU.Build.0 = Release|Any CPU + {A9973282-2096-4626-BCE6-B479B955CC2C}.Release|x64.ActiveCfg = Release|Any CPU + {A9973282-2096-4626-BCE6-B479B955CC2C}.Release|x64.Build.0 = Release|Any CPU + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F}.Debug|x64.ActiveCfg = Debug|Any CPU + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F}.Debug|x64.Build.0 = Debug|Any CPU + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F}.Release|Any CPU.Build.0 = Release|Any CPU + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F}.Release|x64.ActiveCfg = Release|Any CPU + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F}.Release|x64.Build.0 = Release|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Debug|x64.ActiveCfg = Debug|x64 + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Debug|x64.Build.0 = Debug|x64 + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Release|Any CPU.Build.0 = Release|Any CPU + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Release|x64.ActiveCfg = Release|x64 + {74E39841-B2FA-494D-AC40-A6E505DE6B33}.Release|x64.Build.0 = Release|x64 + {60E18D14-C4F7-452D-A67B-575529DFAC2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60E18D14-C4F7-452D-A67B-575529DFAC2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60E18D14-C4F7-452D-A67B-575529DFAC2F}.Debug|x64.ActiveCfg = Debug|Any CPU + {60E18D14-C4F7-452D-A67B-575529DFAC2F}.Debug|x64.Build.0 = Debug|Any CPU + {60E18D14-C4F7-452D-A67B-575529DFAC2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60E18D14-C4F7-452D-A67B-575529DFAC2F}.Release|Any CPU.Build.0 = Release|Any CPU + {60E18D14-C4F7-452D-A67B-575529DFAC2F}.Release|x64.ActiveCfg = Release|Any CPU + {60E18D14-C4F7-452D-A67B-575529DFAC2F}.Release|x64.Build.0 = Release|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Debug|x64.ActiveCfg = Debug|x64 + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Debug|x64.Build.0 = Debug|x64 + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Release|Any CPU.Build.0 = Release|Any CPU + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Release|x64.ActiveCfg = Release|x64 + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1}.Release|x64.Build.0 = Release|x64 + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Debug|x64.ActiveCfg = Debug|x64 + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Debug|x64.Build.0 = Debug|x64 + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Release|Any CPU.Build.0 = Release|Any CPU + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Release|x64.ActiveCfg = Release|x64 + {DEBC2174-5E31-4B6E-8680-690D75E50E2D}.Release|x64.Build.0 = Release|x64 + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Debug|x64.ActiveCfg = Debug|x64 + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Debug|x64.Build.0 = Debug|x64 + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Release|Any CPU.Build.0 = Release|Any CPU + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Release|x64.ActiveCfg = Release|x64 + {9A7D7F9A-4FE1-4053-950B-50B43BC81087}.Release|x64.Build.0 = Release|x64 + {FE762627-F1E3-47F7-AB6A-BB350AD4950A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE762627-F1E3-47F7-AB6A-BB350AD4950A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE762627-F1E3-47F7-AB6A-BB350AD4950A}.Debug|x64.ActiveCfg = Debug|x64 + {FE762627-F1E3-47F7-AB6A-BB350AD4950A}.Debug|x64.Build.0 = Debug|x64 + {FE762627-F1E3-47F7-AB6A-BB350AD4950A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE762627-F1E3-47F7-AB6A-BB350AD4950A}.Release|Any CPU.Build.0 = Release|Any CPU + {FE762627-F1E3-47F7-AB6A-BB350AD4950A}.Release|x64.ActiveCfg = Release|x64 + {FE762627-F1E3-47F7-AB6A-BB350AD4950A}.Release|x64.Build.0 = Release|x64 + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}.Debug|x64.ActiveCfg = Debug|Any CPU + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}.Debug|x64.Build.0 = Debug|Any CPU + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}.Release|Any CPU.Build.0 = Release|Any CPU + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}.Release|x64.ActiveCfg = Release|Any CPU + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D}.Release|x64.Build.0 = Release|Any CPU + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}.Debug|x64.ActiveCfg = Debug|Any CPU + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}.Debug|x64.Build.0 = Debug|Any CPU + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}.Release|Any CPU.Build.0 = Release|Any CPU + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}.Release|x64.ActiveCfg = Release|Any CPU + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E}.Release|x64.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {C3232EF3-2000-44C6-A330-B94531C9CC83} = {09B8CBD5-94AC-4EB6-9B59-D830CE66F691} + {DFB950BC-E959-4A43-8B2A-4B8EC03C8C1C} = {09B8CBD5-94AC-4EB6-9B59-D830CE66F691} + {5608C994-F66C-4E3A-B9A5-2D41481C2419} = {1ED8C11D-0045-43D4-A92F-0A94D5F10871} + {A9973282-2096-4626-BCE6-B479B955CC2C} = {1ED8C11D-0045-43D4-A92F-0A94D5F10871} + {B22C0E7D-ED45-4E2B-992F-4EC621F2935F} = {1ED8C11D-0045-43D4-A92F-0A94D5F10871} + {74E39841-B2FA-494D-AC40-A6E505DE6B33} = {95E1C221-D77A-4EA7-82DF-81A8A3794276} + {09B8CBD5-94AC-4EB6-9B59-D830CE66F691} = {1ED8C11D-0045-43D4-A92F-0A94D5F10871} + {60E18D14-C4F7-452D-A67B-575529DFAC2F} = {1ED8C11D-0045-43D4-A92F-0A94D5F10871} + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1} = {95E1C221-D77A-4EA7-82DF-81A8A3794276} + {DEBC2174-5E31-4B6E-8680-690D75E50E2D} = {95E1C221-D77A-4EA7-82DF-81A8A3794276} + {9A7D7F9A-4FE1-4053-950B-50B43BC81087} = {95E1C221-D77A-4EA7-82DF-81A8A3794276} + {FE762627-F1E3-47F7-AB6A-BB350AD4950A} = {09B8CBD5-94AC-4EB6-9B59-D830CE66F691} + {E93FD0BF-5ED4-46D4-A06A-AEDAA96B664D} = {09B8CBD5-94AC-4EB6-9B59-D830CE66F691} + {632D9F4D-9FB7-4E2D-84F1-7B1AE063BC5E} = {09B8CBD5-94AC-4EB6-9B59-D830CE66F691} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A58F12E8-41E9-40EB-B6CB-A3FD28F57302} + EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{632d9f4d-9fb7-4e2d-84f1-7b1ae063bc5e}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{74e39841-b2fa-494d-ac40-a6e505de6b33}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{77d4f346-aca5-42c8-8522-5ef176f3adf1}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{9a7d7f9a-4fe1-4053-950b-50b43bc81087}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{a517a609-cab1-4b33-b83c-1b13b34e4560}*SharedItemsImports = 13 + ..\Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{c3232ef3-2000-44c6-a330-b94531c9cc83}*SharedItemsImports = 13 + ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{debc2174-5e31-4b6e-8680-690d75e50e2d}*SharedItemsImports = 5 + ..\Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{dfb950bc-e959-4a43-8b2a-4b8ec03c8c1c}*SharedItemsImports = 5 + ..\Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{e93fd0bf-5ed4-46d4-a06a-aedaa96b664d}*SharedItemsImports = 5 + ..\Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{fe762627-f1e3-47f7-ab6a-bb350ad4950a}*SharedItemsImports = 5 + EndGlobalSection +EndGlobal diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Events.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Events.cs new file mode 100644 index 0000000000..771e359e74 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Events.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using Autodesk.Navisworks.Api; +using DesktopUI2.Models; +using DesktopUI2.ViewModels; +using static Speckle.ConnectorNavisworks.Utils; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks + { + public void RegisterAppEvents() + { + //// GLOBAL EVENT HANDLERS + + // Navisworks is an SDI (Single Document Interface) and on launch has an initial empty document. + // Loading a file doesn't trigger the ActiveDocumentChanged event. + // Instead it amends it in place. We can listen to the filename changing to get the intuitive event. + Doc.FileNameChanged += DocumentChangedEvent; + Doc.SelectionSets.Changed += SetsChangedEvent; + } + + + private void SetsChangedEvent(object sender, EventArgs e) + { + SavedSets = Doc.SelectionSets; + UpdateSelectedStream?.Invoke(); + } + + + // Triggered when the active document name is changed. + // This will happen automatically if a document is newly created or opened. + private void DocumentChangedEvent(object sender, EventArgs e) + { + var doc = sender as Document; + + try + { + // As ConnectorNavisworks is Send only, There is little use for a new empty document. + if (doc == null || doc.IsClear) + { + UpdateSavedStreams?.Invoke(new List()); + MainViewModel.GoHome(); + return; + } + + var streams = GetStreamsInFile(); + UpdateSavedStreams?.Invoke(streams); + + UpdateSelectedStream?.Invoke(); + + MainViewModel.GoHome(); + } + catch (Exception ex) + { + ErrorLog($"Something went wrong: {ex.Message}"); + } + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.File.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.File.cs new file mode 100644 index 0000000000..a6433520be --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.File.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using DesktopUI2.Models; +using Speckle.ConnectorNavisworks.Storage; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks + { + public override void WriteStreamsToFile(List streams) + { + SpeckleStreamManager.WriteStreamStateList(Doc, streams); + } + + public override List GetStreamsInFile() + { + var streams = new List(); + if (Doc != null) streams = SpeckleStreamManager.ReadState(Doc); + return streams; + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Filters.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Filters.cs new file mode 100644 index 0000000000..2ef2ff70d8 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Filters.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using Autodesk.Navisworks.Api; +using Autodesk.Navisworks.Api.Clash; +using DesktopUI2.Models.Filters; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks + { + public override List GetSelectionFilters() + { + var filters = new List(); + + var manualFilter = new ManualSelectionFilter(); + + if (Doc == null) return filters; + + filters.Add(manualFilter); + + var selectSetsRootItem = Doc.SelectionSets.RootItem; + + var savedSelectionSets = selectSetsRootItem.Children.Select(GetSets)?.OfType().ToList(); + + if (savedSelectionSets.Count > 0) + { + var selectionSetsFilter = new TreeSelectionFilter + { + Slug = "sets", Name = "Saved Sets and Selections", Icon = "FileTree", + Description = "Select saved selection and search sets to include in the commit.", + Values = savedSelectionSets + }; + filters.Add(selectionSetsFilter); + } + + var clashPlugin = Doc.GetClash(); + var clashTests = clashPlugin.TestsData; + var groupedClashResults = clashTests.Tests.Select(GetClashTestResults).OfType().ToList(); + + if (groupedClashResults.Count >= 0) + { + var clashReportFilter = new TreeSelectionFilter + { + Slug = "clashes", Name = "Clash Detective Results", Icon = "MessageAlert", + Description = "Select group clash test results.", + Values = groupedClashResults + }; + filters.Add(clashReportFilter); + } + + + return filters; + } + + private static TreeNode GetSets(SavedItem savedItem) + { + var treeNode = new TreeNode + { + DisplayName = savedItem.DisplayName, + Guid = savedItem.Guid, + IndexWith = nameof(TreeNode.Guid), + Indices = Doc.SelectionSets.CreateIndexPath(savedItem).ToArray() + }; + + if (!savedItem.IsGroup) return treeNode; + + //iterate the children and output + foreach (var childItem in ((GroupItem)savedItem).Children) treeNode.Elements.Add(GetSets(childItem)); + + return treeNode.Elements.Count > 0 ? treeNode : null; + } + + private static TreeNode GetClashTestResults(SavedItem savedItem) + { + var clashTest = (ClashTest)savedItem; + + var treeNode = new TreeNode + { + DisplayName = clashTest.DisplayName, + Guid = clashTest.Guid, + IndexWith = nameof(TreeNode.Guid) + }; + + //iterate the children and output only grouped clashes + foreach (var result in clashTest.Children) + if (result.IsGroup) + treeNode.Elements.Add(new TreeNode + { + DisplayName = result.DisplayName, + Guid = result.Guid, + IndexWith = nameof(TreeNode.Guid) + }); + + return treeNode.Elements.Count > 0 ? treeNode : null; + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Mapping.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Mapping.cs new file mode 100644 index 0000000000..3caf5b29e5 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Mapping.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using static DesktopUI2.ViewModels.MappingViewModel; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks + { + public override async Task>> ImportFamilyCommand( + Dictionary> mapping) + { + // TODO! + await Task.Delay(TimeSpan.FromMilliseconds(500)); + return new Dictionary>(); + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Objects.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Objects.cs new file mode 100644 index 0000000000..0b357f0acd --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Objects.cs @@ -0,0 +1,62 @@ +using DesktopUI2.Models.Filters; +using System; +using System.Collections.Generic; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks + { + public override List GetObjectsInView() // this returns all visible doc objects. + { + var objects = new List(); + return objects; + } + + private static IEnumerable GetObjectsFromFilter(ISelectionFilter filter) + { + List filteredObjects = new List(); + + switch (filter.Slug) + { + case "manual": + filteredObjects.AddRange(GetObjectsFromSelection(filter)); + return filteredObjects; + + case "sets": + filteredObjects.AddRange(GetObjectsFromSavedSets(filter)); + return filteredObjects; + + case "clashes": + filteredObjects.AddRange(GetObjectsFromClashResults(filter)); + return filteredObjects; + + default: + return filteredObjects; + } + } + + private static IEnumerable GetObjectsFromSelection(ISelectionFilter filter) + { + // Manual Selection is a straightforward collection of the pseudoIds + + // TODO: Handle a resorted selection Tree. Effectively this could be: + // a) Delete any saved streams based on Manual Selection + // b) Change what is stored to allow for a cross check that the pseudoId still matches the original item at the path + // c) As a SelectionTree isChanging event load in all manual selection saved states and watch the changes and rewrite the result + + return filter.Selection; + } + + private static IEnumerable GetObjectsFromSavedSets(ISelectionFilter filter) + { + // Saved Sets filter stores Guids of the selection sets. This can be converted to ModelItem pseudoIds + throw new NotImplementedException(); + } + + private static IEnumerable GetObjectsFromClashResults(ISelectionFilter filter) + { + // Clash Results filter stores Guids of the Clash Result groups per Test. This can be converted to ModelItem pseudoIds + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Receive.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Receive.cs new file mode 100644 index 0000000000..d3fcd49f34 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Receive.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DesktopUI2.Models; +using DesktopUI2.ViewModels; +using Speckle.Core.Kits; +using Speckle.Core.Models; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks + { + public Dictionary StoredObjects = null; + // There is no receive mode relevant for the Navisworks Connector at this time. + + public override bool CanPreviewReceive => false; + public override bool CanReceive => false; + + public override List GetReceiveModes() + { + return null; + } + + public override async Task PreviewReceive(StreamState state, ProgressViewModel progress) + { + await Task.Delay(0); + return null; + } + + public override async Task ReceiveStream(StreamState state, ProgressViewModel progress) + { + await Task.Delay(TimeSpan.FromMilliseconds(500)); + return state; + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Selections.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Selections.cs new file mode 100644 index 0000000000..23cb822c00 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Selections.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using System.Linq; +using Autodesk.Navisworks.Api; +using Autodesk.Navisworks.Api.DocumentParts; +using Autodesk.Navisworks.Api.Interop.ComApi; +using ComApiBridge = Autodesk.Navisworks.Api.ComApi.ComApiBridge; +using System; +using Cursor = System.Windows.Forms.Cursor; +using System.Windows.Forms; +using Application = Autodesk.Navisworks.Api.Application; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks + { + private readonly object geometry = new object(); + + public override List GetSelectedObjects() + { + Cursor.Current = Cursors.WaitCursor; + + // Current document, models and selected elements. + Doc = Application.ActiveDocument; + DocumentModels documentModels = Doc.Models; + ModelItemCollection appSelectedItems = Doc.CurrentSelection.SelectedItems; + + + // Storing as a Set for consistency with the converter's handling of fragments and paths. + // Not actually expecting a clash. + HashSet selectedObjects = new HashSet(); + foreach (var modelItem in appSelectedItems) + { + // Descendants is a flattened list of all child Nodes beneath the selected ModelItem, no need for traversal. + ModelItemEnumerableCollection descendants = modelItem.DescendantsAndSelf; + + foreach (ModelItem descendant in descendants) + { + // TODO: Advanced Setting to toggle inclusion of hidden elements within a selection. + // When Navisworks hides items it hides the highest level Node rather than all child nodes. + // A Model Item within a selection may be hidden only by virtue of the state of it's ancestor + var hiddenAncestors = descendant.AncestorsAndSelf.Any(x => x.IsHidden == true); + if (hiddenAncestors) continue; + + // The path for ModelItems is their node position at each level of the Models tree. + // This is the de facto UID for that element within the file at that time. + InwOaPath path = ComApiBridge.ToInwOaPath(descendant); + + // Neglect the Root Node + if (((Array)path.ArrayData).ToArray().Length == 0) continue; + + // Acknowledging that if a collection contains >=10000 children then this indexing will be inadequate + string pointer = ((Array)path.ArrayData).ToArray().Aggregate("", + (current, value) => current + (value.ToString().PadLeft(4, '0') + "-")).TrimEnd('-'); + + //var handle = path.nwHandle; + + selectedObjects.Add(pointer); + } + } + + // Converting this flat list of objects back to a tree will be handled in the Converter. + var objects = selectedObjects.ToList(); + + // Sorting here or in the converter doesn't really matter. Essentially the root nodes will be processed first. + // Traversal of child nodes to include will be handled by cross reference with the list. + objects.Sort((x, y) => + x.Length == y.Length ? string.Compare(x, y, StringComparison.Ordinal) : x.Length.CompareTo(y.Length)); + + Cursor.Current = Cursors.Default; + + return objects; + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Send.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Send.cs new file mode 100644 index 0000000000..dfdae7ba14 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.Send.cs @@ -0,0 +1,293 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Autodesk.Navisworks.Api; +using Autodesk.Navisworks.Api.Interop; +using DesktopUI2.Models; +using DesktopUI2.Models.Settings; +using DesktopUI2.ViewModels; +using Speckle.Core.Api; +using Speckle.Core.Kits; +using Speckle.Core.Logging; +using Speckle.Core.Models; +using Speckle.Core.Transports; +using static Autodesk.Navisworks.Api.Interop.LcOpRegistry; +using static Autodesk.Navisworks.Api.Interop.LcUOption; +using static Speckle.ConnectorNavisworks.Utils; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks + { + public override bool CanPreviewSend => false; + + // used to store the Stream State settings when sending + private List CurrentSettings { get; set; } + + + // Stub - Preview send is not supported + public override async void PreviewSend(StreamState state, ProgressViewModel progress) + { + await Task.Delay(TimeSpan.FromMilliseconds(500)); + // TODO! + } + + + public override async Task SendStream(StreamState state, ProgressViewModel progress) + { + List filteredObjects = new List(); + + if (DefaultKit == null) + { + progress.Report.LogOperationError(new SpeckleException("Could not find any Kit!")); + return null; + } + + if (NavisworksConverter == null) + { + progress.Report.LogOperationError(new SpeckleException($"Could not find Converter{VersionedAppName}!")); + return null; + } + + NavisworksConverter.Report.ReportObjects.Clear(); + + CurrentSettings = state.Settings; + + Dictionary settings = + state.Settings.ToDictionary(setting => setting.Slug, setting => setting.Selection); + + NavisworksConverter.SetConverterSettings(settings); + + string streamId = state.StreamId; + Client client = state.Client; + + + if (state.Filter != null) + { + filteredObjects.AddRange(GetObjectsFromFilter(state.Filter)); + state.SelectedObjectIds = filteredObjects.ToList(); + } + + if (filteredObjects.Count == 0) + { + progress.Report.LogOperationError(new SpeckleException( + "Zero objects selected; send stopped. Please select some objects, or check that your filter can actually select something.")); + return null; + } + + progress.Report = new ProgressReport(); + ConcurrentDictionary conversionProgressDict = new ConcurrentDictionary + { + ["Conversion"] = 0 + }; + + progress.Max = state.SelectedObjectIds.Count; + + Base commitObject = new Base + { + ["units"] = GetUnits(Doc) + }; + + int convertedCount = 0; + int skippedCount = 0; + + SortedDictionary toConvertDictionary = new SortedDictionary(new PseudoIdComparer()); + state.SelectedObjectIds.ForEach(x => toConvertDictionary.Add(x, false)); + + Progress progressBar = Application.BeginProgress($"Sending {state.SelectedObjectIds.Count} Objects to Speckle."); + progressBar.Update(0); + + + // We have to disable autosave because it explodes everything if it tries saving mid send process. + bool autosaveSetting = false; + + using (LcUOptionLock optionLock = new LcUOptionLock()) + { + LcUOptionSet rootOptions = GetRoot(optionLock); + autosaveSetting = rootOptions.GetBoolean("general.autosave.enable"); + if (autosaveSetting) + { + rootOptions.SetBoolean("general.autosave.enable", false); + SaveGlobalOptions(); + } + } + + while (toConvertDictionary.Any(kv => kv.Value == false)) + { + double navisworksProgressState = (float)progress.Value / progress.Max; + progressBar.Update(navisworksProgressState); + + if (progressBar.IsCanceled) + { + progress.CancellationTokenSource.Cancel(); + progressBar.Cancel(); + Application.EndProgress(); + return null; + } + + if (progress.CancellationTokenSource.Token.IsCancellationRequested) + { + progressBar.Cancel(); + Application.EndProgress(); + return null; + } + + var nextToConvert = toConvertDictionary.First(kv => kv.Value == false); + + Base converted = null; + + string applicationId = string.Empty; + + ApplicationObject reportObject = new ApplicationObject("id", "object_type") + { + applicationId = applicationId + }; + + var pseudoId = nextToConvert.Key; + + if (!NavisworksConverter.CanConvertToSpeckle(pseudoId)) + { + reportObject.Update(status: ApplicationObject.State.Skipped, + logItem: $"Sending this object type is not supported in Navisworks"); + progress.Report.Log(reportObject); + + toConvertDictionary[pseudoId] = true; + skippedCount++; + continue; + } + + NavisworksConverter.Report.Log(reportObject); + + // All Conversions should be on the main thread + if (Control.InvokeRequired) + { + Control.Invoke(new Action(() => converted = NavisworksConverter.ConvertToSpeckle(pseudoId))); + } + else + { + converted = NavisworksConverter.ConvertToSpeckle(pseudoId); + } + + if (converted == null) + { + reportObject.Update(status: ApplicationObject.State.Failed, + logItem: $"Conversion returned null"); + progress.Report.Log(reportObject); + toConvertDictionary[pseudoId] = true; + skippedCount++; + continue; + } + + if (commitObject[$"@Elements"] == null) + commitObject[$"@Elements"] = new List(); + ((List)commitObject[$"@Elements"]).Add(converted); + + // carries the pseudoIds of nested children already converted + if (!(converted["__convertedIds"] is List convertedChildrenAndSelf)) continue; + + convertedChildrenAndSelf.ForEach(x => toConvertDictionary[x] = true); + conversionProgressDict["Conversion"] += convertedChildrenAndSelf.Count; + + progress.Update(conversionProgressDict); + + converted.applicationId = applicationId; + if (converted["@SpeckleSchema"] is Base newSchemaBase) + { + newSchemaBase.applicationId = applicationId; + converted["@SpeckleSchema"] = newSchemaBase; + } + + reportObject.Update(status: ApplicationObject.State.Created, + logItem: $"Sent as {converted.speckle_type}"); + progress.Report.Log(reportObject); + + convertedCount += convertedChildrenAndSelf.Count; + } + + progressBar.Update(1.0); + + // Better set the users autosave back on or they might get cross + if (autosaveSetting) + { + using (LcUOptionLock optionLock = new LcUOptionLock()) + { + LcUOptionSet rootOptions = GetRoot(optionLock); + rootOptions.SetBoolean("general.autosave.enable", true); + SaveGlobalOptions(); + } + } + + Application.EndProgress(); + progressBar.Dispose(); + + progress.Report.Merge(NavisworksConverter.Report); + + if (convertedCount == 0) + { + progress.Report.LogOperationError( + new SpeckleException("Zero objects converted successfully. Send stopped.", false)); + return null; + } + + if (progress.CancellationTokenSource.Token.IsCancellationRequested) + { + return null; + } + + progress.Max = convertedCount; + + List transports = new List() + { + new ServerTransport(client.Account, streamId) + }; + + void ErrorAction(string s, Exception e) + { + progress.Report.LogOperationError(e); + progress.CancellationTokenSource.Cancel(); + } + + string objectId = await Operations.Send( + @object: commitObject, + cancellationToken: progress.CancellationTokenSource.Token, + transports: transports, + onProgressAction: progress.Update, + onErrorAction: ErrorAction, + disposeTransports: true + ); + + if (progress.Report.OperationErrorsCount != 0) + { + return null; + } + + if (progress.CancellationTokenSource.Token.IsCancellationRequested) + { + return null; + } + + CommitCreateInput commit = new CommitCreateInput + { + streamId = streamId, + objectId = objectId, + branchName = state.BranchName, + message = state.CommitMessage ?? $"Sent {convertedCount} elements from {HostApplications.Navisworks.Name}.", + sourceApplication = HostApplications.Navisworks.Slug + }; + + try + { + string commitId = await client.CommitCreate(commit); + return commitId; + } + catch (Exception ex) + { + progress.Report.LogOperationError(ex); + } + + return null; + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.cs b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.cs new file mode 100644 index 0000000000..becaffda4d --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Bindings/ConnectorNavisworksBindings.cs @@ -0,0 +1,105 @@ +using System.Collections.Generic; +using Autodesk.Navisworks.Api; +using DesktopUI2; +using DesktopUI2.Models; +using DesktopUI2.Models.Settings; +using Speckle.Core.Kits; +using Speckle.Core.Models; + +namespace Speckle.ConnectorNavisworks.Bindings +{ + public partial class ConnectorBindingsNavisworks : ConnectorBindings + { + // Much of the interaction in Navisworks is through the ActiveDocument API + public static Document Doc; + public System.Windows.Forms.Control Control; + public ISpeckleKit DefaultKit; + public ISpeckleConverter NavisworksConverter; + + public ConnectorBindingsNavisworks(Document navisworksActiveDocument) + { + Doc = navisworksActiveDocument; + SavedSets = Doc.SelectionSets.ToSavedItemCollection(); + + // Sets the Main Thread Control to Invoke commands on. + Control = new System.Windows.Forms.Control(); + Control.CreateControl(); + + // Kits won't change during the lifecycle of Navisworks. + DefaultKit = KitManager.GetDefaultKit(); + NavisworksConverter = DefaultKit?.LoadConverter(Utils.VersionedAppName); + } + + // Majority of interaction with Speckle will be through the saved selection and search Sets + public SavedItemCollection SavedSets { get; set; } + + + public override string GetActiveViewName() + { + return "Entire Document"; + } + + public override List GetCustomStreamMenuItems() + { + return new List(); + } + + public override string GetHostAppName() + { + return HostApplications.Navisworks.Slug; + } + + + public override string GetHostAppNameVersion() + { + return Utils.VersionedAppName.Replace("Navisworks", "Navisworks "); + } + + public override string GetFileName() + { + return Application.ActiveDocument != null + ? Application.ActiveDocument.CurrentFileName + : string.Empty; + } + + /* + private List + CurrentSettings { get; set; } // used to store the Stream State settings when sending/receiving +*/ + + public override List GetSettings() + { + return new List(); + } + + private static string GetDocPath() + { + return ""; + } + + public override string GetDocumentLocation() + { + return GetDocPath(); + } + + public override void SelectClientObjects(List args, bool deselect = false) + { + // TODO! + } + + public override void ResetDocument() + { + // TODO! + } + + + public override string GetDocumentId() + { + // TODO! + // An unsaved document has no path or filename + var fileName = Doc.CurrentFileName; + var hash = Utilities.hashString(fileName, Utilities.HashingFuctions.MD5); + return hash; + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Commands/Commands.cs b/ConnectorNavisworks/ConnectorNavisworks/Commands/Commands.cs new file mode 100644 index 0000000000..26bdf03ae1 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Commands/Commands.cs @@ -0,0 +1,18 @@ +namespace Speckle.ConnectorNavisworks.Entry +{ + public class LaunchSpeckleConnector + { + public const string Command = "Speckle_Launch"; + public const string Plugin = "SpeckleUI"; + } + + //public class OneClickSend + //{ + // public const string Command = "Speckle_OneClickSend"; + //} + + public class Community + { + public const string Command = "Speckle_Community"; + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/ConnectorNavisworks.Shared.projitems b/ConnectorNavisworks/ConnectorNavisworks/ConnectorNavisworks.Shared.projitems new file mode 100644 index 0000000000..8af2ad9335 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/ConnectorNavisworks.Shared.projitems @@ -0,0 +1,77 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + a517a609-cab1-4b33-b83c-1b13b34e4560 + + + Speckle.ConnectorNavisworks + + + + + + + + + + + + + + + + + Ribbon.xaml + + + SpeckleHostPane.xaml + + + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + + + PreserveNewest + + + + + XamlIntelliSenseFileGenerator + Designer + Always + + + + + + + + Never + Designer + XamlIntelliSenseFileGenerator + + + \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/ConnectorNavisworks.shproj b/ConnectorNavisworks/ConnectorNavisworks/ConnectorNavisworks.shproj new file mode 100644 index 0000000000..9715d6eb2d --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/ConnectorNavisworks.shproj @@ -0,0 +1,13 @@ + + + + a517a609-cab1-4b33-b83c-1b13b34e4560 + 14.0 + + + + + + + + diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/PackageContents.xml b/ConnectorNavisworks/ConnectorNavisworks/Entry/PackageContents.xml new file mode 100644 index 0000000000..0ad530a567 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/PackageContents.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.name b/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.name new file mode 100644 index 0000000000..b926d6f0a9 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.name @@ -0,0 +1,9 @@ +# This file uses UTF8 encoding. Lines starting with # or $, or ending with = +# do NOT need translating. +$utf8 + +# DisplayName= +# Speckle + +# Speckle.DisplayName= +# Speckle \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml b/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml new file mode 100644 index 0000000000..fc81c303ab --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml.cs b/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml.cs new file mode 100644 index 0000000000..6932581df9 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml.cs @@ -0,0 +1,178 @@ +using Autodesk.Navisworks.Api.Plugins; +using Speckle.ConnectorNavisworks.Bindings; +using Speckle.ConnectorNavisworks.Entry; +using System.Reflection; +using System.IO; +using System; +using System.Text; +using System.Windows.Forms; +using NavisworksApp = Autodesk.Navisworks.Api.Application; +using System.Diagnostics; + +namespace Speckle.ConnectorNavisworks.Entry +{ + [Plugin("SpeckleNavisworks", "Speckle", DisplayName = "Speckle")] + [Strings("Ribbon.name")] + [RibbonLayout("Ribbon.xaml")] + [RibbonTab("Speckle", DisplayName = "Speckle", LoadForCanExecute = true)] + //[Command(OneClickSend.Command, + // CallCanExecute = CallCanExecute.DocumentNotClear, + // LoadForCanExecute = true, + // Icon = "Resources/logo16.ico", + // LargeIcon = "Resources/logo32.ico", + // Shortcut = "Ctrl+Shift+Q", + // ToolTip = "Command to send selection to the document stream, or everything if nothing is selected", + // DisplayName = "Quick\rSend" + //)] + [Command(LaunchSpeckleConnector.Command, + LoadForCanExecute = true, + Icon = "Resources/logo16.ico", + LargeIcon = "Resources/logo32.ico", + Shortcut = "Ctrl+Shift+S", + ToolTip = "Speckle Connector for Navisworks", + DisplayName = "Speckle\rConnector" + )] + [Command(Community.Command, + LoadForCanExecute = true, + Icon = "Resources/forum16.png", + LargeIcon = "Resources/forum32.png", + Shortcut = "Ctrl+Shift+S", + ToolTip = "Visit the Speckle Support Community", + DisplayName = "Speckle\rCommunity" + )] + internal class RibbonHandler : CommandHandlerPlugin + { + public override CommandState CanExecuteCommand(string commandId) + { + CommandState state = new CommandState(true); + + // Currently there is only one command that needs responsive state management. There could be others. + //switch (commandId) + //{ + // case OneClickSend.Command: + // { + // state.IsEnabled = false; // Until I am ready to implement this + // break; + // } + //} + + return state; + } + + public bool LoadPlugin(string plugin, bool notAutomatedCheck = true, string command = "") + { + if (notAutomatedCheck && NavisworksApp.IsAutomated) + { + return false; + } + + if (plugin.Length == 0 || command.Length == 0) + { + return false; + } + + PluginRecord pluginRecord = NavisworksApp.Plugins.FindPlugin(plugin + ".Speckle"); + + if (pluginRecord is null) + { + return false; + } + + Plugin loadedPlugin = pluginRecord.LoadedPlugin ?? pluginRecord.LoadPlugin(); + + // Activate the plugin's pane if it is of the right type + // At this time the associated commands are handled separately to this parent plugin + if (pluginRecord.IsLoaded && pluginRecord is DockPanePluginRecord && pluginRecord.IsEnabled) + { + DockPanePlugin dockPanePlugin = (DockPanePlugin)loadedPlugin; + dockPanePlugin.ActivatePane(); + } + else + { +#if DEBUG + StringBuilder sb = new StringBuilder(); + + foreach (PluginRecord pr in NavisworksApp.Plugins.PluginRecords) + { + sb.AppendLine(pr.Name + ": " + pr.DisplayName + ", " + pr.Id); + } + + MessageBox.Show(sb.ToString()); + MessageBox.Show(command + " Plugin not loaded."); +#endif + } + + return pluginRecord.IsLoaded; + } + + + public override int ExecuteCommand(string commandId, params string[] parameters) + { + string buildVersion = "2023"; + +#if NAVMAN17 + buildVersion = "2020"; +#endif +#if NAVMAN18 + buildVersion = "2021"; +#endif +#if NAVMAN19 + buildVersion = "2022"; +#endif +#if NAVMAN20 + buildVersion = "2023"; +#endif + + // Version + if (!NavisworksApp.Version.RuntimeProductName.Contains(buildVersion)) + { + MessageBox.Show( + "This Add-In was built for Navisworks " + buildVersion + + ", please contact jonathon@speckle.systems for assistance...", + "Cannot Continue!", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + return 0; + } + + + switch (commandId) + { + //case OneClickSend.Command: + //{ + // OneClickSendCommand.SendCommand(); + // break; + //} + + + case LaunchSpeckleConnector.Command: + { + LoadPlugin(plugin: LaunchSpeckleConnector.Plugin, command: commandId); + break; + } + + case Community.Command: + { + try + { + Process.Start("https://speckle.community/"); + } + catch + { + // ignored + } + + break; + } + + default: + { + MessageBox.Show("You have clicked on an unexpected command with ID = '" + commandId + "'"); + break; + } + } + + return 0; + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleHostPane.xaml b/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleHostPane.xaml new file mode 100644 index 0000000000..d9ee7ce5c6 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleHostPane.xaml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleHostPane.xaml.cs b/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleHostPane.xaml.cs new file mode 100644 index 0000000000..07d2885368 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleHostPane.xaml.cs @@ -0,0 +1,43 @@ +using Avalonia; +using Avalonia.ReactiveUI; +using DesktopUI2.Views; +using Speckle.ConnectorNavisworks.Bindings; +using System; +using System.Windows.Controls; +using Application = Autodesk.Navisworks.Api.Application; + +namespace Speckle.ConnectorNavisworks.Entry +{ + public partial class SpeckleHostPane : UserControl + { + public SpeckleHostPane() + { + InitializeComponent(); + + AvaloniaHost.MessageHook += AvaloniaHost_MessageHook; + AvaloniaHost.Content = new MainUserControl(); + + Application.ActiveDocument.FileNameChanged += Application_DocumentChanged; + } + + + // Triggered when the active document name is changed. This will happen automatically if a document is newly created or opened. + private void Application_DocumentChanged(object sender, EventArgs e) + { + AvaloniaHost.Content = new MainUserControl(); + } + + private const uint DLGC_WANTARROWS = 0x0001; + private const uint DLGC_HASSETSEL = 0x0008; + private const uint DLGC_WANTCHARS = 0x0080; + private const uint WM_GETDLGCODE = 0x0087; + + private static IntPtr AvaloniaHost_MessageHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, + ref bool handled) + { + if (msg != WM_GETDLGCODE) return IntPtr.Zero; + handled = true; + return new IntPtr(DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_HASSETSEL); + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleNavisworksCommand.cs b/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleNavisworksCommand.cs new file mode 100644 index 0000000000..716da8a890 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/SpeckleNavisworksCommand.cs @@ -0,0 +1,108 @@ +using System; +using System.IO; +using System.Reflection; +using System.Windows.Forms; +using System.Windows.Forms.Integration; +using Autodesk.Navisworks.Api.Plugins; +using Avalonia; +using Avalonia.ReactiveUI; +using DesktopUI2; +using DesktopUI2.ViewModels; +using Speckle.ConnectorNavisworks.Bindings; +using Speckle.Core.Logging; +using Application = Autodesk.Navisworks.Api.Application; + +namespace Speckle.ConnectorNavisworks.Entry +{ + [DockPanePlugin( + 400, + 400, + FixedSize = false, + AutoScroll = true, + MinimumHeight = 410, + MinimumWidth = 250) + ] + [Plugin( + LaunchSpeckleConnector.Plugin, + "Speckle", + DisplayName = "Speckle", + Options = PluginOptions.None, + ToolTip = "Speckle Connector for Navisworks", + ExtendedToolTip = "Speckle Connector for Navisworks") + ] + internal class SpeckleNavisworksCommandPlugin : DockPanePlugin + { + public override Control CreateControlPane() + { + AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; + try + { + InitAvalonia(); + } + catch + { + // ignore + } + + var navisworksActiveDocument = Application.ActiveDocument; + + var bindings = new ConnectorBindingsNavisworks(navisworksActiveDocument); + bindings.RegisterAppEvents(); + var viewModel = new MainViewModel(bindings); + + Setup.Init(bindings.GetHostAppNameVersion(), bindings.GetHostAppName()); + Analytics.TrackEvent(Analytics.Events.Registered, null, false); + + var speckleHost = new ElementHost + { + AutoSize = true, + Child = new SpeckleHostPane + { + DataContext = viewModel + } + }; + + speckleHost.CreateControl(); + + return speckleHost; + } + + public override void DestroyControlPane(Control pane) + { + if (pane is UserControl control) control.Dispose(); + } + + public static AppBuilder BuildAvaloniaApp() + { + var app = AppBuilder.Configure(); + + app.UsePlatformDetect(); + app.With(new SkiaOptions { MaxGpuResourceSizeBytes = 8096000 }); + app.With(new Win32PlatformOptions + { AllowEglInitialization = true, EnableMultitouch = false, UseWgl = true }); + app.LogToTrace(); + app.UseReactiveUI(); + + return app; + } + + public static void InitAvalonia() + { + BuildAvaloniaApp().SetupWithoutStarting(); + } + + private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) + { + Assembly a = null; + var name = args.Name.Split(',')[0]; + var path = Path.GetDirectoryName(typeof(RibbonHandler).Assembly.Location); + + var assemblyFile = Path.Combine(path ?? string.Empty, name + ".dll"); + + if (File.Exists(assemblyFile)) + a = Assembly.LoadFrom(assemblyFile); + + return a; + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Resources/forum16.png b/ConnectorNavisworks/ConnectorNavisworks/Resources/forum16.png new file mode 100644 index 0000000000000000000000000000000000000000..a713093bcb9f3a87f412fbbda1adce0e758f85a6 GIT binary patch literal 799 zcmV+)1K|9LP)Px%*-1n}R5(v{lR;=xSrmr9^WMv=X=>V3pTUkAQnj_(5v+`xiZC!TAc_Mn)E2>w z(2Z^sSGsZOZWaSdVFoM=Qmx83qf^|>h_fnFK@_bWlW46rO&XgtX_A-s-jyWNVjbpe zF6Z3;{^vjcy;s!e&Hx4H8$>$^dEK6}Tc456No>YPHqgb>QHCFsR3(ZgepQ{wsu6(4M@&FCIf*06_15-Xty}(#-k|=ddi4g5;AjR+ouxRzbu?z3lr*>H0~#;NewNZNtpZLOQk5)aDj! zD?+uA<`c|-hS>HEQ4`14Dor1m9=G=uk`7j+LaP@CpATFYJa5_Z%%VkVE<_+~@I{aL zP(1gDT)qB#k8hQ%>fbRuWa@T1Z>J!agZ9n!!>L)Y?Yf$3zM~s#H{lG$`<1OqGI;ZT z3?bUPVT>+ol6S9!wzdNE3lLo6M>P15T%7_eB--9ioZC~VoU@XkI;d1j2z{Ny`27wG(+*Bq z5o$M(l1=5>RNW7?w0xrA)Aw0b^IgYpy!s`JTY+td8j%OnsG0I--{pS@(#7Z4F2L7$joR)18+8vx?){09jZ4Le`8&)M$7|`KEvPx*{YgYYR9HuymuYNN*BOSNb7%8z;|=2#?6HlFS=v;MQk6hl6hLYPP6QOxghXo9 zbP;W(s8Q8FN&mE}A|Vl}QkBq+W>Fw9Ef#S|$0cc6k){bYUSorovB8dQj6L3FxpPl- z?wzqcV+?jaX-0F;{g(H9%X`iUmWY%H&e!ZhihT$+BaKvG8X=lNTo84wpDfkC*Khgv z>SA>9IEV)jG7m%;K`(HL^qF_WBmI75FVvT%tQ|zK2l!@mJuZMmiVJA+$Kqhy;N61D zi*6V5uDxjD08j_4TLI)CLOerrYom~F)f_?NuYi4(yVH^KE8?;CmYD3-@7RdcKSWTl zNKNK4@%XhNGlPv)8}MtrNRhB6KT-Lw6d=l04jKK2?zm` zlQ4V}g26>&y94xiXWAa59zbaST2NH>rEW+`v4Rf|!<`AWT}wr1)^BNknuM(1>Y<>Z zmh7BZq)H(efO$VmOp5L_}BoGx&egToQ)D;x&@Jj~9)_$U+> z!?X{^Mw^8Eu+~F17W5U>jvyBU$Qbhfoltu@mgw2ziSH zmyOCQ)2_E|ociCjaN^`{9InOI==$FX7f-kIlb0UBX4h1Pn}odaga<)wU{2@6t~c5L zbTtQmxMKmp^rW9>AFb!m&vvlqs1<;oZkU@@yjh}1NuIB1Ath}arDf*pf4ttw*^^g! z@!iKrUAH)y4X<3|!tdKS_5NX8Np{r=ivX0Nx91M|8`H5nRHH1)z-JQ_xiipgk@emi zFyr&m+_p(Pk0IaQ`WwX*NlGd+WBlkLgIj%56jwwDG9JMFXD_00<2uaD zz98zZJ#UWl`I;jnr@ld%d(|#XMH9gF?|9H+nb0?+)6+OdQkF(lUCMH&U7f0a=a8}- zPzo;W_Cm_aAt9CwJI~KBH*VnGn@D<5+;kXf46lCckECaqj20C&f#HBe*uds6&nrvR zB#e!!`dd?QH&OFnvI*?g(Gm_xWEgBNVNy(tOx$h|vh&F-T(T9|pnT4bg%>y@s%&>b z!t97O!>bXe6MuFYx)HZy0m(Tw3y5Tdv5|+Z=<|}KTpP|LlZJZ{;+WWU<|E}UrYcfO zLI3g7Ncr?aFcqYuZ85m2vEq6~$Nl{l#VV>*qUx?kXj(lN7C~0_qOHamO8#&CtXD@DDX?baccUkEvIXNFQ#=fvlDa5m(F z%2q`5E}w_XWA8^a}O5W?;NuIBTtwp_N zJ#Y24(MEVW2iw;RO+RvI4!z;l>Hs)x zLB5>ViZ75#$9OrV;u^Ju??ZMrLBGzMCqJd`N83qGbD0hm$E&Q=9;qO=Fx6_r=5|7# zCZkoSBhnp&Kc0Y~HIfUmQU>B{oW?kZa{hoQw00AfDQ^fp2$^M$SeBcaA?z8%7>*;N zc*m;+pzO9KT;Z!#u{HGF)X@Wy%+lCE@-r{`2a0Rrxi=2MS^%i#-0yB8KlO7IQB8UE z7|Kq}vXPQ&1Amy%>-`W|;jH)~C5YN+!r)NV-$-@MGxV{ap^pNn8&+1igYx}JW{ve% zRq(i4$EQB}yp{|^ZH5N>*;z5l?#eziECy8B3ABzeeX*DHj3vysQsA`$kTT5R^uHPL zHxmlYBQ(MHwy)!%f@IUx;FO=={<9B>MAI~~b;0*<+sKSC^olrElL6iE({lSy%!FcR zxFprZuXb)k6M|PeMrrI*cmG96G2ppT8wH_zG-3q6i@=vwLg}6P4}HFOm%Ub1ern5l xic%8z^?$t>ce$W^ZC3EzJF$P5VjM|%_5ZvY0v`vy&wBs>002ovPDHLkV1mb;k#zt7 literal 0 HcmV?d00001 diff --git a/ConnectorNavisworks/ConnectorNavisworks/Resources/logo16.ico b/ConnectorNavisworks/ConnectorNavisworks/Resources/logo16.ico new file mode 100644 index 0000000000000000000000000000000000000000..1a08feeb9906888ac506df2015a97be5c18f5427 GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYHa^Fc6}k3`(@SLXU%$6^S? z%0Mg%#Oz4Yc$w#|4aF|l=0`YVp<^t;F0OGsn ztqnc^`RMuy@r8hTLHPfu{?YKGEd3b1`rR#i^LM-G_{UX9VNcyueeDisB z#?}9Os{f&~u)rMl$zy@A=&CJ?C`px!_e(nr@YL zfu7EopNaBL3crah=U;H$2hyXx(Qi}h~Ol(6+xT& zrA=}U5(pXE>L|YO!oj`waCgESI=|6HV7cUO7{~}fJU?peow^q*Zfms?D%=9<73Ljq z7zXkpo*%Ul?mK52J!jqCt^`f4I#eajl+QHBOfr&jM%s_HciqiTz5(zG^asZ~ZziQ_ zCM+cxcCOTBT<2ItrBHwVU~`_Il(q2Ffq%fC1&n~l-vX@Y)-#?T?W@QYa8T)wf%hpk qQY77@hvw7n+EzJ`Ue=OX8+-wD08+Rb&aB4(0000DK82vD2Tv< z=qAdWAi_eli#MkjB5o@Nfq#%9A_}sLz;WL9oW94k7+%Z^UtJgPJ3jBWbKv*veL3g6 zhY7KbS5=iTXEC%(2)_^_2%1DQO#A9VUwlVaw&DLg&mRv2WuLDTZHVG9LI_|FN;m75 zCmKWHWYd8(8G0QV`oCiV35;VHPceuATtOGk-~=M5hq*rA+G`-Y6`4fS!O!%sm%q{e zKz=^CF(~M*&L^{aHP>VpCqLlj|GoF#{V&G&_r_mt?tA0U8-H8;{A2C+=ASqJvU?A2 z{VDqTlM2_RoJZlfJ=id1-`hW9->LZ^2P)>|jon{lfB7%jx7~JOfBbL%n?L{GN9vRE zW$dSZ)2j1gAWGjeIAP_7GoiW;$8ws|-Cb8SZ~HQM92 zP`}W9%TT{HKiho%+S}rzJ%|Pz#Ywc|Jg(vv9^e^XA&wLl@dKuAp&~u)rMl$zy@A=&CJ?C`px!_e(nr@YL zfu7EopJ^6 zyexut(n(O;q{%tSanKg6+FEaM$OA7S2lAX>GUb5B(SE8ZlT#6(v(D^g)7t5~fa%P2 zXmFx;0O)E^Qac?luHgp8J76lC)^^_j63Kk5r@wu3Y%Vsg1++l3Z{I|0U_P7Hwkr$O z&2F!XslD~{Lr1#SF9O2ARwkzwD+|>x09*j*t-+(z!f;XTRW%extlOg_rRGKEMa~03YB3e1H%5 zHvrdDK>i?c2`mB16TmZK6`0}a@bG7O^;eufNNgvP`5T3{@rh?`;Qqxt)Z90k0(@{d qjZIz*72 ReadState(Document doc) + { + var streams = new List(); + if (doc == null) return streams; + + var database = doc.Database; + var dataAdapter = + new NavisworksDataAdapter($"SELECT value FROM {TableName} WHERE key = '{KeyName}'", database.Value); + + var table = new DataTable(); + try + { + dataAdapter.Fill(table); + } + catch (DatabaseException) + { + WarnLog("We didn't find the speckle data store. That's ok - we'll make one later"); + } + + if (table.Rows.Count <= 0) + { + ConsoleLog("No saved streams found."); + return streams; + } + + var row = table.Rows[0]; + + if (table.Rows.Count > 1) + { + ConsoleLog($"Rebuilding Saved State DB. {table.Rows.Count} is too many."); + + string deleteSql = $"DELETE FROM {TableName} WHERE key = '{KeyName}'"; + string insertSql = $"INSERT INTO {TableName}(key, value) VALUES('{KeyName}', '{row.ItemArray}');"; + + using (NavisworksTransaction transaction = database.BeginTransaction(DatabaseChangedAction.Edited)) + { + NavisworksCommand command = transaction.Connection.CreateCommand(); + + try + { + command.CommandText = deleteSql; + + int unused = command.ExecuteNonQuery(); + + command.CommandText = insertSql; + int inserted = command.ExecuteNonQuery(); + if (inserted > 0) ConsoleLog($"Stream state stored."); + + transaction.Commit(); + } + catch (Exception ex) + { + // ignore + } + } + + return streams; + } + + var speckleStreamsStore = row["value"]; + + if (speckleStreamsStore == null) return streams; + try + { + streams = JsonConvert.DeserializeObject>((string)speckleStreamsStore); + + if (streams == null || streams.Count <= 0) + ErrorLog( + "Something isn't right. " + + $"{KeyName} was found but didn't deserialize into any streams:" + + $"\n {speckleStreamsStore}"); + else + ConsoleLog($"{streams.Count} saved streams found in file."); + } + catch (Exception ex) + { + ErrorLog($"Deserialization failed: {ex.Message}"); + } + + return streams; + } + + internal static void WriteStreamStateList(Document doc, List streamStates) + { + if (doc == null) return; + + DocumentDatabase documentDatabase = doc.Database; + + string streamStatesStore = JsonConvert.SerializeObject(streamStates); + + string createSql = $"CREATE TABLE IF NOT EXISTS {TableName}(key TEXT, value TEXT)"; + string deleteSql = $"DELETE FROM {TableName} WHERE key = '{KeyName}'"; + string insertSql = $"INSERT INTO {TableName}(key, value) VALUES('{KeyName}', '{streamStatesStore}');"; + + using (NavisworksTransaction transaction = documentDatabase.BeginTransaction(DatabaseChangedAction.Reset)) + { + NavisworksCommand command = transaction.Connection.CreateCommand(); + command.CommandText = createSql; + var unused = command.ExecuteNonQuery(); + transaction.Commit(); + } + + // TODO! UPDATE would theoretically be faster but the table creation logic would need + // to create a row if none exist which would be two more queries + using (NavisworksTransaction transaction = documentDatabase.BeginTransaction(DatabaseChangedAction.Edited)) + { + NavisworksCommand command = transaction.Connection.CreateCommand(); + + try + { + command.CommandText = deleteSql; + int unused = command.ExecuteNonQuery(); + + command.CommandText = insertSql; + int inserted = command.ExecuteNonQuery(); + + if (inserted > 0) ConsoleLog($"{streamStates.Count} stream states stored."); + transaction.Commit(); + } + catch (Exception ex) + { + ErrorLog($"Something went wrong: {ex.Message}"); + } + } + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks/Utils.cs b/ConnectorNavisworks/ConnectorNavisworks/Utils.cs new file mode 100644 index 0000000000..05b3fc5cec --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks/Utils.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using Autodesk.Navisworks.Api; +using Speckle.Core.Kits; +using System.Runtime.CompilerServices; + +namespace Speckle.ConnectorNavisworks +{ + internal static class ArrayExtension + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T[] ToArray(this Array arr) where T : struct + { + T[] result = new T[arr.Length]; + Array.Copy(arr, result, result.Length); + return result; + } + } + + + internal class PseudoIdComparer : IComparer + { + public int Compare(string x, string y) => + x != null && y != null + ? x.Length == y.Length ? string.Compare(x, y, StringComparison.Ordinal) : x.Length.CompareTo(y.Length) + : 0; + } + + public static class Utils + { +#if NAVMAN20 + public static string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2023); +#elif NAVMAN19 + public static string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2022); +#elif NAVMAN18 + public static string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2021); +#elif NAVMAN17 + public static string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2020); +#endif + public static string InvalidChars = @"<>/\:;""?*|=,‘"; + public static string ApplicationIdKey = "applicationId"; + + + public static void ConsoleLog(string message, ConsoleColor color = ConsoleColor.Blue) + { + Console.WriteLine(message, color); + } + + public static void WarnLog(string warningMessage) + { + ConsoleLog(warningMessage, color: ConsoleColor.DarkYellow); + } + + public static void ErrorLog(Exception err) + { + ErrorLog(err.Message); + throw err; + } + + public static void ErrorLog(string errorMessage) => ConsoleLog(errorMessage, ConsoleColor.DarkRed); + + + public static string GetUnits(Document doc) + { + return doc.Units.ToString(); + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks2020/ConnectorNavisworks2020.csproj b/ConnectorNavisworks/ConnectorNavisworks2020/ConnectorNavisworks2020.csproj new file mode 100644 index 0000000000..68eccb4644 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2020/ConnectorNavisworks2020.csproj @@ -0,0 +1,179 @@ + + + + + + + + SpeckleConnectorNavisworks + SpeckleConnectorNavisworks + Speckle.ConnectorNavisworks + {9A7D7F9A-4FE1-4053-950B-50B43BC81087} + 0.1.0 + + net48 + x64 + win-x64 + 512 + true + + Speckle writer for Autodesk Navisworks Manage + jonathon@speckle.systems + Speckle + + https://github.com/jsdbroughton/speckle-navis + git + speckle connector nwd nwc nwf navisworks manage + + true + Library + Properties + Debug;Release + + v17 + C:\Program Files\Autodesk\Navisworks Manage 2020 + + $(AppData)\Autodesk\ApplicationPlugins\Speckle.ConnectorNavisworks.bundle + AnyCPU;x64 + + + + + + + + + bin\x64\Debug\ + $(DefineConstants);NAVMAN17 + true + full + false + prompt + 4 + + + bin\x64\Release\ + $(DefineConstants);NAVMAN17 + pdbonly + true + prompt + 4 + + + + + + + + + @echo off + echo Check for existing bundle build + IF EXIST "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)" ( + echo $(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\ exists + echo Remove Existing Bundle Build + rmdir /S /Q "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)" + ) + + echo( + echo Write Plugin DLL + xcopy /Y "$(TargetPath)" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\" + + echo( + echo Package Content File + xcopy /Y "$(TargetDir)Entry\PackageContents.xml" "$(PluginBundleTarget)\" + + echo( + echo Copy UI Resources + mkdir "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US + copy /Y "$(TargetDir)Entry\Ribbon.xaml" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US\" + copy /Y "$(TargetDir)Entry\Ribbon.name" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US\" + + echo( + echo Copy Resources + mkdir "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\Resources + copy /Y "$(TargetDir)Resources\*.*" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\Resources\" + + echo( + echo Copy Dependencies + xcopy /Y "$(TargetDir)*.dll" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\" + + + + + + + + + + + + + + + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + False + global + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks2020/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2020/Properties/launchSettings.json new file mode 100644 index 0000000000..e674aba901 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2020/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "SpeckleNavisworks.2020": { + "commandName": "Executable", + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2020\\Roamer.exe", + "commandLineArgs": + "-OpenFile \"C:\\Users\\jsdbroughton\\source\\repos\\speckle\\speckle-sharp\\ConnectorNavisworks\\ConnectorNavisworks\\Sample Models\\KLY_ZHQ_CP2.nwf\"" + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks2021/ConnectorNavisworks2021.csproj b/ConnectorNavisworks/ConnectorNavisworks2021/ConnectorNavisworks2021.csproj new file mode 100644 index 0000000000..0e52419eff --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2021/ConnectorNavisworks2021.csproj @@ -0,0 +1,179 @@ + + + + + + + + SpeckleConnectorNavisworks + SpeckleConnectorNavisworks + Speckle.ConnectorNavisworks + {DEBC2174-5E31-4B6E-8680-690D75E50E2D} + 0.1.0 + + net48 + x64 + win-x64 + 512 + true + + Speckle writer for Autodesk Navisworks Manage + jonathon@speckle.systems + Speckle + + https://github.com/jsdbroughton/speckle-navis + git + speckle connector nwd nwc nwf navisworks manage + + true + Library + Properties + Debug;Release + + v18 + C:\Program Files\Autodesk\Navisworks Manage 2021 + $(AppData)\Autodesk\ApplicationPlugins\Speckle.ConnectorNavisworks.bundle + AnyCPU;x64 + + + + + + + + + bin\x64\Debug\ + $(DefineConstants);NAVMAN18 + true + full + false + prompt + 4 + + + bin\x64\Release\ + $(DefineConstants);NAVMAN18 + pdbonly + true + prompt + 4 + + + + + + + + + @echo off + echo Check for existing bundle build + IF EXIST "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)" ( + echo $(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\ exists + echo Remove Existing Bundle Build + rmdir /S /Q "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)" + ) + + echo( + echo Write Plugin DLL + xcopy /Y "$(TargetPath)" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\" + + echo( + echo Package Content File + xcopy /Y "$(TargetDir)Entry\PackageContents.xml" "$(PluginBundleTarget)\" + + echo( + echo Copy UI Resources + mkdir "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US + copy /Y "$(TargetDir)Entry\Ribbon.xaml" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US\" + copy /Y "$(TargetDir)Entry\Ribbon.name" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US\" + + echo( + echo Copy Resources + mkdir "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\Resources + copy /Y "$(TargetDir)Resources\*.*" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\Resources\" + + echo( + echo Copy Dependencies + xcopy /Y "$(TargetDir)*.dll" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\" + + + + + + + + + + + + + + + + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + False + global + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks2021/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2021/Properties/launchSettings.json new file mode 100644 index 0000000000..a42ba55ee4 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2021/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "SpeckleNavisworks.2021": { + "commandName": "Executable", + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2021\\Roamer.exe", + "commandLineArgs": + "-OpenFile \"C:\\Users\\jsdbroughton\\source\\repos\\speckle\\speckle-sharp\\ConnectorNavisworks\\ConnectorNavisworks\\Sample Models\\KLY_ZHQ_CP2.nwf\"" + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks2022/ConnectorNavisworks2022.csproj b/ConnectorNavisworks/ConnectorNavisworks2022/ConnectorNavisworks2022.csproj new file mode 100644 index 0000000000..b486ad35f1 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2022/ConnectorNavisworks2022.csproj @@ -0,0 +1,178 @@ + + + + + + + + SpeckleConnectorNavisworks + SpeckleConnectorNavisworks + Speckle.ConnectorNavisworks + {77D4F346-ACA5-42C8-8522-5EF176F3ADF1} + 0.1.0 + + net48 + x64 + win-x64 + 512 + true + + Speckle writer for Autodesk Navisworks Manage + jonathon@speckle.systems + Speckle + + https://github.com/jsdbroughton/speckle-navis + git + speckle connector nwd nwc nwf navisworks manage + + true + Library + Properties + Debug;Release + + v19 + C:\Program Files\Autodesk\Navisworks Manage 2022 + $(AppData)\Autodesk\ApplicationPlugins\Speckle.ConnectorNavisworks.bundle + AnyCPU;x64 + + + + + + + + + bin\x64\Debug\ + $(DefineConstants);NAVMAN19 + true + full + false + prompt + 4 + + + bin\x64\Release\ + $(DefineConstants);NAVMAN19 + pdbonly + true + prompt + 4 + + + + + + + + + @echo off + echo Check for existing bundle build + IF EXIST "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)" ( + echo $(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\ exists + echo Remove Existing Bundle Build + rmdir /S /Q "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)" + ) + + echo( + echo Write Plugin DLL + xcopy /Y "$(TargetPath)" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\" + + echo( + echo Package Content File + xcopy /Y "$(TargetDir)Entry\PackageContents.xml" "$(PluginBundleTarget)\" + + echo( + echo Copy UI Resources + mkdir "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US + copy /Y "$(TargetDir)Entry\Ribbon.xaml" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US\" + copy /Y "$(TargetDir)Entry\Ribbon.name" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US\" + + echo( + echo Copy Resources + mkdir "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\Resources + copy /Y "$(TargetDir)Resources\*.*" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\Resources\" + + echo( + echo Copy Dependencies + xcopy /Y "$(TargetDir)*.dll" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\" + + + + + + + + + + + + + + + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + False + global + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks2022/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2022/Properties/launchSettings.json new file mode 100644 index 0000000000..176cb04526 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2022/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "SpeckleNavisworks.2022": { + "commandName": "Executable", + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2022\\Roamer.exe", + "commandLineArgs": + "-OpenFile \"C:\\Users\\jsdbroughton\\source\\repos\\speckle\\speckle-sharp\\ConnectorNavisworks\\ConnectorNavisworks\\Sample Models\\KLY_ZHQ_CP2.nwf\"" + } + } +} \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks2023/ConnectorNavisworks2023.csproj b/ConnectorNavisworks/ConnectorNavisworks2023/ConnectorNavisworks2023.csproj new file mode 100644 index 0000000000..b8cb44556c --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2023/ConnectorNavisworks2023.csproj @@ -0,0 +1,178 @@ + + + + + + + + SpeckleConnectorNavisworks + SpeckleConnectorNavisworks + Speckle.ConnectorNavisworks + {74E39841-B2FA-494D-AC40-A6E505DE6B33} + 0.1.0 + + net48 + x64 + win-x64 + 512 + true + + Speckle writer for Autodesk Navisworks Manage + jonathon@speckle.systems + Speckle + + https://github.com/jsdbroughton/speckle-navis + git + speckle connector nwd nwc nwf navisworks manage + + true + Library + Properties + Debug;Release + + v20 + C:\Program Files\Autodesk\Navisworks Manage 2023 + $(AppData)\Autodesk\ApplicationPlugins\Speckle.ConnectorNavisworks.bundle + AnyCPU;x64 + + + + + + + + + bin\x64\Debug\ + $(DefineConstants);NAVMAN20 + true + full + false + prompt + 4 + + + bin\x64\Release\ + $(DefineConstants);NAVMAN20 + pdbonly + true + prompt + 4 + + + + + + + + + @echo off + echo Check for existing bundle build + IF EXIST "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)" ( + echo $(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\ exists + echo Remove Existing Bundle Build + rmdir /S /Q "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)" + ) + + echo( + echo Write Plugin DLL + xcopy /Y "$(TargetPath)" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\" + + echo( + echo Package Content File + xcopy /Y "$(TargetDir)Entry\PackageContents.xml" "$(PluginBundleTarget)\" + + echo( + echo Copy UI Resources + mkdir "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US + copy /Y "$(TargetDir)Entry\Ribbon.xaml" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US\" + copy /Y "$(TargetDir)Entry\Ribbon.name" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\en-US\" + + echo( + echo Copy Resources + mkdir "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\Resources + copy /Y "$(TargetDir)Resources\*.*" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\Resources\" + + echo( + echo Copy Dependencies + xcopy /Y "$(TargetDir)*.dll" "$(PluginBundleTarget)\Contents\$(NavisworksBuildNumber)\" + + + + + + + + + + + + + + + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + False + global + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + \ No newline at end of file diff --git a/ConnectorNavisworks/ConnectorNavisworks2023/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2023/Properties/launchSettings.json new file mode 100644 index 0000000000..a208d608aa --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2023/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "SpeckleNavisworks.2023": { + "commandName": "Executable", + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2023\\Roamer.exe", + "commandLineArgs": + "-OpenFile \"C:\\Users\\jsdbroughton\\source\\repos\\speckle\\speckle-sharp\\ConnectorNavisworks\\ConnectorNavisworks\\Sample Models\\KLY_ZHQ_CP2.nwf\"" + } + } +} \ No newline at end of file diff --git a/Core/Core/Kits/Applications.cs b/Core/Core/Kits/Applications.cs index e8c8dc6d3b..949b2b6cef 100644 --- a/Core/Core/Kits/Applications.cs +++ b/Core/Core/Kits/Applications.cs @@ -57,8 +57,6 @@ public string GetVersion(HostAppVersion version) /// public static class HostApplications { - - public static HostApplication Rhino = new HostApplication("Rhino", "rhino"); public static HostApplication Grasshopper = new HostApplication("Grasshopper", "grasshopper"); public static HostApplication Revit = new HostApplication("Revit", "revit"); @@ -88,6 +86,7 @@ public static class HostApplications public static HostApplication TopSolid = new HostApplication("TopSolid", "topsolid"); public static HostApplication Python = new HostApplication("Python", "python"); public static HostApplication NET = new HostApplication(".NET", "net"); + public static HostApplication Navisworks = new HostApplication("Navisworks", "navisworks"); public static HostApplication Other = new HostApplication("Other", "other"); /// @@ -128,6 +127,7 @@ public static HostApplication GetHostAppFromString(string appname) if (appname.Contains("topsolid")) return TopSolid; if (appname.Contains("python")) return Python; if (appname.Contains("net")) return NET; + if (appname.Contains("navisworks")) return Navisworks; return new HostApplication(appname, appname); } diff --git a/Core/Core/Kits/KitManager.cs b/Core/Core/Kits/KitManager.cs index 66eb95bd94..bdb4b0867e 100644 --- a/Core/Core/Kits/KitManager.cs +++ b/Core/Core/Kits/KitManager.cs @@ -10,11 +10,10 @@ namespace Speckle.Core.Kits { - public static class KitManager { - private static string _kitsFolder = null; + /// /// Local installations store kits in C:\Users\USERNAME\AppData\Roaming\Speckle\Kits /// Admin/System-wide installations in C:\ProgramData\Speckle\Kits @@ -28,10 +27,7 @@ public static string KitsFolder return _kitsFolder; } - set - { - _kitsFolder = value; - } + set { _kitsFolder = value; } } public static readonly AssemblyName SpeckleAssemblyName = typeof(Base).GetTypeInfo().Assembly.GetName(); @@ -43,7 +39,7 @@ public static string KitsFolder private static bool _initialized = false; /// - /// Checks wether a specific kit exists. + /// Checks whether a specific kit exists. /// /// /// @@ -118,7 +114,10 @@ public static IEnumerable GetKitsWithConvertersForApp(string app) /// public static void Initialize(string kitFolderLocation) { - if (_initialized) throw new SpeckleException("The kit manager has already been initialised. Make sure you call this method earlier in your code!", level: Sentry.SentryLevel.Warning); + if (_initialized) + throw new SpeckleException( + "The kit manager has already been initialised. Make sure you call this method earlier in your code!", + level: Sentry.SentryLevel.Warning); KitsFolder = kitFolderLocation; Load(); @@ -181,6 +180,7 @@ public static List GetReferencedAssemblies() { continue; } + assembliesToCheck.Enqueue(assembly); loadedAssemblies.Add(reference.FullName); returnAssemblies.Add(assembly); @@ -259,10 +259,7 @@ private static Type GetKitClass(Assembly assembly) { return type .GetInterfaces() - .FirstOrDefault(iface => - { - return iface.Name == typeof(Speckle.Core.Kits.ISpeckleKit).Name; - }) != null; + .FirstOrDefault(iface => { return iface.Name == typeof(Speckle.Core.Kits.ISpeckleKit).Name; }) != null; }); return kitClass; @@ -326,6 +323,5 @@ public static bool IsReferencing(this Assembly assembly, AssemblyName referenceN return false; } - } } diff --git a/DesktopUI2/AvaloniaHwndHost/AvaloniaHwndHost.csproj b/DesktopUI2/AvaloniaHwndHost/AvaloniaHwndHost.csproj index de42fcc57e..29fb062c3b 100644 --- a/DesktopUI2/AvaloniaHwndHost/AvaloniaHwndHost.csproj +++ b/DesktopUI2/AvaloniaHwndHost/AvaloniaHwndHost.csproj @@ -1,7 +1,7 @@ - + - net462 + net462;net48 true Release;Debug diff --git a/DesktopUI2/DesktopUI2/DesktopUI2.csproj b/DesktopUI2/DesktopUI2/DesktopUI2.csproj index cf6c1e5e03..0e0986ec75 100644 --- a/DesktopUI2/DesktopUI2/DesktopUI2.csproj +++ b/DesktopUI2/DesktopUI2/DesktopUI2.csproj @@ -51,6 +51,7 @@ + @@ -141,6 +142,9 @@ MSBuild:Compile + + MSBuild:Compile + MSBuild:Compile diff --git a/DesktopUI2/DesktopUI2/Models/Filters/ISelectionFilter.cs b/DesktopUI2/DesktopUI2/Models/Filters/ISelectionFilter.cs index f56ef1bb9e..57193591a6 100644 --- a/DesktopUI2/DesktopUI2/Models/Filters/ISelectionFilter.cs +++ b/DesktopUI2/DesktopUI2/Models/Filters/ISelectionFilter.cs @@ -4,48 +4,48 @@ namespace DesktopUI2.Models.Filters { - public interface ISelectionFilter - { - /// - /// User friendly name displayed in the UI - /// - string Name { get; set; } - - - /// - /// Used as the discriminator for deserialisation. - /// - string Type { get; } - - /// - /// MaterialDesignIcon use the demo app from the MaterialDesignInXamlToolkit to get the correct name - /// - string Icon { get; set; } - - /// - /// Internal filter name - /// - string Slug { get; set; } - - /// - /// Shoud return a succint summary of the filter: what does it contain inside? - /// - string Summary { get; } - - /// - /// Should contain a generic description of the filter and how it works. - /// - string Description { get; set; } - - /// - /// Holds the values that the user selected from the filter. Not the actual objects. - /// - List Selection { get; set; } - - /// - /// View associated to this filter type - /// - [JsonIgnore] - Type ViewType { get; } - } -} + public interface ISelectionFilter + { + /// + /// User friendly name displayed in the UI + /// + string Name { get; set; } + + + /// + /// Used as the discriminator for deserialization. + /// + string Type { get; } + + /// + /// MaterialDesignIcon use the demo app from the MaterialDesignInXamlToolkit to get the correct name + /// + string Icon { get; set; } + + /// + /// Internal filter name + /// + string Slug { get; set; } + + /// + /// Should return a succinct summary of the filter: what does it contain inside? + /// + string Summary { get; } + + /// + /// Should contain a generic description of the filter and how it works. + /// + string Description { get; set; } + + /// + /// Holds the values that the user selected from the filter. Not the actual objects. + /// + List Selection { get; set; } + + /// + /// View associated to this filter type + /// + [JsonIgnore] + Type ViewType { get; } + } +} \ No newline at end of file diff --git a/DesktopUI2/DesktopUI2/Models/Filters/SelectionFilterConverter.cs b/DesktopUI2/DesktopUI2/Models/Filters/SelectionFilterConverter.cs index 173e4717ee..95be13331b 100644 --- a/DesktopUI2/DesktopUI2/Models/Filters/SelectionFilterConverter.cs +++ b/DesktopUI2/DesktopUI2/Models/Filters/SelectionFilterConverter.cs @@ -14,7 +14,6 @@ public override bool CanConvert(Type objectType) public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - ISelectionFilter filter = default(ISelectionFilter); JObject jsonObject = null; @@ -45,14 +44,18 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist { filter = new PropertySelectionFilter(); } + else if (type == typeof(TreeSelectionFilter).ToString()) + { + filter = new TreeSelectionFilter(); + } else { - throw new SpeckleException($"Unknown filter type: {type}. Please add a case in DesktopUI2.Models.Filters.SelectionFilterConverter.cs"); + throw new SpeckleException( + $"Unknown filter type: {type}. Please add a case in DesktopUI2.Models.Filters.SelectionFilterConverter.cs"); } serializer.Populate(jsonObject.CreateReader(), filter); return filter; - } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) @@ -60,4 +63,4 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s serializer.Serialize(writer, value); } } -} +} \ No newline at end of file diff --git a/DesktopUI2/DesktopUI2/Models/Filters/TreeSelectionFilter.cs b/DesktopUI2/DesktopUI2/Models/Filters/TreeSelectionFilter.cs new file mode 100644 index 0000000000..a4f4b1d6ae --- /dev/null +++ b/DesktopUI2/DesktopUI2/Models/Filters/TreeSelectionFilter.cs @@ -0,0 +1,151 @@ +using DesktopUI2.Views.Filters; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Dynamic; +using System.Linq; +using System.Reflection; +using Speckle.Newtonsoft.Json; + +namespace DesktopUI2.Models.Filters +{ + public class TreeSelectionFilter : ISelectionFilter + { + /// + /// Used as the discriminator for deserialization. + /// + public string Type => typeof(TreeSelectionFilter).ToString(); + + /// + /// User friendly name displayed in the UI + /// + public string Name { get; set; } + + /// + /// Internal filter name + /// + public string Slug { get; set; } + + /// + /// MaterialDesignIcon use the demo app from the MaterialDesignInXamlToolkit to get the correct name + /// + public string Icon { get; set; } + + /// + /// Should contain a generic description of the filter and how it works. + /// + public string Description { get; set; } + + // Doesn't Start with the Root Node, but all list of all first tier children of the theoretical Root Node + public List Values { get; set; } + + /// + /// Holds the values that the user selected from the filter. Not the actual objects. + /// + public List Selection { get; set; } = new List(); + + public ObservableCollection SelectedItems { get; set; } = new ObservableCollection(); + Type ISelectionFilter.ViewType { get; } = typeof(TreeFilterView); + + public TreeSelectionFilter() => SelectedItems.CollectionChanged += Items_CollectionChanged; + + /// + /// Should return a succinct summary of the filter: what does it contain inside? + /// + public string Summary + { + get + { + return SelectedItems.Count != 0 + ? string.Join(", ", SelectedItems.Select(item => item.DisplayName)) + : "nothing"; + } + } + + private void Items_CollectionChanged(object sender, + System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + Selection.Clear(); + Selection.AddRange(SelectedItems.Select(item => item.ToString()).ToList()); + } + } + + + // Vanilla Tree Hierarchical Object type. Use-cases may extend with dynamic properties. + public class TreeNode : DynamicObject + { + [JsonProperty("DisplayName")] public string DisplayName { get; set; } + + [JsonProperty("Elements")] public List Elements { get; set; } = new List(); + + // For use with LINQ queries and presentation + [JsonProperty("IsSelected")] public bool IsSelected { get; set; } = false; + + // For applications that record the pointer as a Guid + [JsonProperty("Guid")] public Guid Guid { get; set; } + + // For applications that record the pointer as a Guid + [JsonProperty("Reference")] public String Reference { get; set; } + + // For applications that record the pointer as successive indexes + [JsonProperty("Indices")] public int[] Indices { get; set; } + + // For applications that record the pointer as a hash + [JsonProperty("Hash")] public object Hash { get; set; } + + [JsonProperty("IndexWith")] public string IndexWith { get; set; } = nameof(Guid); + + #region Dynamic Property Handling + + private readonly Dictionary _members = new Dictionary(); + + public override bool TryGetMember( + GetMemberBinder binder, out object result) + { + string name = binder.Name.ToLower(); + return _members.TryGetValue(name, out result); + } + + public override bool TrySetMember( + SetMemberBinder binder, object value) + { + _members[binder.Name.ToLower()] = value; + + return true; + } + + public override IEnumerable GetDynamicMemberNames() + { + return this._members.Keys; + } + + #endregion + + public override string ToString() + { + string value; + + switch (IndexWith) + { + case nameof(Guid): + value = $"{Guid}"; + break; + case nameof(Indices): + value = string.Join(",", Indices); + break; + case nameof(DisplayName): + value = DisplayName; + break; + case nameof(Hash): + value = $"{Hash}"; + break; + default: + PropertyInfo prop = typeof(TreeNode).GetProperty(IndexWith); + value = (prop != null) ? prop.GetValue(this, null).ToString() : string.Empty; + break; + } + + return value; + } + } +} \ No newline at end of file diff --git a/DesktopUI2/DesktopUI2/ViewModels/FilterViewModel.cs b/DesktopUI2/DesktopUI2/ViewModels/FilterViewModel.cs index f683cef135..3e2f40a91f 100644 --- a/DesktopUI2/DesktopUI2/ViewModels/FilterViewModel.cs +++ b/DesktopUI2/DesktopUI2/ViewModels/FilterViewModel.cs @@ -51,6 +51,13 @@ public FilterViewModel(ISelectionFilter filter) //TODO: //FilterView.DataContext = this; + + if (filter is TreeSelectionFilter tree) + { + //TODO: + } + + } catch (Exception ex) { diff --git a/DesktopUI2/DesktopUI2/Views/Filters/TreeFilterView.xaml b/DesktopUI2/DesktopUI2/Views/Filters/TreeFilterView.xaml new file mode 100644 index 0000000000..f5ed56bb28 --- /dev/null +++ b/DesktopUI2/DesktopUI2/Views/Filters/TreeFilterView.xaml @@ -0,0 +1,41 @@ + + + auto,*,auto,auto,auto + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DesktopUI2/DesktopUI2/Views/Filters/TreeFilterView.xaml.cs b/DesktopUI2/DesktopUI2/Views/Filters/TreeFilterView.xaml.cs new file mode 100644 index 0000000000..292206e6ae --- /dev/null +++ b/DesktopUI2/DesktopUI2/Views/Filters/TreeFilterView.xaml.cs @@ -0,0 +1,37 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Selection; +using Avalonia.Markup.Xaml; +using Avalonia.ReactiveUI; +using DesktopUI2.ViewModels; +using ReactiveUI; + +namespace DesktopUI2.Views.Filters +{ + public partial class TreeFilterView : ReactiveUserControl + { + public TreeFilterView() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + + private void TreeView_OnSelectionChanged(object sender, SelectionChangedEventArgs e) + { + try + { + (this.DataContext as FilterViewModel).RaisePropertyChanged("Summary"); + } + catch + { + // ignore + } + } + + + } +} diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Geometry.cs b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Geometry.cs new file mode 100644 index 0000000000..177ccf94e1 --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Geometry.cs @@ -0,0 +1,534 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Autodesk.Navisworks.Api; +using Autodesk.Navisworks.Api.Interop.ComApi; +using Objects.Geometry; +using Objects.Primitive; +using Speckle.Core.Models; +using ComBridge = Autodesk.Navisworks.Api.ComApi.ComApiBridge; // + +namespace Objects.Converter.Navisworks +{ + public class CallbackGeomListener : InwSimplePrimitivesCB + { + public List Coords { get; set; } + + public List Faces { get; set; } + public List Triangles { get; set; } + public double[] Matrix { get; set; } + + public CallbackGeomListener() + { + Coords = new List(); + Faces = new List(); + Triangles = new List(); + } + + public void Line(InwSimpleVertex v1, InwSimpleVertex v2) + { + } + + public void Point(InwSimpleVertex v1) + { + } + + public void SnapPoint(InwSimpleVertex v1) + { + } + + public void Triangle(InwSimpleVertex v1, InwSimpleVertex v2, InwSimpleVertex v3) + { + int indexPointer = Faces.Count; + + Array arrayV1 = (Array)v1.coord; + double v1X = (float)arrayV1.GetValue(1); + double v1Y = (float)arrayV1.GetValue(2); + double v1Z = (float)arrayV1.GetValue(3); + + Array arrayV2 = (Array)v2.coord; + double v2X = (float)arrayV2.GetValue(1); + double v2Y = (float)arrayV2.GetValue(2); + double v2Z = (float)arrayV2.GetValue(3); + + Array arrayV3 = (Array)v3.coord; + double v3X = (float)arrayV3.GetValue(1); + double v3Y = (float)arrayV3.GetValue(2); + double v3Z = (float)arrayV3.GetValue(3); + + //Matrix transformation + double t1 = Matrix[3] * v1X + Matrix[7] * v1Y + Matrix[11] * v1Z + Matrix[15]; + double vv1X = (Matrix[0] * v1X + Matrix[4] * v1Y + Matrix[8] * v1Z + Matrix[12]) / t1; + double vv1Y = (Matrix[1] * v1X + Matrix[5] * v1Y + Matrix[9] * v1Z + Matrix[13]) / t1; + double vv1Z = (Matrix[2] * v1X + Matrix[6] * v1Y + Matrix[10] * v1Z + Matrix[14]) / t1; + + double t2 = Matrix[3] * v2X + Matrix[7] * v2Y + Matrix[11] * v2Z + Matrix[15]; + double vv2X = (Matrix[0] * v2X + Matrix[4] * v2Y + Matrix[8] * v2Z + Matrix[12]) / t2; + double vv2Y = (Matrix[1] * v2X + Matrix[5] * v2Y + Matrix[9] * v2Z + Matrix[13]) / t2; + double vv2Z = (Matrix[2] * v2X + Matrix[6] * v2Y + Matrix[10] * v2Z + Matrix[14]) / t2; + + double t3 = Matrix[3] * v3X + Matrix[7] * v3Y + Matrix[11] * v3Z + Matrix[15]; + double vv3X = (Matrix[0] * v3X + Matrix[4] * v3Y + Matrix[8] * v3Z + Matrix[12]) / t3; + double vv3Y = (Matrix[1] * v3X + Matrix[5] * v3Y + Matrix[9] * v3Z + Matrix[13]) / t3; + double vv3Z = (Matrix[2] * v3X + Matrix[6] * v3Y + Matrix[10] * v3Z + Matrix[14]) / t3; + + Faces.Add(3); //TRIANGLE FLAG + + // Triangle by 3 Vertices + Coords.Add(vv1X); + Coords.Add(vv1Y); + Coords.Add(vv1Z); + Faces.Add(indexPointer + 0); + + Coords.Add(vv2X); + Coords.Add(vv2Y); + Coords.Add(vv2Z); + Faces.Add(indexPointer + 1); + + Coords.Add(vv3X); + Coords.Add(vv3Y); + Coords.Add(vv3Z); + Faces.Add(indexPointer + 2); + + Triangles.Add( + new NavisworksDoubleTriangle( + new NavisworksDoubleVertex(vv1X, vv1Y, vv1Z), + new NavisworksDoubleVertex(vv2X, vv2Y, vv2Z), + new NavisworksDoubleVertex(vv3X, vv3Y, vv3Z) + ) + ); + } + } + + public class NavisworksGeometry + { + public InwOpSelection ComSelection { get; set; } + public ModelItem ModelItem { get; set; } + public Stack ModelFragments { get; set; } + public Base Geometry { get; internal set; } + public Base Base { get; internal set; } + + public NavisworksGeometry(ModelItem modelItem) + { + ModelItem = modelItem; + + // Add conversion geometry to oModelColl Property + ModelItemCollection modelItemCollection = new ModelItemCollection + { + modelItem + }; + + //convert to COM selection + ComSelection = ComBridge.ToInwOpSelection(modelItemCollection); + } + + public List GetUniqueFragments() + { + List callbackListeners = new List(); + + foreach (InwOaPath path in ComSelection.Paths()) + { + CallbackGeomListener callbackListener = new CallbackGeomListener(); + foreach (InwOaFragment3 fragment in ModelFragments) + { + Array a1 = ((Array)fragment.path.ArrayData).ToArray(); + Array a2 = ((Array)path.ArrayData).ToArray(); + + // This is now lots of duplicate code!! + bool isSame = true; + + if (a1.Length == a2.Length) + { + for (int i = 0; i < a1.Length; i += 1) + { + int a1Value = (int)a1.GetValue(i); + int a2Value = (int)a2.GetValue(i); + + if (a1Value == a2Value) continue; + isSame = false; + break; + } + } + else + { + isSame = false; + } + + if (isSame) + { + InwLTransform3f3 localToWorld = (InwLTransform3f3)fragment.GetLocalToWorldMatrix(); + + //create Global Coordinate System Matrix + object matrix = localToWorld.Matrix; + Array matrixArray = (Array)matrix; + double[] elements = ConvertArrayToDouble(matrixArray); + double[] elementsValue = new double[elements.Length]; + for (int i = 0; i < elements.Length; i++) + { + elementsValue[i] = elements[i]; + } + + callbackListener.Matrix = elementsValue; + fragment.GenerateSimplePrimitives(nwEVertexProperty.eNORMAL, callbackListener); + } + } + + callbackListeners.Add(callbackListener); + } + + return callbackListeners; + } + + public List GetFragments() + { + List callbackListeners = new List(); + // create the callback object + + foreach (InwOaPath3 path in ComSelection.Paths()) + { + CallbackGeomListener callbackListener = new CallbackGeomListener(); + foreach (InwOaFragment3 fragment in path.Fragments()) + { + InwLTransform3f3 localToWorld = (InwLTransform3f3)fragment.GetLocalToWorldMatrix(); + + //create Global Coordinate System Matrix + object matrix = localToWorld.Matrix; + Array matrixArray = (Array)matrix; + double[] elements = ConvertArrayToDouble(matrixArray); + double[] elementsValue = new double[elements.Length]; + for (int i = 0; i < elements.Length; i++) + { + elementsValue[i] = elements[i]; + } + + callbackListener.Matrix = elementsValue; + fragment.GenerateSimplePrimitives(nwEVertexProperty.eNORMAL, callbackListener); + } + + callbackListeners.Add(callbackListener); + } + + return callbackListeners; + } + + public T[] ToArray(Array arr) + { + T[] result = new T[arr.Length]; + Array.Copy(arr, result, result.Length); + return result; + } + + public static double[] ConvertArrayToDouble(Array arr) + { + if (arr.Rank != 1) + { + throw new ArgumentException(); + } + + double[] doubleArray = new double[arr.GetLength(0)]; + for (int ix = arr.GetLowerBound(0); ix <= arr.GetUpperBound(0); ++ix) + { + doubleArray[ix - arr.GetLowerBound(0)] = (double)arr.GetValue(ix); + } + + return doubleArray; + } + } + + public class NavisworksTriangle + { + public NavisworksVertex Vertex1 { get; set; } + public NavisworksVertex Vertex2 { get; set; } + public NavisworksVertex Vertex3 { get; set; } + + public NavisworksTriangle(NavisworksVertex v1, NavisworksVertex v2, NavisworksVertex v3) + { + Vertex1 = v1; + Vertex2 = v2; + Vertex3 = v3; + } + } + + public class NavisworksDoubleTriangle + { + public NavisworksDoubleVertex Vertex1 { get; set; } + public NavisworksDoubleVertex Vertex2 { get; set; } + public NavisworksDoubleVertex Vertex3 { get; set; } + + public NavisworksDoubleTriangle(NavisworksDoubleVertex v1, NavisworksDoubleVertex v2, NavisworksDoubleVertex v3) + { + Vertex1 = v1; + Vertex2 = v2; + Vertex3 = v3; + } + } + + public class NavisworksVertex + { + public NavisworksVertex(float x, float y, float z) + { + X = x; + Y = y; + Z = z; + } + + public float X { get; set; } + public float Y { get; set; } + public float Z { get; set; } + } + + public class NavisworksDoubleVertex + { + public NavisworksDoubleVertex(double x, double y, double z) + { + X = x; + Y = y; + Z = z; + } + + public double X { get; set; } + public double Y { get; set; } + public double Z { get; set; } + } + + public class NavisworksMesh + { + public List Indices { get; set; } + public List Vertices { get; set; } + public List Triangles { get; set; } + + public NavisworksMesh(List Triangles) + { + this.Triangles = new List(); + this.Triangles = Triangles; + + //Add indices and vertices + Indices = new List(); + Vertices = new List(); + int index = 0; + + //create indices and vertices lists + foreach (NavisworksTriangle triangle in Triangles) + { + Indices.Add(index++); + Indices.Add(index++); + Indices.Add(index++); + Vertices.Add(triangle.Vertex1.X); + Vertices.Add(triangle.Vertex1.Y); + Vertices.Add(triangle.Vertex1.Z); + Vertices.Add(triangle.Vertex2.X); + Vertices.Add(triangle.Vertex2.Y); + Vertices.Add(triangle.Vertex2.Z); + Vertices.Add(triangle.Vertex3.X); + Vertices.Add(triangle.Vertex3.Y); + Vertices.Add(triangle.Vertex3.Z); + } + } + } + + + public partial class ConverterNavisworks + { + public static Box BoxToSpeckle(BoundingBox3D boundingBox3D) + { + var units = Application.ActiveDocument.Units.ToString(); + double scale = 1; // TODO: Proper units support. + + Point3D min = boundingBox3D.Min; + Point3D max = boundingBox3D.Max; + + var basePlane = new Plane + { + units = units, + origin = new Point(0, 0), + xdir = new Vector(1, 0), + ydir = new Vector(0, 1), + normal = new Vector(0, 0, 1) + }; + + Box boundingBox = new Box + { + units = units, + basePlane = basePlane, + xSize = new Interval(min.X * scale, max.X * scale), + ySize = new Interval(min.Y * scale, max.Y * scale), + zSize = new Interval(min.Z * scale, max.Z * scale) + }; + + return boundingBox; + } + + public Vector3D TransformVector3D { get; set; } + public Vector SettingOutPoint { get; set; } + public Vector TransformVector { get; set; } + + public Dictionary> PathDictionary = + new Dictionary>(); + + public Dictionary> ModelGeometryDictionary = + new Dictionary>(); + + public HashSet GeometrySet = new HashSet(); + + public readonly ModelItemCollection SelectedItems = new ModelItemCollection(); + public readonly ModelItemCollection SelectedItemsAndDescendants = new ModelItemCollection(); + + + /// + /// Parse all descendant nodes of the element that are visible, selected and geometry nodes. + /// + public List CollectGeometryNodes(ModelItem element) + { + ModelItemEnumerableCollection descendants = element.DescendantsAndSelf; + + // if the descendant node isn't hidden, has geometry and is part of the original selection set. + + List items = new List(); + int dCount = descendants.Count(); + + foreach (ModelItem item in descendants) + { + bool hasGeometry = item.HasGeometry; + bool isVisible = !item.IsHidden; + bool isSelected = SelectedItemsAndDescendants.IsSelected(item); + + if (hasGeometry && isVisible && isSelected) + { + items.Add(item); + } + + Console.WriteLine($"Collecting Geometry Nodes {items.Count} of possible {dCount}", ConsoleColor.DarkYellow); + } + + return items; + } + + public void AddFragments(NavisworksGeometry geometry) + { + geometry.ModelFragments = new Stack(); + + foreach (InwOaPath path in geometry.ComSelection.Paths()) + { + foreach (InwOaFragment3 frag in path.Fragments()) + { + int[] a1 = ((Array)frag.path.ArrayData).ToArray(); + int[] a2 = ((Array)path.ArrayData).ToArray(); + bool isSame = !(a1.Length != a2.Length || !a1.SequenceEqual(a2)); + + if (isSame) + { + geometry.ModelFragments.Push(frag); + } + } + } + } + + public void GetSortedFragments(ModelItemCollection modelItems) + { + InwOpSelection oSel = ComBridge.ToInwOpSelection(modelItems); + // To be most efficient you need to lookup an efficient EqualityComparer + // for the int[] key + foreach (InwOaPath3 path in oSel.Paths()) + { + // this yields ONLY unique fragments + // ordered by geometry they belong to + foreach (InwOaFragment3 frag in path.Fragments()) + { + int[] pathArr = ((Array)frag.path.ArrayData).ToArray(); + if (!PathDictionary.TryGetValue(pathArr, out Stack frags)) + { + frags = new Stack(); + PathDictionary[pathArr] = frags; + } + + frags.Push(frag); + } + } + } + + public void TranslateGeometryElement(NavisworksGeometry geometryElement) + { + Base elementBase = new Base(); + + if (geometryElement.ModelItem.HasGeometry && !geometryElement.ModelItem.Children.Any()) + { + List speckleGeometries = TranslateFragmentGeometry(geometryElement); + if (speckleGeometries.Count > 0) + { + elementBase["displayValue"] = speckleGeometries; + elementBase["units"] = "m"; + elementBase["bbox"] = BoxToSpeckle(geometryElement.ModelItem.BoundingBox()); + } + } + + geometryElement.Geometry = elementBase; + } + + public List TranslateFragmentGeometry(NavisworksGeometry navisworksGeometry) + { + List callbackListeners = navisworksGeometry.GetUniqueFragments(); + + List baseGeometries = new List(); + + Vector3D move = (TransformVector3D == null) ? new Vector3D(0,0,0) : TransformVector3D; + + foreach (CallbackGeomListener callback in callbackListeners) + { + List Triangles = callback.Triangles; + // TODO: Additional Geometry Types + //List Lines = callback.Lines; + //List Points = callback.Points; + + List vertices = new List(); + List faces = new List(); + + + + /// TODO: this needs to come from options. For now, no move. + + int triangleCount = Triangles.Count; + if (triangleCount <= 0) continue; + for (int t = 0; t < triangleCount; t += 1) + { + double + scale = 1; // TODO: This will need to relate to the ActiveDocument reality and the target units. Probably metres. + + // Apply the bounding box move. + // The native API methods for overriding transforms are not thread safe to call from the CEF instance + vertices.AddRange(new List + { + (Triangles[t].Vertex1.X + move.X) * scale, + (Triangles[t].Vertex1.Y + move.Y) * scale, + (Triangles[t].Vertex1.Z + move.Z) * scale + }); + vertices.AddRange(new List + { + (Triangles[t].Vertex2.X + move.X) * scale, + (Triangles[t].Vertex2.Y + move.Y) * scale, + (Triangles[t].Vertex2.Z + move.Z) * scale + }); + vertices.AddRange(new List + { + (Triangles[t].Vertex3.X + move.X) * scale, + (Triangles[t].Vertex3.Y + move.Y) * scale, + (Triangles[t].Vertex3.Z + move.Z) * scale + }); + + // TODO: Move this back to Geometry.cs + faces.Add(0); + faces.Add(t * 3); + faces.Add(t * 3 + 1); + faces.Add(t * 3 + 2); + } + + Mesh baseMesh = new Mesh(vertices, faces) + { + ["renderMaterial"] = ConverterNavisworks.TranslateMaterial(navisworksGeometry.ModelItem) + }; + baseGeometries.Add(baseMesh); + } + + return baseGeometries; // TODO: Check if this actually has geometries before adding to DisplayValue + } + } +} \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Other.cs b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Other.cs new file mode 100644 index 0000000000..e281bb1181 --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Other.cs @@ -0,0 +1,249 @@ +using Autodesk.Navisworks.Api; +using Autodesk.Navisworks.Api.Interop; +using Speckle.Core.Models; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using Color = System.Drawing.Color; + +namespace Objects.Converter.Navisworks +{ + public partial class ConverterNavisworks + { + public static Color NavisworksColorToColor(Autodesk.Navisworks.Api.Color color) + { + return System.Drawing.Color.FromArgb( + Convert.ToInt32(color.R * 255), + Convert.ToInt32(color.G * 255), + Convert.ToInt32(color.B * 255)); + } + + + public static Other.RenderMaterial TranslateMaterial(ModelItem geom) + { + var settings = new { Mode = "original" }; + + Color renderColor; + + switch (settings.Mode) + { + case "original": + renderColor = NavisworksColorToColor(geom.Geometry.OriginalColor); + break; + case "active": + renderColor = NavisworksColorToColor(geom.Geometry.ActiveColor); + break; + case "permanent": + renderColor = NavisworksColorToColor(geom.Geometry.PermanentColor); + break; + default: + renderColor = new Color(); + break; + } + + var materialName = $"NavisworksMaterial_{Math.Abs(renderColor.ToArgb())}"; + + Color black = Color.FromArgb(Convert.ToInt32(0), Convert.ToInt32(0), Convert.ToInt32(0)); + + PropertyCategory itemCategory = geom.PropertyCategories.FindCategoryByDisplayName("Item"); + if (itemCategory != null) + { + DataPropertyCollection itemProperties = itemCategory.Properties; + DataProperty itemMaterial = itemProperties.FindPropertyByDisplayName("Material"); + if (itemMaterial != null && itemMaterial.DisplayName != "") + { + materialName = itemMaterial.Value.ToDisplayString(); + } + } + + PropertyCategory materialPropertyCategory = geom.PropertyCategories.FindCategoryByDisplayName("Material"); + if (materialPropertyCategory != null) + { + DataPropertyCollection material = materialPropertyCategory.Properties; + DataProperty name = material.FindPropertyByDisplayName("Name"); + if (name != null && name.DisplayName != "") + { + materialName = name.Value.ToDisplayString(); + } + } + + Objects.Other.RenderMaterial r = + new Objects.Other.RenderMaterial(1 - geom.Geometry.OriginalTransparency, 0, 1, renderColor, black) + { + name = materialName + }; + + return r; + } + + public static string SanitizePropertyName(string name) + { + if (name == "Item") + { + return "$Item"; + } + + // Regex pattern from speckle-sharp/Core/Core/Models/DynamicBase.cs IsPropNameValid + return Regex.Replace(name, @"[\.\/]", "_"); + } + + public static void BuildPropertyCategory(PropertyCategory propertyCategory, DataProperty property, + ref Base propertyCategoryBase) + { + string categoryName; + string propertyName; + try + { + categoryName = SanitizePropertyName(propertyCategory.DisplayName); + } + catch (Exception err) + { + ErrorLog($"Category Name not converted. {err.Message}"); + return; + } + + try + { + propertyName = SanitizePropertyName(property.DisplayName); + } + catch (Exception err) + { + ErrorLog($"Category Name not converted. {err.Message}"); + return; + } + + dynamic propertyValue = null; + + VariantDataType type = property.Value.DataType; + + switch (type) + { + case VariantDataType.Boolean: + propertyValue = property.Value.ToBoolean(); + break; + case VariantDataType.DisplayString: + propertyValue = property.Value.ToDisplayString(); + break; + case VariantDataType.IdentifierString: + propertyValue = property.Value.ToIdentifierString(); + break; + case VariantDataType.Int32: + propertyValue = property.Value.ToInt32(); + break; + case VariantDataType.Double: + propertyValue = property.Value.ToDouble(); + break; + case VariantDataType.DoubleAngle: + propertyValue = property.Value.ToDoubleAngle(); + break; + case VariantDataType.DoubleArea: + propertyValue = property.Value.ToDoubleArea(); + break; + case VariantDataType.DoubleLength: + propertyValue = property.Value.ToDoubleLength(); + break; + case VariantDataType.DoubleVolume: + propertyValue = property.Value.ToDoubleVolume(); + break; + case VariantDataType.DateTime: + propertyValue = property.Value.ToDateTime().ToString(); + break; + case VariantDataType.NamedConstant: + propertyValue = property.Value.ToNamedConstant().DisplayName; + break; + case VariantDataType.Point3D: + propertyValue = property.Value.ToPoint3D(); + break; + case VariantDataType.None: break; + case VariantDataType.Point2D: + break; + default: + break; + } + + if (propertyValue != null) + { + object keyPropValue = propertyCategoryBase[propertyName]; + + if (keyPropValue == null) + { + propertyCategoryBase[propertyName] = propertyValue; + } + else if (keyPropValue is List) + { + List arrayPropValue = (List)keyPropValue; + + if (!arrayPropValue.Contains(propertyValue)) + { + arrayPropValue.Add(propertyValue); + } + + propertyCategoryBase[propertyName] = arrayPropValue; + } + else + { + dynamic existingValue = keyPropValue; + + if (existingValue != propertyValue) + { + List arrayPropValue = new List + { + existingValue, + propertyValue + }; + + propertyCategoryBase[propertyName] = arrayPropValue; + } + } + } + } + + public static List> LoadQuickProperties() + { + List> quickProperties_CategoryPropertyPairs = + new List>(); + using (LcUOptionLock optionLock = new LcUOptionLock()) + { + LcUOptionSet set = LcUOption.GetSet("interface.smart_tags.definitions", optionLock); + int numOptions = set.GetNumOptions(); + if (numOptions > 0) + { + for (int index = 0; index < numOptions; ++index) + { + LcUOptionSet optionSet = set.GetValue(index, null); + NamedConstant cat = optionSet.GetName("category").GetPtr(); + NamedConstant prop = optionSet.GetName("property").GetPtr(); + quickProperties_CategoryPropertyPairs.Add(Tuple.Create(cat, prop)); + } + } + } + + return quickProperties_CategoryPropertyPairs; + } + + + public static void ConsoleLog(string message, ConsoleColor color = ConsoleColor.Blue) + { + Console.WriteLine(message, color); + } + + public static void WarnLog(string warningMessage) + { + ConsoleLog(warningMessage, ConsoleColor.DarkYellow); + } + + public static void ErrorLog(Exception err) + { + ErrorLog(err.Message); + throw err; + } + + public static void ErrorLog(string errorMessage) => ConsoleLog(errorMessage, ConsoleColor.DarkRed); + + + public static string GetUnits(Document doc) + { + return nameof(doc.Units).ToLower(); + } + } +} \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.ToNative.cs b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.ToNative.cs new file mode 100644 index 0000000000..210f80747d --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.ToNative.cs @@ -0,0 +1,15 @@ +using Speckle.Core.Models; +using System; +using System.Collections.Generic; + +namespace Objects.Converter.Navisworks +{ + public partial class ConverterNavisworks + { + /// Methods included to satisfy the ISpeckleConverter requirements + /// No actual receiving exists + public object ConvertToNative(Base @object) => throw new NotImplementedException(); + public List ConvertToNative(List objects) => throw new NotImplementedException(); + public bool CanConvertToNative(Base @object) => throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.ToSpeckle.cs b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.ToSpeckle.cs new file mode 100644 index 0000000000..1ad0e00535 --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.ToSpeckle.cs @@ -0,0 +1,192 @@ +using Speckle.Core.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using Autodesk.Navisworks.Api; +using Autodesk.Navisworks.Api.ComApi; +using Autodesk.Navisworks.Api.Interop.ComApi; + +namespace Objects.Converter.Navisworks +{ + public partial class ConverterNavisworks + { + public Base ConvertToSpeckle(object @object) + { + // is expecting @object to be a pseudoId string + if (!(@object is string pseudoId)) return null; + + ModelItem element = PointerToModelItem(pseudoId); + + var @base = ModelItemToBase(element); + + // convertedIds should be populated with all the pseudoIds of nested children already converted in traversal + // the DescendantsAndSelf helper method means we don't need to keep recursing reference + // the "__" prefix is skipped in object serialization so we can use Base object to pass data back to the Connector + @base["__convertedIds"] = element.DescendantsAndSelf.Select(x => + ((Array)ComApiBridge.ToInwOaPath(element).ArrayData) + .ToArray().Aggregate("", + (current, value) => current + (value.ToString().PadLeft(4, '0') + "-")).TrimEnd('-')).ToList(); + + return @base; + } + + + private Base ModelItemToBase(ModelItem element) + { + var handle = PseudoIdFromModelItem(element); + + var @base = new Base + { + applicationId = handle, + ["bbox"] = BoxToSpeckle(element.BoundingBox()), + }; + + if (element.HasGeometry) + { + var geometry = new NavisworksGeometry(element); + + AddFragments(geometry); + + @base["displayValue"] = TranslateFragmentGeometry(geometry); + } + + if (element.Children.Any()) + { + @base["@Elements"] = ConvertToSpeckle(element.Children.ToList()); + } + + if (element.ClassDisplayName != null) + { + @base["ClassDisplayName"] = element.ClassDisplayName; + } + + if (element.ClassName != null) + { + @base["ClassName"] = element.ClassName; + } + + if (element.Model != null) + { + @base["Creator"] = element.Model.Creator; + } + + if (element.DisplayName != null) + { + @base["DisplayName"] = element.DisplayName; + } + + if (element.Model != null) + { + @base["Filename"] = element.Model.FileName; + } + + if (element.InstanceGuid.ToByteArray().Select(x => (int)x).Sum() > 0) + { + @base["InstanceGuid"] = element.InstanceGuid; + } + + if (element.IsCollection) + { + @base["NodeType"] = "Collection"; + } + + if (element.IsComposite) + { + @base["NodeType"] = "Composite Object"; + } + + if (element.IsInsert) + { + @base["NodeType"] = "Geometry Insert"; + } + + if (element.IsLayer) + { + @base["NodeType"] = "Layer"; + } + + if (element.Model != null) + { + @base["Source"] = element.Model.SourceFileName; + } + + if (element.Model != null) + { + @base["Source Guid"] = element.Model.SourceGuid; + } + + return @base; + } + + public List ConvertToSpeckle(List objects) + { + return objects.Where(CanConvertToSpeckle).Select(ConvertToSpeckle).ToList(); + } + + public List ConvertToSpeckle(List modelItems) + { + return modelItems.Where(CanConvertToSpeckle).Select(ConvertToSpeckle).ToList(); + } + + public bool CanConvertToSpeckle(object @object) + { + if (@object is ModelItem modelItem) return CanConvertToSpeckle(modelItem); + + // is expecting @object to be a pseudoId string + if (!(@object is string pseudoId)) return false; + + ModelItem item = PointerToModelItem(pseudoId); + + return CanConvertToSpeckle(item); + } + + private static bool CanConvertToSpeckle(ModelItem item) + { + + // Only Geometry and Geometry with Mesh + return item.HasGeometry && (item.Geometry.PrimitiveTypes & PrimitiveTypes.Triangles) != 0; + + } + + + private static ModelItem PointerToModelItem(object @string) + { + int[] pathArray; + + try + { + pathArray = @string.ToString().Split('-').Select(x => + { + if (int.TryParse(x, out var value)) + { + return value; + } + + throw (new Exception("malformed path pseudoId")); + }).ToArray(); + } + catch + { + return null; + } + + InwOpState10 oState = ComApiBridge.State; + InwOaPath protoPath = (InwOaPath)oState.ObjectFactory(nwEObjectType.eObjectType_nwOaPath, null, null); + + Array oneBasedArray = Array.CreateInstance(typeof(int), new int[1] { pathArray.Length }, new int[1] { 1 }); + + Array.Copy(pathArray, 0, oneBasedArray, 1, pathArray.Length); + + //for (int index = oneBasedArray.GetLowerBound(0); index <= oneBasedArray.GetUpperBound(0); index++) + //{ + // oneBasedArray.SetValue(pathArray[index - 1], index); + //} + + protoPath.ArrayData = oneBasedArray; + + ModelItem m = ComApiBridge.ToModelItem(protoPath); + + return m ?? null; + } + } +} \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Utils.cs b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Utils.cs new file mode 100644 index 0000000000..5cd6f018c7 --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.Utils.cs @@ -0,0 +1,36 @@ +using Autodesk.Navisworks.Api; +using Autodesk.Navisworks.Api.ComApi; +using Autodesk.Navisworks.Api.Interop.ComApi; +using System; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace Objects.Converter.Navisworks +{ + internal static class ArrayExtension + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T[] ToArray(this Array arr) where T : struct + { + T[] result = new T[arr.Length]; + Array.Copy(arr, result, result.Length); + return result; + } + } + + public partial class ConverterNavisworks + { + private static string PseudoIdFromModelItem(ModelItem element) + { + // The path for ModelItems is their node position at each level of the Models tree. + // This is the de facto UID for that element within the file at that time. + InwOaPath path = ComApiBridge.ToInwOaPath(element); + + // Acknowledging that if a collection contains >=10000 children then this indexing will be inadequate + string pointer = ((Array)path.ArrayData).ToArray().Aggregate("", + (current, value) => current + (value.ToString().PadLeft(4, '0') + "-")).TrimEnd('-'); + + return pointer; + } + } +} \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.cs b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.cs new file mode 100644 index 0000000000..5826053f78 --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using Autodesk.Navisworks.Api; +using Speckle.Core.Kits; +using Speckle.Core.Models; +using Version = System.Version; + +namespace Objects.Converter.Navisworks +{ + public partial class ConverterNavisworks : ISpeckleConverter + { +#if NAVMAN20 + public static string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2023); +#elif NAVMAN19 + public static string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2022); +#elif NAVMAN18 + public static string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2021); +#elif NAVMAN17 + public static string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2020); +#endif + public ConverterNavisworks() + { + Version ver = System.Reflection.Assembly.GetAssembly(typeof(ConverterNavisworks)).GetName().Version; + } + + public string Description => "Default Speckle Kit for Navisworks"; + + public string Name => nameof(ConverterNavisworks); + public string Author => "Speckle"; + public string WebsiteOrEmail => "https://speckle.systems"; + + /// + /// Keeps track of the conversion process + /// + public ProgressReport Report { get; private set; } = new ProgressReport(); + + /// + /// Decides what to do when an element being received already exists + /// + public ReceiveMode ReceiveMode { get; set; } + + public Document Doc { get; private set; } + + IEnumerable ISpeckleConverter.GetServicedApplications() => new[] { VersionedAppName }; + + /// + /// Sets the application document that the converter is targeting + /// + /// The current application document + public void SetContextDocument(object doc) + { + Doc = (Document)doc; + } + + public List ContextObjects { get; set; } = new List(); + + /// + /// Some converters need to know which other objects are being converted, in order to sort relationships between them (ie, Revit). Use this method to set them. + /// + /// + public void SetContextObjects(List objects) => ContextObjects = objects; + + + /// + /// Some converters need to know which objects have been converted before in order to update them (ie, Revit). Use this method to set them. + /// + /// + public void SetPreviousContextObjects(List objects) => throw new NotImplementedException(); + + + /// + /// Some converters need to be able to receive some settings to modify their internal behaviour (i.e. Rhino's Brep Meshing options). Use this method to set them. + /// + /// The object representing the settings for your converter. + public void SetConverterSettings(object settings) + { + } + } +} \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.shproj b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.shproj new file mode 100644 index 0000000000..523c8b3d12 --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.shproj @@ -0,0 +1,13 @@ + + + + c3232ef3-2000-44c6-a330-b94531c9cc83 + 14.0 + + + + + + + + diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworksShared.projitems b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworksShared.projitems new file mode 100644 index 0000000000..42b43b1b3b --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworksShared.projitems @@ -0,0 +1,19 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + c3232ef3-2000-44c6-a330-b94531c9cc83 + + + ConverterNavisworksShared + + + + + + + + + + \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks2020/ConverterNavisworks2020.csproj b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2020/ConverterNavisworks2020.csproj new file mode 100644 index 0000000000..d0bf8bfef4 --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2020/ConverterNavisworks2020.csproj @@ -0,0 +1,48 @@ + + + + + SpeckleConverterNavisworks + Objects.Converter.Navisworks2020 + Objects.Converter.Navisworks + AnyCPU;x64 + + + + netstandard2.0 + + + + bin\x64\Debug\ + $(DefineConstants);NAVMAN17 + true + full + false + prompt + 4 + + + + bin\x64\Release\ + $(DefineConstants);NAVMAN17 + pdbonly + true + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks2021/ConverterNavisworks2021.csproj b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2021/ConverterNavisworks2021.csproj new file mode 100644 index 0000000000..4ae8ed8a1b --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2021/ConverterNavisworks2021.csproj @@ -0,0 +1,50 @@ + + + + + SpeckleConverterNavisworks + Objects.Converter.Navisworks2021 + Objects.Converter.Navisworks + + + + + netstandard2.0 + + + + bin\x64\Debug\ + $(DefineConstants);NAVMAN18 + true + full + false + prompt + 4 + + + + bin\x64\Release\ + $(DefineConstants);NAVMAN18 + pdbonly + true + prompt + 4 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks2022/ConverterNavisworks2022.csproj b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2022/ConverterNavisworks2022.csproj new file mode 100644 index 0000000000..bf9e3b323b --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2022/ConverterNavisworks2022.csproj @@ -0,0 +1,48 @@ + + + + + SpeckleConverterNavisworks + Objects.Converter.Navisworks2022 + Objects.Converter.Navisworks + + + + netstandard2.0 + + + + bin\x64\Debug\ + $(DefineConstants);NAVMAN20 + true + full + false + prompt + 4 + + + + bin\x64\Release\ + $(DefineConstants);NAVMAN20 + pdbonly + true + prompt + 4 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks2023/ConverterNavisworks2023.csproj b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2023/ConverterNavisworks2023.csproj new file mode 100644 index 0000000000..b469e1f422 --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2023/ConverterNavisworks2023.csproj @@ -0,0 +1,48 @@ + + + + + SpeckleConverterNavisworks + Objects.Converter.Navisworks2023 + Objects.Converter.Navisworks + AnyCPU;x64 + + + + netstandard2.0 + + + + bin\x64\Debug\ + $(DefineConstants);NAVMAN20 + true + full + false + prompt + 4 + + + + bin\x64\Release\ + $(DefineConstants);NAVMAN20 + pdbonly + true + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Objects/Objects.sln b/Objects/Objects.sln index d191b4e492..9440f05cc4 100644 --- a/Objects/Objects.sln +++ b/Objects/Objects.sln @@ -95,127 +95,289 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterGrasshopper7", "Co EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterDxf", "Converters\ConverterDxf\ConverterDxf\ConverterDxf.csproj", "{C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}" EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ConverterNavisworks", "Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworks.shproj", "{C3232EF3-2000-44C6-A330-B94531C9CC83}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConverterNavisworks", "ConverterNavisworks", "{A2F9F9A0-0479-4FE0-83B3-AB38A9402821}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2023", "Converters\ConverterNavisworks\ConverterNavisworks2023\ConverterNavisworks2023.csproj", "{74081536-2A3E-447D-8F53-BDC5DCB5D98B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2020", "Converters\ConverterNavisworks\ConverterNavisworks2020\ConverterNavisworks2020.csproj", "{F039B09D-BA26-4C26-86EE-7291BE792276}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2021", "Converters\ConverterNavisworks\ConverterNavisworks2021\ConverterNavisworks2021.csproj", "{5B910BBD-184E-456C-BBAB-AD54C80F1616}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2022", "Converters\ConverterNavisworks\ConverterNavisworks2022\ConverterNavisworks2022.csproj", "{05FF1D88-1B2D-4A25-BF65-2895D4E6746D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {95C2153A-642E-4779-90C0-BFF56FC561A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95C2153A-642E-4779-90C0-BFF56FC561A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95C2153A-642E-4779-90C0-BFF56FC561A9}.Debug|x64.ActiveCfg = Debug|Any CPU + {95C2153A-642E-4779-90C0-BFF56FC561A9}.Debug|x64.Build.0 = Debug|Any CPU {95C2153A-642E-4779-90C0-BFF56FC561A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {95C2153A-642E-4779-90C0-BFF56FC561A9}.Release|Any CPU.Build.0 = Release|Any CPU + {95C2153A-642E-4779-90C0-BFF56FC561A9}.Release|x64.ActiveCfg = Release|Any CPU + {95C2153A-642E-4779-90C0-BFF56FC561A9}.Release|x64.Build.0 = Release|Any CPU {7EF0C96C-1FD9-42B2-85CE-BFD9B10DAC06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7EF0C96C-1FD9-42B2-85CE-BFD9B10DAC06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7EF0C96C-1FD9-42B2-85CE-BFD9B10DAC06}.Debug|x64.ActiveCfg = Debug|Any CPU + {7EF0C96C-1FD9-42B2-85CE-BFD9B10DAC06}.Debug|x64.Build.0 = Debug|Any CPU {7EF0C96C-1FD9-42B2-85CE-BFD9B10DAC06}.Release|Any CPU.ActiveCfg = Release|Any CPU {7EF0C96C-1FD9-42B2-85CE-BFD9B10DAC06}.Release|Any CPU.Build.0 = Release|Any CPU + {7EF0C96C-1FD9-42B2-85CE-BFD9B10DAC06}.Release|x64.ActiveCfg = Release|Any CPU + {7EF0C96C-1FD9-42B2-85CE-BFD9B10DAC06}.Release|x64.Build.0 = Release|Any CPU {D9C88135-B4B3-4C6C-A9D9-01A59A00BC0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D9C88135-B4B3-4C6C-A9D9-01A59A00BC0C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9C88135-B4B3-4C6C-A9D9-01A59A00BC0C}.Debug|x64.ActiveCfg = Debug|Any CPU + {D9C88135-B4B3-4C6C-A9D9-01A59A00BC0C}.Debug|x64.Build.0 = Debug|Any CPU {D9C88135-B4B3-4C6C-A9D9-01A59A00BC0C}.Release|Any CPU.ActiveCfg = Debug|Any CPU + {D9C88135-B4B3-4C6C-A9D9-01A59A00BC0C}.Release|x64.ActiveCfg = Release|Any CPU + {D9C88135-B4B3-4C6C-A9D9-01A59A00BC0C}.Release|x64.Build.0 = Release|Any CPU {E4006179-462F-4133-9481-219279138B93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4006179-462F-4133-9481-219279138B93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4006179-462F-4133-9481-219279138B93}.Debug|x64.ActiveCfg = Debug|Any CPU + {E4006179-462F-4133-9481-219279138B93}.Debug|x64.Build.0 = Debug|Any CPU {E4006179-462F-4133-9481-219279138B93}.Release|Any CPU.ActiveCfg = Release|Any CPU {E4006179-462F-4133-9481-219279138B93}.Release|Any CPU.Build.0 = Release|Any CPU + {E4006179-462F-4133-9481-219279138B93}.Release|x64.ActiveCfg = Release|Any CPU + {E4006179-462F-4133-9481-219279138B93}.Release|x64.Build.0 = Release|Any CPU {BF5515B4-C97C-4FB9-9F93-1740D2B615B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BF5515B4-C97C-4FB9-9F93-1740D2B615B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF5515B4-C97C-4FB9-9F93-1740D2B615B3}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF5515B4-C97C-4FB9-9F93-1740D2B615B3}.Debug|x64.Build.0 = Debug|Any CPU {BF5515B4-C97C-4FB9-9F93-1740D2B615B3}.Release|Any CPU.ActiveCfg = Release|Any CPU {BF5515B4-C97C-4FB9-9F93-1740D2B615B3}.Release|Any CPU.Build.0 = Release|Any CPU + {BF5515B4-C97C-4FB9-9F93-1740D2B615B3}.Release|x64.ActiveCfg = Release|Any CPU + {BF5515B4-C97C-4FB9-9F93-1740D2B615B3}.Release|x64.Build.0 = Release|Any CPU {4F16A993-7D11-4565-A2A5-910899919E00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4F16A993-7D11-4565-A2A5-910899919E00}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F16A993-7D11-4565-A2A5-910899919E00}.Debug|x64.ActiveCfg = Debug|Any CPU + {4F16A993-7D11-4565-A2A5-910899919E00}.Debug|x64.Build.0 = Debug|Any CPU {4F16A993-7D11-4565-A2A5-910899919E00}.Release|Any CPU.ActiveCfg = Release|Any CPU {4F16A993-7D11-4565-A2A5-910899919E00}.Release|Any CPU.Build.0 = Release|Any CPU + {4F16A993-7D11-4565-A2A5-910899919E00}.Release|x64.ActiveCfg = Release|Any CPU + {4F16A993-7D11-4565-A2A5-910899919E00}.Release|x64.Build.0 = Release|Any CPU {BC110327-3C61-4C15-AE4C-DAAE7CA82A7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BC110327-3C61-4C15-AE4C-DAAE7CA82A7B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC110327-3C61-4C15-AE4C-DAAE7CA82A7B}.Debug|x64.ActiveCfg = Debug|Any CPU + {BC110327-3C61-4C15-AE4C-DAAE7CA82A7B}.Debug|x64.Build.0 = Debug|Any CPU {BC110327-3C61-4C15-AE4C-DAAE7CA82A7B}.Release|Any CPU.ActiveCfg = Release|Any CPU {BC110327-3C61-4C15-AE4C-DAAE7CA82A7B}.Release|Any CPU.Build.0 = Release|Any CPU + {BC110327-3C61-4C15-AE4C-DAAE7CA82A7B}.Release|x64.ActiveCfg = Release|Any CPU + {BC110327-3C61-4C15-AE4C-DAAE7CA82A7B}.Release|x64.Build.0 = Release|Any CPU {DD4ADD16-65F9-46E0-A610-2B7908A966B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DD4ADD16-65F9-46E0-A610-2B7908A966B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD4ADD16-65F9-46E0-A610-2B7908A966B3}.Debug|x64.ActiveCfg = Debug|Any CPU + {DD4ADD16-65F9-46E0-A610-2B7908A966B3}.Debug|x64.Build.0 = Debug|Any CPU {DD4ADD16-65F9-46E0-A610-2B7908A966B3}.Release|Any CPU.ActiveCfg = Release|Any CPU {DD4ADD16-65F9-46E0-A610-2B7908A966B3}.Release|Any CPU.Build.0 = Release|Any CPU + {DD4ADD16-65F9-46E0-A610-2B7908A966B3}.Release|x64.ActiveCfg = Release|Any CPU + {DD4ADD16-65F9-46E0-A610-2B7908A966B3}.Release|x64.Build.0 = Release|Any CPU {13F93C20-793C-4F2D-B836-68D7744063DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {13F93C20-793C-4F2D-B836-68D7744063DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13F93C20-793C-4F2D-B836-68D7744063DF}.Debug|x64.ActiveCfg = Debug|Any CPU + {13F93C20-793C-4F2D-B836-68D7744063DF}.Debug|x64.Build.0 = Debug|Any CPU {13F93C20-793C-4F2D-B836-68D7744063DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {13F93C20-793C-4F2D-B836-68D7744063DF}.Release|Any CPU.Build.0 = Release|Any CPU + {13F93C20-793C-4F2D-B836-68D7744063DF}.Release|x64.ActiveCfg = Release|Any CPU + {13F93C20-793C-4F2D-B836-68D7744063DF}.Release|x64.Build.0 = Release|Any CPU {156FF86C-8531-46D0-AA23-97DB326BC591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {156FF86C-8531-46D0-AA23-97DB326BC591}.Debug|Any CPU.Build.0 = Debug|Any CPU + {156FF86C-8531-46D0-AA23-97DB326BC591}.Debug|x64.ActiveCfg = Debug|Any CPU + {156FF86C-8531-46D0-AA23-97DB326BC591}.Debug|x64.Build.0 = Debug|Any CPU {156FF86C-8531-46D0-AA23-97DB326BC591}.Release|Any CPU.ActiveCfg = Release|Any CPU {156FF86C-8531-46D0-AA23-97DB326BC591}.Release|Any CPU.Build.0 = Release|Any CPU + {156FF86C-8531-46D0-AA23-97DB326BC591}.Release|x64.ActiveCfg = Release|Any CPU + {156FF86C-8531-46D0-AA23-97DB326BC591}.Release|x64.Build.0 = Release|Any CPU {2C68E80F-38F4-41D0-9B38-473031D1B541}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2C68E80F-38F4-41D0-9B38-473031D1B541}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C68E80F-38F4-41D0-9B38-473031D1B541}.Debug|x64.ActiveCfg = Debug|Any CPU + {2C68E80F-38F4-41D0-9B38-473031D1B541}.Debug|x64.Build.0 = Debug|Any CPU {2C68E80F-38F4-41D0-9B38-473031D1B541}.Release|Any CPU.ActiveCfg = Release|Any CPU {2C68E80F-38F4-41D0-9B38-473031D1B541}.Release|Any CPU.Build.0 = Release|Any CPU + {2C68E80F-38F4-41D0-9B38-473031D1B541}.Release|x64.ActiveCfg = Release|Any CPU + {2C68E80F-38F4-41D0-9B38-473031D1B541}.Release|x64.Build.0 = Release|Any CPU {63B3F901-7C14-4530-8A6F-CCAD68586664}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {63B3F901-7C14-4530-8A6F-CCAD68586664}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63B3F901-7C14-4530-8A6F-CCAD68586664}.Debug|x64.ActiveCfg = Debug|Any CPU + {63B3F901-7C14-4530-8A6F-CCAD68586664}.Debug|x64.Build.0 = Debug|Any CPU {63B3F901-7C14-4530-8A6F-CCAD68586664}.Release|Any CPU.ActiveCfg = Release|Any CPU {63B3F901-7C14-4530-8A6F-CCAD68586664}.Release|Any CPU.Build.0 = Release|Any CPU + {63B3F901-7C14-4530-8A6F-CCAD68586664}.Release|x64.ActiveCfg = Release|Any CPU + {63B3F901-7C14-4530-8A6F-CCAD68586664}.Release|x64.Build.0 = Release|Any CPU {B9649E07-F7B4-4FCC-9E44-076993621D0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9649E07-F7B4-4FCC-9E44-076993621D0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9649E07-F7B4-4FCC-9E44-076993621D0A}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9649E07-F7B4-4FCC-9E44-076993621D0A}.Debug|x64.Build.0 = Debug|Any CPU {B9649E07-F7B4-4FCC-9E44-076993621D0A}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9649E07-F7B4-4FCC-9E44-076993621D0A}.Release|Any CPU.Build.0 = Release|Any CPU + {B9649E07-F7B4-4FCC-9E44-076993621D0A}.Release|x64.ActiveCfg = Release|Any CPU + {B9649E07-F7B4-4FCC-9E44-076993621D0A}.Release|x64.Build.0 = Release|Any CPU {6185B1A1-0A12-44B1-8AC5-0ED48147FB21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6185B1A1-0A12-44B1-8AC5-0ED48147FB21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6185B1A1-0A12-44B1-8AC5-0ED48147FB21}.Debug|x64.ActiveCfg = Debug|Any CPU + {6185B1A1-0A12-44B1-8AC5-0ED48147FB21}.Debug|x64.Build.0 = Debug|Any CPU {6185B1A1-0A12-44B1-8AC5-0ED48147FB21}.Release|Any CPU.ActiveCfg = Release|Any CPU {6185B1A1-0A12-44B1-8AC5-0ED48147FB21}.Release|Any CPU.Build.0 = Release|Any CPU + {6185B1A1-0A12-44B1-8AC5-0ED48147FB21}.Release|x64.ActiveCfg = Release|Any CPU + {6185B1A1-0A12-44B1-8AC5-0ED48147FB21}.Release|x64.Build.0 = Release|Any CPU {528C7672-12C1-47DE-A7C0-775DDA8E7D92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {528C7672-12C1-47DE-A7C0-775DDA8E7D92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {528C7672-12C1-47DE-A7C0-775DDA8E7D92}.Debug|x64.ActiveCfg = Debug|Any CPU + {528C7672-12C1-47DE-A7C0-775DDA8E7D92}.Debug|x64.Build.0 = Debug|Any CPU {528C7672-12C1-47DE-A7C0-775DDA8E7D92}.Release|Any CPU.ActiveCfg = Release|Any CPU {528C7672-12C1-47DE-A7C0-775DDA8E7D92}.Release|Any CPU.Build.0 = Release|Any CPU + {528C7672-12C1-47DE-A7C0-775DDA8E7D92}.Release|x64.ActiveCfg = Release|Any CPU + {528C7672-12C1-47DE-A7C0-775DDA8E7D92}.Release|x64.Build.0 = Release|Any CPU {90362309-466A-482B-814A-ADB1CE227607}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {90362309-466A-482B-814A-ADB1CE227607}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90362309-466A-482B-814A-ADB1CE227607}.Debug|x64.ActiveCfg = Debug|Any CPU + {90362309-466A-482B-814A-ADB1CE227607}.Debug|x64.Build.0 = Debug|Any CPU {90362309-466A-482B-814A-ADB1CE227607}.Release|Any CPU.ActiveCfg = Release|Any CPU {90362309-466A-482B-814A-ADB1CE227607}.Release|Any CPU.Build.0 = Release|Any CPU + {90362309-466A-482B-814A-ADB1CE227607}.Release|x64.ActiveCfg = Release|Any CPU + {90362309-466A-482B-814A-ADB1CE227607}.Release|x64.Build.0 = Release|Any CPU {45EA031D-56A5-4CB3-81DC-AF3EF26580E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {45EA031D-56A5-4CB3-81DC-AF3EF26580E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45EA031D-56A5-4CB3-81DC-AF3EF26580E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {45EA031D-56A5-4CB3-81DC-AF3EF26580E0}.Debug|x64.Build.0 = Debug|Any CPU {45EA031D-56A5-4CB3-81DC-AF3EF26580E0}.Release|Any CPU.ActiveCfg = Release|Any CPU {45EA031D-56A5-4CB3-81DC-AF3EF26580E0}.Release|Any CPU.Build.0 = Release|Any CPU + {45EA031D-56A5-4CB3-81DC-AF3EF26580E0}.Release|x64.ActiveCfg = Release|Any CPU + {45EA031D-56A5-4CB3-81DC-AF3EF26580E0}.Release|x64.Build.0 = Release|Any CPU {4220C3DC-E198-4084-B74D-85C9B31607F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4220C3DC-E198-4084-B74D-85C9B31607F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4220C3DC-E198-4084-B74D-85C9B31607F7}.Debug|x64.ActiveCfg = Debug|Any CPU + {4220C3DC-E198-4084-B74D-85C9B31607F7}.Debug|x64.Build.0 = Debug|Any CPU {4220C3DC-E198-4084-B74D-85C9B31607F7}.Release|Any CPU.ActiveCfg = Release|Any CPU {4220C3DC-E198-4084-B74D-85C9B31607F7}.Release|Any CPU.Build.0 = Release|Any CPU + {4220C3DC-E198-4084-B74D-85C9B31607F7}.Release|x64.ActiveCfg = Release|Any CPU + {4220C3DC-E198-4084-B74D-85C9B31607F7}.Release|x64.Build.0 = Release|Any CPU {D8CDF95E-F72D-4F3E-8026-B82863F97D64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D8CDF95E-F72D-4F3E-8026-B82863F97D64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8CDF95E-F72D-4F3E-8026-B82863F97D64}.Debug|x64.ActiveCfg = Debug|Any CPU + {D8CDF95E-F72D-4F3E-8026-B82863F97D64}.Debug|x64.Build.0 = Debug|Any CPU {D8CDF95E-F72D-4F3E-8026-B82863F97D64}.Release|Any CPU.ActiveCfg = Release|Any CPU {D8CDF95E-F72D-4F3E-8026-B82863F97D64}.Release|Any CPU.Build.0 = Release|Any CPU + {D8CDF95E-F72D-4F3E-8026-B82863F97D64}.Release|x64.ActiveCfg = Release|Any CPU + {D8CDF95E-F72D-4F3E-8026-B82863F97D64}.Release|x64.Build.0 = Release|Any CPU {5905F0F8-AE1D-473B-87F3-97E40E6CBE55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5905F0F8-AE1D-473B-87F3-97E40E6CBE55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5905F0F8-AE1D-473B-87F3-97E40E6CBE55}.Debug|x64.ActiveCfg = Debug|Any CPU + {5905F0F8-AE1D-473B-87F3-97E40E6CBE55}.Debug|x64.Build.0 = Debug|Any CPU {5905F0F8-AE1D-473B-87F3-97E40E6CBE55}.Release|Any CPU.ActiveCfg = Release|Any CPU {5905F0F8-AE1D-473B-87F3-97E40E6CBE55}.Release|Any CPU.Build.0 = Release|Any CPU + {5905F0F8-AE1D-473B-87F3-97E40E6CBE55}.Release|x64.ActiveCfg = Release|Any CPU + {5905F0F8-AE1D-473B-87F3-97E40E6CBE55}.Release|x64.Build.0 = Release|Any CPU {62E992B6-2E65-4714-AD37-42F34F9BD5DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62E992B6-2E65-4714-AD37-42F34F9BD5DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62E992B6-2E65-4714-AD37-42F34F9BD5DA}.Debug|x64.ActiveCfg = Debug|Any CPU + {62E992B6-2E65-4714-AD37-42F34F9BD5DA}.Debug|x64.Build.0 = Debug|Any CPU {62E992B6-2E65-4714-AD37-42F34F9BD5DA}.Release|Any CPU.ActiveCfg = Release|Any CPU {62E992B6-2E65-4714-AD37-42F34F9BD5DA}.Release|Any CPU.Build.0 = Release|Any CPU + {62E992B6-2E65-4714-AD37-42F34F9BD5DA}.Release|x64.ActiveCfg = Release|Any CPU + {62E992B6-2E65-4714-AD37-42F34F9BD5DA}.Release|x64.Build.0 = Release|Any CPU {F00B2895-B912-432D-A504-99A82E07D9D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F00B2895-B912-432D-A504-99A82E07D9D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F00B2895-B912-432D-A504-99A82E07D9D4}.Debug|x64.ActiveCfg = Debug|Any CPU + {F00B2895-B912-432D-A504-99A82E07D9D4}.Debug|x64.Build.0 = Debug|Any CPU {F00B2895-B912-432D-A504-99A82E07D9D4}.Release|Any CPU.ActiveCfg = Release|Any CPU {F00B2895-B912-432D-A504-99A82E07D9D4}.Release|Any CPU.Build.0 = Release|Any CPU + {F00B2895-B912-432D-A504-99A82E07D9D4}.Release|x64.ActiveCfg = Release|Any CPU + {F00B2895-B912-432D-A504-99A82E07D9D4}.Release|x64.Build.0 = Release|Any CPU {DF4D24C3-2BE8-476C-8D40-33892BE07B1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DF4D24C3-2BE8-476C-8D40-33892BE07B1D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF4D24C3-2BE8-476C-8D40-33892BE07B1D}.Debug|x64.ActiveCfg = Debug|Any CPU + {DF4D24C3-2BE8-476C-8D40-33892BE07B1D}.Debug|x64.Build.0 = Debug|Any CPU {DF4D24C3-2BE8-476C-8D40-33892BE07B1D}.Release|Any CPU.ActiveCfg = Release|Any CPU {DF4D24C3-2BE8-476C-8D40-33892BE07B1D}.Release|Any CPU.Build.0 = Release|Any CPU + {DF4D24C3-2BE8-476C-8D40-33892BE07B1D}.Release|x64.ActiveCfg = Release|Any CPU + {DF4D24C3-2BE8-476C-8D40-33892BE07B1D}.Release|x64.Build.0 = Release|Any CPU {79AA475D-7CDE-4501-90CE-9A0D9D0DB023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {79AA475D-7CDE-4501-90CE-9A0D9D0DB023}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79AA475D-7CDE-4501-90CE-9A0D9D0DB023}.Debug|x64.ActiveCfg = Debug|Any CPU + {79AA475D-7CDE-4501-90CE-9A0D9D0DB023}.Debug|x64.Build.0 = Debug|Any CPU {79AA475D-7CDE-4501-90CE-9A0D9D0DB023}.Release|Any CPU.ActiveCfg = Release|Any CPU {79AA475D-7CDE-4501-90CE-9A0D9D0DB023}.Release|Any CPU.Build.0 = Release|Any CPU + {79AA475D-7CDE-4501-90CE-9A0D9D0DB023}.Release|x64.ActiveCfg = Release|Any CPU + {79AA475D-7CDE-4501-90CE-9A0D9D0DB023}.Release|x64.Build.0 = Release|Any CPU {ADC53DC0-0592-4F13-B456-65ADCB2164A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ADC53DC0-0592-4F13-B456-65ADCB2164A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADC53DC0-0592-4F13-B456-65ADCB2164A1}.Debug|x64.ActiveCfg = Debug|Any CPU + {ADC53DC0-0592-4F13-B456-65ADCB2164A1}.Debug|x64.Build.0 = Debug|Any CPU {ADC53DC0-0592-4F13-B456-65ADCB2164A1}.Release|Any CPU.ActiveCfg = Release|Any CPU {ADC53DC0-0592-4F13-B456-65ADCB2164A1}.Release|Any CPU.Build.0 = Release|Any CPU + {ADC53DC0-0592-4F13-B456-65ADCB2164A1}.Release|x64.ActiveCfg = Release|Any CPU + {ADC53DC0-0592-4F13-B456-65ADCB2164A1}.Release|x64.Build.0 = Release|Any CPU {08EE146E-9F7A-4C82-B790-688FE4532CA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08EE146E-9F7A-4C82-B790-688FE4532CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08EE146E-9F7A-4C82-B790-688FE4532CA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {08EE146E-9F7A-4C82-B790-688FE4532CA7}.Debug|x64.Build.0 = Debug|Any CPU {08EE146E-9F7A-4C82-B790-688FE4532CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {08EE146E-9F7A-4C82-B790-688FE4532CA7}.Release|Any CPU.Build.0 = Release|Any CPU + {08EE146E-9F7A-4C82-B790-688FE4532CA7}.Release|x64.ActiveCfg = Release|Any CPU + {08EE146E-9F7A-4C82-B790-688FE4532CA7}.Release|x64.Build.0 = Release|Any CPU {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF}.Debug|x64.ActiveCfg = Debug|Any CPU + {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF}.Debug|x64.Build.0 = Debug|Any CPU {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF}.Release|Any CPU.ActiveCfg = Release|Any CPU {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF}.Release|Any CPU.Build.0 = Release|Any CPU + {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF}.Release|x64.ActiveCfg = Release|Any CPU + {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF}.Release|x64.Build.0 = Release|Any CPU {5A7671D6-57A1-4422-9EBB-79F3C724C0BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5A7671D6-57A1-4422-9EBB-79F3C724C0BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A7671D6-57A1-4422-9EBB-79F3C724C0BA}.Debug|x64.ActiveCfg = Debug|Any CPU + {5A7671D6-57A1-4422-9EBB-79F3C724C0BA}.Debug|x64.Build.0 = Debug|Any CPU {5A7671D6-57A1-4422-9EBB-79F3C724C0BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {5A7671D6-57A1-4422-9EBB-79F3C724C0BA}.Release|Any CPU.Build.0 = Release|Any CPU + {5A7671D6-57A1-4422-9EBB-79F3C724C0BA}.Release|x64.ActiveCfg = Release|Any CPU + {5A7671D6-57A1-4422-9EBB-79F3C724C0BA}.Release|x64.Build.0 = Release|Any CPU {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}.Debug|x64.ActiveCfg = Debug|Any CPU + {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}.Debug|x64.Build.0 = Debug|Any CPU {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}.Release|Any CPU.ActiveCfg = Release|Any CPU {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}.Release|Any CPU.Build.0 = Release|Any CPU + {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}.Release|x64.ActiveCfg = Release|Any CPU + {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633}.Release|x64.Build.0 = Release|Any CPU + {74081536-2A3E-447D-8F53-BDC5DCB5D98B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74081536-2A3E-447D-8F53-BDC5DCB5D98B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74081536-2A3E-447D-8F53-BDC5DCB5D98B}.Debug|x64.ActiveCfg = Debug|x64 + {74081536-2A3E-447D-8F53-BDC5DCB5D98B}.Debug|x64.Build.0 = Debug|x64 + {74081536-2A3E-447D-8F53-BDC5DCB5D98B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74081536-2A3E-447D-8F53-BDC5DCB5D98B}.Release|Any CPU.Build.0 = Release|Any CPU + {74081536-2A3E-447D-8F53-BDC5DCB5D98B}.Release|x64.ActiveCfg = Release|x64 + {74081536-2A3E-447D-8F53-BDC5DCB5D98B}.Release|x64.Build.0 = Release|x64 + {F039B09D-BA26-4C26-86EE-7291BE792276}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F039B09D-BA26-4C26-86EE-7291BE792276}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F039B09D-BA26-4C26-86EE-7291BE792276}.Debug|x64.ActiveCfg = Debug|x64 + {F039B09D-BA26-4C26-86EE-7291BE792276}.Debug|x64.Build.0 = Debug|x64 + {F039B09D-BA26-4C26-86EE-7291BE792276}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F039B09D-BA26-4C26-86EE-7291BE792276}.Release|Any CPU.Build.0 = Release|Any CPU + {F039B09D-BA26-4C26-86EE-7291BE792276}.Release|x64.ActiveCfg = Release|x64 + {F039B09D-BA26-4C26-86EE-7291BE792276}.Release|x64.Build.0 = Release|x64 + {5B910BBD-184E-456C-BBAB-AD54C80F1616}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B910BBD-184E-456C-BBAB-AD54C80F1616}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B910BBD-184E-456C-BBAB-AD54C80F1616}.Debug|x64.ActiveCfg = Debug|Any CPU + {5B910BBD-184E-456C-BBAB-AD54C80F1616}.Debug|x64.Build.0 = Debug|Any CPU + {5B910BBD-184E-456C-BBAB-AD54C80F1616}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B910BBD-184E-456C-BBAB-AD54C80F1616}.Release|Any CPU.Build.0 = Release|Any CPU + {5B910BBD-184E-456C-BBAB-AD54C80F1616}.Release|x64.ActiveCfg = Release|Any CPU + {5B910BBD-184E-456C-BBAB-AD54C80F1616}.Release|x64.Build.0 = Release|Any CPU + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D}.Debug|x64.ActiveCfg = Debug|Any CPU + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D}.Debug|x64.Build.0 = Debug|Any CPU + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D}.Release|Any CPU.Build.0 = Release|Any CPU + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D}.Release|x64.ActiveCfg = Release|Any CPU + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -263,11 +425,18 @@ Global {1DC0A8F4-1F14-47E8-8456-9D8E9C0E6CFF} = {1A35077C-2936-4A3D-8D48-65F39F76D999} {5A7671D6-57A1-4422-9EBB-79F3C724C0BA} = {1A35077C-2936-4A3D-8D48-65F39F76D999} {C6E9DE1F-2CFF-44AC-9B9A-E71783DF6633} = {CCC09288-CE76-4FDB-B0C9-220112F88CD9} + {C3232EF3-2000-44C6-A330-B94531C9CC83} = {A2F9F9A0-0479-4FE0-83B3-AB38A9402821} + {A2F9F9A0-0479-4FE0-83B3-AB38A9402821} = {CCC09288-CE76-4FDB-B0C9-220112F88CD9} + {74081536-2A3E-447D-8F53-BDC5DCB5D98B} = {A2F9F9A0-0479-4FE0-83B3-AB38A9402821} + {F039B09D-BA26-4C26-86EE-7291BE792276} = {A2F9F9A0-0479-4FE0-83B3-AB38A9402821} + {5B910BBD-184E-456C-BBAB-AD54C80F1616} = {A2F9F9A0-0479-4FE0-83B3-AB38A9402821} + {05FF1D88-1B2D-4A25-BF65-2895D4E6746D} = {A2F9F9A0-0479-4FE0-83B3-AB38A9402821} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DA57EC2E-0A9E-4F59-B1F7-A65F76A74B74} EndGlobalSection GlobalSection(SharedMSBuildProjectFiles) = preSolution + Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{05ff1d88-1b2d-4a25-bf65-2895d4e6746d}*SharedItemsImports = 5 Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{08ee146e-9f7a-4c82-b790-688fe4532ca7}*SharedItemsImports = 5 Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{13f93c20-793c-4f2d-b836-68d7744063df}*SharedItemsImports = 5 Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{156ff86c-8531-46d0-aa23-97db326bc591}*SharedItemsImports = 5 @@ -282,10 +451,12 @@ Global Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{4f16a993-7d11-4565-a2a5-910899919e00}*SharedItemsImports = 5 Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{5905f0f8-ae1d-473b-87f3-97e40e6cbe55}*SharedItemsImports = 5 Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{5a7671d6-57a1-4422-9ebb-79f3c724c0ba}*SharedItemsImports = 5 + Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{5b910bbd-184e-456c-bbab-ad54c80f1616}*SharedItemsImports = 5 Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{5bab09dc-b0fc-4004-9fd5-6496a9634071}*SharedItemsImports = 13 Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{5bbde14e-50f8-4d6e-8e35-747667ad4a09}*SharedItemsImports = 13 Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{62e992b6-2e65-4714-ad37-42f34f9bd5da}*SharedItemsImports = 5 Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{63b3f901-7c14-4530-8a6f-ccad68586664}*SharedItemsImports = 5 + Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{74081536-2a3e-447d-8f53-bdc5dcb5d98b}*SharedItemsImports = 5 Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{79aa475d-7cde-4501-90ce-9a0d9d0db023}*SharedItemsImports = 5 Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{7ffdab72-145d-4490-9892-fac5f1d72b17}*SharedItemsImports = 13 Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{90362309-466a-482b-814a-adb1ce227607}*SharedItemsImports = 5 @@ -294,10 +465,12 @@ Global Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{b9649e07-f7b4-4fcc-9e44-076993621d0a}*SharedItemsImports = 5 Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{bc110327-3c61-4c15-ae4c-daae7ca82a7b}*SharedItemsImports = 5 Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{bf5515b4-c97c-4fb9-9f93-1740d2b615b3}*SharedItemsImports = 5 + Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{c3232ef3-2000-44c6-a330-b94531c9cc83}*SharedItemsImports = 13 Converters\ConverterMicroStation\ConverterMicroStationOpenShared\ConverterMicroStationOpenShared.projitems*{d8cdf95e-f72d-4f3e-8026-b82863f97d64}*SharedItemsImports = 5 Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{dd4add16-65f9-46e0-a610-2b7908a966b3}*SharedItemsImports = 5 Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{df4d24c3-2be8-476c-8d40-33892be07b1d}*SharedItemsImports = 5 Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{e4006179-462f-4133-9481-219279138b93}*SharedItemsImports = 5 Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{f00b2895-b912-432d-a504-99a82e07d9d4}*SharedItemsImports = 5 + Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{f039b09d-ba26-4c26-86ee-7291be792276}*SharedItemsImports = 5 EndGlobalSection EndGlobal