X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROCurveCreator%2FCurveCreator_Curve.cxx;h=0c6c45be4b9bb85032d42816ef96cd575d0aabac;hb=dc34ffaf3febe0112406def578ba7e1cb41f4ae7;hp=99845e43dac2aa3ae38942d1adf1f86bcc0f5a54;hpb=1e9be94cc5ff4ad886099c507462d5b70f6d71f9;p=modules%2Fhydro.git diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index 99845e43..0c6c45be 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -26,25 +26,19 @@ #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 -//#define AIS_CURVE_DISPLAY - //======================================================================= // function: Constructor // purpose: @@ -53,14 +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) { -#ifdef AIS_CURVE_DISPLAY - myAISCurve = new CurveCreator_AISCurve( this ); -#endif } //======================================================================= @@ -110,10 +102,6 @@ std::string CurveCreator_Curve::getUniqSectionName() const void CurveCreator_Curve::setDisplayer( CurveCreator_Displayer* theDisplayer ) { myDisplayer = theDisplayer; - -#ifdef AIS_CURVE_DISPLAY - myDisplayer->displayAIS( myAISCurve, false ); -#endif } //======================================================================= @@ -185,129 +173,6 @@ int CurveCreator_Curve::toICoord(const int theIPnt) const return theIPnt * myDimension; } -#include -#include -#include -#include -//#define USE_COMPOUND -std::vector CurveCreator_Curve::constructSection( int theISection ) const -{ - std::vector aSectionRepresentation; - - CurveCreator::SectionType aSectType = getSectionType( theISection ); - int aPointSize = getNbPoints( theISection ); - bool aSectIsClosed = isClosed( theISection ); - if( aSectType == CurveCreator::Polyline ) - { -#ifdef USE_COMPOUND - BRep_Builder aBuilder; - TopoDS_Compound aComp; - aBuilder.MakeCompound(aComp); - - int iPoint = 0; - gp_Pnt aPrevPoint, aPoint; - if ( aPointSize == 1 ) { - getPoint( theISection, iPoint, aPrevPoint ); - TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex(); - aBuilder.Add( aComp, aVertex ); - } - else if ( aPointSize > 1 ) { - TopoDS_Edge aPointEdge; - TopoDS_Vertex aVertex; - getPoint( theISection, iPoint, aPrevPoint ); - aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex(); - aBuilder.Add( aComp, aVertex ); - iPoint++; - for( ; iPoint < aPointSize; iPoint++ ) { - getPoint( theISection, iPoint, aPoint ); - aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex(); - aBuilder.Add( aComp, aVertex ); - aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge(); - aBuilder.Add( aComp, aPointEdge ); - aPrevPoint = aPoint; - } - if( isClosed( theISection ) && ( aPointSize > 2 ) ) { - getPoint( theISection, 0, aPoint ); - aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex(); - aBuilder.Add( aComp, aVertex ); - aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge(); - aBuilder.Add( aComp, aPointEdge ); - } - AIS_Shape* aShape = new AIS_Shape( aComp ); - //aShape->SetSelectionMode( AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)TopAbs_VERTEX ) ); - aSectionRepresentation.push_back( aShape ); - } -#else - int iPoint = 0; - for( ; iPoint < ( aPointSize - 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( aPointSize != 0 ){ - Handle_AIS_Point anAISPnt = getAISPoint(theISection, iPoint); - aSectionRepresentation.push_back( anAISPnt ); - if( isClosed(theISection) && ( aPointSize > 1 ) ){ - Handle_AIS_Line aLine = getAISLine( theISection, iPoint, 0 ); - aSectionRepresentation.push_back( aLine ); - } - } -#endif - } - else if( aSectType == CurveCreator::Spline ) - { -#ifdef USE_COMPOUND - -#else - std::vector aPoints; - for( int iPoint = 0; iPoint < aPointSize; 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( aPointSize > 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 ); - } -#endif - } - return aSectionRepresentation; -} - //======================================================================= // function: setUndoDepth // purpose: @@ -366,35 +231,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 ); @@ -409,26 +245,10 @@ void CurveCreator_Curve::getCoordinates( int theISection, int theIPoint, double& void CurveCreator_Curve::redisplayCurve() { if( myDisplayer ) { -#ifdef AIS_CURVE_DISPLAY - myDisplayer->redisplayAIS(myAISCurve, false); -#else - myDisplayer->erase( false ); -//#ifndef USE_COMPOUND - myDisplayer->display( constructWire(), true ); -//#else - /*std::vector anAISObjects = constructWire(); - int aSelMode = AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)TopAbs_VERTEX ); - Handle(AIS_InteractiveContext) aContext = myDisplayer->getAISContext(); - for( int i = 0 ; i < anAISObjects.size() ; i++ ){ - Handle_AIS_InteractiveObject anAISObject = anAISObjects[i]; - //anAISObject->SetSelectionMode( aSelMode ); - aContext->Display( anAISObject, Standard_False ); - //aContext->Display( anAISObject, 0, aSelMode, Standard_False, Standard_True ); - } - aContext->UpdateCurrentViewer(); - */ -//#endif -#endif + myDisplayer->eraseAll( false ); + myAISShape = NULL; + + myDisplayer->display( getAISObject( true ), true ); } } @@ -474,25 +294,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 ************/ /***********************************************/ @@ -546,8 +347,10 @@ bool CurveCreator_Curve::redo() bool CurveCreator_Curve::clearInternal() { // erase curve from the viewer - if( myDisplayer ) - myDisplayer->erase( true ); + if( myDisplayer ) { + myDisplayer->eraseAll( true ); + myAISShape = NULL; + } // Delete all allocated data. int i = 0; const int aNbSections = getNbSections(); @@ -1028,34 +831,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 @@ -1119,27 +907,63 @@ CurveCreator::Coordinates CurveCreator_Curve::getPoints( const int theISection ) return aCoords; } +void CurveCreator_Curve::constructAISObject() +{ + TopoDS_Shape aShape; + CurveCreator_Utils::constructShape( this, aShape ); -/***********************************************/ -/*** Presentation methods ***/ -/***********************************************/ -std::vector CurveCreator_Curve::constructWire() const + myAISShape = new AIS_Shape( aShape ); +} + +Handle(AIS_InteractiveObject) CurveCreator_Curve::getAISObject( const bool theNeedToBuild ) const { - 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) ); - } + if ( !myAISShape && theNeedToBuild ) { + CurveCreator_Curve* aCurve = (CurveCreator_Curve*)this; + aCurve->constructAISObject(); + } + return myAISShape; +} + +bool CurveCreator_Curve::removeSectionPoints( const int theSectionId, + const std::list& thePointIds ) +{ + bool aRes = false; + + CurveCreator_Section *aSection = mySections.at( 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 aCurveRepresentation; + return aRes; } -void CurveCreator_Curve::getPoint( const int theISection, const int theIPoint, - gp_Pnt& thePoint ) const +void CurveCreator_Curve::convert( const SectionToPointList& thePoints, + std::map< int, std::list >& theConvPoints ) { - double anX, anY, aZ; - getCoordinates( theISection, theIPoint, anX, anY, aZ ); - thePoint = gp_Pnt( anX, anY, aZ); + 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; + } }