X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=0ebba5866f740bcac44bf6e9adbf8788fe1bc970;hb=9ef2d81a8b97eee85d6506d95f2481fe7fae1e56;hp=fee4e4230fb64f7a0f63444924b555232ce934ab;hpb=fd30229f7f40d6cc60670a4d9367324431964961;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index fee4e4230..0ebba5866 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -6,233 +6,232 @@ #include "XGUI_Viewer.h" #include "XGUI_Workshop.h" #include "XGUI_ViewerProxy.h" -#include "XGUI_Tools.h" #include #include #include +#include + +#include #include +#include #include #include #include #include #include - #include +#include +#include +#include +#include #include -const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity +const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) + : myUseExternalObjects(false), myWorkshop(theWorkshop) { - myWorkshop = theWorkshop; } XGUI_Displayer::~XGUI_Displayer() { } -bool XGUI_Displayer::isVisible(FeaturePtr theFeature) +bool XGUI_Displayer::isVisible(ObjectPtr theObject) const { - FeaturePtr aFeature = XGUI_Tools::realFeature(theFeature); - return myFeature2AISObjectMap.find(aFeature) != myFeature2AISObjectMap.end(); + return myResult2AISObjectMap.contains(theObject); } -void XGUI_Displayer::display(FeaturePtr theFeature, bool isUpdateViewer) +void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) { - FeaturePtr aFeature = XGUI_Tools::realFeature(theFeature); - boost::shared_ptr aShapePtr = aFeature->data()->shape(); - - if (aShapePtr) { - TopoDS_Shape aShape = aShapePtr->impl(); - display(aFeature, aShape, isUpdateViewer); + if (isVisible(theObject)) { + redisplay(theObject, isUpdateViewer); + } else { + AISObjectPtr anAIS; + + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); + bool isShading = false; + if (aPrs) { + anAIS = aPrs->getAISObject(AISObjectPtr()); + } else { + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult) { + std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); + if (aShapePtr) { + anAIS = AISObjectPtr(new GeomAPI_AISObject()); + anAIS->setImpl(new Handle(AIS_InteractiveObject)(new ModuleBase_ResultPrs(aResult))); + //anAIS->createShape(aShapePtr); + isShading = true; + } + } + } + if (anAIS) + display(theObject, anAIS, isShading, isUpdateViewer); } } -void XGUI_Displayer::display(FeaturePtr theFeature, - const TopoDS_Shape& theShape, bool isUpdateViewer) +void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, + bool isShading, bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; - Handle(AIS_Shape) anAIS = new AIS_Shape(theShape); - myFeature2AISObjectMap[theFeature] = anAIS; - - aContext->Display(anAIS, isUpdateViewer); -} - - -std::list XGUI_Displayer::getSelected(const int theShapeTypeToSkip) -{ - std::set aPrsFeatures; - std::list aPresentations; - - Handle(AIS_InteractiveContext) aContext = AISContext(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); - TopoDS_Shape aShape = aContext->SelectedShape(); - - if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) - continue; - - FeaturePtr aFeature = getFeature(anIO); - if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) - continue; - Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); - aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape, anOwner)); - aPrsFeatures.insert(aFeature); + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull()) { + myResult2AISObjectMap[theObject] = theAIS; + aContext->Display(anAISIO, false); + aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, isUpdateViewer); + if (aContext->HasOpenedContext()) { + if (myUseExternalObjects) { + if (myActiveSelectionModes.size() == 0) + aContext->Activate(anAISIO); + else { + foreach(int aMode, myActiveSelectionModes) { + aContext->Activate(anAISIO, aMode); + } + } + } + } } - return aPresentations; } -QFeatureList XGUI_Displayer::selectedFeatures() const +void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) { - QFeatureList aSelectedList; + if (!isVisible(theObject)) + return; Handle(AIS_InteractiveContext) aContext = AISContext(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); - FeaturePtr aFeature = getFeature(anIO); - if (aFeature) - aSelectedList.append(aFeature); + if (aContext.IsNull()) + return; + AISObjectPtr anObject = myResult2AISObjectMap[theObject]; + if (anObject) { + Handle(AIS_InteractiveObject) anAIS = anObject->impl(); + if (!anAIS.IsNull()) { + aContext->Remove(anAIS, isUpdateViewer); + } } - return aSelectedList; + myResult2AISObjectMap.remove(theObject); } - -std::list XGUI_Displayer::getHighlighted(const int theShapeTypeToSkip) +void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) { - std::set aPrsFeatures; - std::list aPresentations; + if (!isVisible(theObject)) + return; - Handle(AIS_InteractiveContext) aContext = AISContext(); - for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) { - Handle(AIS_InteractiveObject) anIO = aContext->DetectedInteractive(); - TopoDS_Shape aShape = aContext->DetectedShape(); - if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) - continue; + AISObjectPtr aAISObj = getAISObject(theObject); + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); - FeaturePtr aFeature = getFeature(anIO); - if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) - continue; - aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape, NULL)); - aPrsFeatures.insert(aFeature); + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); + if (aPrs) { + AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj); + if (!aAIS_Obj) { + erase(theObject, isUpdateViewer); + return; + } + if (aAIS_Obj != aAISObj) { + myResult2AISObjectMap[theObject] = aAIS_Obj; + } + aAISIO = aAIS_Obj->impl(); } - return aPresentations; + if (!aAISIO.IsNull()) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + aContext->Redisplay(aAISIO, isUpdateViewer); + } } -void XGUI_Displayer::erase(FeaturePtr theFeature, - const bool isUpdateViewer) +void XGUI_Displayer::deactivate(ObjectPtr theObject) { - FeaturePtr aFeature = XGUI_Tools::realFeature(theFeature); - - if (myFeature2AISObjectMap.find(aFeature) == myFeature2AISObjectMap.end()) - return; + if (isVisible(theObject)) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; - Handle(AIS_InteractiveContext) aContext = AISContext(); - Handle(AIS_InteractiveObject) anAIS = myFeature2AISObjectMap[aFeature]; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); - if (!anAISShape.IsNull()) - { - aContext->Erase(anAISShape, isUpdateViewer); + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + aContext->Deactivate(anAIS); } - myFeature2AISObjectMap.erase(aFeature); } +void XGUI_Displayer::activate(ObjectPtr theFeature) +{ + QIntList aModes; + activate(theFeature, aModes); +} -bool XGUI_Displayer::redisplay(FeaturePtr theFeature, - Handle(AIS_InteractiveObject) theAIS, - const int theSelectionMode, - const bool isUpdateViewer) +void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) { - bool isCreated = false; - 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/*allow shape decomposition*/); - // set mouse sensitivity - //aContext->SetSensitivityMode(StdSelect_SM_WINDOW); - //aContext->SetPixelTolerance(MOUSE_SENSITIVITY_IN_PIXEL); - } - // display or redisplay presentation - if (isVisible(theFeature) && !myFeature2AISObjectMap[theFeature].IsNull()) { - aContext->RecomputeSelectionOnly(theAIS); - } - else { - myFeature2AISObjectMap[theFeature] = theAIS; - if (theSelectionMode < 0) - { - aContext->Display(theAIS, false); - } - else - { - aContext->Display(theAIS, 0, theSelectionMode, false); + if (isVisible(theObject)) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (aContext->HasOpenedContext()) { + aContext->Load(anAIS, -1, true); } - isCreated = true; + if (theModes.size() > 0) { + foreach(int aMode, theModes) { + aContext->Activate(anAIS, aMode); + } + } else + aContext->Activate(anAIS); } - if (isUpdateViewer) - updateViewer(); - - return isCreated; } -void XGUI_Displayer::activateInLocalContext(FeaturePtr theFeature, - const std::list& theModes, const bool isUpdateViewer) +bool XGUI_Displayer::isActive(ObjectPtr theObject) const { 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/*allow shape decomposition*/); - } - // display or redisplay presentation - Handle(AIS_Shape) anAIS; - if (isVisible(theFeature)) - anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[theFeature]); - - // Activate selection of objects from prs - if (!anAIS.IsNull()) { - aContext->Load(anAIS, -1, true/*allow decomposition*/); - aContext->Deactivate(anAIS); - - 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) - updateViewer(); + 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 std::list& theFeatures, const bool isStop, +void XGUI_Displayer::stopSelection(const QObjectPtrList& theResults, const bool isStop, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; Handle(AIS_Shape) anAIS; - std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); - FeaturePtr aFeature; + QObjectPtrList::const_iterator anIt = theResults.begin(), aLast = theResults.end(); + ObjectPtr aFeature; for (; anIt != aLast; anIt++) { - aFeature = (*anIt).feature(); + aFeature = *anIt; if (isVisible(aFeature)) - anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[aFeature]); + anAIS = Handle(AIS_Shape)::DownCast( + myResult2AISObjectMap[aFeature]->impl()); if (anAIS.IsNull()) continue; if (isStop) { QColor aColor(Qt::white); - anAIS->SetColor(Quantity_Color(aColor.red()/255., aColor.green()/255., aColor.blue()/255., Quantity_TOC_RGB)); + anAIS->SetColor( + Quantity_Color(aColor.red() / 255., aColor.green() / 255., aColor.blue() / 255., + Quantity_TOC_RGB)); anAIS->Redisplay(); - } - else { + } else { QColor aColor(Qt::red); - anAIS->SetColor(Quantity_Color(aColor.red()/255., aColor.green()/255., aColor.blue()/255., Quantity_TOC_RGB)); + anAIS->SetColor( + Quantity_Color(aColor.red() / 255., aColor.green() / 255., aColor.blue() / 255., + Quantity_TOC_RGB)); anAIS->Redisplay(); } } @@ -240,137 +239,177 @@ void XGUI_Displayer::stopSelection(const std::list& theFeatures, updateViewer(); } -void XGUI_Displayer::setSelected(const std::list& theFeatures, const bool isUpdateViewer) +void XGUI_Displayer::setSelected(const QObjectPtrList& theResults, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); - - std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); - FeaturePtr aFeature; - - Handle(AIS_Shape) anAIS; // 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(false); - for (; anIt != aLast; anIt++) { - aFeature = (*anIt).feature(); - if (isVisible(aFeature)) - anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[aFeature]); - if (anAIS.IsNull()) - continue; - aContext->AddOrRemoveSelected(anAIS, false); + 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); + } } - if (isUpdateViewer) updateViewer(); } -void XGUI_Displayer::setSelected(const QFeatureList& theFeatures, const bool isUpdateViewer) +void XGUI_Displayer::clearSelected() { Handle(AIS_InteractiveContext) aContext = AISContext(); - aContext->ClearSelected(); - foreach(FeaturePtr aFeature, theFeatures) { - FeaturePtr aRFeature = XGUI_Tools::realFeature(aFeature); - if (myFeature2AISObjectMap.find(aRFeature) == myFeature2AISObjectMap.end()) - return; - - Handle(AIS_InteractiveObject) anAIS = myFeature2AISObjectMap[aRFeature]; - if (!anAIS.IsNull()) - aContext->AddOrRemoveSelected(anAIS, false); + if (aContext) { + aContext->UnhilightCurrents(false); + aContext->ClearSelected(); } - if (isUpdateViewer) - updateViewer(); } - -/*void XGUI_Displayer::EraseAll(const bool isUpdateViewer) +void XGUI_Displayer::eraseAll(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); + if (ic.IsNull()) + return; - AIS_ListOfInteractive aList; - ic->DisplayedObjects(aList); - AIS_ListIteratorOfListOfInteractive anIter(aList); - for (; anIter.More(); anIter.Next()) { - if ((anIter.Value()->DynamicType() == STANDARD_TYPE(AIS_Trihedron))) - continue; - - // erase an object - Handle(AIS_InteractiveObject) anIO = anIter.Value(); - ic->Erase(anIO, false); - } - myFeature2AISObjectMap.clear(); - if (isUpdateViewer) - updateViewer(); -}*/ - -void XGUI_Displayer::eraseDeletedFeatures(const bool isUpdateViewer) + foreach (AISObjectPtr aAISObj, myResult2AISObjectMap) { + // erase an object + Handle(AIS_InteractiveObject) anIO = aAISObj->impl(); + if (!anIO.IsNull()) + ic->Remove(anIO, false); + } + myResult2AISObjectMap.clear(); + if (isUpdateViewer) + updateViewer(); + } + +void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; - FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), - aFLast = myFeature2AISObjectMap.end(); - std::list aRemoved; - for (; aFIt != aFLast; aFIt++) - { - FeaturePtr aFeature = (*aFIt).first; + QObjectPtrList aRemoved; + foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) { if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { - Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; + AISObjectPtr anObj = myResult2AISObjectMap[aFeature]; + if (!anObj) + continue; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); if (!anAIS.IsNull()) { - aContext->Erase(anAIS, false); - aRemoved.push_back(aFeature); + aContext->Remove(anAIS, false); + aRemoved.append(aFeature); } } } - std::list::const_iterator anIt = aRemoved.begin(), - aLast = aRemoved.end(); - for (; anIt != aLast; anIt++) { - myFeature2AISObjectMap.erase(myFeature2AISObjectMap.find(*anIt)); + foreach(ObjectPtr aObj, aRemoved) { + myResult2AISObjectMap.remove(aObj); } if (isUpdateViewer) updateViewer(); } +void XGUI_Displayer::openLocalContext() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + // Open local context if there is no one + if (!aContext->HasOpenedContext()) { + // Preserve selected objects + //AIS_ListOfInteractive aAisList; + //for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) + // aAisList.Append(aContext->Current()); + + SelectMgr_ListOfFilter aFilters; + aFilters.Assign(aContext->Filters()); + + aContext->ClearCurrents(); + aContext->OpenLocalContext(); + aContext->NotUseDisplayedObjects(); + + myUseExternalObjects = false; + myActiveSelectionModes.clear(); + + SelectMgr_ListIteratorOfListOfFilter aIt(aFilters); + for (;aIt.More(); aIt.Next()) { + aContext->AddFilter(aIt.Value()); + } + // Restore selection + //AIS_ListIteratorOfListOfInteractive aIt(aAisList); + //for(; aIt.More(); aIt.Next()) { + // if (aContext->IsDisplayed(aIt.Value())) + // aContext->SetSelected(aIt.Value(), false); + //} + } +} + void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) { - closeAllContexts(true); + Handle(AIS_InteractiveContext) ic = AISContext(); + if ( (!ic.IsNull()) && (ic->HasOpenedContext()) ) { + // Preserve selected objects + //AIS_ListOfInteractive aAisList; + //for (ic->InitSelected(); ic->MoreSelected(); ic->NextSelected()) + // aAisList.Append(ic->SelectedInteractive()); + + ic->ClearSelected(); + ic->CloseAllContexts(false); + + // Redisplay all object if they were displayed in localContext + Handle(AIS_InteractiveObject) aAISIO; + foreach (AISObjectPtr aAIS, myResult2AISObjectMap) { + aAISIO = aAIS->impl(); + if (ic->DisplayStatus(aAISIO) != AIS_DS_Displayed) { + ic->Display(aAISIO, false); + ic->SetDisplayMode(aAISIO, Shading, false); + } + } + if (isUpdateViewer) + updateViewer(); + myUseExternalObjects = false; + myActiveSelectionModes.clear(); + + // Restore selection + //AIS_ListIteratorOfListOfInteractive aIt(aAisList); + //for(; aIt.More(); aIt.Next()) { + // if (ic->IsDisplayed(aIt.Value())) + // ic->SetCurrentObject(aIt.Value(), false); + //} + } } -Handle(AIS_InteractiveObject) XGUI_Displayer::getAISObject( - FeaturePtr theFeature) const +AISObjectPtr XGUI_Displayer::getAISObject(ObjectPtr theObject) const { - Handle(AIS_InteractiveObject) anIO; - if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) - anIO = (myFeature2AISObjectMap.find(theFeature))->second; + AISObjectPtr anIO; + if (myResult2AISObjectMap.contains(theObject)) + anIO = myResult2AISObjectMap[theObject]; return anIO; } -FeaturePtr XGUI_Displayer::getFeature(Handle(AIS_InteractiveObject) theIO) const +ObjectPtr XGUI_Displayer::getObject(const AISObjectPtr& theIO) const { - FeaturePtr aFeature; - FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), - aFLast = myFeature2AISObjectMap.end(); - for (; aFIt != aFLast && !aFeature; aFIt++) { - Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; - 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() @@ -380,7 +419,162 @@ void XGUI_Displayer::updateViewer() ic->UpdateCurrentViewer(); } -Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const -{ - return myWorkshop->viewer()->AISContext(); +Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const +{ + return myWorkshop->viewer()->AISContext(); +} + +void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull()) { + 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::eraseAIS(AISObjectPtr theAIS, const bool isUpdate) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull()) { + aContext->Remove(anAISIO, isUpdate); + } +} + +void XGUI_Displayer::activateObjectsOutOfContext(const QIntList& theModes) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + aContext->UseDisplayedObjects(); + myUseExternalObjects = true; + myActiveSelectionModes = theModes; + + //Deactivate trihedron which can be activated in local selector + AIS_ListOfInteractive aPrsList; + aContext->DisplayedObjects(aPrsList, true); + + Handle(AIS_Trihedron) aTrihedron; + AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); + for(; aLIt.More(); aLIt.Next()){ + aTrihedron = Handle(AIS_Trihedron)::DownCast(aLIt.Value()); + if (!aTrihedron.IsNull()) { + aContext->Deactivate(aTrihedron); + break; + } + } + + Handle(AIS_InteractiveObject) anAISIO; + foreach (AISObjectPtr aAIS, myResult2AISObjectMap) { + anAISIO = aAIS->impl(); + aContext->Load(anAISIO, -1, true); + if (theModes.size() == 0) + aContext->Activate(anAISIO); + else { + foreach(int aMode, theModes) { + aContext->Activate(anAISIO, aMode); + } + } + } +} + + +void XGUI_Displayer::deactivateObjectsOutOfContext() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + aContext->NotUseDisplayedObjects(); +} + + +void XGUI_Displayer::setDisplayMode(ObjectPtr theObject, DisplayMode theMode, bool toUpdate) +{ + if (theMode == NoMode) + return; + + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + AISObjectPtr aAISObj = getAISObject(theObject); + if (!aAISObj) + return; + + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); + aContext->SetDisplayMode(aAISIO, theMode, toUpdate); +} + +void XGUI_Displayer::setSelectionModes(const QIntList& theModes) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + if (!aContext->HasOpenedContext()) + return; + // Clear previous mode + const TColStd_ListOfInteger& aModes = aContext->ActivatedStandardModes(); + if (!aModes.IsEmpty()) { + TColStd_ListOfInteger aMModes; + aMModes.Assign(aModes); + TColStd_ListIteratorOfListOfInteger it(aMModes); + for(; it.More(); it.Next()) { + aContext->DeactivateStandardMode((TopAbs_ShapeEnum)it.Value()); + } + } + foreach(int aMode, theModes) { + aContext->ActivateStandardMode((TopAbs_ShapeEnum)aMode); + } +} + +XGUI_Displayer::DisplayMode XGUI_Displayer::displayMode(ObjectPtr theObject) const +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return NoMode; + + AISObjectPtr aAISObj = getAISObject(theObject); + if (!aAISObj) + return NoMode; + + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); + 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; + } + aContext->AddFilter(theFilter); +} + +void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + aContext->RemoveFilter(theFilter); }