- Preserve carriage returns embedded within fixed-width 80-column IGES records.
- Support CR, LF, CRLF, and delimiter-free record boundaries.
- Restore legacy handling of physical preambles, encoded FNES records, and shifted D-exponent values.
- Serialize IGES provider tests because the legacy reader uses global state.
- Add exact regression expectations for parsed entities, topology, and corrupted input.
- Correct KPartCircle() handling when an offset collapses a circular edge.
- Prevent fallback to the generic MAT algorithm after the circular special case has been recognized.
- Add GTests for circular wires at, above, and below the 2 mm diameter boundary.
- Cover negative taper, positive offset, and collapsed-circle cases.
Migrate some DRAW tests which do not use external
CAD files and which do not use visualisation/image dump.
Some tests were modified, but the original idea was preserved
- Detect complete coincidence between fillet and chamfer intersection curves.
- Preserve orientation relationships between equivalent intersection curves.
- Reuse existing restriction edges instead of constructing duplicate topology.
- Merge coincident curve endpoints into shared topological vertices.
- Exclude fully consumed faces and their obsolete boundary edges during reconstruction.
- Mark edges collapsed to a single vertex as degenerated during construction.
- Accept tangential contacts while rejecting transversal intersections.
- Preserve generated and modified shape history in the resulting topology.
- Add GTests for convex, concave, opposing-edge, chamfer, and history cases.
- Add IGES stream reading and writing to DEIGES providers.
- Extend IFSelect, XSControl, and work libraries with generic stream output.
- Keep STEP work-library output aligned with the shared stream interface.
- Convert the legacy IGES parser from C to modern C++.
- Introduce buffered parsing of fixed 80-column IGES records.
- Support LF, CRLF, CR-only, and delimiter-free record layouts.
- Preserve FNES preamble detection and encoded record handling.
- Handle stream errors, enabled exceptions, partial reads, and cleanup safely.
- Isolate mutable parser data with thread-local storage.
- Serialize access to process-wide IGES configuration and restore it on exit.
- Preserve supplied work sessions, transferred models, and selected modifiers.
- Apply modern OCCT naming, casting, documentation, and control-flow style.
- Add tests for shape and document stream I/O, record layouts, and failures.
- Add a thread-safe lazy grid to CSLib_Class2d for constant-time
classification away from polygon boundaries while preserving the exact
tolerance path for boundary cells.
- Normalize coordinates and explicit tolerances robustly, handle invalid and
extreme input values, and preserve cache state correctly across copy and
move operations.
- Cache face wires, edge occurrences, pcurves, parameter ranges, and optional
2D bounding boxes in BRepClass_FaceExplorer to avoid repeated topology and
geometry traversal during exact classification.
- Introduce explicit cached-geometry and bounding-box states in
BRepClass_Edge, invalidate derived data on topology changes, and isolate
bounding-box construction failures per edge.
- Reuse a lazily constructed exact face explorer in
BRepTopAdaptor_FClass2d, cache periodic surface properties, and serialize
access to mutable exact-classification traversal state.
- Replace node-based classifier and point sequences with contiguous linear
vectors, remove intermediate polygon copies, and make tighter wire
discretization transactional.
- Consolidate Perform() and TestOnRestriction() through a shared
classification path while preserving their boundary and periodic
recadrement semantics.
Removed adm/scripts which were no longer actual and not validated.
Removed adm/templates which were no longer used and not validated.
Fixed the issue with the mixing FreeType/FreeImage inside env.bat
Guard invalid edges, faces, adaptors, and missing pcurves before they
are passed to BRepAdaptor_Curve2d or dereferenced during chamfer construction.
When the topology does not provide a valid curve-on-surface, preserve
the existing state where possible and return false.
This makes an oversized or otherwise invalid chamfer finish with IsDone() == false
instead of crashing in BRep_Tool::CurveOnSurface.
Use Adaptor3d_CurveOnSurface composed-curve recognition to handle
provable elementary cases directly:
- compute the exact maximum at interval endpoints for line pairs;
- Compute exact maxima for line pairs and use trigonometric roots for
circle and ellipse pairs.
- preserve the existing PSO/Newton pipeline for all other cases.
---------
CLA ID 1148
Co-authored-by: dpasukhi <dpasukhi@opencascade.com>
Correct obsolete API references, code examples, terminology, links, and
contribution workflow instructions across the documentation.
Generate Doxygen example paths from OCCT package metadata and fix license
markup. Remove obsolete documentation CMake, layout, and unused PDF
generation files.
Enable system TBB discovery on Windows when no explicit third-party
installation is selected. Support MinGW FreeType import libraries and
versioned runtime DLLs.
Preserve imported CMake targets during CSF processing and validate
MSYS2 GCC and Clang dependency artifacts in master validation.
Initialize the output sequence when ConnectWiresToWires receives null or
empty input. This prevents SplitWires from appending a null sequence when
all free-boundary edges have been consumed as closed loops.
CLA ID: 1139
BRepFilletAPI_MakeFillet reconstructs its result solid through the legacy
TopOpeBRepBuild engine (ChFi3d_Builder::Compute -> TopOpeBRepBuild_HBuilder::
MergeSolid -> TopOpeBRepBuild_Builder::SplitSolid), which passes state between
methods through file-scope static variables. That makes it non-reentrant: two
BRepFilletAPI_MakeFillet builds on independent shapes on separate threads corrupt
each other and yield a wrong-but-plausible solid that fails BRepCheck.
ThreadSanitizer on an 8-thread fuse+fillet stress pinpoints the functional cause as
STATIC_SOLIDINDEX (TopOpeBRepBuild_Builder.cxx): SplitSolid sets it to 1/2 to tell
FillSolid which operand it is splitting, FillSolid reads it back. Concurrent
reconstructions interleave the writes, so FillSolid mis-classifies faces and drops
material. Converting that one variable to thread_local makes a 1600-build concurrent
stress return correct geometry every time (was ~15-20% corrupt).
Converts the fillet-path shared statics to thread_local (each thread keeps its own
copy of the cross-call state; single-thread behaviour is unchanged):
- Functional: TopOpeBRepBuild_Builder STATIC_SOLIDINDEX; TopOpeBRep_kpart
STATIC_lastVPind (same cross-call-cache pattern).
- Benign data races on the same path (no corruption, but flagged by TSan):
BlendFunc_ConstRad / BlendFunc_EvolRad ComputeValues scratch; ChFi3d_Builder_6
checkcurve.
Same class of fix, same engine, as the earlier TKBool thread_local conversion
(#1180); these were not covered by it. Reported downstream as SecondMouseAU/
OCCTSwift#298.
Validate the edge range against the effective curve basis before
constructing Geom_TrimmedCurve. Preserve valid periodic ranges and
return a null pcurve for inconsistent bounded ranges.
Split oversized raw STEP strings in StepData_StepWriter::AddString() instead of repeatedly flushing the current line when the text cannot fit into the 72-character buffer.
Drop indentation for continuation lines when the indented prefix would leave no room for the pending text.
Precompute conservative UV bounds for closed wires and skip expensive
containment checks for disjoint wire pairs. Fall back to the existing
classification when reliable finite bounds cannot be constructed.
ShapeFix_Face::FixPeriodicDegenerated() unconditionally recorded the
result through Context()->Replace(), although ShapeFix_Face can be used
without assigning a reshape context. This caused a null dereference when
healing a periodic conical face bounded by a single closed edge.
Guard the replacement when no context is available while preserving the
healed face in myResult.
Replace the outdated bottle profile diagram with a clean, scalable SVG.
Label points P1 through P5 and the coordinate axes, and correct the point
coordinates to match the tutorial implementation. Improve spacing and
alignment so that coordinate labels remain readable without overlapping.
Prevent null pcurve dereferences during pcurve relocation, transformation,
wire construction, and edge selection. Skip only the affected face group
instead of aborting processing of the entire shell.
Use BRepAdaptor_Curve::NbPoles() when selecting the integration order
for Bezier and BSpline curves. This keeps the pole count consistent with
the curve representation reported by GetType() and avoids dereferencing
a null 3D curve for edges represented only by a curve on surface.
The base mesh algorithm created constraint links for all pcurves of an
edge, including duplicate representations at periodic seams.
Register nodes and mesh indices for all pcurves so polygon-on-triangulation
data remains valid, but add links only for the pcurve of the wire occurrence.
Method Geom_BSplineCurve::PeriodicNormalization() is rewritten - it now
has algorithmic complexity O(1) instead of O(N) and protected against
rounding error for large numbers.
- Add helper to create shell with all faces reversed
- Test FaceRef stores REVERSED orientation for all faces
- Test ParentExplorer reports shell as parent for reversed faces
- Test Reconstruct produces valid face definitions
- Test shell reconstruction preserves REVERSED face orientations
- Unify test fixture names to BRepGraph_ReverseTest
- Add aspect API controlling vertex color use on back faces
- Generate front-only vertex color shader variants for face programs
- Expose the option through ViewerTest and add DRAW/GTest coverage
- Kept TopoDS definition data local while storing root
and compound placements on graph references.
- Preserved located triangulation and polygon-on-triangulation
data during population.
- Preserved degenerate natural boundary edges and cleared
full-graph state consistently in Perform().
- Kept original TopoDS shape lookup bindings valid
across population and compaction.
- Rebuilt compacted compounds in two passes so nested
compound references keep their local placement.
- Added focused regression coverage for located meshes,
nested compounds, shape lookup, compaction, degenerate boundaries, and reset behavior.
Infinite loop occurred in IntWalk_IWalking::ComputeOpenLine() inside 'while (!Arrive)' loop.
Fixed by checking for degenerate case after very large amount of iterations have passed.