mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
Integration of OCCT 6.5.0 from SVN
This commit is contained in:
384
src/GeomFill/GeomFill_SweepFunction.cxx
Executable file
384
src/GeomFill/GeomFill_SweepFunction.cxx
Executable file
@@ -0,0 +1,384 @@
|
||||
// File: GeomFill_SweepFunction.cxx
|
||||
// Created: Fri Nov 21 15:18:48 1997
|
||||
// Author: Philippe MANGIN
|
||||
// <pmn@sgi29>
|
||||
|
||||
#ifndef DEB
|
||||
#define No_Standard_RangeError
|
||||
#define No_Standard_OutOfRange
|
||||
#define No_Standard_DimensionError
|
||||
#endif
|
||||
|
||||
|
||||
#include <GeomFill_SweepFunction.ixx>
|
||||
|
||||
#include <TColStd_SequenceOfReal.hxx>
|
||||
#include <GeomLib.hxx>
|
||||
#include <Precision.hxx>
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : GeomFill_SweepFunction
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
GeomFill_SweepFunction::
|
||||
GeomFill_SweepFunction(const Handle(GeomFill_SectionLaw)& Section,
|
||||
const Handle(GeomFill_LocationLaw)& Location,
|
||||
const Standard_Real FirstParameter,
|
||||
const Standard_Real FirstParameterOnS,
|
||||
const Standard_Real RatioParameterOnS)
|
||||
{
|
||||
myLoc = Location;
|
||||
mySec = Section;
|
||||
myf = FirstParameter;
|
||||
myfOnS = FirstParameterOnS;
|
||||
myRatio = RatioParameterOnS;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : D0
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean GeomFill_SweepFunction::D0(const Standard_Real Param,
|
||||
const Standard_Real,
|
||||
const Standard_Real,
|
||||
TColgp_Array1OfPnt& Poles,
|
||||
TColgp_Array1OfPnt2d& Poles2d,
|
||||
TColStd_Array1OfReal& Weigths)
|
||||
{
|
||||
Standard_Integer ii, L;
|
||||
Standard_Boolean Ok;
|
||||
Standard_Real T = myfOnS + (Param - myf) * myRatio;
|
||||
L = Poles.Length();
|
||||
|
||||
Ok = myLoc->D0(Param, M, V, Poles2d);
|
||||
if (!Ok) return Ok;
|
||||
Ok = mySec->D0(T, Poles, Weigths);
|
||||
if (!Ok) return Ok;
|
||||
|
||||
for (ii=1; ii<=L; ii++) {
|
||||
gp_XYZ& aux = Poles(ii).ChangeCoord();
|
||||
aux *= M;
|
||||
aux += V.XYZ();
|
||||
}
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : D1
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean GeomFill_SweepFunction::D1(const Standard_Real Param,
|
||||
const Standard_Real,
|
||||
const Standard_Real,
|
||||
TColgp_Array1OfPnt& Poles,
|
||||
TColgp_Array1OfVec& DPoles,
|
||||
TColgp_Array1OfPnt2d& Poles2d,
|
||||
TColgp_Array1OfVec2d& DPoles2d,
|
||||
TColStd_Array1OfReal& Weigths,
|
||||
TColStd_Array1OfReal& DWeigths)
|
||||
{
|
||||
Standard_Integer ii, L;
|
||||
Standard_Boolean Ok;
|
||||
Standard_Real T = myfOnS + (Param - myf) * myRatio;
|
||||
gp_XYZ PPrim;
|
||||
L = Poles.Length();
|
||||
|
||||
Ok = myLoc->D1(Param, M, V, DM, DV, Poles2d, DPoles2d);
|
||||
if (!Ok) return Ok;
|
||||
Ok = mySec->D1(T, Poles, DPoles, Weigths, DWeigths);
|
||||
if (!Ok) return Ok;
|
||||
|
||||
for (ii=1; ii<=L; ii++) {
|
||||
PPrim = DPoles(ii).XYZ();
|
||||
gp_XYZ& P = Poles(ii).ChangeCoord();
|
||||
PPrim *= myRatio;
|
||||
DWeigths(ii) *= myRatio;
|
||||
PPrim *= M;
|
||||
PPrim += DM*P;
|
||||
PPrim += DV.XYZ();
|
||||
DPoles(ii).SetXYZ(PPrim);
|
||||
|
||||
P *= M;
|
||||
P += V.XYZ();
|
||||
}
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : D2
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean GeomFill_SweepFunction::D2(const Standard_Real Param,
|
||||
const Standard_Real,
|
||||
const Standard_Real ,
|
||||
TColgp_Array1OfPnt& Poles,
|
||||
TColgp_Array1OfVec& DPoles,
|
||||
TColgp_Array1OfVec& D2Poles,
|
||||
TColgp_Array1OfPnt2d& Poles2d,
|
||||
TColgp_Array1OfVec2d& DPoles2d,
|
||||
TColgp_Array1OfVec2d& D2Poles2d,
|
||||
TColStd_Array1OfReal& Weigths,
|
||||
TColStd_Array1OfReal& DWeigths,
|
||||
TColStd_Array1OfReal& D2Weigths)
|
||||
{
|
||||
Standard_Integer ii, L;
|
||||
Standard_Boolean Ok;
|
||||
Standard_Real T = myfOnS + (Param - myf) * myRatio;
|
||||
Standard_Real squareratio = myRatio*myRatio;
|
||||
L = Poles.Length();
|
||||
|
||||
Ok = myLoc->D2(Param, M, V, DM, DV, D2M, D2V,
|
||||
Poles2d, DPoles2d, D2Poles2d);
|
||||
if (!Ok) return Ok;
|
||||
Ok = mySec->D2(T, Poles, DPoles, D2Poles,
|
||||
Weigths, DWeigths, D2Weigths);
|
||||
if (!Ok) return Ok;
|
||||
|
||||
for (ii=1; ii<=L; ii++) {
|
||||
gp_XYZ PSecn = D2Poles(ii).XYZ();
|
||||
gp_XYZ PPrim = DPoles(ii).XYZ();
|
||||
PPrim *= myRatio;
|
||||
DWeigths(ii) *= myRatio;
|
||||
PSecn *= squareratio;
|
||||
D2Weigths(ii) *= squareratio;
|
||||
gp_XYZ& P = Poles(ii).ChangeCoord();
|
||||
|
||||
PSecn *= M;
|
||||
PSecn += 2*(DM*PPrim);
|
||||
PSecn += D2M*P;
|
||||
PSecn += D2V.XYZ();
|
||||
D2Poles(ii).SetXYZ(PSecn);
|
||||
|
||||
PPrim *= M;
|
||||
PPrim += DM*P;
|
||||
PPrim += DV.XYZ();
|
||||
DPoles(ii).SetXYZ(PPrim);
|
||||
|
||||
P *= M;
|
||||
P += V.XYZ();
|
||||
}
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Nb2dCurves
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Integer GeomFill_SweepFunction::Nb2dCurves() const
|
||||
{
|
||||
return myLoc->Nb2dCurves();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SectionShape
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::SectionShape(Standard_Integer& NbPoles,
|
||||
Standard_Integer& NbKnots,
|
||||
Standard_Integer& Degree) const
|
||||
{
|
||||
mySec->SectionShape(NbPoles, NbKnots, Degree);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Knots
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::Knots(TColStd_Array1OfReal& TKnots) const
|
||||
{
|
||||
mySec->Knots(TKnots);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Mults
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::Mults(TColStd_Array1OfInteger& TMults) const
|
||||
{
|
||||
mySec->Mults(TMults);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : IsRational
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean GeomFill_SweepFunction::IsRational() const
|
||||
{
|
||||
return mySec->IsRational();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NbIntervals
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Integer GeomFill_SweepFunction::NbIntervals(const GeomAbs_Shape S) const
|
||||
{
|
||||
Standard_Integer Nb_Sec, Nb_Loc;
|
||||
Nb_Sec = mySec->NbIntervals(S);
|
||||
Nb_Loc = myLoc->NbIntervals(S);
|
||||
|
||||
if (Nb_Sec==1) {
|
||||
return Nb_Loc;
|
||||
}
|
||||
else if (Nb_Loc==1) {
|
||||
return Nb_Sec;
|
||||
}
|
||||
|
||||
TColStd_Array1OfReal IntS(1, Nb_Sec+1);
|
||||
TColStd_Array1OfReal IntL(1, Nb_Loc+1);
|
||||
TColStd_SequenceOfReal Inter;
|
||||
Standard_Real T;
|
||||
Standard_Integer ii;
|
||||
mySec->Intervals(IntS, S);
|
||||
for (ii=1; ii<=Nb_Sec+1; ii++) {
|
||||
T = (IntS(ii) - myfOnS) / myRatio + myf;
|
||||
IntS(ii) = T;
|
||||
}
|
||||
myLoc->Intervals(IntL, S);
|
||||
|
||||
GeomLib::FuseIntervals( IntS, IntL, Inter, Precision::PConfusion()*0.99);
|
||||
return Inter.Length()-1;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Intervals
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::Intervals(TColStd_Array1OfReal& T,const GeomAbs_Shape S) const
|
||||
{
|
||||
Standard_Integer Nb_Sec, Nb_Loc, ii;
|
||||
Nb_Sec = mySec->NbIntervals(S);
|
||||
Nb_Loc = myLoc->NbIntervals(S);
|
||||
|
||||
if (Nb_Sec==1) {
|
||||
myLoc->Intervals(T, S);
|
||||
return;
|
||||
}
|
||||
else if (Nb_Loc==1) {
|
||||
Standard_Real t;
|
||||
mySec->Intervals(T, S);
|
||||
for (ii=1; ii<=Nb_Sec+1; ii++) {
|
||||
t = (T(ii) - myfOnS) / myRatio + myf;
|
||||
T(ii) = t;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
TColStd_Array1OfReal IntS(1, Nb_Sec+1);
|
||||
TColStd_Array1OfReal IntL(1, Nb_Loc+1);
|
||||
TColStd_SequenceOfReal Inter;
|
||||
Standard_Real t;
|
||||
|
||||
mySec->Intervals(IntS, S);
|
||||
for (ii=1; ii<=Nb_Sec+1; ii++) {
|
||||
t = (IntS(ii) - myfOnS) / myRatio + myf;
|
||||
IntS(ii) = t;
|
||||
}
|
||||
myLoc->Intervals(IntL, S);
|
||||
|
||||
GeomLib::FuseIntervals(IntS, IntL, Inter, Precision::PConfusion()*0.99);
|
||||
for (ii=1; ii<=Inter.Length(); ii++)
|
||||
T(ii) = Inter(ii);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetInterval
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::SetInterval(const Standard_Real First,
|
||||
const Standard_Real Last)
|
||||
{
|
||||
Standard_Real uf, ul;
|
||||
myLoc->SetInterval(First, Last);
|
||||
uf = myf + (First - myf) * myRatio;
|
||||
ul = myf + (Last - myf) * myRatio;
|
||||
mySec->SetInterval(uf, ul);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::GetTolerance(const Standard_Real BoundTol,
|
||||
const Standard_Real SurfTol,
|
||||
const Standard_Real AngleTol,
|
||||
TColStd_Array1OfReal& Tol3d) const
|
||||
{
|
||||
mySec->GetTolerance( BoundTol, SurfTol, AngleTol, Tol3d);
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : Resolution
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::Resolution(const Standard_Integer Index,
|
||||
const Standard_Real Tol,
|
||||
Standard_Real& TolU,
|
||||
Standard_Real& TolV)const
|
||||
{
|
||||
myLoc->Resolution(Index, Tol, TolU, TolV);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::SetTolerance(const Standard_Real Tol3d,
|
||||
const Standard_Real Tol2d)
|
||||
{
|
||||
mySec->SetTolerance(Tol3d, Tol2d);
|
||||
myLoc->SetTolerance(Tol3d, Tol2d);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
gp_Pnt GeomFill_SweepFunction::BarycentreOfSurf() const
|
||||
{
|
||||
gp_Pnt Bary;
|
||||
gp_Vec Translate;
|
||||
gp_Mat M;
|
||||
|
||||
Bary = mySec->BarycentreOfSurf();
|
||||
myLoc->GetAverageLaw(M, Translate);
|
||||
Bary.ChangeCoord() *= M;
|
||||
Bary.ChangeCoord() += Translate.XYZ();
|
||||
|
||||
return Bary;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Real GeomFill_SweepFunction::MaximalSection() const
|
||||
{
|
||||
Standard_Real L = mySec->MaximalSection();
|
||||
L *= myLoc->GetMaximalNorm();
|
||||
return L;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GeomFill_SweepFunction::GetMinimalWeight(TColStd_Array1OfReal& Weigths) const
|
||||
{
|
||||
mySec->GetMinimalWeight(Weigths);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user