Commit Graph

113 Commits

Author SHA1 Message Date
Pasukhin Dmitry 5cc7691bbe Coding - Refactor Geom_OffsetSurface evaluators to use references (#1158)
- Updated `Geom_OffsetSurface_UIsoEvaluator` and `Geom_OffsetSurface_VIsoEvaluator` to store a `const Geom_Surface&` and call `Value()` / `D1()` directly.
- Updated `UIso()` / `VIso()` to construct evaluators with `*this` (and removed `occ::handle<Geom_OffsetSurface> me(this)`).
2026-03-10 18:35:07 +00:00
Pasukhin Dmitry 6f6660d0d6 Modeling Data - Unify LProp packages into template classes in TKGeomBase (#1156)
Consolidate duplicated local property computation classes
(GeomLProp_CLProps, Geom2dLProp_CLProps2d, LProp3d_CLProps,
BRepLProp_CLProps, HLRBRep_CLProps and their SLProps counterparts)
into unified C++ template classes GeomLProp_CLPropsBase and
GeomLProp_SLProps with policy-based access (DirectAccess/ToolAccess).

Move LProp, GeomLProp, and GProp packages from TKG2d/TKG3d to
TKGeomBase. Remove Geom2dLProp and LProp3d packages entirely.
Merge Geom2dLProp_CurAndInf2d into GeomLProp_CurAndInf2d.
Preserve backward-compatible type aliases (using declarations)
for all previously existing class names.

Shared algorithm logic extracted into LProp_CurveUtils and
LProp_SurfaceUtils namespaces. 2D curve analysis helpers
(FuncCurExt2d, FuncCurNul2d, NumericCurInf2d) converted to
header-only .pxx implementations under GeomLProp.

Update all dependent code (LocalAnalysis, BRepFill, ChFi3d,
Geom2dHatch, GeomPlate, ProjLib, HLRBRep, DrawTrSurf, etc.)
to use new template instantiations. Migrate GTests from
TKG2d to TKGeomBase with updated class names.
2026-03-10 16:49:55 +00:00
Pasukhin Dmitry fe9a0de8d0 Modeling Data - Modernize LProp .gxx templates into .pxx utilities (#1155)
Replace legacy .gxx generic class templates (LProp_CLProps.gxx,
LProp_SLProps.gxx) with modern C++ .pxx template utilities
(LProp_CurveUtils.pxx, LProp_SurfaceUtils.pxx) using namespaced
template functions and access policies.

Remove obsolete CurveTool/SurfaceTool intermediary classes
(GeomLProp_CurveTool, GeomLProp_SurfaceTool, LProp3d_CurveTool,
LProp3d_SurfaceTool, BRepLProp_CurveTool) that are no longer needed
with the new direct/tool access policy design.

Replace per-instantiation _0.cxx files with standalone .cxx
implementations that delegate to the shared .pxx utilities.

Fix myCN field type from double to int in all CLProps headers
to match SLProps convention and actual usage (values 0 or 4).
Add default member initializers for uninitialized fields
(myCurvature, mySignificantFirstDerivativeOrder, myMinCurv,
myMaxCurv, myMeanCurv, myGausCurv) across all CLProps/SLProps classes.
Fix theSigOrder pass-by-value bug in Tangent/Curvature wrappers.
Fix typos: anUinfium/anVinfium -> anUinfimum/anVinfimum.
2026-03-09 23:29:52 +00:00
Pasukhin Dmitry c4715e0e72 Modeling - Remove GeomProp modules (#1154)
- Deleted GeomProp_Surface, GeomProp_SurfaceAnalysisTools, GeomProp_SurfaceOfExtrusion, GeomProp_SurfaceOfRevolution, and GeomProp_Torus classes along with their implementation files.
- Removed references to the GeomProp module from the CMake package configuration.
2026-03-09 21:03:18 +00:00
Pasukhin Dmitry daded53b66 Modeling Data - Add derivative caching to GeomProp/Geom2dProp evaluators (#1152)
Refactor GeomProp, Geom2dProp, and GeomProp_Surface evaluator systems
to support direct construction from geometry handles without creating
intermediate adaptors, add per-parameter derivative caching, and
optimize type dispatch.

Key changes:

Handle-based construction path:
- All evaluators accept Handle(Geom_Curve)/Handle(Geom2d_Curve)/
  Handle(Geom_Surface) directly, bypassing adaptor creation for
  analytical types (Line, Circle, Plane, etc.)
- Wrapper initialization from handles uses DynamicType() comparison
  (single extraction, == checks) instead of IsKind() virtual walks
- TrimmedCurve/RectangularTrimmedSurface automatically unwrapped to
  basis geometry with optional CurveDomain/SurfaceDomain bounds

Adaptor-based construction path:
- Specialized evaluators accept only specific adaptor types
  (GeomAdaptor_Curve*, Geom2dAdaptor_Curve*, GeomAdaptor_Surface*)
- OtherCurve/OtherSurface accept base adaptor types for unknown
  geometry
- GeomAdaptor dispatch uses GetType() switch/case for direct
  specialized evaluator construction
- GeomAdaptor_TransformedSurface handled by extracting transformed
  adaptor via new public AdaptorSurfaceTransformed() method

Domain structs:
- Add CurveDomain (First, Last) and SurfaceDomain (FirstU, LastU,
  FirstV, LastV) structs to GeomProp and Geom2dProp namespaces
- Stored as std::optional in evaluators, set only for trimmed
  geometry or adaptor-sourced bounds

Derivative caching:
- Add CurveDerivOrder/SurfaceDerivOrder enums and CurveCache/
  SurfaceCache structs using std::variant over ResD1/ResD2/ResD3
- Enum values match variant alternative indices for direct access
- Non-trivial evaluators (BSpline, Bezier, Offset, Other) store
  mutable cache with requested derivative order
- Shared evaluation helpers in CurveAnalysisTools.pxx and
  SurfaceAnalysisTools.pxx eliminate duplication across evaluators
- Degenerate tangent points upgrade cache to D3, reusing cached
  point for neighbor evaluation

Other improvements:
- Simplify Adaptor() to direct myOwnedAdaptor return
- Add GeomAdaptor_TransformedSurface::AdaptorSurfaceTransformed()
  public method
- Improve MathRoot_Multiple robustness: double minimum sampling
  (2*NbSamples, min 20) for better root detection, add
  EffectiveXTolerance() to prevent spurious duplicates, introduce
  derivative-aware FindAllRootsWithDerivativeImpl() with golden
  section extrema detection and Brent/Newton hybrid refinement
- Update Geom2dLProp CurAndInf2d to use GeomProp-based analysis
2026-03-09 12:38:16 +00:00
Pasukhin Dmitry 7341688668 Coding - Update method guards for consistency (#1151)
Used regex:
^//[\s\n\r\t]*[-=~]{3,}[\n\r]*//[\s\n\r\t]*[-~a-z0-9_ =\s\t./><']+[\s\n\r\t]*:[\s\n\r\t]*[-~a-z0-9_:\t\s./><=']*[\s\n\r\t]*//[\s\n\r\t]*[a-z]+[\s\n\r\t]*:[\s\n\r\t]*[-~a-z0-9_\s\t./><=']{0,30}//[\s\n\r\t]*[-=~]{3,}\n*
2026-03-08 08:45:29 +00:00
Pasukhin Dmitry 39db714224 Modeling Data - Migrate BndLib to delegate to GeomBndLib (#1137)
- Replace monolithic switch statements in BndLib_Add3dCurve, BndLib_AddSurface, and BndLib_Add2dCurve with thin wrappers delegating to GeomBndLib_Curve, GeomBndLib_Surface, and GeomBndLib_Curve2d respectively.
- Remove now-dead internal helpers AddGenCurv, AddGenSurf, and BndLib_Box2dCurve. Public BndLib API is preserved unchanged.
- Implement proper BoxOptimal() in GeomBndLib_OffsetSurface: try the analytic equivalent surface first (offset plane -> plane, offset sphere -> sphere), then fall back to OtherSurface PSO sampling for general cases.
- Refactor GeomBndLib_OffsetCurve2d to share exact fast paths for line and circle offsets between Box() and BoxOptimal(), matching the 3D OffsetCurve pattern; BoxOptimal falls back to OtherCurve2d PSO for general curves.
- Update tests to reflect tighter bounds from GeomBndLib delegation.
2026-03-07 17:55:33 +00:00
Pasukhin Dmitry 763931a9f8 Modeling - Cache transformed surfaces and update fillet/grid evaluators (#1147)
Refactor transformed-surface handling to avoid repeated transformations, remove mutable surface access patterns, and align dependent code paths.

- Add cached transformed data in GeomAdaptor_TransformedSurface and rebuild it on ctor/Load/SetTrsf.
- Add explicit original/transformed surface accessors and deprecate legacy GeomSurface() usage.
- Preserve transformed cache state in BRepAdaptor_Surface shallow copy/initialization.
- Expose GeomAdaptor_Surface::ToleranceU()/ToleranceV() and use them in bounded-surface reload.
- Rework ChFi3d bounded surface helper to support both GeomAdaptor_Surface and BRepAdaptor_Surface.
- Replace ChangeSurface()-based usages in fillet code with const surface access.
- Add and register GeomAdaptor_TransformedSurface GTests.
2026-03-07 12:44:06 +00:00
Pasukhin Dmitry 357ae60dd9 Foundation Classes - Add PointSetLib package; deprecate GProp point coud classes (#1140)
Add new PointSetLib package in TKMath providing standalone point cloud analysis without GProp_GProps inheritance:
- PointSetLib_Props: weighted point set properties (mass, barycentre, inertia matrix via Huygens theorem)
- PointSetLib_Equation: PCA-based dimensionality analysis (point, line, plane, space detection) with principal axes and extents accessors

Deprecate legacy GProp point cloud classes:
- GProp_PGProps replaced by using alias to PointSetLib_Props
- GProp_PEquation replaced by using alias to PointSetLib_Equation
- GProp_EquaType enum removed (zero consumers)
- GProp_CelGProps, GProp_SelGProps, GProp_VelGProps marked deprecated

Migrate ShapeAnalysis_Geom::NearestPlane to use PointSetLib_Equation instead of GProp_PGProps + GProp_PrincipalProps.
2026-03-06 16:50:01 +00:00
Pasukhin Dmitry d8683ac97c Modeling Data - Fix GeomEval_TBezierSurface IsCN* override signatures for MSVC (#1145)
Align `GeomEval_TBezierSurface::IsCNu()` and `IsCNv()` declarations/definitions
with `Geom_Surface` by using `const int` parameter type, removing MSVC C4373
warnings treated as errors in `TKG3d` builds.

- update `GeomEval_TBezierSurface.hxx` signatures
- update matching `GeomEval_TBezierSurface.cxx` definitions
2026-03-06 13:12:20 +00:00
Pasukhin Dmitry d07798d521 Modeling Data - Fix continuity order mapping in BRepProp_Curve to match GeomProp_Curve (#1141)
The condition == 2 only matched GeomAbs_C1 curves for D1 evaluation, while >= 2 (as used in GeomProp_Curve::Continuity())
  correctly includes GeomAbs_G2 and higher, since G2 implies G1 which guarantees D1 exists.
2026-03-06 08:09:40 +00:00
Pasukhin Dmitry 51ab458dbd Modeling Data - Introduce GeomAdaptor_TransformedCurve and unify Eval-based evaluation API (#1139)
Add GeomAdaptor_TransformedCurve as a new base class for BRepAdaptor_Curve that wraps a GeomAdaptor_Curve (or Adaptor3d_CurveOnSurface) with an applied gp_Trsf transformation. This mirrors the existing GeomAdaptor_TransformedSurface pattern for curves.

Refactor the adaptor evaluation API across Adaptor3d_Curve and Adaptor3d_Surface hierarchies so that EvalD0/D1/D2/D3/DN are the primary virtual evaluation methods:

- Adaptor3d_Curve: Value, D0-DN become non-virtual inline wrappers delegating to EvalD*. Base EvalD* implementations now throw Standard_NotImplemented instead of calling D*.
- Adaptor3d_Surface: same pattern applied symmetrically.
- Adaptor3d_CurveOnSurface: removes Value/D0-DN overrides (inherited from base); adds EvalD0/D1/D2/D3/DN marked final with the full dispatch logic.
- Adaptor3d_IsoCurve: removes Value/D0-DN overrides; adds EvalD* final with iso-curve projection logic (IsoU selects D1V/D2V/D3V, IsoV selects D1U/D2U/D3U).
- GeomAdaptor_Curve: removes Value/D0-DN overrides (now inherited inline); EvalD* remain final with BSpline cache and analytical dispatch logic.
- GeomAdaptor_Surface: removes Value/D0-DN overrides (now inherited inline); EvalD* remain final with BSpline cache and analytical dispatch logic.
- GeomAdaptor_TransformedCurve: overrides EvalD* with transform-and-dispatch logic; no need to override Value/D0-DN (inherited from Adaptor3d_Curve).
- GeomAdaptor_TransformedSurface: removes Value/D0-DN overrides (now inherited inline).
- BRepAdaptor_Curve: refactored to inherit GeomAdaptor_TransformedCurve, removing all duplicated evaluation and geometry-extraction method implementations.
- BRepAdaptor_CompCurve: removes Value/D0-DN overrides; adds EvalD* final with compound-curve parameter mapping and derivative scaling logic.
- ProjLib_ProjectOnPlane: removes Value/D0-DN overrides; adds EvalD* final delegating to the projected result adaptor or the OnPlane_* free functions.
- GeomFill_SnglrFunc: removes Value/D0-DN overrides; adds EvalD* final implementing the C'(t) x C''(t) singular function with ratio scaling.
- ChFiDS_ElSpine: removes Value/D0-D3 overrides; adds EvalD0-D3 final delegating to the internal GeomAdaptor_Curve member.
- BiTgte_CurveOnEdge: removes Value/D0-DN overrides; adds EvalD* final.
- BiTgte_CurveOnVertex: removes Value/D0-DN overrides; adds EvalD* final (D1-DN throw Standard_NotImplemented as the curve represents a degenerate point).
- HelixGeom_HelixCurve: removes Value/D0-D2/DN overrides; adds EvalD0/D1/D2/DN final with trigonometric helix evaluation.

Add GTest coverage for GeomAdaptor_TransformedCurve: point/derivative evaluation with transformation, curve-on-surface path, GeomGridEval_Curve batch evaluation.
2026-03-05 10:35:15 +00:00
Pasukhin Dmitry 96028bae5f Coding - Harmonize GC/gce maker APIs and documentation (#1130)
Refactor TKGeomBase GC/gce maker classes to improve consistency,
header-level readability, and generated API docs.

- GC:
  - Expanded and standardized class/method Doxygen descriptions.
  - Added missing @param/@return tags and clarified @note sections.
  - Inlined GC_Root status helpers in header and removed GC_Root.lxx.
  - Updated GC/FILES.cmake accordingly.

- gce:
  - Expanded and standardized class/method Doxygen descriptions.
  - Added missing @param/@return tags and clarified error/status notes.
  - Inlined trivial operator wrappers in headers and removed redundant
    out-of-line operator implementations from *.cxx files.
  - Kept Value() as checked API returning const reference.
  - Updated Operator()/conversion operators to return copies, while
    delegating through Value() to preserve StdFail_NotDone checks.
  - Inlined gce_Root status helpers in header and removed gce_Root.lxx.
  - Updated gce/FILES.cmake accordingly.
  - Refined documentation text in gce_ErrorType and gce_Root.

No geometric construction algorithms were changed; this is API/documentation
and wrapper-structure cleanup with behavior-preserving status checks.
2026-03-04 15:27:41 +00:00
Pasukhin Dmitry cbc7f776a6 Modeling Data - Add GeomBndLib package for geometry-aware bounding box computation (#1136)
Add a new package GeomBndLib to TKGeomBase implementing fast and optimal
bounding box computation for all standard Geom curve and surface types.
GeomBndLib replaces the monolithic BndLib switch-based approach with a
per-type class hierarchy and std::variant-based dispatch, and fixes several
accuracy regressions present in BndLib.

Architecture:

- GeomBndLib_Curve / GeomBndLib_Curve2d / GeomBndLib_Surface:
  Public dispatcher classes built on std::variant over all specialized
  evaluators. Expose both Box/BoxOptimal (return Bnd_Box by value, RVO)
  and Add/AddOptimal (mutate Bnd_Box& for drop-in BndLib compatibility).
  Type detection and handler construction are performed once at construction
  time; dispatch is a single std::visit call with no virtual overhead.

Specialized 3D curve evaluators:

- GeomBndLib_Line: analytic axis-aligned interval, inline header-only.
- GeomBndLib_Circle: analytic arc bounding box for arbitrary gp_Circ and
  parameter range; static Box() used internally by surface evaluators.
- GeomBndLib_Ellipse / GeomBndLib_Hyperbola / GeomBndLib_Parabola:
  analytic extremum computation for conic sections over arbitrary arcs.
- GeomBndLib_BezierCurve: single FillBox span with convex hull reduction.
- GeomBndLib_BSplineCurve: knot-span FillBox with weakness-scaled deflation
  and convex hull reduction. Non-periodic partial ranges use BSplCLib::Hunt
  to select the contributing pole index range directly, avoiding Copy() and
  Segment() allocation. Periodic partial ranges use Segment() on a copy
  with the correct segmented poles passed to ReduceSplineBox. BoxOptimal
  uses grid sampling combined with per-coordinate Powell minimization.
- GeomBndLib_OffsetCurve: delegates to the basis curve evaluator and
  enlarges by the offset magnitude.
- GeomBndLib_OtherCurve: grid sampling with per-coordinate Powell
  minimization for general curve types.

Specialized 2D curve evaluators (GeomBndLib_*2d):

- Mirror of the 3D evaluators for Geom2d curves and Bnd_Box2d.
  GeomBndLib_BSplineCurve2d applies the same Hunt-based partial-range
  optimization as the 3D counterpart.

Specialized surface evaluators:

- GeomBndLib_Plane: analytic corner-based box for planar patches, inline.
- GeomBndLib_Sphere: analytic extremum on axis-aligned sphere, exact for
  full sphere and arbitrary patches.
- GeomBndLib_Cylinder / GeomBndLib_Cone: circle-arc bounding box at
  extremal V-parameter positions.
- GeomBndLib_Torus: circle-arc bounding boxes at PI/4 V-boundary positions
  for fast Box(); PSO + Powell via GeomBndLib_OtherSurface for BoxOptimal().
  Resolves a regression in BndLib where the Torus AddOptimal case was
  missing from the switch and fell through to AddGenSurf, which converged
  to an incorrect result for tilted tori.
- GeomBndLib_BezierSurface: pole convex hull for full-range queries; grid
  sampling fallback for trimmed patches.
- GeomBndLib_BSplineSurface: pole convex hull with per-direction index
  selection via BSplCLib::Hunt (no surface copy or segment); grid sampling
  fallback for out-of-bounds parameters. BoxOptimal uses fine grid sampling
  combined with per-coordinate PSO + Powell minimization.
- GeomBndLib_SurfaceOfRevolution: circle-arc bounding boxes at PI/4
  V-boundary positions; degenerate (axis-on-surface) and infinite cases
  handled analytically via GeomBndLib_InfiniteHelpers.
- GeomBndLib_SurfaceOfExtrusion: extruded arc box added with the extrusion
  direction contribution; degenerate and infinite cases handled analytically.
- GeomBndLib_OffsetSurface: delegates to equivalent surface when available,
  otherwise conservative basis-box enlarged by |offset|.
- GeomBndLib_OtherSurface: PSO + Powell numerical optimization for general
  surface types; used directly by Torus and OffsetSurface BoxOptimal paths.

Internal helpers (private .pxx, not part of the public API):

- GeomBndLib_SplineHelpers: FillBox (knot-span sampler returning maximum
  chord deflection), ReduceSplineBox (convex hull intersection), indexed
  ReduceSplineBox overload for pole subset ranges, and
  ComputePoleIndexRange (BSplCLib::Hunt-based pole index selection shared
  by curve and surface evaluators).
- GeomBndLib_OptimizationHelpers: AdjustExtrCurve / AdjustExtrCurve2d /
  AdjustExtrSurf implementing Powell minimization seeded from a PSO pass
  for tight BoxOptimal results.
- GeomBndLib_SamplingHelpers: ComputeNbSamples / ComputeNbUSamples /
  ComputeNbVSamples providing consistent sample counts across all evaluators.
- GeomBndLib_InfiniteHelpers: open/infinite interval handling for surfaces
  of revolution and extrusion.

Tests:

- GeomBndLib_Curve_Test: 3D curve dispatching, all analytic types, BSpline
  and Bezier full and partial ranges, periodic curves, offset curves.
- GeomBndLib_Curve2d_Test: 2D curve dispatching, all analytic types, BSpline
  and Bezier full and partial ranges, offset curves.
- GeomBndLib_Surface_Test: surface dispatching, all analytic types including
  tilted and degenerate cases, Torus BoxOptimal vs analytic reference.
- GeomBndLib_OffsetCurve_Test: offset curve bounding box correctness and
  BoxOptimal precision for 3D cases.
- GeomBndLib_OffsetCurve2d_Test: same for 2D offset curves.
- GeomBndLib_OffsetSurface_Test: offset surface Box and conservative fallback.
- GeomBndLib_SurfaceOfRevolution_Test: full and partial revolution surfaces,
  degenerate and infinite cases.
- GeomBndLib_SurfaceOfExtrusion_Test: straight and BSpline extrusions,
  diagonal extrusion direction, infinite cases.
2026-03-04 14:18:38 +00:00
Pasukhin Dmitry 1cc42af8d6 Modeling Algorithms - Add Gordon surface construction from curve networks (#1131)
Add GeomFill_Gordon and GeomFill_GordonBuilder classes implementing Gordon surface (transfinite interpolation) construction via the Boolean sum formula: S = S_profiles + S_guides - S_tensor.

GeomFill_GordonBuilder is the low-level kernel accepting pre-compatible BSpline curves with known intersection parameters. GeomFill_Gordon is the high-level wrapper handling arbitrary Geom_Curve inputs, automatic intersection detection, network sorting/orientation, approximation-based reparametrization with kink preservation, scale-relative tolerances, closedness detection, and OSD_Parallel acceleration.

Add Approx_BSplineApproxInterp class implementing constrained least-squares B-spline approximation with exact interpolation constraints via a KKT saddle-point system, used internally by the reparametrization pipeline.

45 GTests covering both classes validate bilinear through 6x6 networks, reversed/shuffled inputs, scaled geometry, surface continuity, and the Boolean sum mathematical property.
2026-03-03 08:14:03 +00:00
Pasukhin Dmitry 6606bc75af Modeling Data - Harden geometry builders and add regression GTests (#1129)
Improve robustness and status handling across TKGeomBase construction code and extend unit coverage for boundary/degenerate cases.

Code changes:
- gce_MakeCone:
  - fix perpendicular direction fallback branches
  - implement gp_Cone + gp_Pnt / gp_Cone + Dist constructors
  - add defensive radius handling and semi-angle cosine guard
- gce_MakeCylinder:
  - fix perpendicular direction fallback branches
- GCE2d_MakeCircle, GC_MakePlane:
  - propagate status from delegated gce builders instead of forcing Done
- GC_MakeArcOfCircle:
  - replace hardcoded tolerance with Precision::Confusion()
- GCE2d_MakeSegment:
  - replace exact zero checks with gp::Resolution()-based checks
- gce_MakeCirc2d:
  - migrate to gp::Resolution() and remove boundary overlap in branch setup
- gce_MakeElips, gce_MakeHypr:
  - add explicit near-zero cross-product guards before gp_Dir construction
- ProjLib_Cone:
  - replace exact x/y zero check with angular tolerance
  - document tolerance intent for atan2 stability
- ProjLib_ComputeApproxOnPolarSurface:
  - replace period != 0.0 checks with Precision::PConfusion()
- ElCLib:
  - replace Focal == 0.0 checks with abs(Focal) <= gp::Resolution()

Tests:
- add new TKGeomBase GTests for:
  - gce_MakeCone, gce_MakeCylinder, gce_MakeCirc2d, gce_MakeElips
  - GCE2d_MakeCircle, GCE2d_MakeSegment
  - GC_MakePlane, GC_MakeArcOfCircle, GC_MakeConicalSurface
  - ProjLib_Cone, ProjLib_ComputeApproxOnPolarSurface
- extend ElCLib tests with near-zero and above-threshold parabola focal cases
2026-02-28 15:49:14 +00:00
Pasukhin Dmitry 00eadd4098 Modeling Data, AdvApp2Var - Reorganize private data/init code, modernize legacy types (#1127)
- Replace public-style data header with private `AdvApp2Var_Data.pxx` aggregation and rename data fragments to dedicated `AdvApp2Var_Data_*.pxx` files.
- Remove obsolete `AdvApp2Var_Data_f2c.hxx` and migrate legacy Fortran typedef/macro usage to native C++ types and standard helpers.
- Merge static initialization logic into main compilation units (`AdvApp2Var_MathBase.cxx`, `AdvApp2Var_SysBase.cxx`) and drop separate init sources.
- Remove unused SysBase legacy entry points and apply readability cleanup in AdvApp2Var internals.
- Add per-file GTests (`AdvApp2Var_Context_Test`, `AdvApp2Var_Framework_Test`, `AdvApp2Var_Iso_Test`, `AdvApp2Var_Network_Test`, `AdvApp2Var_Node_Test`) and update package/GTests `FILES.cmake`.
2026-02-27 21:48:34 +00:00
Pasukhin Dmitry 2ce7b26ddb Coding - Standardize comment separators, translate French comments (#1126)
Normalize method separator lines across the codebase to exactly
100 characters (// followed by 98 = signs) matching the project
coding standard.

Translate remaining French comments to English in ModelingData
packages (TKBRep, TKG2d, TKG3d, TKGeomBase) and FoundationClasses.

Add [[nodiscard]] attribute to Copy() methods on Geom_Geometry,
Geom2d_Geometry, Geom_Transformation, and Geom2d_Transformation
to prevent accidental discard of returned handles.

Fix typo in AppDef_Variational::Dump() debug output: "Nombre of
3d par multipoint" -> "Number of 3d per multipoint".

Update .github/copilot-instructions.md separator examples to match
the corrected convention.
2026-02-27 12:34:21 +00:00
Loke Strøm d7abd72eac Modeling, Hyperbola - Fixing over constraining direction errors (#1100)
- Removed `gce_InvertAxis` and `gce_InvertRadius` error checks from hyperbola constructors
- Added collinear point validation to the 3-point constructors
- Updated documentation to reflect the correct validation rules
2026-02-27 08:39:14 +00:00
Pasukhin Dmitry c9ecf72850 Modeling Data - Extend Prop packages with per-type GTests and shared tools (#1125)
Extract duplicated curve analysis logic (tangent, curvature, normal,
centre of curvature, inflection/extrema finding) from per-type evaluators
(BezierCurve, BSplineCurve, OffsetCurve, OtherCurve) into shared
CurveAnalysisTools.pxx for both GeomProp (3D) and Geom2dProp (2D).

Add GeomProp::ComputeTangent overload with sign correction using
finite-difference points, and use it in BRepProp_Curve::Tangent to
properly handle degenerate D1 cases instead of falling back to
unsigned higher-order derivatives.

Add GeomProp_Curve::Continuity static methods for computing junction
continuity (C0/G1/C1/C2) between two Geom_Curve handles, with BSpline
knot-multiplicity analysis and optional orientation reversal flags.

Add 29 per-geometry-type GTest files (9 3D curves, 9 2D curves,
11 3D surfaces) covering:
- Analytical property verification against known formulas
- VsCLProps/VsCLProps2d/VsSLProps comparison with legacy LProp APIs
  at both uniform samples and critical points (vertices, poles, knots,
  seams, endpoints, near-degenerate regions)
- FindCurvatureExtrema/FindInflections validation where applicable

Update existing VsCLProps, VsCLProps2d, VsSLProps, and VsBRepLProp
comparison tests with improved structure and broader coverage.
2026-02-26 22:33:27 +00:00
Pasukhin Dmitry 180906866e Modeling Data - Update hardcoded AppCont_ContMatrices (#1117)
- Replaced old AppCont_ContMatrices.hxx/.cxx public interface with internal namespace-based .pxx header structure
- Split legacy matrix data into separate internal headers (BB, InvM, IBP, IBT, VB) for better organization
- Fixed out-of-bounds read in IBPMatrix for classe=26 by adding 3 missing data entries
- Added comprehensive GTest suite with 9 tests covering all matrix functions and their mathematical properties
2026-02-25 20:39:31 +00:00
Pasukhin Dmitry 12b54504ee Modeling Data - Enforce construction-time initialization for Prop and GridEval classes (#1118)
Replace two-step initialization (default constructor + Initialize) with
direct construction for 8 non-copyable/non-movable property and grid
evaluator classes. Objects are now always in a valid state after construction.

Refactored classes:
- GeomProp_Curve, GeomProp_Surface (TKG3d)
- Geom2dProp_Curve (TKG2d)
- BRepProp_Curve, BRepProp_Surface (TKBRep)
- GeomGridEval_Curve, GeomGridEval_Surface (TKG3d)
- Geom2dGridEval_Curve (TKG2d)

Changes per class:
- Remove default constructor and IsInitialized() method.
- Add constructors matching each former Initialize overload.
- Rename Initialize to protected initialization method for internal
  and derived class use.

All callers updated across production code (Extrema, BndLib,
IntCurveSurface, IntPatch, HLRBRep, GeomGridEval derived classes)
and test files to use constructor-based initialization.
2026-02-25 15:06:57 +00:00
Pasukhin Dmitry 33ef11ca53 Modeling Data - Add BRepProp package for modern BRep differential properties (#1116)
Add new BRepProp package to TKBRep as a thin wrapper over GeomProp:: free
functions for computing local differential properties of BRep edges and faces
without exceptions. Replaces the legacy BRepLProp macro-based (.gxx) pattern.

New package BRepProp (TKBRep) provides:
- BRepProp_Curve: Local curve property evaluator for BRep edges.
  Delegates derivative computation to BRepAdaptor_Curve and passes results
  to GeomProp::ComputeTangent, ComputeCurvature, ComputeNormal,
  ComputeCentreOfCurvature. Three Initialize overloads: from TopoDS_Edge
  (owning), from BRepAdaptor_Curve reference (non-owning), and from
  occ::handle<BRepAdaptor_Curve> (shared ownership). Includes static
  Continuity() methods for regularity analysis at curve junctions
  (replaces BRepLProp::Continuity).
- BRepProp_Surface: Local surface property evaluator for BRep faces.
  Delegates derivative computation to BRepAdaptor_Surface and passes results
  to GeomProp::ComputeSurfaceNormal, ComputeSurfaceCurvatures,
  ComputeMeanGaussian. Same three Initialize overloads as BRepProp_Curve.

Key design decisions:
- No variant dispatch needed: BRepAdaptor_Curve/Surface handle geometry-type
  dispatch internally via virtual methods, so BRepProp is a thin wrapper
  calling adaptor D1/D2/D3 then GeomProp:: free functions.
- Ownership pattern: occ::handle for owning case + raw const pointer for
  non-owning case, consistent with GeomProp_Curve/Surface.
- Returns result structs with IsDefined flags instead of throwing exceptions.

18 GTests: 11 unit tests (line, circle, box, cylinder, sphere) and
7 cross-validation tests against BRepLProp_CLProps/BRepLProp_SLProps.
2026-02-24 22:19:34 +00:00
Pasukhin Dmitry 55db67c60d Modeling Data - Add GeomProp package for modern 3D curve and surface differential properties (#1115)
Add new GeomProp package to TKG3d following the same C++17 std::variant-dispatched
pattern as Geom2dProp (TKG2d) for computing local differential properties
of 3D curves and surfaces without exceptions.

New package GeomProp (TKG3d) provides:
- GeomProp: Result structs (TangentResult, CurvatureResult, NormalResult,
  CentreResult, CurveAnalysis for curves; SurfaceNormalResult,
  SurfaceCurvatureResult, MeanGaussianResult for surfaces) and
  geometry-agnostic free functions for property computation from derivatives.
- GeomProp_Curve: Unified variant dispatcher that auto-detects curve type
  from Geom_Curve or Adaptor3d_Curve and delegates to specialized evaluators.
  Owns the GeomAdaptor_Curve handle and passes non-owning raw pointers to
  per-geometry classes.
- GeomProp_Surface: Unified variant dispatcher that auto-detects surface type
  from Geom_Surface or Adaptor3d_Surface and delegates to specialized evaluators.
  Owns the GeomAdaptor_Surface handle with non-owning raw pointers.
- Per-geometry curve evaluators (9 types matching GeomAbs_CurveType):
  Line (header-only), Circle (header-only), Ellipse, Hyperbola, Parabola,
  BezierCurve, BSplineCurve, OffsetCurve, OtherCurve.
- Per-geometry surface evaluators (11 types matching GeomAbs_SurfaceType):
  Plane (header-only), Cylinder (header-only), Sphere (header-only),
  Cone, Torus, BezierSurface, BSplineSurface, SurfaceOfRevolution,
  SurfaceOfExtrusion, OffsetSurface, OtherSurface.
- Surface curvatures computed via first/second fundamental forms with
  correct sign convention consistent with surface normal orientation.
  Principal directions derived from the shape operator (Weingarten map).

48 GTests covering free functions, curve/surface dispatchers,
cross-validation against GeomLProp_CLProps (8 curve types) and
GeomLProp_SLProps (6 surface types).
2026-02-24 18:51:11 +00:00
Pasukhin Dmitry 3266a82318 Modeling Data - Add Geom2dProp package for modern 2D curve differential properties (#1113)
Replace archaic LProp/Geom2dLProp macro-based (.gxx) pattern with a modern C++17 std::variant-dispatched package for computing local differential properties of 2D curves: tangent, curvature, normal, centre of curvature, curvature extrema, and inflection points.

New package Geom2dProp (TKG2d) provides:
- Geom2dProp: Result structs (TangentResult, CurvatureResult, NormalResult, CentreResult, CurveAnalysis) and geometry-agnostic free functions for property computation from derivatives.
- Geom2dProp_Curve: Unified variant dispatcher that auto-detects curve type from Geom2d_Curve or Adaptor2d_Curve2d and delegates to specialized evaluators. Owns the Geom2dAdaptor_Curve handle and passes non-owning raw pointers to per-geometry classes.
- Per-geometry evaluators with optimized evaluation:
  - Line (header-only): zero curvature, constant tangent
  - Circle (header-only): constant curvature 1/R
  - Ellipse: analytical extrema at 0, PI/2, PI, 3PI/2
  - Hyperbola: analytical extremum at vertex
  - Parabola: analytical extremum at vertex
  - BezierCurve: numeric curvature extrema/inflection finding
  - BSplineCurve: numeric with C3 interval subdivision
  - OffsetCurve: numeric approach
  - OtherCurve: fallback via adaptor virtual D1/D2/D3

Key design decisions:
- Uses Geom2dAdaptor_Curve for optimized derivative evaluation (D0-DN) with BSpline span caching.
- Non-owning raw pointers in per-geometry classes; lifetime managed by the Geom2dProp_Curve dispatcher which holds the adaptor handle.
- Returns result structs with IsDefined flags instead of throwing exceptions for degenerate cases.
- 106 GTests covering all curve types, free functions, adaptor/geometry initialization, trimmed curves, cross-validation against LProp.
2026-02-24 17:10:36 +00:00
Pasukhin Dmitry 9ee9dc02a4 Modeling Data - Fix IsClosed/IsPeriodic tolerance and add TKG2d GTests (#1109)
IsClosed() methods across curve and surface classes used gp::Resolution() (~1e-290) for point distance comparison, making the check practically unusable for floating-point evaluated points. Replaced with Precision::Computational() (~DBL_EPSILON) which correctly represents machine-precision arithmetic equality.

TrimmedCurve (2D/3D) and RectangularTrimmedSurface IsClosed() and IsPeriodic() now detect when the trim spans an integer multiple of the basis geometry period using std::remainder(), instead of unconditionally returning false for trimmed parametric ranges.

Added 17 new GTest files (271 tests) for TKG2d covering previously untested packages: Adaptor2d, Geom2dLProp, LProp, and fundamental Geom2d classes (Circle, Ellipse, Line, Hyperbola, Parabola, TrimmedCurve, Transformation, VectorWithMagnitude, Direction, CartesianPoint, AxisPlacement).

IsClosed() tolerance fix applied to:
- Geom2d_TrimmedCurve, Geom_TrimmedCurve
- Geom2d_BSplineCurve, Geom_BSplineCurve
- Geom2d_OffsetCurve, Geom_OffsetCurve

IsPeriodic() / IsUPeriodic() / IsVPeriodic() fix applied to:
- Geom2d_TrimmedCurve, Geom_TrimmedCurve
- Geom_RectangularTrimmedSurface (also IsUClosed/IsVClosed)
2026-02-24 15:34:22 +00:00
Pasukhin Dmitry 95b2c6ee3e Modeling Data - Optimize evaluation of derivatives in GeomEval_TBezierSurface (#1114)
- Extract common subexpressions in `EvalD2` (6 intermediate products) and `EvalD3` (10 intermediate products) to avoid redundant multiplications
- Improve inline comments to include explicit formulas for derivative computations
2026-02-24 15:11:04 +00:00
Pasukhin Dmitry e8012824d6 Modeling Data - Remove TColGeom2d and TColGeom packages (#1110) 2026-02-23 17:41:02 +00:00
Pasukhin Dmitry a816f8a30e Modeling Data - Add Eval geometry classes and integrate EvalRep dispatch (#1104)
Introduce new evaluation-focused geometry classes in TKG2d/TKG3d:

- Geom2dEval_AHTBezierCurve
- Geom2dEval_TBezierCurve
- Geom2dEval_SineWaveCurve
- Geom2dEval_ArchimedeanSpiralCurve
- Geom2dEval_LogarithmicSpiralCurve
- Geom2dEval_CircleInvoluteCurve
- GeomEval_AHTBezierCurve
- GeomEval_TBezierCurve
- GeomEval_SineWaveCurve
- GeomEval_CircularHelixCurve
- GeomEval_AHTBezierSurface
- GeomEval_TBezierSurface
- GeomEval_CircularHelicoidSurface
- GeomEval_EllipsoidSurface
- GeomEval_HyperboloidSurface
- GeomEval_ParaboloidSurface
- GeomEval_HypParaboloidSurface

Move and rename EvalRep descriptors/utilities to Geom2dEval/GeomEval
packages and wire EvalRep dispatch into Geom2d/Geom entities and adaptor
EvalD* paths.

Harden Eval API contracts by throwing Standard_NotImplemented for unsupported
operations (Reverse/ReversedParameter, U/VReverse/U/VReversedParameter,
Transform, UIso/VIso where applicable). Align behavioral checks and invariants,
including non-periodic sine-wave behavior and stricter parameter validation
(e.g. hyperboloid radii).
2026-02-23 12:44:45 +00:00
Pasukhin Dmitry e384f0bb93 Testing - Add unit tests for geometric classes and conversions (#1099)
- Introduced new tests for TopExp class to validate shape mapping and vertex retrieval.
- Added tests for Geom_Circle, Geom_Line, and Geom_Plane classes to ensure correct geometric behavior and transformations.
- Implemented tests for GCPnts_AbscissaPoint to verify length calculations and parameter retrieval for lines and circles.
- Created conversion tests in GeomConvert to check the accuracy of converting geometric entities to B-spline representations.
- Updated CMake files to include new test files for the added tests.
2026-02-20 20:25:09 +00:00
Pasukhin Dmitry 48ebca0f70 Modeling Data - Remove std::optional from EvalD* evaluation API (#1094)
Replace std::optional return types with direct returns and exception-based
error handling in Geom/Geom2d/Surface EvalD0/D1/D2/D3/DN methods to avoid
performance overhead of std::optional wrapping on the hot evaluation path.

Changes:
- EvalD* methods now return result structs directly instead of
  std::optional<T>, throwing Geom_UndefinedValue/Geom_UndefinedDerivative
  on failure
- D0/D1/D2/D3/DN inline wrappers simplified to unpack direct returns
  instead of checking optional validity
- TryEval* helper functions in EvalRepUtils converted from
  std::optional<T> returns to bool + output parameter pattern
- Adaptor classes (Adaptor3d_Curve/Surface, Adaptor2d_Curve2d,
  GeomAdaptor_Curve/Surface, Geom2dAdaptor_Curve) simplified by
  removing try-catch wrappers around evaluation calls
- Removed dead #include <optional> from 5 header files
- Updated GTests to match new direct-return API
2026-02-15 17:41:13 +00:00
Pasukhin Dmitry 13d6dfc2e7 Modeling Data - Integrate EvalRep descriptors and dispatch for Geom/Geom2d (#1089)
Introduce EvalRep descriptors for selected Geom and Geom2d curve/surface
classes and add inline EvalRep utilities for evaluation dispatch with
fallback to native paths.

- add per-class Set/Get/Clear EvalRepresentation API and storage
- support full, derivative-bounded and mapped descriptors
- validate mapped parameter transforms in SetEvalRepresentation()
- migrate Geom_OffsetSurface equivalent-surface path to EvalRep
- clone EvalRep descriptors in copy constructors and Copy() paths
- update adaptors to use EvalRep in supported branches
- keep EvalRep invalidation in geometry mutators and fix regressions
2026-02-15 09:26:56 +00:00
Pasukhin Dmitry c9bdc4b9f1 Modeling Algorithms - Optimize properties computation for complex compounds (#1091)
Optimized exact vprops path for OCC28402 by reducing TopLoc_Location
composition overhead in edge pcurve lookup.

Changes:
- added fast-path exits in TopLoc_Location::Predivided() for identity and
  equal-location cases;
- cached face surface/location in BRepGProp_Face and reused this context in
  Load(const TopoDS_Edge&);
- in BRep_Tool::CurveOnSurface(...), compute Predivided() only when edge
  has curve representations to iterate.

This keeps algorithmic behavior unchanged and targets the performance
regression reported by tests/bugs/modalg_7/bug28402.
2026-02-15 09:24:57 +00:00
Pasukhin Dmitry 9a85da2ee5 Modeling Data - Optimize adaptor Bezier cache and grid eval threshold (#1084)
Remove redundant IsCacheValid() checks for Bezier curves and surfaces
in EvalD0/D1/D2/D3 methods. Bezier geometry has a single span, so the
cache is always valid once constructed, unlike multi-span B-splines.

Lower THE_CACHE_THRESHOLD from 4 to 2 in GeomGridEval B-spline
evaluators to use cache-based evaluation more aggressively.
2026-02-14 00:14:29 +00:00
Pasukhin Dmitry fcd88b933f Modeling Data - Add Geom2dGridEval package for batch 2D curve evaluation (#1079)
Add new Geom2dGridEval package in TKG2d providing batch evaluation of 2D curves at multiple parameter values, mirroring the existing 3D GeomGridEval package in TKG3d. Specialized evaluators use analytical formulas for conics and cache-based evaluation for BSpline/Bezier curves, with a unified std::variant dispatcher for automatic type-based dispatch.

New classes:
- Geom2dGridEval_Line (header-only), _Circle, _Ellipse, _Hyperbola, _Parabola, _BezierCurve, _BSplineCurve, _OffsetCurve, _OtherCurve
- Geom2dGridEval_Curve: unified dispatcher with Initialize() from Adaptor2d_Curve2d or occ::handle<Geom2d_Curve>
- Geom2dGridEval.hxx: CurveD1/D2/D3 result structures

BSplCLib_Cache changes:
- Add D0Local/D1Local/D2Local/D3Local overloads for gp_Pnt2d/gp_Vec2d
- Refactor existing 2D D0/D1/D2/D3 methods to delegate to D*Local, consistent with the existing 3D delegation pattern
2026-02-13 22:41:40 +00:00
Pasukhin Dmitry ea9443d154 Modeling Data - Optimize BSplCLib interpolation and blend evaluation erformance (#1082)
Profiling identified several performance bottlenecks in the BSpline interpolation and blend surface computation pipeline. This commit addresses them through four categories of optimization:

1. Static initialization for GeomFill convertors: the monomial-to-BSpline conversion matrices in GeomFill_QuasiAngularConvertor::Init() and GeomFill_PolynomialConvertor::Init() are mathematical constants that were recomputed on every call via Convert_CompPolynomialToPoles. Now computed once via static lambda-initialized locals.

2. Stack allocation for small matrices/arrays: InterpolationMatrix in BSplCLib::Interpolate, aBSplineBasis in BuildBSpMatrix, and parameters/contact_array in Convert_CompPolynomialToPoles::Perform now use stack buffers when sizes fit, avoiding heap allocation.

3. Raw pointer access in hot loops: replaced multi-layer accessor chains (math_Matrix::Value -> math_DoubleTab::Value -> NCollection_Array2::Value -> NCollection_Array1::at with bounds checks) with direct pointer arithmetic in EvalBsplineBasis, FactorBandedMatrix, BuildBSpMatrix, SolveBandedSystem, and math_VectorBase operations (Multiply, TMultiply, Multiplied, Norm, Norm2).

4. Eliminated redundant recomputation: cached AdvApprox_ApproxAFunction:: NbPoles() results in Approx_SweepApproximation, Approx_CurveOnSurface, and Approx_Curve2d instead of recomputing BSplCLib::NbPoles in inner loops. Cached math_FunctionSetRoot solver in BRepBlend_AppFuncRoot to avoid repeated construction/destruction per SearchPoint call.

Also fixed undefined behavior in BSplCLib::NbPoles where pointer arithmetic created a pointer before the array start (pmu -= f).
2026-02-13 21:35:03 +00:00
Pasukhin Dmitry 7295facb87 Modeling Data, Algorithms - Add std::optional evaluation API to Geom/Geom2d/Surface hierarchies (#1064)
Introduce exception-safe evaluation methods (EvalD0/EvalD1/EvalD2/EvalD3/EvalDN) returning std::optional across the entire Geom_Curve, Geom2d_Curve, and Geom_Surface class hierarchies. These replace the old throwing D0/D1/D2/D3/DN as the primary virtual dispatch points. The old output-parameter methods are retained as non-virtual inline backward-compatible wrappers that throw on failure.

Key design decisions:
- std::optional<T> chosen over embedded-bool structs: identical performance (same 8-byte alignment overhead for POD types), but provides standard C++17 vocabulary, sanitizer-detectable invalid access, and natural return of gp_Pnt for D0 / gp_Vec for DN without wrapper types.
- NRVO optimization: always-succeeding classes (25 of 29) use std::optional<T>{std::in_place} as the local variable, enabling Named Return Value Optimization for zero-copy returns. Failure-path classes (Offset*, GeomPlate, Bisectors) retain early-return std::nullopt pattern.

New headers:
- Geom.hxx: POD result structs Geom_CurveD1/D2/D3, Geom_SurfD1/D2/D3 bundling point + derivative vectors for 3D curves and surfaces.
- Geom2d.hxx: POD result structs Geom2d_CurveD1/D2/D3 for 2D curves.

Base class changes (Geom_Curve, Geom_Surface, Geom2d_Curve):
- New pure virtual EvalD0/EvalD1/EvalD2/EvalD3/EvalDN returning std::optional; std::nullopt signals evaluation failure without exceptions.
- Old void D0(U,P) / void D1(U,P,V1) / gp_Vec DN(U,N) etc. become non-virtual inline wrappers that throw Geom_UndefinedValue/Geom_UndefinedDerivative on nullopt, preserving all existing call sites unchanged.

Leaf class implementations (32 classes, 87 files):
- 7 Geom_Curve leaves: Line, Circle, Ellipse, Hyperbola, Parabola, BSplineCurve, BezierCurve - always succeed, NRVO-optimized.
- 2 Geom_Curve delegators: TrimmedCurve, OffsetCurve - forward to basis curve.
- 11 Geom_Surface leaves: Plane, CylindricalSurface, ConicalSurface, SphericalSurface, ToroidalSurface, BSplineSurface, BezierSurface, SurfaceOfLinearExtrusion, SurfaceOfRevolution - always succeed, NRVO-optimized.
- 2 Geom_Surface delegators: RectangularTrimmedSurface, OffsetSurface.
- 7 Geom2d_Curve leaves: Line, Circle, Ellipse, Hyperbola, Parabola, BSplineCurve, BezierCurve - always succeed, NRVO-optimized.
- 2 Geom2d_Curve delegators: TrimmedCurve, OffsetCurve.
- 3 external subclasses: Bisector_BisecAna, Bisector_BisecCC, Bisector_BisecPC, ShapeExtend_ComplexCurve, ShapeExtend_CompositeSurface, GeomPlate_Surface.

Additional changes:
- GeomGridEval.hxx: replaced duplicated struct definitions with type aliases (using CurveD1 = Geom_CurveD1, etc.).
- GeomAdaptor_Surface.cxx: updated to use new EvalD* API.

GTests added (3 files, 15 test cases):
- Geom_CurveEval_Test.cxx: Circle D0/D1/D2/D3, Line D2, BSpline consistency with old API, EvalDN vs EvalD1 consistency, OffsetCurve nullopt/throw paths.
- Geom_SurfaceEval_Test.cxx: Plane D0/D1, Sphere D1, BSplineSurface D2 consistency with old API, OffsetSurface on regular surface.
- Geom2d_CurveEval_Test.cxx: Circle D0/D1, OffsetCurve nullopt path, BSpline consistency with old API.
2026-02-13 16:08:55 +00:00
Pasukhin Dmitry 56e162c480 Coding - Fix critical CodeQL static analysis warnings (#1074)
Interface_ParamSet:
- Eliminate use-after-free in Append() by deleting old buffer through
  a temp variable after reassigning the member pointer (CodeQL #5132/#2684)

delabella.cpp:
- Fix upcast array pointer arithmetic by parenthesizing cast to ensure
  pointer arithmetic uses derived class (Vert) size rather than base
  class (DelaBella_Vertex) size (CodeQL #5131)

NCollection_SparseArrayBase:
- Rework to replace virtual dispatch (createItem/destroyItem/copyItem)
  with function pointers passed as arguments to protected methods
- Store only DestroyItemFunc in base class to enable safe cleanup
  in destructor without virtual dispatch
- Pass CreateItemFunc and CopyItemFunc as arguments with zero
  per-instance storage overhead
- Move Clear() and UnsetValue() from base public API to protected
  clearItems()/unsetValue() with function pointer parameters;
  template class provides public wrappers
- Remove vtable entirely (no virtual methods remain)
- This eliminates the pure virtual call during base class destruction
  (CodeQL #5012)

AdvApp2Var_MathBase:
- Rewrite comparison to avoid potential signed integer overflow:
  *ncfnew + 1 > ncut becomes *ncfnew >= ncut (CodeQL #2692)
2026-02-13 08:48:17 +00:00
Pasukhin Dmitry bfa0311ef0 Foundation Classes - Tree & collection performance optimizations, move semantics, unified map API (#1065)
NCollection_UBTree/EBTree:
- Add move constructor and move assignment operators
- Replace recursive Select() and delNode() with iterative stack-based
  traversal to avoid stack overflow on deeply unbalanced trees
- Optimize EBTree::Add() and Remove() to use single-lookup TryEmplaced()
  instead of double-lookup UnBind()+Bind() / Contains()+operator()
- Remove unused DEFINE_HUBTREE / DEFINE_HEBTREE / IMPLEMENT_HUBTREE /
  IMPLEMENT_HEBTREE macros
- Remove unused includes from EBTree (Standard_Type, Standard_Transient,
  NCollection_List, Standard_Integer, NCollection_Sequence)
- Fix doxygen @param tags and comment style

NCollection_LocalArray:
- Add move constructor and move assignment operators with optimized
  three-way branching (stack-stack copy, heap-heap swap, stack-heap steal)
- Add Reallocate() method supporting grow-with-copy for use as a
  dynamically growable stack
- Add static_assert enforcing trivially copyable element type

NCollection_CellFilter:
- Replace const_cast destructive-copy hack in Cell with proper move
  semantics; delete copy constructor and copy assignment
- Add Cell constructor from CellIndex for lightweight lookup keys
- Refactor add()/iterateAdd() to accept CellIndex instead of Cell,
  use TryEmplaced() for single-lookup cell insertion
- Refactor remove()/inspect() to use Contained() API with const_cast
  instead of C-style cast on Seek()
- Change ListNode default constructor from runtime throw to = delete
- Use size_t for dimension loops and add dimension size guard in IsEqual
- Remove SUN WorkShop 5.3 workaround
- Fix typo "usially" -> "usually" in class documentation

NCollection map API unification (Contained, TryEmplace, TryBind):
- Add Contained() to all map types returning std::optional with
  std::reference_wrapper; key-only maps return const key ref,
  data maps return std::pair of const key ref + value ref
- Add TryEmplace()/TryEmplaced() to NCollection_FlatMap and
  NCollection_IndexedMap for parity with NCollection_Map
- Add TryBind() to NCollection_IndexedDataMap for parity with
  NCollection_DataMap and NCollection_FlatDataMap
- Remove Seek()/ChangeSeek() from NCollection_Map (replaced by
  Contained())

Dead compiler workaround removal:
- NCollection_DefineAlloc: remove Borland/SUN #if branch, keep only
  the version with placement delete
- NCollection_SparseArrayBase: remove SUN WorkShop 5.3 workaround

GTests:
- Add move constructor/assignment tests for LocalArray, UBTree, EBTree
- Add Contained tests for NCollection_Map
- Add CellFilter tests and UBTree deep-unbalanced-tree stress test
2026-02-12 20:28:20 +00:00
Pasukhin Dmitry 2dcf137910 Modeling Data, Algorithms - Devirtualize adaptor dispatch, mark leaf Geom classes final (#1063)
Eliminate virtual dispatch for elementary geometry evaluation in GeomAdaptor_Curve, GeomAdaptor_Surface, and Geom2dAdaptor_Curve by storing gp_* primitives directly in std::variant and calling ElCLib/ElSLib static methods instead of going through virtual myCurve->D0()/mySurface->D0() calls.

Extend CurveDataVariant/SurfaceDataVariant with elementary types:
- GeomAdaptor_Curve: gp_Lin, gp_Circ, gp_Elips, gp_Hypr, gp_Parab
- GeomAdaptor_Surface: gp_Pln, gp_Cylinder, gp_Cone, gp_Sphere, gp_Torus
- Geom2dAdaptor_Curve: gp_Lin2d, gp_Circ2d, gp_Elips2d, gp_Hypr2d, gp_Parab2d

The load() method now extracts and stores the gp_* primitive at construction time. D0-DN methods dispatch via switch on the curve/surface type enum, calling ElCLib/ElSLib directly for elementary types. Accessor methods (Line(), Circle(), Plane(), etc.) return from the variant when available, avoiding repeated downcasts.

Mark every override method as final on all 29 concrete (leaf) classes in Geom_* and Geom2d_* hierarchies. These classes have no subclasses, so final enables compiler devirtualization and clearly documents the design intent. Affected methods include D0-DN, Reverse, Transform, Copy, DumpJson, and all other overridden virtuals.

Fix ShallowCopy in GeomAdaptor_Curve and GeomAdaptor_Surface where elementary gp_* types stored in the variant were not copied to the new object, which would cause std::bad_variant_access on first evaluation of the copy.
2026-02-11 17:19:54 +00:00
Pasukhin Dmitry 964a2c75df Modeling Data, Algorithms - Always-populated weights, direct array access migration, Hermit bug fix (#1058)
Introduce always-populated weight arrays in BSpline/Bezier curve and surface
classes using non-owning views over a static unit-weights buffer. Migrate
~100 callers across the codebase from deprecated copy-out APIs to direct
const-reference array access. Fix a long-standing typo bug in Hermit.cxx.

Infrastructure (BSplCLib, BSplSLib):
- Add BSplCLib::UnitWeights(n) returning a non-owning NCollection_Array1
  view over a compile-time-initialized static array of 2049 ones; falls
  back to heap allocation for larger sizes.
- Add BSplCLib::MaxUnitWeightsSize() (constexpr 2049) and
  BSplCLib::UnitWeightsData() exposing the raw pointer for BSplSLib.
- Add BSplSLib::UnitWeights(nU, nV) returning a non-owning
  NCollection_Array2 view when nU*nV <= 2049, heap-allocated otherwise.

Always-populated myWeights (Geom/Geom2d curve and surface classes):
- myWeights is now always sized to match poles count.
  Non-rational: non-owning view via UnitWeights (zero allocation).
  Rational: owning array with actual weight values.
- Add WeightsArray() returning const NCollection_Array1<double>& (curves)
  or const NCollection_Array2<double>& (surfaces) that is always valid.
- Update all constructors, copy constructors, and restructuring operations
  (IncreaseDegree, InsertKnots, RemoveKnot, Segment, SetPeriodic,
  SetOrigin, SetNotPeriodic, ExchangeUV, etc.) to maintain the invariant.
- SetWeight: copies non-owning view to owned array before mutation when
  transitioning to rational; assigns UnitWeights when becoming non-rational.
- Remove myRational derivation from myWeights.Size() in updateKnots();
  rationality is now tracked explicitly via the myRational flag only.
- Fix Geom2d_BSplineCurve::InsertPoleAfter missing myRational update
  after inserting a weighted pole.
- Fix Geom_BSplineCurve::DumpJson stale myWeights.Size() > 0 guard
  (changed to myRational, matching all other classes).

Caller migration to direct array access (~100 files):
- Replace deprecated copy-out pattern (allocate temp + call Foo(temp))
  with const-reference access for Poles(), Knots(), Multiplicities(),
  UKnots(), VKnots(), UMultiplicities(), VMultiplicities(),
  KnotSequence(), UKnotSequence(), VKnotSequence().
- Replace Weights() null-pointer patterns with WeightsArray() const-ref
  or *Weights() dereference where null check is still appropriate.
- Affected modules: GeomConvert, Geom2dConvert, GeomLib, GeomFill,
  ProjLib, ShapeUpgrade, ShapeCustom, ShapeConstruct, ShapeAnalysis,
  ShapeAlgo, BRepLib, BRepGProp, HLRBRep, ChFi3d, ChFiKPart, BlendFunc,
  FairCurve, IntTools, TopOpeBRepTool, TopOpeBRepBuild, LocOpe,
  BRepOffset, Adaptor3d, GeomAdaptor, Geom2dAdaptor, BndLib, Extrema,
  DrawTrSurf, GeometryTest, GeomliteTest, SWDRAW, QABugs,
  GeomToIGES, IGESToBRep, GeomToStep, StdPrs.

Bug fix in Hermit.cxx (PolyTest, both 3D and 2D overloads):
- Fix typo: "Pole0 < 3" changed to "Pole0 < Pole3" — was comparing
  a double variable against the integer literal 3 instead of the
  variable Pole3 holding the endpoint weight value.
- Fix logic: "if (boucle == 1)" changed to "else if (boucle == 1)"
  to make the boucle==1 and boucle==2 branches mutually exclusive.
- Add explanatory comments on BSplCLib::D1 calls that intentionally
  pass weight values as scalar "poles" to evaluate the weight function.

NCollection_PackedMapAlgo migration (TDataStd, QABugs):
- Replace deprecated member functions (IsSubset, Subtraction, Subtract,
  Unite, Intersect, IsEqual) with NCollection_PackedMapAlgo free functions.

GTests:
- New BSplCLib_Test.cxx: 5 tests for UnitWeights API.
- New BSplSLib_Test.cxx: 5 tests for surface UnitWeights API.
- New Hermit_Test.cxx: 11 tests for Hermit::Solution (3D/2D) and
  Hermit::Solutionbis covering uniform, distinct, high-ratio, reversed,
  symmetric weights and positive-poles invariant.
- Add WeightsArray tests to Geom_BSplineCurve_Test, Geom_BezierCurve_Test,
  Geom_BSplineSurface_Test, Geom_BezierSurface_Test (2 tests each)
  verifying const-ref return, non-owning for non-rational, owning for
  rational.
2026-02-10 18:41:34 +00:00
Pasukhin Dmitry 498e7cd173 Foundation Classes, Convert - Replace handle-based APIs with direct array access (#1057)
Refactor the Convert package to eliminate heap-allocated handle-based storage
in favor of direct NCollection_Array members, improving performance and
simplifying the API. Deprecate single-element accessors (Pole, Knot, etc.)
in favor of batch const-reference accessors (Poles, Knots, etc.).

Convert_ConicToBSplineCurve:
- Replace handle members (poles, weights, knots, mults) with direct
  NCollection_Array1 fields (myPoles, myWeights, myKnots, myMults).
- Replace BuildCosAndSin handle-based parameters with array references.
- Add batch accessors: Poles(), Weights(), Knots(), Multiplicities().
- Deprecate single-element accessors: Pole(), Weight(), Knot(), Multiplicity().
- Update all conic subclasses: Circle, Ellipse, Hyperbola, Parabola.

Convert_ElementarySurfaceToBSplineSurface:
- Replace handle members with direct NCollection_Array fields
  (myPoles, myWeights, myUKnots, myVKnots, myUMults, myVMults).
- Add Finalize() to trim oversized arrays in derived constructors.
- Add batch accessors: Poles(), Weights(), UKnots(), VKnots(),
  UMultiplicities(), VMultiplicities().
- Deprecate single-element accessors: Pole(), Weight(), UKnot(), VKnot(),
  UMultiplicity(), VMultiplicity().
- Update all surface subclasses: Cone, Cylinder, Sphere, Torus.

Convert_CompPolynomialToPoles / Convert_GridPolynomialToPoles:
- Replace handle-based output parameters with direct const-reference
  accessors for Poles, Knots, Multiplicities.
- Deprecate old handle-based Poles(), Knots(), Multiplicities() overloads.

Convert_CompBezierCurvesToBSplineCurve (2D and 3D):
- Extract common logic into Convert_CompBezierCurvesToBSplineCurveBase
  template header to eliminate code duplication.
- Replace handle<HArray1> members with direct NCollection_Array1 storage
  in the internal sequence, removing unnecessary heap indirection.

NCollection_Sequence:
- Fix Node constructors to use member initializer lists (copy/move
  construction) instead of default-construct + assign, which failed for
  types like NCollection_Array1 where operator= requires matching sizes.

Downstream callers migrated:
- AdvApprox_ApproxAFunction: use new const-ref Knots()/Multiplicities().
- AppDef_Variational: use new const-ref Knots()/Multiplicities().
- AdvApp2Var_ApproxAFunc2Var, AdvApp2Var_Patch: use new const-ref API.
- Geom2dConvert, GeomConvert, GeomConvert_1: use new const-ref API.
- GeomFill_PolynomialConvertor, GeomFill_QuasiAngularConvertor: adapted.
- Geom_OsculatingSurface: use direct array references instead of
  handle->Array*() calls.

Added GTests for all Convert classes covering conic curves,
elementary surfaces, CompBezier, CompPolynomial, and GridPolynomial
conversions.
2026-02-09 16:38:55 +00:00
Pasukhin Dmitry 87703a2dac Modeling Data - Refactor BSpline/Bezier classes to use direct array members (#1056)
Replace handle-based NCollection_HArray1/HArray2 members with direct
NCollection_Array1/Array2 value members in Geom_BSplineCurve,
Geom2d_BSplineCurve, Geom_BSplineSurface, Geom_BezierCurve,
Geom2d_BezierCurve and Geom_BezierSurface. This eliminates heap
indirection and reference counting overhead for exclusively owned data.

Changes:
- Replace handle-wrapped arrays with value members (myPoles, myWeights,
  myKnots, myFlatKnots, myMults) using OCCT myFieldName convention
- Bezier classes store only myPoles/myWeights; knots, multiplicities and
  flat knots are provided by public instance methods (BezierKnots,
  BezierMults, BezierFlatKnots, etc.) returning static arrays by degree
- Add WeightsPtr() inline method on all classes returning nullptr for
  non-rational geometry, replacing scattered ternary expressions
- Add InternalFlatKnots(), InternalPoles() inline accessors for grid
  evaluation without virtual dispatch
- Deprecate copy-out accessor overloads (Knots(Array1&), Poles(Array1&),
  etc.) in favor of const-reference returning versions
- Remove #define macros (POLES, KNOTS, FKNOTS, FMULTS, WEIGHTS) from
  BSplineCurve_1.cxx and BSplineSurface_1.cxx, replacing with direct
  member access
- Update GeomGridEval and Geom_OsculatingSurface for new accessors

Bug fixes:
- Fix Geom_BSplineCurve::IsEqual skipping knot comparison due to reused
  pole loop index; replaced with separate loop-scoped iterators
- Fix Geom_BSplineSurface::SetUNotPeriodic/SetVNotPeriodic using wrong
  NCollection_Array2 5-arg constructor; replaced with 4-arg + Init(0.0)
- Fix Geom_BezierSurface::Increase self-referencing Init(myPoles,
  &myWeights) call; replaced with direct rationality flag update

NCollection_Array2 enhancements:
- Add ResizeWithTrim() for 2D-preserving resize (copies common sub-matrix
  maintaining row/col positions)
- Handle resize from empty arrays and same-size bound changes without
  unnecessary reallocation
2026-02-09 09:53:05 +00:00
Dmitrii Kulikov f159fc0933 Modelling - Fixed crash in ComputePolesIndexes() (#1049)
- Replaced partial bound checks with `std::clamp()` to validate both bounds for `theOutMinIdx` and `theOutMaxIdx`
- Renamed local variable `mult` to `aMultiplier` for better clarity
2026-02-05 13:32:43 +00:00
Pasukhin Dmitry 553466c590 Modeling - Simplify GeomGridEval classes (#1031)
- Removed point evaluation methods from surface evaluators (Torus, Sphere, Cylinder, Cone, Plane, BSpline, Bezier, SurfaceOfRevolution, SurfaceOfExtrusion, OffsetSurface, OtherSurface)
- Simplified BSplineSurface and BSplineCurve evaluation implementations with cleaner helper templates
- Updated utility functions to use surface adaptors directly instead of grid evaluators
- Removed corresponding test cases for point-based evaluation methods
- Cleaned up unused includes (`gp_Pnt2d.hxx`) and helper structures (`UVPoint`, `UVPointWithSpan`
2026-01-24 14:24:40 +00:00
Pasukhin Dmitry 1f251bb5ac Testing - Update CI workflow to build and test on Ubuntu with GCC (#1028)
- Replaced macOS Clang (No PCH) job with Ubuntu GCC (No PCH) job in the workflow dependency list
- Updated the build job to use `ubuntu-24.04` runner with GCC compiler instead of `macos-15` with Clang
- Updated the test job to run on Ubuntu with GCC instead of macOS with Clang
2026-01-24 12:03:19 +00:00
Pasukhin Dmitry 3aeb4668f5 Foundation Classes - Refactor TShape hierarchy for performance and memory efficiency (#1027)
- Made ShapeType() non-virtual by embedding the shape type in a compact uint16_t state field alongside flags
- Replaced int myFlags with uint16_t myState using a BitLayout enum for compact storage
- Moved Compose/Reverse/Complement operations from TopAbs.cxx to inline implementations in TopAbs.hxx
- Updated all TShape derived class constructors to pass their type to the base class
- Refactored TopoDS_Iterator to use index-based iteration with updateCurrentShape() helper
2026-01-23 21:08:39 +00:00
Pasukhin Dmitry 36e781813e Coding - Revert type definitions for Standard_CString replacements (#1021)
Fix the replacement issue when Standard_CString was replaced to const char* even when it was const.
Now "const Standard_CString" is replaced with "const char* const".
Only places which were before const Standard_CString is replaced.
2026-01-21 10:09:22 +00:00
Pasukhin Dmitry a36bca57a9 Coding - Clean up the FILES (#1002)
- Removed legacy metadata entries (EXTERNLIB, PACKAGES, DEFINES, FILES) that are no longer used by the build system
- Removed references to obsolete build artifacts (.lex, .yacc files) that appear to be superseded by generated .c/.h files
- Removed references to non-source files (README.md, .tcl scripts, GUID.txt) that shouldn't be listed in source file manifests
2026-01-14 14:46:42 +00:00
Pasukhin Dmitry e1d36343e4 Foundation Classes - Inherited Standard_Failure from std::exception (#984)
First patch in iterative renovation of exceptions.

- Simplify exception classes to be container of data only.
- Removed redundant inclusion of <Standard_Type.hxx> in various header files across the project.
- Removed Set methods for failure and its define template.
- Removed Raise and Rerise static methods.
- Remove Instance and Throw methods
- Deprecated getting message with old approach, and moving to what()
- Update ErrorHandler to handle only specific list of exceptions.
2026-01-07 12:22:32 +00:00