From: nds Date: Fri, 6 Dec 2013 10:04:09 +0000 (+0000) Subject: Bug #202 - Fatal error during polyline creation X-Git-Tag: BR_hydro_v_0_4~11 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=d6a39d0ff1901a6d762c8a904774517b2dc5ba27;p=modules%2Fhydro.git Bug #202 - Fatal error during polyline creation --- diff --git a/src/HYDROCurveCreator/CurveCreator_Utils.cxx b/src/HYDROCurveCreator/CurveCreator_Utils.cxx index 1fcc4084..f0ee1127 100644 --- a/src/HYDROCurveCreator/CurveCreator_Utils.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Utils.cxx @@ -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 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::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 ); +} diff --git a/src/HYDROCurveCreator/CurveCreator_Utils.h b/src/HYDROCurveCreator/CurveCreator_Utils.h index f7691c0d..0cf2364d 100644 --- a/src/HYDROCurveCreator/CurveCreator_Utils.h +++ b/src/HYDROCurveCreator/CurveCreator_Utils.h @@ -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 diff --git a/src/HYDROData/HYDROData_PolylineXY.cxx b/src/HYDROData/HYDROData_PolylineXY.cxx index 6c7e5910..94e3b1dc 100755 --- a/src/HYDROData/HYDROData_PolylineXY.cxx +++ b/src/HYDROData/HYDROData_PolylineXY.cxx @@ -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 ); }