X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=2613adae6bbc9ab20b77f31e8b3f5e49b7bb6e75;hb=a398103d11950df8cb50eeea49942237eb16edcf;hp=41c912f1a4e29248576cb291a820f10dc38f6dc5;hpb=973230a6a9b5c239063e3f7ae7a74601238b2a5f;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 41c912f1a..2613adae6 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -4,6 +4,8 @@ #include "XGUI_Displayer.h" #include "XGUI_Viewer.h" +#include "XGUI_Workshop.h" +#include "XGUI_ViewerProxy.h" #include @@ -13,9 +15,9 @@ #include -XGUI_Displayer::XGUI_Displayer(const Handle(AIS_InteractiveContext)& theAIS) +XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) { - myAISContext = theAIS; + myWorkshop = theWorkshop; } XGUI_Displayer::~XGUI_Displayer() @@ -38,102 +40,133 @@ void XGUI_Displayer::Display(boost::shared_ptr theFeature, Handle(AIS_InteractiveContext) aContext = AISContext(); Handle(AIS_Shape) anAIS = new AIS_Shape(theShape); - std::vector aDispAIS; - if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) { - aDispAIS = myFeature2AISObjectMap[theFeature]; - } - aDispAIS.push_back(anAIS); - myFeature2AISObjectMap[theFeature] = aDispAIS; + 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; - std::vector aDispAIS = myFeature2AISObjectMap[theFeature]; - std::vector::const_iterator anIt = aDispAIS.begin(), - aLast = aDispAIS.end(); Handle(AIS_InteractiveContext) aContext = AISContext(); - for (; anIt != aLast; anIt++) { - Handle(AIS_InteractiveObject) anAIS = *anIt; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); - if (anAISShape.IsNull()) - continue; - aContext->Erase(anAISShape); + 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::LocalSelection(boost::shared_ptr theFeature, - const TopoDS_Shape& theShape, - const int theMode, const bool isUpdateViewer) +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)) { - Erase(theFeature, false); + anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[theFeature]); + if (!anAIS.IsNull()) { + anAIS->Set(theShape); + anAIS->Redisplay(); + } } - - Handle(AIS_Shape) anAIS = new AIS_Shape(theShape); - std::vector aDispAIS; - if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) { - aDispAIS = myFeature2AISObjectMap[theFeature]; + 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)); + } } - aDispAIS.push_back(anAIS); - myFeature2AISObjectMap[theFeature] = aDispAIS; - aContext->Display(anAIS, Standard_False); - - AIS_ListOfInteractive anAISList; - anAISList.Append(anAIS); - setLocalSelection(anAISList, theMode, true); -} -void XGUI_Displayer::GlobalSelection(const bool isUpdateViewer) -{ - setGlobalSelection(true); + if (isUpdateViewer) + aContext->UpdateCurrentViewer(); } -void XGUI_Displayer::setLocalSelection(const AIS_ListOfInteractive& theAISObjects, const int theMode, - const bool isUpdateViewer) +void XGUI_Displayer::EraseAll(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); - // Open local context if there is no one - bool allObjects = false; // calculate by AIS shape - if (!ic->HasOpenedContext()) { - ic->ClearCurrents(false); - ic->OpenLocalContext(allObjects, true, true); - } + AIS_ListOfInteractive aList; + ic->DisplayedObjects(aList); + AIS_ListIteratorOfListOfInteractive anIter(aList); + for (; anIter.More(); anIter.Next()) { + if ((anIter.Value()->DynamicType() == STANDARD_TYPE(AIS_Trihedron))) + continue; - // Activate selection of objects from prs - AIS_ListIteratorOfListOfInteractive aIter(theAISObjects); - for (; aIter.More(); aIter.Next()) { - Handle(AIS_InteractiveObject) anAIS = aIter.Value(); - if (!anAIS.IsNull()) { - if (anAIS->IsKind(STANDARD_TYPE(AIS_Shape))) { - ic->Load(anAIS, -1, false); - ic->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)theMode)); - } - else if (anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron)) { - ic->Load(anAIS, -1, false); - ic->Activate(anAIS, theMode); - } - } + // erase an object + Handle(AIS_InteractiveObject) anIO = anIter.Value(); + ic->Erase(anIO, false); } + myFeature2AISObjectMap.clear(); if (isUpdateViewer) ic->UpdateCurrentViewer(); } -void XGUI_Displayer::setGlobalSelection(const bool isUpdateViewer) +void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer) +{ + closeAllContexts(true); +} + +void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); if (!ic.IsNull()) { @@ -142,3 +175,15 @@ void XGUI_Displayer::setGlobalSelection(const bool isUpdateViewer) ic->UpdateCurrentViewer(); } } + +void XGUI_Displayer::UpdateViewer() +{ + Handle(AIS_InteractiveContext) ic = AISContext(); + if (!ic.IsNull()) + ic->UpdateCurrentViewer(); +} + +Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const +{ + return myWorkshop->viewer()->AISContext(); +}