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