1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-07-10 12:25:50 +03:00

0029719: Modeling Algorithms - GeomPlate_BuildPlateSurface has no progress information and is not abortable

The Message_ProgressIndicator handle is added as a parameter to the function LU_Decompose and the the member functions of math_Gauss, Plate_Plate and GeomPlate_BuildPlateSurface classes.
This commit is contained in:
drazmyslovich 2018-04-23 17:52:43 +03:00 committed by bugmaster
parent 25c35042b6
commit 9f785738a1
8 changed files with 104 additions and 37 deletions

View File

@ -72,6 +72,7 @@
#include <TColgp_SequenceOfVec.hxx> #include <TColgp_SequenceOfVec.hxx>
#include <TColStd_HArray1OfReal.hxx> #include <TColStd_HArray1OfReal.hxx>
#include <TColStd_SequenceOfInteger.hxx> #include <TColStd_SequenceOfInteger.hxx>
#include <Message_ProgressIndicator.hxx>
#include <stdio.h> #include <stdio.h>
// pour la verif G2 // pour la verif G2
@ -455,7 +456,7 @@ void GeomPlate_BuildPlateSurface::
//fonction : Perform //fonction : Perform
// Calcul la surface de remplissage avec les contraintes chargees // Calcul la surface de remplissage avec les contraintes chargees
//--------------------------------------------------------- //---------------------------------------------------------
void GeomPlate_BuildPlateSurface::Perform() void GeomPlate_BuildPlateSurface::Perform(const Handle(Message_ProgressIndicator) & aProgress)
{ {
#ifdef OCCT_DEBUG #ifdef OCCT_DEBUG
// Chronmetrage // Chronmetrage
@ -488,7 +489,7 @@ void GeomPlate_BuildPlateSurface::Perform()
// Surface Initiale // Surface Initiale
//====================================================================== //======================================================================
if (!mySurfInitIsGive) if (!mySurfInitIsGive)
ComputeSurfInit(); ComputeSurfInit(aProgress);
else { else {
if (NTLinCont>=2) if (NTLinCont>=2)
@ -658,13 +659,19 @@ void GeomPlate_BuildPlateSurface::Perform()
//==================================================================== //====================================================================
//Resolution de la surface //Resolution de la surface
//==================================================================== //====================================================================
myPlate.SolveTI(myDegree, ComputeAnisotropie());
myPlate.SolveTI(myDegree, ComputeAnisotropie(), aProgress);
if (!aProgress.IsNull() && aProgress->UserBreak())
{
return;
}
if (!myPlate.IsDone()) if (!myPlate.IsDone())
{ {
#ifdef OCCT_DEBUG #ifdef OCCT_DEBUG
cout << "WARNING : GeomPlate : abort calcul of Plate." << endl; cout << "WARNING : GeomPlate : abort calcul of Plate." << endl;
#endif #endif
return; return;
} }
@ -692,7 +699,13 @@ void GeomPlate_BuildPlateSurface::Perform()
//==================================================================== //====================================================================
//Resolution de la surface //Resolution de la surface
//==================================================================== //====================================================================
myPlate.SolveTI(myDegree, ComputeAnisotropie()); myPlate.SolveTI(myDegree, ComputeAnisotropie(), aProgress);
if (!aProgress.IsNull() && aProgress->UserBreak())
{
return;
}
if (!myPlate.IsDone()) if (!myPlate.IsDone())
{ {
#ifdef OCCT_DEBUG #ifdef OCCT_DEBUG
@ -1354,7 +1367,7 @@ Standard_Boolean GeomPlate_BuildPlateSurface::
// il y a des contraintes ponctuelles // il y a des contraintes ponctuelles
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
void GeomPlate_BuildPlateSurface::ComputeSurfInit() void GeomPlate_BuildPlateSurface::ComputeSurfInit(const Handle(Message_ProgressIndicator) & aProgress)
{ {
Standard_Integer nopt=2, popt=2, Np=1; Standard_Integer nopt=2, popt=2, Np=1;
Standard_Boolean isHalfSpace = Standard_True; Standard_Boolean isHalfSpace = Standard_True;
@ -1719,7 +1732,12 @@ void GeomPlate_BuildPlateSurface::ComputeSurfInit()
//==================================================================== //====================================================================
//Resolution de la surface //Resolution de la surface
//==================================================================== //====================================================================
myPlate.SolveTI(2, ComputeAnisotropie()); myPlate.SolveTI(2, ComputeAnisotropie(), aProgress);
if (!aProgress.IsNull() && aProgress->UserBreak())
{
return;
}
if (!myPlate.IsDone()) if (!myPlate.IsDone())
{ {
#ifdef OCCT_DEBUG #ifdef OCCT_DEBUG

View File

@ -46,6 +46,7 @@ class gp_Pnt;
class Geom2d_Curve; class Geom2d_Curve;
class Adaptor3d_HCurve; class Adaptor3d_HCurve;
class Adaptor2d_HCurve2d; class Adaptor2d_HCurve2d;
class Message_ProgressIndicator;
@ -130,7 +131,7 @@ public:
//! Exceptions //! Exceptions
//! Standard_RangeError if the value of the constraint is //! Standard_RangeError if the value of the constraint is
//! null or if plate is not done. //! null or if plate is not done.
Standard_EXPORT void Perform(); Standard_EXPORT void Perform(const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)());
//! returns the CurveConstraints of order order //! returns the CurveConstraints of order order
Standard_EXPORT Handle(GeomPlate_CurveConstraint) CurveConstraint (const Standard_Integer order) const; Standard_EXPORT Handle(GeomPlate_CurveConstraint) CurveConstraint (const Standard_Integer order) const;
@ -217,7 +218,7 @@ private:
Standard_EXPORT Handle(Adaptor2d_HCurve2d) ProjectedCurve (Handle(Adaptor3d_HCurve)& Curv); Standard_EXPORT Handle(Adaptor2d_HCurve2d) ProjectedCurve (Handle(Adaptor3d_HCurve)& Curv);
Standard_EXPORT void ComputeSurfInit(); Standard_EXPORT void ComputeSurfInit(const Handle(Message_ProgressIndicator) & aProgress);
Standard_EXPORT void Intersect (Handle(GeomPlate_HArray1OfSequenceOfReal)& PntInter, Handle(GeomPlate_HArray1OfSequenceOfReal)& PntG1G1); Standard_EXPORT void Intersect (Handle(GeomPlate_HArray1OfSequenceOfReal)& PntInter, Handle(GeomPlate_HArray1OfSequenceOfReal)& PntG1G1);

View File

@ -37,6 +37,7 @@
#include <Plate_Plate.hxx> #include <Plate_Plate.hxx>
#include <Plate_SampledCurveConstraint.hxx> #include <Plate_SampledCurveConstraint.hxx>
#include <Standard_ErrorHandler.hxx> #include <Standard_ErrorHandler.hxx>
#include <Message_ProgressIndicator.hxx>
//======================================================================= //=======================================================================
//function : Plate_Plate //function : Plate_Plate
@ -249,7 +250,8 @@ void Plate_Plate::Load(const Plate_GlobalTranslationConstraint& GTConst)
//======================================================================= //=======================================================================
void Plate_Plate::SolveTI(const Standard_Integer ord, void Plate_Plate::SolveTI(const Standard_Integer ord,
const Standard_Real anisotropie) const Standard_Real anisotropie,
const Handle(Message_ProgressIndicator) & aProgress)
{ {
Standard_Integer IterationNumber=0; Standard_Integer IterationNumber=0;
OK = Standard_False; OK = Standard_False;
@ -277,16 +279,15 @@ void Plate_Plate::SolveTI(const Standard_Integer ord,
ddv[0] = 1; ddv[0] = 1;
for(i=1;i<=9;i++) ddv[i] = ddv[i-1] / dv; for(i=1;i<=9;i++) ddv[i] = ddv[i-1] / dv;
if(myLScalarConstraints.IsEmpty()) if(myLScalarConstraints.IsEmpty())
{ {
if(myLXYZConstraints.IsEmpty()) if(myLXYZConstraints.IsEmpty())
SolveTI1(IterationNumber); SolveTI1(IterationNumber, aProgress);
else else
SolveTI2(IterationNumber); SolveTI2(IterationNumber, aProgress);
} }
else else
SolveTI3(IterationNumber); SolveTI3(IterationNumber, aProgress);
} }
@ -296,7 +297,7 @@ void Plate_Plate::SolveTI(const Standard_Integer ord,
// only PinPointConstraints are loaded // only PinPointConstraints are loaded
//======================================================================= //=======================================================================
void Plate_Plate::SolveTI1(const Standard_Integer IterationNumber) void Plate_Plate::SolveTI1(const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress)
{ {
// computation of square matrix members // computation of square matrix members
@ -349,14 +350,21 @@ void Plate_Plate::SolveTI1(const Standard_Integer IterationNumber)
Standard_Real pivot_max = 1.e-12; Standard_Real pivot_max = 1.e-12;
OK = Standard_True; OK = Standard_True;
math_Gauss algo_gauss(mat,pivot_max); math_Gauss algo_gauss(mat,pivot_max, aProgress);
if (!aProgress.IsNull() && aProgress->UserBreak())
{
OK = Standard_False;
return;
}
if(!algo_gauss.IsDone()) { if(!algo_gauss.IsDone()) {
Standard_Integer nbm = order*(order+1)/2; Standard_Integer nbm = order*(order+1)/2;
for(i=n_el;i<n_el+nbm;i++) { for(i=n_el;i<n_el+nbm;i++) {
mat(i,i) = 1.e-8; mat(i,i) = 1.e-8;
} }
pivot_max = 1.e-18; pivot_max = 1.e-18;
math_Gauss thealgo(mat,pivot_max); math_Gauss thealgo(mat,pivot_max, aProgress);
algo_gauss = thealgo; algo_gauss = thealgo;
OK = algo_gauss.IsDone(); OK = algo_gauss.IsDone();
} }
@ -400,7 +408,7 @@ void Plate_Plate::SolveTI1(const Standard_Integer IterationNumber)
// LinearXYZ constraints are provided but no LinearScalar one // LinearXYZ constraints are provided but no LinearScalar one
//======================================================================= //=======================================================================
void Plate_Plate::SolveTI2(const Standard_Integer IterationNumber) void Plate_Plate::SolveTI2(const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress)
{ {
// computation of square matrix members // computation of square matrix members
@ -447,13 +455,20 @@ void Plate_Plate::SolveTI2(const Standard_Integer IterationNumber)
Standard_Real pivot_max = 1.e-12; Standard_Real pivot_max = 1.e-12;
OK = Standard_True; // ************ JHH OK = Standard_True; // ************ JHH
math_Gauss algo_gauss(mat,pivot_max); math_Gauss algo_gauss(mat,pivot_max, aProgress);
if (!aProgress.IsNull() && aProgress->UserBreak ())
{
OK = Standard_False;
return;
}
if(!algo_gauss.IsDone()) { if(!algo_gauss.IsDone()) {
for(i=nCC1+nCC2;i<n_dimat;i++) { for(i=nCC1+nCC2;i<n_dimat;i++) {
mat(i,i) = 1.e-8; mat(i,i) = 1.e-8;
} }
pivot_max = 1.e-18; pivot_max = 1.e-18;
math_Gauss thealgo1(mat,pivot_max); math_Gauss thealgo1(mat,pivot_max, aProgress);
algo_gauss = thealgo1; algo_gauss = thealgo1;
OK = algo_gauss.IsDone(); OK = algo_gauss.IsDone();
} }
@ -524,7 +539,7 @@ void Plate_Plate::SolveTI2(const Standard_Integer IterationNumber)
//purpose : to solve the set of constraints in the most general situation //purpose : to solve the set of constraints in the most general situation
//======================================================================= //=======================================================================
void Plate_Plate::SolveTI3(const Standard_Integer IterationNumber) void Plate_Plate::SolveTI3(const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress)
{ {
// computation of square matrix members // computation of square matrix members
@ -705,7 +720,14 @@ void Plate_Plate::SolveTI3(const Standard_Integer IterationNumber)
Standard_Real pivot_max = 1.e-12; Standard_Real pivot_max = 1.e-12;
OK = Standard_True; // ************ JHH OK = Standard_True; // ************ JHH
math_Gauss algo_gauss(mat,pivot_max); math_Gauss algo_gauss(mat,pivot_max, aProgress);
if (!aProgress.IsNull() && aProgress->UserBreak ())
{
OK = Standard_False;
return;
}
if(!algo_gauss.IsDone()) { if(!algo_gauss.IsDone()) {
for(i=nCC1+nCC2;i<nCC1+nCC2+nbm;i++) { for(i=nCC1+nCC2;i<nCC1+nCC2+nbm;i++) {
mat(i,i) = 1.e-8; mat(i,i) = 1.e-8;
@ -713,7 +735,7 @@ void Plate_Plate::SolveTI3(const Standard_Integer IterationNumber)
mat(2*n_dimsousmat+i,2*n_dimsousmat+i) = 1.e-8; mat(2*n_dimsousmat+i,2*n_dimsousmat+i) = 1.e-8;
} }
pivot_max = 1.e-18; pivot_max = 1.e-18;
math_Gauss thealgo2(mat,pivot_max); math_Gauss thealgo2(mat,pivot_max, aProgress);
algo_gauss = thealgo2; algo_gauss = thealgo2;
OK = algo_gauss.IsDone(); OK = algo_gauss.IsDone();
} }

View File

@ -30,6 +30,7 @@
#include <Standard_Real.hxx> #include <Standard_Real.hxx>
#include <TColgp_HArray2OfXYZ.hxx> #include <TColgp_HArray2OfXYZ.hxx>
#include <TColgp_SequenceOfXY.hxx> #include <TColgp_SequenceOfXY.hxx>
class Plate_PinpointConstraint; class Plate_PinpointConstraint;
class Plate_LinearXYZConstraint; class Plate_LinearXYZConstraint;
class Plate_LinearScalarConstraint; class Plate_LinearScalarConstraint;
@ -42,6 +43,7 @@ class Plate_FreeGtoCConstraint;
class gp_XYZ; class gp_XYZ;
class gp_XY; class gp_XY;
class math_Matrix; class math_Matrix;
class Message_ProgressIndicator;
//! This class implement a variationnal spline algorithm able //! This class implement a variationnal spline algorithm able
@ -82,7 +84,9 @@ Plate_Plate& operator= (const Plate_Plate& Ref)
Standard_EXPORT void Load (const Plate_FreeGtoCConstraint& FGtoCConst); Standard_EXPORT void Load (const Plate_FreeGtoCConstraint& FGtoCConst);
Standard_EXPORT void SolveTI (const Standard_Integer ord = 4, const Standard_Real anisotropie = 1.0); Standard_EXPORT void SolveTI (const Standard_Integer ord = 4,
const Standard_Real anisotropie = 1.0,
const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)());
//! returns True if all has been correctly done. //! returns True if all has been correctly done.
Standard_EXPORT Standard_Boolean IsDone() const; Standard_EXPORT Standard_Boolean IsDone() const;
@ -135,11 +139,11 @@ private:
gp_XY& Points (const Standard_Integer index) const; gp_XY& Points (const Standard_Integer index) const;
Standard_EXPORT void SolveTI1 (const Standard_Integer IterationNumber); Standard_EXPORT void SolveTI1 (const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress = NULL);
Standard_EXPORT void SolveTI2 (const Standard_Integer IterationNumber); Standard_EXPORT void SolveTI2 (const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress = NULL);
Standard_EXPORT void SolveTI3 (const Standard_Integer IterationNumber); Standard_EXPORT void SolveTI3 (const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress = NULL);
Standard_EXPORT void fillXYZmatrix (math_Matrix& mat, const Standard_Integer i0, const Standard_Integer j0, const Standard_Integer ncc1, const Standard_Integer ncc2) const; Standard_EXPORT void fillXYZmatrix (math_Matrix& mat, const Standard_Integer i0, const Standard_Integer j0, const Standard_Integer ncc1, const Standard_Integer ncc2) const;

View File

@ -28,7 +28,8 @@
#include <StdFail_NotDone.hxx> #include <StdFail_NotDone.hxx>
math_Gauss::math_Gauss(const math_Matrix& A, math_Gauss::math_Gauss(const math_Matrix& A,
const Standard_Real MinPivot) const Standard_Real MinPivot,
const Handle(Message_ProgressIndicator) & aProgress)
: LU (1, A.RowNumber(), 1, A.ColNumber()), : LU (1, A.RowNumber(), 1, A.ColNumber()),
Index(1, A.RowNumber()) { Index(1, A.RowNumber()) {
@ -37,7 +38,8 @@ math_Gauss::math_Gauss(const math_Matrix& A,
Standard_Integer Error = LU_Decompose(LU, Standard_Integer Error = LU_Decompose(LU,
Index, Index,
D, D,
MinPivot); MinPivot,
aProgress);
if(!Error) { if(!Error) {
Done = Standard_True; Done = Standard_True;
} }

View File

@ -27,10 +27,12 @@
#include <Standard_Real.hxx> #include <Standard_Real.hxx>
#include <math_Vector.hxx> #include <math_Vector.hxx>
#include <Standard_OStream.hxx> #include <Standard_OStream.hxx>
class math_NotSquare; class math_NotSquare;
class Standard_DimensionError; class Standard_DimensionError;
class StdFail_NotDone; class StdFail_NotDone;
class math_Matrix; class math_Matrix;
class Message_ProgressIndicator;
@ -55,7 +57,9 @@ public:
//! If the largest pivot found is less than MinPivot the matrix A is //! If the largest pivot found is less than MinPivot the matrix A is
//! considered as singular. //! considered as singular.
//! Exception NotSquare is raised if A is not a square matrix. //! Exception NotSquare is raised if A is not a square matrix.
Standard_EXPORT math_Gauss(const math_Matrix& A, const Standard_Real MinPivot = 1.0e-20); Standard_EXPORT math_Gauss(const math_Matrix& A,
const Standard_Real MinPivot = 1.0e-20,
const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)());
//! Returns true if the computations are successful, otherwise returns false //! Returns true if the computations are successful, otherwise returns false
Standard_Boolean IsDone() const; Standard_Boolean IsDone() const;

View File

@ -33,6 +33,7 @@
#include <Standard_Failure.hxx> #include <Standard_Failure.hxx>
#include <Standard_NotImplemented.hxx> #include <Standard_NotImplemented.hxx>
#include <Message_ProgressSentry.hxx>
#include <math_Vector.hxx> #include <math_Vector.hxx>
#include <math_IntegerVector.hxx> #include <math_IntegerVector.hxx>
@ -175,7 +176,8 @@ Standard_Integer LU_Decompose(math_Matrix& a,
math_IntegerVector& indx, math_IntegerVector& indx,
Standard_Real& d, Standard_Real& d,
math_Vector& vv, math_Vector& vv,
Standard_Real TINY) { Standard_Real TINY,
const Handle(Message_ProgressIndicator) & aProgress) {
Standard_Integer i, imax=0, j, k; Standard_Integer i, imax=0, j, k;
Standard_Real big, dum, sum, temp; Standard_Real big, dum, sum, temp;
@ -183,6 +185,8 @@ Standard_Integer LU_Decompose(math_Matrix& a,
Standard_Integer n = a.RowNumber(); Standard_Integer n = a.RowNumber();
d = 1.0; d = 1.0;
Message_ProgressSentry aPSentry(aProgress, "", 0, n, 1);
for(i = 1; i <= n; i++) { for(i = 1; i <= n; i++) {
big = 0.0; big = 0.0;
for (j = 1; j <= n; j++) for (j = 1; j <= n; j++)
@ -192,7 +196,8 @@ Standard_Integer LU_Decompose(math_Matrix& a,
} }
vv(i) = 1.0 / big; vv(i) = 1.0 / big;
} }
for(j = 1; j <= n; j++) {
for(j = 1; j <= n && aPSentry.More(); j++, aPSentry.Next()) {
for(i = 1; i < j; i++) { for(i = 1; i < j; i++) {
sum = a(i,j); sum = a(i,j);
for(k = 1; k < i; k++) for(k = 1; k < i; k++)
@ -232,16 +237,23 @@ Standard_Integer LU_Decompose(math_Matrix& a,
a(i,j) *= dum; a(i,j) *= dum;
} }
} }
if (j <= n)
{
return math_Status_UserAborted;
}
return math_Status_OK; return math_Status_OK;
} }
Standard_Integer LU_Decompose(math_Matrix& a, Standard_Integer LU_Decompose(math_Matrix& a,
math_IntegerVector& indx, math_IntegerVector& indx,
Standard_Real& d, Standard_Real& d,
Standard_Real TINY) { Standard_Real TINY,
const Handle(Message_ProgressIndicator) & aProgress) {
math_Vector vv(1, a.RowNumber()); math_Vector vv(1, a.RowNumber());
return LU_Decompose(a, indx, d, vv, TINY); return LU_Decompose(a, indx, d, vv, TINY, aProgress);
} }
void LU_Solve(const math_Matrix& a, void LU_Solve(const math_Matrix& a,

View File

@ -18,12 +18,14 @@
#include <Standard_Boolean.hxx> #include <Standard_Boolean.hxx>
#include <Standard_Integer.hxx> #include <Standard_Integer.hxx>
#include <Standard_Real.hxx> #include <Standard_Real.hxx>
#include <Standard_Handle.hxx>
class math_IntegerVector; class math_IntegerVector;
class math_Vector; class math_Vector;
class math_Matrix; class math_Matrix;
class Message_ProgressIndicator;
const Standard_Integer math_Status_UserAborted = -1;
const Standard_Integer math_Status_OK = 0; const Standard_Integer math_Status_OK = 0;
const Standard_Integer math_Status_SingularMatrix = 1; const Standard_Integer math_Status_SingularMatrix = 1;
const Standard_Integer math_Status_ArgumentError = 2; const Standard_Integer math_Status_ArgumentError = 2;
@ -32,7 +34,8 @@ const Standard_Integer math_Status_NoConvergence = 3;
Standard_EXPORT Standard_Integer LU_Decompose(math_Matrix& a, Standard_EXPORT Standard_Integer LU_Decompose(math_Matrix& a,
math_IntegerVector& indx, math_IntegerVector& indx,
Standard_Real& d, Standard_Real& d,
Standard_Real TINY = 1.0e-20); Standard_Real TINY = 1.0e-20,
const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)());
// Given a matrix a(1..n, 1..n), this routine computes its LU decomposition, // Given a matrix a(1..n, 1..n), this routine computes its LU decomposition,
// The matrix a is replaced by this LU decomposition and the vector indx(1..n) // The matrix a is replaced by this LU decomposition and the vector indx(1..n)
@ -44,7 +47,8 @@ Standard_EXPORT Standard_Integer LU_Decompose(math_Matrix& a,
math_IntegerVector& indx, math_IntegerVector& indx,
Standard_Real& d, Standard_Real& d,
math_Vector& vv, math_Vector& vv,
Standard_Real TINY = 1.0e-30); Standard_Real TINY = 1.0e-30,
const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)());
// Idem to the previous LU_Decompose function. But the input Vector vv(1..n) is // Idem to the previous LU_Decompose function. But the input Vector vv(1..n) is
// used internally as a scratch area. // used internally as a scratch area.