v2.0.0-rc1
Pre-releaseRelease candidate for the first stable release of the merged package. The stable line starts at 2.0.0, not 1.0.0, and deliberately: this repo inherited 44 tags from the three repositories it was merged from, 26 of which occupy v1.0.0 through v1.6.4 and none of which contain the merged package. Starting above the highest inherited tag means nothing has to be deleted.
Breaking
Ten deprecated declarations are gone. They were deprecated through the 0.x line; a major version is when removal is free.
| Removed | Replacement |
|---|---|
loadedShape |
loadedShapes / shape(id:) |
selected, selectedFace |
selection |
selectionSummary, SelectionSummary |
selectionMeasurements, SelectionMeasurements |
loadFile(from:progress:) |
loadFile(from:id:progress:) |
loadShape(_:id:) |
load(_:id:transform:) |
loadFromData(_:filename:progress:) |
loadFromData(_:filename:id:progress:) |
CADViewportView.init x2 |
the selection: initialiser |
Nothing auto-focuses the camera any more. The removed single-shape loaders were the only ones that did. The surviving multi-entity loaders have always documented that you call focus(on:) once you have loaded what should be visible, and that is now the only path.
The only consumer in the fleet using any of this is PadCAM, which is dormant; its revival already expects the OCCTSwiftInteraction migration.
Fixed
The camera framed only the first body of a multibody import. Two paths were affected and only one had been reported: focus(on:) resolved through shape(id:), which returns an entity's first body, and loadFile(from:id:progress:) registers a multibody file as one entity owning N bodies. So the documented way to frame a multibody import was the broken one.
A failed sub-shape conversion no longer shifts every later ordinal. A compactMap where a map was needed, silently renaming every sub-shape after an unconvertible one.
Changed
Every dependency resolves from its published URL, never from a ../<name> sibling checkout (ecosystem#51). A path dependency carries no version requirement, so it compiled whatever happened to be checked out next door and dropped the pin from Package.resolved entirely. The OCCT binary is still shared, by the artifact cache that was already doing it.
Platforms narrowed to iOS 18 and macOS 15. The inherited manifests claimed visionOS and tvOS, and OCCT.xcframework ships no slice for either.
Internal
CADViewportService.swift was 2,306 lines, 30% of the package. It is now a 365-line core plus seven per-domain extension files, none over 572, split at seams the file already had. The public API is byte-identical to before the split, compared declaration by declaration.
Why this is an rc rather than 2.0.0
The four readiness items from #13 are done: the deprecated API is gone, the blob file is split, the identity-table documentation is consolidated into a cookbook page that previously did not exist despite being referenced, and the pick-resolver deduplication is now verified by execution rather than by reading the call graph.
What an rc buys is the thing none of that can provide: consumers actually resolving this tag. OCCTMCP and OCCTSwiftScripts build against the published package in CI on every push, so pointing them at this tag is the real test of a release that removes ten public declarations.
363 tests in 33 suites. swift-format lint --strict and swiftlint --strict clean.
Still open, and not in this candidate: no multibody file fixture exists, which is why both camera-framing regressions assert a bounds union rather than a real import. OCCTSwiftAIS/CompatibilityAliases.swift also survives, and whether those three shims from the merge belong in a stable release is a separate call.