X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROCurveCreator%2FCurveCreator_Curve.cxx;h=99845e43dac2aa3ae38942d1adf1f86bcc0f5a54;hb=1e9be94cc5ff4ad886099c507462d5b70f6d71f9;hp=a05c4836ea75d0538d551cd467d7122be5be8f8e;hpb=82d2793c791664ea53ae82a3a4dfd5b1caeb29a3;p=modules%2Fhydro.git diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index a05c4836..99845e43 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -43,6 +43,8 @@ #include +//#define AIS_CURVE_DISPLAY + //======================================================================= // function: Constructor // purpose: @@ -56,6 +58,9 @@ CurveCreator_Curve::CurveCreator_Curve( const CurveCreator::Dimension theDimensi myUndoDepth (-1), myOpLevel(0) { +#ifdef AIS_CURVE_DISPLAY + myAISCurve = new CurveCreator_AISCurve( this ); +#endif } //======================================================================= @@ -105,6 +110,10 @@ std::string CurveCreator_Curve::getUniqSectionName() const void CurveCreator_Curve::setDisplayer( CurveCreator_Displayer* theDisplayer ) { myDisplayer = theDisplayer; + +#ifdef AIS_CURVE_DISPLAY + myDisplayer->displayAIS( myAISCurve, false ); +#endif } //======================================================================= @@ -176,36 +185,83 @@ 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 aSectSize = getNbPoints( 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 < ( aSectSize - 1 ) ; iPoint++ ){ + 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( aSectSize != 0 ){ + if( aPointSize != 0 ){ Handle_AIS_Point anAISPnt = getAISPoint(theISection, iPoint); aSectionRepresentation.push_back( anAISPnt ); - if( isClosed(theISection) && ( aSectSize > 1 ) ){ + 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 < aSectSize; iPoint++ ) + for( int iPoint = 0; iPoint < aPointSize; iPoint++ ) { Handle_AIS_Point anAISPnt = getAISPoint( theISection, iPoint ); aSectionRepresentation.push_back( anAISPnt ); @@ -218,7 +274,7 @@ std::vector CurveCreator_Curve::constructSection( aPoints.push_back( aY ); } - if( aSectSize > 1 ) + if( aPointSize > 1 ) { Handle(Geom_BSplineCurve) aBSplineCurve; // fill array for algorithm by the received coordinates @@ -247,6 +303,7 @@ std::vector CurveCreator_Curve::constructSection( Handle(AIS_Shape) aShape = new AIS_Shape( aWire ); aSectionRepresentation.push_back( aShape ); } +#endif } return aSectionRepresentation; } @@ -352,8 +409,26 @@ void CurveCreator_Curve::getCoordinates( int theISection, int theIPoint, double& void CurveCreator_Curve::redisplayCurve() { if( myDisplayer ) { - myDisplayer->erase(); - myDisplayer->display( constructWire() ); +#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 } } @@ -472,7 +547,7 @@ bool CurveCreator_Curve::clearInternal() { // erase curve from the viewer if( myDisplayer ) - myDisplayer->erase(); + myDisplayer->erase( true ); // Delete all allocated data. int i = 0; const int aNbSections = getNbSections(); @@ -520,12 +595,13 @@ bool CurveCreator_Curve::joinInternal( const int theISectionTo, return res; } -//! Join range of sections to one section (join all sections if -1 is passed in one of arguments) +//! 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 ) { + //TODO bool res = false; - if (theISectionTo != theISectionFrom) { + if ( theISectionTo != theISectionFrom ) { startOperation(); if (addEmptyDiff()) myListDiffs.back().init(this, CurveCreator_Operation::Join, theISectionTo, theISectionFrom); @@ -654,7 +730,8 @@ int CurveCreator_Curve::getNbPoints( const int theISection ) const aNbCoords += mySections[i]->myPoints.size(); } } else { - aNbCoords = mySections.at(theISection)->myPoints.size(); + if ( ( theISection >= 0 ) && ( theISection < mySections.size() ) ) + aNbCoords = mySections.at(theISection)->myPoints.size(); } return aNbCoords/myDimension; @@ -873,7 +950,8 @@ bool CurveCreator_Curve::setPointInternal( const CurveCreator::SectionsMap &theS for( ; aPntIt != aSectionPoints.end(); aPntIt++ ){ int anIPnt = (*aPntIt)->myID; CurveCreator::Coordinates aCoords = (*aPntIt)->myCoords; - aSection->myPoints.assign(aCoords.begin(), aCoords.end()); + for ( int i = 0; i < myDimension; i++) + aSection->myPoints.at(toICoord(anIPnt) + i) = aCoords[i]; } res = true; } @@ -904,7 +982,10 @@ bool CurveCreator_Curve::setPoint( const int theISection, aPoints.push_back( aPosPoint ); aSectionsMap[theISection] = aPoints; + int aSize1 = getNbPoints( theISection ); res = setPointInternal( aSectionsMap ); + int aSize2 = getNbPoints( theISection ); + finishOperation(); return res; @@ -913,7 +994,35 @@ bool CurveCreator_Curve::setPoint( const int theISection, //! Set coordinates of specified points from different sections bool CurveCreator_Curve::setSeveralPoints( const SectionToPointCoordsList &theSectionToPntCoords) { - return false; + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::SetCoordinates, + theSectionToPntCoords); + } + CurveCreator::SectionsMap aSectionsMap; + CurveCreator::PosPointsList aPosPoints; + CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt = + theSectionToPntCoords.begin(), aLast = theSectionToPntCoords.end(); + int aSectionId, aPointId; + for ( ; anIt != aLast; anIt++ ) { + aPosPoints.clear(); + aSectionId = anIt->first.first; + aPointId = anIt->first.second; + CurveCreator::Coordinates aNewCoords = anIt->second; + CurveCreator_PosPoint* aPosPoint = + new CurveCreator_PosPoint( aPointId, aNewCoords ); + if( aSectionsMap.find(aSectionId) != aSectionsMap.end() ) + aPosPoints = aSectionsMap[aSectionId]; + aPosPoints.push_back( aPosPoint ); + aSectionsMap[aSectionId] = aPosPoints; + + } + res = setPointInternal( aSectionsMap ); + finishOperation(); + + return res; } //! For internal use only! Undo/Redo are not used here. @@ -1002,7 +1111,12 @@ CurveCreator::Coordinates CurveCreator_Curve::getPoint( const int theISection, //======================================================================= CurveCreator::Coordinates CurveCreator_Curve::getPoints( const int theISection ) const { - return mySections.at(theISection)->myPoints; + CurveCreator::Coordinates aCoords; + if ( ( theISection >= 0 ) && ( theISection < mySections.size() ) ) + { + aCoords = mySections.at(theISection)->myPoints; + } + return aCoords; } @@ -1021,3 +1135,11 @@ std::vector CurveCreator_Curve::constructWire() co } return aCurveRepresentation; } + +void CurveCreator_Curve::getPoint( const int theISection, const int theIPoint, + gp_Pnt& thePoint ) const +{ + double anX, anY, aZ; + getCoordinates( theISection, theIPoint, anX, anY, aZ ); + thePoint = gp_Pnt( anX, anY, aZ); +}