Salome HOME
another z layer for hilight presentation
[modules/hydro.git] / src / HYDROCurveCreator / CurveCreator_Curve.cxx
index 8e3a432827f0d91f158a97c411904e283382aa58..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() )
@@ -258,11 +260,13 @@ bool CurveCreator_Curve::moveSectionInternal(const int theISection,
                                              const int theNewIndex)
 {
   bool res = false;
-  if (theISection != theNewIndex) {
-    CurveCreator_Section *aSection = mySections.at(theISection);
+  int aMovedSectionId = theISection >= 0 ? theISection : mySections.size()-1;
+
+  if (aMovedSectionId != theNewIndex) {
+    CurveCreator_Section* aSection = getSection( aMovedSectionId );
 
     // Remove section
-    CurveCreator::Sections::iterator anIter = mySections.begin() + theISection;
+    CurveCreator::Sections::iterator anIter = mySections.begin() + aMovedSectionId;
 
     mySections.erase(anIter);
 
@@ -356,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();
@@ -375,7 +382,7 @@ bool CurveCreator_Curve::clear()
   startOperation();
   // Set the difference.
   if (addEmptyDiff()) {
-    myListDiffs.back().init(this, CurveCreator_Operation::Clear);
+    myListDiffs.back().init(this);
   }
   res = clearInternal();
   finishOperation();
@@ -383,34 +390,47 @@ bool CurveCreator_Curve::clear()
 }
 
 //! For internal use only! Undo/Redo are not used here.
-bool CurveCreator_Curve::joinInternal( const int theISectionTo, 
-                                       const int theISectionFrom )
+bool CurveCreator_Curve::joinInternal( const std::list<int>& theSections )
 {
   bool res = false;
-  CurveCreator_Section *aSection1 = mySections.at(theISectionTo);
-  CurveCreator_Section *aSection2 = mySections.at(theISectionFrom);
-
-  aSection1->myPoints.insert(aSection1->myPoints.end(),
-                             aSection2->myPoints.begin(), 
-                             aSection2->myPoints.end());
+  if ( theSections.empty() )
+    return res;
+
+  int anISectionMain = theSections.front();
+  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
+  aSectionsToJoin.sort();
+  aSectionsToJoin.reverse();
+
+  std::list<int>::const_iterator anIt = aSectionsToJoin.begin(), aLast = aSectionsToJoin.end();
+  CurveCreator_Section* aSection;
+  for (; anIt != aLast; anIt++) {
+    aSection = getSection( *anIt );
+    aSectionMain->myPoints.insert(aSectionMain->myPoints.end(), aSection->myPoints.begin(),
+                                  aSection->myPoints.end());
+    res = removeSectionInternal(*anIt);
+    if ( !res )
+      break;
+  }
 
-  res = removeSection(theISectionFrom);
   redisplayCurve();
   return res;
 }
 
-//! Join range of sections to one section (join all sections if -1 is passed in theISectionFrom argument)
-bool CurveCreator_Curve::join( const int theISectionTo, 
-                               const int theISectionFrom )
+bool CurveCreator_Curve::join( const std::list<int>& theSections )
 {
-  //TODO
   bool res = false;
-  if ( theISectionTo != theISectionFrom ) {
+
+  if ( !theSections.empty() )
+  {
     startOperation();
     if (addEmptyDiff())
-      myListDiffs.back().init(this, CurveCreator_Operation::Join, theISectionTo, theISectionFrom);
+      myListDiffs.back().init(this, CurveCreator_Operation::Join, theSections);
 
-    res = joinInternal( theISectionTo, theISectionFrom );
+    res = joinInternal( theSections );
 
     finishOperation();
   }
@@ -526,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;
@@ -551,27 +575,49 @@ bool CurveCreator_Curve::canPointsBeSorted()
   return false;
 }
 
+/**
+ * Saves points coordinates difference.
+ * \param theOldCoords the old points coordinates
+ */
+void CurveCreator_Curve::saveCoordDiff( const SectionToPointCoordsList &theOldCoords )
+{
+  // Set the difference.
+  startOperation();
+  if (addEmptyDiff()) {
+    myListDiffs.back().init(this, theOldCoords);
+  }
+  finishOperation();
+}
+
 //! 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;
 }
@@ -598,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.
@@ -608,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;
@@ -635,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();
     }
   }
@@ -693,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();
@@ -757,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();
@@ -806,12 +857,13 @@ bool CurveCreator_Curve::setPoint( const int theISection,
 }
 
 //! Set coordinates of specified points from different sections
-bool CurveCreator_Curve::setSeveralPoints( const SectionToPointCoordsList &theSectionToPntCoords)
+bool CurveCreator_Curve::setSeveralPoints( const SectionToPointCoordsList &theSectionToPntCoords,
+                                           const bool theIsToSaveDiff )
 {
   bool res = false;
   // Set the difference.
   startOperation();
-  if (addEmptyDiff()) {
+  if (theIsToSaveDiff && addEmptyDiff()) {
     myListDiffs.back().init(this, CurveCreator_Operation::SetCoordinates,
                             theSectionToPntCoords);
   }
@@ -863,12 +915,12 @@ bool CurveCreator_Curve::removePoint( const int theISection, const int theIPnt )
   bool res = false;
   // Set the difference.
   startOperation();
+  SectionToPointList aListOfSectionsToPoints;
+  aListOfSectionsToPoints.push_back(std::make_pair(theISection, theIPnt));
   if (addEmptyDiff()) {
     myListDiffs.back().init(this, CurveCreator_Operation::RemovePoints,
-                            theISection, theIPnt);
+                            aListOfSectionsToPoints);
   }
-  SectionToPointList aListOfSectionsToPoints;
-  aListOfSectionsToPoints.push_back(std::make_pair(theISection, theIPnt));
   res = removePointsInternal( aListOfSectionsToPoints );
   finishOperation();
   return res;
@@ -896,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);
@@ -910,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()
@@ -926,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 ) {
@@ -940,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;