Skip to content

sow/2026-Q3: SAM-BIM Q3 2026 updates - #176

Merged
michaldengusiak merged 32 commits into
HoareLea:masterfrom
SAM-BIM:sow/2026-Q3
Oct 6, 2026
Merged

michaldengusiak merged 32 commits into
HoareLea:masterfrom
SAM-BIM:sow/2026-Q3

Conversation

@michaldengusiak

Copy link
Copy Markdown
Contributor

Summary

Brings the SAM-BIM sow/2026-Q3 line of work into master (21 non-merge commits; 165 files changed, 230913 insertions(+), 1443165 deletions(-)).

Main changes

  • docs: record merged .NET Framework app.config cleanup in PROJECT_PROGRESS
  • build: remove dead .NET Framework app.config leftovers
  • Add AI agent instructions and project progress tracking
  • fix: migrate energy analysis model creation off the deprecated Revit 2027 API
  • perf: precompute the TagSpaces duplicate scan per view
  • perf: narrow the TagElements duplicate scan with ElementOwnerViewFilter
  • fix: map the remaining legacy spec names in Query.ForgeTypeId
  • fix: address Codex review on TagElements duplicate scan
  • perf: optimize Modify.TagElements per-view hot loop
  • docs: point stale BuildAlls_v3 comment reference at BuildAlls_v4
  • ci: build and snapshot Revit 2027 (fix Wall normals #13)
  • feat: add Revit 2027 support (supported range now 2025-2027)

(Full list in the commit history.)

Validation

Changes were merged through reviewed PRs on the SAM-BIM fork, with CI/builds run there; no further validation was run for this upstream PR.

Compatibility notes

Includes AGENTS.md / PROJECT_PROGRESS.md project-continuity files where present. Dependent SAM repos are being submitted in parallel from the same branch name; merge order should follow the SAM core dependency chain.

🤖 Generated with Claude Code

michaldengusiak and others added 30 commits June 28, 2026 19:29
SAM_Systems now consumes SAM_Mollier's built DLLs (the new
SAM.Analytical.Systems.Mollier bridge references
..\..\..\SAM_Mollier\build\SAM.*.Mollier.dll), so SAM_Systems.sln must be
restored/built after SAM_Mollier. Reorder the dependency build list so
SAM_Mollier precedes SAM_Systems while SAM_Systems stays ahead of SAM_Windows
(canonical order: SAM_Psychrometrics -> SAM_Mollier -> SAM_Systems ->
SAM_Windows), matching SAM_Deploy/BuildAll_Release_net.csproj. Without this the
build breaks once the SAM_Systems Mollier bridge lands on sow/2026-Q3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…Revit (#7)

* fix: implement new IGH_SAMComponent members (MinCompatibleVersion, ObsoleteSeverity) for SAM.ReconstructElement and SAM.TransactionalChain

* fix: add missing SPDX license headers to Revit SAM component base classes

* ci: resolve deps to canonical sow quarter branch on push builds

The dependency-clone step derived the sibling branch from head_ref/base_ref
(PR) or ref_name (push). On push events to a feature branch off a quarter
branch (e.g. sow/2026-Q3-update-optimization), base_ref is empty and the
feature branch name doesn't exist in the sibling repos, so every sibling
(incl. SAM core) fell back to master. master lacks in-quarter API additions
like IGH_SAMComponent.ObsoleteSeverity, so SAM_Revit's own components failed
to compile (CS0246) on push builds even though the PR build passed.

Add a canonical sow/YYYY-QN candidate (suffix stripped) plus a hard
sow/2026-Q3 fallback so push and PR builds resolve the same dependency
branch. Bumps the stale sow/2026-Q2 hard fallback to prefer sow/2026-Q3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Michal Dengusiak <tassimulation@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Convert all 17 remaining legacy Grasshopper components in this repo from
GH_SAMComponent + imperative RegisterInputParams/RegisterOutputParams to
GH_SAMVariableOutputParameterComponent with declarative GH_SAMParam[]
Inputs/Outputs and name-based Params.IndexOfInputParam/IndexOfOutputParam
lookups, following the pattern established by SAM PR HoareLea#40 and SAM_Tas PR #16.
This is the 10th and final repo in the org-wide sweep.

SAM.Analytical.Grasshopper.Revit (9): RevitMaterialLibrary (v1.0.0->1.0.1,
6c4f99f6-5f52-491d-823e-171a66c0d40c), RevitOverlapWalls (v1.0.0->1.0.1,
bd72b694-f2a5-4dd7-ba36-e37d619fe374), RevitSAMAnalyticalByElement
(v1.0.3->1.0.4, 9b809657-8de3-466e-b814-973b0677a37a),
RevitSAMFloorsAndRoofsFromSpaces (v1.0.1->1.0.2,
90e18255-7b5e-4154-8f8c-615b62be273b), RevitSAMPanelsByCurtainWall
(v1.0.0->1.0.1, 7a1e91e5-24f2-48f7-ae6c-b98438c6fbbd), RevitSAMPanelsFromSpaces
(v1.0.0->1.0.1, ed3d4ef2-833d-40ce-9ad4-f20011ffac7e),
SAMAnalyticalCreateMaterialLibrary (v1.0.1->1.0.2,
f836f629-b8fb-41a8-9611-6783933ad6b2), SAMAnalyticalPanelsByBoundaries
(v1.0.0->1.0.1, fcd537c9-0a80-472c-bc64-07f11c9aa879),
SAMAnalyticalShellsBySpaces (v1.0.0->1.0.1, 352f8762-3aba-43b8-9bfc-d1024cedafd1).

SAM.Architectural.Grasshopper.Revit (1): SAMArchitecturalLevelInformation
(v1.0.1->1.0.2, b72abb0f-6672-41e8-987b-d63fe9eaf7b9).

SAM.Core.Grasshopper.Revit (7): SAMCoreCreateConvertSettings (v1.0.0->1.0.1,
da750879-e8e0-446d-ab7d-a705358ce304), SAMCoreDuplicatedElementIds
(v1.0.0->1.0.1, 1c0aa12e-ffbc-434b-833a-dc157c589b4d),
SAMCoreDuplicatedUniqueIds (v1.0.0->1.0.1, 8e7b22ef-9341-41ab-8165-16ce485b7f63),
SAMCoreElementsByScopeBox (v1.0.0->1.0.1, 172b87f6-8b7c-444b-be49-dc7b7057a77e),
SAMCoreFilterByElementIds (v1.0.0->1.0.1, 2eda1e16-2640-4da1-8557-6a74975bdaa6),
SAMCoreGetLocation (v1.0.0->1.0.1, 348836ad-6a12-48fc-91ad-f939a8ebda6a),
SAMCoreGetWalls (v1.0.0->1.0.1, 8fc5308e-45c4-410c-ae04-5b3f2563ab9e).

Two Name/NickName mismatches found and fixed locally in the affected
component's own constructor (same shared-base-class Clone() quirk found in
SAM_LadybugTools): SAMAnalyticalCreateMaterialLibrary's "path_" input (real
NickName "_path_") and SAMAnalyticalShellsBySpaces's "spaces_" input (real
NickName "_space_"). SAMArchitecturalLevelInformation carries a third
mismatch on the component's own Name/NickName ("SAMArchitectural.LevelInformation"
vs "SAMCore.LevelInformation") and its "HighLevel" output (NickName "High
Level") - the component-level one needs no fix (set via the base constructor
call, not cloned), the output one is fixed the same way as the other two.

