mirror of
https://github.com/Open-Cascade-SAS/OCCT.git
synced 2026-08-17 09:24:31 +08:00
964a2c75df
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.
110 lines
4.1 KiB
C++
110 lines
4.1 KiB
C++
// Created on: 1994-02-18
|
|
// Created by: Bruno DUMORTIER
|
|
// Copyright (c) 1994-1999 Matra Datavision
|
|
// Copyright (c) 1999-2014 OPEN CASCADE SAS
|
|
//
|
|
// This file is part of Open CASCADE Technology software library.
|
|
//
|
|
// This library is free software; you can redistribute it and/or modify it under
|
|
// the terms of the GNU Lesser General Public License version 2.1 as published
|
|
// by the Free Software Foundation, with special exception defined in the file
|
|
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
|
// distribution for complete text of the license and disclaimer of any warranty.
|
|
//
|
|
// Alternatively, this file may be used under the terms of Open CASCADE
|
|
// commercial license or contractual agreement.
|
|
|
|
#include <Geom_BSplineCurve.hxx>
|
|
#include <GeomFill_SectionGenerator.hxx>
|
|
|
|
//=================================================================================================
|
|
|
|
GeomFill_SectionGenerator::GeomFill_SectionGenerator()
|
|
{
|
|
if (mySequence.Length() > 1)
|
|
{
|
|
occ::handle<NCollection_HArray1<double>> HPar =
|
|
new (NCollection_HArray1<double>)(1, mySequence.Length());
|
|
for (int i = 1; i <= mySequence.Length(); i++)
|
|
{
|
|
HPar->ChangeValue(i) = i - 1;
|
|
}
|
|
SetParam(HPar);
|
|
}
|
|
}
|
|
|
|
//=================================================================================================
|
|
|
|
void GeomFill_SectionGenerator::SetParam(const occ::handle<NCollection_HArray1<double>>& Params)
|
|
{
|
|
int ii, L = Params->Upper() - Params->Lower() + 1;
|
|
myParams = Params;
|
|
for (ii = 1; ii <= L; ii++)
|
|
{
|
|
myParams->SetValue(ii, Params->Value(Params->Lower() + ii - 1));
|
|
}
|
|
}
|
|
|
|
//=================================================================================================
|
|
|
|
void GeomFill_SectionGenerator::GetShape(int& NbPoles,
|
|
int& NbKnots,
|
|
int& Degree,
|
|
int& NbPoles2d) const
|
|
{
|
|
occ::handle<Geom_BSplineCurve> C = occ::down_cast<Geom_BSplineCurve>(mySequence(1));
|
|
NbPoles = C->NbPoles();
|
|
NbKnots = C->NbKnots();
|
|
Degree = C->Degree();
|
|
NbPoles2d = 0;
|
|
}
|
|
|
|
//=================================================================================================
|
|
|
|
void GeomFill_SectionGenerator::Knots(NCollection_Array1<double>& TKnots) const
|
|
{
|
|
TKnots = (occ::down_cast<Geom_BSplineCurve>(mySequence(1)))->Knots();
|
|
}
|
|
|
|
//=================================================================================================
|
|
|
|
void GeomFill_SectionGenerator::Mults(NCollection_Array1<int>& TMults) const
|
|
{
|
|
TMults = (occ::down_cast<Geom_BSplineCurve>(mySequence(1)))->Multiplicities();
|
|
}
|
|
|
|
//=================================================================================================
|
|
|
|
bool GeomFill_SectionGenerator::Section(const int P,
|
|
NCollection_Array1<gp_Pnt>& Poles,
|
|
NCollection_Array1<gp_Vec>&, // DPoles,
|
|
NCollection_Array1<gp_Pnt2d>& Poles2d,
|
|
NCollection_Array1<gp_Vec2d>&, // DPoles2d,
|
|
NCollection_Array1<double>& Weigths,
|
|
NCollection_Array1<double>& // DWeigths
|
|
) const
|
|
{
|
|
Section(P, Poles, Poles2d, Weigths);
|
|
return false;
|
|
}
|
|
|
|
//=================================================================================================
|
|
|
|
void GeomFill_SectionGenerator::Section(const int P,
|
|
NCollection_Array1<gp_Pnt>& Poles,
|
|
NCollection_Array1<gp_Pnt2d>&, // Poles2d,
|
|
NCollection_Array1<double>& Weigths) const
|
|
{
|
|
occ::handle<Geom_BSplineCurve> C = occ::down_cast<Geom_BSplineCurve>(mySequence(P));
|
|
|
|
Poles = C->Poles();
|
|
Weigths = C->WeightsArray();
|
|
}
|
|
|
|
//=================================================================================================
|
|
|
|
double GeomFill_SectionGenerator::Parameter(const int P) const
|
|
{
|
|
return myParams->Value(P);
|
|
}
|