X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROCurveCreator%2FCurveCreator_Curve.cxx;h=f056b03426ae1b2c486c6de592bacf4d73193df8;hb=1f844eb06506171b54541cc0caf1a0c237fe0dbf;hp=8f878e255c33e667919e72b0ec9e898f43efb9e1;hpb=7e825ec456c9331ef0df1cb59865cc55f0d8516a;p=modules%2Fhydro.git diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index 8f878e25..f056b034 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -347,6 +347,48 @@ void CurveCreator_Curve::redisplayCurve() } } +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::moveSectionInternal(const int theISection, + const int theNewIndex) +{ + bool res = false; + if (theISection != theNewIndex) { + CurveCreator_Section *aSection = mySections.at(theISection); + + // Remove section + CurveCreator::Sections::iterator anIter = mySections.begin() + theISection; + + mySections.erase(anIter); + + // Insert section. + anIter = mySections.begin() + theNewIndex; + mySections.insert(anIter, aSection); + res = true; + } + return res; +} + +//======================================================================= +// function: moveSection +// purpose: +//======================================================================= +bool CurveCreator_Curve::moveSection(const int theISection, + const int theNewIndex) +{ + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::MoveSection, + theISection, theNewIndex); + } + + // Update the curve. + res = moveSectionInternal(theISection, theNewIndex); + finishOperation(); + return res; +} + /************ Implementation of INTERFACE methods ************/ /***********************************************/ @@ -396,11 +438,8 @@ bool CurveCreator_Curve::redo() /***********************************************/ /*** Section methods ***/ /***********************************************/ -//======================================================================= -// function: clear -// purpose: -//======================================================================= -bool CurveCreator_Curve::clear() +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::clearInternal() { // erase curve from the viewer if( myDisplayer ) @@ -418,29 +457,55 @@ bool CurveCreator_Curve::clear() return true; } +//======================================================================= +// function: clear +// purpose: +//======================================================================= +bool CurveCreator_Curve::clear() +{ + bool res = false; + startOperation(); + // Set the difference. + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::Clear); + } + res = clearInternal(); + finishOperation(); + return res; +} + +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::joinInternal( const int theISectionTo, + const int theISectionFrom ) +{ + 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()); + + res = removeSection(theISectionFrom); + redisplayCurve(); + return res; +} + //! Join range of sections to one section (join all sections if -1 is passed in one of arguments) bool CurveCreator_Curve::join( const int theISectionTo, - const int theISectionFrom ) + const int theISectionFrom ) { + bool res = false; if (theISectionTo != theISectionFrom) { startOperation(); if (addEmptyDiff()) myListDiffs.back().init(this, CurveCreator_Operation::Join, theISectionTo, theISectionFrom); - CurveCreator_Section *aSection1 = mySections.at(theISectionTo); - CurveCreator_Section *aSection2 = mySections.at(theISectionFrom); - - aSection1->myPoints.insert(aSection1->myPoints.end(), - aSection2->myPoints.begin(), - aSection2->myPoints.end()); - - removeSection(theISectionFrom); - redisplayCurve(); + res = joinInternal( theISectionTo, theISectionFrom ); finishOperation(); - return true; } - return false; + return res; } //! Get number of sections @@ -449,6 +514,26 @@ int CurveCreator_Curve::getNbSections() const return mySections.size(); } +//! For internal use only! Undo/Redo are not used here. +int CurveCreator_Curve::addSectionInternal + (const std::string& theName, const CurveCreator::SectionType theType, + const bool theIsClosed, const CurveCreator::Coordinates &thePoints) +{ + CurveCreator_Section *aSection = new CurveCreator_Section; + + std::string aName = theName; + if( aName.empty() ){ + aName = getUniqSectionName(); + } + aSection->myName = aName; + aSection->myType = theType; + aSection->myIsClosed = theIsClosed; + aSection->myPoints = thePoints; + mySections.push_back(aSection); + redisplayCurve(); + return mySections.size()-1; +} + //======================================================================= // function: addSection // purpose: adds an empty section @@ -460,25 +545,16 @@ int CurveCreator_Curve::addSection int resISection = -1; // Set the difference. startOperation(); + CurveCreator::Coordinates aCoords; //empty list if (addEmptyDiff()) { - CurveCreator::Coordinates aCoords; //empty list myListDiffs.back().init(this, CurveCreator_Operation::AddSection, theName, aCoords, theType, theIsClosed); } - CurveCreator_Section *aSection = new CurveCreator_Section; - std::string aName = theName; - if( aName.empty() ){ - aName = getUniqSectionName(); - } - aSection->myName = aName; - aSection->myType = theType; - aSection->myIsClosed = theIsClosed; - mySections.push_back(aSection); - redisplayCurve(); + resISection = addSectionInternal(theName, theType, theIsClosed, aCoords); finishOperation(); - return mySections.size()-1; + return resISection; } //======================================================================= // function: addSection @@ -489,33 +565,22 @@ int CurveCreator_Curve::addSection const bool theIsClosed, const CurveCreator::Coordinates &thePoints) { int resISection = -1; - //// Set the difference. - //startOperation(); - //if (addEmptyDiff()) { - // myListDiffs.back().init(this, CurveCreator_Operation::AddSection, - // theName, thePoints, theType, theIsClosed); - //} - - // create an empty section - resISection = addSection(theName, theType, theIsClosed); - if( resISection != -1 ) { - // attach the given points to created section - CurveCreator_Section *aSection = mySections.at(resISection); - aSection->myPoints = thePoints; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::AddSection, + theName, thePoints, theType, theIsClosed); } - - //finishOperation(); + + resISection = addSectionInternal(theName, theType, theIsClosed, thePoints); + + finishOperation(); return resISection; } -//! Removes the given sections. -bool CurveCreator_Curve::removeSection( const int theISection ) +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::removeSectionInternal( const int theISection ) { - // Set the difference. - startOperation(); - if (addEmptyDiff()) - myListDiffs.back().init(this, CurveCreator_Operation::RemoveSection, theISection); - if (theISection == -1) { delete mySections.back(); mySections.pop_back(); @@ -526,9 +591,22 @@ bool CurveCreator_Curve::removeSection( const int theISection ) mySections.erase(anIterRm); } redisplayCurve(); + return true; +} + +//! Removes the given sections. +bool CurveCreator_Curve::removeSection( const int theISection ) +{ + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) + myListDiffs.back().init(this, CurveCreator_Operation::RemoveSection, theISection); + + res = removeSectionInternal( theISection ); finishOperation(); - return true; + return res; } /** @@ -559,12 +637,9 @@ bool CurveCreator_Curve::isClosed( const int theISection ) const return mySections.at(theISection)->myIsClosed; } -/** - * Set "closed" flag of the specified section (all sections if - * \a theISection is -1). - */ -bool CurveCreator_Curve::setClosed( const int theISection, - const bool theIsClosed ) +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::setClosedInternal( const int theISection, + const bool theIsClosed ) { if (theISection == -1) { int aSize = mySections.size(); @@ -581,7 +656,26 @@ bool CurveCreator_Curve::setClosed( const int theISection, return true; } -//! Returns specifyed section name +/** + * Set "closed" flag of the specified section (all sections if + * \a theISection is -1). + */ +bool CurveCreator_Curve::setClosed( const int theISection, + const bool theIsClosed ) +{ + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::SetClosed, + theIsClosed, theISection); + } + res = setClosedInternal( theISection, theIsClosed ); + finishOperation(); + return res; +} + +//! Returns specified section name std::string CurveCreator_Curve::getSectionName( const int theISection ) const { if( ( theISection >= 0 ) && ( theISection < mySections.size() )) @@ -589,15 +683,32 @@ std::string CurveCreator_Curve::getSectionName( const int theISection ) const return ""; } -/** Set name of the specified section */ -bool CurveCreator_Curve::setSectionName - ( const int theISection, const std::string& theName ) +//! For internal use only! Undo/Redo are not used here. +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; - return true; + res = true; } - return false; + return res; +} + +/** Set name of the specified section */ +bool CurveCreator_Curve::setSectionName( const int theISection, + const std::string& theName ) +{ + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::RenameSection, + theName, theISection); + } + res = setSectionNameInternal( theISection, theName ); + finishOperation(); + return res; } //! Get type of the specified section @@ -607,12 +718,9 @@ CurveCreator::SectionType CurveCreator_Curve::getSectionType return mySections.at(theISection)->myType; } -/** - * Set type of the specified section (or all sections - * if \a theISection is -1). - */ -bool CurveCreator_Curve::setSectionType( const int theISection, - const CurveCreator::SectionType theType ) +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::setSectionTypeInternal( const int theISection, + const CurveCreator::SectionType theType ) { if (theISection == -1) { int i = 0; @@ -631,11 +739,65 @@ bool CurveCreator_Curve::setSectionType( const int theISection, return true; } +/** + * Set type of the specified section (or all sections + * if \a theISection is -1). + */ +bool CurveCreator_Curve::setSectionType( const int theISection, + const CurveCreator::SectionType theType ) +{ + bool res = false; + startOperation(); + // Set the difference. + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::SetType, + theType, theISection); + } + + res = setSectionTypeInternal( theISection, theType ); + + finishOperation(); + return res; +} + /***********************************************/ /*** Point methods ***/ /***********************************************/ +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::addPointsInternal( const CurveCreator::Coordinates& theCoords, + const std::vector &theISections, + const std::vector &theIPnts ) +{ + bool res = false; + if( (theCoords.size()/getDimension()) == theISections.size() == theIPnts.size() ) { + for( int ind = 0; ind < theISections.size(); ind++ ) { + int anISection = theISections.at(ind); + CurveCreator_Section *aSection = + (anISection == -1 ? mySections.back() : mySections.at(anISection)); + + if( aSection ) { + int anIPnt = theIPnts.at(ind); + CurveCreator::Coordinates::iterator anIterPosition; + if(anIPnt == -1) + anIterPosition = aSection->myPoints.end(); + else + anIterPosition = aSection->myPoints.begin() + toICoord(anIPnt); + CurveCreator::Coordinates::const_iterator aFirstPosition = + theCoords.begin() + toICoord(ind); + aSection->myPoints.insert(anIterPosition, + aFirstPosition, + aFirstPosition + getDimension()); + res = true; + } + } + if(res) + redisplayCurve(); + } + return res; +} + /** * Add one point to the specified section starting from the given theIPnt index * (or at the end of points if \a theIPnt is -1). @@ -649,40 +811,23 @@ bool CurveCreator_Curve::addPoints( const CurveCreator::Coordinates& theCoords, // Set the difference. startOperation(); if (addEmptyDiff()) { - myListDiffs.back().init(this, CurveCreator_Operation::AddPoints, - theCoords, theISection); - } - CurveCreator_Section *aSection = - (theISection == -1 ? mySections.back() : mySections.at(theISection)); - - if( aSection ) { - int anICoord = ( theIPnt == -1 ? 0 : toICoord(theIPnt) ); - CurveCreator::Coordinates::iterator anIterPosition = aSection->myPoints.end(); - if( theIPnt != -1 ) - anIterPosition = aSection->myPoints.begin() + toICoord(theIPnt); - aSection->myPoints.insert(anIterPosition, - theCoords.begin(), theCoords.end()); - redisplayCurve(); - res = true; + myListDiffs.back().init(this, CurveCreator_Operation::InsertPoints, + theCoords, theISection, theIPnt); } + std::vector anISections, anIPnts; + anISections.push_back( theISection ); + anIPnts.push_back( theIPnt ); + res = addPointsInternal( theCoords, anISections, anIPnts ); finishOperation(); return res; } - //! Set coordinates of specified point -bool CurveCreator_Curve::setPoint( const int theISection, - const int theIPnt, - const CurveCreator::Coordinates& theNewCoords ) +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::setPointInternal( const int theISection, + const int theIPnt, + const CurveCreator::Coordinates& theNewCoords ) { - // Set the difference. - startOperation(); - if (addEmptyDiff()) { - myListDiffs.back().init(this, CurveCreator_Operation::SetCoordinates, - theNewCoords, theISection, theIPnt); - } - bool res = false; - // Update the curve. if (theNewCoords.size() == myDimension) { CurveCreator_Section *aSection = mySections.at(theISection); @@ -694,12 +839,59 @@ bool CurveCreator_Curve::setPoint( const int theISection, res = true; } + return res; +} +//! Set coordinates of specified point +bool CurveCreator_Curve::setPoint( const int theISection, + const int theIPnt, + const CurveCreator::Coordinates& theNewCoords ) +{ + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::SetCoordinates, + theNewCoords, theISection, theIPnt); + } + res = setPointInternal( theISection, theIPnt, theNewCoords ); finishOperation(); return res; } +//! Set coordinates of specified points from different sections +bool CurveCreator_Curve::setSeveralPoints( const SectionToPointCoordsList &theSectionToPntCoords) +{ + return false; +} + +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::removePointsInternal( const std::vector &theISections, + const std::vector &theIPnts ) +{ + bool res = false; + if( theISections.size() == theIPnts.size() ) { + for( int ind = 0; ind < theISections.size(); ind++ ) { + int anISection = theISections.at(ind); + CurveCreator_Section *aSection = mySections.at(anISection); + if( aSection ) { + int anIPnt = theIPnts.at(ind); + CurveCreator::Coordinates::iterator aFirstPosition; + if(anIPnt == -1) + aFirstPosition = aSection->myPoints.end(); + else + aFirstPosition = aSection->myPoints.begin() + toICoord(anIPnt); + aSection->myPoints.erase( aFirstPosition, aFirstPosition + getDimension() ); + res = true; + } + } + if(res) + redisplayCurve(); + } + return res; +} + //! Remove point with given id bool CurveCreator_Curve::removePoint( const int theISection, const int theIPnt ) { @@ -708,21 +900,23 @@ bool CurveCreator_Curve::removePoint( const int theISection, const int theIPnt ) startOperation(); if (addEmptyDiff()) { myListDiffs.back().init(this, CurveCreator_Operation::RemovePoints, - theISection, theIPnt, 0); - } - CurveCreator_Section *aSection = mySections.at(theISection); - if( aSection ) { - CurveCreator::Coordinates::iterator anIterPosition = - aSection->myPoints.begin() + toICoord(theIPnt); - aSection->myPoints.erase( anIterPosition ); - redisplayCurve(); - res = true; + theISection, theIPnt); } + std::vector anISections, anIPnts; + anISections.push_back( theISection ); + anIPnts.push_back( theIPnt ); + res = removePointsInternal( anISections, anIPnts ); finishOperation(); return res; } -//======================================================================= +//! Remove several points from different sections with given ids +bool CurveCreator_Curve::removeSeveralPoints( const SectionToPointList &theSectionToPntIDs) +{ + return false; +} + + //======================================================================= // function: getCoordinates // purpose: //=======================================================================