* Bjorn/cnx 1359 have a setting in UI whether include or not (#646) * feat(revit): linked model settings * docs: cache invalidation note * Feat(revit): linked models POC (#656) * cleanup on RefreshElementsIdsOnSender * POC for multiple and copied linked models * fix render materials for copied linked models * comment * comment * split linked models with collections * style: ci potential null on key * style: not null --------- Co-authored-by: Björn <steinhagen.bjoern@gmail.com> * feat(revit): sending linked model poc round two (#657) * Added IFC app name (#648) * test: add tests for threadcontext (#651) * add tests for threadcontext * add test for extensions * remove needed usage * fix for looking for model store (#654) Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com> * test: Send Operation tests (#652) * add tests for threadcontext * add test for extensions * remove needed usage * move cancellation * Only add send operation tests --------- Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com> * chore (autocad/civil): add regen after receive (#650) * regenerates doc * moves regen to receive base binding * Update AutocadReceiveBaseBinding.cs * feat: linked model send responsive to ui - current throw just a placeholder - small variable name refactor * fix: object reference not set to an instance of an object * fix: display value extractor * refactor: converterSettings as readonly field * feat: warning in response to ui setting not enabled * docs: todos etc. * Revert "Merge branch 'dev' into bjorn/cnx-1360-get-linked-models-on-send-function-according-to-setting" This reverts commit7202058a98, reversing changes made to4bc9ec2352. --------- Co-authored-by: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com> Co-authored-by: Adam Hathcock <adamhathcock@users.noreply.github.com> Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com> Co-authored-by: Claire Kuang <kuang.claire@gmail.com> * fix: transform needed to be inversed (#659) * feat(revit): linked models send by category (#666) * docs: notes on collection filtering * feature: RevitCategoriesFilter with linked models too poc * docs: notes * feat(revit): commit structure (#675) * feat: collection structure switch - poc - if linked models, send nested - if not linked, send flat * docs: comments on updates * docs: comment on exception swallowing * fix: nullability * refactor: linked model helper class and refactor (#682) * fix: premature processing of linked models - add early check for linked models setting - skips expensive element collection for linked models when disabled - add empty document contexts for linked models when disabled to maintain warning generation (HACK) - improve code readability with clearer variable names and comments * refactor: category ids outside of linked model processing - inefficient to repeat for every document * fix: improve separation of concerns for linked model handling - extract linked model processing to a dedicated method - add IsLinkedDocument flag to DocumentToConvert class - move linked model warning generation to RevitRootObjectBuilder - make RevitSendBinding responsible only for element collection * refactor: dedicated LinkedModelHandler class for linked model processing - extract linked model element collection logic to a separate class - improve separation of concerns between flow control and element collection - add clear documentation explaining the responsibility boundaries * fix: duplicate if check still floating around * docs: over-explaining myself * Fix(revit): do not use converter settings in element unpacker (#687) * fix resetting the selected object ids after collecting the elements * Pass document to element unpacker for the sake of linked models * fix: send by categories mode --------- Co-authored-by: Björn <steinhagen.bjoern@gmail.com> * fix(revit): handle multiple linked model instances with transform hashing (#688) * feat: linked model transform caching in RevitRootObjectBuilder Add transform-specific hashing to properly handle multiple instances of the same linked model. Uses transform properties to create a unique suffix for the applicationId, preventing cached objects from being incorrectly reused across different transform contexts. * more comments --------- Co-authored-by: oguzhankoral <oguzhankoral@gmail.com> * fix: handle null elements when unpacking linked model groups - add null element check before GroupBy in ElementUnpacker to prevent NullReferenceException - improve robustness when processing groups in linked models - add documentation explaining linked model element handling throughout UnpackElements method - edge case where group member elements might not resolve properly in linked contexts * make linked model setting true by default * Fix(revit): illegal attempt to modify document (#700) * Run refresh object ids in revit task * Proper not null * await instead .result * feat(revit): collection structure for multiple linked model instances (#701) * feat: suffix for instances of linked model * Extract out GetIdFromDocumentToConvert --------- Co-authored-by: oguzhankoral <oguzhankoral@gmail.com> * Correct receive default setting for linked models even if irrevelant * Fix post conflict * Cleanup the code * Add comment --------- Co-authored-by: Björn Steinhagen <steinhagen.bjoern@gmail.com> Co-authored-by: oguzhankoral <oguzhankoral@gmail.com> Co-authored-by: Oğuzhan Koral <45078678+oguzhankoral@users.noreply.github.com> Co-authored-by: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com> Co-authored-by: Adam Hathcock <adamhathcock@users.noreply.github.com> Co-authored-by: Claire Kuang <kuang.claire@gmail.com>

Speckle | Sharp | Connectors
Speckle is the first AEC data hub that connects with your favorite AEC tools. Speckle exists to overcome the challenges of working in a fragmented industry where communication, creative workflows, and the exchange of data are often hindered by siloed software and processes. It is here to make the industry better.
.NET Desktop UI, Connectors, and Converters
Repo structure
This repo is the home of our next-generation Speckle .NET projects:
- Desktop UI
DUI3: our next generation Desktop User Interface for all connectors.
- Speckle Connectors
Autocad Connector: for Autodesk AutoCAD and Civil3D 2022+Rhino Connector: for McNeel Rhino 7+Revit Connector: for Autodesk Revit 2022+ArcGIS Connector: for Esri ArcGISTekla Connector: for Trimble Tekla 2024
- Speckle Converters
Autocad Converter: for Autodesk AutoCAD 2022+Civil3d Converter: for Autodesk Civil3D 2022+Rhino Converter: for McNeel Rhino 7+Revit Converter: for Autodesk Revit 2023+ArcGIS Converter: for Esri ArcGISTekla Converter: for Trimble Tekla 2024
- SDK
SDK: Autofac module, connector utilities, and dependency injection.
Other repos
Make sure to also check and ⭐️ these other Speckle next generation repositories:
speckle-sharp-sdk: our csharp SDK for next gen connectors and developmentspeckle-sketchup: Sketchup connectorspeckle-powerbi: PowerBi connector- and more connectors & tooling!
Developing and Debugging
Clone this repo. Each section has its own readme, so follow each readme for specific build and debug instructions.
Issues or questions? We encourage everyone interested to debug / hack / contribute / give feedback to this project.
A note on Accounts: The connectors themselves don't have features to manage your Speckle accounts; this functionality is delegated to the Speckle Manager desktop app. You can install it from here.
Local Builds
For good development experience and environment setup, run the commands below as needed.
Formatting
We're using CSharpier to format our code. You can install Csharpier in a few ways:
- Install CSharpier as a local tool and reformat from CLI
dotnet tool install csharpier dotnet csharpier - Install CSharpier as a global tool and reformat from CLI
dotnet tool install csharpier -g dotnet csharpier - Install the CSharpier extension for Visual Studio or Rider.
For best DX, we recommend turning on CSharpier'sreformat on savesetting if you've installed it in your IDE.
Clean Locks
We're using npm package locks to store exact and versioned dependency trees. Occasionally you will need to clean your local package-lock files, eg when switching between Speckle.Connectors.sln and Local.sln.
Run this command in CLI to delete all package.lock.json files before a restore:
.\build.ps1 clean-locks
Deep Clean
To make sure your local environment is ready for a clean build, run this command to delete all bin and obj directories and restore all projects:
.\build.ps1 deep-clean
Deep Clean Local
This is for users of the Local.sln solution:
To make sure your local environment is ready for a clean build, run this command to delete all bin and obj directories and restore all projects:
.\build.ps1 deep-clean-local
Local development with SDK changes
If you'd like to make changes to the speckle-sharp-sdk side-by-side with changes to this repo's projects, use **Local.sln**.
This solution includes the Core and Objects projects from the speckle-sharp-sdk repo, and uses a new Configuration to create a build directory alongside Debug and Release.
Warning
Using
Local.slnwill modify all your package locks. Don't check these in! Revert with theclean-lockscommand or use the regular solution to revert once your changes are made.
Security and Licensing
Security
For any security vulnerabilities or concerns, please contact us directly at security[at]speckle.systems.
License
Unless otherwise described, the code in this repository is licensed under the Apache-2.0 License. Please note that some modules, extensions or code herein might be otherwise licensed. This is indicated either in the root of the containing folder under a different license file, or in the respective file's header. If you have any questions, don't hesitate to get in touch with us via email.