#include <TopoDS_Wire.hxx>
//static int ZValueIncrement = 0;
+static const double HYDROGUI_MAXIMAL_DEFLECTION = 1e-2;
HYDROGUI_PolylineOp::HYDROGUI_PolylineOp( HYDROGUI_Module* theModule, bool theIsEdit )
: HYDROGUI_Operation( theModule ),
for (int aSI = 0; aSI < aSCount; ++aSI)
{
HYDROData_TopoCurve aCurve, aCurve2;
- std::deque<gp_XYZ> aPs2;
+ std::list<gp_XYZ> aPs2;
+ int aMaxPieceCount;
if (!aCurve.Initialize(aWires[aSI]) ||
- !aCurve.BSplinePiecewiseCurve(Precision::Confusion(), aCurve2) ||
- !aCurve2.ValuesInKnots(aPs2))
+ (aMaxPieceCount = aCurve.BSplinePiecewiseCurve(
+ HYDROGUI_MAXIMAL_DEFLECTION * 0.1, aCurve2)) == 0)
+ {
+ isError = true;
+ break;
+ }
+
+ double aDefl;
+ aMaxPieceCount *= 100;
+ int aPieceCount = 0;
+ while (aPieceCount < aMaxPieceCount &&
+ (aDefl = HYDROData_PolylineOperator::ReduceDeflection(
+ HYDROGUI_MAXIMAL_DEFLECTION, aCurve2, aPieceCount)) >
+ HYDROGUI_MAXIMAL_DEFLECTION);
+ if (aDefl < 0 || !aCurve2.ValuesInKnots(aPs2))
{
isError = true;
break;
aPs.push_back(CurveCreator::Coordinates());
CurveCreator::Coordinates& aPs3 = aPs.back();
- const Standard_Integer aPCount = aPs2.size();
- for (Standard_Integer aPI = 0; aPI < aPCount; ++aPI)
+ std::list<gp_XYZ>::const_iterator aLastPIt = aPs2.end();
+ std::list<gp_XYZ>::const_iterator aPIt = aPs2.begin();
+ for (; aPIt != aLastPIt; ++aPIt)
{
- const gp_XYZ aP = aPs2[aPI];
+ const gp_XYZ aP = *aPIt;
aPs3.push_back(aP.X());
aPs3.push_back(aP.Y());
}