X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=0ebba5866f740bcac44bf6e9adbf8788fe1bc970;hb=9ef2d81a8b97eee85d6506d95f2481fe7fae1e56;hp=819d12cc90c4e38a19d20271f8020809d7c962cd;hpb=8f56432d03ce0cbce36d2190c0afc83f3f781f72;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 819d12cc9..0ebba5866 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -33,8 +33,8 @@ 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() @@ -43,7 +43,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) @@ -53,14 +53,14 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) } else { AISObjectPtr anAIS; - GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); bool isShading = false; if (aPrs) { anAIS = aPrs->getAISObject(AISObjectPtr()); } else { - ResultPtr aResult = boost::dynamic_pointer_cast(theObject); + ResultPtr aResult = std::dynamic_pointer_cast(theObject); if (aResult) { - boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(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))); @@ -86,6 +86,17 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, 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); + } + } + } + } } } @@ -104,7 +115,7 @@ void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) aContext->Remove(anAIS, isUpdateViewer); } } - myResult2AISObjectMap.erase(theObject); + myResult2AISObjectMap.remove(theObject); } void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) @@ -115,7 +126,7 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) AISObjectPtr aAISObj = getAISObject(theObject); Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); - GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); if (aPrs) { AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj); if (!aAIS_Obj) { @@ -149,6 +160,12 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject) } } +void XGUI_Displayer::activate(ObjectPtr theFeature) +{ + QIntList aModes; + activate(theFeature, aModes); +} + void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) { if (isVisible(theObject)) { @@ -178,7 +195,7 @@ bool XGUI_Displayer::isActive(ObjectPtr theObject) const if (!isVisible(theObject)) return false; - AISObjectPtr anObj = myResult2AISObjectMap.at(theObject); + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); TColStd_ListOfInteger aModes; @@ -186,7 +203,7 @@ bool XGUI_Displayer::isActive(ObjectPtr theObject) const return aModes.Extent() > 0; } -void XGUI_Displayer::stopSelection(const QList& theResults, const bool isStop, +void XGUI_Displayer::stopSelection(const QObjectPtrList& theResults, const bool isStop, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); @@ -194,7 +211,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; @@ -222,7 +239,7 @@ 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 @@ -261,13 +278,11 @@ void XGUI_Displayer::eraseAll(const bool isUpdateViewer) if (ic.IsNull()) return; - ResultToAISMap::iterator aIt; - for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) { + foreach (AISObjectPtr aAISObj, myResult2AISObjectMap) { // erase an object - AISObjectPtr aAISObj = (*aIt).second; Handle(AIS_InteractiveObject) anIO = aAISObj->impl(); if (!anIO.IsNull()) - ic->Remove(anIO, false); + ic->Remove(anIO, false); } myResult2AISObjectMap.clear(); if (isUpdateViewer) @@ -280,25 +295,21 @@ void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) if (aContext.IsNull()) return; - ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast = - myResult2AISObjectMap.end(); - std::list aRemoved; - for (; aFIt != aFLast; aFIt++) { - ObjectPtr aFeature = (*aFIt).first; + QObjectPtrList aRemoved; + foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) { if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { - AISObjectPtr anObj = (*aFIt).second; + AISObjectPtr anObj = myResult2AISObjectMap[aFeature]; if (!anObj) continue; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); if (!anAIS.IsNull()) { aContext->Remove(anAIS, false); - aRemoved.push_back(aFeature); + aRemoved.append(aFeature); } } } - std::list::const_iterator anIt = aRemoved.begin(), aLast = aRemoved.end(); - for (; anIt != aLast; anIt++) { - myResult2AISObjectMap.erase(myResult2AISObjectMap.find(*anIt)); + foreach(ObjectPtr aObj, aRemoved) { + myResult2AISObjectMap.remove(aObj); } if (isUpdateViewer) @@ -312,24 +323,74 @@ 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()); + + 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) { - AISContext()->ClearSelected(false); - 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); + //} + } } AISObjectPtr XGUI_Displayer::getAISObject(ObjectPtr theObject) const { AISObjectPtr anIO; - if (myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end()) - anIO = (myResult2AISObjectMap.find(theObject))->second; + if (myResult2AISObjectMap.contains(theObject)) + anIO = myResult2AISObjectMap[theObject]; return anIO; } @@ -342,30 +403,15 @@ ObjectPtr XGUI_Displayer::getObject(const AISObjectPtr& theIO) const ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO) const { ObjectPtr aFeature; - ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast = - myResult2AISObjectMap.end(); - for (; aFIt != aFLast && !aFeature; aFIt++) { - AISObjectPtr anObj = (*aFIt).second; - if (!anObj) - continue; - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (anAIS != theIO) - continue; - aFeature = (*aFIt).first; + 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::closeAllContexts(const bool isUpdateViewer) -{ - Handle(AIS_InteractiveContext) ic = AISContext(); - if (!ic.IsNull()) { - ic->CloseAllContexts(false); - if (isUpdateViewer) - updateViewer(); - } -} - void XGUI_Displayer::updateViewer() { Handle(AIS_InteractiveContext) ic = AISContext(); @@ -378,15 +424,27 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const return myWorkshop->viewer()->AISContext(); } -void XGUI_Displayer::display(AISObjectPtr theAIS, bool isUpdate) +void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) { Handle(AIS_InteractiveContext) aContext = AISContext(); Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); - if (!anAISIO.IsNull()) + 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::erase(AISObjectPtr theAIS, const bool isUpdate) +void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool isUpdate) { Handle(AIS_InteractiveContext) aContext = AISContext(); Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); @@ -403,6 +461,8 @@ void XGUI_Displayer::activateObjectsOutOfContext(const QIntList& theModes) return; aContext->UseDisplayedObjects(); + myUseExternalObjects = true; + myActiveSelectionModes = theModes; //Deactivate trihedron which can be activated in local selector AIS_ListOfInteractive aPrsList; @@ -418,10 +478,9 @@ void XGUI_Displayer::activateObjectsOutOfContext(const QIntList& theModes) } } - ResultToAISMap::iterator aIt; Handle(AIS_InteractiveObject) anAISIO; - for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) { - anAISIO = (*aIt).second->impl(); + foreach (AISObjectPtr aAIS, myResult2AISObjectMap) { + anAISIO = aAIS->impl(); aContext->Load(anAISIO, -1, true); if (theModes.size() == 0) aContext->Activate(anAISIO);