138/138 symbols across 53 modules. New: IFSelect, Interface, XSControl, IGESData, STEPControl, IGESControl, RWStl, Graphic3d, NCollection, StdPrs. **The full app suite passes against this wheel: 1797 passed, 1 skipped — the same result as the stock wheel**, run from the parity venv. Getting there needed six methods that no static analysis could have found: `inventory --check` only sees symbols reached through an import, so a method called on an instance is invisible to it. The suite found them in one pass, and one of them (gp_Vec.Reverse, which every outward-normal probe calls) accounted for 311 of the 255 failing tests on its own. The others: gp_Trsf.SetMirror over a plane and a point, Geom_Surface.D0, BRep_Builder.MakeFace from a triangulation, MakePipeShell.SetMode with a fixed binormal, and MakeFace from a surface plus tolerance. Open question **S5 is settled: no**. The wheel does not need OCCT's share/ resources. test_inc3_io.py asserts no CSF_* variable is set and then round-trips STEP and IGES, reading the declared units back off both — which is exactly the resource-less container the question was about. The XSTEP readers keep the GIL, amending the blanket "file readers and writers" line in design.md's GIL policy. STEP and IGES traffic in process-global Interface_Static state, the IGES reader is documented as not thread-safe, and the app already serialises imports behind a lock — so holding it costs nothing and removes a class of question. RWStl, which touches no global state, releases. XSControl_Reader and IGESData are registered although the app imports neither: they are the reader base both concrete readers inherit their transfer surface from, and the model-to-global-section chain the IGES unit probe walks. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DfriM8XUkn7uYf5Dwe2xo6
39 lines
1.4 KiB
C++
39 lines
1.4 KiB
C++
/*
|
|
OCP.IGESData — the IGES model's global section.
|
|
|
|
Not imported by the app, but reached through it: the unit probe walks
|
|
reader.IGESModel().GlobalSection().UnitName(), so both classes need to be
|
|
registered for that chain to convert. Only the two unit accessors are
|
|
bound.
|
|
|
|
UnitName hands back a Handle(TCollection_HAsciiString), which is why that
|
|
transient is registered here too rather than in mod_TCollection.cpp — it
|
|
has no other consumer.
|
|
*/
|
|
|
|
#include "../common/occt_module.h"
|
|
#include "../common/occt_policies.h"
|
|
|
|
#include <IGESData_GlobalSection.hxx>
|
|
#include <IGESData_IGESModel.hxx>
|
|
#include <TCollection_HAsciiString.hxx>
|
|
|
|
void register_IGESData(nb::module_ &root) {
|
|
nb::module_ m = ocp_submodule(root, "IGESData");
|
|
|
|
nb::class_<TCollection_HAsciiString, Standard_Transient>(
|
|
m, "TCollection_HAsciiString")
|
|
.def("ToCString", &TCollection_HAsciiString::ToCString)
|
|
.def("Length", &TCollection_HAsciiString::Length)
|
|
.def("__str__", &TCollection_HAsciiString::ToCString);
|
|
|
|
nb::class_<IGESData_GlobalSection>(m, "IGESData_GlobalSection")
|
|
.def(nb::init<>())
|
|
.def("UnitName", &IGESData_GlobalSection::UnitName)
|
|
.def("UnitValue", &IGESData_GlobalSection::UnitValue);
|
|
|
|
nb::class_<IGESData_IGESModel, Standard_Transient>(m, "IGESData_IGESModel")
|
|
.def("GlobalSection", &IGESData_IGESModel::GlobalSection,
|
|
OCP_RETURN_COPY);
|
|
}
|