]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Ref #250 - Fatal error after Join all selections operation
authornds <nds@opencascade.com>
Thu, 19 Dec 2013 08:59:17 +0000 (08:59 +0000)
committernds <nds@opencascade.com>
Thu, 19 Dec 2013 08:59:17 +0000 (08:59 +0000)
Code correction in order to avoid an exception, caused by the incorrect index of the section.

src/HYDROCurveCreator/CurveCreator_Curve.cxx
src/HYDROCurveCreator/CurveCreator_Curve.hxx

index 53576dbc04a494505ea208a9a9f38f3ce500c2b3..396c4038239fe31b3e4a2d3d189b540492831d32 100644 (file)
@@ -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<int>& theSections )
     return res;
 
   int anISectionMain = theSections.front();
-  CurveCreator_Section* aSectionMain = mySections.at( anISectionMain );
+  CurveCreator_Section* aSectionMain = getSection( anISectionMain );
+
   std::list <int> 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<int>& theSections )
   std::list<int>::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;
 
index 209e6a7ca7354ff2b1d09089ca9d263bbcde3bc4..b9b6e29ea260a2e2351069b6ea1fa0efc74f4351 100644 (file)
@@ -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;