Salome HOME
refs #640: correct width for non-georeferenced profile
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_PolylineOp.cxx
index 31c3ab2de5a44174b2acaaf9b324f5e7840040d4..486b182e5d150c5ddac9831350c8fb08cd2bc4a1 100755 (executable)
@@ -50,6 +50,7 @@
 #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 ), 
@@ -192,10 +193,24 @@ void HYDROGUI_PolylineOp::startOperation()
       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;
@@ -203,10 +218,11 @@ void HYDROGUI_PolylineOp::startOperation()
 
         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());
         }