X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=b0a119a709c637905a7015c9b1738e98b2c213ad;hb=965adcb3288bda478cdd045d4b2f90c92980d099;hp=68e8b68bdf16e7720c362e0da0c88edb7d904462;hpb=b669a9a22a6cde038878f727af42e3f27e52e0d6;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 68e8b68bd..b0a119a70 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -1,19 +1,25 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: XGUI_Displayer.cpp // Created: 20 Apr 2014 // Author: Natalia ERMOLAEVA #include "XGUI_Displayer.h" -#include "XGUI_Viewer.h" #include "XGUI_Workshop.h" #include "XGUI_ViewerProxy.h" +#include + #include #include #include #include +#include + #include #include +#include #include #include @@ -21,14 +27,21 @@ #include #include #include +#include +#include +#include +#include + +#include +#include #include const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) + : myWorkshop(theWorkshop) { - myWorkshop = theWorkshop; } XGUI_Displayer::~XGUI_Displayer() @@ -37,7 +50,7 @@ XGUI_Displayer::~XGUI_Displayer() bool XGUI_Displayer::isVisible(ObjectPtr theObject) const { - return myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end(); + return myResult2AISObjectMap.contains(theObject); } void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) @@ -45,19 +58,20 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) if (isVisible(theObject)) { redisplay(theObject, isUpdateViewer); } else { - boost::shared_ptr anAIS; + AISObjectPtr anAIS; - GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); bool isShading = false; - if (aPrs) { - anAIS = aPrs->getAISObject(boost::shared_ptr()); + if (aPrs.get() != NULL) { + anAIS = aPrs->getAISObject(AISObjectPtr()); } else { - ResultPtr aResult = boost::dynamic_pointer_cast(theObject); - if (aResult) { - boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); - if (aShapePtr) { - anAIS = boost::shared_ptr(new GeomAPI_AISObject()); - anAIS->createShape(aShapePtr); + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get() != NULL) { + std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); + if (aShapePtr.get() != NULL) { + anAIS = AISObjectPtr(new GeomAPI_AISObject()); + anAIS->setImpl(new Handle(AIS_InteractiveObject)(new ModuleBase_ResultPrs(aResult))); + //anAIS->createShape(aShapePtr); isShading = true; } } @@ -67,7 +81,7 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) } } -void XGUI_Displayer::display(ObjectPtr theObject, boost::shared_ptr theAIS, +void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, bool isShading, bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); @@ -77,9 +91,34 @@ void XGUI_Displayer::display(ObjectPtr theObject, boost::shared_ptrimpl(); if (!anAISIO.IsNull()) { myResult2AISObjectMap[theObject] = theAIS; + + closeLocalContexts(false); aContext->Display(anAISIO, false); - aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, isUpdateViewer); + aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, false); + // Customization of presentation + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature.get() != NULL) { + GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast(aFeature); + if (aCustPrs.get() != NULL) + aCustPrs->customisePresentation(theAIS); + } + openLocalContext(); + aContext->Load(anAISIO, -1, true); + activate(theObject); + //if (aContext->HasOpenedContext()) { + //if (myUseExternalObjects) { + //if (myActiveSelectionModes.size() == 0) + // aContext->Activate(anAISIO); + //else { + // foreach(int aMode, myActiveSelectionModes) { + // aContext->Activate(anAISIO, aMode); + // } + //} + //} + //} } + if (isUpdateViewer) + updateViewer(); } void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) @@ -90,14 +129,14 @@ void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; - boost::shared_ptr anObject = myResult2AISObjectMap[theObject]; + AISObjectPtr anObject = myResult2AISObjectMap[theObject]; if (anObject) { Handle(AIS_InteractiveObject) anAIS = anObject->impl(); if (!anAIS.IsNull()) { aContext->Remove(anAIS, isUpdateViewer); } } - myResult2AISObjectMap.erase(theObject); + myResult2AISObjectMap.remove(theObject); } void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) @@ -105,106 +144,160 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) if (!isVisible(theObject)) return; - Handle(AIS_InteractiveObject) aAISIO; - boost::shared_ptr aAISObj = getAISObject(theObject); - GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + AISObjectPtr aAISObj = getAISObject(theObject); + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); + + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); if (aPrs) { - boost::shared_ptr aAIS_Obj = aPrs->getAISObject(aAISObj); - if (aAISObj && !aAIS_Obj) { + AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj); + if (!aAIS_Obj) { erase(theObject, isUpdateViewer); return; } - aAISIO = aAIS_Obj->impl(); - } else { - ResultPtr aResult = boost::dynamic_pointer_cast(theObject); - if (aResult) { - boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); - if (aShapePtr) { - Handle(AIS_Shape) aAISShape = Handle(AIS_Shape)::DownCast( - aAISObj->impl()); - if (!aAISShape.IsNull()) { - aAISShape->Set(aShapePtr->impl()); - aAISIO = aAISShape; - } - } + if (aAIS_Obj != aAISObj) { + myResult2AISObjectMap[theObject] = aAIS_Obj; } + aAISIO = aAIS_Obj->impl(); } + if (!aAISIO.IsNull()) { Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; aContext->Redisplay(aAISIO, isUpdateViewer); - //if (aContext->HasOpenedContext()) { - // aContext->Load(aAISIO, -1, true/*allow decomposition*/); - //} } } -void XGUI_Displayer::activateInLocalContext(ObjectPtr theResult, const std::list& theModes, - const bool isUpdateViewer) +void XGUI_Displayer::deactivate(ObjectPtr theObject) { - Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; - // Open local context if there is no one - if (!aContext->HasOpenedContext()) { - aContext->ClearCurrents(false); - //aContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/); - aContext->OpenLocalContext(); - aContext->NotUseDisplayedObjects(); - } - // display or redisplay presentation - Handle(AIS_InteractiveObject) anAIS; - if (isVisible(theResult)) { - boost::shared_ptr anObj = myResult2AISObjectMap[theResult]; - if (anObj) - anAIS = anObj->impl(); - } + if (isVisible(theObject)) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; - // Activate selection of objects from prs - if (!anAIS.IsNull()) { - aContext->ClearSelected(false); // ToCheck - //aContext->upClearSelected(false); // ToCheck - aContext->Load(anAIS, -1, true/*allow decomposition*/); + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); aContext->Deactivate(anAIS); - - std::list::const_iterator anIt = theModes.begin(), aLast = theModes.end(); - for (; anIt != aLast; anIt++) { - aContext->Activate(anAIS, (*anIt)); - } } +} - if (isUpdateViewer) - updateViewer(); +void XGUI_Displayer::activate(ObjectPtr theFeature) +{ + activate(theFeature, myActiveSelectionModes); } -void XGUI_Displayer::deactivate(ObjectPtr theObject) +void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) { if (isVisible(theObject)) { Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; - boost::shared_ptr anObj = myResult2AISObjectMap[theObject]; + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); aContext->Deactivate(anAIS); + //if (aContext->HasOpenedContext()) { + // aContext->Load(anAIS, -1, true); + //} + // In order to clear active modes list + if (theModes.size() > 0) { + foreach(int aMode, theModes) { + aContext->Activate(anAIS, aMode); + } + } else + aContext->Activate(anAIS); } } -void XGUI_Displayer::activate(ObjectPtr theObject) +void XGUI_Displayer::activateObjects(const QIntList& theModes) { - if (isVisible(theObject)) { - Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; + // In order to avoid doblications of selection modes + myActiveSelectionModes.clear(); + foreach (int aMode, theModes) { + if (!myActiveSelectionModes.contains(aMode)) + myActiveSelectionModes.append(aMode); + } + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; - boost::shared_ptr anObj = myResult2AISObjectMap[theObject]; - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - aContext->Activate(anAIS); + //aContext->UseDisplayedObjects(); + //myUseExternalObjects = true; + + AIS_ListOfInteractive aPrsList; + aContext->DisplayedObjects(aPrsList, true); + //Deactivate trihedron which can be activated in local selector + + Handle(AIS_Trihedron) aTrihedron; + AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); + Handle(AIS_InteractiveObject) anAISIO; + for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ + anAISIO = aLIt.Value(); + aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO); + if (!aTrihedron.IsNull()) { + aContext->Deactivate(aTrihedron); + } else { + //aContext->Load(anAISIO, -1, true); + // In order to clear active modes list + aContext->Deactivate(anAISIO); + if (myActiveSelectionModes.size() == 0) + aContext->Activate(anAISIO); + else { + foreach(int aMode, myActiveSelectionModes) { + aContext->Activate(anAISIO, aMode); + } + } + } + } +} + + +void XGUI_Displayer::deactivateObjects() +{ + myActiveSelectionModes.clear(); + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + aContext->NotUseDisplayedObjects(); + AIS_ListOfInteractive aPrsList; + aContext->DisplayedObjects(aPrsList); + + AIS_ListIteratorOfListOfInteractive aLIt; + Handle(AIS_Trihedron) aTrihedron; + Handle(AIS_InteractiveObject) anAISIO; + for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ + anAISIO = aLIt.Value(); + aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO); + if (!aTrihedron.IsNull()) { + aContext->Deactivate(aTrihedron); + } else { + //aContext->Load(anAISIO, -1, true); + aContext->Deactivate(anAISIO); + //aContext->Activate(anAISIO); + } } } -void XGUI_Displayer::stopSelection(const QList& theResults, const bool isStop, +bool XGUI_Displayer::isActive(ObjectPtr theObject) const +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return false; + if (!isVisible(theObject)) + return false; + + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + + TColStd_ListOfInteger aModes; + aContext->ActivatedModes(anAIS, aModes); + return aModes.Extent() > 0; +} + +void XGUI_Displayer::stopSelection(const QObjectPtrList& theResults, const bool isStop, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); @@ -212,7 +305,7 @@ void XGUI_Displayer::stopSelection(const QList& theResults, const boo return; Handle(AIS_Shape) anAIS; - QList::const_iterator anIt = theResults.begin(), aLast = theResults.end(); + QObjectPtrList::const_iterator anIt = theResults.begin(), aLast = theResults.end(); ObjectPtr aFeature; for (; anIt != aLast; anIt++) { aFeature = *anIt; @@ -240,81 +333,91 @@ void XGUI_Displayer::stopSelection(const QList& theResults, const boo updateViewer(); } -void XGUI_Displayer::setSelected(const QList& theResults, const bool isUpdateViewer) +void XGUI_Displayer::setSelected(const QObjectPtrList& theResults, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); - // we need to unhighligth objects manually in the current local context - // in couple with the selection clear (TODO) - Handle(AIS_LocalContext) aLocalContext = aContext->LocalContext(); - if (!aLocalContext.IsNull()) - aLocalContext->UnhilightLastDetected(myWorkshop->viewer()->activeView()); - - aContext->ClearSelected(); - foreach(ObjectPtr aResult, theResults) - { - if (myResult2AISObjectMap.find(aResult) == myResult2AISObjectMap.end()) - continue; - - boost::shared_ptr anObj = myResult2AISObjectMap[aResult]; - if (anObj) { - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (!anAIS.IsNull()) - aContext->AddOrRemoveSelected(anAIS, false); + if (aContext.IsNull()) + return; + if (aContext->HasOpenedContext()) { + aContext->UnhilightSelected(); + aContext->ClearSelected(); + foreach(ObjectPtr aResult, theResults) { + if (isVisible(aResult)) { + AISObjectPtr anObj = myResult2AISObjectMap[aResult]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (!anAIS.IsNull()) + aContext->SetSelected(anAIS, false); + } + } + } else { + aContext->UnhilightCurrents(); + aContext->ClearCurrents(); + foreach(ObjectPtr aResult, theResults) { + if (isVisible(aResult)) { + AISObjectPtr anObj = myResult2AISObjectMap[aResult]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (!anAIS.IsNull()) + aContext->SetCurrentObject(anAIS, false); + } } } if (isUpdateViewer) updateViewer(); } + +void XGUI_Displayer::clearSelected() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext) { + aContext->UnhilightCurrents(false); + aContext->ClearSelected(); + } +} + void XGUI_Displayer::eraseAll(const bool isUpdateViewer) { - Handle(AIS_InteractiveContext) ic = AISContext(); - if (ic.IsNull()) + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) return; - ResultToAISMap::iterator aIt; - for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) { + foreach (AISObjectPtr aAISObj, myResult2AISObjectMap) { // erase an object - boost::shared_ptr aAISObj = (*aIt).second; Handle(AIS_InteractiveObject) anIO = aAISObj->impl(); if (!anIO.IsNull()) - ic->Remove(anIO, false); + aContext->Remove(anIO, false); } myResult2AISObjectMap.clear(); if (isUpdateViewer) updateViewer(); } -void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; - - ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast = - myResult2AISObjectMap.end(); - std::list aRemoved; - for (; aFIt != aFLast; aFIt++) { - ObjectPtr aFeature = (*aFIt).first; - if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { - boost::shared_ptr anObj = (*aFIt).second; - if (!anObj) - continue; - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (!anAIS.IsNull()) { - aContext->Remove(anAIS, false); - aRemoved.push_back(aFeature); - } - } - } - std::list::const_iterator anIt = aRemoved.begin(), aLast = aRemoved.end(); - for (; anIt != aLast; anIt++) { - myResult2AISObjectMap.erase(myResult2AISObjectMap.find(*anIt)); - } - - if (isUpdateViewer) - updateViewer(); -} +//void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) +//{ +// Handle(AIS_InteractiveContext) aContext = AISContext(); +// if (aContext.IsNull()) +// return; +// +// QObjectPtrList aRemoved; +// foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) { +// if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { +// AISObjectPtr anObj = myResult2AISObjectMap[aFeature]; +// if (!anObj) +// continue; +// Handle(AIS_InteractiveObject) anAIS = anObj->impl(); +// if (!anAIS.IsNull()) { +// aContext->Remove(anAIS, false); +// aRemoved.append(aFeature); +// } +// } +// } +// foreach(ObjectPtr aObj, aRemoved) { +// myResult2AISObjectMap.remove(aObj); +// } +// +// if (isUpdateViewer) +// updateViewer(); +//} void XGUI_Displayer::openLocalContext() { @@ -323,111 +426,165 @@ void XGUI_Displayer::openLocalContext() return; // Open local context if there is no one if (!aContext->HasOpenedContext()) { - aContext->ClearCurrents(false); - //aContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/); + // Preserve selected objects + //AIS_ListOfInteractive aAisList; + //for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) + // aAisList.Append(aContext->Current()); + + // get the filters from the global context and append them to the local context + // a list of filters in the global context is not cleared and should be cleared here + SelectMgr_ListOfFilter aFilters; + aFilters.Assign(aContext->Filters()); + // it is important to remove the filters in the global context, because there is a code + // in the closeLocalContex, which restore the global context filters + aContext->RemoveFilters(); + + aContext->ClearCurrents(); aContext->OpenLocalContext(); - aContext->NotUseDisplayedObjects(); + //aContext->NotUseDisplayedObjects(); + + //myUseExternalObjects = false; + myActiveSelectionModes.clear(); + + SelectMgr_ListIteratorOfListOfFilter aIt(aFilters); + for (;aIt.More(); aIt.Next()) { + aContext->AddFilter(aIt.Value()); + } + // Restore selection + //AIS_ListIteratorOfListOfInteractive aIt2(aAisList); + //for(; aIt2.More(); aIt2.Next()) { + // aContext->SetSelected(aIt2.Value(), false); + //} } } void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) { - AISContext()->ClearSelected(false); - closeAllContexts(true); + Handle(AIS_InteractiveContext) aContext = AISContext(); + if ( (!aContext.IsNull()) && (aContext->HasOpenedContext()) ) { + // Preserve selected objects + //AIS_ListOfInteractive aAisList; + //for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) + // aAisList.Append(aContext->SelectedInteractive()); + + // get the filters from the local context and append them to the global context + // a list of filters in the local context is cleared + SelectMgr_ListOfFilter aFilters; + aFilters.Assign(aContext->Filters()); + + aContext->ClearSelected(); + aContext->CloseAllContexts(false); + + // Redisplay all object if they were displayed in localContext + Handle(AIS_InteractiveObject) aAISIO; + foreach (AISObjectPtr aAIS, myResult2AISObjectMap) { + aAISIO = aAIS->impl(); + if (aContext->DisplayStatus(aAISIO) != AIS_DS_Displayed) { + aContext->Display(aAISIO, false); + aContext->SetDisplayMode(aAISIO, Shading, false); + } + } + + // Append the filters from the local selection in the global selection context + SelectMgr_ListIteratorOfListOfFilter aIt(aFilters); + for (;aIt.More(); aIt.Next()) { + Handle(SelectMgr_Filter) aFilter = aIt.Value(); + aContext->AddFilter(aFilter); + } + + if (isUpdateViewer) + updateViewer(); + //myUseExternalObjects = false; + myActiveSelectionModes.clear(); + + // Restore selection + //AIS_ListIteratorOfListOfInteractive aIt2(aAisList); + //for(; aIt2.More(); aIt2.Next()) { + // if (aContext->IsDisplayed(aIt2.Value())) + // aContext->SetCurrentObject(aIt2.Value(), false); + //} + } } -boost::shared_ptr XGUI_Displayer::getAISObject(ObjectPtr theObject) const +AISObjectPtr XGUI_Displayer::getAISObject(ObjectPtr theObject) const { - boost::shared_ptr anIO; - if (myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end()) - anIO = (myResult2AISObjectMap.find(theObject))->second; + AISObjectPtr anIO; + if (myResult2AISObjectMap.contains(theObject)) + anIO = myResult2AISObjectMap[theObject]; return anIO; } -ObjectPtr XGUI_Displayer::getObject(Handle(AIS_InteractiveObject) theIO) const +ObjectPtr XGUI_Displayer::getObject(const AISObjectPtr& theIO) const { - ObjectPtr aFeature; - ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast = - myResult2AISObjectMap.end(); - for (; aFIt != aFLast && !aFeature; aFIt++) { - boost::shared_ptr anObj = (*aFIt).second; - if (!anObj) - continue; - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (anAIS != theIO) - continue; - aFeature = (*aFIt).first; - } - return aFeature; + Handle(AIS_InteractiveObject) aRefAIS = theIO->impl(); + return getObject(aRefAIS); } -void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) +ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO) const { - Handle(AIS_InteractiveContext) ic = AISContext(); - if (!ic.IsNull()) { - ic->CloseAllContexts(false); - if (isUpdateViewer) - updateViewer(); + ObjectPtr aFeature; + foreach (ObjectPtr anObj, myResult2AISObjectMap.keys()) { + AISObjectPtr aAIS = myResult2AISObjectMap[anObj]; + Handle(AIS_InteractiveObject) anAIS = aAIS->impl(); + if (anAIS == theIO) + return anObj; } + return aFeature; } void XGUI_Displayer::updateViewer() { - Handle(AIS_InteractiveContext) ic = AISContext(); - if (!ic.IsNull()) - ic->UpdateCurrentViewer(); + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (!aContext.IsNull()) + aContext->UpdateCurrentViewer(); } Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const { - return myWorkshop->viewer()->AISContext(); + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if ((!aContext.IsNull()) && (!aContext->HasOpenedContext())) { + aContext->OpenLocalContext(); + } + return aContext; } -void XGUI_Displayer::display(boost::shared_ptr theAIS, bool isUpdate) +Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter() { Handle(AIS_InteractiveContext) aContext = AISContext(); - Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); - if (!anAISIO.IsNull()) - aContext->Display(anAISIO, isUpdate); + if (myAndFilter.IsNull() && !aContext.IsNull()) { + myAndFilter = new SelectMgr_AndFilter(); + aContext->AddFilter(myAndFilter); + } + return myAndFilter; } -void XGUI_Displayer::erase(boost::shared_ptr theAIS, const bool isUpdate) +void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) { Handle(AIS_InteractiveContext) aContext = AISContext(); Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); if (!anAISIO.IsNull()) { - aContext->Remove(anAISIO, isUpdate); + aContext->Display(anAISIO, isUpdate); + if (aContext->HasOpenedContext()) { + //if (myUseExternalObjects) { + if (myActiveSelectionModes.size() == 0) + aContext->Activate(anAISIO); + else { + foreach(int aMode, myActiveSelectionModes) { + aContext->Activate(anAISIO, aMode); + } + } + //} + } } } -void XGUI_Displayer::activateObjectsOutOfContext(const std::list& theModes, - Handle(SelectMgr_Filter) theFilter) +void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool isUpdate) { Handle(AIS_InteractiveContext) aContext = AISContext(); - // Open local context if there is no one - if (!aContext->HasOpenedContext()) - return; - - aContext->UseDisplayedObjects(); - std::list::const_iterator anIt = theModes.begin(), aLast = theModes.end(); - for (; anIt != aLast; anIt++) { - aContext->ActivateStandardMode((TopAbs_ShapeEnum)(*anIt)); + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull()) { + aContext->Remove(anAISIO, isUpdate); } - - if (!theFilter.IsNull()) - aContext->AddFilter(theFilter); -} - - -void XGUI_Displayer::deactivateObjectsOutOfContext() -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - // Open local context if there is no one - if (!aContext->HasOpenedContext()) - return; - - aContext->RemoveFilters(); - aContext->NotUseDisplayedObjects(); } @@ -440,7 +597,7 @@ void XGUI_Displayer::setDisplayMode(ObjectPtr theObject, DisplayMode theMode, bo if (aContext.IsNull()) return; - boost::shared_ptr aAISObj = getAISObject(theObject); + AISObjectPtr aAISObj = getAISObject(theObject); if (!aAISObj) return; @@ -448,14 +605,13 @@ void XGUI_Displayer::setDisplayMode(ObjectPtr theObject, DisplayMode theMode, bo aContext->SetDisplayMode(aAISIO, theMode, toUpdate); } - XGUI_Displayer::DisplayMode XGUI_Displayer::displayMode(ObjectPtr theObject) const { Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return NoMode; - boost::shared_ptr aAISObj = getAISObject(theObject); + AISObjectPtr aAISObj = getAISObject(theObject); if (!aAISObj) return NoMode; @@ -463,3 +619,46 @@ XGUI_Displayer::DisplayMode XGUI_Displayer::displayMode(ObjectPtr theObject) con return (XGUI_Displayer::DisplayMode) aAISIO->DisplayMode(); } +void XGUI_Displayer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + const SelectMgr_ListOfFilter& aFilters = aContext->Filters(); + SelectMgr_ListIteratorOfListOfFilter aIt(aFilters); + for (; aIt.More(); aIt.Next()) { + if (theFilter.Access() == aIt.Value().Access()) + return; + } + GetFilter()->Add(theFilter); +} + +void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + GetFilter()->Remove(theFilter); +} + +void XGUI_Displayer::removeFilters() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + GetFilter()->Clear(); +} + +void XGUI_Displayer::showOnly(const QObjectPtrList& theList) +{ + QObjectPtrList aDispList = myResult2AISObjectMap.keys(); + foreach(ObjectPtr aObj, aDispList) { + if (!theList.contains(aObj)) + erase(aObj, false); + } + foreach(ObjectPtr aObj, theList) { + if (!isVisible(aObj)) + display(aObj, false); + } + updateViewer(); +}