X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=7d4ae0012ba5db8b645726cedd4d3cc806ac92e1;hb=cd087e8e165c06c13e68aa8b1ecb162bfe630f34;hp=9ca390ecb243023847224d61da0b94d02839fea9;hpb=8d5a36c1da99b17a0a9f85954fe1a5419528ec79;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 9ca390ecb..7d4ae0012 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -1,21 +1,29 @@ +// 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 "XGUI_SelectionMgr.h" +#include "XGUI_Selection.h" +#include "XGUI_CustomPrs.h" + +#include #include #include #include #include +#include #include #include #include +#include #include #include @@ -28,13 +36,44 @@ #include #include +#include +#include + #include const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity +//#define DEBUG_DISPLAY +//#define DEBUG_ACTIVATE + +// Workaround for bug #25637 +void displayedObjects(const Handle(AIS_InteractiveContext)& theAIS, AIS_ListOfInteractive& theList) +{ + // Get from null point + theAIS->DisplayedObjects(theList, true); + if (theAIS->HasOpenedContext()) { + // get from local context + const Handle(AIS_LocalContext)& aLC = theAIS->LocalContext(); + TColStd_MapOfTransient aMap; + int NbDisp = aLC->DisplayedObjects(aMap); + TColStd_MapIteratorOfMapOfTransient aIt(aMap); + + Handle(AIS_InteractiveObject) curIO; + Handle(Standard_Transient) Tr; + for(; aIt.More(); aIt.Next()){ + Tr = aIt.Key(); + curIO = *((Handle(AIS_InteractiveObject)*) &Tr); + theList.Append(curIO); + } + } +} + + XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) - : myUseExternalObjects(false), myWorkshop(theWorkshop) + : myWorkshop(theWorkshop) { + enableUpdateViewer(true); + myCustomPrs = std::shared_ptr(new XGUI_CustomPrs()); } XGUI_Displayer::~XGUI_Displayer() @@ -51,17 +90,25 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) if (isVisible(theObject)) { redisplay(theObject, isUpdateViewer); } else { +#ifdef DEBUG_DISPLAY + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature.get() != NULL) { + qDebug(QString("display feature: %1, displayed: %2"). + arg(aFeature->data()->name().c_str()). + arg(displayedObjects().size()).toStdString().c_str()); + } +#endif AISObjectPtr anAIS; GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); bool isShading = false; - if (aPrs) { + if (aPrs.get() != NULL) { anAIS = aPrs->getAISObject(AISObjectPtr()); } else { ResultPtr aResult = std::dynamic_pointer_cast(theObject); - if (aResult) { + if (aResult.get() != NULL) { std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); - if (aShapePtr) { + if (aShapePtr.get() != NULL) { anAIS = AISObjectPtr(new GeomAPI_AISObject()); anAIS->setImpl(new Handle(AIS_InteractiveObject)(new ModuleBase_ResultPrs(aResult))); //anAIS->createShape(aShapePtr); @@ -74,6 +121,25 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) } } +bool canBeShaded(Handle(AIS_InteractiveObject) theAIS) +{ + Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(theAIS); + if (!aShapePrs.IsNull()) { + TopoDS_Shape aShape = aShapePrs->Shape(); + TopAbs_ShapeEnum aType = aShape.ShapeType(); + if ((aType == TopAbs_VERTEX) || (aType == TopAbs_EDGE) || (aType == TopAbs_WIRE)) + return false; + else { + // Check that the presentation is not a sketch + Handle(ModuleBase_ResultPrs) aPrs = Handle(ModuleBase_ResultPrs)::DownCast(theAIS); + if (!aPrs.IsNull()) + return !aPrs->isSketchMode(); + return true; + } + } + return false; +} + void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, bool isShading, bool isUpdateViewer) { @@ -84,20 +150,31 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); if (!anAISIO.IsNull()) { myResult2AISObjectMap[theObject] = theAIS; + bool aCanBeShaded = ::canBeShaded(anAISIO); + // In order to avoid extra closing/opening context + SelectMgr_IndexedMapOfOwner aSelectedOwners; + if (aCanBeShaded) { + myWorkshop->selector()->selection()->selectedOwners(aSelectedOwners); + closeLocalContexts(false); + } 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); - } - } - } + + aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, false); + + bool isCustomized = customizeObject(theObject); + if (isCustomized) + aContext->Redisplay(anAISIO, false); + + if (aCanBeShaded) { + openLocalContext(); + activateObjects(myActiveSelectionModes); + myWorkshop->selector()->setSelectedOwners(aSelectedOwners, false); } - } + else + activate(anAISIO, myActiveSelectionModes); + } + if (isUpdateViewer) + updateViewer(); } void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) @@ -143,7 +220,36 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; - aContext->Redisplay(aAISIO, isUpdateViewer); + // Check that the visualized shape is the same and the redisplay is not necessary + // Redisplay of AIS object leads to this object selection compute and the selection + // in the browser is lost + + // this check is not necessary anymore because the selection store/restore is realized + // before and after the values modification. + // Moreother, this check avoids customize and redisplay presentation if the presentable + // parameter is changed. + bool isEqualShapes = false; + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get() != NULL) { + Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aAISIO); + if (!aShapePrs.IsNull()) { + std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); + if (aShapePtr.get()) { + const TopoDS_Shape& aShape = aShapePrs->Shape(); + std::shared_ptr anAISShapePtr(new GeomAPI_Shape()); + anAISShapePtr->setImpl(new TopoDS_Shape(aShape)); + + isEqualShapes = aShapePtr->isEqual(anAISShapePtr); + } + } + } + // Customization of presentation + bool isCustomized = customizeObject(theObject); + if (!isEqualShapes || isCustomized) { + aContext->Redisplay(aAISIO, false); + if (isUpdateViewer) + updateViewer(); + } } } @@ -160,14 +266,29 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject) } } -void XGUI_Displayer::activate(ObjectPtr theFeature) +/*void XGUI_Displayer::activate(ObjectPtr theFeature) { - QIntList aModes; - activate(theFeature, aModes); + activate(theFeature, myActiveSelectionModes); } void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) { +#ifdef DEBUG_ACTIVATE + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + + if (aFeature.get() != NULL) { + QIntList aModes; + getModesOfActivation(theObject, aModes); + + + qDebug(QString("activate feature: %1, theModes: %2, myActiveSelectionModes: %3, getModesOf: %4"). + arg(aFeature->data()->name().c_str()). + arg(theModes.size()). + arg(myActiveSelectionModes.size()). + arg(aModes.size()).toStdString().c_str()); + } +#endif + if (isVisible(theObject)) { Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) @@ -175,15 +296,89 @@ void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) AISObjectPtr anObj = myResult2AISObjectMap[theObject]; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (aContext->HasOpenedContext()) { - aContext->Load(anAIS, -1, true); + + activate(anAIS, theModes); + } +}*/ + +void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theModes) +{ + if (!isVisible(theObject)) + return; + + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + AISObjectPtr aAISObj = getAISObject(theObject); + + if (aAISObj.get() != NULL) { + Handle(AIS_InteractiveObject) anAISIO = aAISObj->impl(); + TColStd_ListOfInteger aTColModes; + aContext->ActivatedModes(anAISIO, aTColModes); + TColStd_ListIteratorOfListOfInteger itr( aTColModes ); + for (; itr.More(); itr.Next() ) { + theModes.append(itr.Value()); } - if (theModes.size() > 0) { - foreach(int aMode, theModes) { - aContext->Activate(anAIS, aMode); - } - } else - aContext->Activate(anAIS); + } +} + +void XGUI_Displayer::activateObjects(const QIntList& theModes) +{ +#ifdef DEBUG_ACTIVATE + qDebug(QString("activate all features: theModes: %2, myActiveSelectionModes: %3"). + arg(theModes.size()). + arg(myActiveSelectionModes.size()). + toStdString().c_str()); +#endif + // In order to avoid doblications of selection modes + QIntList aNewModes; + foreach (int aMode, theModes) { + if (!aNewModes.contains(aMode)) + aNewModes.append(aMode); + } + myActiveSelectionModes = aNewModes; + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + //aContext->UseDisplayedObjects(); + //myUseExternalObjects = true; + + AIS_ListOfInteractive aPrsList; + ::displayedObjects(aContext, aPrsList); + + Handle(AIS_Trihedron) aTrihedron; + AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); + Handle(AIS_InteractiveObject) anAISIO; + for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ + anAISIO = aLIt.Value(); + activate(anAISIO, myActiveSelectionModes); + } +} + + +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; + ::displayedObjects(aContext, aPrsList); + + AIS_ListIteratorOfListOfInteractive aLIt; + //Handle(AIS_Trihedron) aTrihedron; + Handle(AIS_InteractiveObject) anAISIO; + for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ + anAISIO = aLIt.Value(); + aContext->Deactivate(anAISIO); } } @@ -203,59 +398,32 @@ bool XGUI_Displayer::isActive(ObjectPtr theObject) const return aModes.Extent() > 0; } -void XGUI_Displayer::stopSelection(const QObjectPtrList& theResults, const bool isStop, - const bool isUpdateViewer) +void XGUI_Displayer::setSelected(const QObjectPtrList& theResults, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; - - Handle(AIS_Shape) anAIS; - QObjectPtrList::const_iterator anIt = theResults.begin(), aLast = theResults.end(); - ObjectPtr aFeature; - for (; anIt != aLast; anIt++) { - aFeature = *anIt; - if (isVisible(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->Redisplay(); - } else { - QColor aColor(Qt::red); - anAIS->SetColor( - Quantity_Color(aColor.red() / 255., aColor.green() / 255., aColor.blue() / 255., - Quantity_TOC_RGB)); - anAIS->Redisplay(); + 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); + } } - } - if (isUpdateViewer) - updateViewer(); -} - -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 (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) @@ -274,51 +442,23 @@ void XGUI_Displayer::clearSelected() void XGUI_Displayer::eraseAll(const bool isUpdateViewer) { - Handle(AIS_InteractiveContext) ic = AISContext(); - if (ic.IsNull()) - return; - + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (!aContext.IsNull()) { foreach (AISObjectPtr aAISObj, myResult2AISObjectMap) { // erase an object 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; - - 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(); + myResult2AISObjectMap.clear(); } void XGUI_Displayer::openLocalContext() { - Handle(AIS_InteractiveContext) aContext = AISContext(); + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); if (aContext.IsNull()) return; // Open local context if there is no one @@ -328,60 +468,75 @@ void XGUI_Displayer::openLocalContext() //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->ClearCurrents(); aContext->OpenLocalContext(); - aContext->NotUseDisplayedObjects(); + //aContext->NotUseDisplayedObjects(); - myUseExternalObjects = false; - myActiveSelectionModes.clear(); + //myUseExternalObjects = false; 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); + //AIS_ListIteratorOfListOfInteractive aIt2(aAisList); + //for(; aIt2.More(); aIt2.Next()) { + // aContext->SetSelected(aIt2.Value(), false); //} } } void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) { - Handle(AIS_InteractiveContext) ic = AISContext(); - if ( (!ic.IsNull()) && (ic->HasOpenedContext()) ) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if ( (!aContext.IsNull()) && (aContext->HasOpenedContext()) ) { // Preserve selected objects //AIS_ListOfInteractive aAisList; - //for (ic->InitSelected(); ic->MoreSelected(); ic->NextSelected()) - // aAisList.Append(ic->SelectedInteractive()); + //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()); - ic->ClearSelected(); - ic->CloseAllContexts(false); + //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 (ic->DisplayStatus(aAISIO) != AIS_DS_Displayed) { - ic->Display(aAISIO, false); - ic->SetDisplayMode(aAISIO, Shading, false); + 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(); + //myUseExternalObjects = false; // Restore selection - //AIS_ListIteratorOfListOfInteractive aIt(aAisList); - //for(; aIt.More(); aIt.Next()) { - // if (ic->IsDisplayed(aIt.Value())) - // ic->SetCurrentObject(aIt.Value(), false); + //AIS_ListIteratorOfListOfInteractive aIt2(aAisList); + //for(; aIt2.More(); aIt2.Next()) { + // if (aContext->IsDisplayed(aIt2.Value())) + // aContext->SetCurrentObject(aIt2.Value(), false); //} } } @@ -412,26 +567,51 @@ ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO) return aFeature; } +bool XGUI_Displayer::enableUpdateViewer(const bool isEnabled) +{ + bool aWasEnabled = myEnableUpdateViewer; + + myEnableUpdateViewer = isEnabled; + + return aWasEnabled; +} + void XGUI_Displayer::updateViewer() { - Handle(AIS_InteractiveContext) ic = AISContext(); - if (!ic.IsNull()) - ic->UpdateCurrentViewer(); + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (!aContext.IsNull() && myEnableUpdateViewer) + 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; +} + +Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (myAndFilter.IsNull() && !aContext.IsNull()) { + myAndFilter = new SelectMgr_AndFilter(); + aContext->AddFilter(myAndFilter); + } + return myAndFilter; } void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); if (!anAISIO.IsNull()) { aContext->Display(anAISIO, isUpdate); if (aContext->HasOpenedContext()) { - if (myUseExternalObjects) { + //if (myUseExternalObjects) { if (myActiveSelectionModes.size() == 0) aContext->Activate(anAISIO); else { @@ -439,7 +619,7 @@ void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) aContext->Activate(anAISIO, aMode); } } - } + //} } } } @@ -447,62 +627,14 @@ void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool isUpdate) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; 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) { @@ -518,29 +650,21 @@ void XGUI_Displayer::setDisplayMode(ObjectPtr theObject, DisplayMode theMode, bo 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()); - } + bool aCanBeShaded = ::canBeShaded(aAISIO); + // In order to avoid extra closing/opening context + SelectMgr_IndexedMapOfOwner aSelectedOwners; + if (aCanBeShaded) { + myWorkshop->selector()->selection()->selectedOwners(aSelectedOwners); + closeLocalContexts(false); } - foreach(int aMode, theModes) { - aContext->ActivateStandardMode((TopAbs_ShapeEnum)aMode); + aContext->SetDisplayMode(aAISIO, theMode, false); + if (aCanBeShaded) { + openLocalContext(); + activateObjects(myActiveSelectionModes); + myWorkshop->selector()->setSelectedOwners(aSelectedOwners, false); } + if (toUpdate) + updateViewer(); } XGUI_Displayer::DisplayMode XGUI_Displayer::displayMode(ObjectPtr theObject) const @@ -568,7 +692,7 @@ void XGUI_Displayer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilte if (theFilter.Access() == aIt.Value().Access()) return; } - aContext->AddFilter(theFilter); + GetFilter()->Add(theFilter); } void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) @@ -576,7 +700,7 @@ void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFi Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; - aContext->RemoveFilter(theFilter); + GetFilter()->Remove(theFilter); } void XGUI_Displayer::removeFilters() @@ -584,5 +708,82 @@ void XGUI_Displayer::removeFilters() Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; - aContext->RemoveFilters(); + 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(); +} + +bool XGUI_Displayer::canBeShaded(ObjectPtr theObject) const +{ + if (!isVisible(theObject)) + return false; + + AISObjectPtr aAISObj = getAISObject(theObject); + if (aAISObj.get() == NULL) + return false; + + Handle(AIS_InteractiveObject) anAIS = aAISObj->impl(); + return ::canBeShaded(anAIS); +} + +void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, + const QIntList& theModes) const +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull() || theIO.IsNull()) + return; + + aContext->Load(theIO, -1, true); + aContext->Deactivate(theIO); + Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(theIO); + //Deactivate trihedron which can be activated in local selector + if (aTrihedron.IsNull()) { + //aContext->Load(anAISIO, -1, true); + // In order to clear active modes list + if (theModes.size() == 0) { + //aContext->Load(anAISIO, 0, true); + aContext->Activate(theIO); + } else { + foreach(int aMode, theModes) { + //aContext->Load(anAISIO, aMode, true); + aContext->Activate(theIO, aMode); + } + } + } +} + +bool XGUI_Displayer::customizeObject(ObjectPtr theObject) +{ + AISObjectPtr anAISObj = getAISObject(theObject); + // correct the result's color it it has the attribute + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + + // Customization of presentation + GeomCustomPrsPtr aCustomPrs; + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature.get() != NULL) { + GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast(aFeature); + if (aCustPrs.get() != NULL) + aCustomPrs = aCustPrs; + } + if (aCustomPrs.get() == NULL) { + // we ignore presentable not customized objects + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); + if (aPrs.get() != NULL) + return false; + aCustomPrs = myCustomPrs; + } + return aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs); }