X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROCurveCreator%2FCurveCreator_Curve.cxx;h=396c4038239fe31b3e4a2d3d189b540492831d32;hb=09d10e66ba0fac5353c8d1f138055fc6fe86fb65;hp=7732314881c16fce744807370401d6da9500067b;hpb=0a05fe93f2714557dfa18debf6dc45f0515384d0;p=modules%2Fhydro.git diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index 77323148..396c4038 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -26,20 +26,16 @@ #include "CurveCreator_PosPoint.hxx" #include "CurveCreator_Section.hxx" #include "CurveCreator_Displayer.h" +#include "CurveCreator_Utils.h" -#include -#include #include -#include -#include +#include #include #include #include #include #include #include -#include -#include #include @@ -51,10 +47,12 @@ CurveCreator_Curve::CurveCreator_Curve( const CurveCreator::Dimension theDimensi : myIsLocked (false), myDimension (theDimension), myDisplayer (NULL), + myAISShape (NULL), myNbUndos (0), myNbRedos (0), myUndoDepth (-1), - myOpLevel(0) + myOpLevel(0), + mySkipSorting(false) { } @@ -83,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() ) @@ -176,81 +176,6 @@ int CurveCreator_Curve::toICoord(const int theIPnt) const return theIPnt * myDimension; } -std::vector CurveCreator_Curve::constructSection( int theISection ) const -{ - std::vector aSectionRepresentation; - - CurveCreator::SectionType aSectType = getSectionType( theISection ); - int aSectSize = getNbPoints( theISection ); - bool aSectIsClosed = isClosed( theISection ); - - if( aSectType == CurveCreator::Polyline ) - { - int iPoint = 0; - for( ; iPoint < ( aSectSize - 1 ) ; iPoint++ ){ - Handle_AIS_Point anAISPnt = getAISPoint(theISection, iPoint); - aSectionRepresentation.push_back( anAISPnt ); - Handle_AIS_Line aLine = getAISLine( theISection, iPoint, iPoint+1 ); - aSectionRepresentation.push_back( aLine ); - } - if( aSectSize != 0 ){ - Handle_AIS_Point anAISPnt = getAISPoint(theISection, iPoint); - aSectionRepresentation.push_back( anAISPnt ); - if( isClosed(theISection) && ( aSectSize > 1 ) ){ - Handle_AIS_Line aLine = getAISLine( theISection, iPoint, 0 ); - aSectionRepresentation.push_back( aLine ); - } - } - } - else if( aSectType == CurveCreator::Spline ) - { - std::vector aPoints; - for( int iPoint = 0; iPoint < aSectSize; iPoint++ ) - { - Handle_AIS_Point anAISPnt = getAISPoint( theISection, iPoint ); - aSectionRepresentation.push_back( anAISPnt ); - - CurveCreator::Coordinates aCoords = getPoint( theISection, iPoint ); - double aX = aCoords[0]; - double aY = aCoords[1]; - double aZ = aCoords[2]; - aPoints.push_back( aX ); - aPoints.push_back( aY ); - } - - if( aSectSize > 1 ) - { - Handle(Geom_BSplineCurve) aBSplineCurve; - // fill array for algorithm by the received coordinates - int aLen = aPoints.size() / 2; - Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt (1, aLen); - std::vector::const_iterator aListIter = aPoints.begin(); - for (int ind = 1; ind <= aLen; ind++) { - gp_Pnt aPnt(gp::Origin()); - aPnt.SetX(*aListIter); - aListIter++; - aPnt.SetY(*aListIter); - aListIter++; - aPnt.SetZ(0); - aHCurvePoints->SetValue(ind, aPnt); - } - // compute BSpline - GeomAPI_Interpolate aGBC(aHCurvePoints, aSectIsClosed, gp::Resolution()); - aGBC.Perform(); - if (aGBC.IsDone()) { - aBSplineCurve = aGBC.Curve(); - } - TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aBSplineCurve ).Edge(); - - TopoDS_Wire aWire = BRepBuilderAPI_MakeWire( anEdge ).Wire(); - - Handle(AIS_Shape) aShape = new AIS_Shape( aWire ); - aSectionRepresentation.push_back( aShape ); - } - } - return aSectionRepresentation; -} - //======================================================================= // function: setUndoDepth // purpose: @@ -309,35 +234,6 @@ int CurveCreator_Curve::getUndoDepth() const return myUndoDepth; } -Handle_AIS_Point CurveCreator_Curve::getAISPoint( int theISection, int theIPoint ) const -{ - double anX, anY, aZ; - getCoordinates( theISection, theIPoint, anX, anY, aZ ); - gp_Pnt aPoint( anX, anY, aZ); - - AIS_Point* aPnt = new AIS_Point( new Geom_CartesianPoint(aPoint)); - return aPnt; -} - -Handle_AIS_Line CurveCreator_Curve::getAISLine( int theISection, int theIPoint1, int theIPoint2 ) const -{ - double anX, anY, aZ; - getCoordinates( theISection, theIPoint1, anX, anY, aZ ); - gp_Pnt aPoint1( anX, anY, aZ); - - double anX2, anY2, aZ2; - getCoordinates( theISection, theIPoint2, anX2, anY2, aZ2 ); -//MTN to avoid crash during line construction - if( ( anX == anX2 ) && ( anY == anY2 ) && (aZ == aZ2 ) ){ - aZ2 += 1e-7; - } - - gp_Pnt aPoint2( anX2, anY2, aZ2 ); - - AIS_Line* aLine = new AIS_Line( new Geom_CartesianPoint(aPoint1), new Geom_CartesianPoint(aPoint2) ); - return aLine; -} - void CurveCreator_Curve::getCoordinates( int theISection, int theIPoint, double& theX, double& theY, double& theZ ) const { CurveCreator::Coordinates aCoords = getPoint( theISection, theIPoint ); @@ -352,8 +248,10 @@ void CurveCreator_Curve::getCoordinates( int theISection, int theIPoint, double& void CurveCreator_Curve::redisplayCurve() { if( myDisplayer ) { - myDisplayer->erase(); - myDisplayer->display( constructWire() ); + myDisplayer->eraseAll( false ); + myAISShape = NULL; + + myDisplayer->display( getAISObject( true ), true ); } } @@ -362,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); @@ -399,25 +299,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 ************/ /***********************************************/ @@ -471,14 +352,19 @@ bool CurveCreator_Curve::redo() bool CurveCreator_Curve::clearInternal() { // erase curve from the viewer - if( myDisplayer ) - myDisplayer->erase(); + if( myDisplayer ) { + myDisplayer->eraseAll( true ); + myAISShape = NULL; + } // Delete all allocated data. 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(); @@ -496,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(); @@ -504,33 +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& 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 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::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 one of arguments) -bool CurveCreator_Curve::join( const int theISectionTo, - const int theISectionFrom ) +bool CurveCreator_Curve::join( const std::list& theSections ) { 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(); } @@ -646,42 +546,78 @@ 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; } +void CurveCreator_Curve::setSkipSorting( const bool theIsToSkip ) +{ + mySkipSorting = theIsToSkip; +} + +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; } @@ -708,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. @@ -718,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; @@ -745,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(); } } @@ -803,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(); @@ -867,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(); @@ -916,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); } @@ -952,34 +894,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 @@ -988,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; @@ -1021,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); @@ -1035,27 +962,76 @@ 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; + CurveCreator_Section* aSection = getSection( theISection ); + return aSection ? aSection->myPoints : CurveCreator::Coordinates(); +} + +void CurveCreator_Curve::constructAISObject() +{ + TopoDS_Shape aShape; + CurveCreator_Utils::constructShape( this, aShape ); + + 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 ) { + CurveCreator_Curve* aCurve = (CurveCreator_Curve*)this; + aCurve->constructAISObject(); } - return aCoords; + return myAISShape; } +bool CurveCreator_Curve::removeSectionPoints( const int theSectionId, + const std::list& thePointIds ) +{ + bool aRes = false; + + CurveCreator_Section* aSection = getSection( 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; +} -/***********************************************/ -/*** Presentation methods ***/ -/***********************************************/ -std::vector CurveCreator_Curve::constructWire() const +void CurveCreator_Curve::convert( const SectionToPointList& thePoints, + std::map< int, std::list >& theConvPoints ) { - std::vector aCurveRepresentation; - std::vector aSectionObjects; - for( int iSection = 0 ; iSection < getNbSections() ; iSection++ ){ - aSectionObjects = constructSection( iSection ); - for( int iObject = 0 ; iObject < aSectionObjects.size() ; iObject++ ){ - aCurveRepresentation.push_back( aSectionObjects.at(iObject) ); - } + 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; } - return aCurveRepresentation; }