From dc34ffaf3febe0112406def578ba7e1cb41f4ae7 Mon Sep 17 00:00:00 2001 From: nds Date: Thu, 5 Dec 2013 09:53:37 +0000 Subject: [PATCH] Bug 158: Crash in profile edition --- src/HYDROCurveCreator/CurveCreator_Curve.cxx | 90 ++++++++++--------- src/HYDROCurveCreator/CurveCreator_Curve.hxx | 20 ++++- .../CurveCreator_Profile.cxx | 48 +++++----- .../CurveCreator_Profile.hxx | 9 +- 4 files changed, 102 insertions(+), 65 deletions(-) diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index 3f88a8b2..0c6c45be 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -294,25 +294,6 @@ bool CurveCreator_Curve::moveSection(const int theISection, return res; } -void CurveCreator_Curve::convert( const SectionToPointList& thePoints, - std::map< int, std::list >& theConvPoints ) -{ - theConvPoints.clear(); - - SectionToPointList::const_iterator anIt = thePoints.begin(), aLast = thePoints.end(); - std::list aPoints; - int aSectionId, aPointId; - for ( ; anIt != aLast; anIt++ ) { - aSectionId = anIt->first; - aPointId = anIt->second; - aPoints.clear(); - if ( theConvPoints.find( aSectionId ) != theConvPoints.end() ) - aPoints = theConvPoints[aSectionId]; - aPoints.push_back( aPointId ); - theConvPoints[aSectionId] = aPoints; - } -} - /************ Implementation of INTERFACE methods ************/ /***********************************************/ @@ -850,34 +831,19 @@ bool CurveCreator_Curve::setSeveralPoints( const SectionToPointCoordsList &theSe //! For internal use only! Undo/Redo are not used here. bool CurveCreator_Curve::removePointsInternal( const SectionToPointList &thePoints ) { - bool res = false; + bool aRes = false; std::map > aConvPoints; convert( thePoints, aConvPoints ); std::map >::const_iterator anIt = aConvPoints.begin(), aLast = aConvPoints.end(); - CurveCreator_Section *aSection = 0; for ( ; anIt != aLast; anIt++ ) { int aSectionId = anIt->first; - aSection = mySections.at(aSectionId); - if( aSection ) { - std::list aSectionPoints = anIt->second; - aSectionPoints.sort(); - std::list::const_reverse_iterator aPntIt = aSectionPoints.rbegin(); - for( ; aPntIt != aSectionPoints.rend(); aPntIt++ ){ - int aPntIndx = *aPntIt; - CurveCreator::Coordinates::iterator aFirstPosition; - if(aPntIndx == -1) - aFirstPosition = aSection->myPoints.end() - getDimension(); - else - aFirstPosition = aSection->myPoints.begin() + toICoord(aPntIndx); - aSection->myPoints.erase( aFirstPosition, aFirstPosition + getDimension() ); - res = true; - } - } + aRes = removeSectionPoints(aSectionId, anIt->second); } - if(res) + if( aRes) redisplayCurve(); - return res; + + return aRes; } //! Remove point with given id @@ -956,4 +922,48 @@ Handle(AIS_InteractiveObject) CurveCreator_Curve::getAISObject( const bool theNe aCurve->constructAISObject(); } return myAISShape; -} \ No newline at end of file +} + +bool CurveCreator_Curve::removeSectionPoints( const int theSectionId, + const std::list& thePointIds ) +{ + bool aRes = false; + + CurveCreator_Section *aSection = mySections.at( theSectionId ); + if ( !aSection ) + return aRes; + + std::list aSectionPoints = thePointIds; + aSectionPoints.sort(); + std::list::const_reverse_iterator aPntIt = aSectionPoints.rbegin(); + for ( ; aPntIt != aSectionPoints.rend(); aPntIt++ ) { + int aPntIndx = *aPntIt; + CurveCreator::Coordinates::iterator aFirstPosition; + if ( aPntIndx == -1 ) + aFirstPosition = aSection->myPoints.end() - getDimension(); + else + aFirstPosition = aSection->myPoints.begin() + toICoord( aPntIndx ); + aSection->myPoints.erase( aFirstPosition, aFirstPosition + getDimension() ); + aRes = true; + } + return aRes; +} + +void CurveCreator_Curve::convert( const SectionToPointList& thePoints, + std::map< int, std::list >& theConvPoints ) +{ + theConvPoints.clear(); + + SectionToPointList::const_iterator anIt = thePoints.begin(), aLast = thePoints.end(); + std::list aPoints; + int aSectionId, aPointId; + for ( ; anIt != aLast; anIt++ ) { + aSectionId = anIt->first; + aPointId = anIt->second; + aPoints.clear(); + if ( theConvPoints.find( aSectionId ) != theConvPoints.end() ) + aPoints = theConvPoints[aSectionId]; + aPoints.push_back( aPointId ); + theConvPoints[aSectionId] = aPoints; + } +} diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.hxx b/src/HYDROCurveCreator/CurveCreator_Curve.hxx index 24a216cf..3c41e711 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.hxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.hxx @@ -110,9 +110,6 @@ public: // TODO: remove public protected: // TODO: remove public void redisplayCurve(); - void convert( const SectionToPointList &thePoints, - std::map > &theConvPoints ); - public: /************ Implementation of INTERFACE methods ************/ @@ -266,6 +263,23 @@ public: */ virtual Handle_AIS_InteractiveObject getAISObject( const bool theNeedToBuild = false ) const; +protected: + /** + * Removes the points from the section. It sortes the points and remove them + * in the decreasing order + * \param theSectionId a section index + * \param thePointIds a list of section points + */ + bool removeSectionPoints( const int theSectionId, + const std::list& thePointIds ); + /** + * Converts the list of pairs of section to point into map of a section to list of points + * \param thePoints an source list + * \param theConvPoints a converted map + */ + void convert( const SectionToPointList &thePoints, + std::map > &theConvPoints ); + protected: virtual void constructAISObject(); diff --git a/src/HYDROCurveCreator/CurveCreator_Profile.cxx b/src/HYDROCurveCreator/CurveCreator_Profile.cxx index d34695d9..c9b349f8 100644 --- a/src/HYDROCurveCreator/CurveCreator_Profile.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Profile.cxx @@ -216,34 +216,40 @@ bool CurveCreator_Profile::addPointsInternal( const CurveCreator::SectionsMap &t //! For internal use only! Undo/Redo are not used here. bool CurveCreator_Profile::setPointInternal( const CurveCreator::SectionsMap &theSectionsMap ) { - bool res = false; + bool aRes = false; - CurveCreator_Section* aSection = mySections.at( 0 ); + int anISection = 0; + CurveCreator_Section* aSection = mySections.at( anISection ); if( !aSection ) - return res; + return aRes; CurveCreator::SectionsMap::const_iterator anIt = theSectionsMap.begin(); - for ( ; anIt != theSectionsMap.end(); anIt++ ) - { - int anISection = anIt->first; - if( anISection != 0 ) - continue; + if ( anIt == theSectionsMap.end() ) + return aRes; - const CurveCreator::PosPointsList& aSectionPoints = anIt->second; + const CurveCreator::PosPointsList& aSectionPoints = anIt->second; - CurveCreator::PosPointsList::const_iterator aPntIt = aSectionPoints.begin(); - for( ; aPntIt != aSectionPoints.end(); aPntIt++ ) - { - int anIPnt = (*aPntIt)->myID; - aSection->myPoints.erase( aSection->myPoints.begin() + toICoord( anIPnt ), - aSection->myPoints.begin() + toICoord( anIPnt ) + 2 ); - } - } - - res = addPointsInternal( theSectionsMap ); + std::list aConvPoints; + convert( aSectionPoints, aConvPoints ); + removeSectionPoints( anISection, aConvPoints ); - if ( res ) + aRes = addPointsInternal( theSectionsMap ); + if ( aRes ) redisplayCurve(); - return res; + return aRes; +} + +void CurveCreator_Profile::convert( const CurveCreator::PosPointsList& thePoints, + std::list& theConvPoints ) +{ + theConvPoints.clear(); + + CurveCreator::PosPointsList::const_iterator aPntIt = thePoints.begin(), + aPntLast = thePoints.end(); + for( ; aPntIt != aPntLast; aPntIt++ ) + { + int anIPnt = (*aPntIt)->myID; + theConvPoints.push_back( anIPnt ); + } } diff --git a/src/HYDROCurveCreator/CurveCreator_Profile.hxx b/src/HYDROCurveCreator/CurveCreator_Profile.hxx index 288732c6..947c36a0 100644 --- a/src/HYDROCurveCreator/CurveCreator_Profile.hxx +++ b/src/HYDROCurveCreator/CurveCreator_Profile.hxx @@ -122,7 +122,14 @@ public: //! For internal use only! Undo/Redo are not used here. virtual bool setPointInternal( const CurveCreator::SectionsMap &theSectionsMap ); -private: +protected: + /** + * Converts the list of custom point position objects into a list of point indices + * \param thePoints an source list + * \param theConvPoints a converted list + */ + void convert( const CurveCreator::PosPointsList& thePoints, + std::list& theConvPoints ); }; -- 2.30.2