Salome HOME
Bug #202 - Fatal error during polyline creation
authornds <nds@opencascade.com>
Fri, 6 Dec 2013 10:04:09 +0000 (10:04 +0000)
committernds <nds@opencascade.com>
Fri, 6 Dec 2013 10:04:09 +0000 (10:04 +0000)
src/HYDROCurveCreator/CurveCreator_Utils.cxx
src/HYDROCurveCreator/CurveCreator_Utils.h
src/HYDROData/HYDROData_PolylineXY.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 );
+}
index f7691c0dd78896b9f7bdfb2391d61a2701a63b73..0cf2364da527f89f0bc1dbe20e233307dd90a5be 100644 (file)
@@ -145,6 +145,15 @@ protected:
                                                  const int theOtherX, const int theOtherY,
                                                  const double theTolerance, int& theDelta );
 
+
+  /*
+   * Returns whether the points are the same
+   * \param thePoint the first point
+   * \param theOtherPoint the second point
+   * \returns whether the points are provide to the pixel tolerance
+  */
+  CURVECREATOR_EXPORT static bool isEqualPoints( const gp_Pnt& thePoint,
+                                                 const gp_Pnt& theOtherPoint );
 };
 
 #endif // CURVECREATOR_UTILS_H
index 6c7e591094f4cfd99e333444f5638dbd655d5160..94e3b1dc48c16be6ebbf856a547a946116d8e6a4 100755 (executable)
@@ -40,6 +40,8 @@
 
 #define PYTHON_POLYLINEXY_ID "KIND_POLYLINEXY"
 
+const double LOCAL_SELECTION_TOLERANCE = 0.0001;
+
 IMPLEMENT_STANDARD_HANDLE(HYDROData_PolylineXY, HYDROData_IPolyline)
 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_PolylineXY, HYDROData_IPolyline)
 
@@ -138,6 +140,9 @@ TopoDS_Wire HYDROData_PolylineXY::BuildWire( const SectionType&
       gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z() );
       gp_Pnt aPnt2( aLastPoint.X(), aLastPoint.Y(), aLastPoint.Z() );
 
+      if ( aPnt1.IsEqual( aPnt2, LOCAL_SELECTION_TOLERANCE ) )
+        continue;
+
       TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aPnt1, aPnt2 ).Edge();
       aMakeWire.Add( anEdge );
     }