6 components (RevitOverlapWalls, SAMAnalyticalPanelsByBoundaries,
SAMAnalyticalShellsBySpaces, SAMCoreCreateConvertSettings,
SAMCoreElementsByScopeBox, SAMCoreGetWalls) cannot be captured by the
metadata-tier harness in this environment: their constructors reference
RevitAPI.dll types, and RevitAPI.dll throws FileNotFoundException when
loaded without a real Revit install - confirmed identical failure on both
baseline and migrated builds. Validated by manual source-level
parameter-contract review instead.

All #if Revit2017...Revit2024 / #else preprocessor blocks (.IntegerValue vs
.Value, DUT_METERS vs UnitTypeId.Meters, UnitType.UT_Length vs
SpecTypeId.Length) preserved byte-for-byte.

ComponentGuid, parameter order, names, nicknames, descriptions, access,
optional state, and persistent defaults preserved exactly (verified via the
generic reflection-based contract-capture harness, commit bb31ba3: 0
unexplained differences between baseline and migrated builds across all 25
components in all 4 assemblies, including the 8 already-modern ones not in
scope). LatestComponentVersion bumped by one patch each. Build clean, 0
errors, same warning counts as baseline (17/38/25/20 across the 4 projects).

Generated by Michal Dengusiak and CodeClaude
SAM_Tas\benchmark\SAM.Analytical.Tas.Benchmark references
SAM_Validation\build\SAM.Analytical.Benchmark.dll by HintPath, so a build that
clones SAM_Tas without SAM_Validation fails with CS0234 - "the type or namespace
name 'Benchmark' does not exist in the namespace 'SAM.Analytical'".

