diff --git a/All.sln b/All.sln index 83ebd163a9..df383c2f22 100644 --- a/All.sln +++ b/All.sln @@ -426,10 +426,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Automate.Sdk.Tests. EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConnectorCore", "ConnectorCore", "{DA9DFC36-C53F-4B19-8911-BF7605230BA7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BatchUploader.OperationDriver", "ConnectorCore\BatchUploader.OperationDriver\BatchUploader.OperationDriver.csproj", "{7F0206A9-61D4-4D3A-9B43-789DABA7C143}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BatchUploader.Sdk", "ConnectorCore\BatchUploader.Sdk\BatchUploader.Sdk.csproj", "{2CC777EB-BD63-4FAB-BC3A-68A640D2E639}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorRhino8", "ConnectorRhino\ConnectorRhino8\ConnectorRhino8.csproj", "{D22A887D-976C-4DBF-AE5B-9039F169E61C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterRhino8", "Objects\Converters\ConverterRhinoGh\ConverterRhino8\ConverterRhino8.csproj", "{89996067-3233-410A-A6A1-39E2F11F0626}" @@ -438,9 +434,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{5009BB59 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Core.Tests.Unit", "Core\Tests\Speckle.Core.Tests.Unit\Speckle.Core.Tests.Unit.csproj", "{2A88A9EA-EB11-49FD-BE95-DA6FC8F6CB3D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Core.Tests.Performance", "Core\Tests\Speckle.Core.Tests.Performance\Speckle.Core.Tests.Performance.csproj", "{1DE6EF69-0782-4FD7-A2A7-9F697426882D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Core.Tests.Performance", "Core\Tests\Speckle.Core.Tests.Performance\Speckle.Core.Tests.Performance.csproj", "{1DE6EF69-0782-4FD7-A2A7-9F697426882D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Core.Tests.Integration", "Core\Tests\Speckle.Core.Tests.Integration\Speckle.Core.Tests.Integration.csproj", "{FB2DEE1D-788B-45B6-B80C-D8F7C8390C37}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Core.Tests.Integration", "Core\Tests\Speckle.Core.Tests.Integration\Speckle.Core.Tests.Integration.csproj", "{FB2DEE1D-788B-45B6-B80C-D8F7C8390C37}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorGrasshopper8", "ConnectorGrasshopper\ConnectorGrasshopper8\ConnectorGrasshopper8.csproj", "{FDBC3082-1FAD-4701-A121-802F591D2D35}" ProjectSection(ProjectDependencies) = postProject @@ -453,6 +449,26 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{8A909E95 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Objects.Tests.Unit", "Objects\Tests\Objects.Tests.Unit\Objects.Tests.Unit.csproj", "{9E74F0E6-94B4-46BD-B1CA-DD874B459399}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2025", "Objects\Converters\ConverterNavisworks\ConverterNavisworks2025\ConverterNavisworks2025.csproj", "{0B6B5C52-54EC-461F-8729-6244ACA63646}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorNavisworks2025", "ConnectorNavisworks\ConnectorNavisworks2025\ConnectorNavisworks2025.csproj", "{2568500E-F1BC-440E-9150-DD4820B3FAD6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DllConflictManagement", "ConnectorCore\DllConflictManagement\DllConflictManagement.csproj", "{0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RevitSharedResources2025", "ConnectorRevit\RevitSharedResources2025\RevitSharedResources2025.csproj", "{7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorRevit2025", "ConnectorRevit\ConnectorRevit2025\ConnectorRevit2025.csproj", "{D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterRevit2025", "Objects\Converters\ConverterRevit\ConverterRevit2025\ConverterRevit2025.csproj", "{C0295BF9-9A40-4FCD-BE39-E943985CA3F8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorAutocad2025", "ConnectorAutocadCivil\ConnectorAutocad2025\ConnectorAutocad2025.csproj", "{42FE69BF-C821-43E8-8EAE-8F342749EF7A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterAutocad2025", "Objects\Converters\ConverterAutocadCivil\ConverterAutocad2025\ConverterAutocad2025.csproj", "{829688CD-CECE-4F6C-A5A0-032BB39CD9E0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorCivil2025", "ConnectorAutocadCivil\ConnectorCivil2025\ConnectorCivil2025.csproj", "{70DEAA13-6DC8-44A0-B287-9E806A8054F1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterCivil2025", "Objects\Converters\ConverterAutocadCivil\ConverterCivil2025\ConverterCivil2025.csproj", "{F06E4C37-4076-4272-9CA6-FB505E02CD31}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug Mac|Any CPU = Debug Mac|Any CPU @@ -2103,38 +2119,6 @@ Global {A0C9EBE0-A56A-4D07-B6EF-2EEAEC45D6C4}.Release|Any CPU.Build.0 = Release|Any CPU {A0C9EBE0-A56A-4D07-B6EF-2EEAEC45D6C4}.Release|x64.ActiveCfg = Release|Any CPU {A0C9EBE0-A56A-4D07-B6EF-2EEAEC45D6C4}.Release|x64.Build.0 = Release|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Debug Mac|x64.ActiveCfg = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Debug Mac|x64.Build.0 = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Debug|x64.ActiveCfg = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Debug|x64.Build.0 = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Release Mac|Any CPU.ActiveCfg = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Release Mac|Any CPU.Build.0 = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Release Mac|x64.ActiveCfg = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Release Mac|x64.Build.0 = Debug|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Release|Any CPU.Build.0 = Release|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Release|x64.ActiveCfg = Release|Any CPU - {7F0206A9-61D4-4D3A-9B43-789DABA7C143}.Release|x64.Build.0 = Release|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Debug Mac|x64.ActiveCfg = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Debug Mac|x64.Build.0 = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Debug|x64.ActiveCfg = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Debug|x64.Build.0 = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Release Mac|Any CPU.ActiveCfg = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Release Mac|Any CPU.Build.0 = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Release Mac|x64.ActiveCfg = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Release Mac|x64.Build.0 = Debug|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Release|Any CPU.Build.0 = Release|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Release|x64.ActiveCfg = Release|Any CPU - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639}.Release|x64.Build.0 = Release|Any CPU {D22A887D-976C-4DBF-AE5B-9039F169E61C}.Debug Mac|Any CPU.ActiveCfg = Debug Mac|Any CPU {D22A887D-976C-4DBF-AE5B-9039F169E61C}.Debug Mac|x64.ActiveCfg = Debug|Any CPU {D22A887D-976C-4DBF-AE5B-9039F169E61C}.Debug Mac|x64.Build.0 = Debug|Any CPU @@ -2255,6 +2239,166 @@ Global {9E74F0E6-94B4-46BD-B1CA-DD874B459399}.Release|Any CPU.Build.0 = Release|Any CPU {9E74F0E6-94B4-46BD-B1CA-DD874B459399}.Release|x64.ActiveCfg = Release|Any CPU {9E74F0E6-94B4-46BD-B1CA-DD874B459399}.Release|x64.Build.0 = Release|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Debug Mac|x64.Build.0 = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Debug|x64.ActiveCfg = Debug|x64 + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Debug|x64.Build.0 = Debug|x64 + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Release Mac|Any CPU.ActiveCfg = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Release Mac|Any CPU.Build.0 = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Release Mac|x64.ActiveCfg = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Release Mac|x64.Build.0 = Debug|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Release|Any CPU.Build.0 = Release|Any CPU + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Release|x64.ActiveCfg = Release|x64 + {0B6B5C52-54EC-461F-8729-6244ACA63646}.Release|x64.Build.0 = Release|x64 + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug Mac|x64.Build.0 = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug|x64.ActiveCfg = Debug|x64 + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug|x64.Build.0 = Debug|x64 + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release Mac|Any CPU.ActiveCfg = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release Mac|Any CPU.Build.0 = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release Mac|x64.ActiveCfg = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release Mac|x64.Build.0 = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release|Any CPU.Build.0 = Release|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release|x64.ActiveCfg = Release|x64 + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release|x64.Build.0 = Release|x64 + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Debug Mac|x64.Build.0 = Debug|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Debug|x64.ActiveCfg = Debug|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Debug|x64.Build.0 = Debug|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Release Mac|Any CPU.ActiveCfg = Release|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Release Mac|Any CPU.Build.0 = Release|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Release Mac|x64.ActiveCfg = Release|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Release Mac|x64.Build.0 = Release|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Release|Any CPU.Build.0 = Release|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Release|x64.ActiveCfg = Release|Any CPU + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD}.Release|x64.Build.0 = Release|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Debug Mac|x64.Build.0 = Debug|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Debug|x64.ActiveCfg = Debug|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Debug|x64.Build.0 = Debug|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Release Mac|Any CPU.ActiveCfg = Release|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Release Mac|Any CPU.Build.0 = Release|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Release Mac|x64.ActiveCfg = Release|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Release Mac|x64.Build.0 = Release|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Release|Any CPU.Build.0 = Release|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Release|x64.ActiveCfg = Release|Any CPU + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209}.Release|x64.Build.0 = Release|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Debug Mac|x64.Build.0 = Debug|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Debug|x64.ActiveCfg = Debug|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Debug|x64.Build.0 = Debug|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Release Mac|Any CPU.ActiveCfg = Release|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Release Mac|Any CPU.Build.0 = Release|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Release Mac|x64.ActiveCfg = Release|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Release Mac|x64.Build.0 = Release|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Release|Any CPU.Build.0 = Release|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Release|x64.ActiveCfg = Release|Any CPU + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C}.Release|x64.Build.0 = Release|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Debug Mac|x64.Build.0 = Debug|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Debug|x64.Build.0 = Debug|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Release Mac|Any CPU.ActiveCfg = Release|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Release Mac|Any CPU.Build.0 = Release|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Release Mac|x64.ActiveCfg = Release|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Release Mac|x64.Build.0 = Release|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Release|Any CPU.Build.0 = Release|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Release|x64.ActiveCfg = Release|Any CPU + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8}.Release|x64.Build.0 = Release|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Debug Mac|x64.Build.0 = Debug|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Debug|x64.ActiveCfg = Debug|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Debug|x64.Build.0 = Debug|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Release Mac|Any CPU.ActiveCfg = Release|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Release Mac|Any CPU.Build.0 = Release|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Release Mac|x64.ActiveCfg = Release|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Release Mac|x64.Build.0 = Release|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Release|Any CPU.Build.0 = Release|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Release|x64.ActiveCfg = Release|Any CPU + {42FE69BF-C821-43E8-8EAE-8F342749EF7A}.Release|x64.Build.0 = Release|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Debug Mac|x64.Build.0 = Debug|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Debug|x64.Build.0 = Debug|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Release Mac|Any CPU.ActiveCfg = Release|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Release Mac|Any CPU.Build.0 = Release|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Release Mac|x64.ActiveCfg = Release|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Release Mac|x64.Build.0 = Release|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Release|Any CPU.Build.0 = Release|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Release|x64.ActiveCfg = Release|Any CPU + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0}.Release|x64.Build.0 = Release|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Debug Mac|x64.Build.0 = Debug|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Debug|x64.ActiveCfg = Debug|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Debug|x64.Build.0 = Debug|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Release Mac|Any CPU.ActiveCfg = Release|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Release Mac|Any CPU.Build.0 = Release|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Release Mac|x64.ActiveCfg = Release|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Release Mac|x64.Build.0 = Release|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Release|Any CPU.Build.0 = Release|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Release|x64.ActiveCfg = Release|Any CPU + {70DEAA13-6DC8-44A0-B287-9E806A8054F1}.Release|x64.Build.0 = Release|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Debug Mac|Any CPU.ActiveCfg = Debug|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Debug Mac|Any CPU.Build.0 = Debug|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Debug Mac|x64.ActiveCfg = Debug|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Debug Mac|x64.Build.0 = Debug|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Debug|x64.ActiveCfg = Debug|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Debug|x64.Build.0 = Debug|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Release Mac|Any CPU.ActiveCfg = Release|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Release Mac|Any CPU.Build.0 = Release|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Release Mac|x64.ActiveCfg = Release|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Release Mac|x64.Build.0 = Release|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Release|Any CPU.Build.0 = Release|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Release|x64.ActiveCfg = Release|Any CPU + {F06E4C37-4076-4272-9CA6-FB505E02CD31}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2411,8 +2555,6 @@ Global {AF51DD10-C0D5-4209-AF55-8F6476EA8A99} = {F7399C6A-0EA4-4212-A49E-0342BED82F98} {C6FF0E4F-38A3-4464-98E9-AB71D74B06F4} = {F7399C6A-0EA4-4212-A49E-0342BED82F98} {A0C9EBE0-A56A-4D07-B6EF-2EEAEC45D6C4} = {C6FF0E4F-38A3-4464-98E9-AB71D74B06F4} - {7F0206A9-61D4-4D3A-9B43-789DABA7C143} = {DA9DFC36-C53F-4B19-8911-BF7605230BA7} - {2CC777EB-BD63-4FAB-BC3A-68A640D2E639} = {DA9DFC36-C53F-4B19-8911-BF7605230BA7} {D22A887D-976C-4DBF-AE5B-9039F169E61C} = {E94E7327-5A9B-48EE-93CC-E9E9A5B980F1} {89996067-3233-410A-A6A1-39E2F11F0626} = {1FD850CA-A8D7-41DC-9316-B315800437E1} {5009BB59-0F77-4202-8FD2-DECC07E93146} = {8AA78EE8-C33B-4BC5-992A-E5DE7AB0BEC7} @@ -2423,6 +2565,16 @@ Global {15C4FF29-0370-4860-B80A-06CC5E0E8D5F} = {1FD850CA-A8D7-41DC-9316-B315800437E1} {8A909E95-7A39-4B21-A04A-E168478E71F0} = {E3916A0F-68D5-4C84-ACAE-41547F75E454} {9E74F0E6-94B4-46BD-B1CA-DD874B459399} = {8A909E95-7A39-4B21-A04A-E168478E71F0} + {0B6B5C52-54EC-461F-8729-6244ACA63646} = {B6C38DB9-7B20-4B7E-BC90-6A8CAFC16807} + {2568500E-F1BC-440E-9150-DD4820B3FAD6} = {B6887DDC-B9B9-4B00-95DC-1DD930A1E901} + {0D23858F-4CC1-4DCA-9207-5EDB8B6CE9DD} = {DA9DFC36-C53F-4B19-8911-BF7605230BA7} + {7B02BACC-D9B6-4FFE-A450-7ECB5F71F209} = {C73C19B5-72A3-4C63-8D56-0A7E7DB46CA5} + {D607BD0A-9F7F-4C3A-9B9C-FEAD6BA49C7C} = {42A86931-7497-4A34-B2FD-060231CD0A8F} + {C0295BF9-9A40-4FCD-BE39-E943985CA3F8} = {925C0BF6-A0B1-4699-9C4B-078E01D652CC} + {42FE69BF-C821-43E8-8EAE-8F342749EF7A} = {890F3257-FCC2-4ED8-9180-22B3641B494C} + {829688CD-CECE-4F6C-A5A0-032BB39CD9E0} = {BE521908-7944-46F3-98BF-B47D34509934} + {70DEAA13-6DC8-44A0-B287-9E806A8054F1} = {890F3257-FCC2-4ED8-9180-22B3641B494C} + {F06E4C37-4076-4272-9CA6-FB505E02CD31} = {BE521908-7944-46F3-98BF-B47D34509934} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1D43D91B-4F01-4A78-8250-CC6F9BD93A14} @@ -2432,6 +2584,7 @@ Global ConnectorBentley\ConnectorBentleyShared\ConnectorBentleyShared.projitems*{0420d74a-2997-4b92-844b-c3769deaa1ad}*SharedItemsImports = 5 Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{05f993a6-8651-4801-a732-9a30d1472eef}*SharedItemsImports = 5 ConnectorRevit\RevitSharedResources\RevitSharedResources.projitems*{071f914c-f473-4fb2-9faf-98632afb164b}*SharedItemsImports = 13 + Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{0b6b5c52-54ec-461f-8729-6244aca63646}*SharedItemsImports = 5 ConnectorGrasshopper\ConnectorGrasshopperShared\ConnectorGrasshopperShared.projitems*{0f1fd0c3-875f-4689-9c4a-c56e9ab31102}*SharedItemsImports = 13 Objects\Converters\ConverterRevit\ConverterRevitTests\ConverterRevitTestsShared\ConverterRevitTestsShared.projitems*{1085f4b5-fdad-4ff8-b144-dddbd9454f55}*SharedItemsImports = 13 Objects\Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{15c4ff29-0370-4860-b80a-06cc5e0e8d5f}*SharedItemsImports = 5 @@ -2439,6 +2592,7 @@ Global Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{1f21e740-6b05-47bd-8d2a-c9ed5e91c577}*SharedItemsImports = 5 Objects\Converters\ConverterCSI\ConverterCSIShared\ConverterCSIShared.projitems*{21223ba5-c6e8-405d-b581-106c4726edc0}*SharedItemsImports = 5 ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{2568500e-f1bc-440e-9150-db4820b3fad6}*SharedItemsImports = 5 + ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{2568500e-f1bc-440e-9150-dd4820b3fad6}*SharedItemsImports = 5 ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{2639e37d-80d3-415a-b4d1-20d7f321f27f}*SharedItemsImports = 5 Objects\Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{26eca1be-f5b2-4a41-9658-46a4a917bfe6}*SharedItemsImports = 5 ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{27a79aca-7ea8-4406-8bb8-216578cc3ab7}*SharedItemsImports = 5 @@ -2452,6 +2606,7 @@ Global Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{3df12639-78b6-41b3-a046-a675035369be}*SharedItemsImports = 5 ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{3e30d170-3cb4-4728-97d5-887c5019da9b}*SharedItemsImports = 5 Objects\Converters\ConverterBentley\ConverterBentleyShared\ConverterBentleyShared.projitems*{425f0d00-6608-4bd2-a1e0-2730c9f2bfd3}*SharedItemsImports = 13 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{42fe69bf-c821-43e8-8eae-8f342749ef7a}*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 = 5 ConnectorTeklaStructures\ConnectorTeklaStructuresShared\ConnectorTeklaStructuresShared.projitems*{48c44a7a-122f-4a1f-b3ba-613cb432a7bc}*SharedItemsImports = 5 @@ -2475,6 +2630,7 @@ Global ConnectorTeklaStructures\ConnectorTeklaStructuresShared\ConnectorTeklaStructuresShared.projitems*{67157264-aaa5-46a8-a38b-16254b49b892}*SharedItemsImports = 5 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 + ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{70deaa13-6dc8-44a0-b287-9e806a8054f1}*SharedItemsImports = 5 Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{737d5567-7b1f-410d-9b7b-bae8065ed15b}*SharedItemsImports = 5 ConnectorNavisworks\ConnectorNavisworks\ConnectorNavisworks.Shared.projitems*{74e39841-b2fa-494d-ac40-a6e505de6b33}*SharedItemsImports = 5 Objects\Converters\ConverterDynamo\ConverterDynamoShared\ConverterDynamoShared.projitems*{75144587-6f51-46c8-8e40-da652fbc53f4}*SharedItemsImports = 5 @@ -2482,8 +2638,10 @@ Global 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 + ConnectorRevit\RevitSharedResources\RevitSharedResources.projitems*{7b02bacc-d9b6-4ffe-a450-7ecb5f71f209}*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 = 5 + Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{829688cd-cece-4f6c-a5a0-032bb39cd9e0}*SharedItemsImports = 5 Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{8581b4bb-a8bc-4328-99fe-d18615af2554}*SharedItemsImports = 5 ConnectorGrasshopper\ConnectorGrasshopperShared\ConnectorGrasshopperShared.projitems*{86920221-416e-4a66-a601-3418207e2401}*SharedItemsImports = 5 Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{88a24c40-74c8-4e20-9051-6be9e6adecfd}*SharedItemsImports = 5 @@ -2512,6 +2670,7 @@ Global 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 ConnectorGrasshopper\ConnectorGrasshopperShared\ConnectorGrasshopperShared.projitems*{b81e0f77-1abd-4941-9d76-c0dc6b1b6b82}*SharedItemsImports = 5 + Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{c0295bf9-9a40-4fcd-be39-e943985ca3f8}*SharedItemsImports = 5 ConnectorCSI\ConnectorCSIShared\ConnectorCSIShared.projitems*{c091e499-597d-4077-b83f-08e069091090}*SharedItemsImports = 5 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 @@ -2524,6 +2683,7 @@ Global Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{d1d0f986-12be-4fd5-8925-c96b1f86427d}*SharedItemsImports = 5 ConnectorRhino\ConnectorRhino\ConnectorRhinoShared\ConnectorRhinoShared.projitems*{d22a887d-976c-4dbf-ae5b-9039f169e61c}*SharedItemsImports = 5 Objects\Converters\ConverterRevit\ConverterRevitTests\ConverterRevitTestsShared\ConverterRevitTestsShared.projitems*{d296722d-0798-4110-9c6e-dfb0824a7251}*SharedItemsImports = 5 + ConnectorRevit\ConnectorRevit\ConnectorRevit.projitems*{d607bd0a-9f7f-4c3a-9b9c-fead6ba49c7c}*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 @@ -2533,6 +2693,7 @@ Global Objects\Converters\ConverterTeklaStructures\ConverterTeklaStructuresShared\ConverterTeklaStructuresShared.projitems*{eb52e451-9ed8-460e-9ee4-6717bfb12eab}*SharedItemsImports = 5 Objects\Converters\ConverterNavisworks\ConverterNavisworks\ConverterNavisworksShared.projitems*{ec2436db-b7f4-4d78-807b-8d91d7d5165c}*SharedItemsImports = 5 Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{f03af41c-3489-4414-a887-b52d529b5a55}*SharedItemsImports = 5 + Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{f06e4c37-4076-4272-9ca6-fb505e02cd31}*SharedItemsImports = 5 Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{f1311789-37dc-47fd-acec-75b9b97edfed}*SharedItemsImports = 5 Objects\Converters\ConverterBentley\ConverterBentleyShared\ConverterBentleyShared.projitems*{f2146143-c240-4920-a01b-2bd7e076ad11}*SharedItemsImports = 5 ConnectorAutocadCivil\ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{f4aa033f-4f85-4990-afe9-86be00abe973}*SharedItemsImports = 5 diff --git a/Automate/Speckle.Automate.Sdk/AutomationContext.cs b/Automate/Speckle.Automate.Sdk/AutomationContext.cs index 9277158e44..07567a5aa7 100644 --- a/Automate/Speckle.Automate.Sdk/AutomationContext.cs +++ b/Automate/Speckle.Automate.Sdk/AutomationContext.cs @@ -134,6 +134,12 @@ await SpeckleClient } ) .ConfigureAwait(false); + + if (!string.IsNullOrEmpty(versionId)) + { + AutomationResult.ResultVersions.Add(versionId); + } + return versionId; } diff --git a/Automate/Speckle.Automate.Sdk/DataAnnotations/SecretAttribute.cs b/Automate/Speckle.Automate.Sdk/DataAnnotations/SecretAttribute.cs new file mode 100644 index 0000000000..807e002928 --- /dev/null +++ b/Automate/Speckle.Automate.Sdk/DataAnnotations/SecretAttribute.cs @@ -0,0 +1,7 @@ +namespace Speckle.Automate.Sdk.DataAnnotations; + +/// +/// If specified, the given function input will be redacted in all contexts. +/// +[AttributeUsage(AttributeTargets.All)] +public sealed class SecretAttribute : Attribute { } diff --git a/Automate/Speckle.Automate.Sdk/Runner.cs b/Automate/Speckle.Automate.Sdk/Runner.cs index d3b0186adc..8a0d0b6496 100644 --- a/Automate/Speckle.Automate.Sdk/Runner.cs +++ b/Automate/Speckle.Automate.Sdk/Runner.cs @@ -1,8 +1,10 @@ using System.CommandLine; using System.Diagnostics.CodeAnalysis; +using Newtonsoft.Json; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Schema.Generation; using Newtonsoft.Json.Serialization; +using Speckle.Automate.Sdk.DataAnnotations; using Speckle.Automate.Sdk.Schema; using Speckle.Core.Logging; @@ -131,6 +133,7 @@ public static async Task Main(string[] args, Func { JSchemaGenerator generator = new() { ContractResolver = new CamelCasePropertyNamesContractResolver() }; + generator.GenerationProviders.Add(new SpeckleSecretProvider()); JSchema schema = generator.Generate(typeof(TInput)); schema.ToString(global::Newtonsoft.Json.Schema.SchemaVersion.Draft2019_09); File.WriteAllText(schemaFilePath, schema.ToString()); @@ -144,3 +147,34 @@ public static async Task Main(string[] args, Func(); + var isSecretString = attributes.Any(att => att is SecretAttribute); + + if (isSecretString) + { + return CreateSchemaWithWriteOnly(context.ObjectType, context.Required); + } + + return null; + } +#pragma warning restore CS8764 // Nullability of return type doesn't match overridden member (possibly because of nullability attributes). + + + private JSchema CreateSchemaWithWriteOnly(Type type, Required required) + { + JSchemaGenerator generator = new(); + JSchema schema = generator.Generate(type, required != Required.Always); + + schema.WriteOnly = true; + + return schema; + } +} diff --git a/ConnectorAutocadCivil/ConnectorAutocad2025/ConnectorAutocad2025.csproj b/ConnectorAutocadCivil/ConnectorAutocad2025/ConnectorAutocad2025.csproj new file mode 100644 index 0000000000..16d11ac2cd --- /dev/null +++ b/ConnectorAutocadCivil/ConnectorAutocad2025/ConnectorAutocad2025.csproj @@ -0,0 +1,47 @@ + + + Speckle.ConnectorAutocad + SpeckleConnectorAutocad + net8.0-windows + ConnectorAutocad + ConnectorAutocad + Program + $(ProgramW6432)\Autodesk\AutoCAD 2025\acad.exe + true + $(DefineConstants);AUTOCAD2025 + false + true + x64 + win-x64 + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ConnectorAutocadCivil/ConnectorAutocadCivil.sln b/ConnectorAutocadCivil/ConnectorAutocadCivil.sln index e122c2b1bd..eb1c452a38 100644 --- a/ConnectorAutocadCivil/ConnectorAutocadCivil.sln +++ b/ConnectorAutocadCivil/ConnectorAutocadCivil.sln @@ -65,6 +65,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterAdvanceSteel2024", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorAdvanceSteel2024", "ConnectorAdvanceSteel2024\ConnectorAdvanceSteel2024.csproj", "{572B1D77-83BA-4E96-A70A-7D000D2AC220}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConnectorAutocad2025", "ConnectorAutocad2025\ConnectorAutocad2025.csproj", "{6B147D7E-4F94-43EC-A982-340E98B37656}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterAutocad2025", "..\Objects\Converters\ConverterAutocadCivil\ConverterAutocad2025\ConverterAutocad2025.csproj", "{5A4FB6D3-CAC0-43BC-BB4A-BED3845C79DA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -167,6 +171,14 @@ Global {572B1D77-83BA-4E96-A70A-7D000D2AC220}.Debug|Any CPU.Build.0 = Debug|Any CPU {572B1D77-83BA-4E96-A70A-7D000D2AC220}.Release|Any CPU.ActiveCfg = Release|Any CPU {572B1D77-83BA-4E96-A70A-7D000D2AC220}.Release|Any CPU.Build.0 = Release|Any CPU + {6B147D7E-4F94-43EC-A982-340E98B37656}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B147D7E-4F94-43EC-A982-340E98B37656}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B147D7E-4F94-43EC-A982-340E98B37656}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B147D7E-4F94-43EC-A982-340E98B37656}.Release|Any CPU.Build.0 = Release|Any CPU + {5A4FB6D3-CAC0-43BC-BB4A-BED3845C79DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A4FB6D3-CAC0-43BC-BB4A-BED3845C79DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A4FB6D3-CAC0-43BC-BB4A-BED3845C79DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A4FB6D3-CAC0-43BC-BB4A-BED3845C79DA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -196,6 +208,8 @@ Global {23478901-5C29-4D54-A66A-AE9FEA6118C7} = {A07071D5-E197-487D-B543-28639AC3C719} {C7F4DFA0-18FE-4C0B-A9DC-DAD74D5E6E13} = {8AFDB1E6-D3E7-45EA-BCDC-F3554BDDEF1E} {572B1D77-83BA-4E96-A70A-7D000D2AC220} = {A07071D5-E197-487D-B543-28639AC3C719} + {6B147D7E-4F94-43EC-A982-340E98B37656} = {A07071D5-E197-487D-B543-28639AC3C719} + {5A4FB6D3-CAC0-43BC-BB4A-BED3845C79DA} = {8AFDB1E6-D3E7-45EA-BCDC-F3554BDDEF1E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EAFBA51C-7222-435F-8BDF-8C15B27A34C8} @@ -213,6 +227,8 @@ Global ..\Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{575293fb-158c-4f91-abc1-18b60f310b32}*SharedItemsImports = 5 ..\Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{57a28a09-c64e-47f6-b602-b6d58b19f1d5}*SharedItemsImports = 5 ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{58a88f1a-7489-46d2-949d-2fc3f68c8d84}*SharedItemsImports = 5 + ..\Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{5a4fb6d3-cac0-43bc-bb4a-bed3845c79da}*SharedItemsImports = 5 + ConnectorAutocadCivil\ConnectorAutocadCivilShared.projitems*{6b147d7e-4f94-43ec-a982-340e98b37656}*SharedItemsImports = 5 ..\Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{79e41261-3078-4f38-a71e-4b4020cf8f57}*SharedItemsImports = 5 ..\Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{8cfc7609-f640-4683-bf13-fe144d3dc50b}*SharedItemsImports = 5 ..\Objects\Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{9a11c16b-790f-437a-9e04-7e0d3ecdc06b}*SharedItemsImports = 5 diff --git a/ConnectorAutocadCivil/ConnectorAutocadCivil.slnf b/ConnectorAutocadCivil/ConnectorAutocadCivil.slnf index b6dc9fe55a..e645e74cae 100644 --- a/ConnectorAutocadCivil/ConnectorAutocadCivil.slnf +++ b/ConnectorAutocadCivil/ConnectorAutocadCivil.slnf @@ -6,11 +6,13 @@ "ConnectorAutocadCivil\\ConnectorAutocad2022\\ConnectorAutocad2022.csproj", "ConnectorAutocadCivil\\ConnectorAutocad2023\\ConnectorAutocad2023.csproj", "ConnectorAutocadCivil\\ConnectorAutocad2024\\ConnectorAutocad2024.csproj", + "ConnectorAutocadCivil\\ConnectorAutocad2025\\ConnectorAutocad2025.csproj", "ConnectorAutocadCivil\\ConnectorAutocadCivil\\ConnectorAutocadCivilShared.shproj", "ConnectorAutocadCivil\\ConnectorCivil2021\\ConnectorCivil2021.csproj", "ConnectorAutocadCivil\\ConnectorCivil2022\\ConnectorCivil2022.csproj", "ConnectorAutocadCivil\\ConnectorCivil2023\\ConnectorCivil2023.csproj", "ConnectorAutocadCivil\\ConnectorCivil2024\\ConnectorCivil2024.csproj", + "ConnectorAutocadCivil\\ConnectorCivil2025\\ConnectorCivil2025.csproj", "Core\\Core\\Core.csproj", "Core\\Tests\\Speckle.Core.Tests.Unit\\Speckle.Core.Tests.Unit.csproj", "Core\\Transports\\DiskTransport\\DiskTransport.csproj", @@ -20,11 +22,13 @@ "Objects\\Converters\\ConverterAutocadCivil\\ConverterAutocad2022\\ConverterAutocad2022.csproj", "Objects\\Converters\\ConverterAutocadCivil\\ConverterAutocad2023\\ConverterAutocad2023.csproj", "Objects\\Converters\\ConverterAutocadCivil\\ConverterAutocad2024\\ConverterAutocad2024.csproj", + "Objects\\Converters\\ConverterAutocadCivil\\ConverterAutocad2025\\ConverterAutocad2025.csproj", "Objects\\Converters\\ConverterAutocadCivil\\ConverterAutocadCivilShared\\ConverterAutocadCivilShared.shproj", "Objects\\Converters\\ConverterAutocadCivil\\ConverterCivil2021\\ConverterCivil2021.csproj", "Objects\\Converters\\ConverterAutocadCivil\\ConverterCivil2022\\ConverterCivil2022.csproj", "Objects\\Converters\\ConverterAutocadCivil\\ConverterCivil2023\\ConverterCivil2023.csproj", "Objects\\Converters\\ConverterAutocadCivil\\ConverterCivil2024\\ConverterCivil2024.csproj", + "Objects\\Converters\\ConverterAutocadCivil\\ConverterCivil2025\\ConverterCivil2025.csproj", "Objects\\Objects\\Objects.csproj", "Objects\\Tests\\Objects.Tests.Unit\\Objects.Tests.Unit.csproj" ] diff --git a/ConnectorAutocadCivil/ConnectorAutocadCivil/UI/ConnectorBindingsAutocadCivil.Receive.cs b/ConnectorAutocadCivil/ConnectorAutocadCivil/UI/ConnectorBindingsAutocadCivil.Receive.cs index 41bab7b772..dddcd877d2 100644 --- a/ConnectorAutocadCivil/ConnectorAutocadCivil/UI/ConnectorBindingsAutocadCivil.Receive.cs +++ b/ConnectorAutocadCivil/ConnectorAutocadCivil/UI/ConnectorBindingsAutocadCivil.Receive.cs @@ -544,7 +544,7 @@ and not ApplicationObject.State.Updated } // add property sets if this is Civil3D -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL if (obj["propertySets"] is IReadOnlyList list) { List> propertySets = new(); diff --git a/ConnectorAutocadCivil/ConnectorAutocadCivil/UI/ConnectorBindingsAutocadCivil.Send.cs b/ConnectorAutocadCivil/ConnectorAutocadCivil/UI/ConnectorBindingsAutocadCivil.Send.cs index 2c65993377..2c96f1eacd 100644 --- a/ConnectorAutocadCivil/ConnectorAutocadCivil/UI/ConnectorBindingsAutocadCivil.Send.cs +++ b/ConnectorAutocadCivil/ConnectorAutocadCivil/UI/ConnectorBindingsAutocadCivil.Send.cs @@ -244,7 +244,7 @@ ref int convertedCount converted[key] = obj.ExtensionDictionary.GetUserString(key); */ -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL // add property sets if this is Civil3D var propertySets = obj.GetPropertySets(tr); if (propertySets.Count > 0) diff --git a/ConnectorAutocadCivil/ConnectorAutocadCivil/Utils.cs b/ConnectorAutocadCivil/ConnectorAutocadCivil/Utils.cs index a4965491a4..eed231d48f 100644 --- a/ConnectorAutocadCivil/ConnectorAutocadCivil/Utils.cs +++ b/ConnectorAutocadCivil/ConnectorAutocadCivil/Utils.cs @@ -14,7 +14,7 @@ using Speckle.ConnectorAutocadCivil.DocumentUtils; using Speckle.Core.Logging; -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL using Autodesk.Aec.ApplicationServices; using Autodesk.Aec.PropertyData.DatabaseServices; #endif @@ -47,6 +47,10 @@ public static class Utils public static string VersionedAppName = HostApplications.AutoCAD.GetVersion(HostAppVersion.v2024); public static string AppName = HostApplications.AutoCAD.Name; public static string Slug = HostApplications.AutoCAD.Slug; +#elif AUTOCAD2025 + public static string VersionedAppName = HostApplications.AutoCAD.GetVersion(HostAppVersion.v2025); + public static string AppName = HostApplications.AutoCAD.Name; + public static string Slug = HostApplications.AutoCAD.Slug; #elif CIVIL2021 public static string VersionedAppName = HostApplications.Civil.GetVersion(HostAppVersion.v2021); public static string AppName = HostApplications.Civil.Name; @@ -63,6 +67,10 @@ public static class Utils public static string VersionedAppName = HostApplications.Civil.GetVersion(HostAppVersion.v2024); public static string AppName = HostApplications.Civil.Name; public static string Slug = HostApplications.Civil.Slug; +#elif CIVIL2025 + public static string VersionedAppName = HostApplications.Civil.GetVersion(HostAppVersion.v2025); + public static string AppName = HostApplications.Civil.Name; + public static string Slug = HostApplications.Civil.Slug; #elif ADVANCESTEEL2023 public static string VersionedAppName = HostApplications.AdvanceSteel.GetVersion(HostAppVersion.v2023); public static string AppName = HostApplications.AdvanceSteel.Name; @@ -307,7 +315,7 @@ public static bool GetOrMakeLayer(this Document doc, string layerName, Transacti #endregion #region property sets -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL private static Autodesk.Aec.PropertyData.DataType? GetPropertySetType(object prop) { switch (prop) @@ -765,7 +773,7 @@ public static string GetUnits(Document doc) var insUnits = doc.Database.Insunits; string units = (insUnits == UnitsValue.Undefined) ? Units.None : Units.GetUnitsFromString(insUnits.ToString()); -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL if (units == Units.None) { // try to get the drawing unit instead diff --git a/ConnectorAutocadCivil/ConnectorCivil2021/ConnectorCivil2021.csproj b/ConnectorAutocadCivil/ConnectorCivil2021/ConnectorCivil2021.csproj index d53e435fde..8743f7deb1 100644 --- a/ConnectorAutocadCivil/ConnectorCivil2021/ConnectorCivil2021.csproj +++ b/ConnectorAutocadCivil/ConnectorCivil2021/ConnectorCivil2021.csproj @@ -12,7 +12,7 @@ x64 ConnectorCivil2021 ConnectorCivil2021 - $(DefineConstants);CIVIL2021 + $(DefineConstants);CIVIL2021;CIVIL;CIVIL2021_OR_GREATER false diff --git a/ConnectorAutocadCivil/ConnectorCivil2022/ConnectorCivil2022.csproj b/ConnectorAutocadCivil/ConnectorCivil2022/ConnectorCivil2022.csproj index dbcb1f3afc..75e84ec5d4 100644 --- a/ConnectorAutocadCivil/ConnectorCivil2022/ConnectorCivil2022.csproj +++ b/ConnectorAutocadCivil/ConnectorCivil2022/ConnectorCivil2022.csproj @@ -12,7 +12,7 @@ x64 ConnectorCivil2022 ConnectorCivil2022 - $(DefineConstants);CIVIL2022 + $(DefineConstants);CIVIL2022;CIVIL;CIVIL2021_OR_GREATER;CIVIL2022_OR_GREATER false diff --git a/ConnectorAutocadCivil/ConnectorCivil2023/ConnectorCivil2023.csproj b/ConnectorAutocadCivil/ConnectorCivil2023/ConnectorCivil2023.csproj index 601d524f7c..4d80155046 100644 --- a/ConnectorAutocadCivil/ConnectorCivil2023/ConnectorCivil2023.csproj +++ b/ConnectorAutocadCivil/ConnectorCivil2023/ConnectorCivil2023.csproj @@ -12,7 +12,7 @@ x64 ConnectorCivil2023 ConnectorCivil2023 - $(DefineConstants);CIVIL2023 + $(DefineConstants);CIVIL2023;CIVIL;CIVIL2021_OR_GREATER;CIVIL2022_OR_GREATER;CIVIL2023_OR_GREATER false diff --git a/ConnectorAutocadCivil/ConnectorCivil2024/ConnectorCivil2024.csproj b/ConnectorAutocadCivil/ConnectorCivil2024/ConnectorCivil2024.csproj index 9bf7914a30..f6db7a0e1c 100644 --- a/ConnectorAutocadCivil/ConnectorCivil2024/ConnectorCivil2024.csproj +++ b/ConnectorAutocadCivil/ConnectorCivil2024/ConnectorCivil2024.csproj @@ -12,7 +12,7 @@ x64 ConnectorCivil2024 ConnectorCivil2024 - $(DefineConstants);CIVIL2024 + $(DefineConstants);CIVIL2024;CIVIL;CIVIL2021_OR_GREATER;CIVIL2022_OR_GREATER;CIVIL2023_OR_GREATER;CIVIL2024_OR_GREATER false diff --git a/ConnectorAutocadCivil/ConnectorCivil2025/ConnectorCivil2025.csproj b/ConnectorAutocadCivil/ConnectorCivil2025/ConnectorCivil2025.csproj new file mode 100644 index 0000000000..774d948d0e --- /dev/null +++ b/ConnectorAutocadCivil/ConnectorCivil2025/ConnectorCivil2025.csproj @@ -0,0 +1,52 @@ + + + + net8.0-windows + enable + + Speckle.ConnectorCivil + SpeckleConnectorCivil + Program + $(ProgramW6432)\Autodesk\AutoCAD 2025\acad.exe + + /ld "C:\Program Files\Autodesk\AutoCAD 2025\\AecBase.dbx" /product "C3D" /language + "en-US" + + + ConnectorCivil2025 + ConnectorCivil2025 + $(DefineConstants);CIVIL2025;CIVIL;CIVIL2021_OR_GREATER;CIVIL2022_OR_GREATER;CIVIL2023_OR_GREATER;CIVIL2024_OR_GREATER;CIVIL2025_OR_GREATER + false + true + x64 + win-x64 + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ConnectorCore/BatchUploader.OperationDriver/BatchUploadOperationDriver.cs b/ConnectorCore/BatchUploader.OperationDriver/BatchUploadOperationDriver.cs deleted file mode 100644 index ae1335ef2d..0000000000 --- a/ConnectorCore/BatchUploader.OperationDriver/BatchUploadOperationDriver.cs +++ /dev/null @@ -1,136 +0,0 @@ -using DesktopUI2; -using DesktopUI2.Models; -using DesktopUI2.Models.Filters; -using DesktopUI2.ViewModels; -using Speckle.BatchUploader.Sdk; -using Speckle.BatchUploader.Sdk.CommunicationModels; -using Speckle.BatchUploader.Sdk.Interfaces; -using Speckle.Core.Api; -using Speckle.Core.Credentials; -using Speckle.Core.Logging; - -namespace Speckle.BatchUploader.OperationDriver; - -/// -/// Connector implementation of a BatchUploader client -/// -/// -/// Only processes started by the batch uploader will start executing jobs -/// -public sealed class BatchUploadOperationDriver -{ - private readonly BatchUploaderClient _client; - private readonly IApplicationFunctionalityController _applicationController; - private readonly ConnectorBindings _connectorBindings; - private int _jobCounter; - - public BatchUploadOperationDriver( - BatchUploaderClient client, - IApplicationFunctionalityController applicationController, - ConnectorBindings connectorBindings - ) - { - _client = client; - _applicationController = applicationController; - _connectorBindings = connectorBindings; - } - - /// - /// Queries local BatchUploader service for any jobs for this application process - /// and starts executing them. Application will terminate once all jobs are complete. - /// - public async Task ProcessAllJobs() - { - while (await GetNextJobId().ConfigureAwait(false) is { } jobId) - { - // currently using this counter to determine whether this process was started by the batch uploader - // and needs to be closed by the batch uploader. Not the most robust system, I'd imagine. - _jobCounter++; - try - { - await ProcessJob(jobId).ConfigureAwait(false); - await _client.UpdateJobStatus(jobId, JobStatus.Completed).ConfigureAwait(false); - //TODO: Finish endpoint with result details. - Console.WriteLine("Finished"); - } - catch (Exception ex) - { - Console.WriteLine(ex); - //TODO: Finish endpoint with ex details - await _client.UpdateJobStatus(jobId, JobStatus.Failed).ConfigureAwait(false); - throw; - } - } - - if (_jobCounter > 0) - { - Environment.Exit(0); - } - } - - private async Task ProcessJob(Guid jobId) - { - await _client.UpdateJobStatus(jobId, JobStatus.Processing).ConfigureAwait(false); - var jobDescription = await _client.GetJobDescription(jobId).ConfigureAwait(false); - await _applicationController.OpenDocument(jobDescription.FilePath).ConfigureAwait(false); - - Account defaultAccount = AccountManager.GetDefaultAccount() ?? throw new SpeckleException("No default account"); - - var state = new StreamState() - { - Client = new Client(defaultAccount), - BranchName = jobDescription.Branch, - StreamId = jobDescription.Stream, - Filter = new AllSelectionFilter - { - Slug = "all", - Name = "Everything", - Icon = "CubeScan", - Description = "Selects all document objects and project information." - }, - }; - ProgressViewModel progress = new(); - AddProgressListener(jobId, progress); - await _connectorBindings.SendStream(state, progress).ConfigureAwait(false); - } - - private void AddProgressListener(Guid jobId, ProgressViewModel viewModel) - { - viewModel.PropertyChanged += (_, p) => - { - if (p.PropertyName is not (nameof(ProgressViewModel.Value) or nameof(ProgressViewModel.Max))) - { - return; - } - - Task.Run(() => OnProgressUpdate(jobId, viewModel)); - }; - } - - private async Task OnProgressUpdate(Guid jobId, ProgressViewModel viewModel) - { - //Check for cancel - var status = await _client.GetJobStatus(jobId).ConfigureAwait(false); - if (status is JobStatus.Cancelled or JobStatus.Failed) - { - viewModel.CancellationTokenSource.Cancel(); - } - - //Update Progress - JobProgress newProgress = new((long)viewModel.Value, (long)viewModel.Max); - await _client.UpdateJobProgress(jobId, newProgress).ConfigureAwait(false); - } - - private async Task GetNextJobId() - { - try - { - return await _client.GetJob().ConfigureAwait(false); - } - catch (HttpRequestException ex) - { - Console.WriteLine(ex); - return null; - } - } -} diff --git a/ConnectorCore/BatchUploader.Sdk/BatchUploader.Sdk.csproj b/ConnectorCore/BatchUploader.Sdk/BatchUploader.Sdk.csproj deleted file mode 100644 index 8ac8087f32..0000000000 --- a/ConnectorCore/BatchUploader.Sdk/BatchUploader.Sdk.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - netstandard2.0 - enable - enable - 10 - Speckle.BatchUploader.Sdk - true - Speckle.BatchUploader.Sdk - Speckle.BatchUploader.Sdk - SDK for connector batch uploader - $(PackageTags) revit uploader batch - true - - - - true - - - - - - - diff --git a/ConnectorCore/BatchUploader.Sdk/BatchUploaderClient.cs b/ConnectorCore/BatchUploader.Sdk/BatchUploaderClient.cs deleted file mode 100644 index d85845b1b6..0000000000 --- a/ConnectorCore/BatchUploader.Sdk/BatchUploaderClient.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System.Text; -using System.Text.Json; -using Speckle.BatchUploader.Sdk.CommunicationModels; - -[assembly: CLSCompliant(true)] - -namespace Speckle.BatchUploader.Sdk; - -public sealed class BatchUploaderClient : IDisposable -{ - private readonly Uri _serverUri; - private readonly HttpClient _httpClient; - - public BatchUploaderClient(Uri serverUri) - { - _serverUri = serverUri; - - using var p = System.Diagnostics.Process.GetCurrentProcess(); - _httpClient = new HttpClient(); - _httpClient.DefaultRequestHeaders.Add("pid", p.Id.ToString()); - } - - public async Task AddJob( - JobDescription description, - string versionedHostAppName, - CancellationToken cancellationToken = default - ) - { - using var requestMessage = new HttpRequestMessage( - HttpMethod.Post, - _serverUri + $"api/v1/Jobs?&versionedHostAppName={versionedHostAppName}" - ); - requestMessage.Content = SerializeBody(description); - using var response = await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); - return await JsonSerializer - .DeserializeAsync(stream, cancellationToken: cancellationToken) - .ConfigureAwait(false); - } - - public async Task RegisterProcessor(string versionedHostAppName, CancellationToken cancellationToken = default) - { - using var requestMessage = new HttpRequestMessage( - HttpMethod.Post, - _serverUri + $"api/v1/Jobs/Processors?&versionedHostAppName={versionedHostAppName}" - ); - using var response = await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - } - - public async Task GetJob(CancellationToken cancellationToken = default) - { - using var requestMessage = new HttpRequestMessage(HttpMethod.Get, _serverUri + $"api/v1/Jobs"); - using var response = await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); - return await JsonSerializer - .DeserializeAsync(stream, cancellationToken: cancellationToken) - .ConfigureAwait(false); - } - - public async Task GetJobDescription(Guid jobId, CancellationToken cancellationToken = default) - { - using var requestMessage = new HttpRequestMessage(HttpMethod.Get, _serverUri + $"api/v1/Jobs/{jobId}/description"); - using var response = await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); - return await JsonSerializer - .DeserializeAsync(stream, cancellationToken: cancellationToken) - .ConfigureAwait(false); - } - - public async Task GetJobStatus(Guid jobId, CancellationToken cancellationToken = default) - { - using var requestMessage = new HttpRequestMessage(HttpMethod.Get, _serverUri + $"api/v1/Jobs/{jobId}/status"); - using var response = await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); - return await JsonSerializer - .DeserializeAsync(stream, cancellationToken: cancellationToken) - .ConfigureAwait(false); - } - - public async Task UpdateJobStatus(Guid jobId, JobStatus newStatus, CancellationToken cancellationToken = default) - { - using var requestMessage = new HttpRequestMessage(HttpMethod.Put, _serverUri + $"api/v1/Jobs/{jobId}/status"); - requestMessage.Content = SerializeBody(newStatus); - using var response = await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - } - - public async Task UpdateJobProgress(Guid jobId, JobProgress newStatus, CancellationToken cancellationToken = default) - { - using var requestMessage = new HttpRequestMessage(HttpMethod.Put, _serverUri + $"api/v1/Jobs/{jobId}/progress"); - requestMessage.Content = SerializeBody(newStatus); - using var response = await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - } - - private static StringContent SerializeBody(T value) - { - return new StringContent(JsonSerializer.Serialize(value), Encoding.UTF8, "application/json"); - } - - public void Dispose() - { - _httpClient.Dispose(); - } -} diff --git a/ConnectorCore/BatchUploader.Sdk/CommunicationModels/Models.cs b/ConnectorCore/BatchUploader.Sdk/CommunicationModels/Models.cs deleted file mode 100644 index 23f71e8931..0000000000 --- a/ConnectorCore/BatchUploader.Sdk/CommunicationModels/Models.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Text.Json.Serialization; - -namespace Speckle.BatchUploader.Sdk.CommunicationModels; - -public enum JobStatus -{ - None = default, - - /// Waiting for a processor - Queued, - - /// Job is assigned to a processor - Assigned, - - /// Processor has started processing Job - Processing, - - /// User has canceled Job - Cancelled, - - /// Processor failed to complete Job - Failed, - - /// Processor successfully completed job - Completed, -} - -public readonly struct JobProgress -{ - public long Progress { get; } - public long Max { get; } - - [JsonIgnore] - public double ProgressFraction => (double)Progress / Max; - - [JsonConstructor] - public JobProgress(long progress, long max) - { - Progress = progress; - Max = max; - } -} - -public readonly struct JobDescription -{ - public string FilePath { get; } - public string Stream { get; } - public string Branch { get; } - public string CommitMessage { get; } - - [JsonConstructor] - public JobDescription(string filePath, string stream, string branch, string commitMessage) - { - FilePath = filePath; - Stream = stream; - Branch = branch; - CommitMessage = commitMessage; - } -} diff --git a/ConnectorCore/BatchUploader.Sdk/Interfaces/IApplicationFunctionalityController.cs b/ConnectorCore/BatchUploader.Sdk/Interfaces/IApplicationFunctionalityController.cs deleted file mode 100644 index 3700cd54eb..0000000000 --- a/ConnectorCore/BatchUploader.Sdk/Interfaces/IApplicationFunctionalityController.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Speckle.BatchUploader.Sdk.Interfaces; - -public interface IApplicationFunctionalityController -{ - public Task OpenDocument(string path); -} diff --git a/ConnectorCore/DllConflictManagement/Analytics/AnalyticsWithoutDependencies.cs b/ConnectorCore/DllConflictManagement/Analytics/AnalyticsWithoutDependencies.cs new file mode 100644 index 0000000000..83eafc6ee6 --- /dev/null +++ b/ConnectorCore/DllConflictManagement/Analytics/AnalyticsWithoutDependencies.cs @@ -0,0 +1,163 @@ +using System.Diagnostics; +using System.Net.Http.Headers; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; +using System.Web; +using Speckle.DllConflictManagement.EventEmitter; +using Speckle.DllConflictManagement.Serialization; + +namespace Speckle.DllConflictManagement.Analytics; + +/// +/// A version of the Analytics class in Core that doesn't have any dependencies. This class will load and subscribe +/// to the eventEmitter's Action event, but will hopefully get unsubscribed and replaced by the full version in Core +/// +public sealed class AnalyticsWithoutDependencies +{ + private const string MIXPANEL_TOKEN = "acd87c5a50b56df91a795e999812a3a4"; + private const string MIXPANEL_SERVER = "https://analytics.speckle.systems"; + private readonly ISerializer _serializer; + private readonly string _hostApplication; + private readonly string _hostApplicationVersion; + private readonly DllConflictEventEmitter _eventEmitter; + + public AnalyticsWithoutDependencies( + DllConflictEventEmitter eventEmitter, + ISerializer serializer, + string hostApplication, + string hostApplicationVersion + ) + { + _eventEmitter = eventEmitter; + _serializer = serializer; + _hostApplication = hostApplication; + _hostApplicationVersion = hostApplicationVersion; + } + + /// + /// when the DEBUG pre-processor directive is , otherwise + /// + /// This must be kept as a computed property, not a compile time const + internal static bool IsReleaseMode => +#if DEBUG + false; +#else + true; +#endif + + /// + /// Tracks an event without specifying the email and server. + /// It's not always possible to know which account the user has selected, especially in visual programming. + /// Therefore we are caching the email and server values so that they can be used also when nodes such as "Serialize" are used. + /// If no account info is cached, we use the default account data. + /// + /// Name of the even + /// Additional parameters to pass in to event + /// True if it's an action performed by a logged user + public void TrackEvent(Events eventName, Dictionary? customProperties = null, bool isAction = true) + { + Task.Run(async () => await TrackEventAsync(eventName, customProperties, isAction).ConfigureAwait(false)); + } + + /// + /// Tracks an event from a specified email and server, anonymizes personal information + /// + /// Name of the event + /// Additional parameters to pass to the event + /// True if it's an action performed by a logged user + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Design", + "CA1031:Do not catch general exception types", + Justification = "Catching all exceptions to avoid an unobserved exception that could crash the host app" + )] + private async Task TrackEventAsync( + Events eventName, + Dictionary? customProperties = null, + bool isAction = true + ) + { + if (!IsReleaseMode) + { + //only track in prod + return; + } + + try + { + var executingAssembly = Assembly.GetExecutingAssembly(); + var properties = new Dictionary + { + { "distinct_id", "undefined" }, + { "server_id", "no-account-server" }, + { "token", MIXPANEL_TOKEN }, + { "hostApp", _hostApplication }, + { "hostAppVersion", _hostApplicationVersion }, + { + "core_version", + FileVersionInfo.GetVersionInfo(executingAssembly.Location).ProductVersion + ?? executingAssembly.GetName().Version.ToString() + }, + { "$os", GetOs() } + }; + + if (isAction) + { + properties.Add("type", "action"); + } + + if (customProperties != null) + { + foreach (KeyValuePair customProp in customProperties) + { + properties[customProp.Key] = customProp.Value; + } + } + + string json = _serializer.Serialize(new { @event = eventName.ToString(), properties }); + + var query = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("data=" + HttpUtility.UrlEncode(json)))); + + using HttpClient client = new(); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain")); + query.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + var res = await client.PostAsync(MIXPANEL_SERVER + "/track?ip=1", query).ConfigureAwait(false); + res.EnsureSuccessStatusCode(); + } + catch (Exception ex) + { + _eventEmitter.EmitError( + new LoggingEventArgs( + $"An exception was thrown in class {nameof(AnalyticsWithoutDependencies)} while attempting to record analytics", + ex + ) + ); + } + } + + public void TrackEvent(object sender, ActionEventArgs args) + { + _ = Enum.TryParse(args.EventName, out Analytics.Events eventName); + TrackEvent(eventName, args.EventProperties); + } + + private static string GetOs() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return "Windows"; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return "Mac OS X"; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return "Linux"; + } + + return "Unknown"; + } +} diff --git a/ConnectorCore/DllConflictManagement/Analytics/Events.cs b/ConnectorCore/DllConflictManagement/Analytics/Events.cs new file mode 100644 index 0000000000..572826f39a --- /dev/null +++ b/ConnectorCore/DllConflictManagement/Analytics/Events.cs @@ -0,0 +1,47 @@ +namespace Speckle.DllConflictManagement.Analytics; + +/// +/// Default Mixpanel events +/// +public enum Events +{ + /// + /// Event triggered when data is sent to a Speckle Server + /// + Send, + + /// + /// Event triggered when data is received from a Speckle Server + /// + Receive, + + /// + /// Event triggered when a node is executed in a visual programming environment, it should contain the name of the action and the host application + /// + NodeRun, + + /// + /// Event triggered when an action is executed in Desktop UI, it should contain the name of the action and the host application + /// + DUIAction, + + /// + /// Event triggered when a node is first created in a visual programming environment, it should contain the name of the action and the host application + /// + NodeCreate, + + /// + /// Event triggered when the import/export alert is launched or closed + /// + ImportExportAlert, + + /// + /// Event triggered when the connector is registered + /// + Registered, + + /// + /// Event triggered by the Mapping Tool + /// + MappingsAction +} diff --git a/ConnectorCore/DllConflictManagement/AssemblyConflictInfo.cs b/ConnectorCore/DllConflictManagement/AssemblyConflictInfo.cs new file mode 100644 index 0000000000..c7f281fa2e --- /dev/null +++ b/ConnectorCore/DllConflictManagement/AssemblyConflictInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Text; + +namespace Speckle.DllConflictManagement; + +public sealed class AssemblyConflictInfo +{ + public AssemblyConflictInfo(AssemblyName speckleDependencyAssemblyName, Assembly conflictingAssembly) + { + SpeckleDependencyAssemblyName = speckleDependencyAssemblyName; + ConflictingAssembly = conflictingAssembly; + } + + public AssemblyName SpeckleDependencyAssemblyName { get; set; } + public Assembly ConflictingAssembly { get; set; } + + public string GetConflictingExternalAppName() => + new DirectoryInfo(Path.GetDirectoryName(ConflictingAssembly.Location)).Name; + + public override string ToString() + { + StringBuilder sb = new(); + sb.AppendLine($"Conflict DLL: {SpeckleDependencyAssemblyName.Name}"); + sb.AppendLine($"SpeckleVer: {SpeckleDependencyAssemblyName.Version}"); + sb.AppendLine($"LoadedVer: {ConflictingAssembly.GetName().Version}"); + sb.AppendLine($"Folder: {GetConflictingExternalAppName()}"); + return sb.ToString(); + } +} diff --git a/ConnectorCore/DllConflictManagement/AssemblyConflictInfoDto.cs b/ConnectorCore/DllConflictManagement/AssemblyConflictInfoDto.cs new file mode 100644 index 0000000000..2ad8bcc62e --- /dev/null +++ b/ConnectorCore/DllConflictManagement/AssemblyConflictInfoDto.cs @@ -0,0 +1,67 @@ +using System.Reflection; + +namespace Speckle.DllConflictManagement; + +/// +/// Some system object types (System.Type, System.Reflection.AssemblyName, System.Reflection.Assembly) were throwing +/// when I was attempting to serialize the objects to be sent to mixpanel. +/// Therefore I made this DTO to make an object that would hold the info we need and would be serializable. +/// +public sealed class AssemblyConflictInfoDto +{ + public AssemblyConflictInfoDto( + AssemblyName speckleDependencyAssemblyName, + AssemblyName conflictingAssembly, + string folderName, + string fullPath + ) + { + ConflictingAssemblyName = conflictingAssembly.Name; + ConflictingAssemblyVersion = conflictingAssembly.Version.ToString(); + SpeckleExpectedVersion = speckleDependencyAssemblyName.Version.ToString(); + FolderName = folderName; + Path = fullPath; + } + + public string SpeckleExpectedVersion { get; } + public string ConflictingAssemblyName { get; } + public string ConflictingAssemblyVersion { get; } + public string FolderName { get; } + public string Path { get; } +} + +public static class AssemblyConflictInfoExtensions +{ + public static AssemblyConflictInfoDto ToDto(this AssemblyConflictInfo assemblyConflictInfo) + { + return new( + assemblyConflictInfo.SpeckleDependencyAssemblyName, + assemblyConflictInfo.ConflictingAssembly.GetName(), + assemblyConflictInfo.GetConflictingExternalAppName(), + GetPathFromAutodeskOrFullPath(assemblyConflictInfo.ConflictingAssembly.Location) + ); + } + + public static IEnumerable ToDtos( + this IEnumerable assemblyConflictInfos + ) + { + foreach (var assemblyConflictInfo in assemblyConflictInfos) + { + yield return assemblyConflictInfo.ToDto(); + } + } + + private static readonly string[] s_separator = new[] { "Autodesk" }; + + private static string GetPathFromAutodeskOrFullPath(string fullPath) + { + string[] splitOnAutodesk = fullPath.Split(s_separator, StringSplitOptions.None); + + if (splitOnAutodesk.Length == 2) + { + return splitOnAutodesk[1]; + } + return fullPath; + } +} diff --git a/ConnectorCore/DllConflictManagement/ConflictManagementOptions/DllConflictManagmentOptions.cs b/ConnectorCore/DllConflictManagement/ConflictManagementOptions/DllConflictManagmentOptions.cs new file mode 100644 index 0000000000..0baf7ddd58 --- /dev/null +++ b/ConnectorCore/DllConflictManagement/ConflictManagementOptions/DllConflictManagmentOptions.cs @@ -0,0 +1,11 @@ +namespace Speckle.DllConflictManagement.ConflictManagementOptions; + +public sealed class DllConflictManagmentOptions +{ + public HashSet DllsToIgnore { get; private set; } + + public DllConflictManagmentOptions(HashSet dllsToIgnore) + { + DllsToIgnore = dllsToIgnore; + } +} diff --git a/ConnectorCore/DllConflictManagement/ConflictManagementOptions/DllConflictManagmentOptionsLoader.cs b/ConnectorCore/DllConflictManagement/ConflictManagementOptions/DllConflictManagmentOptionsLoader.cs new file mode 100644 index 0000000000..0ea03e97d5 --- /dev/null +++ b/ConnectorCore/DllConflictManagement/ConflictManagementOptions/DllConflictManagmentOptionsLoader.cs @@ -0,0 +1,51 @@ +using Speckle.DllConflictManagement.Serialization; + +namespace Speckle.DllConflictManagement.ConflictManagementOptions; + +public sealed class DllConflictManagmentOptionsLoader +{ + private readonly ISerializer _serializer; + private readonly string _filePath; + private readonly string _fileName; + + public DllConflictManagmentOptionsLoader(ISerializer serializer, string hostAppName, string hostAppVersion) + { + _serializer = serializer; + _filePath = Path.Combine(GetAppDataFolder(), "Speckle", "DllConflictManagement"); + _fileName = $"DllConflictManagmentOptions-{hostAppName}{hostAppVersion}.json"; + } + + private string FullPath => Path.Combine(_filePath, _fileName); + + public DllConflictManagmentOptions LoadOptions() + { + if (!File.Exists(FullPath)) + { + Directory.CreateDirectory(_filePath); + var defaultOptions = new DllConflictManagmentOptions(new HashSet()); + SaveOptions(defaultOptions); + return defaultOptions; + } + + string jsonString = File.ReadAllText(FullPath); + return _serializer.Deserialize(jsonString)!; + } + + public void SaveOptions(DllConflictManagmentOptions options) + { + var json = _serializer.Serialize(options); + File.WriteAllText(FullPath, json); + } + + private string GetAppDataFolder() + { + return Environment.GetFolderPath( + Environment.SpecialFolder.ApplicationData, + // if the folder doesn't exist, we get back an empty string on OSX, + // which in turn, breaks other stuff down the line. + // passing in the Create option ensures that this directory exists, + // which is not a given on all OS-es. + Environment.SpecialFolderOption.Create + ); + } +} diff --git a/ConnectorCore/BatchUploader.OperationDriver/BatchUploader.OperationDriver.csproj b/ConnectorCore/DllConflictManagement/DllConflictManagement.csproj similarity index 52% rename from ConnectorCore/BatchUploader.OperationDriver/BatchUploader.OperationDriver.csproj rename to ConnectorCore/DllConflictManagement/DllConflictManagement.csproj index 80c9a82419..658cf470c9 100644 --- a/ConnectorCore/BatchUploader.OperationDriver/BatchUploader.OperationDriver.csproj +++ b/ConnectorCore/DllConflictManagement/DllConflictManagement.csproj @@ -1,20 +1,19 @@ - + netstandard2.0 enable enable - 10 - Speckle.BatchUploader.OperationDriver + Speckle.DllConflictManagement + false true - + - - + - + diff --git a/ConnectorCore/DllConflictManagement/DllConflictManager.cs b/ConnectorCore/DllConflictManagement/DllConflictManager.cs new file mode 100644 index 0000000000..26f34f13c2 --- /dev/null +++ b/ConnectorCore/DllConflictManagement/DllConflictManager.cs @@ -0,0 +1,249 @@ +using System.Reflection; +using Speckle.DllConflictManagement.Analytics; +using Speckle.DllConflictManagement.ConflictManagementOptions; +using Speckle.DllConflictManagement.EventEmitter; + +namespace Speckle.DllConflictManagement; + +public sealed class DllConflictManager +{ + private readonly Dictionary _assemblyConflicts = new(); + private readonly DllConflictManagmentOptionsLoader _optionsLoader; + private readonly DllConflictEventEmitter _eventEmitter; + private readonly string[] _assemblyPathFragmentsToIgnore; + private readonly string[] _exactAssemblyPathsToIgnore; + + public ICollection AllConflictInfo => _assemblyConflicts.Values; + public ICollection AllConflictInfoAsDtos => _assemblyConflicts.Values.ToDtos().ToList(); + + public DllConflictManager( + DllConflictManagmentOptionsLoader optionsLoader, + DllConflictEventEmitter eventEmitter, + string[]? assemblyPathFragmentsToIgnore = null, + string[]? exactAssemblyPathsToIgnore = null + ) + { + _optionsLoader = optionsLoader; + _eventEmitter = eventEmitter; + _assemblyPathFragmentsToIgnore = assemblyPathFragmentsToIgnore ?? Array.Empty(); + _exactAssemblyPathsToIgnore = exactAssemblyPathsToIgnore ?? Array.Empty(); + } + + /// + /// Detects dll conflicts (same dll name with different strong version) between the assemblies loaded into + /// the current domain, and the assemblies that are dependencies of the provided assembly. + /// The dependency conflicts are stored in the conflictManager to be retreived later. + /// + /// + public void DetectConflictsWithAssembliesInCurrentDomain(Assembly providedAssembly) + { + Dictionary loadedAssembliesDict = new(); + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + loadedAssembliesDict[assembly.GetName().Name] = assembly; + } + LoadAssemblyAndDependencies(providedAssembly, loadedAssembliesDict, new HashSet()); + + _eventEmitter.EmitAction( + new ActionEventArgs( + nameof(Events.DUIAction), + new() + { + { "name", "DllConflictsDetected" }, + { "numConflicts", AllConflictInfo.Count }, + { "conflicts", AllConflictInfoAsDtos.ToList() }, + } + ) + ); + } + + private void LoadAssemblyAndDependencies( + Assembly assembly, + Dictionary loadedAssemblies, + HashSet visitedAssemblies + ) + { + if (visitedAssemblies.Contains(assembly.GetName().Name)) + { + return; + } + visitedAssemblies.Add(assembly.GetName().Name); + + foreach (var assemblyName in assembly.GetReferencedAssemblies()) + { + if (visitedAssemblies.Contains(assemblyName.Name)) + { + continue; + } + + if (loadedAssemblies.TryGetValue(assemblyName.Name, out Assembly? loadedAssembly)) + { + bool shouldSkip = ShouldSkipCheckingConflictBecauseOfAssemblyLocation(loadedAssembly); + if (!shouldSkip && !MajorAndMinorVersionsEqual(loadedAssembly.GetName().Version, assemblyName.Version)) + { + _assemblyConflicts[assemblyName.Name] = new(assemblyName, loadedAssembly); + continue; // if we already know there is a conflict here, no need to continue iterating dependencies + } + } + else + { + loadedAssembly = GetLoadedAssembly(assemblyName); + if (loadedAssembly is not null) + { + loadedAssemblies[assemblyName.Name] = loadedAssembly; + } + } + + if (loadedAssembly is not null) + { + LoadAssemblyAndDependencies(loadedAssembly, loadedAssemblies, visitedAssemblies); + } + } + } + + private bool ShouldSkipCheckingConflictBecauseOfAssemblyLocation(Assembly loadedAssembly) + { + foreach (var exactPath in _exactAssemblyPathsToIgnore) + { + if (Path.GetDirectoryName(loadedAssembly.Location) == exactPath) + { + return true; + } + } + + foreach (var pathFragment in _assemblyPathFragmentsToIgnore) + { + if (loadedAssembly.Location.Contains(pathFragment)) + { + return true; + } + } + + return false; + } + + private static bool MajorAndMinorVersionsEqual(Version version1, Version version2) + { + return version1.Major == version2.Major && version1.Minor == version2.Minor; + } + + private Assembly? GetLoadedAssembly(AssemblyName assemblyName) + { + try + { + return Assembly.Load(assemblyName); + } + catch (FileNotFoundException) + { + // trying to load Objects.dll will result in this exception, but that is okay because its only dependency + // is core which will be checked as a dependency of many other libraries. + // there are a couple other random types that will trigger this exception as well + } + return null; + } + + public AssemblyConflictInfo? GetConflictThatCausedException(MemberAccessException ex) + { + if ( + TryParseTypeNameFromMissingMethodExceptionMessage(ex.Message, out var typeName) + && TryGetTypeFromName(typeName!, out var type) + && _assemblyConflicts.TryGetValue(type!.Assembly.GetName().Name, out var assemblyConflictInfo) + ) + { + return assemblyConflictInfo; + } + return null; + } + + private static bool TryParseTypeNameFromMissingMethodExceptionMessage(string message, out string? typeName) + { + typeName = null; + + var splitOnApostraphe = message.Split('\''); + if (splitOnApostraphe.Length < 2) + { + return false; + } + + var splitOnSpace = splitOnApostraphe[1].Split(' '); + if (splitOnSpace.Length < 2) + { + return false; + } + + var splitOnPeriod = splitOnSpace[1].Split('.'); + if (splitOnPeriod.Length < 3) + { + return false; + } + + typeName = string.Join(".", splitOnPeriod.Take(splitOnPeriod.Length - 1)); + return true; + } + + private static bool TryGetTypeFromName(string typeName, out Type? type) + { + type = null; + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Reverse()) + { + if (assembly.GetType(typeName) is Type foundType) + { + type = foundType; + return true; + } + } + return false; + } + + public AssemblyConflictInfo? GetConflictThatCausedException(TypeLoadException ex) + { + // getting private fields is a bit naughty.. + var assemblyName = GetPrivateFieldValue(ex, "AssemblyName")?.Split(',').FirstOrDefault(); + + if (assemblyName != null && _assemblyConflicts.TryGetValue(assemblyName, out var assemblyConflictInfo)) + { + return assemblyConflictInfo; + } + return null; + } + + private static T GetPrivateFieldValue(object obj, string fieldName) + { + if (obj == null) + { + throw new ArgumentNullException(nameof(obj)); + } + + FieldInfo fi = + obj.GetType().GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) + ?? throw new ArgumentOutOfRangeException( + nameof(fieldName), + string.Format("Property {0} was not found in Type {1}", fieldName, obj.GetType().FullName) + ); + + return (T)fi.GetValue(obj); + } + + public IEnumerable GetConflictInfoThatUserHasntSuppressedWarningsFor() + { + if (_assemblyConflicts.Count == 0) + { + return Enumerable.Empty(); + } + + var options = _optionsLoader.LoadOptions(); + return _assemblyConflicts.Values.Where( + info => !options.DllsToIgnore.Contains(info.SpeckleDependencyAssemblyName.Name) + ); + } + + public void SupressFutureAssemblyConflictWarnings(IEnumerable conflictsToIgnoreWarningsFor) + { + var options = _optionsLoader.LoadOptions(); + foreach (var conflictInfo in conflictsToIgnoreWarningsFor) + { + options.DllsToIgnore.Add(conflictInfo.SpeckleDependencyAssemblyName.Name); + } + _optionsLoader.SaveOptions(options); + } +} diff --git a/ConnectorCore/DllConflictManagement/DllConflictUserNotifier.cs b/ConnectorCore/DllConflictManagement/DllConflictUserNotifier.cs new file mode 100644 index 0000000000..c83ac91c7d --- /dev/null +++ b/ConnectorCore/DllConflictManagement/DllConflictUserNotifier.cs @@ -0,0 +1,148 @@ +using System.Text; +using Speckle.DllConflictManagement.Analytics; +using Speckle.DllConflictManagement.EventEmitter; + +namespace Speckle.DllConflictManagement; + +public abstract class DllConflictUserNotifier +{ + private readonly DllConflictManager _dllConflictManager; + private readonly DllConflictEventEmitter _eventEmitter; + + protected DllConflictUserNotifier(DllConflictManager dllConflictManager, DllConflictEventEmitter eventEmitter) + { + _dllConflictManager = dllConflictManager; + _eventEmitter = eventEmitter; + } + + public void NotifyUserOfMissingMethodException(MemberAccessException ex) + { + NotifyUserOfException(_dllConflictManager.GetConflictThatCausedException(ex), ex); + } + + private void NotifyUserOfException(AssemblyConflictInfo? identifiedConflictingAssemblyInfo, Exception ex) + { + StringBuilder sb = new(); + if (identifiedConflictingAssemblyInfo is not null) + { + AddSingleDependencyErrorToStringBuilder(sb, identifiedConflictingAssemblyInfo); + } + else if (_dllConflictManager.AllConflictInfo.Count > 0) + { + sb.AppendLine("This is likely due to one of the following dependency conflicts"); + AddMultipleDependencyErrorsToStringBuilder(sb, _dllConflictManager.AllConflictInfo); + } + else + { + _eventEmitter.EmitError( + new LoggingEventArgs( + "A type load exception was thrown, but the conflict manager did not detect any conflicts", + ex + ) + ); + } + + Dictionary eventParameters = + new() + { + { "name", "DllConflictExceptionDialogShown" }, + { "conflictExceptionMessage", ex.Message }, + { "conflictExceptionType", ex.GetType().FullName }, + { "identifiedConflictingAssemblyName", identifiedConflictingAssemblyInfo?.SpeckleDependencyAssemblyName.Name }, + { "speckleVersion", identifiedConflictingAssemblyInfo?.SpeckleDependencyAssemblyName.Version }, + { "loadedVersion", identifiedConflictingAssemblyInfo?.ConflictingAssembly.GetName().Version }, + { "loadedDependencyLocation", identifiedConflictingAssemblyInfo?.GetConflictingExternalAppName() }, + }; + + if (identifiedConflictingAssemblyInfo is null) + { + eventParameters["numDetectedConflicts"] = _dllConflictManager.AllConflictInfo.Count; + eventParameters["allDetectedConflicts"] = _dllConflictManager.AllConflictInfoAsDtos.ToList(); + } + + _eventEmitter.EmitAction(new ActionEventArgs(nameof(Events.DUIAction), eventParameters)); + + ShowDialog("Conflict Report 🔥", "Speckle failed to load due to a dependency mismatch error.", sb.ToString()); + } + + private static void AddSingleDependencyErrorToStringBuilder( + StringBuilder sb, + AssemblyConflictInfo assemblyConflictInfo + ) + { + sb.AppendLine($"Dependency Name: {assemblyConflictInfo.SpeckleDependencyAssemblyName.Name}"); + sb.AppendLine($"Expected Version: {assemblyConflictInfo.SpeckleDependencyAssemblyName.Version}"); + sb.AppendLine($"Actual Version: {assemblyConflictInfo.ConflictingAssembly.GetName().Version}"); + sb.AppendLine($"Conflicting version folder: {assemblyConflictInfo.GetConflictingExternalAppName()}"); + } + + private static void AddMultipleDependencyErrorsToStringBuilder( + StringBuilder sb, + IEnumerable assemblyConflictInfos + ) + { + foreach (var assemblyConflictInfo in assemblyConflictInfos) + { + sb.AppendLine(); + AddSingleDependencyErrorToStringBuilder(sb, assemblyConflictInfo); + } + } + + protected abstract void ShowDialog(string title, string heading, string body); + + public void NotifyUserOfTypeLoadException(TypeLoadException ex) + { + NotifyUserOfException(_dllConflictManager.GetConflictThatCausedException(ex), ex); + } + + public void WarnUserOfPossibleConflicts() + { + List conflictInfoNotIgnored = _dllConflictManager + .GetConflictInfoThatUserHasntSuppressedWarningsFor() + .Where(conflict => !conflict.SpeckleDependencyAssemblyName.Name.StartsWith("System.")) // ignore system dlls for now + .ToList(); + + if (conflictInfoNotIgnored.Count == 0) + { + return; + } + + _eventEmitter.EmitAction( + new ActionEventArgs( + nameof(Events.DUIAction), + new() + { + { "name", "DllConflictsDetected" }, + { "dialogShown", true }, + { "numConflicts", conflictInfoNotIgnored.Count }, + { "conflicts", conflictInfoNotIgnored.ToDtos().ToList() }, + } + ) + ); + + StringBuilder sb = new(); + AddMultipleDependencyErrorsToStringBuilder(sb, conflictInfoNotIgnored); + + ShowDialogWithDoNotWarnAgainOption( + "Conflict Report 🔥", + "Speckle could not load the correct version of the following dependencies. This is likely due to a different addin that uses a different version of the same dependency. This may cause the Speckle Connector to not work properly", + sb.ToString(), + out bool doNotWarnAgain + ); + + if (doNotWarnAgain) + { + _eventEmitter.EmitAction( + new ActionEventArgs(nameof(Events.DUIAction), new() { { "name", "Do not warn about dll conflicts checked" } }) + ); + _dllConflictManager.SupressFutureAssemblyConflictWarnings(conflictInfoNotIgnored); + } + } + + protected abstract void ShowDialogWithDoNotWarnAgainOption( + string title, + string heading, + string body, + out bool doNotWarnAgain + ); +} diff --git a/ConnectorCore/DllConflictManagement/EventEmitter/ActionEventArgs.cs b/ConnectorCore/DllConflictManagement/EventEmitter/ActionEventArgs.cs new file mode 100644 index 0000000000..0863f59e0f --- /dev/null +++ b/ConnectorCore/DllConflictManagement/EventEmitter/ActionEventArgs.cs @@ -0,0 +1,13 @@ +namespace Speckle.DllConflictManagement.EventEmitter; + +public class ActionEventArgs : EventArgs +{ + public ActionEventArgs(string eventName, Dictionary? eventProperties) + { + EventName = eventName; + EventProperties = eventProperties; + } + + public string EventName { get; } + public Dictionary? EventProperties { get; } +} diff --git a/ConnectorCore/DllConflictManagement/EventEmitter/DllConflictEventEmitter.cs b/ConnectorCore/DllConflictManagement/EventEmitter/DllConflictEventEmitter.cs new file mode 100644 index 0000000000..3c7ffdb69b --- /dev/null +++ b/ConnectorCore/DllConflictManagement/EventEmitter/DllConflictEventEmitter.cs @@ -0,0 +1,73 @@ +namespace Speckle.DllConflictManagement.EventEmitter; + +/// +/// Responsible for emitting events that give details about what is happening in the conflict detection process. +/// All calls to emit an event will actually get added to a list of events to be emitted later. This allow the events +/// to be recorded before the proper event receiver is ready to receive the events. i.e. we can record errors in +/// the dll conflict detection process, but not properly log them until we verify that using our logger isn't going +/// to crash our plugin +/// +public class DllConflictEventEmitter +{ + public event EventHandler OnError; + public event EventHandler OnInfo; + public event EventHandler OnAction; + + private bool _shouldEmitEvents; + private readonly List _savedErrorEvents = new(); + private readonly List _savedInfoEvents = new(); + private readonly List _savedActionEvents = new(); + + public void EmitError(LoggingEventArgs e) + { + if (_shouldEmitEvents) + { + OnError?.Invoke(this, e); + } + else + { + _savedErrorEvents.Add(e); + } + } + + public void EmitInfo(LoggingEventArgs e) + { + if (_shouldEmitEvents) + { + OnInfo?.Invoke(this, e); + } + else + { + _savedInfoEvents.Add(e); + } + } + + public void EmitAction(ActionEventArgs e) + { + if (_shouldEmitEvents) + { + OnAction?.Invoke(this, e); + } + else + { + _savedActionEvents.Add(e); + } + } + + public void BeginEmit() + { + _shouldEmitEvents = true; + foreach (var e in _savedErrorEvents) + { + OnError?.Invoke(this, e); + } + foreach (var e in _savedInfoEvents) + { + OnInfo?.Invoke(this, e); + } + foreach (var e in _savedActionEvents) + { + OnAction?.Invoke(this, e); + } + } +} diff --git a/ConnectorCore/DllConflictManagement/EventEmitter/LoggingEventArgs.cs b/ConnectorCore/DllConflictManagement/EventEmitter/LoggingEventArgs.cs new file mode 100644 index 0000000000..d5b4146080 --- /dev/null +++ b/ConnectorCore/DllConflictManagement/EventEmitter/LoggingEventArgs.cs @@ -0,0 +1,13 @@ +namespace Speckle.DllConflictManagement.EventEmitter; + +public class LoggingEventArgs : EventArgs +{ + public LoggingEventArgs(string contextMessage, Exception? exception = null) + { + Exception = exception; + ContextMessage = contextMessage; + } + + public Exception? Exception { get; } + public string ContextMessage { get; } +} diff --git a/ConnectorCore/DllConflictManagement/Serialization/ISerializer.cs b/ConnectorCore/DllConflictManagement/Serialization/ISerializer.cs new file mode 100644 index 0000000000..b570c3387d --- /dev/null +++ b/ConnectorCore/DllConflictManagement/Serialization/ISerializer.cs @@ -0,0 +1,11 @@ +namespace Speckle.DllConflictManagement.Serialization; + +/// +/// Serialization and deserialization contract +/// +public interface ISerializer +{ + public string Serialize(T obj); + + public T Deserialize(string serialized); +} diff --git a/ConnectorCore/DllConflictManagement/Serialization/SpeckleNewtonsoftSerializer.cs b/ConnectorCore/DllConflictManagement/Serialization/SpeckleNewtonsoftSerializer.cs new file mode 100644 index 0000000000..2fffc24bf3 --- /dev/null +++ b/ConnectorCore/DllConflictManagement/Serialization/SpeckleNewtonsoftSerializer.cs @@ -0,0 +1,14 @@ +using Speckle.Newtonsoft.Json; + +namespace Speckle.DllConflictManagement.Serialization; + +public class SpeckleNewtonsoftSerializer : ISerializer +{ + public string Serialize(T obj) => JsonConvert.SerializeObject(obj); + + public T Deserialize(string serialized) => + JsonConvert.DeserializeObject(serialized) + ?? throw new InvalidOperationException( + $"Unable to deserialize the provided JSON into an object of type {typeof(T)}" + ); +} diff --git a/ConnectorNavisworks/ConnectorNavisworks.sln b/ConnectorNavisworks/ConnectorNavisworks.sln index d36d5049e1..95eb3dacec 100644 --- a/ConnectorNavisworks/ConnectorNavisworks.sln +++ b/ConnectorNavisworks/ConnectorNavisworks.sln @@ -43,6 +43,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorNavisworks2024", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConverterNavisworks2024", "..\Objects\Converters\ConverterNavisworks\ConverterNavisworks2024\ConverterNavisworks2024.csproj", "{7BF8710D-7CBA-4E34-9D8A-6FAE5EB0857C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorNavisworks2025", "ConnectorNavisworks2025\ConnectorNavisworks2025.csproj", "{2568500E-F1BC-440E-9150-DD4820B3FAD6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConverterNavisworks2025", "..\Objects\Converters\ConverterNavisworks\ConverterNavisworks2025\ConverterNavisworks2025.csproj", "{E16ABE2E-46D1-4514-B098-4AAE488A9802}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -163,6 +167,22 @@ Global {2568500E-F1BC-440E-9150-DB4820B3FAD6}.Release|Any CPU.Build.0 = Release|Any CPU {2568500E-F1BC-440E-9150-DB4820B3FAD6}.Release|x64.ActiveCfg = Release|x64 {2568500E-F1BC-440E-9150-DB4820B3FAD6}.Release|x64.Build.0 = Release|x64 + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug|x64.ActiveCfg = Debug|x64 + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Debug|x64.Build.0 = Debug|x64 + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release|Any CPU.Build.0 = Release|Any CPU + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release|x64.ActiveCfg = Release|x64 + {2568500E-F1BC-440E-9150-DD4820B3FAD6}.Release|x64.Build.0 = Release|x64 + {E16ABE2E-46D1-4514-B098-4AAE488A9802}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E16ABE2E-46D1-4514-B098-4AAE488A9802}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E16ABE2E-46D1-4514-B098-4AAE488A9802}.Debug|x64.ActiveCfg = Debug|x64 + {E16ABE2E-46D1-4514-B098-4AAE488A9802}.Debug|x64.Build.0 = Debug|x64 + {E16ABE2E-46D1-4514-B098-4AAE488A9802}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E16ABE2E-46D1-4514-B098-4AAE488A9802}.Release|Any CPU.Build.0 = Release|Any CPU + {E16ABE2E-46D1-4514-B098-4AAE488A9802}.Release|x64.ActiveCfg = Release|x64 + {E16ABE2E-46D1-4514-B098-4AAE488A9802}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -185,6 +205,8 @@ Global {7BF8710D-7CBA-4E34-9D8A-6FAE5EB0857C} = {09B8CBD5-94AC-4EB6-9B59-D830CE66F691} {74E39841-B2FA-494D-AC40-A6E505DE6B33} = {95E1C221-D77A-4EA7-82DF-81A8A3794276} {2568500E-F1BC-440E-9150-DB4820B3FAD6} = {95E1C221-D77A-4EA7-82DF-81A8A3794276} + {2568500E-F1BC-440E-9150-DD4820B3FAD6} = {95E1C221-D77A-4EA7-82DF-81A8A3794276} + {E16ABE2E-46D1-4514-B098-4AAE488A9802} = {09B8CBD5-94AC-4EB6-9B59-D830CE66F691} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {A58F12E8-41E9-40EB-B6CB-A3FD28F57302} diff --git a/ConnectorNavisworks/ConnectorNavisworks.slnf b/ConnectorNavisworks/ConnectorNavisworks.slnf index 2c01f7e4d5..3de36250d1 100644 --- a/ConnectorNavisworks/ConnectorNavisworks.slnf +++ b/ConnectorNavisworks/ConnectorNavisworks.slnf @@ -1,25 +1,25 @@ { "solution": { - "path": "../All.sln", + "path": "..\\All.sln", "projects": [ - "Core\\Core\\Core.csproj", "ConnectorNavisworks\\ConnectorNavisworks2020\\ConnectorNavisworks2020.csproj", "ConnectorNavisworks\\ConnectorNavisworks2021\\ConnectorNavisworks2021.csproj", "ConnectorNavisworks\\ConnectorNavisworks2022\\ConnectorNavisworks2022.csproj", "ConnectorNavisworks\\ConnectorNavisworks2023\\ConnectorNavisworks2023.csproj", "ConnectorNavisworks\\ConnectorNavisworks2024\\ConnectorNavisworks2024.csproj", + "ConnectorNavisworks\\ConnectorNavisworks2025\\ConnectorNavisworks2025.csproj", "ConnectorNavisworks\\ConnectorNavisworks\\ConnectorNavisworks.shproj", - + "Core\\Core\\Core.csproj", + "DesktopUI2\\AvaloniaHwndHost\\AvaloniaHwndHost.csproj", + "DesktopUI2\\DesktopUI2\\DesktopUI2.csproj", "Objects\\Converters\\ConverterNavisworks\\ConverterNavisworks2020\\ConverterNavisworks2020.csproj", "Objects\\Converters\\ConverterNavisworks\\ConverterNavisworks2021\\ConverterNavisworks2021.csproj", "Objects\\Converters\\ConverterNavisworks\\ConverterNavisworks2022\\ConverterNavisworks2022.csproj", "Objects\\Converters\\ConverterNavisworks\\ConverterNavisworks2023\\ConverterNavisworks2023.csproj", "Objects\\Converters\\ConverterNavisworks\\ConverterNavisworks2024\\ConverterNavisworks2024.csproj", + "Objects\\Converters\\ConverterNavisworks\\ConverterNavisworks2025\\ConverterNavisworks2025.csproj", "Objects\\Converters\\ConverterNavisworks\\ConverterNavisworks\\ConverterNavisworks.shproj", - - "DesktopUI2\\AvaloniaHwndHost\\AvaloniaHwndHost.csproj", - "DesktopUI2\\DesktopUI2\\DesktopUI2.csproj", - + "Objects\\Objects\\Objects.csproj", "Objects\\Tests\\Objects.Tests.Unit\\Objects.Tests.Unit.csproj" ] } diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/PackageContents.xml b/ConnectorNavisworks/ConnectorNavisworks/Entry/PackageContents.xml index 5bc3f90507..d15f85cceb 100644 --- a/ConnectorNavisworks/ConnectorNavisworks/Entry/PackageContents.xml +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/PackageContents.xml @@ -24,9 +24,14 @@ - - - - - \ No newline at end of file + + + + + + + + + diff --git a/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml.cs b/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml.cs index c9ef7b3a32..081412e1ba 100644 --- a/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml.cs +++ b/ConnectorNavisworks/ConnectorNavisworks/Entry/Ribbon.xaml.cs @@ -205,6 +205,9 @@ public override int ExecuteCommand(string commandId, params string[] parameters) #if NAVMAN21 buildVersion = "2024"; #endif +#if NAVMAN22 + buildVersion = "2025"; +#endif // Version if (!NavisworksApp.Version.RuntimeProductName.Contains(buildVersion)) diff --git a/ConnectorNavisworks/ConnectorNavisworks/Other/Utilities.cs b/ConnectorNavisworks/ConnectorNavisworks/Other/Utilities.cs index f15779e495..89c0a7d208 100644 --- a/ConnectorNavisworks/ConnectorNavisworks/Other/Utilities.cs +++ b/ConnectorNavisworks/ConnectorNavisworks/Other/Utilities.cs @@ -19,7 +19,9 @@ public static T[] ToArray(this Array arr) public static class SpeckleNavisworksUtilities { -#if NAVMAN21 +#if NAVMAN22 + public static readonly string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2025); +#elif NAVMAN21 public static readonly string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2024); #elif NAVMAN20 public static readonly string VersionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2023); diff --git a/ConnectorNavisworks/ConnectorNavisworks2020/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2020/Properties/launchSettings.json index 233b3f8869..65ab64d742 100644 --- a/ConnectorNavisworks/ConnectorNavisworks2020/Properties/launchSettings.json +++ b/ConnectorNavisworks/ConnectorNavisworks2020/Properties/launchSettings.json @@ -2,7 +2,8 @@ "profiles": { "SpeckleNavisworks.2020": { "commandName": "Executable", - "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2020\\Roamer.exe" + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2020\\Roamer.exe", + "commandLineArgs": " -licensing AdLM" } } -} \ No newline at end of file +} diff --git a/ConnectorNavisworks/ConnectorNavisworks2021/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2021/Properties/launchSettings.json index 3d4752c149..d52574a326 100644 --- a/ConnectorNavisworks/ConnectorNavisworks2021/Properties/launchSettings.json +++ b/ConnectorNavisworks/ConnectorNavisworks2021/Properties/launchSettings.json @@ -2,7 +2,8 @@ "profiles": { "SpeckleNavisworks.2021": { "commandName": "Executable", - "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2021\\Roamer.exe" + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2021\\Roamer.exe", + "commandLineArgs": " -licensing AdLM" } } } diff --git a/ConnectorNavisworks/ConnectorNavisworks2022/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2022/Properties/launchSettings.json index e40b434abb..5fc3ddb98c 100644 --- a/ConnectorNavisworks/ConnectorNavisworks2022/Properties/launchSettings.json +++ b/ConnectorNavisworks/ConnectorNavisworks2022/Properties/launchSettings.json @@ -2,7 +2,8 @@ "profiles": { "SpeckleNavisworks.2022": { "commandName": "Executable", - "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2022\\Roamer.exe" + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2022\\Roamer.exe", + "commandLineArgs": " -licensing AdLM" } } -} \ No newline at end of file +} diff --git a/ConnectorNavisworks/ConnectorNavisworks2023/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2023/Properties/launchSettings.json index 9b61b8161d..74cc11fdbe 100644 --- a/ConnectorNavisworks/ConnectorNavisworks2023/Properties/launchSettings.json +++ b/ConnectorNavisworks/ConnectorNavisworks2023/Properties/launchSettings.json @@ -2,7 +2,8 @@ "profiles": { "SpeckleNavisworks.2023": { "commandName": "Executable", - "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2023\\Roamer.exe" + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2023\\Roamer.exe", + "commandLineArgs": " -licensing AdLM" } } -} \ No newline at end of file +} diff --git a/ConnectorNavisworks/ConnectorNavisworks2024/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2024/Properties/launchSettings.json index 594fe6ffc2..42fa1f6d17 100644 --- a/ConnectorNavisworks/ConnectorNavisworks2024/Properties/launchSettings.json +++ b/ConnectorNavisworks/ConnectorNavisworks2024/Properties/launchSettings.json @@ -2,7 +2,8 @@ "profiles": { "SpeckleNavisworks.2024": { "commandName": "Executable", - "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2024\\Roamer.exe" + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2024\\Roamer.exe", + "commandLineArgs": " -licensing AdLM" } } -} \ No newline at end of file +} diff --git a/ConnectorNavisworks/ConnectorNavisworks2025/ConnectorNavisworks2025.csproj b/ConnectorNavisworks/ConnectorNavisworks2025/ConnectorNavisworks2025.csproj new file mode 100644 index 0000000000..5c2391ef98 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2025/ConnectorNavisworks2025.csproj @@ -0,0 +1,154 @@ + + + + + + + + SpeckleConnectorNavisworks + SpeckleConnectorNavisworks + Speckle.ConnectorNavisworks + {2568500e-f1bc-440e-9150-dd4820b3fad6} + + net48 + x64 + win-x64 + 512 + true + + Speckle writer for Autodesk Navisworks Manage + $(Authors) jonathon@speckle.systems + $(PackageTags) connector nwd nwc nwf navisworks manage + + true + Library + Properties + Debug;Release + + v22 + 2025 + $(AppData)\Autodesk\ApplicationPlugins\Speckle.ConnectorNavisworks.bundle + $(AppData)\Autodesk\ApplicationPlugins\Speckle.ConnectorNavisworks.bundle\Contents\$(NavisworksBuildNumber) + AnyCPU;x64 + + true + + + + + + + + + bin\x64\Debug\ + TRACE;NAVMAN22; + true + full + false + prompt + 4 + + + bin\x64\Release\ + TRACE;NAVMAN22; + pdbonly + true + prompt + 4 + + + + + + + + + + + + + + + + + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + False + global + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + + + + if exist "$(PluginVersionContentTarget)" ( rmdir /S /Q "$(PluginVersionContentTarget)" ) + xcopy /y "$(TargetDir)Entry\PackageContents.xml" "$(PluginBundleTarget)\" + xcopy /y "$(TargetDir)Entry\Ribbon.*" "$(PluginVersionContentTarget)\en-US\" + xcopy /e /i /y "$(TargetDir)*.*" "$(PluginVersionContentTarget)\" + + + + echo RELEASE copy from $(TargetDir) to $(SolutionDir)Release\Release\$(NavisworksVersion)\" + xcopy /e /i /y "$(TargetDir)*.*" "$(SolutionDir)Release\Release$(NavisworksVersion)\" + + + diff --git a/ConnectorNavisworks/ConnectorNavisworks2025/Properties/launchSettings.json b/ConnectorNavisworks/ConnectorNavisworks2025/Properties/launchSettings.json new file mode 100644 index 0000000000..dbf7a9bb10 --- /dev/null +++ b/ConnectorNavisworks/ConnectorNavisworks2025/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "profiles": { + "SpeckleNavisworks.2025": { + "commandName": "Executable", + "executablePath": "C:\\Program Files\\Autodesk\\Navisworks Manage 2025\\Roamer.exe", + "commandLineArgs": " -licensing AdLM" + } + } +} diff --git a/ConnectorRevit/ConnectorRevit.sln b/ConnectorRevit/ConnectorRevit.sln index e7e5015d6b..e64ee96aaa 100644 --- a/ConnectorRevit/ConnectorRevit.sln +++ b/ConnectorRevit/ConnectorRevit.sln @@ -86,19 +86,17 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "RevitShared", "RevitShared" EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "RevitSharedResources", "RevitSharedResources\RevitSharedResources.shproj", "{071F914C-F473-4FB2-9FAF-98632AFB164B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RevitSharedResources2024", "RevitSharedResources2024\RevitSharedResources2024.csproj", "{49579A07-BB79-4C79-B9EB-E03C5C2A83CA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RevitSharedResources2024", "RevitSharedResources2024\RevitSharedResources2024.csproj", "{49579A07-BB79-4C79-B9EB-E03C5C2A83CA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RevitSharedResources2023", "RevitSharedResources2023\RevitSharedResources2023.csproj", "{44F6AEDD-D875-46D8-9286-1D6A0201AFF6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RevitSharedResources2023", "RevitSharedResources2023\RevitSharedResources2023.csproj", "{44F6AEDD-D875-46D8-9286-1D6A0201AFF6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RevitSharedResources2022", "RevitSharedResources2022\RevitSharedResources2022.csproj", "{57C2D297-25D4-472B-9034-A106A6E39C24}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RevitSharedResources2022", "RevitSharedResources2022\RevitSharedResources2022.csproj", "{57C2D297-25D4-472B-9034-A106A6E39C24}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RevitSharedResources2021", "RevitSharedResources2021\RevitSharedResources2021.csproj", "{11D1995A-6FEF-4843-A1D7-A5F6B3592891}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RevitSharedResources2021", "RevitSharedResources2021\RevitSharedResources2021.csproj", "{11D1995A-6FEF-4843-A1D7-A5F6B3592891}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RevitSharedResources2020", "RevitSharedResources2020\RevitSharedResources2020.csproj", "{1C053AF2-BC74-4538-B250-62C6B54380EF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RevitSharedResources2020", "RevitSharedResources2020\RevitSharedResources2020.csproj", "{1C053AF2-BC74-4538-B250-62C6B54380EF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BatchUploader.Sdk", "..\ConnectorCore\BatchUploader.Sdk\BatchUploader.Sdk.csproj", "{2018D167-8A0E-495B-B7F9-F952530C1B87}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BatchUploader.OperationDriver", "..\ConnectorCore\BatchUploader.OperationDriver\BatchUploader.OperationDriver.csproj", "{1D6D5E82-0CE2-4291-9871-A94EDFD546BE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DllConflictManagement", "..\ConnectorCore\DllConflictManagement\DllConflictManagement.csproj", "{C80CA5EC-22BB-44A8-8800-54675218EB2B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -379,22 +377,14 @@ Global {1C053AF2-BC74-4538-B250-62C6B54380EF}.Release|Any CPU.Build.0 = Release|Any CPU {1C053AF2-BC74-4538-B250-62C6B54380EF}.Release|x64.ActiveCfg = Release|Any CPU {1C053AF2-BC74-4538-B250-62C6B54380EF}.Release|x64.Build.0 = Release|Any CPU - {2018D167-8A0E-495B-B7F9-F952530C1B87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2018D167-8A0E-495B-B7F9-F952530C1B87}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2018D167-8A0E-495B-B7F9-F952530C1B87}.Debug|x64.ActiveCfg = Debug|Any CPU - {2018D167-8A0E-495B-B7F9-F952530C1B87}.Debug|x64.Build.0 = Debug|Any CPU - {2018D167-8A0E-495B-B7F9-F952530C1B87}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2018D167-8A0E-495B-B7F9-F952530C1B87}.Release|Any CPU.Build.0 = Release|Any CPU - {2018D167-8A0E-495B-B7F9-F952530C1B87}.Release|x64.ActiveCfg = Release|Any CPU - {2018D167-8A0E-495B-B7F9-F952530C1B87}.Release|x64.Build.0 = Release|Any CPU - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE}.Debug|x64.ActiveCfg = Debug|Any CPU - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE}.Debug|x64.Build.0 = Debug|Any CPU - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE}.Release|Any CPU.Build.0 = Release|Any CPU - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE}.Release|x64.ActiveCfg = Release|Any CPU - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE}.Release|x64.Build.0 = Release|Any CPU + {C80CA5EC-22BB-44A8-8800-54675218EB2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C80CA5EC-22BB-44A8-8800-54675218EB2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C80CA5EC-22BB-44A8-8800-54675218EB2B}.Debug|x64.ActiveCfg = Debug|Any CPU + {C80CA5EC-22BB-44A8-8800-54675218EB2B}.Debug|x64.Build.0 = Debug|Any CPU + {C80CA5EC-22BB-44A8-8800-54675218EB2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C80CA5EC-22BB-44A8-8800-54675218EB2B}.Release|Any CPU.Build.0 = Release|Any CPU + {C80CA5EC-22BB-44A8-8800-54675218EB2B}.Release|x64.ActiveCfg = Release|Any CPU + {C80CA5EC-22BB-44A8-8800-54675218EB2B}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -443,19 +433,23 @@ Global {57C2D297-25D4-472B-9034-A106A6E39C24} = {621DFAC1-C94B-4D7B-B8B0-7934E816CC98} {11D1995A-6FEF-4843-A1D7-A5F6B3592891} = {621DFAC1-C94B-4D7B-B8B0-7934E816CC98} {1C053AF2-BC74-4538-B250-62C6B54380EF} = {621DFAC1-C94B-4D7B-B8B0-7934E816CC98} - {2018D167-8A0E-495B-B7F9-F952530C1B87} = {39F07EF9-5867-4062-886D-2417C86305C2} - {1D6D5E82-0CE2-4291-9871-A94EDFD546BE} = {39F07EF9-5867-4062-886D-2417C86305C2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {650BE642-C7CC-4FF5-9EE5-8C57BF553143} EndGlobalSection GlobalSection(SharedMSBuildProjectFiles) = preSolution + RevitSharedResources\RevitSharedResources.projitems*{071f914c-f473-4fb2-9faf-98632afb164b}*SharedItemsImports = 13 ..\Objects\Converters\ConverterRevit\ConverterRevitTests\ConverterRevitTestsShared\ConverterRevitTestsShared.projitems*{1085f4b5-fdad-4ff8-b144-dddbd9454f55}*SharedItemsImports = 13 + RevitSharedResources\RevitSharedResources.projitems*{11d1995a-6fef-4843-a1d7-a5f6b3592891}*SharedItemsImports = 5 + RevitSharedResources\RevitSharedResources.projitems*{1c053af2-bc74-4538-b250-62c6b54380ef}*SharedItemsImports = 5 ..\Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{236cff40-7dda-4cc5-84a9-b1df6f0985ef}*SharedItemsImports = 5 ..\Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{240ead7e-ef10-482a-b299-3b85b64b032f}*SharedItemsImports = 5 ConnectorRevit\ConnectorRevit.projitems*{27a79aca-7ea8-4406-8bb8-216578cc3ab7}*SharedItemsImports = 5 ..\Objects\Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{2dcd648d-dca5-4d2a-8b14-ad2cb85d24b0}*SharedItemsImports = 13 ConnectorRevit\ConnectorRevit.projitems*{42f3bf97-0b1c-4595-886a-3157151393f2}*SharedItemsImports = 5 + RevitSharedResources\RevitSharedResources.projitems*{44f6aedd-d875-46d8-9286-1d6a0201aff6}*SharedItemsImports = 5 + RevitSharedResources\RevitSharedResources.projitems*{49579a07-bb79-4c79-b9eb-e03c5c2a83ca}*SharedItemsImports = 5 + RevitSharedResources\RevitSharedResources.projitems*{57c2d297-25d4-472b-9034-a106a6e39c24}*SharedItemsImports = 5 ConnectorRevit\ConnectorRevit.projitems*{586a5a37-93f6-427e-8df8-c10db4d6822a}*SharedItemsImports = 5 ..\Objects\Converters\ConverterRevit\ConverterRevitTests\ConverterRevitTestsShared\ConverterRevitTestsShared.projitems*{5f2e1759-74a8-4da6-ad11-906ebef6b587}*SharedItemsImports = 5 ConnectorRevit\ConnectorRevit.projitems*{5fd0d810-03e9-4fd2-93e4-b1b51e5d82c5}*SharedItemsImports = 13 diff --git a/ConnectorRevit/ConnectorRevit.slnf b/ConnectorRevit/ConnectorRevit.slnf index c5c13cec76..cfc41d3cc6 100644 --- a/ConnectorRevit/ConnectorRevit.slnf +++ b/ConnectorRevit/ConnectorRevit.slnf @@ -2,21 +2,20 @@ "solution": { "path": "..\\All.sln", "projects": [ - "..\\batch-uploader\\ClientSDK\\BatchUploader.ClientSdk\\BatchUploader.ClientSdk.csproj", - "BatchUploadOperationDriver\\BatchUploadOperationDriver.csproj", - "ConnectorCore\\BatchUploader.OperationDriver\\BatchUploader.OperationDriver.csproj", - "ConnectorCore\\BatchUploader.Sdk\\BatchUploader.Sdk.csproj", + "ConnectorCore\\DllConflictManagement\\DllConflictManagement.csproj", "ConnectorRevit\\ConnectorRevit2020\\ConnectorRevit2020.csproj", "ConnectorRevit\\ConnectorRevit2021\\ConnectorRevit2021.csproj", "ConnectorRevit\\ConnectorRevit2022\\ConnectorRevit2022.csproj", "ConnectorRevit\\ConnectorRevit2023\\ConnectorRevit2023.csproj", "ConnectorRevit\\ConnectorRevit2024\\ConnectorRevit2024.csproj", + "ConnectorRevit\\ConnectorRevit2025\\ConnectorRevit2025.csproj", "ConnectorRevit\\ConnectorRevit\\ConnectorRevitShared.shproj", "ConnectorRevit\\RevitSharedResources2020\\RevitSharedResources2020.csproj", "ConnectorRevit\\RevitSharedResources2021\\RevitSharedResources2021.csproj", "ConnectorRevit\\RevitSharedResources2022\\RevitSharedResources2022.csproj", "ConnectorRevit\\RevitSharedResources2023\\RevitSharedResources2023.csproj", "ConnectorRevit\\RevitSharedResources2024\\RevitSharedResources2024.csproj", + "ConnectorRevit\\RevitSharedResources2025\\RevitSharedResources2025.csproj", "ConnectorRevit\\RevitSharedResources\\RevitSharedResources.shproj", "Core\\Core\\Core.csproj", "Core\\Tests\\Speckle.Core.Tests.Integration\\Speckle.Core.Tests.Integration.csproj", @@ -31,6 +30,7 @@ "Objects\\Converters\\ConverterRevit\\ConverterRevit2022\\ConverterRevit2022.csproj", "Objects\\Converters\\ConverterRevit\\ConverterRevit2023\\ConverterRevit2023.csproj", "Objects\\Converters\\ConverterRevit\\ConverterRevit2024\\ConverterRevit2024.csproj", + "Objects\\Converters\\ConverterRevit\\ConverterRevit2025\\ConverterRevit2025.csproj", "Objects\\Converters\\ConverterRevit\\ConverterRevitShared\\ConverterRevitShared.shproj", "Objects\\Converters\\ConverterRevit\\ConverterRevitTests\\ConverterRevitTests2021\\ConverterRevitTests2021.csproj", "Objects\\Converters\\ConverterRevit\\ConverterRevitTests\\ConverterRevitTests2022\\ConverterRevitTests2022.csproj", @@ -41,4 +41,4 @@ "Objects\\Tests\\Objects.Tests.Unit\\Objects.Tests.Unit.csproj" ] } -} \ No newline at end of file +} diff --git a/ConnectorRevit/ConnectorRevit/ConnectorRevit.projitems b/ConnectorRevit/ConnectorRevit/ConnectorRevit.projitems index c774213abd..47290ab313 100644 --- a/ConnectorRevit/ConnectorRevit/ConnectorRevit.projitems +++ b/ConnectorRevit/ConnectorRevit/ConnectorRevit.projitems @@ -30,7 +30,7 @@ - + diff --git a/ConnectorRevit/ConnectorRevit/ConnectorRevitUtils.cs b/ConnectorRevit/ConnectorRevit/ConnectorRevitUtils.cs index 14ff934f33..469db91068 100644 --- a/ConnectorRevit/ConnectorRevit/ConnectorRevitUtils.cs +++ b/ConnectorRevit/ConnectorRevit/ConnectorRevitUtils.cs @@ -13,7 +13,9 @@ namespace Speckle.ConnectorRevit; public static class ConnectorRevitUtils { -#if REVIT2024 +#if REVIT2025 + public static string RevitAppName = HostApplications.Revit.GetVersion(HostAppVersion.v2025); +#elif REVIT2024 public static string RevitAppName = HostApplications.Revit.GetVersion(HostAppVersion.v2024); #elif REVIT2023 public static string RevitAppName = HostApplications.Revit.GetVersion(HostAppVersion.v2023); diff --git a/ConnectorRevit/ConnectorRevit/Entry/App.cs b/ConnectorRevit/ConnectorRevit/Entry/App.cs index 19a2e9609f..a02e17c337 100644 --- a/ConnectorRevit/ConnectorRevit/Entry/App.cs +++ b/ConnectorRevit/ConnectorRevit/Entry/App.cs @@ -6,14 +6,18 @@ using System.Windows.Media.Imaging; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.UI; -using ConnectorRevit; using RevitSharedResources.Extensions.SpeckleExtensions; using RevitSharedResources.Models; -using Speckle.BatchUploader.Sdk; -using Speckle.BatchUploader.OperationDriver; using Speckle.ConnectorRevit.UI; using Speckle.Core.Kits; using Speckle.Core.Logging; +using ConnectorRevit.Entry; +using Speckle.DllConflictManagement; +using Speckle.DllConflictManagement.Serialization; +using Speckle.DllConflictManagement.Analytics; +using Speckle.DllConflictManagement.EventEmitter; +using Speckle.DllConflictManagement.ConflictManagementOptions; +using Autodesk.Revit.DB.Events; namespace Speckle.ConnectorRevit.Entry; @@ -24,18 +28,208 @@ public class App : IExternalApplication public static UIControlledApplication UICtrlApp { get; set; } private bool _initialized; + private static readonly string[] s_assemblyPathFragmentsToIgnore = new string[] + { + "Microsoft.Net\\assembly\\GAC_MSIL\\", + "C:\\Program Files\\dotnet\\shared\\" + }; public Result OnStartup(UIControlledApplication application) { - InitializeConnector(); - - //Always initialize RevitTask ahead of time within Revit API context - APIContext.Initialize(application); - + // We need to hook into the AssemblyResolve event before doing anything else + // or we'll run into unresolved issues loading dependencies + AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(OnAssemblyResolve); + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + System.Windows.Forms.Application.ThreadException += Application_ThreadException; UICtrlApp = application; UICtrlApp.ControlledApplication.ApplicationInitialized += ControlledApplication_ApplicationInitialized; - string tabName = "Speckle"; + UICtrlApp.ControlledApplication.DocumentOpening += ControlledApplication_DocumentOpening; + + DllConflictEventEmitter eventEmitter = new(); + ISerializer serializer = new SpeckleNewtonsoftSerializer(); + AnalyticsWithoutDependencies analytics = new(eventEmitter, serializer, "Revit", GetRevitVersion()); + eventEmitter.OnAction += analytics.TrackEvent; + + DllConflictManagmentOptionsLoader optionsLoader = new(serializer, "Revit", GetRevitVersion()); + // ignore dll conflicts when dll lives in GAC because they are noisy and not an issue (at least in revit) + DllConflictManager conflictManager = + new( + optionsLoader, + eventEmitter, + s_assemblyPathFragmentsToIgnore, + new string[] { $"C:\\Program Files\\Autodesk\\Revit {GetRevitVersion()}" } + ); + RevitDllConflictUserNotifier conflictNotifier = new(conflictManager, eventEmitter); + try + { + conflictManager.DetectConflictsWithAssembliesInCurrentDomain(typeof(App).Assembly); + InitializeCore(); + + UnsubscibeFromDllConflictEventsWithDependencyFreeResources(eventEmitter, analytics); + SubscibeToDllConflictEventsWithCoreResources(eventEmitter); + + //Always initialize RevitTask ahead of time within Revit API context + APIContext.Initialize(application); + + InitializeUiPanel(application); + + return Result.Succeeded; + } + catch (TypeLoadException ex) + { + conflictNotifier.NotifyUserOfTypeLoadException(ex); + return Result.Failed; + } + catch (MemberAccessException ex) + { + conflictNotifier.NotifyUserOfMissingMethodException(ex); + return Result.Failed; + } + catch (Exception ex) + { + eventEmitter.EmitError(new("Failed to load Speckle app", ex)); + NotifyUserOfErrorStartingConnector(ex); + throw; + } + finally + { + eventEmitter.BeginEmit(); + } + } + + private static void UnsubscibeFromDllConflictEventsWithDependencyFreeResources( + DllConflictEventEmitter eventEmitter, + AnalyticsWithoutDependencies analytics + ) + { + eventEmitter.OnAction -= analytics.TrackEvent; + } + + private static void SubscibeToDllConflictEventsWithCoreResources(DllConflictEventEmitter eventEmitter) + { + eventEmitter.OnError += (obj, args) => SpeckleLog.Logger.Error(args.Exception, args.ContextMessage); + eventEmitter.OnInfo += (obj, args) => SpeckleLog.Logger.Information(args.Exception, args.ContextMessage); + + eventEmitter.OnAction += (obj, args) => + { + _ = Enum.TryParse(args.EventName, out Analytics.Events eventName); + Analytics.TrackEvent(eventName, args.EventProperties); + }; + } + + private static string GetRevitVersion() + { +#if REVIT2020 + return "2020"; +#elif REVIT2021 + return "2021"; +#elif REVIT2022 + return "2022"; +#elif REVIT2023 + return "2023"; +#elif REVIT2024 + return "2024"; +#elif REVIT2025 + return "2025"; +#endif + } + + private void ControlledApplication_DocumentOpening(object sender, DocumentOpeningEventArgs e) + { + // When a user double-clicks on an .rvt file that start Revit, Revit invokes the DocumentOpening event before ApplicationInitialized. + // In such instances, it becomes necessary to instantiate the pane during the document opening process. + try + { + InitializeConnector(); + AppInstance ??= new UIApplication(sender as Application); + CreateBindings(); + SpeckleRevitCommand.RegisterPane(); + } + catch (Exception ex) when (!ex.IsFatal()) + { + SpeckleLog.Logger.Fatal(ex, "Failed to load Speckle app"); + NotifyUserOfErrorStartingConnector(ex); + } + } + + private static void CreateBindings() + { + if (SpeckleRevitCommand.Bindings != null) + { + return; + } + + ConnectorBindingsRevit bindings = new(AppInstance); + bindings.RegisterAppEvents(); + SpeckleRevitCommand.Bindings = bindings; + SchedulerCommand.Bindings = bindings; + } + + private void ControlledApplication_ApplicationInitialized( + object sender, + Autodesk.Revit.DB.Events.ApplicationInitializedEventArgs e + ) + { + try + { + InitializeConnector(); + AppInstance ??= new UIApplication(sender as Application); + CreateBindings(); + + //This is also called in DUI, adding it here to know how often the connector is loaded and used + Analytics.TrackEvent(Analytics.Events.Registered, null, false); + + SpeckleRevitCommand.RegisterPane(); + + //AppInstance.ViewActivated += new EventHandler(Application_ViewActivated); + } + catch (KitException ex) + { + SpeckleLog.Logger.Warning(ex, "Error loading kit on startup"); + NotifyUserOfErrorStartingConnector(ex); + } + catch (Exception ex) when (!ex.IsFatal()) + { + SpeckleLog.Logger.Fatal(ex, "Failed to load Speckle app"); + NotifyUserOfErrorStartingConnector(ex); + } + } + + private void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) + { + SpeckleLog.Logger.Fatal( + e.Exception, + "Caught thread exception with message {exceptionMessage}", + e.Exception.Message + ); + } + + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + if (e.ExceptionObject is Exception ex) + { + SpeckleLog.Logger.Fatal( + ex, + "Caught unhandled exception. Is terminating : {isTerminating}. Message : {exceptionMessage}", + e.IsTerminating, + ex.Message + ); + } + else + { + SpeckleLog.Logger.Fatal( + "Caught unhandled exception. Is terminating : {isTerminating}. Exception object is of type : {exceptionObjectType}. Exception object to string : {exceptionObjToString}", + e.IsTerminating, + e.ExceptionObject.GetType(), + e.ExceptionObject.ToString() + ); + } + } + + private void InitializeUiPanel(UIControlledApplication application) + { + string tabName = "Speckle"; try { application.CreateRibbonTab(tabName); @@ -49,7 +243,7 @@ public Result OnStartup(UIControlledApplication application) { SpeckleLog.Logger.Warning(ex, "User has too many Revit add-on tabs installed"); NotifyUserOfErrorStartingConnector(ex); - return Result.Failed; + throw; } var specklePanel = application.CreateRibbonPanel(tabName, "Speckle 2"); @@ -128,80 +322,6 @@ public Result OnStartup(UIControlledApplication application) manager.ToolTip = "Manage accounts and connectors. Opens SpeckleManager."; manager.Image = LoadPngImgSource("Speckle.ConnectorRevit.Assets.logo16.png", path); manager.LargeImage = LoadPngImgSource("Speckle.ConnectorRevit.Assets.logo32.png", path); - - return Result.Succeeded; - } - - private void ControlledApplication_ApplicationInitialized( - object sender, - Autodesk.Revit.DB.Events.ApplicationInitializedEventArgs e - ) - { - try - { - InitializeConnector(); - - AppInstance = new UIApplication(sender as Application); - - var bindings = new ConnectorBindingsRevit(AppInstance); - bindings.RegisterAppEvents(); - SpeckleRevitCommand.Bindings = bindings; - SchedulerCommand.Bindings = bindings; - - BatchUploaderClient client = new(new Uri("http://localhost:5001")); - RevitApplicationController revitAppController = new(AppInstance); - BatchUploadOperationDriver batchUploadOperationDriver = new(client, revitAppController, bindings); - - batchUploadOperationDriver.ProcessAllJobs(); - - //This is also called in DUI, adding it here to know how often the connector is loaded and used - Analytics.TrackEvent(Analytics.Events.Registered, null, false); - - SpeckleRevitCommand.RegisterPane(); - - //AppInstance.ViewActivated += new EventHandler(Application_ViewActivated); - } - catch (KitException ex) - { - SpeckleLog.Logger.Warning(ex, "Error loading kit on startup"); - NotifyUserOfErrorStartingConnector(ex); - } - catch (Exception ex) when (!ex.IsFatal()) - { - SpeckleLog.Logger.Fatal(ex, "Failed to load Speckle app"); - NotifyUserOfErrorStartingConnector(ex); - } - } - - private void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) - { - SpeckleLog.Logger.Fatal( - e.Exception, - "Caught thread exception with message {exceptionMessage}", - e.Exception.Message - ); - } - - private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - if (e.ExceptionObject is Exception ex) - { - SpeckleLog.Logger.Fatal( - ex, - "Caught unhandled exception. Is terminating : {isTerminating}. Message : {exceptionMessage}", - e.IsTerminating, - ex.Message - ); - } - else - { - SpeckleLog.Logger.Fatal( - "Caught unhandled exception. Is terminating : {isTerminating}. Exception object is of type : {exceptionObjectType}. Exception object to string : {exceptionObjToString}", - e.IsTerminating, - e.ExceptionObject.GetType(), - e.ExceptionObject.ToString() - ); - } } public Result OnShutdown(UIControlledApplication application) @@ -262,6 +382,11 @@ ex is KitException } } + private void InitializeCore() + { + Setup.Init(ConnectorBindingsRevit.HostAppNameVersion, ConnectorBindingsRevit.HostAppName); + } + private void InitializeConnector() { if (_initialized) @@ -269,15 +394,6 @@ private void InitializeConnector() return; } - // We need to hook into the AssemblyResolve event before doing anything else - // or we'll run into unresolved issues loading dependencies - AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(OnAssemblyResolve); - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - System.Windows.Forms.Application.ThreadException += Application_ThreadException; - - // initialize the speckle logger - Setup.Init(ConnectorBindingsRevit.HostAppNameVersion, ConnectorBindingsRevit.HostAppName); - //DUI2 - pre build app, so that it's faster to open up SpeckleRevitCommand.InitAvalonia(); diff --git a/ConnectorRevit/ConnectorRevit/Entry/RevitDllConflictUserNotifier.cs b/ConnectorRevit/ConnectorRevit/Entry/RevitDllConflictUserNotifier.cs new file mode 100644 index 0000000000..806dabe106 --- /dev/null +++ b/ConnectorRevit/ConnectorRevit/Entry/RevitDllConflictUserNotifier.cs @@ -0,0 +1,39 @@ +using Autodesk.Revit.UI; +using Speckle.DllConflictManagement; +using Speckle.DllConflictManagement.EventEmitter; + +namespace ConnectorRevit.Entry; + +internal sealed class RevitDllConflictUserNotifier : DllConflictUserNotifier +{ + public RevitDllConflictUserNotifier(DllConflictManager dllConflictManager, DllConflictEventEmitter eventEmitter) + : base(dllConflictManager, eventEmitter) { } + + protected override void ShowDialog(string title, string heading, string body) + { + using var dialog = new TaskDialog(title); + dialog.MainInstruction = heading; + dialog.MainContent = body; + dialog.CommonButtons = TaskDialogCommonButtons.Ok; + _ = dialog.Show(); + } + + protected override void ShowDialogWithDoNotWarnAgainOption( + string title, + string heading, + string body, + out bool doNotShowAgain + ) + { + using var dialog = new TaskDialog(title); + dialog.MainInstruction = heading; + dialog.MainContent = body; + + dialog.ExtraCheckBoxText = "Do not warn about these conflicts again"; + dialog.CommonButtons = TaskDialogCommonButtons.Ok; + + _ = dialog.Show(); + + doNotShowAgain = dialog.WasExtraCheckBoxChecked(); + } +} diff --git a/ConnectorRevit/ConnectorRevit/Entry/SpeckleRevitCommand.cs b/ConnectorRevit/ConnectorRevit/Entry/SpeckleRevitCommand.cs index c0a7e6f4ed..6783eeee9d 100644 --- a/ConnectorRevit/ConnectorRevit/Entry/SpeckleRevitCommand.cs +++ b/ConnectorRevit/ConnectorRevit/Entry/SpeckleRevitCommand.cs @@ -90,24 +90,6 @@ internal static void RegisterPane() App.AppInstance.RegisterDockablePane(PanelId, "Speckle", _panel); _panel.Init(); } - created = DockablePane.PaneExists(PanelId); - - //if revit was launched double-clicking on a Revit file, we're screwed - //could maybe show the old window? - if (!created && App.AppInstance.Application.Documents.Size > 0) - { - TaskDialog mainDialog = new("Dockable Panel Issue"); - mainDialog.MainInstruction = "Dockable Panel Issue"; - mainDialog.MainContent = - "Revit cannot properly register Dockable Panels when launched by double-clicking a Revit file. " - + "Please close and re-open Revit without launching a file OR open/create a new project to trigger the Speckle panel registration."; - - // Set footer text. Footer text is usually used to link to the help document. - mainDialog.FooterText = - "" + "Click here for more info"; - - mainDialog.Show(); - } } public static void CreateOrFocusSpeckle(bool showWindow = true) diff --git a/ConnectorRevit/ConnectorRevit/RevitApplicationFunctionalityController.cs b/ConnectorRevit/ConnectorRevit/RevitApplicationFunctionalityController.cs deleted file mode 100644 index 21cbbc09db..0000000000 --- a/ConnectorRevit/ConnectorRevit/RevitApplicationFunctionalityController.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading.Tasks; -using Autodesk.Revit.UI; -using RevitSharedResources.Models; -using Speckle.BatchUploader.Sdk.Interfaces; - -namespace ConnectorRevit; - -internal class RevitApplicationController : IApplicationFunctionalityController -{ - private readonly UIApplication application; - - public RevitApplicationController(UIApplication application) - { - this.application = application; - } - - public async Task OpenDocument(string path) - { - await APIContext - .Run(() => - { - application.OpenAndActivateDocument(path); - }) - .ConfigureAwait(false); - } -} diff --git a/ConnectorRevit/ConnectorRevit/TypeMapping/ElementTypeMapper.cs b/ConnectorRevit/ConnectorRevit/TypeMapping/ElementTypeMapper.cs index c947336fdb..cc7a18fe25 100644 --- a/ConnectorRevit/ConnectorRevit/TypeMapping/ElementTypeMapper.cs +++ b/ConnectorRevit/ConnectorRevit/TypeMapping/ElementTypeMapper.cs @@ -272,6 +272,9 @@ out int numNewTypes var groupedElementTypeCache = revitDocumentAggregateCache.GetOrInitializeWithDefaultFactory>(); var elementTypeCache = revitDocumentAggregateCache.GetOrInitializeWithDefaultFactory(); + // add all element types from the document to the cache + groupedElementTypeCache.GetOrAddGroupOfTypes(RevitSharedResources.Helpers.Categories.Undefined); + foreach (var @base in speckleElements) { var incomingType = typeRetriever.GetElementType(@base); diff --git a/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.Events.cs b/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.Events.cs index b0dc9f2312..9d696564a9 100644 --- a/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.Events.cs +++ b/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.Events.cs @@ -64,7 +64,9 @@ public void RegisterAppEvents() RevitApp.Application.DocumentCreated += Application_DocumentCreated; RevitApp.Application.DocumentCreating += Application_DocumentCreating; RevitApp.Application.DocumentOpened += Application_DocumentOpened; - RevitApp.Application.DocumentOpening += Application_DocumentOpening; + // This code may fire during the DocumentOpening event, in which case an exception will be + // thrown about being unable to subscribe to an event during that event + //RevitApp.Application.DocumentOpening += Application_DocumentOpening; ; RevitApp.Application.DocumentClosed += Application_DocumentClosed; RevitApp.Application.DocumentSaved += Application_DocumentSaved; diff --git a/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.Receive.cs b/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.Receive.cs index 3d2d4a7bf0..2855bc3f05 100644 --- a/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.Receive.cs +++ b/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.Receive.cs @@ -144,7 +144,7 @@ await APIContext if (state.ReceiveMode == ReceiveMode.Update) { - DeleteObjects(previousObjects, convertedObjects); + DeleteObjects(previousObjects, convertedObjects, transactionManager); } previousObjects.AddConvertedElements(convertedObjects); @@ -181,10 +181,12 @@ await APIContext //delete previously sent object that are no more in this stream private void DeleteObjects( IReceivedObjectIdMap previousObjects, - IConvertedObjectsCache convertedObjects + IConvertedObjectsCache convertedObjects, + TransactionManager transactionManager ) { var previousAppIds = previousObjects.GetAllConvertedIds().ToList(); + transactionManager.StartSubtransaction(); for (var i = previousAppIds.Count - 1; i >= 0; i--) { var appId = previousAppIds[i]; @@ -215,6 +217,8 @@ IConvertedObjectsCache convertedObjects previousObjects.RemoveConvertedId(appId); } } + + transactionManager.CommitSubtransaction(); } private IConvertedObjectsCache ConvertReceivedObjects( @@ -355,6 +359,7 @@ void ConvertNestedElements(Base @base, ApplicationObject appObj, bool receiveDir if (index % 50 == 0) { transactionManager.Commit(); + transactionManager.Start(); } // Check if parent conversion succeeded or fallback is enabled before attempting the children diff --git a/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.cs b/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.cs index 044aca5d8a..9f043babcb 100644 --- a/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.cs +++ b/ConnectorRevit/ConnectorRevit/UI/ConnectorBindingsRevit.cs @@ -8,6 +8,7 @@ using RevitSharedResources.Interfaces; using Speckle.ConnectorRevit.Storage; using Speckle.Core.Kits; +using MenuItem = DesktopUI2.Models.MenuItem; using Timer = System.Timers.Timer; namespace Speckle.ConnectorRevit.UI; diff --git a/ConnectorRevit/ConnectorRevit2020/ConnectorRevit2020.csproj b/ConnectorRevit/ConnectorRevit2020/ConnectorRevit2020.csproj index f9cf817334..872df4ba54 100644 --- a/ConnectorRevit/ConnectorRevit2020/ConnectorRevit2020.csproj +++ b/ConnectorRevit/ConnectorRevit2020/ConnectorRevit2020.csproj @@ -1,4 +1,4 @@ - + Speckle.ConnectorRevit SpeckleConnectorRevit @@ -28,7 +28,7 @@ - + diff --git a/ConnectorRevit/ConnectorRevit2021/ConnectorRevit2021.csproj b/ConnectorRevit/ConnectorRevit2021/ConnectorRevit2021.csproj index 945c43d1b8..7560c5b6b6 100644 --- a/ConnectorRevit/ConnectorRevit2021/ConnectorRevit2021.csproj +++ b/ConnectorRevit/ConnectorRevit2021/ConnectorRevit2021.csproj @@ -30,7 +30,7 @@ - + diff --git a/ConnectorRevit/ConnectorRevit2022/ConnectorRevit2022.csproj b/ConnectorRevit/ConnectorRevit2022/ConnectorRevit2022.csproj index 35354b8542..4af27fbc35 100644 --- a/ConnectorRevit/ConnectorRevit2022/ConnectorRevit2022.csproj +++ b/ConnectorRevit/ConnectorRevit2022/ConnectorRevit2022.csproj @@ -26,7 +26,7 @@ - + diff --git a/ConnectorRevit/ConnectorRevit2023/ConnectorRevit2023.csproj b/ConnectorRevit/ConnectorRevit2023/ConnectorRevit2023.csproj index 09f36605b4..d48279d567 100644 --- a/ConnectorRevit/ConnectorRevit2023/ConnectorRevit2023.csproj +++ b/ConnectorRevit/ConnectorRevit2023/ConnectorRevit2023.csproj @@ -1,4 +1,4 @@ - + Speckle.ConnectorRevit SpeckleConnectorRevit @@ -26,7 +26,7 @@ - + diff --git a/ConnectorRevit/ConnectorRevit2024/ConnectorRevit2024.csproj b/ConnectorRevit/ConnectorRevit2024/ConnectorRevit2024.csproj index 706f5e5ce8..74aeaf8f1e 100644 --- a/ConnectorRevit/ConnectorRevit2024/ConnectorRevit2024.csproj +++ b/ConnectorRevit/ConnectorRevit2024/ConnectorRevit2024.csproj @@ -26,7 +26,7 @@ - + diff --git a/ConnectorRevit/ConnectorRevit2025/ConnectorRevit2025.csproj b/ConnectorRevit/ConnectorRevit2025/ConnectorRevit2025.csproj new file mode 100644 index 0000000000..f6b0da8833 --- /dev/null +++ b/ConnectorRevit/ConnectorRevit2025/ConnectorRevit2025.csproj @@ -0,0 +1,67 @@ + + + Speckle.ConnectorRevit + SpeckleConnectorRevit + net8.0-windows + true + SpeckleRevit2 + 2025 + ConnectorRevit + ConnectorRevit + bin\$(Configuration)\ + true + $(DefineConstants);REVIT2025 + false + true + x64 + win-x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ConnectorRevit/ConnectorRevit2025/Properties/launchSettings.json b/ConnectorRevit/ConnectorRevit2025/Properties/launchSettings.json new file mode 100644 index 0000000000..25c146a467 --- /dev/null +++ b/ConnectorRevit/ConnectorRevit2025/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "ConnectorRevit2025": { + "commandName": "Executable", + "executablePath": "C:\\Program Files\\Autodesk\\Revit 2025\\Revit.exe" + } + } +} diff --git a/ConnectorRevit/RevitSharedResources2025/RevitSharedResources2025.csproj b/ConnectorRevit/RevitSharedResources2025/RevitSharedResources2025.csproj new file mode 100644 index 0000000000..83fcd661c9 --- /dev/null +++ b/ConnectorRevit/RevitSharedResources2025/RevitSharedResources2025.csproj @@ -0,0 +1,20 @@ + + + + net8.0-windows + $(DefineConstants);REVIT2025 + RevitSharedResources + true + + + + + + + + + + + + + diff --git a/ConnectorRhino/ConnectorRhino8/ConnectorRhino8.csproj b/ConnectorRhino/ConnectorRhino8/ConnectorRhino8.csproj index 48a329c751..4ac6506a85 100644 --- a/ConnectorRhino/ConnectorRhino8/ConnectorRhino8.csproj +++ b/ConnectorRhino/ConnectorRhino8/ConnectorRhino8.csproj @@ -19,6 +19,8 @@ They are loaded from the nuget mac folder REMEMBER to update its numbers if updating the nugets --> + x64 + win-x64 $(DefineConstants);RHINO8;RHINO6_OR_GREATER;RHINO7_OR_GREATER;RHINO8_OR_GREATER Library true diff --git a/Core/Core/Helpers/Crypt.cs b/Core/Core/Helpers/Crypt.cs index d3714bdb67..307980fe54 100644 --- a/Core/Core/Helpers/Crypt.cs +++ b/Core/Core/Helpers/Crypt.cs @@ -1,8 +1,6 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; using System.Security.Cryptography; using System.Text; @@ -20,12 +18,11 @@ public static class Crypt [Pure] public static string Sha256(string input, string? format = "x2", int startIndex = 0, int length = 64) { - using MemoryStream ms = new(); + var inputBytes = Encoding.UTF8.GetBytes(input); - new BinaryFormatter().Serialize(ms, input); + using var sha256 = SHA256.Create(); + byte[] hash = sha256.ComputeHash(inputBytes); - using SHA256 sha = SHA256.Create(); - var hash = sha.ComputeHash(ms.ToArray()); StringBuilder sb = new(64); foreach (byte b in hash) { diff --git a/Core/Core/Models/CommitObjectBuilder.cs b/Core/Core/Models/CommitObjectBuilder.cs index fa38889664..3bdda97734 100644 --- a/Core/Core/Models/CommitObjectBuilder.cs +++ b/Core/Core/Models/CommitObjectBuilder.cs @@ -76,24 +76,9 @@ protected void SetRelationship(Base conversionResult, IList string? appId = conversionResult.applicationId; if (appId != null) { - if (!Converted.ContainsKey(appId)) - { - Converted[appId] = conversionResult; - } - else - { - Converted.Add(appId, conversionResult); - } - } - - if (!_nestingInstructions.ContainsKey(conversionResult)) - { - _nestingInstructions[conversionResult] = nestingInstructionsList; - } - else - { - _nestingInstructions.Add(conversionResult, nestingInstructionsList); + Converted[appId] = conversionResult; } + _nestingInstructions[conversionResult] = nestingInstructionsList; } /// diff --git a/Core/Tests/Speckle.Core.Tests.Unit/Models/UtilitiesTests.cs b/Core/Tests/Speckle.Core.Tests.Unit/Models/UtilitiesTests.cs index 00c2e37d72..a3a750d3a7 100644 --- a/Core/Tests/Speckle.Core.Tests.Unit/Models/UtilitiesTests.cs +++ b/Core/Tests/Speckle.Core.Tests.Unit/Models/UtilitiesTests.cs @@ -18,8 +18,8 @@ public void Md5(string input, string expected) Assert.That(upper, Is.EqualTo(expected.ToUpper())); } - [TestCase("fxFB14cBcXvoENN", "a6b48b2514a3ded45ad2cbea9e325c25c7ddc998247f2aff9bdd0e2694f5d5d4")] - [TestCase("tgWsOH8frdAwJT7", "82ac4675b283bae908fd110095252eca87dc6080244fc2014cf61bd9e45d37fc")] + [TestCase("fxFB14cBcXvoENN", "887db9349afa455f957a95f9dbacbb3c10697749cf4d4afc5c6398932a596fbc")] + [TestCase("tgWsOH8frdAwJT7", "e486224ded0dcb1452d69d0d005a6dcbc52087f6e8c66e04803e1337a192abb4")] [TestOf(nameof(Crypt.Sha256))] public void Sha256(string input, string expected) { diff --git a/DesktopUI2/DesktopUI2/ViewModels/TypeMappingOnReceiveViewModel.cs b/DesktopUI2/DesktopUI2/ViewModels/TypeMappingOnReceiveViewModel.cs index 3607ec9b8e..e3e47aae62 100644 --- a/DesktopUI2/DesktopUI2/ViewModels/TypeMappingOnReceiveViewModel.cs +++ b/DesktopUI2/DesktopUI2/ViewModels/TypeMappingOnReceiveViewModel.cs @@ -44,9 +44,18 @@ public string SearchQuery { this.RaiseAndSetIfChanged(ref _searchQuery, value); - SearchResults = GetCategoryOrAll(SelectedCategory) + SearchResults = GetCategoryOrAll(SelectedCategory, out bool isUsingAllTypes) .Where(ht => ht.HostTypeDisplayName.ToLower().Contains(SearchQuery.ToLower())) .ToList(); + + if (SearchResults.Count == 0 && !isUsingAllTypes) + { + SearchResults = hostTypeContainer + .GetAllTypes() + .Where(ht => ht.HostTypeDisplayName.ToLower().Contains(SearchQuery.ToLower())) + .ToList(); + } + this.RaisePropertyChanged(nameof(SearchResults)); } } @@ -78,7 +87,7 @@ public string SelectedCategory this.RaiseAndSetIfChanged(ref _selectedCategory, value); VisibleMappingValues = Mapping.GetValuesToMapOfCategory(value).ToList(); SearchQuery = ""; - SearchResults = GetCategoryOrAll(value).ToList(); + SearchResults = GetCategoryOrAll(value, out _).ToList(); SelectedMappingValues.Clear(); } } @@ -98,9 +107,16 @@ public List SearchResults set => this.RaiseAndSetIfChanged(ref _searchResults, value); } - private ICollection GetCategoryOrAll(string category) + private ICollection GetCategoryOrAll(string category, out bool isUsingAllTypes) { - return hostTypeContainer.GetTypesInCategory(category) ?? hostTypeContainer.GetAllTypes(); + isUsingAllTypes = false; + if (hostTypeContainer.GetTypesInCategory(category) is ICollection collection) + { + return collection; + } + + isUsingAllTypes = true; + return hostTypeContainer.GetAllTypes(); } public string UrlPathSegment => throw new NotImplementedException(); diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterAutocad2025/ConverterAutocad2025.csproj b/Objects/Converters/ConverterAutocadCivil/ConverterAutocad2025/ConverterAutocad2025.csproj new file mode 100644 index 0000000000..96d027e17f --- /dev/null +++ b/Objects/Converters/ConverterAutocadCivil/ConverterAutocad2025/ConverterAutocad2025.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + Objects.Converter.Autocad2025 + Objects.Converter.Autocad + $(DefineConstants);AUTOCAD2025 + Speckle.Objects.Converter.Autocad2025 + Objects.Converter.Autocad2025 + Converter for Autocad 2025 + $(PackageTags) objects converter autocad + true + False + + + + + + + + + + + + + + diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/Converter.AutocadCivil.Utils.cs b/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/Converter.AutocadCivil.Utils.cs index abe25556eb..56e6b7e48f 100644 --- a/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/Converter.AutocadCivil.Utils.cs +++ b/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/Converter.AutocadCivil.Utils.cs @@ -11,7 +11,7 @@ using Autodesk.AutoCAD.EditorInput; using Speckle.Core.Logging; -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL using Autodesk.Aec.ApplicationServices; #endif @@ -407,7 +407,7 @@ public string ModelUnits { _modelUnits = UnitToSpeckle(Doc.Database.Insunits); -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL if (_modelUnits == Units.None) { // try to get the drawing unit instead diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/ConverterAutocadCivil.Civil.cs b/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/ConverterAutocadCivil.Civil.cs index 116e3c0a77..20ede66c9c 100644 --- a/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/ConverterAutocadCivil.Civil.cs +++ b/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/ConverterAutocadCivil.Civil.cs @@ -1,4 +1,4 @@ -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL using System; using System.Collections.Generic; using System.Linq; @@ -599,7 +599,7 @@ public CivilProfile ProfileToSpeckle(CivilDB.Profile profile) foreach (ProfilePVI pvi in profile.PVIs) { double pviStation = 0; -#if CIVIL2024 +#if CIVIL2024_OR_GREATER pviStation = pvi.RawStation; #else pviStation = pvi.Station; diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/ConverterAutocadCivil.cs b/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/ConverterAutocadCivil.cs index 057144695d..957fff734b 100644 --- a/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/ConverterAutocadCivil.cs +++ b/Objects/Converters/ConverterAutocadCivil/ConverterAutocadCivilShared/ConverterAutocadCivil.cs @@ -26,7 +26,7 @@ using Spiral = Objects.Geometry.Spiral; using Speckle.Core.Logging; -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL using CivilDB = Autodesk.Civil.DatabaseServices; #endif @@ -42,6 +42,8 @@ public partial class ConverterAutocadCivil : ISpeckleConverter public static string AutocadAppName = HostApplications.AutoCAD.GetVersion(HostAppVersion.v2023); #elif AUTOCAD2024 public static string AutocadAppName = HostApplications.AutoCAD.GetVersion(HostAppVersion.v2024); +#elif AUTOCAD2025 + public static string AutocadAppName = HostApplications.AutoCAD.GetVersion(HostAppVersion.v2025); #elif CIVIL2021 public static string AutocadAppName = HostApplications.Civil.GetVersion(HostAppVersion.v2021); #elif CIVIL2022 @@ -50,6 +52,8 @@ public partial class ConverterAutocadCivil : ISpeckleConverter public static string AutocadAppName = HostApplications.Civil.GetVersion(HostAppVersion.v2023); #elif CIVIL2024 public static string AutocadAppName = HostApplications.Civil.GetVersion(HostAppVersion.v2024); +#elif CIVIL2025 + public static string AutocadAppName = HostApplications.Civil.GetVersion(HostAppVersion.v2025); #elif ADVANCESTEEL2023 public static string AutocadAppName = HostApplications.AdvanceSteel.GetVersion(HostAppVersion.v2023); #elif ADVANCESTEEL2024 @@ -194,7 +198,7 @@ public Base ConvertToSpeckle(object @object) case LayerTableRecord o: @base = LayerToSpeckle(o); break; -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL case CivilDB.Alignment o: @base = AlignmentToSpeckle(o); break; @@ -378,7 +382,7 @@ public object ConvertToNative(Base @object) break; case Mesh o: -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL acadObj = isFromCivil ? CivilSurfaceToNative(o) : MeshToNativeDB(o); #else acadObj = MeshToNativeDB(o); @@ -405,7 +409,7 @@ public object ConvertToNative(Base @object) acadObj = CollectionToNative(o); break; -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL case Alignment o: acadObj = AlignmentToNative(o); break; @@ -515,7 +519,7 @@ public bool CanConvertToSpeckle(object @object) case LayerTableRecord: return true; -#if CIVIL2021 || CIVIL2022 || CIVIL2023 || CIVIL2024 +#if CIVIL // NOTE: C3D pressure pipes and pressure fittings API under development case CivilDB.FeatureLine: case CivilDB.Corridor: diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2021/ConverterCivil2021.csproj b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2021/ConverterCivil2021.csproj index 44fb3cc244..9c101b39cb 100644 --- a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2021/ConverterCivil2021.csproj +++ b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2021/ConverterCivil2021.csproj @@ -4,7 +4,7 @@ netstandard2.0 Objects.Converter.Civil3D2021 Objects.Converter.Civil - $(DefineConstants);CIVIL2021 + $(DefineConstants);CIVIL2021;CIVIL;CIVIL2021_OR_GREATER Speckle.Objects.Converter.Civil2021 Objects.Converter.Civil2021 Converter for Civil3D 2021 diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2022/ConverterCivil2022.csproj b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2022/ConverterCivil2022.csproj index 15cd07f6d6..6b9ac54c54 100644 --- a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2022/ConverterCivil2022.csproj +++ b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2022/ConverterCivil2022.csproj @@ -4,7 +4,7 @@ netstandard2.0 Objects.Converter.Civil3D2022 Objects.Converter.Civil - $(DefineConstants);CIVIL2022 + $(DefineConstants);CIVIL2022;CIVIL;CIVIL2021_OR_GREATER;CIVIL2022_OR_GREATER Speckle.Objects.Converter.Civil2022 Objects.Converter.Civil2022 Converter for Civil3D 2022 diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2023/ConverterCivil2023.csproj b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2023/ConverterCivil2023.csproj index b0d497c59a..a2cbe48b3b 100644 --- a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2023/ConverterCivil2023.csproj +++ b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2023/ConverterCivil2023.csproj @@ -5,7 +5,7 @@ Objects.Converter.Civil3D2023 Objects.Converter.Civil Speckle.Objects.Converter.Civil2023 - $(DefineConstants);CIVIL2023 + $(DefineConstants);CIVIL2023;CIVIL;CIVIL2021_OR_GREATER;CIVIL2022_OR_GREATER;CIVIL2023_OR_GREATER Converter for Civil3D 2023 $(PackageTags) objects converter civil3d true diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2024/ConverterCivil2024.csproj b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2024/ConverterCivil2024.csproj index 760cb514e5..22ab7fcbb5 100644 --- a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2024/ConverterCivil2024.csproj +++ b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2024/ConverterCivil2024.csproj @@ -5,7 +5,7 @@ Objects.Converter.Civil3D2024 Objects.Converter.Civil Speckle.Objects.Converter.Civil2024 - $(DefineConstants);CIVIL2024 + $(DefineConstants);CIVIL2024;CIVIL;CIVIL2021_OR_GREATER;CIVIL2022_OR_GREATER;CIVIL2023_OR_GREATER;CIVIL2024_OR_GREATER Converter for Civil3D 2024 $(PackageTags) objects converter civil3d true diff --git a/Objects/Converters/ConverterAutocadCivil/ConverterCivil2025/ConverterCivil2025.csproj b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2025/ConverterCivil2025.csproj new file mode 100644 index 0000000000..51b5b83ded --- /dev/null +++ b/Objects/Converters/ConverterAutocadCivil/ConverterCivil2025/ConverterCivil2025.csproj @@ -0,0 +1,30 @@ + + + + net8.0 + enable + Objects.Converter.Civil2025 + Objects.Converter.Civil + $(DefineConstants);CIVIL2025;CIVIL;CIVIL2021_OR_GREATER;CIVIL2022_OR_GREATER;CIVIL2023_OR_GREATER;CIVIL2024_OR_GREATER;CIVIL2025_OR_GREATER + Speckle.Objects.Converter.Civil2025 + Objects.Converter.Civil2025 + Converter for Civil 3D 2025 + $(PackageTags) objects converter civil3d + true + False + + + + + + + + + + + + + + + diff --git a/Objects/Converters/ConverterCSI/ConverterCSIShared/ConverterCSIUtils.cs b/Objects/Converters/ConverterCSI/ConverterCSIShared/ConverterCSIUtils.cs index e9a33a27dc..61dd48d6f6 100644 --- a/Objects/Converters/ConverterCSI/ConverterCSIShared/ConverterCSIUtils.cs +++ b/Objects/Converters/ConverterCSI/ConverterCSIShared/ConverterCSIUtils.cs @@ -4,6 +4,7 @@ using Objects.Structural.CSI.Analysis; using System.Linq; using System; +using Speckle.Core.Logging; namespace Objects.Converter.CSI; @@ -26,14 +27,18 @@ public string ModelUnits() return _modelUnits; } - var units = Model.GetPresentUnits(); - if (units != 0) + eForce forceUnits = eForce.NotApplicable; + eLength lengthUnits = eLength.NotApplicable; + eTemperature temperatureUnits = eTemperature.NotApplicable; + _ = Model.GetPresentUnits_2(ref forceUnits, ref lengthUnits, ref temperatureUnits); + + if (lengthUnits == eLength.NotApplicable) { - string[] unitsCat = units.ToString().Split('_'); - _modelUnits = unitsCat[1]; - return _modelUnits; + throw new SpeckleException("Unable to retreive valid length units from the ETABS document"); } - return null; + + _modelUnits = lengthUnits.ToString(); + return _modelUnits; } public double ScaleToNative(double value, string units) diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.cs b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.cs index d2e3b4ac2c..7f1cf92c72 100644 --- a/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.cs +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks/ConverterNavisworks.cs @@ -9,7 +9,9 @@ namespace Objects.Converter.Navisworks; // ReSharper disable once UnusedType.Global public partial class ConverterNavisworks : ISpeckleConverter { -#if NAVMAN21 +#if NAVMAN22 + private static readonly string s_versionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2025); +#elif NAVMAN21 private static readonly string s_versionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2024); #elif NAVMAN20 private static readonly string s_versionedAppName = HostApplications.Navisworks.GetVersion(HostAppVersion.v2023); diff --git a/Objects/Converters/ConverterNavisworks/ConverterNavisworks2025/ConverterNavisworks2025.csproj b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2025/ConverterNavisworks2025.csproj new file mode 100644 index 0000000000..d0803a6eee --- /dev/null +++ b/Objects/Converters/ConverterNavisworks/ConverterNavisworks2025/ConverterNavisworks2025.csproj @@ -0,0 +1,23 @@ + + + SpeckleConverterNavisworks + Objects.Converter.Navisworks2025 + Objects.Converter.Navisworks + AnyCPU;x64 + bin\x64\$(Configuration) + true + $(DefineConstants);NAVMAN22 + netstandard2.0 + + + + + + + + + + + + + diff --git a/Objects/Converters/ConverterRevit/ConverterRevit2025/ConverterRevit2025.csproj b/Objects/Converters/ConverterRevit/ConverterRevit2025/ConverterRevit2025.csproj new file mode 100644 index 0000000000..39f1650e50 --- /dev/null +++ b/Objects/Converters/ConverterRevit/ConverterRevit2025/ConverterRevit2025.csproj @@ -0,0 +1,31 @@ + + + net8.0-windows + Objects.Converter.Revit + Objects.Converter.Revit2025 + $(DefineConstants);REVIT2025 + Speckle.Objects.Converter.Revit2025 + Objects.Converter.Revit2025 + Converter for Revit 2025 + $(PackageTags) objects converter revit + true + + + + + + + + + + + + + + + + + + + + diff --git a/Objects/Converters/ConverterRevit/ConverterRevitShared/ConversionUtils.cs b/Objects/Converters/ConverterRevit/ConverterRevitShared/ConversionUtils.cs index 49f4e09c6b..5aae514f7a 100644 --- a/Objects/Converters/ConverterRevit/ConverterRevitShared/ConversionUtils.cs +++ b/Objects/Converters/ConverterRevit/ConverterRevitShared/ConversionUtils.cs @@ -333,6 +333,13 @@ private void AddElementParamsToDict( continue; } + //ignore parameters that are not visible by the end users + //these could be set by plugins, and historically have conflited with our send operation + if (param.Definition is InternalDefinition internalDef && !internalDef.Visible) + { + continue; + } + var speckleParam = ParameterToSpeckle(param, internalName, isTypeParameter); paramDict[internalName] = speckleParam; } diff --git a/Objects/Converters/ConverterRevit/ConverterRevitShared/ConverterRevit.cs b/Objects/Converters/ConverterRevit/ConverterRevitShared/ConverterRevit.cs index 96f2d237bd..337f32a2f4 100644 --- a/Objects/Converters/ConverterRevit/ConverterRevitShared/ConverterRevit.cs +++ b/Objects/Converters/ConverterRevit/ConverterRevitShared/ConverterRevit.cs @@ -24,7 +24,9 @@ namespace Objects.Converter.Revit; public partial class ConverterRevit : ISpeckleConverter { -#if REVIT2024 +#if REVIT2025 + public static string RevitAppName = HostApplications.Revit.GetVersion(HostAppVersion.v2025); +#elif REVIT2024 public static string RevitAppName = HostApplications.Revit.GetVersion(HostAppVersion.v2024); #elif REVIT2023 public static string RevitAppName = HostApplications.Revit.GetVersion(HostAppVersion.v2023); @@ -658,7 +660,11 @@ public object ConvertToNativeObject(Base @object) return ProfileWallToNative(o); case BER.RevitFaceWall o: +#if REVIT2021 || REVIT2022 + return FaceWallToNative(o); +#else return FaceWallToNativeV2(o); +#endif case BE.Wall o: return WallToNative(o); diff --git a/Objects/Converters/ConverterRevit/ConverterRevitShared/PartialClasses/ConvertFaceWall.cs b/Objects/Converters/ConverterRevit/ConverterRevitShared/PartialClasses/ConvertFaceWall.cs index 70987eb976..ed33f35c26 100644 --- a/Objects/Converters/ConverterRevit/ConverterRevitShared/PartialClasses/ConvertFaceWall.cs +++ b/Objects/Converters/ConverterRevit/ConverterRevitShared/PartialClasses/ConvertFaceWall.cs @@ -170,17 +170,15 @@ public ApplicationObject FaceWallToNativeV2(RevitFaceWall speckleWall) } List notes = null; - var solid = BrepToNative(speckleWall.brep, out notes); - var faceReference = solid.Faces.get_Item(0); - var faceref = faceReference.Reference; - var freeform = CreateFreeformElementFamily(new List { solid }, speckleWall.id, "Mass"); + Solid solid = BrepToNative(speckleWall.brep, out notes); + DB.FamilyInstance freeform = CreateFreeformElementFamily(new List { solid }, speckleWall.id, "Mass"); Doc.Regenerate(); - faceref = GetFaceRef(freeform); + Reference faceref = GetFaceRef(freeform); + var revitWall = FaceWall.Create(Doc, wallType.Id, GetWallLocationLine(speckleWall.locationLine), faceref); - //Doc.Delete(freeform.Id); + SetInstanceParameters(revitWall, speckleWall); appObj.Update(status: ApplicationObject.State.Created, createdId: revitWall.UniqueId, convertedItem: revitWall); - //appObj = SetHostedElements(speckleWall, revitWall, appObj); } catch (Exception ex) when (!ex.IsFatal()) { diff --git a/Objects/Converters/ConverterRevit/ConverterRevitShared/PartialClasses/ConvertGroup.cs b/Objects/Converters/ConverterRevit/ConverterRevitShared/PartialClasses/ConvertGroup.cs index 8f53c4ed71..829d9b9fac 100644 --- a/Objects/Converters/ConverterRevit/ConverterRevitShared/PartialClasses/ConvertGroup.cs +++ b/Objects/Converters/ConverterRevit/ConverterRevitShared/PartialClasses/ConvertGroup.cs @@ -21,6 +21,7 @@ public Base GroupToSpeckle(Group revitGroup) @base["level"] = ConvertAndCacheLevel(revitGroup, BuiltInParameter.GROUP_LEVEL); AddHostedDependentElements(revitGroup, @base, elIdsToConvert.ToList()); + GetAllRevitParamsAndIds(@base, revitGroup); return @base; } diff --git a/Objects/Converters/ConverterRevit/Templates/2025/Block - Imperial.rft b/Objects/Converters/ConverterRevit/Templates/2025/Block - Imperial.rft new file mode 100644 index 0000000000..0d74d992c8 Binary files /dev/null and b/Objects/Converters/ConverterRevit/Templates/2025/Block - Imperial.rft differ diff --git a/Objects/Converters/ConverterRevit/Templates/2025/Block - Metric.rft b/Objects/Converters/ConverterRevit/Templates/2025/Block - Metric.rft new file mode 100644 index 0000000000..5e82cf475e Binary files /dev/null and b/Objects/Converters/ConverterRevit/Templates/2025/Block - Metric.rft differ diff --git a/Objects/Converters/ConverterRevit/Templates/2025/Generic Model - Imperial.rft b/Objects/Converters/ConverterRevit/Templates/2025/Generic Model - Imperial.rft new file mode 100644 index 0000000000..4de515cb0a Binary files /dev/null and b/Objects/Converters/ConverterRevit/Templates/2025/Generic Model - Imperial.rft differ diff --git a/Objects/Converters/ConverterRevit/Templates/2025/Generic Model - Metric.rft b/Objects/Converters/ConverterRevit/Templates/2025/Generic Model - Metric.rft new file mode 100644 index 0000000000..b08a7b2c43 Binary files /dev/null and b/Objects/Converters/ConverterRevit/Templates/2025/Generic Model - Metric.rft differ diff --git a/Objects/Converters/ConverterRevit/Templates/2025/Mass - Imperial.rft b/Objects/Converters/ConverterRevit/Templates/2025/Mass - Imperial.rft new file mode 100644 index 0000000000..583fb2fb81 Binary files /dev/null and b/Objects/Converters/ConverterRevit/Templates/2025/Mass - Imperial.rft differ diff --git a/Objects/Converters/ConverterRevit/Templates/2025/Mass - Metric.rft b/Objects/Converters/ConverterRevit/Templates/2025/Mass - Metric.rft new file mode 100644 index 0000000000..617867b156 Binary files /dev/null and b/Objects/Converters/ConverterRevit/Templates/2025/Mass - Metric.rft differ diff --git a/Objects/Objects.sln b/Objects/Objects.sln index 9945108d66..f32fc6b4a3 100644 --- a/Objects/Objects.sln +++ b/Objects/Objects.sln @@ -125,11 +125,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterNavisworks2024", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterRhino8", "Converters\ConverterRhinoGh\ConverterRhino8\ConverterRhino8.csproj", "{DB55FC55-0FE8-4622-AA0B-66F5EF9737B9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConverterGrasshopper8", "Converters\ConverterRhinoGh\ConverterGrasshopper8\ConverterGrasshopper8.csproj", "{738A607A-C51C-447B-AFBB-47D7FED47CA0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterGrasshopper8", "Converters\ConverterRhinoGh\ConverterGrasshopper8\ConverterGrasshopper8.csproj", "{738A607A-C51C-447B-AFBB-47D7FED47CA0}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{985946E0-ACEC-4EF7-92D6-E0B153271393}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Objects.Tests.Unit", "Tests\Objects.Tests.Unit\Objects.Tests.Unit.csproj", "{70AB0F97-B226-44F9-8CCE-0927A9C18037}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Objects.Tests.Unit", "Tests\Objects.Tests.Unit\Objects.Tests.Unit.csproj", "{70AB0F97-B226-44F9-8CCE-0927A9C18037}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConverterAutocad2025", "Converters\ConverterAutocadCivil\ConverterAutocad2025\ConverterAutocad2025.csproj", "{0E85DB68-4547-4059-83BD-D66F54F0201E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConverterCivil2025", "Converters\ConverterAutocadCivil\ConverterCivil2025\ConverterCivil2025.csproj", "{82C22520-8EFE-426B-8865-43965FA3DD87}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -491,6 +495,22 @@ Global {70AB0F97-B226-44F9-8CCE-0927A9C18037}.Release|Any CPU.Build.0 = Release|Any CPU {70AB0F97-B226-44F9-8CCE-0927A9C18037}.Release|x64.ActiveCfg = Release|Any CPU {70AB0F97-B226-44F9-8CCE-0927A9C18037}.Release|x64.Build.0 = Release|Any CPU + {0E85DB68-4547-4059-83BD-D66F54F0201E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E85DB68-4547-4059-83BD-D66F54F0201E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E85DB68-4547-4059-83BD-D66F54F0201E}.Debug|x64.ActiveCfg = Debug|Any CPU + {0E85DB68-4547-4059-83BD-D66F54F0201E}.Debug|x64.Build.0 = Debug|Any CPU + {0E85DB68-4547-4059-83BD-D66F54F0201E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E85DB68-4547-4059-83BD-D66F54F0201E}.Release|Any CPU.Build.0 = Release|Any CPU + {0E85DB68-4547-4059-83BD-D66F54F0201E}.Release|x64.ActiveCfg = Release|Any CPU + {0E85DB68-4547-4059-83BD-D66F54F0201E}.Release|x64.Build.0 = Release|Any CPU + {82C22520-8EFE-426B-8865-43965FA3DD87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {82C22520-8EFE-426B-8865-43965FA3DD87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82C22520-8EFE-426B-8865-43965FA3DD87}.Debug|x64.ActiveCfg = Debug|Any CPU + {82C22520-8EFE-426B-8865-43965FA3DD87}.Debug|x64.Build.0 = Debug|Any CPU + {82C22520-8EFE-426B-8865-43965FA3DD87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {82C22520-8EFE-426B-8865-43965FA3DD87}.Release|Any CPU.Build.0 = Release|Any CPU + {82C22520-8EFE-426B-8865-43965FA3DD87}.Release|x64.ActiveCfg = Release|Any CPU + {82C22520-8EFE-426B-8865-43965FA3DD87}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -556,6 +576,8 @@ Global {DB55FC55-0FE8-4622-AA0B-66F5EF9737B9} = {1A35077C-2936-4A3D-8D48-65F39F76D999} {738A607A-C51C-447B-AFBB-47D7FED47CA0} = {1A35077C-2936-4A3D-8D48-65F39F76D999} {70AB0F97-B226-44F9-8CCE-0927A9C18037} = {985946E0-ACEC-4EF7-92D6-E0B153271393} + {0E85DB68-4547-4059-83BD-D66F54F0201E} = {5419488F-6509-4F16-A342-BB2BE2689E00} + {82C22520-8EFE-426B-8865-43965FA3DD87} = {5419488F-6509-4F16-A342-BB2BE2689E00} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DA57EC2E-0A9E-4F59-B1F7-A65F76A74B74} @@ -564,6 +586,7 @@ Global 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*{0af5ba0f-0fea-463b-9877-f063892ea7de}*SharedItemsImports = 5 + Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{0e85db68-4547-4059-83bd-d66f54f0201e}*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 Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{1dc0a8f4-1f14-47e8-8456-9d8e9c0e6cff}*SharedItemsImports = 5 @@ -584,6 +607,7 @@ Global Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{63b3f901-7c14-4530-8a6f-ccad68586664}*SharedItemsImports = 5 Converters\ConverterBentley\ConverterBentleyShared\ConverterBentleyShared.projitems*{651f0278-3de2-4371-8586-70d3732f9770}*SharedItemsImports = 5 Converters\ConverterAutocadCivil\ConverterAutocadCivilShared\ConverterAutocadCivilShared.projitems*{6d1265b2-31fb-4096-9ec9-dd937a349b9c}*SharedItemsImports = 5 + Converters\ConverterRhinoGh\ConverterRhinoGhShared\ConverterRhinoGhShared.projitems*{738a607a-c51c-447b-afbb-47d7fed47ca0}*SharedItemsImports = 5 Converters\ConverterRevit\ConverterRevitShared\ConverterRevitShared.projitems*{73d708ca-e956-455a-be62-785b0cc79264}*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 diff --git a/SDK.slnf b/SDK.slnf index cb717b1bcb..6e1d487fed 100644 --- a/SDK.slnf +++ b/SDK.slnf @@ -4,8 +4,6 @@ "projects": [ "Automate\\Speckle.Automate.Sdk\\Speckle.Automate.Sdk.csproj", "Automate\\Tests\\Speckle.Automate.Sdk.Tests.Integration\\Speckle.Automate.Sdk.Tests.Integration.csproj", - "ConnectorCore\\BatchUploader.OperationDriver\\BatchUploader.OperationDriver.csproj", - "ConnectorCore\\BatchUploader.Sdk\\BatchUploader.Sdk.csproj", "Core\\Core\\Core.csproj", "Core\\Tests\\Speckle.Core.Tests.Integration\\Speckle.Core.Tests.Integration.csproj", "Core\\Tests\\Speckle.Core.Tests.Performance\\Speckle.Core.Tests.Performance.csproj", @@ -14,7 +12,7 @@ "Core\\Transports\\MongoDBTransport\\MongoDBTransport.csproj", "DesktopUI2\\DesktopUI2\\DesktopUI2.csproj", "Objects\\Objects\\Objects.csproj", - "Objects\\Tests\\Objects.Tests.Unit\\Objects.Tests.Unit.csproj", + "Objects\\Tests\\Objects.Tests.Unit\\Objects.Tests.Unit.csproj" ] } -} \ No newline at end of file +}