X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=20a6f721e9f38e7285b3440405e7e18a2edf67e5;hb=00265e8a59b2eff159cef64eef8de47ed4b9b728;hp=1df32917011497fda656630e3987b3b61bd6ef6f;hpb=29b4b1b5e692ebc45e8a27703b9307b075d2cff2;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 1df329170..20a6f721e 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -1,47 +1,162 @@ +// File: XGUI_Displayer.cpp +// Created: 20 Apr 2014 +// Author: Natalia ERMOLAEVA + #include "XGUI_Displayer.h" -#include "XGUI_Tools.h" #include "XGUI_Viewer.h" +#include "XGUI_Workshop.h" +#include "XGUI_ViewerProxy.h" #include #include +#include +#include + #include -/*! - \brief Constructor - */ -XGUI_Displayer::XGUI_Displayer(XGUI_Viewer* theViewer) -: myViewer(theViewer) +XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) { + myWorkshop = theWorkshop; } -/*! - \brief Destructor - */ XGUI_Displayer::~XGUI_Displayer() { } -/*! - * Display the feature - * \param theFeature a feature instance - */ -void XGUI_Displayer::Display(std::shared_ptr theFeature) +bool XGUI_Displayer::IsVisible(boost::shared_ptr theFeature) +{ + return myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end(); +} + +void XGUI_Displayer::Display(boost::shared_ptr theFeature, + const bool isUpdateViewer) { } -/*! - * Display the feature and a shape. This shape would be associated to the given feature - * \param theFeature a feature instance - * \param theFeature a shape - */ -void XGUI_Displayer::Display(std::shared_ptr theFeature, - const TopoDS_Shape& theShape) +void XGUI_Displayer::Display(boost::shared_ptr theFeature, + const TopoDS_Shape& theShape, const bool isUpdateViewer) { - Handle(AIS_InteractiveContext) aContext = myViewer->AISContext(); + Handle(AIS_InteractiveContext) aContext = AISContext(); Handle(AIS_Shape) anAIS = new AIS_Shape(theShape); + myFeature2AISObjectMap[theFeature] = anAIS; + aContext->Display(anAIS, Standard_False); + if (isUpdateViewer) + aContext->UpdateCurrentViewer(); +} + +boost::shared_ptr XGUI_Displayer::GetFeature(const TopoDS_Shape& theShape) +{ + boost::shared_ptr aFeature; + + FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), + aFLast = myFeature2AISObjectMap.end(); + for (; aFIt != aFLast && !aFeature; aFIt++) + { + Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; + Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); + if (!anAISShape.IsNull() && anAISShape->Shape() == theShape) { + aFeature = (*aFIt).first; + } + } + return aFeature; +} + +std::list XGUI_Displayer::GetViewerPrs + (const NCollection_List& theShapes) +{ + std::list aPresentations; + if (theShapes.IsEmpty()) + return aPresentations; + + NCollection_List::Iterator anIt(theShapes); + for (; anIt.More(); anIt.Next()) { + const TopoDS_Shape& aShape = anIt.Value(); + if (aShape.IsNull()) + continue; + boost::shared_ptr aFeature = GetFeature(aShape); + aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape)); + } + + return aPresentations; +} + +void XGUI_Displayer::Erase(boost::shared_ptr theFeature, + const bool isUpdateViewer) +{ + if (myFeature2AISObjectMap.find(theFeature) == myFeature2AISObjectMap.end()) + return; + + Handle(AIS_InteractiveContext) aContext = AISContext(); + Handle(AIS_InteractiveObject) anAIS = myFeature2AISObjectMap[theFeature]; + Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); + if (!anAISShape.IsNull()) + { + aContext->Erase(anAISShape); + } + myFeature2AISObjectMap.erase(theFeature); + + if (isUpdateViewer) + aContext->UpdateCurrentViewer(); +} + +void XGUI_Displayer::RedisplayInLocalContext(boost::shared_ptr theFeature, + const TopoDS_Shape& theShape, + const std::list& theModes, const bool isUpdateViewer) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) { + aContext->ClearCurrents(false); + aContext->OpenLocalContext(false/*use displayed objects*/, /*true*/false/*use displayed objects*/, + true/*allow shape decomposition*/); + } + // display or redisplay presentation + Handle(AIS_Shape) anAIS; + if (IsVisible(theFeature)) { + anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[theFeature]); + if (!anAIS.IsNull()) { + anAIS->Set(theShape); + anAIS->Redisplay(); + } + } + else { + anAIS = new AIS_Shape(theShape); + myFeature2AISObjectMap[theFeature] = anAIS; + aContext->Display(anAIS, false); + } + // Activate selection of objects from prs + if (!anAIS.IsNull()) { + aContext->Load(anAIS, -1, true/*allow decomposition*/); + std::list::const_iterator anIt = theModes.begin(), aLast = theModes.end(); + for (; anIt != aLast; anIt++) + { + aContext->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)*anIt)); + } + } + + if (isUpdateViewer) + aContext->UpdateCurrentViewer(); +} + +void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer) +{ + closeAllContexts(true); +} + +void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) +{ + Handle(AIS_InteractiveContext) ic = AISContext(); + if (!ic.IsNull()) { + ic->CloseAllContexts(false); + if (isUpdateViewer) + ic->UpdateCurrentViewer(); + } +} - aContext->UpdateCurrentViewer(); +Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const +{ + return myWorkshop->viewer()->AISContext(); }