From eaf1e2d6da5978d48261c823376d381e8845d5a0 Mon Sep 17 00:00:00 2001 From: nds Date: Thu, 19 Dec 2013 08:59:17 +0000 Subject: [PATCH] Ref #250 - Fatal error after Join all selections operation Code correction in order to avoid an exception, caused by the incorrect index of the section. --- src/HYDROCurveCreator/CurveCreator_Curve.cxx | 92 +++++++++++++------- src/HYDROCurveCreator/CurveCreator_Curve.hxx | 6 ++ 2 files changed, 66 insertions(+), 32 deletions(-) diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index 53576dbc..396c4038 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -81,13 +81,15 @@ CurveCreator::Dimension CurveCreator_Curve::getDimension() const //======================================================================= std::string CurveCreator_Curve::getUniqSectionName() const { + CurveCreator_Section* aSection; for( int i = 0 ; i < 1000000 ; i++ ){ char aBuffer[255]; sprintf( aBuffer, "Section_%d", i+1 ); std::string aName(aBuffer); int j; for( j = 0 ; j < mySections.size() ; j++ ){ - if( mySections[j]->myName == aName ) + aSection = getSection( j ); + if ( aSection && aSection->myName == aName ) break; } if( j == mySections.size() ) @@ -261,7 +263,7 @@ bool CurveCreator_Curve::moveSectionInternal(const int theISection, int aMovedSectionId = theISection >= 0 ? theISection : mySections.size()-1; if (aMovedSectionId != theNewIndex) { - CurveCreator_Section *aSection = mySections.at(aMovedSectionId); + CurveCreator_Section* aSection = getSection( aMovedSectionId ); // Remove section CurveCreator::Sections::iterator anIter = mySections.begin() + aMovedSectionId; @@ -358,8 +360,11 @@ bool CurveCreator_Curve::clearInternal() int i = 0; const int aNbSections = getNbSections(); + CurveCreator_Section* aSection; for (; i < aNbSections; i++) { - delete mySections[i]; + aSection = getSection( i ); + if ( aSection ) + delete aSection; } mySections.clear(); @@ -392,7 +397,8 @@ bool CurveCreator_Curve::joinInternal( const std::list& theSections ) return res; int anISectionMain = theSections.front(); - CurveCreator_Section* aSectionMain = mySections.at( anISectionMain ); + CurveCreator_Section* aSectionMain = getSection( anISectionMain ); + std::list aSectionsToJoin = theSections; aSectionsToJoin.erase( aSectionsToJoin.begin() ); // skip the main section // it is important to sort and reverse the section ids in order to correctly remove them @@ -402,7 +408,7 @@ bool CurveCreator_Curve::joinInternal( const std::list& theSections ) std::list::const_iterator anIt = aSectionsToJoin.begin(), aLast = aSectionsToJoin.end(); CurveCreator_Section* aSection; for (; anIt != aLast; anIt++) { - aSection = mySections.at(*anIt); + aSection = getSection( *anIt ); aSectionMain->myPoints.insert(aSectionMain->myPoints.end(), aSection->myPoints.begin(), aSection->myPoints.end()); res = removeSectionInternal(*anIt); @@ -540,16 +546,20 @@ int CurveCreator_Curve::getNbPoints( const int theISection ) const { int aNbCoords = 0; + CurveCreator_Section* aSection; if (theISection == -1) { int i = 0; const int aNbSections = getNbSections(); for (; i < aNbSections; i++) { - aNbCoords += mySections[i]->myPoints.size(); + aSection = getSection( i ); + if ( aSection ) + aNbCoords += aSection->myPoints.size(); } } else { - if ( ( theISection >= 0 ) && ( theISection < mySections.size() ) ) - aNbCoords = mySections.at(theISection)->myPoints.size(); + aSection = getSection( theISection ); + if ( aSection ) + aNbCoords = aSection->myPoints.size(); } return aNbCoords/myDimension; @@ -582,24 +592,32 @@ void CurveCreator_Curve::saveCoordDiff( const SectionToPointCoordsList &theOldCo //! Get "closed" flag of the specified section bool CurveCreator_Curve::isClosed( const int theISection ) const { - return mySections.at(theISection)->myIsClosed; + CurveCreator_Section* aSection = getSection( theISection ); + return aSection ? aSection->myIsClosed : false; } //! For internal use only! Undo/Redo are not used here. bool CurveCreator_Curve::setClosedInternal( const int theISection, const bool theIsClosed ) { + CurveCreator_Section* aSection = 0; if (theISection == -1) { int aSize = mySections.size(); int i; for (i = 0; i < aSize; i++) { - mySections[i]->myIsClosed = theIsClosed; - redisplayCurve(); + aSection = getSection( i ); + if( aSection ) { + aSection->myIsClosed = theIsClosed; + redisplayCurve(); + } } } else { - mySections.at(theISection)->myIsClosed = theIsClosed; - redisplayCurve(); + aSection = getSection( theISection ); + if ( aSection ) { + aSection->myIsClosed = theIsClosed; + redisplayCurve(); + } } return true; } @@ -626,9 +644,8 @@ bool CurveCreator_Curve::setClosed( const int theISection, //! Returns specified section name std::string CurveCreator_Curve::getSectionName( const int theISection ) const { - if( ( theISection >= 0 ) && ( theISection < mySections.size() )) - return mySections.at(theISection)->myName; - return ""; + CurveCreator_Section* aSection = getSection( theISection ); + return aSection ? aSection->myName : ""; } //! For internal use only! Undo/Redo are not used here. @@ -636,8 +653,9 @@ bool CurveCreator_Curve::setSectionNameInternal( const int theISection, const std::string& theName ) { bool res = false; - if( ( theISection >= 0 ) && ( theISection < mySections.size() )){ - mySections.at(theISection)->myName = theName; + CurveCreator_Section* aSection = getSection( theISection ); + if( aSection ) { + aSection->myName = theName; res = true; } return res; @@ -663,24 +681,29 @@ bool CurveCreator_Curve::setSectionName( const int theISection, CurveCreator::SectionType CurveCreator_Curve::getSectionType ( const int theISection ) const { - return mySections.at(theISection)->myType; + CurveCreator_Section* aSection = getSection( theISection ); + return aSection ? aSection->myType : CurveCreator::Polyline; } //! For internal use only! Undo/Redo are not used here. bool CurveCreator_Curve::setSectionTypeInternal( const int theISection, const CurveCreator::SectionType theType ) { + CurveCreator_Section* aSection; if (theISection == -1) { int i = 0; const int aNbSections = getNbSections(); for (; i < aNbSections; i++) { - mySections[i]->myType = theType; + aSection = getSection( i ); + if ( aSection ) + aSection->myType = theType; } redisplayCurve(); } else { - if( mySections.at(theISection)->myType != theType ){ - mySections.at(theISection)->myType = theType; + aSection = getSection( theISection ); + if ( aSection && aSection->myType != theType ){ + aSection->myType = theType; redisplayCurve(); } } @@ -721,7 +744,7 @@ bool CurveCreator_Curve::addPointsInternal( const CurveCreator::SectionsMap &the CurveCreator_Section *aSection = 0; for ( ; anIt != theSectionsMap.end(); anIt++ ) { int anISection = anIt->first; - aSection = mySections.at(anISection); + aSection = getSection( anISection ); if( aSection ) { CurveCreator::PosPointsList aSectionPoints = anIt->second; CurveCreator::PosPointsList::const_iterator aPntIt = aSectionPoints.begin(); @@ -785,7 +808,7 @@ bool CurveCreator_Curve::setPointInternal( const CurveCreator::SectionsMap &theS CurveCreator_Section *aSection = 0; for ( ; anIt != theSectionsMap.end(); anIt++ ) { int anISection = anIt->first; - aSection = mySections.at(anISection); + aSection = getSection( anISection ); if( aSection ) { CurveCreator::PosPointsList aSectionPoints = anIt->second; CurveCreator::PosPointsList::const_iterator aPntIt = aSectionPoints.begin(); @@ -925,7 +948,7 @@ bool CurveCreator_Curve::removeSeveralPoints( const SectionToPointList &theSecti CurveCreator::Coordinates CurveCreator_Curve::getPoint( const int theISection, const int theIPnt) const { - CurveCreator_Section *aSection = mySections.at(theISection); + CurveCreator_Section* aSection = getSection( theISection ); CurveCreator::Coordinates::const_iterator anIter = aSection->myPoints.begin() + toICoord(theIPnt); CurveCreator::Coordinates aResult(anIter, anIter + myDimension); @@ -939,12 +962,8 @@ CurveCreator::Coordinates CurveCreator_Curve::getPoint( const int theISection, //======================================================================= CurveCreator::Coordinates CurveCreator_Curve::getPoints( const int theISection ) const { - CurveCreator::Coordinates aCoords; - if ( ( theISection >= 0 ) && ( theISection < mySections.size() ) ) - { - aCoords = mySections.at(theISection)->myPoints; - } - return aCoords; + CurveCreator_Section* aSection = getSection( theISection ); + return aSection ? aSection->myPoints : CurveCreator::Coordinates(); } void CurveCreator_Curve::constructAISObject() @@ -955,6 +974,15 @@ void CurveCreator_Curve::constructAISObject() myAISShape = new AIS_Shape( aShape ); } +CurveCreator_Section* CurveCreator_Curve::getSection( const int theSectionId ) const +{ + CurveCreator_Section *aSection = 0; + if ( theSectionId >= 0 && theSectionId < mySections.size() ) + aSection = mySections.at( theSectionId ); + + return aSection; +} + Handle(AIS_InteractiveObject) CurveCreator_Curve::getAISObject( const bool theNeedToBuild ) const { if ( !myAISShape && theNeedToBuild ) { @@ -969,7 +997,7 @@ bool CurveCreator_Curve::removeSectionPoints( const int theSectionId, { bool aRes = false; - CurveCreator_Section *aSection = mySections.at( theSectionId ); + CurveCreator_Section* aSection = getSection( theSectionId ); if ( !aSection ) return aRes; diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.hxx b/src/HYDROCurveCreator/CurveCreator_Curve.hxx index 209e6a7c..b9b6e29e 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.hxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.hxx @@ -298,6 +298,12 @@ protected: protected: virtual void constructAISObject(); + /** + * Returns the section by the section index or NULL if the index is out of the section + * list range + * \param theSectionId the section index + */ + CurveCreator_Section* getSection( const int theSectionId ) const; protected: bool mySkipSorting; -- 2.39.2