Salome HOME
patch for correct compilation on Linux
[modules/hydro.git] / src / HYDROCurveCreator / CurveCreator_Utils.cxx
index 1fcc4084030de42aba451f7fe357f77c117470e8..f0ee112738b60724e4f477ca71feb86dcbf73689 100644 (file)
@@ -102,40 +102,61 @@ void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve,
 
     CurveCreator::SectionType aSectType = theCurve->getSectionType( theISection );
     int aPointSize = theCurve->getNbPoints( theISection );
+    if ( aPointSize == 0 )
+      continue;
+
     bool aSectIsClosed = theCurve->isClosed( theISection );
     bool isPolyline = aSectType == CurveCreator::Polyline;
+
     int iPoint = 0;
     gp_Pnt aPrevPoint, aPoint;
-    if ( aPointSize == 1 ) {
+    // filters the curve points to skip equal points
+    std::vector<gp_Pnt> aPoints;
+    CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPoint );
+    aPoints.push_back( aPoint );
+    aPrevPoint = aPoint;
+    iPoint++;
+    for( ; iPoint < aPointSize; iPoint++ ) {
       CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPoint );
+      if ( !isEqualPoints( aPrevPoint, aPoint ) )
+        aPoints.push_back( aPoint );
+      aPrevPoint = aPoint;
+    }
+    int aNbPoints = aPoints.size();
+
+    if ( aNbPoints == 1 ) {
+      aPoint = aPoints.front();
       TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
       aBuilder.Add( aComp, aVertex );
     }
-    else if ( aPointSize > 1 ) {
-      Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt (1, aPointSize);
-      int aHIndex = 1;
+    else if ( aNbPoints > 1 ) {
+      Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt (1, aNbPoints);
 
       TopoDS_Edge aPointEdge;
       TopoDS_Vertex aVertex;
-      CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPoint );
+
+      std::vector<gp_Pnt>::const_iterator aPointIt = aPoints.begin(), aPointLast = aPoints.end();
+      aPoint = *aPointIt;
+
+      int aHIndex = 1;
       aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
       aBuilder.Add( aComp, aVertex );
       aHCurvePoints->SetValue(aHIndex++, aPoint);
       aPrevPoint = aPoint;
-      iPoint++;
-      for( ; iPoint < aPointSize; iPoint++ ) {
-        CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPoint );
+      aPointIt++;
+      for( ; aPointIt != aPointLast; aPointIt++ ) {
+        aPoint = *aPointIt;
         aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
         aBuilder.Add( aComp, aVertex );
         aHCurvePoints->SetValue(aHIndex++, aPoint);
         if ( isPolyline ) {
-          aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge();
+          TopoDS_Edge aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge();
           aBuilder.Add( aComp, aPointEdge );
         }
         aPrevPoint = aPoint;
       }
-      if( aSectIsClosed && ( aPointSize > 2 ) ) {
-        CurveCreator_UtilsICurve::getPoint( theCurve, theISection, 0, aPoint );
+      if( aSectIsClosed && ( aNbPoints > 2 ) ) {
+        aPoint = aPoints.front();
         aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
         aBuilder.Add( aComp, aVertex );
         if ( isPolyline ) {
@@ -439,3 +460,8 @@ bool CurveCreator_Utils::isEqualPixels( const int theX, const int theY, const in
 
   return aXDelta < theTolerance && anYDelta < theTolerance;
 }
+
+bool CurveCreator_Utils::isEqualPoints( const gp_Pnt& thePoint, const gp_Pnt& theOtherPoint )
+{
+  return theOtherPoint.IsEqual( thePoint, LOCAL_SELECTION_TOLERANCE );
+}