Latent since the benchmark project landed in SAM_Tas: this repo's CI has not run
on a PR since, so nothing surfaced it. It was hit for real on SAM_Revit_UI, and
this repo has the identical gap.

SAM_Validation goes into both the clone list and the ordered build list in the
same slot BuildAlls_v3.csproj uses locally - after SAM_SolarCalculator, before
SAM_Tas. It needs only SAM and SAM_Mollier, both already built above it.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ci: build SAM_Validation before SAM_Tas
Removes dead Revit-year plumbing across the repo now that the supported range
is Revit 2025+:
 - #if Revit2017..Revit2024 blocks collapsed to their live branch in the .cs
   sources (preprocessor-resolved, not hand-edited)
 - Debug20XX/Release20XX TargetFramework conditions, PropertyGroups,
   RevitAPI*/RhinoInside.Revit reference blocks and Configurations entries
   dropped from all 10 csproj files (SAM_Revit, Grasshopper, Pdf)
 - matching Debug20XX/Release20XX entries dropped from SAM_Revit.sln
 - references/Revit 2020..2024/ (dead RevitAPI*/RhinoInside DLLs) deleted
 - added the SPDX + copyright header to 57 pre-existing .cs files that were
   missing it, since every changed .cs file must carry it for CI

Revit 2027 is not added here: this machine has no Revit 2027 install and no
RevitAPI/RevitAPIUI/RevitAPIIFC SDK DLLs for it. Adding 2027 is a follow-up
once those DLLs are available.

Verified via MSBuild.exe -t:Rebuild: Debug2025 and Debug2026 both build clean
with zero errors, and Debug2024 now correctly fails as an invalid solution
configuration (MSB4126), confirming the dead configs are fully gone rather
than silently still present.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
SAM_Revit's workflow builds SAM_Revit_UI as its downstream leg, but SAM_OCCT
was missing from both dependency lists. SAM.Analytical.Revit.UI moved its Revit
topology conversion off Topologic and onto SAM_OCCT (SAM_Revit_UI#10, merged
today), so the leg failed:

  AnalyticalModel.cs(166,45): error CS0103: The name 'OCCT' does not exist in
  the current context

This is pre-existing and unrelated to the Revit-year drop in this branch - the
OCCT migration landed after SAM_Revit's last green run, and this PR is simply
the first build to exercise the cross-repo leg since. SAM_Revit itself has no
Topologic or OCCT references at all.

This workflow keeps two separate lists and both needed the change:
 - $deps (clone list) - so the repo is fetched
 - $orderedRepos (build list) - so its managed assemblies actually exist;
   cloning alone would leave the SAM_OCCT\build\*.OCCT.dll HintPaths unresolved
