From c4f77eb5dfd8d229475f37af698bedea2b479292 Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 14:53:02 -0300 Subject: [PATCH 1/9] Remove R2019 support and fix build warnings - Drop R2019 from Build.props and solution (minimum is now R2020) - Condition System.Threading.Tasks.Extensions to non-net8.0-windows targets - Remove hardcoded TargetFramework/Nullable/ImplicitUsings from test project (Build.props already sets these per configuration) - Suppress MSB3277 for net47/net48 in tests (FluentAssertions System.Net.Http version conflict is harmless; tests only run under R2025/net8.0) - Add R2020 to CI/CD build matrix; drop spurious 4.8.x from dotnet-version setup Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/cd.yml | 6 +- .github/workflows/ci.yml | 6 +- Apibim.Revit.Extensions.sln | 70 ++++++++++++---------- Build.props | 17 +----- source/Apibim.Revit.Extensions.csproj | 5 ++ source/Extensions/AsyncTasksExecutor.cs | 2 + tests/Apibim.Revit.Extensions.Tests.csproj | 10 +++- 7 files changed, 60 insertions(+), 56 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index e068b5e..071b8f7 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - configuration: [R2021, R2022, R2023, R2024, R2025, R2026] + configuration: [R2020, R2021, R2022, R2023, R2024, R2025, R2026] steps: - name: Checkout @@ -21,9 +21,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: | - 8.0.x - 4.8.x + dotnet-version: 8.0.x - name: Restore run: dotnet restore source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj -c ${{ matrix.configuration }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae986df..1c26484 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - configuration: [R2021, R2022, R2023, R2024, R2025, R2026] + configuration: [R2020, R2021, R2022, R2023, R2024, R2025, R2026] steps: - name: Checkout @@ -22,9 +22,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: | - 8.0.x - 4.8.x + dotnet-version: 8.0.x - name: Restore run: dotnet restore source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj -c ${{ matrix.configuration }} diff --git a/Apibim.Revit.Extensions.sln b/Apibim.Revit.Extensions.sln index b5c77ad..f8ee881 100644 --- a/Apibim.Revit.Extensions.sln +++ b/Apibim.Revit.Extensions.sln @@ -13,38 +13,48 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apibim.Revit.Extensions.Tes EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 + R2020|Any CPU = R2020|Any CPU + R2021|Any CPU = R2021|Any CPU + R2022|Any CPU = R2022|Any CPU + R2023|Any CPU = R2023|Any CPU + R2024|Any CPU = R2024|Any CPU + R2025|Any CPU = R2025|Any CPU + R2026|Any CPU = R2026|Any CPU + R2027|Any CPU = R2027|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Debug|Any CPU.ActiveCfg = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Debug|Any CPU.Build.0 = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Debug|x64.ActiveCfg = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Debug|x64.Build.0 = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Debug|x86.ActiveCfg = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Debug|x86.Build.0 = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Release|Any CPU.ActiveCfg = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Release|Any CPU.Build.0 = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Release|x64.ActiveCfg = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Release|x64.Build.0 = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Release|x86.ActiveCfg = R2019|Any CPU - {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.Release|x86.Build.0 = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Debug|Any CPU.ActiveCfg = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Debug|Any CPU.Build.0 = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Debug|x64.ActiveCfg = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Debug|x64.Build.0 = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Debug|x86.ActiveCfg = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Debug|x86.Build.0 = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Release|Any CPU.ActiveCfg = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Release|Any CPU.Build.0 = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Release|x64.ActiveCfg = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Release|x64.Build.0 = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Release|x86.ActiveCfg = R2019|Any CPU - {18101238-64C3-4441-9B9B-04590F5286DE}.Release|x86.Build.0 = R2019|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2020|Any CPU.ActiveCfg = R2020|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2020|Any CPU.Build.0 = R2020|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2021|Any CPU.ActiveCfg = R2021|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2021|Any CPU.Build.0 = R2021|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2022|Any CPU.ActiveCfg = R2022|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2022|Any CPU.Build.0 = R2022|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2023|Any CPU.ActiveCfg = R2023|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2023|Any CPU.Build.0 = R2023|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2024|Any CPU.ActiveCfg = R2024|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2024|Any CPU.Build.0 = R2024|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2025|Any CPU.ActiveCfg = R2025|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2025|Any CPU.Build.0 = R2025|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2026|Any CPU.ActiveCfg = R2026|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2026|Any CPU.Build.0 = R2026|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2027|Any CPU.ActiveCfg = R2027|Any CPU + {C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}.R2027|Any CPU.Build.0 = R2027|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2020|Any CPU.ActiveCfg = R2020|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2020|Any CPU.Build.0 = R2020|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2021|Any CPU.ActiveCfg = R2021|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2021|Any CPU.Build.0 = R2021|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2022|Any CPU.ActiveCfg = R2022|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2022|Any CPU.Build.0 = R2022|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2023|Any CPU.ActiveCfg = R2023|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2023|Any CPU.Build.0 = R2023|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2024|Any CPU.ActiveCfg = R2024|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2024|Any CPU.Build.0 = R2024|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2025|Any CPU.ActiveCfg = R2025|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2025|Any CPU.Build.0 = R2025|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2026|Any CPU.ActiveCfg = R2026|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2026|Any CPU.Build.0 = R2026|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2027|Any CPU.ActiveCfg = R2027|Any CPU + {18101238-64C3-4441-9B9B-04590F5286DE}.R2027|Any CPU.Build.0 = R2027|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Build.props b/Build.props index 20983d6..a0eb51b 100644 --- a/Build.props +++ b/Build.props @@ -1,15 +1,9 @@ - - R2019;R2020;R2021;R2022;R2023;R2024;R2025;R2026;R2027 + R2020;R2021;R2022;R2023;R2024;R2025;R2026;R2027 AnyCPU - - - 2019 - net47 - 2020 net47 @@ -43,13 +37,11 @@ net8.0-windows - bin\$(Configuration)\ DEBUG;$(Configuration);REVIT_$(RevitVersion) - x64 default @@ -65,14 +57,9 @@ - + - diff --git a/source/Apibim.Revit.Extensions.csproj b/source/Apibim.Revit.Extensions.csproj index 4743e30..30d258c 100644 --- a/source/Apibim.Revit.Extensions.csproj +++ b/source/Apibim.Revit.Extensions.csproj @@ -15,4 +15,9 @@ false + + + + diff --git a/source/Extensions/AsyncTasksExecutor.cs b/source/Extensions/AsyncTasksExecutor.cs index 82068b2..73080e6 100644 --- a/source/Extensions/AsyncTasksExecutor.cs +++ b/source/Extensions/AsyncTasksExecutor.cs @@ -1,3 +1,5 @@ +using System.Threading.Tasks; + namespace Apibim.Revit.Extensions; /// diff --git a/tests/Apibim.Revit.Extensions.Tests.csproj b/tests/Apibim.Revit.Extensions.Tests.csproj index 35b88d7..6a822ad 100644 --- a/tests/Apibim.Revit.Extensions.Tests.csproj +++ b/tests/Apibim.Revit.Extensions.Tests.csproj @@ -1,10 +1,14 @@  - net8.0-windows false - enable - enable + + + + + $(NoWarn);MSB3277 From c0eb9f8d4d3d423b63ba826090402b832359ec3d Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 16:54:01 -0300 Subject: [PATCH 2/9] Fix dotnet CLI -c flag broken in .NET SDK 10 Replace -c with --configuration in all workflow commands. dotnet restore/build/test no longer accept the -c shorthand in SDK 10 and pass it raw to MSBuild, which rejects it with MSB1001. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/cd.yml | 6 +++--- .github/workflows/ci.yml | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 071b8f7..56ad3d4 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -24,13 +24,13 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj -c ${{ matrix.configuration }} + run: dotnet restore source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} - name: Build - run: dotnet build source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj -c ${{ matrix.configuration }} --no-restore + run: dotnet build source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} --no-restore - name: Pack - run: dotnet pack source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj -c ${{ matrix.configuration }} --no-build --output ./nupkgs + run: dotnet pack source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} --no-build --output ./nupkgs - name: Push to NuGet run: dotnet nuget push "./nupkgs/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1c26484..44eca5e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,10 +25,10 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj -c ${{ matrix.configuration }} + run: dotnet restore source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} - name: Build - run: dotnet build source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj -c ${{ matrix.configuration }} --no-restore + run: dotnet build source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} --no-restore test: runs-on: windows-latest @@ -44,10 +44,10 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore tests/Apibim.Revit.Extensions.Tests/Apibim.Revit.Extensions.Tests.csproj -c R2025 + run: dotnet restore tests/Apibim.Revit.Extensions.Tests/Apibim.Revit.Extensions.Tests.csproj --configuration R2025 - name: Test - run: dotnet test tests/Apibim.Revit.Extensions.Tests/Apibim.Revit.Extensions.Tests.csproj -c R2025 --no-restore --logger "trx;LogFileName=test-results.trx" + run: dotnet test tests/Apibim.Revit.Extensions.Tests/Apibim.Revit.Extensions.Tests.csproj --configuration R2025 --no-restore --logger "trx;LogFileName=test-results.trx" - name: Upload test results uses: actions/upload-artifact@v4 From 5f9c08db138a4bec4a1d35c5395acafcdfbf9b5d Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 16:58:36 -0300 Subject: [PATCH 3/9] Add .claude to .gitignore and untrack it Co-Authored-By: Claude Sonnet 4.6 --- .claude/settings.local.json | 20 -------------------- .gitignore | 3 +++ 2 files changed, 3 insertions(+), 20 deletions(-) delete mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 0c78cc7..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "permissions": { - "allow": [ - "WebFetch(domain:github.com)", - "Bash(git show-ref:*)", - "WebFetch(domain:raw.githubusercontent.com)", - "WebFetch(domain:api.github.com)", - "WebSearch", - "WebFetch(domain:www.nuget.org)", - "Bash(git:*)", - "Bash(bash:*)", - "Bash(powershell:*)", - "Bash(pwsh:*)", - "Edit(*)", - "Write(*)", - "Read(*)", - "Bash(dotnet:*)" - ] - } -} diff --git a/.gitignore b/.gitignore index af65b4b..c0746a8 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,9 @@ packages/ .DS_Store Thumbs.db +## Claude Code +.claude/ + ## Test results TestResults/ *.trx From 857678c1c3b763d3308f72f0f5827715872124d8 Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 17:01:54 -0300 Subject: [PATCH 4/9] Fix workflow: wrong project paths and SDK 10 configuration flag - Remove extra subdirectory from project paths: source/Apibim.Revit.Extensions/... -> source/Apibim.Revit.Extensions.csproj tests/Apibim.Revit.Extensions.Tests/... -> tests/Apibim.Revit.Extensions.Tests.csproj - Replace --configuration with -p:Configuration= (MSBuild property syntax) .NET SDK 10 passes flags through to MSBuild verbatim; MSBuild rejects both -c and --configuration, but accepts -p:Configuration= Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/cd.yml | 6 +++--- .github/workflows/ci.yml | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 56ad3d4..278297d 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -24,13 +24,13 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} + run: dotnet restore source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} - name: Build - run: dotnet build source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} --no-restore + run: dotnet build source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-restore - name: Pack - run: dotnet pack source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} --no-build --output ./nupkgs + run: dotnet pack source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-build --output ./nupkgs - name: Push to NuGet run: dotnet nuget push "./nupkgs/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 44eca5e..319c158 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,10 +25,10 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} + run: dotnet restore source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} - name: Build - run: dotnet build source/Apibim.Revit.Extensions/Apibim.Revit.Extensions.csproj --configuration ${{ matrix.configuration }} --no-restore + run: dotnet build source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-restore test: runs-on: windows-latest @@ -44,10 +44,10 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore tests/Apibim.Revit.Extensions.Tests/Apibim.Revit.Extensions.Tests.csproj --configuration R2025 + run: dotnet restore tests/Apibim.Revit.Extensions.Tests.csproj -p:Configuration=R2025 - name: Test - run: dotnet test tests/Apibim.Revit.Extensions.Tests/Apibim.Revit.Extensions.Tests.csproj --configuration R2025 --no-restore --logger "trx;LogFileName=test-results.trx" + run: dotnet test tests/Apibim.Revit.Extensions.Tests.csproj -p:Configuration=R2025 --no-restore --logger "trx;LogFileName=test-results.trx" - name: Upload test results uses: actions/upload-artifact@v4 From f665660e4e0c7b72ce36f88e49903f84b0bd70bd Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 17:08:46 -0300 Subject: [PATCH 5/9] Rewrite CI: build and test per Revit version - Single build-and-test job with matrix revit: [2020..2026] - Build tests project (which pulls source via ProjectReference) - Run tests against the built DLL directly to avoid SDK 10 flag issues - Publish per-version results via dorny/test-reporter - Upload .trx artifact per version Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/ci.yml | 51 ++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 319c158..1e51702 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,18 +2,23 @@ name: CI on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] jobs: - build: + build-and-test: + name: Revit ${{ matrix.revit }} runs-on: windows-latest + permissions: + checks: write + contents: read + strategy: fail-fast: false matrix: - configuration: [R2020, R2021, R2022, R2023, R2024, R2025, R2026] + revit: [2020, 2021, 2022, 2023, 2024, 2025, 2026] steps: - name: Checkout @@ -25,33 +30,29 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} + run: dotnet restore tests/Apibim.Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} - name: Build - run: dotnet build source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-restore + run: dotnet build tests/Apibim.Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} --no-restore - test: - runs-on: windows-latest - needs: build + - name: Run tests + run: > + dotnet test "tests/bin/R${{ matrix.revit }}/Apibim.Revit.Extensions.Tests.dll" + --logger "trx;LogFileName=results.trx" + --results-directory "${{ github.workspace }}/TestResults/${{ matrix.revit }}" - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup .NET - uses: actions/setup-dotnet@v4 + - name: Publish test results + uses: dorny/test-reporter@v1 + if: always() with: - dotnet-version: 8.0.x - - - name: Restore - run: dotnet restore tests/Apibim.Revit.Extensions.Tests.csproj -p:Configuration=R2025 - - - name: Test - run: dotnet test tests/Apibim.Revit.Extensions.Tests.csproj -p:Configuration=R2025 --no-restore --logger "trx;LogFileName=test-results.trx" + name: Tests – Revit ${{ matrix.revit }} + path: "TestResults/${{ matrix.revit }}/results.trx" + reporter: dotnet-trx - - name: Upload test results + - name: Upload test artifact uses: actions/upload-artifact@v4 if: always() with: - name: test-results - path: "**/TestResults/*.trx" + name: test-results-${{ matrix.revit }} + path: "TestResults/${{ matrix.revit }}/results.trx" + if-no-files-found: warn From edca24a9b9303a08933b0644ab8a8855122ef3b7 Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 17:34:49 -0300 Subject: [PATCH 6/9] Renamed files --- .github/workflows/cd.yml | 10 +++--- .github/workflows/ci.yml | 8 ++--- CLAUDE.md | 32 ++++++++----------- ...vit.Extensions.sln => Revit.Extensions.sln | 4 +-- source/Extensions/AsyncTasksExecutor.cs | 2 +- source/Extensions/DocumentExtensions.cs | 2 +- source/Extensions/ElementExtensions.cs | 2 +- source/Extensions/GeometryExtensions.cs | 2 +- source/Extensions/PointExtensions.cs | 2 +- ...ensions.csproj => Revit.Extensions.csproj} | 13 ++++---- tests/Extensions/AsyncTasksExecutorTests.cs | 2 +- tests/Extensions/GeometryExtensionsTests.cs | 2 +- tests/Extensions/PointExtensionsTests.cs | 2 +- ...s.csproj => Revit.Extensions.Tests.csproj} | 2 +- 14 files changed, 39 insertions(+), 46 deletions(-) rename Apibim.Revit.Extensions.sln => Revit.Extensions.sln (91%) rename source/{Apibim.Revit.Extensions.csproj => Revit.Extensions.csproj} (62%) rename tests/{Apibim.Revit.Extensions.Tests.csproj => Revit.Extensions.Tests.csproj} (92%) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 278297d..1bce3ef 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -3,7 +3,7 @@ name: CD on: push: tags: - - 'v*.*.*' + - "v*.*.*" jobs: pack-and-publish: @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - configuration: [R2020, R2021, R2022, R2023, R2024, R2025, R2026] + configuration: [R2020, R2021, R2022, R2023, R2024, R2025, R2026, R2027] steps: - name: Checkout @@ -24,13 +24,13 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} + run: dotnet restore source/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} - name: Build - run: dotnet build source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-restore + run: dotnet build source/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-restore - name: Pack - run: dotnet pack source/Apibim.Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-build --output ./nupkgs + run: dotnet pack source/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-build --output ./nupkgs - name: Push to NuGet run: dotnet nuget push "./nupkgs/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e51702..cf66dc8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - revit: [2020, 2021, 2022, 2023, 2024, 2025, 2026] + revit: [2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027] steps: - name: Checkout @@ -30,14 +30,14 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore tests/Apibim.Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} + run: dotnet restore tests/Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} - name: Build - run: dotnet build tests/Apibim.Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} --no-restore + run: dotnet build tests/Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} --no-restore - name: Run tests run: > - dotnet test "tests/bin/R${{ matrix.revit }}/Apibim.Revit.Extensions.Tests.dll" + dotnet test "tests/bin/R${{ matrix.revit }}/Revit.Extensions.Tests.dll" --logger "trx;LogFileName=results.trx" --results-directory "${{ github.workspace }}/TestResults/${{ matrix.revit }}" diff --git a/CLAUDE.md b/CLAUDE.md index f2d1019..157459d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,20 +1,19 @@ -# Apibim.Revit.Extensions — Developer Guide +# Revit.Extensions — Developer Guide ## Project overview Open-source library of Revit API extension methods, designed to support all Revit versions from 2019 to 2027. -Published as a NuGet package: `Apibim.Revit.Extensions`. +Published as a NuGet package: `Revit.Extensions`. ## Repository structure ``` -Apibim.Revit.Extensions/ +Revit.Extensions/ ├── .github/workflows/ │ ├── ci.yml ← Build + test on every push / PR │ └── cd.yml ← Pack + publish NuGet on tag v*.*.* ├── source/ -│ └── Apibim.Revit.Extensions/ -│ ├── Apibim.Revit.Extensions.csproj +│ ├── Revit.Extensions.csproj │ └── Extensions/ │ ├── ElementExtensions.cs │ ├── GeometryExtensions.cs @@ -22,8 +21,7 @@ Apibim.Revit.Extensions/ │ ├── DocumentExtensions.cs │ └── AsyncTasksExecutor.cs ├── tests/ -│ └── Apibim.Revit.Extensions.Tests/ -│ ├── Apibim.Revit.Extensions.Tests.csproj +│ ├── Revit.Extensions.Tests.csproj │ └── Extensions/ │ ├── GeometryExtensionsTests.cs │ ├── AsyncTasksExecutorTests.cs @@ -32,14 +30,13 @@ Apibim.Revit.Extensions/ ├── Directory.Build.props ← Imports Build.props; sets Nullable/ImplicitUsings/LangVersion ├── nuget.config ├── .gitignore -└── Apibim.Revit.Extensions.sln +└── Revit.Extensions.sln ``` ## Build configurations | Configuration | Revit | TargetFramework | |---------------|-------|-----------------| -| R2019 | 2019 | net47 | | R2020 | 2020 | net47 | | R2021 | 2021 | net48 | | R2022 | 2022 | net48 | @@ -55,23 +52,20 @@ Each configuration sets `REVIT_` as a compile-time constant (e.g. `REVIT_2 ```bash # Build for a specific Revit version -dotnet build source/Apibim.Revit.Extensions -c R2026 +dotnet build source/Revit.Extensions -c R2026 # Build all versions (PowerShell) foreach ($c in @("R2021","R2022","R2023","R2024","R2025","R2026")) { - dotnet build source/Apibim.Revit.Extensions -c $c + dotnet build source/Revit.Extensions -c $c } -# Run tests (always with R2025 — only version that works headless) -dotnet test tests/Apibim.Revit.Extensions.Tests -c R2025 - # Create NuGet package -dotnet pack source/Apibim.Revit.Extensions -c R2026 --output ./nupkgs +dotnet pack source/Revit.Extensions -c R2026 --output ./nupkgs ``` ## NuGet package -- **PackageId:** `Apibim.Revit.Extensions` +- **PackageId:** `Revit.Extensions` - **Version scheme:** `{RevitYear}.0.{patch}` → e.g. `2026.0.1` - **Trigger CD:** push a tag matching `v*.*.*` → `git tag v2026.0.1 && git push --tags` - **Secret required:** `NUGET_API_KEY` in GitHub repository secrets @@ -91,10 +85,10 @@ Example in `PointExtensions.cs`: ## Adding new extensions -1. Create `source/Apibim.Revit.Extensions/Extensions/MyExtensions.cs` -2. Use `namespace Apibim.Revit.Extensions;` +1. Create `source/Extensions/MyExtensions.cs` +2. Use `namespace Revit.Extensions;` 3. Mark class `public static` -4. Add unit tests in `tests/.../Extensions/MyExtensionsTests.cs` +4. Add unit tests in `tests/Extensions/MyExtensionsTests.cs` ## Notes diff --git a/Apibim.Revit.Extensions.sln b/Revit.Extensions.sln similarity index 91% rename from Apibim.Revit.Extensions.sln rename to Revit.Extensions.sln index f8ee881..ab86725 100644 --- a/Apibim.Revit.Extensions.sln +++ b/Revit.Extensions.sln @@ -5,11 +5,11 @@ VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{B8EFCA5F-814F-285C-A8CB-F00F14650265}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apibim.Revit.Extensions", "source\Apibim.Revit.Extensions.csproj", "{C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Revit.Extensions", "source\Revit.Extensions.csproj", "{C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apibim.Revit.Extensions.Tests", "tests\Apibim.Revit.Extensions.Tests.csproj", "{18101238-64C3-4441-9B9B-04590F5286DE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Revit.Extensions.Tests", "tests\Revit.Extensions.Tests.csproj", "{18101238-64C3-4441-9B9B-04590F5286DE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/source/Extensions/AsyncTasksExecutor.cs b/source/Extensions/AsyncTasksExecutor.cs index 73080e6..2e5e714 100644 --- a/source/Extensions/AsyncTasksExecutor.cs +++ b/source/Extensions/AsyncTasksExecutor.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -namespace Apibim.Revit.Extensions; +namespace Revit.Extensions; /// /// Helpers for executing asynchronous work synchronously inside the Revit event loop, diff --git a/source/Extensions/DocumentExtensions.cs b/source/Extensions/DocumentExtensions.cs index eac2768..61958e0 100644 --- a/source/Extensions/DocumentExtensions.cs +++ b/source/Extensions/DocumentExtensions.cs @@ -1,6 +1,6 @@ using Autodesk.Revit.DB; -namespace Apibim.Revit.Extensions; +namespace Revit.Extensions; /// /// Extension methods for . diff --git a/source/Extensions/ElementExtensions.cs b/source/Extensions/ElementExtensions.cs index b2a3c45..4fcff4c 100644 --- a/source/Extensions/ElementExtensions.cs +++ b/source/Extensions/ElementExtensions.cs @@ -1,7 +1,7 @@ using Autodesk.Revit.DB; using Autodesk.Revit.UI; -namespace Apibim.Revit.Extensions; +namespace Revit.Extensions; /// /// Extension methods for working with Revit elements and collectors. diff --git a/source/Extensions/GeometryExtensions.cs b/source/Extensions/GeometryExtensions.cs index 1cbd6a3..85bb39f 100644 --- a/source/Extensions/GeometryExtensions.cs +++ b/source/Extensions/GeometryExtensions.cs @@ -1,6 +1,6 @@ using Autodesk.Revit.DB; -namespace Apibim.Revit.Extensions; +namespace Revit.Extensions; /// /// Extension methods for working with Revit geometry types. diff --git a/source/Extensions/PointExtensions.cs b/source/Extensions/PointExtensions.cs index fc2cb6f..8c790f1 100644 --- a/source/Extensions/PointExtensions.cs +++ b/source/Extensions/PointExtensions.cs @@ -1,6 +1,6 @@ using Autodesk.Revit.DB; -namespace Apibim.Revit.Extensions; +namespace Revit.Extensions; /// /// Extension methods for working with Revit coordinate points. diff --git a/source/Apibim.Revit.Extensions.csproj b/source/Revit.Extensions.csproj similarity index 62% rename from source/Apibim.Revit.Extensions.csproj rename to source/Revit.Extensions.csproj index 30d258c..fea441e 100644 --- a/source/Apibim.Revit.Extensions.csproj +++ b/source/Revit.Extensions.csproj @@ -1,14 +1,14 @@ - Apibim.Revit.Extensions - Apibim.Revit.Extensions + Revit.Extensions + Revit.Extensions $(RevitVersion).0.1 - Apibim.Revit.Extensions - Apibim - Apibim.com + Revit.Extensions + Apibim SpA + com Extension methods for Autodesk Revit API https://github.com/apibim/Revit.Extensions MIT @@ -16,8 +16,7 @@ - + diff --git a/tests/Extensions/AsyncTasksExecutorTests.cs b/tests/Extensions/AsyncTasksExecutorTests.cs index a12798c..8c14bab 100644 --- a/tests/Extensions/AsyncTasksExecutorTests.cs +++ b/tests/Extensions/AsyncTasksExecutorTests.cs @@ -1,7 +1,7 @@ using FluentAssertions; using Xunit; -namespace Apibim.Revit.Extensions.Tests; +namespace Revit.Extensions.Tests; public class AsyncTasksExecutorTests { diff --git a/tests/Extensions/GeometryExtensionsTests.cs b/tests/Extensions/GeometryExtensionsTests.cs index 33a0557..b351e5c 100644 --- a/tests/Extensions/GeometryExtensionsTests.cs +++ b/tests/Extensions/GeometryExtensionsTests.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Xunit; -namespace Apibim.Revit.Extensions.Tests; +namespace Revit.Extensions.Tests; /// /// Tests for . diff --git a/tests/Extensions/PointExtensionsTests.cs b/tests/Extensions/PointExtensionsTests.cs index eb7262f..1649595 100644 --- a/tests/Extensions/PointExtensionsTests.cs +++ b/tests/Extensions/PointExtensionsTests.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Xunit; -namespace Apibim.Revit.Extensions.Tests; +namespace Revit.Extensions.Tests; /// /// Tests for . diff --git a/tests/Apibim.Revit.Extensions.Tests.csproj b/tests/Revit.Extensions.Tests.csproj similarity index 92% rename from tests/Apibim.Revit.Extensions.Tests.csproj rename to tests/Revit.Extensions.Tests.csproj index 6a822ad..2dc9fe1 100644 --- a/tests/Apibim.Revit.Extensions.Tests.csproj +++ b/tests/Revit.Extensions.Tests.csproj @@ -12,7 +12,7 @@ - + From 909df83a95dadfd21a03e9ece22fbd59379ef5cb Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 17:48:12 -0300 Subject: [PATCH 7/9] Updated file system --- .github/workflows/cd.yml | 6 +- .github/workflows/ci.yml | 6 +- CLAUDE.md | 8 +- README.md | 140 +++++++++++++++++- .../Extensions/AsyncTasksExecutorTests.cs | 0 .../Extensions/GeometryExtensionsTests.cs | 0 .../Extensions/PointExtensionsTests.cs | 0 .../Revit.Extensions.Tests.csproj | 2 +- Revit.Extensions.sln | 4 +- .../Extensions/AsyncTasksExecutor.cs | 0 .../Extensions/DocumentExtensions.cs | 0 .../Extensions/ElementExtensions.cs | 0 .../Extensions/GeometryExtensions.cs | 0 .../Extensions/PointExtensions.cs | 0 .../Revit.Extensions.csproj | 5 + 15 files changed, 157 insertions(+), 14 deletions(-) rename {tests => Revit.Extensions.Tests}/Extensions/AsyncTasksExecutorTests.cs (100%) rename {tests => Revit.Extensions.Tests}/Extensions/GeometryExtensionsTests.cs (100%) rename {tests => Revit.Extensions.Tests}/Extensions/PointExtensionsTests.cs (100%) rename {tests => Revit.Extensions.Tests}/Revit.Extensions.Tests.csproj (92%) rename {source => Revit.Extensions}/Extensions/AsyncTasksExecutor.cs (100%) rename {source => Revit.Extensions}/Extensions/DocumentExtensions.cs (100%) rename {source => Revit.Extensions}/Extensions/ElementExtensions.cs (100%) rename {source => Revit.Extensions}/Extensions/GeometryExtensions.cs (100%) rename {source => Revit.Extensions}/Extensions/PointExtensions.cs (100%) rename {source => Revit.Extensions}/Revit.Extensions.csproj (84%) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 1bce3ef..c119f0e 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -24,13 +24,13 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore source/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} + run: dotnet restore Revit.Extensions/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} - name: Build - run: dotnet build source/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-restore + run: dotnet build Revit.Extensions/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-restore - name: Pack - run: dotnet pack source/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-build --output ./nupkgs + run: dotnet pack Revit.Extensions/Revit.Extensions.csproj -p:Configuration=${{ matrix.configuration }} --no-build --output ./nupkgs - name: Push to NuGet run: dotnet nuget push "./nupkgs/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf66dc8..96c47ea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,14 +30,14 @@ jobs: dotnet-version: 8.0.x - name: Restore - run: dotnet restore tests/Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} + run: dotnet restore Revit.Extensions.Tests/Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} - name: Build - run: dotnet build tests/Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} --no-restore + run: dotnet build Revit.Extensions.Tests/Revit.Extensions.Tests.csproj -p:Configuration=R${{ matrix.revit }} --no-restore - name: Run tests run: > - dotnet test "tests/bin/R${{ matrix.revit }}/Revit.Extensions.Tests.dll" + dotnet test "Revit.Extensions.Tests/bin/R${{ matrix.revit }}/Revit.Extensions.Tests.dll" --logger "trx;LogFileName=results.trx" --results-directory "${{ github.workspace }}/TestResults/${{ matrix.revit }}" diff --git a/CLAUDE.md b/CLAUDE.md index 157459d..925b1c3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,7 +12,7 @@ Revit.Extensions/ ├── .github/workflows/ │ ├── ci.yml ← Build + test on every push / PR │ └── cd.yml ← Pack + publish NuGet on tag v*.*.* -├── source/ +├── Revit.Extensions/ │ ├── Revit.Extensions.csproj │ └── Extensions/ │ ├── ElementExtensions.cs @@ -20,7 +20,7 @@ Revit.Extensions/ │ ├── PointExtensions.cs │ ├── DocumentExtensions.cs │ └── AsyncTasksExecutor.cs -├── tests/ +├── Revit.Extensions.Tests/ │ ├── Revit.Extensions.Tests.csproj │ └── Extensions/ │ ├── GeometryExtensionsTests.cs @@ -85,10 +85,10 @@ Example in `PointExtensions.cs`: ## Adding new extensions -1. Create `source/Extensions/MyExtensions.cs` +1. Create `Revit.Extensions/Extensions/MyExtensions.cs` 2. Use `namespace Revit.Extensions;` 3. Mark class `public static` -4. Add unit tests in `tests/Extensions/MyExtensionsTests.cs` +4. Add unit tests in `Revit.Extensions.Tests/Extensions/MyExtensionsTests.cs` ## Notes diff --git a/README.md b/README.md index 184e7ea..e0cc8fd 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,140 @@ # Revit.Extensions -The unofficial Extensions for Revit API + +[![CI](https://github.com/apibim/Revit.Extensions/actions/workflows/ci.yml/badge.svg)](https://github.com/apibim/Revit.Extensions/actions/workflows/ci.yml) +[![NuGet](https://img.shields.io/nuget/v/Revit.Extensions?color=blue)](https://www.nuget.org/packages/Revit.Extensions) +[![NuGet Downloads](https://img.shields.io/nuget/dt/Revit.Extensions)](https://www.nuget.org/packages/Revit.Extensions) +[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) + +A collection of extension methods for the **Autodesk Revit API**, designed to reduce boilerplate and make Revit add-in development more expressive. Supports **Revit 2020 – 2027**. + +--- + +## Installation + +``` +dotnet add package Revit.Extensions +``` + +Or search for **`Revit.Extensions`** in the NuGet Package Manager inside Visual Studio. + +--- + +## Revit version support + +| Revit | Target framework | NuGet version | +| ----- | ---------------- | ------------- | +| 2020 | net47 | 2020.0.\* | +| 2021 | net48 | 2021.0.\* | +| 2022 | net48 | 2022.0.\* | +| 2023 | net48 | 2023.0.\* | +| 2024 | net48 | 2024.0.\* | +| 2025 | net8.0-windows | 2025.0.\* | +| 2026 | net8.0-windows | 2026.0.\* | +| 2027 | net8.0-windows | 2027.0.\* | + +The package automatically targets the correct framework — no manual configuration needed. + +--- + +## API reference + +### `GeometryExtensions` + +Helpers for working with Revit geometry types (`XYZ`, `Outline`, `BoundingBoxXYZ`). + +```csharp +using Revit.Extensions; + +// Convert XYZ ↔ value tuple +XYZ point = new XYZ(1.0, 2.0, 3.0); +(double X, double Y, double Z) vec = point.ToVector(); // (1.0, 2.0, 3.0) +XYZ restored = vec.ToXYZ(); // XYZ(1.0, 2.0, 3.0) + +// Expand an Outline uniformly (default: 10 ft) +Outline outline = new Outline(new XYZ(0, 0, 0), new XYZ(5, 5, 5)); +Outline expanded = outline.Extend(size: 2); // min −2, max +2 in every axis + +// Transform a BoundingBoxXYZ from local to world space +BoundingBoxXYZ bbox = element.get_BoundingBox(view); +BoundingBoxXYZ? worldBbox = bbox.TransformBoundingBox(); +``` + +--- + +### `PointExtensions` + +Unit conversion for `XYZ` coordinates using Revit's `UnitUtils`. + +```csharp +using Autodesk.Revit.DB; +using Revit.Extensions; + +// Revit stores coordinates in feet internally. +// Convert a point to meters (Revit 2021+): +XYZ pointInFeet = new XYZ(3.28084, 0, 0); +XYZ pointInMeters = pointInFeet.Recalculate(UnitTypeId.Meters); +// → XYZ(1.0, 0, 0) +``` + +> **Revit 2020** uses the legacy `DisplayUnitType` enum — the overload is selected automatically via conditional compilation. + +--- + +### `ElementExtensions` + +Helpers for collecting elements and grids from the active document. + +```csharp +using Revit.Extensions; + +// Collect selected elements, or fall back to all FamilyInstances + HostObjects in the active view +IList elements = ElementExtensions.GetAllElementOrSelected(uiDocument); + +// Get all grids from the level closest to elevation 0 +IList grids = ElementExtensions.GetAllGridFromFirstLevel(document, out string? levelName); +if (levelName is not null) + TaskDialog.Show("Grids", $"Found {grids.Count} grids on level '{levelName}'."); +``` + +--- + +### `AsyncTasksExecutor` + +Run async code synchronously inside the Revit event loop, where `async/await` on the main thread is unsupported. + +```csharp +using Revit.Extensions; + +// Execute a Task synchronously +string result = AsyncTasksExecutor.Execute(async () => +{ + await Task.Delay(100); + return "done"; +}); + +// Execute a ValueTask synchronously +int value = AsyncTasksExecutor.Execute(async () => +{ + await Task.Yield(); + return 42; +}); +``` + +--- + +## Contributing + +Contributions are welcome! Please open an issue or submit a pull request. + +1. Fork the repository +2. Create a feature branch: `git checkout -b feature/my-extension` +3. Add your extension in `Revit.Extensions/Extensions/` with a corresponding test in `tests/Extensions/` +4. Open a pull request against `main` + +See [CLAUDE.md](CLAUDE.md) for build commands and project conventions. + +--- + +## License + +MIT © [Apibim SpA](https://apibim.com) diff --git a/tests/Extensions/AsyncTasksExecutorTests.cs b/Revit.Extensions.Tests/Extensions/AsyncTasksExecutorTests.cs similarity index 100% rename from tests/Extensions/AsyncTasksExecutorTests.cs rename to Revit.Extensions.Tests/Extensions/AsyncTasksExecutorTests.cs diff --git a/tests/Extensions/GeometryExtensionsTests.cs b/Revit.Extensions.Tests/Extensions/GeometryExtensionsTests.cs similarity index 100% rename from tests/Extensions/GeometryExtensionsTests.cs rename to Revit.Extensions.Tests/Extensions/GeometryExtensionsTests.cs diff --git a/tests/Extensions/PointExtensionsTests.cs b/Revit.Extensions.Tests/Extensions/PointExtensionsTests.cs similarity index 100% rename from tests/Extensions/PointExtensionsTests.cs rename to Revit.Extensions.Tests/Extensions/PointExtensionsTests.cs diff --git a/tests/Revit.Extensions.Tests.csproj b/Revit.Extensions.Tests/Revit.Extensions.Tests.csproj similarity index 92% rename from tests/Revit.Extensions.Tests.csproj rename to Revit.Extensions.Tests/Revit.Extensions.Tests.csproj index 2dc9fe1..1ea6a18 100644 --- a/tests/Revit.Extensions.Tests.csproj +++ b/Revit.Extensions.Tests/Revit.Extensions.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/Revit.Extensions.sln b/Revit.Extensions.sln index ab86725..02c8a33 100644 --- a/Revit.Extensions.sln +++ b/Revit.Extensions.sln @@ -5,11 +5,11 @@ VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{B8EFCA5F-814F-285C-A8CB-F00F14650265}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Revit.Extensions", "source\Revit.Extensions.csproj", "{C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Revit.Extensions", "Revit.Extensions\Revit.Extensions.csproj", "{C5E9459C-38FB-4F95-98BD-FFBB9B075D7A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Revit.Extensions.Tests", "tests\Revit.Extensions.Tests.csproj", "{18101238-64C3-4441-9B9B-04590F5286DE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Revit.Extensions.Tests", "Revit.Extensions.Tests\Revit.Extensions.Tests.csproj", "{18101238-64C3-4441-9B9B-04590F5286DE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/source/Extensions/AsyncTasksExecutor.cs b/Revit.Extensions/Extensions/AsyncTasksExecutor.cs similarity index 100% rename from source/Extensions/AsyncTasksExecutor.cs rename to Revit.Extensions/Extensions/AsyncTasksExecutor.cs diff --git a/source/Extensions/DocumentExtensions.cs b/Revit.Extensions/Extensions/DocumentExtensions.cs similarity index 100% rename from source/Extensions/DocumentExtensions.cs rename to Revit.Extensions/Extensions/DocumentExtensions.cs diff --git a/source/Extensions/ElementExtensions.cs b/Revit.Extensions/Extensions/ElementExtensions.cs similarity index 100% rename from source/Extensions/ElementExtensions.cs rename to Revit.Extensions/Extensions/ElementExtensions.cs diff --git a/source/Extensions/GeometryExtensions.cs b/Revit.Extensions/Extensions/GeometryExtensions.cs similarity index 100% rename from source/Extensions/GeometryExtensions.cs rename to Revit.Extensions/Extensions/GeometryExtensions.cs diff --git a/source/Extensions/PointExtensions.cs b/Revit.Extensions/Extensions/PointExtensions.cs similarity index 100% rename from source/Extensions/PointExtensions.cs rename to Revit.Extensions/Extensions/PointExtensions.cs diff --git a/source/Revit.Extensions.csproj b/Revit.Extensions/Revit.Extensions.csproj similarity index 84% rename from source/Revit.Extensions.csproj rename to Revit.Extensions/Revit.Extensions.csproj index fea441e..80a8220 100644 --- a/source/Revit.Extensions.csproj +++ b/Revit.Extensions/Revit.Extensions.csproj @@ -12,9 +12,14 @@ Extension methods for Autodesk Revit API https://github.com/apibim/Revit.Extensions MIT + README.md false + + + + From 11267c7459153c02eda76d0b56c1810be7029e12 Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 17:56:50 -0300 Subject: [PATCH 8/9] Add README and NuGet package icon support - Add icon.png reference to README header - Add PackageIcon and README to NuGet package via csproj Co-Authored-By: Claude Sonnet 4.6 --- README.md | 5 +++++ Revit.Extensions/Revit.Extensions.csproj | 2 ++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index e0cc8fd..8468b0a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +
+ Revit.Extensions + # Revit.Extensions [![CI](https://github.com/apibim/Revit.Extensions/actions/workflows/ci.yml/badge.svg)](https://github.com/apibim/Revit.Extensions/actions/workflows/ci.yml) @@ -5,6 +8,8 @@ [![NuGet Downloads](https://img.shields.io/nuget/dt/Revit.Extensions)](https://www.nuget.org/packages/Revit.Extensions) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) +
+ A collection of extension methods for the **Autodesk Revit API**, designed to reduce boilerplate and make Revit add-in development more expressive. Supports **Revit 2020 – 2027**. --- diff --git a/Revit.Extensions/Revit.Extensions.csproj b/Revit.Extensions/Revit.Extensions.csproj index 80a8220..5b427c0 100644 --- a/Revit.Extensions/Revit.Extensions.csproj +++ b/Revit.Extensions/Revit.Extensions.csproj @@ -13,11 +13,13 @@ https://github.com/apibim/Revit.Extensions MIT README.md + icon.png false + From 17a3f030376473858147330a934ddec230bff370 Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 28 Feb 2026 18:38:17 -0300 Subject: [PATCH 9/9] ci: remove Revit 2027 from build matrix --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 96c47ea..a11049f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - revit: [2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027] + revit: [2020, 2021, 2022, 2023, 2024, 2025, 2026] steps: - name: Checkout