10C Inc 1: core modeling
Binds the modeling core the app builds every feature out of — 93 of its 138 symbols now resolve, up from 34. New modules: GeomAbs, Geom2d, Geom, TCollection, TColgp, TColStd, GProp, BRepGProp, Bnd, BRepBndLib, Adaptor3d, BRepAdaptor, GeomLProp, GeomAPI, BRepBuilderAPI, BOPAlgo, BRepAlgoAPI, BRepPrimAPI, GC, BRepMesh; gp and BRep_Tool completed. Three structural decisions: - BRepBuilderAPI_MakeShape carries Build/Shape/Generated/Modified/IsDeleted for every maker in the binding, so the booleans, the primitives and (later) the fillet builders all answer the app's duck-typed provenance layer through ordinary virtual dispatch. History lists come back copied, so they outlive the builder. - The executing two-argument BRepAlgoAPI constructors stay unbound; operands go in through SetArguments/SetTools. Section keeps Init1/Init2, which are plain setters. BOPAlgo moved up from Inc 2 — SetGlue needs its enum. - Adaptor3d is registered although the app never imports it: every method it calls on BRepAdaptor_Curve/Surface is a virtual declared there, so binding them once on the bases leaves mod_BRepAdaptor.cpp with just constructors. Gate: tests/test_inc1_modeling.py against reference values gen_fixtures.py now records from the stock wheel — measurements, per-face area/centroid in map order, mesh counts, and the boolean history map compared exactly, since that is the substrate the app's topological naming is built on. tools/sigdiff.py compares our bound surface against stock's, because a wrong nb::init<> is silent: MakePrism's five-argument form bound OCCT's semi-infinite gp_Dir overload (gp_Dir converts from gp_Vec), producing a valid solid of the wrong shape with the flags shifted along. The fixture digest caught it; sigdiff finds the class of bug directly, and now reports only one deliberate deviation. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DfriM8XUkn7uYf5Dwe2xo6
This commit is contained in:
@@ -75,9 +75,24 @@ only in that a base class must precede its derived classes.
|
||||
When in doubt about a signature, ask the stock wheel rather than guessing:
|
||||
|
||||
```bash
|
||||
cd ../app && .venv/bin/python -c "from OCP.BRep import BRep_Tool; print(BRep_Tool.Triangulation_s.__doc__)"
|
||||
cd ../app && uv run --project backend python -c \
|
||||
"from OCP.BRep import BRep_Tool; print(BRep_Tool.Triangulation_s.__doc__)"
|
||||
```
|
||||
|
||||
And after writing a module, run `make sigdiff`, which asks it about every class
|
||||
at once. This is not pedantry about matching upstream — it catches the one
|
||||
mistake in this codebase that is both easy to make and silent:
|
||||
|
||||
> `nb::init<TopoDS_Shape, gp_Vec, bool, bool, bool>` for `BRepPrimAPI_MakePrism`
|
||||
> compiled fine and bound the **wrong constructor**. OCCT's finite-prism
|
||||
> overload takes four arguments; the five-argument one takes a `gp_Dir` for a
|
||||
> semi-infinite prism, and `gp_Dir` converts implicitly from `gp_Vec`. The
|
||||
> result was a valid solid of the wrong shape, with the `Copy` and `Canonize`
|
||||
> flags shifted one position along.
|
||||
|
||||
Anything `sigdiff` reports is either that bug or a deliberate deviation; if it
|
||||
is deliberate, say so in a comment where the class is bound.
|
||||
|
||||
## 4. New toolkits
|
||||
|
||||
If the linker cannot find a symbol, the class lives in a toolkit not yet listed
|
||||
|
||||
Reference in New Issue
Block a user