Added in the same slot SAM_Revit_UI uses: after SAM_Solver (SAM and SAM_Solver
are its only sibling dependencies), before SAM_SolarCalculator. No
platformOverride needed - only SAM_OpenStudio requires x64.

Also adds SAM_OCCT_SKIP_NATIVE_BUILD=true, since the native OCCT layer
(vcpkg/OpenCASCADE) is unavailable on the runner; the post-build steps that copy
the native kernel are all 'if exist' guarded, so the managed OCCT assemblies are
enough to link here. The shipped native binaries come from SAM_Deploy.

SAM_Topologic is dropped from both lists, since SAM_OCCT replaces it and nothing
in the chain references it any more - the only remaining mentions anywhere are
'if exist ... del /Q' cleanup lines in SAM.Analytical.Revit.UI.csproj that
delete Topologic DLLs from the output dir and need no clone. SAM_Revit was the
last workflow in the workspace still cloning it; SAM_Revit_UI had already
removed it.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1. Deduplicated PropertyGroups (review finding 1). SAM.Units.Revit.csproj and
   SAM.Geometry.Revit.csproj each carried three PropertyGroups conditioned on
   'Debug2025|AnyCPU' (and three on 'Debug2026|AnyCPU'): two OutputPath-only
   duplicates plus the real block with DebugSymbols/DefineConstants/etc. Values
   were identical so it was last-one-wins and harmless, but since this PR
   already removed the 2020-2024 duplicates, the surviving 2025/2026 ones are
   now folded down to one group per configuration.

2. Fixed SetLeaderEnd using the elbow point (review finding 2).
   SAM.Geometry.Revit/Convert/ToRevit/IndependentTag.cs:84 passed
   `elbow.U, elbow.V` into SetLeaderEnd where `end.U, end.V` was intended, so a
   tag's leader end landed on top of its elbow instead of at the recorded end
   point. Pre-existing (it was already in the old #else branch, so the #if
   collapse did not introduce it) but a real round-trip defect, and the reviewer
   was right that it is now the only surviving branch - fixing rather than
   deferring, per the "address every valid finding" rule.

Not folded in: the same duplicate-PropertyGroup pattern exists in the four
Grasshopper csproj files (up to 6 Debug2025 groups in
SAM.Analytical.Grasshopper.Revit.csproj) and three more SAM_Revit core projects.
Those files mix 'Debug2025|AnyCPU' and 'Debug2025|x64' conditioned groups, so
collapsing them safely needs a per-platform check that no x64-specific override
gets conflated into an AnyCPU group - too risky to bundle into this drop PR, so
it is queued as its own task.

Verified via MSBuild.exe -t:Rebuild: Debug2025 and Debug2026 both build clean,
0 errors.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
chore: drop Revit 2017-2024 support (supported range now 2025-2026)
PR #10 folded the redundant Debug2025/2026|AnyCPU PropertyGroup
duplicates in SAM.Units.Revit.csproj and SAM.Geometry.Revit.csproj, but
deliberately left the same pattern elsewhere: it was worse in the
Grasshopper projects and mixed AnyCPU/x64 conditions, so a careless
merge risked conflating an x64-specific override into an AnyCPU group.

