From 28b09f8fc96218c317aa67805bb3fc0e296aedbd Mon Sep 17 00:00:00 2001 From: nds Date: Wed, 4 Dec 2013 12:02:36 +0000 Subject: [PATCH] It removes AIS curve presentation. --- src/HYDROCurveCreator/CurveCreator_Curve.cxx | 21 ++- src/HYDROCurveCreator/CurveCreator_Curve.hxx | 9 +- src/HYDROCurveCreator/CurveCreator_ICurve.hxx | 4 +- src/HYDROCurveCreator/CurveCreator_Utils.cxx | 70 +++++++++ src/HYDROCurveCreator/CurveCreator_Utils.h | 11 ++ src/HYDROCurveCreator/CurveCreator_Widget.cxx | 140 +----------------- src/HYDROCurveCreator/CurveCreator_Widget.h | 3 - 7 files changed, 112 insertions(+), 146 deletions(-) diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index 7e814ade..1ce68e6c 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -46,6 +46,7 @@ CurveCreator_Curve::CurveCreator_Curve( const CurveCreator::Dimension theDimensi : myIsLocked (false), myDimension (theDimension), myDisplayer (NULL), + myAISShape (NULL), myNbUndos (0), myNbRedos (0), myUndoDepth (-1), @@ -244,6 +245,7 @@ void CurveCreator_Curve::redisplayCurve() { if( myDisplayer ) { myDisplayer->erase( false ); + myAISShape = NULL; myDisplayer->display( constructWire(), true ); } } @@ -362,8 +364,10 @@ bool CurveCreator_Curve::redo() bool CurveCreator_Curve::clearInternal() { // erase curve from the viewer - if( myDisplayer ) + if( myDisplayer ) { myDisplayer->erase( true ); + myAISShape = NULL; + } // Delete all allocated data. int i = 0; const int aNbSections = getNbSections(); @@ -939,14 +943,23 @@ CurveCreator::Coordinates CurveCreator_Curve::getPoints( const int theISection ) /***********************************************/ /*** Presentation methods ***/ /***********************************************/ -std::vector CurveCreator_Curve::constructWire() const +std::vector CurveCreator_Curve::constructWire() { std::vector aCurveRepresentation; TopoDS_Shape aShape; CurveCreator_Utils::constructShape( this, aShape ); - AIS_Shape* anAISShape = new AIS_Shape( aShape ); - aCurveRepresentation.push_back( anAISShape ); + myAISShape = new AIS_Shape( aShape ); + aCurveRepresentation.push_back( myAISShape ); return aCurveRepresentation; } + +//======================================================================= +// function: getAISObject +// purpose: +//======================================================================= +Handle_AIS_InteractiveObject CurveCreator_Curve::getAISObject() const +{ + return myAISShape; +} \ No newline at end of file diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.hxx b/src/HYDROCurveCreator/CurveCreator_Curve.hxx index abefa0d5..ffa89c9c 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.hxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.hxx @@ -36,6 +36,7 @@ struct CurveCreator_Section; class CurveCreator_Displayer; +class AIS_Shape; /** * The CurveCreator_Curve object is represented as one or more sets of @@ -261,13 +262,19 @@ public: /***********************************************/ /*** Presentation methods ***/ /***********************************************/ - virtual ListAISObjects constructWire() const; + virtual ListAISObjects constructWire(); + + /** + * Get the curve AIS object + */ + virtual Handle_AIS_InteractiveObject getAISObject() const; public: bool myIsLocked; CurveCreator::Sections mySections; //!< curve data CurveCreator::Dimension myDimension; //!< curve dimension CurveCreator_Displayer* myDisplayer; //!< curve displayer + AIS_Shape* myAISShape; //!< AIS shape private: diff --git a/src/HYDROCurveCreator/CurveCreator_ICurve.hxx b/src/HYDROCurveCreator/CurveCreator_ICurve.hxx index 821343e3..ed6b3c2e 100644 --- a/src/HYDROCurveCreator/CurveCreator_ICurve.hxx +++ b/src/HYDROCurveCreator/CurveCreator_ICurve.hxx @@ -179,7 +179,9 @@ public: /***********************************************/ /*** Presentation methods ***/ /***********************************************/ - virtual ListAISObjects constructWire() const = 0; + virtual ListAISObjects constructWire() = 0; + + virtual Handle_AIS_InteractiveObject getAISObject() const = 0; }; #endif diff --git a/src/HYDROCurveCreator/CurveCreator_Utils.cxx b/src/HYDROCurveCreator/CurveCreator_Utils.cxx index e237e6ee..fa5e7417 100644 --- a/src/HYDROCurveCreator/CurveCreator_Utils.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Utils.cxx @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,8 @@ #include #include #include +#include +#include #include #include @@ -204,6 +207,73 @@ void CurveCreator_Utils::getSelectedPoints( Handle(AIS_InteractiveContext) theCo } } +void CurveCreator_Utils::setSelectedPoints( Handle(AIS_InteractiveContext) theContext, + const CurveCreator_ICurve* theCurve, + const CurveCreator_ICurve::SectionToPointList& thePoints ) +{ + AIS_ListOfInteractive aDisplayedList; + theContext->DisplayedObjects( aDisplayedList ); + theContext->ClearSelected( Standard_False ); + + for ( AIS_ListIteratorOfListOfInteractive it( aDisplayedList ); it.More(); it.Next() ) + { + Handle(AIS_InteractiveObject) anAIS = it.Value(); + if ( anAIS.IsNull() ) + continue; + Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast( anAIS ); + if ( anAISShape.IsNull() ) + continue; + + //ASL: we convert list of point indices to list of points coordinates + int aSize = thePoints.size(); + std::vector aPntsToSelect( aSize ); + + CurveCreator_ICurve::SectionToPointList::const_iterator + aPIt = thePoints.begin(), aPLast = thePoints.end(); + CurveCreator_ICurve::SectionToPoint aSToPoint; + for( int i=0; aPIt != aPLast; aPIt++, i++ ) + { + gp_Pnt aPntToSelect; + CurveCreator_UtilsICurve::getPoint( theCurve, aPIt->first, aPIt->second, aPntToSelect ); + aPntsToSelect[i] = aPntToSelect; + } + + + //ASL: we switch off automatic highlight to improve performance of selection + theContext->SetAutomaticHilight( Standard_False ); + + Handle_SelectMgr_Selection aSelection = anAISShape->Selection( AIS_Shape::SelectionMode( TopAbs_VERTEX ) ); + for( aSelection->Init(); aSelection->More(); aSelection->Next() ) + { + Handle_SelectBasics_SensitiveEntity aSenEntity = aSelection->Sensitive(); + Handle_Select3D_SensitivePoint aSenPnt = Handle_Select3D_SensitivePoint::DownCast( aSenEntity ); + + gp_Pnt anOwnerPnt = aSenPnt->Point(); + Handle_SelectMgr_EntityOwner anOwner = Handle_SelectMgr_EntityOwner::DownCast( aSenPnt->OwnerId() ); + + + CurveCreator_ICurve::SectionToPointList::const_iterator anIt = thePoints.begin(), + aLast = thePoints.end(); + bool isFound = false; + for( int i=0; iAddOrRemoveSelected( anOwner, Standard_False ); + break; + } + } + } + } + + //ASL: we switch on again automatic highlight (otherwise selection will not be shown) + // and call HilightPicked to draw selected owners + theContext->SetAutomaticHilight( Standard_True ); + theContext->LocalContext()->HilightPicked( Standard_True ); +} + //======================================================================= // function : setLocalPointContext // purpose : Open/close the viewer local context diff --git a/src/HYDROCurveCreator/CurveCreator_Utils.h b/src/HYDROCurveCreator/CurveCreator_Utils.h index 0bdf5d59..ab4a3503 100644 --- a/src/HYDROCurveCreator/CurveCreator_Utils.h +++ b/src/HYDROCurveCreator/CurveCreator_Utils.h @@ -77,6 +77,17 @@ public: const CurveCreator_ICurve* theCurve, CurveCreator_ICurve::SectionToPointList& thePoints ); + /** + * Set selected points to the context + * \param theContext the viewer context + * \param thePoints the curve point indices to be selected in the context + */ + CURVECREATOR_EXPORT static void setSelectedPoints( + Handle(AIS_InteractiveContext) theContext, + const CurveCreator_ICurve* theCurve, + const CurveCreator_ICurve::SectionToPointList& thePoints = + CurveCreator_ICurve::SectionToPointList() ); + /*! * \brief Sets the local point context for the 3D viewer. * \param theOpen The flag to open or close the local context. diff --git a/src/HYDROCurveCreator/CurveCreator_Widget.cxx b/src/HYDROCurveCreator/CurveCreator_Widget.cxx index f3c5b8e8..ea0b5098 100644 --- a/src/HYDROCurveCreator/CurveCreator_Widget.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Widget.cxx @@ -56,9 +56,6 @@ #include #include #include -#include -#include -#include #include #include @@ -100,8 +97,6 @@ -const double LOCAL_SELECTION_TOLERANCE = 0.0001; - CurveCreator_Widget::CurveCreator_Widget(QWidget* parent, CurveCreator_ICurve *theCurve, Qt::WindowFlags fl, @@ -331,18 +326,6 @@ int CurveCreator_Widget::changeInteractionStyle( int theStyle ) return aPrevStyle; } -/** - * Set interaction style in the OCC viewer - * \param theStyle a new style - * \return the previous style - */ -void CurveCreator_Widget::setObjectsSelected(const AIS_ListOfInteractive& theList) -{ - OCCViewer_Viewer* aViewer = getOCCViewer(); - if ( aViewer ) - aViewer->setObjectsSelected(theList); -} - //======================================================================= // function: reset // purpose: reset the widget viewer, close local context, clear selection @@ -1309,133 +1292,16 @@ void CurveCreator_Widget::getSelectedPoints( CurveCreator_ICurve::SectionToPoint thePoints = myLocalPoints; } - -bool CurveCreator_Widget::isIntersectVertexToPoint( const TopoDS_Vertex& theVertex, - const CurveCreator_ICurve::SectionToPoint& theSToPoint ) -{ - bool isIntersect = false; - if ( theVertex.IsNull() ) - return isIntersect; - - gp_Pnt aSPoint; - CurveCreator_UtilsICurve::getPoint( myCurve, theSToPoint.first, theSToPoint.second, - aSPoint ); - gp_Pnt aVertexPoint = BRep_Tool::Pnt( theVertex ); - isIntersect = fabs( aVertexPoint.X() - aSPoint.X() ) < LOCAL_SELECTION_TOLERANCE && - fabs( aVertexPoint.Y() - aSPoint.Y() ) < LOCAL_SELECTION_TOLERANCE; - - return isIntersect; -} - - void CurveCreator_Widget::setSelectedPoints( const CurveCreator_ICurve::SectionToPointList& thePoints ) { if ( myDragStarted ) return; - - Handle(AIS_InteractiveContext) ic = getAISContext(); - if ( ic.IsNull() || !ic->HasOpenedContext() ) + Handle(AIS_InteractiveContext) aContext = getAISContext(); + if ( aContext.IsNull() || !aContext->HasOpenedContext() ) return; - AIS_ListOfInteractive aListToSelect; - AIS_ListOfInteractive aDisplayedList; - ic->DisplayedObjects( aDisplayedList ); - ic->ClearSelected( Standard_False ); - - bool isSelectedVertex = false; - - //ASL: std::vector aVetexVec; - for ( AIS_ListIteratorOfListOfInteractive it( aDisplayedList ); it.More(); it.Next() ) - { - Handle(AIS_InteractiveObject) anAIS = it.Value(); - if ( anAIS.IsNull() ) - continue; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast( anAIS ); - if ( anAISShape.IsNull() ) - continue; - - - /*ASL: const TopoDS_Shape& aShape = anAISShape->Shape(); - TopExp_Explorer aExpV( aShape, TopAbs_VERTEX); - for ( ; aExpV.More(); aExpV.Next() ) - { - const TopoDS_Vertex& aVertex = TopoDS::Vertex( aExpV.Current() ); - aVetexVec.push_back( aVertex ); - }*/ - - - //ASL: we convert list of point indices to list of points coordinates - int aSize = thePoints.size(); - std::vector aPntsToSelect( aSize ); - - CurveCreator_ICurve::SectionToPointList::const_iterator - aPIt = thePoints.begin(), aPLast = thePoints.end(); - CurveCreator_ICurve::SectionToPoint aSToPoint; - for( int i=0; aPIt != aPLast; aPIt++, i++ ) - { - gp_Pnt aPntToSelect; - CurveCreator_UtilsICurve::getPoint( myCurve, aPIt->first, aPIt->second, aPntToSelect ); - aPntsToSelect[i] = aPntToSelect; - } - - - //ASL: we switch off automatic highlight to improve performance of selection - ic->SetAutomaticHilight( Standard_False ); - - Handle_SelectMgr_Selection aSelection = anAISShape->Selection( AIS_Shape::SelectionMode( TopAbs_VERTEX ) ); - for( aSelection->Init(); aSelection->More(); aSelection->Next() ) - { - Handle_SelectBasics_SensitiveEntity aSenEntity = aSelection->Sensitive(); - Handle_Select3D_SensitivePoint aSenPnt = Handle_Select3D_SensitivePoint::DownCast( aSenEntity ); - - gp_Pnt anOwnerPnt = aSenPnt->Point(); - Handle_SelectMgr_EntityOwner anOwner = Handle_SelectMgr_EntityOwner::DownCast( aSenPnt->OwnerId() ); - - - CurveCreator_ICurve::SectionToPointList::const_iterator anIt = thePoints.begin(), - aLast = thePoints.end(); - bool isFound = false; - for( int i=0; iAddOrRemoveSelected( anOwner, Standard_False ); - break; - } - } - } - } - - /*ASL: std::vector::const_iterator aVecIt = aVetexVec.begin(), aVecLast = aVetexVec.end(); - CurveCreator_ICurve::SectionToPointList::const_iterator anIt = thePoints.begin(), - aLast = thePoints.end(); - int aSize = aVetexVec.size(); - CurveCreator_ICurve::SectionToPoint aSToPoint; - int anAddedSize = 0; - for( ; anIt != aLast; anIt++ ) { - aSToPoint = *anIt; - - for ( aVecIt = aVetexVec.begin(); aVecIt != aVecLast; aVecIt++ ) - { - TopoDS_Vertex aVertex = TopoDS::Vertex( *aVecIt ); - if ( isIntersectVertexToPoint( aVertex, aSToPoint ) ) { - ic->AddOrRemoveSelected( aVertex, Standard_False ); - isSelectedVertex = true; - anAddedSize++; - } - } - }*/ - - //ASL: we switch on again automatic highlight (otherwise selection will not be shown) - // and call HilightPicked to draw selected owners - ic->SetAutomaticHilight( Standard_True ); - ic->LocalContext()->HilightPicked( Standard_True ); + CurveCreator_Utils::setSelectedPoints( aContext, myCurve, thePoints ); - //ic->UpdateCurrentViewer(); - if ( !isSelectedVertex ) - setObjectsSelected( aListToSelect ); updateLocalPointView(); } diff --git a/src/HYDROCurveCreator/CurveCreator_Widget.h b/src/HYDROCurveCreator/CurveCreator_Widget.h index e3ac5af0..399711e8 100644 --- a/src/HYDROCurveCreator/CurveCreator_Widget.h +++ b/src/HYDROCurveCreator/CurveCreator_Widget.h @@ -63,7 +63,6 @@ public: Handle(AIS_InteractiveContext) getAISContext(); OCCViewer_ViewPort3d* getViewPort(); int changeInteractionStyle( int theStyle ); - void setObjectsSelected(const AIS_ListOfInteractive& theList); void reset(); void setCurve( CurveCreator_ICurve* theCurve ); @@ -166,8 +165,6 @@ private: void setDragStarted( const bool theState, const QPoint& thePoint = QPoint() ); void getSelectedPoints( CurveCreator_ICurve::SectionToPointList& thePoints ); - bool isIntersectVertexToPoint( const TopoDS_Vertex& theVertex, - const CurveCreator_ICurve::SectionToPoint& theSToPoint ); void setSelectedPoints( const CurveCreator_ICurve::SectionToPointList& = CurveCreator_ICurve::SectionToPointList() ); -- 2.39.2