Simple cases (AnyCPU-only, same pattern as PR #10):
- SAM_Revit/SAM.Analytical.Revit.csproj
- SAM_Revit/SAM.Architectural.Revit.csproj
- SAM_Revit/SAM.Core.Revit.csproj
Each had one OutputPath-only duplicate folded into the adjacent full
metadata group per Debug2025/2026|AnyCPU condition.

Grasshopper cases, verified per-condition before touching anything (a
Python script computed the last-wins effective property map for every
Condition, confirmed identical before/after, and flagged any duplicate
where values actually disagreed):
- SAM.Analytical.Grasshopper.Revit.csproj: only declares Platforms=x64,
  so its AnyCPU-conditioned groups are dead configuration; found and
  fixed a real masked bug in the process -- a Release2026|AnyCPU
  duplicate carried DefineConstants=TRACE;Revit2025 (wrong year), which
  a later correct duplicate silently overrode. Folded to the effective
  (last-wins) values so behaviour is unchanged.
- SAM.Architectural.Grasshopper.Revit.csproj: declares
  Platforms=AnyCPU;x64; AnyCPU and x64 groups collapsed independently,
  values agreed across all duplicates.
- SAM.Core.Grasshopper.Revit.csproj: same pattern, AnyCPU and x64 kept
  separate, values agreed.
- SAM.Geometry.Grasshopper.Revit.csproj: same pattern; found another
  real masked bug -- the OutputPath-only Release2025/2026 stub groups
  used "..\build\" (one level too shallow) while the later full groups
  correctly used "..\..\build\", so the shallow path was always
  silently overridden. Folded to the effective (correct) value.

None of the four Grasshopper projects define an x64 solution platform;
they receive x64 via the project-platform mapping under the solution's
"Any CPU" configurations, so the x64-conditioned groups are the ones
that actually build day to day -- kept fully separate from the AnyCPU
groups throughout.

Verified two ways:
1. MSBuild.exe -t:Rebuild for Debug2025, Debug2026, Release2025, and
   Release2026 (Any CPU) -- 0 errors on both the pre-change and
   post-change tree.
2. MSBuild -getProperty evaluation of every touched project, across
   all four configurations and every platform each project actually
   uses (AnyCPU and/or x64), dumped before and after -- byte-identical.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fix: collapse duplicate Debug/Release2025|2026 PropertyGroups
Adds Debug2027/Release2027 alongside the existing 2025 and 2026 configurations,
following the same per-year shape this repo already uses, plus the Revit 2027
SDK assemblies under references/Revit 2027.

Revit 2027 is built on .NET 10, not .NET 8: RevitAPI 27.0.4.0 binds
System.Runtime 10.0.0.0, and a net8.0-windows target fails with CS1705. The
2027 configurations therefore target net10.0-windows. 2025 and 2026 are
untouched and still target net8.0-windows.

One genuine API removal had to be handled. GBXMLExportOptions no longer carries
ExportEnergyModelType, and the ExportEnergyModelType enum is gone with it - in
2027 the type exposes only ExportAnalyticalSystems and ForceGbXMLExport. The
assignment in Convert/TogbXML/gbXML.cs is now guarded by #if Revit2025 ||
Revit2026. There is no replacement on the options object, so under 2027 the
export follows EnergyDataSettings alone; whether that produces the same gbXML
needs a model comparison, which this change does not attempt.

The four Grasshopper projects are deliberately left at 2025/2026. They
reference RhinoInside.Revit, RhinoInside.Revit.GH and RhinoInside.Revit.External
out of references/Revit <year>, and no 2027 build of those exists yet. They are
mapped in the solution to their 2026 configuration with no Build.0 entry, so a
2027 solution build skips them rather than failing on missing HintPaths.

Verified: SAM_Revit.sln builds clean under Release2027 (six projects), and
SAM.Analytical.Revit rebuilds clean under Release2025 and Release2026, so
neither existing year regressed.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat: add Revit 2027 support (supported range now 2025-2027)
SAM_Revit's own build.yml never built Debug/Release2027 - only 2025 and 2026.
So every CI check on the Revit 2027 PRs (#12 here, #12/#13/#15/#16 in
SAM_Revit_UI) went green without CI ever compiling a single 2027
configuration. All verification that Release2027 builds clean was done
locally, by hand, in the session that added it - never confirmed by CI.

Clones the existing 2025/2026 clean+build+snapshot+verify pattern for 2027,
and installs the .NET 10 SDK alongside 8 (Revit 2027 targets
net10.0-windows; RevitAPI 27.0.4.0 binds System.Runtime 10.0.0.0, so a net8
target fails CS1705). The upload-artifact path list picks up the new
_ci_artifacts\Revit 2027\ folder alongside 2025/2026.

Generated by Michal Dengusiak and CodeClaude

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
BuildAlls_v3.csproj was retired locally in favor of BuildAlls_v4.csproj.
Update the "same slot as" comments so they still point at a real file.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Two fixes in the per-view TagElements overload, behaviour-preserving:

- Replace the unfiltered FilteredElementCollector(document, view.Id)
  (which enumerated the entire contents of every view and then
  intersected against the candidate ids) with a single collector
  restricted by ElementIdSetFilter to the candidate element ids.
- Replace the per-element GetDependentElements duplicate check with a
  per-view precomputed HashSet of host element ids that already carry
  an IndependentTag of the target tag type.

Signatures unchanged; all existing callers (AddWallTags,
AddWindowAndDoorTags, SAMCore.TagElements Grasshopper component)
work unchanged.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: CodeClaude <noreply@anthropic.com>
- Scan for existing tags document-wide and filter by OwnerViewId
  instead of using the view-scoped collector, so tags hidden in the
  view still suppress duplicates (matches the previous
  GetDependentElements + ElementOwnerViewFilter semantics).
- Remove null entries from the candidate id set alongside
  InvalidElementId before constructing ElementIdSetFilter.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: CodeClaude <noreply@anthropic.com>
perf: optimize Modify.TagElements per-view hot loop (AddWallTags slowness)
Running the Revit AddParameters command against the production shared-parameters
workbook (SAM_RequiredSharedParametersVer06t.xlsx, ~1000 rows) failed with
"The method or operation is not implemented".

Cause: Query.ForgeTypeId handled 16 spec names and threw NotImplementedException
for everything else. The workbook's "Revit Parameter Type" column uses the legacy
Revit ParameterType enum names and contains 15 more that were unmapped -
HVACPowerDensity (x14), ElectricalIlluminance (x7), Length (x7), HVACPower (x3),
ElectricalEfficacy (x2), ElectricalPower (x2), HVACVelocity (x2), Angle,
HVACDensity, HVACPressure, HVACThermalConductivity, Material,
HVACCoolingLoadDividedByVolume, HVACHeatingLoadDividedByVolume.

Two changes:

1. Added those 15 mappings. Verified by compiling SAM.Core.Revit against
   Release2025, Release2026 and Release2027 - every SpecTypeId member resolves
   on all three API versions.

2. Replaced the trailing throw with "return null". Both callers - AddParameters
   and GenerateSharedParametersFile - already guard with "if (forgeTypeId != null)"
   and skip the row, so null is the contract they expect. Throwing meant a single
   unrecognized cell aborted the entire command and created no parameters at all;
   the workbook has one such value ("Adroit", plainly a data-entry error), which
   is now skipped instead of fatal.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The duplicate-tag precomputation added in #14 walks every IndependentTag in the
document and filters by OwnerViewId in managed code - and it runs once per view.
On a model with many floor-plan views that is O(views x all tags in model), which
is the remaining reason AddWallTags still feels like it tags one by one.

ElementOwnerViewFilter expresses exactly the same "owned by this view, whether or
not it is visible in it" semantics natively, so Revit narrows the set instead of
the loop. The managed OwnerViewId check is now redundant and removed.

Behaviour-preserving: the hidden-tag case that #14's Codex round specifically
fixed (a tag hidden in the view must still suppress a duplicate) is retained -
ElementOwnerViewFilter is owner-based, not visibility-based, unlike the
view-scoped FilteredElementCollector(document, view.Id) it replaced.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TagSpaces still had the pre-#14 shape that TagElements was just fixed out of: for
every space in the view it called space.GetDependentElements(...) and then
document.GetElement(x) for each dependent id, only to ask whether a SpaceTag of
the target type already exists.

Replaced with a single per-view collector pass that builds a HashSet of space ids
already carrying a SpaceTag of that type. ElementOwnerViewFilter preserves the
owner-based semantics of the LogicalAndFilter it replaces, so a tag hidden in the
view still suppresses a duplicate.

Also materialize the spaces collector once - it was enumerated twice, by Count()
and then by the foreach.

Behaviour-preserving: same duplicate rule (same tag type, same owner view), same
tag creation, same return value.

Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…-types

fix: map the remaining legacy spec names in Query.ForgeTypeId
perf: narrow the TagElements and TagSpaces duplicate scans
…2027 API

EnergyAnalysisDetailModelOptions is deprecated in 2027 and Create(Document, options)
will be removed in the next version. The energy model type now comes from Energy
Settings (EnergyDataSettings.AnalysisType) alone. The old code set contradictory
values - EnergyModelType.SpatialElement on the options object but
AnalysisMode.BuildingElements on the settings - which 2025/2026 tolerated but 2027
rejects with a runtime range check in set_AnalysisType.

Under Revit2027 only:
- EnergyDataSettings.GetEnergyDataSettings replaces the deprecated GetFromDocument
- AnalysisType = RoomsOrSpaces (equivalent of EnergyModelType.SpatialElement)
- EnergyAnalysisDetailModel.Create(Document) replaces Create(Document, options)
- GetAnalyticalSurfaces().Where(Type == Shade) replaces GetAnalyticalShadingSurfaces
- ExportDefaults assignment dropped (deprecated)

2025/2026 code paths are unchanged.
fix: migrate energy analysis model creation off the deprecated Revit 2027 API
Generated by Michal Dengusiak and CodeClaude

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
7 app.config files were net472-era leftovers containing assembly binding
redirects and <supportedRuntime sku=".NETFramework,Version=v4.7.2"/>-style
runtime config, neither of which has any effect under .NET 8/10. Every
project here targets net8.0-windows (Debug2025/Release2025,
Debug2026/Release2026) or net10.0-windows (Debug2027/Release2027) and is
OutputType Library, and a library's .dll.config is never read at runtime
(only the host .exe.config is, and that host is Rhino.exe/Revit.exe, whose
configs live elsewhere). Their only remaining effect was to emit stale
SAM.*.dll.config files into build/ and the %APPDATA%\SAM deploy folder.

Also drop the bare <Reference Include="System.IO.Compression" /> from
SAM.Core.Grasshopper.Revit.csproj, the same leftover that produced the
MSB3243 "no way to resolve conflict between System.IO.Compression" warning
fixed for the base SAM repo in 73ff9d49. No compression types (ZipFile,
GZipStream, DeflateStream, ZipArchive) are used anywhere in this project,
so the reference was fully redundant.

Verified per the five safety gates: no .NET Framework TargetFramework,
every project OutputType Library, no ConfigurationManager/AppSettings/
OpenExeConfiguration usage, each app.config contains only
assemblyBinding/bindingRedirect content, and no build file (csproj/props/
yml) references app.config/dll.config. Compile-only verified (dotnet build
-t:Compile, which skips the PostBuild step that would mutate the installed
%APPDATA%\SAM deploy folder) for all 7 affected projects at -c Release2026:
0 errors, no MSB3243. The 3 SAM_Revit/* (non-Grasshopper) projects also
compile-verified at -c Release2027: 0 errors. The 4 Grasshopper.Revit
projects have no Release2027/Debug2027 configuration defined at all
(pre-existing, unrelated to this change), so Release2026 is their only
applicable check.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…overs

build: remove dead .NET Framework app.config leftovers
…RESS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: record merged .NET Framework app.config cleanup in PROJECT_PROGRESS
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

…om upstream contribution

Removes AGENTS.md, PROJECT_PROGRESS.md and internal evidence/.claude artefacts that are SAM-BIM workflow records, not upstream project documentation.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@michaldengusiak
michaldengusiak merged commit 03237c7 into HoareLea:master Oct 6, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants