X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=b41682090e2d05791671aa6a051422a0220738bd;hb=5b679606e1f5aa81b438efe5f00cead3bfa85859;hp=cae0e29e201ccf1a383d09e1e7d93f570b1c3396;hpb=90ae02f67bbf42f79ea2fc05404d455159cb53a7;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index cae0e29e2..b41682090 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -18,9 +18,11 @@ #include #include #include +#include #include #include +#include #include #include @@ -36,18 +38,21 @@ #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 -#define DEBUG_CRASH_RESTORE_SELECTION - //#define DEBUG_ACTIVATE_OBJECTS //#define DEBUG_DEACTIVATE //#define DEBUG_ACTIVATE_AIS @@ -57,6 +62,7 @@ const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse //#define DEBUG_FEATURE_REDISPLAY //#define DEBUG_SELECTION_FILTERS +//#define DEBUG_COMPOSILID_DISPLAY // Workaround for bug #25637 void displayedObjects(const Handle(AIS_InteractiveContext)& theAIS, AIS_ListOfInteractive& theList) { @@ -90,7 +96,7 @@ QString qIntListInfo(const QIntList& theValues, const QString& theSeparator = QS } XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) - : myWorkshop(theWorkshop) + : myWorkshop(theWorkshop), myEnableUpdateViewer(true) { enableUpdateViewer(true); myCustomPrs = std::shared_ptr(new XGUI_CustomPrs()); @@ -105,13 +111,26 @@ bool XGUI_Displayer::isVisible(ObjectPtr theObject) const return myResult2AISObjectMap.contains(theObject); } -void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) +bool XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) { + bool aDisplayed = false; if (isVisible(theObject)) { - redisplay(theObject, theUpdateViewer); +#ifdef DEBUG_COMPOSILID_DISPLAY + ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(theObject); + if (aCompsolidResult.get()) { + for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { + ResultPtr aSubResult = aCompsolidResult->subResult(i); + if (aSubResult.get()) + redisplay(aSubResult, false); + } + if (theUpdateViewer) + updateViewer(); + } + else +#endif + aDisplayed = redisplay(theObject, theUpdateViewer); } else { AISObjectPtr anAIS; - GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); bool isShading = false; if (aPrs.get() != NULL) { @@ -119,6 +138,19 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) } else { ResultPtr aResult = std::dynamic_pointer_cast(theObject); if (aResult.get() != NULL) { +#ifdef DEBUG_COMPOSILID_DISPLAY + ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(theObject); + if (aCompsolidResult.get()) { + for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { + ResultPtr aSubResult = aCompsolidResult->subResult(i); + if (aSubResult.get()) + display(aSubResult, false); + } + if (theUpdateViewer) + updateViewer(); + } + else { +#endif std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); if (aShapePtr.get() != NULL) { anAIS = AISObjectPtr(new GeomAPI_AISObject()); @@ -126,11 +158,15 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) //anAIS->createShape(aShapePtr); isShading = true; } +#ifdef DEBUG_COMPOSILID_DISPLAY + } // close else +#endif } } if (anAIS) - display(theObject, anAIS, isShading, theUpdateViewer); + aDisplayed = display(theObject, anAIS, isShading, theUpdateViewer); } + return aDisplayed; } bool canBeShaded(Handle(AIS_InteractiveObject) theAIS) @@ -138,6 +174,8 @@ bool canBeShaded(Handle(AIS_InteractiveObject) theAIS) Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(theAIS); if (!aShapePrs.IsNull()) { TopoDS_Shape aShape = aShapePrs->Shape(); + if (aShape.IsNull()) + return false; TopAbs_ShapeEnum aType = aShape.ShapeType(); if ((aType == TopAbs_VERTEX) || (aType == TopAbs_EDGE) || (aType == TopAbs_WIRE)) return false; @@ -152,12 +190,14 @@ bool canBeShaded(Handle(AIS_InteractiveObject) theAIS) return false; } -void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, +bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, bool isShading, bool theUpdateViewer) { + bool aDisplayed = false; + Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) - return; + return aDisplayed; Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); if (!anAISIO.IsNull()) { @@ -170,37 +210,59 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, anAISIO->Attributes()->SetFaceBoundaryDraw( Standard_True ); anAISIO->SetDisplayMode(aDispMode); aContext->Display(anAISIO, aDispMode, 0, false, true, AIS_DS_Displayed); + aDisplayed = true; emit objectDisplayed(theObject, theAIS); activate(anAISIO, myActiveSelectionModes, theUpdateViewer); - } + // the fix from VPA for more suitable selection of sketcher lines + if(anAISIO->Width() > 1) { + for(int aModeIdx = 0; aModeIdx < myActiveSelectionModes.length(); ++aModeIdx) { + aContext->SetSelectionSensitivity(anAISIO, + myActiveSelectionModes.value(aModeIdx), anAISIO->Width() + 2); + } + } + } if (theUpdateViewer) updateViewer(); + + return aDisplayed; } -void XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer) +bool XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer) { + bool aErased = false; if (!isVisible(theObject)) - return; + return aErased; Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) - return; + return aErased; + AISObjectPtr anObject = myResult2AISObjectMap[theObject]; if (anObject) { Handle(AIS_InteractiveObject) anAIS = anObject->impl(); if (!anAIS.IsNull()) { emit beforeObjectErase(theObject, anObject); aContext->Remove(anAIS, theUpdateViewer); + aErased = true; } } myResult2AISObjectMap.remove(theObject); + +#ifdef DEBUG_DISPLAY + std::ostringstream aPtrStr; + aPtrStr << theObject.get(); + qDebug(QString("erase object: %1").arg(aPtrStr.str().c_str()).toStdString().c_str()); + qDebug(getResult2AISObjectMapInfo().c_str()); +#endif + return aErased; } -void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) +bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) { + bool aRedisplayed = false; if (!isVisible(theObject)) - return; + return aRedisplayed; AISObjectPtr aAISObj = getAISObject(theObject); Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); @@ -209,8 +271,8 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) if (aPrs) { AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj); if (!aAIS_Obj) { - erase(theObject, theUpdateViewer); - return; + aRedisplayed = erase(theObject, theUpdateViewer); + return aRedisplayed; } if (aAIS_Obj != aAISObj) { appendResultObject(theObject, aAIS_Obj); @@ -218,14 +280,11 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) aAISIO = aAIS_Obj->impl(); } - if (!aAISIO.IsNull()) { - Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (!aContext.IsNull() && !aAISIO.IsNull()) { // 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 @@ -238,7 +297,8 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); if (aShapePtr.get()) { const TopoDS_Shape& aOldShape = aShapePrs->Shape(); - isEqualShapes = aOldShape.IsEqual(aShapePtr->impl()); + if (!aOldShape.IsNull()) + isEqualShapes = aOldShape.IsEqual(aShapePtr->impl()); } } } @@ -250,6 +310,7 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) #endif if (!isEqualShapes || isCustomized) { aContext->Redisplay(aAISIO, false); + aRedisplayed = true; #ifdef DEBUG_FEATURE_REDISPLAY qDebug(" Redisplay happens"); #endif @@ -257,6 +318,20 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) updateViewer(); } } + return aRedisplayed; +} + +void XGUI_Displayer::redisplayObjects() +{ + // redisplay objects visualized in the viewer + static Events_ID EVENT_DISP = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY); + static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); + QObjectPtrList aDisplayed = myWorkshop->displayer()->displayedObjects(); + QObjectPtrList::const_iterator anIt = aDisplayed.begin(), aLast = aDisplayed.end(); + for (; anIt != aLast; anIt++) { + aECreator->sendUpdated(*anIt, EVENT_DISP); + } + Events_Loop::loop()->flush(EVENT_DISP); } void XGUI_Displayer::deactivate(ObjectPtr theObject, const bool theUpdateViewer) @@ -268,11 +343,8 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject, const bool theUpdateViewer) arg(anInfoStr). toStdString().c_str()); #endif - if (isVisible(theObject)) { - Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; - + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (!aContext.IsNull() && isVisible(theObject)) { AISObjectPtr anObj = myResult2AISObjectMap[theObject]; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); @@ -284,13 +356,22 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject, const bool theUpdateViewer) } } -void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theModes) +void XGUI_Displayer::deactivateObjects(const QObjectPtrList& theObjList, + const bool theUpdateViewer) { - if (!isVisible(theObject)) - return; + QObjectPtrList::const_iterator anIt = theObjList.begin(), aLast = theObjList.end(); + for (; anIt != aLast; anIt++) { + deactivate(*anIt, false); + } + //VSV It seems that there is no necessity to update viewer on deactivation + //if (theUpdateViewer) + // updateViewer(); +} +void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theModes) +{ Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) + if (aContext.IsNull() || !isVisible(theObject)) return; AISObjectPtr aAISObj = getAISObject(theObject); @@ -312,7 +393,7 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL // Convert shape types to selection types QIntList aModes; foreach(int aType, theModes) { - if (aType > TopAbs_SHAPE) + if (aType >= TopAbs_SHAPE) aModes.append(aType); else aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum)aType)); @@ -340,10 +421,8 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL } myActiveSelectionModes = aNewModes; Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; // Open local context if there is no one - if (!aContext->HasOpenedContext()) + if (aContext.IsNull() || !aContext->HasOpenedContext()) return; //aContext->UseDisplayedObjects(); @@ -361,20 +440,21 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL } AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); + bool isActivationChanged = false; for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ anAISIO = aLIt.Value(); - activate(anAISIO, myActiveSelectionModes, false); + if (activate(anAISIO, myActiveSelectionModes, false)) + isActivationChanged = true; } - if (theUpdateViewer) - updateViewer(); + // VSV It seems that there is no necessity to update viewer on activation + //if (theUpdateViewer && isActivationChanged) + // updateViewer(); } bool XGUI_Displayer::isActive(ObjectPtr theObject) const { Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return false; - if (!isVisible(theObject)) + if (aContext.IsNull() || !isVisible(theObject)) return false; AISObjectPtr anObj = myResult2AISObjectMap[theObject]; @@ -395,10 +475,7 @@ void XGUI_Displayer::setSelected(const QList& theValues, foreach (ModuleBase_ViewerPrs aPrs, theValues) { const TopoDS_Shape& aShape = aPrs.shape(); if (!aShape.IsNull()) { -#ifdef DEBUG_CRASH_RESTORE_SELECTION -#else aContext->AddOrRemoveSelected(aShape, false); -#endif } else { ObjectPtr anObject = aPrs.object(); ResultPtr aResult = std::dynamic_pointer_cast(anObject); @@ -437,14 +514,15 @@ void XGUI_Displayer::setSelected(const QList& theValues, void XGUI_Displayer::clearSelected() { Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext) { + if (!aContext.IsNull()) { aContext->UnhilightCurrents(false); aContext->ClearSelected(); } } -void XGUI_Displayer::eraseAll(const bool theUpdateViewer) +bool XGUI_Displayer::eraseAll(const bool theUpdateViewer) { + bool aErased = false; Handle(AIS_InteractiveContext) aContext = AISContext(); if (!aContext.IsNull()) { foreach (ObjectPtr aObj, myResult2AISObjectMap.keys()) { @@ -454,25 +532,32 @@ void XGUI_Displayer::eraseAll(const bool theUpdateViewer) if (!anIO.IsNull()) { emit beforeObjectErase(aObj, aAISObj); aContext->Remove(anIO, false); + aErased = true; } } if (theUpdateViewer) updateViewer(); } myResult2AISObjectMap.clear(); +#ifdef DEBUG_DISPLAY + qDebug("eraseAll"); + qDebug(getResult2AISObjectMapInfo().c_str()); +#endif + return aErased; } void XGUI_Displayer::deactivateTrihedron() const { Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - - AIS_ListOfInteractive aList; - aContext->DisplayedObjects(aList, true); - AIS_ListIteratorOfListOfInteractive aIt; - for (aIt.Initialize(aList); aIt.More(); aIt.Next()) { - Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aIt.Value()); - if (!aTrihedron.IsNull()) { - aContext->Deactivate(aTrihedron); + if (!aContext.IsNull()) { + AIS_ListOfInteractive aList; + aContext->DisplayedObjects(aList, true); + AIS_ListIteratorOfListOfInteractive aIt; + for (aIt.Initialize(aList); aIt.More(); aIt.Next()) { + Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aIt.Value()); + if (!aTrihedron.IsNull()) { + aContext->Deactivate(aTrihedron); + } } } } @@ -480,10 +565,8 @@ void XGUI_Displayer::deactivateTrihedron() const void XGUI_Displayer::openLocalContext() { Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - if (aContext.IsNull()) - return; // Open local context if there is no one - if (!aContext->HasOpenedContext()) { + if (!aContext.IsNull() && !aContext->HasOpenedContext()) { // Preserve selected objects //AIS_ListOfInteractive aAisList; //for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) @@ -519,7 +602,7 @@ void XGUI_Displayer::openLocalContext() void XGUI_Displayer::closeLocalContexts(const bool theUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); - if ( (!aContext.IsNull()) && (aContext->HasOpenedContext()) ) { + if (!aContext.IsNull() && aContext->HasOpenedContext()) { // Preserve selected objects //AIS_ListOfInteractive aAisList; //for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) @@ -533,15 +616,18 @@ void XGUI_Displayer::closeLocalContexts(const bool theUpdateViewer) //aContext->ClearSelected(); aContext->CloseAllContexts(false); + // From the moment when the AIS_DS_Displayed flag is used in the Display of AIS object, + // this code is obsolete. It is temporaty commented and should be removed after + // the test campaign. // Redisplay all object if they were displayed in localContext - Handle(AIS_InteractiveObject) aAISIO; + /*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); @@ -579,14 +665,23 @@ ObjectPtr XGUI_Displayer::getObject(const AISObjectPtr& theIO) const ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO) const { - ObjectPtr aFeature; + ObjectPtr anObject; foreach (ObjectPtr anObj, myResult2AISObjectMap.keys()) { AISObjectPtr aAIS = myResult2AISObjectMap[anObj]; Handle(AIS_InteractiveObject) anAIS = aAIS->impl(); if (anAIS == theIO) - return anObj; + anObject = anObj; + if (anObject.get()) + break; } - return aFeature; + if (!anObject.get()) { + std::shared_ptr anAISObj = AISObjectPtr(new GeomAPI_AISObject()); + if (!theIO.IsNull()) { + anAISObj->setImpl(new Handle(AIS_InteractiveObject)(theIO)); + } + anObject = myWorkshop->module()->findPresentedObject(anAISObj); + } + return anObject; } bool XGUI_Displayer::enableUpdateViewer(const bool isEnabled) @@ -600,45 +695,54 @@ bool XGUI_Displayer::enableUpdateViewer(const bool isEnabled) void XGUI_Displayer::updateViewer() const { + static int ai = 0; Handle(AIS_InteractiveContext) aContext = AISContext(); - if (!aContext.IsNull() && myEnableUpdateViewer) + if (!aContext.IsNull() && myEnableUpdateViewer) { + myWorkshop->viewer()->Zfitall(); aContext->UpdateCurrentViewer(); + } } void XGUI_Displayer::activateAIS(const Handle(AIS_InteractiveObject)& theIO, const int theMode, const bool theUpdateViewer) const { Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - aContext->Activate(theIO, theMode, theUpdateViewer); + if (!aContext.IsNull()) { + aContext->Activate(theIO, theMode, theUpdateViewer); #ifdef DEBUG_ACTIVATE_AIS - ObjectPtr anObject = getObject(theIO); - anInfo.append(ModuleBase_Tools::objectInfo((*anIt))); - qDebug(QString("activateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str()); + ObjectPtr anObject = getObject(theIO); + anInfo.append(ModuleBase_Tools::objectInfo((*anIt))); + qDebug(QString("activateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str()); #endif + } } void XGUI_Displayer::deactivateAIS(const Handle(AIS_InteractiveObject)& theIO, const int theMode) const { Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - if (theMode == -1) - aContext->Deactivate(theIO); - else - aContext->Deactivate(theIO, theMode); + if (!aContext.IsNull()) { + if (theMode == -1) + aContext->Deactivate(theIO); + else + aContext->Deactivate(theIO, theMode); #ifdef DEBUG_DEACTIVATE_AIS - ObjectPtr anObject = getObject(theIO); - anInfo.append(ModuleBase_Tools::objectInfo((*anIt))); - qDebug(QString("deactivateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str()); + ObjectPtr anObject = getObject(theIO); + anInfo.append(ModuleBase_Tools::objectInfo((*anIt))); + qDebug(QString("deactivateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str()); #endif + } } Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const { Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - if ((!aContext.IsNull()) && (!aContext->HasOpenedContext())) { + if (!aContext.IsNull() && !aContext->HasOpenedContext()) { aContext->OpenLocalContext(); deactivateTrihedron(); + aContext->DefaultDrawer()->VIsoAspect()->SetNumber(0); + aContext->DefaultDrawer()->UIsoAspect()->SetNumber(0); } return aContext; } @@ -646,42 +750,51 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter() { Handle(AIS_InteractiveContext) aContext = AISContext(); - if (myAndFilter.IsNull() && !aContext.IsNull()) { + if (!aContext.IsNull() && myAndFilter.IsNull()) { myAndFilter = new SelectMgr_AndFilter(); aContext->AddFilter(myAndFilter); } return myAndFilter; } -void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool theUpdateViewer) +bool XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSelectionModes, + bool theUpdateViewer) { + bool aDisplayed = false; Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); - if (!anAISIO.IsNull()) { - aContext->Display(anAISIO, theUpdateViewer); - if (aContext->HasOpenedContext()) { - if (myActiveSelectionModes.size() == 0) - activateAIS(anAISIO, 0, theUpdateViewer); - else { - foreach(int aMode, myActiveSelectionModes) { - activateAIS(anAISIO, aMode, theUpdateViewer); + if (!aContext.IsNull() && !anAISIO.IsNull()) { + aContext->Display(anAISIO, 0/*wireframe*/, 0, theUpdateViewer, true, AIS_DS_Displayed); + aDisplayed = true; + aContext->Deactivate(anAISIO); + aContext->Load(anAISIO); + if (toActivateInSelectionModes) { + if (aContext->HasOpenedContext()) { + if (myActiveSelectionModes.size() == 0) + activateAIS(anAISIO, 0, theUpdateViewer); + else { + foreach(int aMode, myActiveSelectionModes) { + activateAIS(anAISIO, aMode, theUpdateViewer); + } } } } } + return aDisplayed; } -void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool theUpdateViewer) +bool XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool theUpdateViewer) { + bool aErased = false; Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; - Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); - if (!anAISIO.IsNull()) { - aContext->Remove(anAISIO, theUpdateViewer); + if (!aContext.IsNull()) { + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) { + aContext->Remove(anAISIO, theUpdateViewer); + aErased = true; + } } + return aErased; } @@ -719,28 +832,39 @@ XGUI_Displayer::DisplayMode XGUI_Displayer::displayMode(ObjectPtr theObject) con return (XGUI_Displayer::DisplayMode) aAISIO->DisplayMode(); } +void XGUI_Displayer::deactivateSelectionFilters() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (!myAndFilter.IsNull()) { + bool aFound = false; + if (!aContext.IsNull()) { + const SelectMgr_ListOfFilter& aFilters = aContext->Filters(); + SelectMgr_ListIteratorOfListOfFilter anIt(aFilters); + for (; anIt.More() && !aFound; anIt.Next()) { + Handle(SelectMgr_Filter) aFilter = anIt.Value(); + aFound = aFilter == myAndFilter; + } + if (aFound) + aContext->RemoveFilter(myAndFilter); + } + myAndFilter.Nullify(); + } +} + void XGUI_Displayer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) { Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) + if (aContext.IsNull() || hasSelectionFilter(theFilter)) return; - const SelectMgr_ListOfFilter& aFilters = aContext->Filters(); - SelectMgr_ListIteratorOfListOfFilter aIt(aFilters); - for (; aIt.More(); aIt.Next()) { - if (theFilter.Access() == aIt.Value().Access()) - return; - } - Handle(SelectMgr_CompositionFilter) aCompFilter = GetFilter(); - const SelectMgr_ListOfFilter& aStoredFilters = aCompFilter->StoredFilters(); - for (aIt.Initialize(aStoredFilters); aIt.More(); aIt.Next()) { - if (theFilter.Access() == aIt.Value().Access()) - return; - } - aCompFilter->Add(theFilter); + + Handle(SelectMgr_CompositionFilter) aCompositeFilter = GetFilter(); + if (!aCompositeFilter.IsNull()) { + aCompositeFilter->Add(theFilter); #ifdef DEBUG_SELECTION_FILTERS - int aCount = GetFilter()->StoredFilters().Extent(); - qDebug(QString("addSelectionFilter: filters.count() = %1").arg(aCount).toStdString().c_str()); + int aCount = aCompositeFilter->StoredFilters().Extent(); + qDebug(QString("addSelectionFilter: filters.count() = %1").arg(aCount).toStdString().c_str()); #endif + } } void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) @@ -748,13 +872,39 @@ void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFi Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; + Handle(SelectMgr_AndFilter) aCompositeFilter = GetFilter(); - if (aCompositeFilter->IsIn(theFilter)) + if (!aCompositeFilter.IsNull() && aCompositeFilter->IsIn(theFilter)) { aCompositeFilter->Remove(theFilter); #ifdef DEBUG_SELECTION_FILTERS - int aCount = GetFilter()->StoredFilters().Extent(); - qDebug(QString("removeSelectionFilter: filters.count() = %1").arg(aCount).toStdString().c_str()); + int aCount = aCompositeFilter->StoredFilters().Extent(); + qDebug(QString("removeSelectionFilter: filters.count() = %1").arg(aCount).toStdString().c_str()); #endif + } +} + +bool XGUI_Displayer::hasSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) +{ + bool aFilterFound = false; + + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return aFilterFound; + const SelectMgr_ListOfFilter& aFilters = aContext->Filters(); + SelectMgr_ListIteratorOfListOfFilter aIt(aFilters); + for (; aIt.More() && !aFilterFound; aIt.Next()) { + if (theFilter.Access() == aIt.Value().Access()) + aFilterFound = true; + } + Handle(SelectMgr_CompositionFilter) aCompositeFilter = GetFilter(); + if (!aCompositeFilter.IsNull()) { + const SelectMgr_ListOfFilter& aStoredFilters = aCompositeFilter->StoredFilters(); + for (aIt.Initialize(aStoredFilters); aIt.More() && !aFilterFound; aIt.Next()) { + if (theFilter.Access() == aIt.Value().Access()) + aFilterFound = true; + } + } + return aFilterFound; } void XGUI_Displayer::removeFilters() @@ -762,7 +912,10 @@ void XGUI_Displayer::removeFilters() Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull()) return; - GetFilter()->Clear(); + + Handle(SelectMgr_CompositionFilter) aCompositeFilter = GetFilter(); + if (!aCompositeFilter.IsNull()) + aCompositeFilter->Clear(); } void XGUI_Displayer::showOnly(const QObjectPtrList& theList) @@ -792,14 +945,15 @@ bool XGUI_Displayer::canBeShaded(ObjectPtr theObject) const return ::canBeShaded(anAIS); } -void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, +bool XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, const QIntList& theModes, const bool theUpdateViewer) const { Handle(AIS_InteractiveContext) aContext = AISContext(); if (aContext.IsNull() || theIO.IsNull()) - return; - + return false; + + bool isActivationChanged = false; // deactivate object in all modes, which are not in the list of activation // It seems that after the IO deactivation the selected state of the IO's owners // is modified in OCC(version: 6.8.0) and the selection of the object later is lost. @@ -826,9 +980,12 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, } if (isDeactivated) { // the selection from the previous activation modes should be cleared manually (#26172) + theIO->ClearSelected(); aContext->LocalContext()->ClearOutdatedSelection(theIO, true); - if (theUpdateViewer) - updateViewer(); + // For performance issues + //if (theUpdateViewer) + // updateViewer(); + isActivationChanged = true; } // loading the interactive object allowing the decomposition @@ -850,10 +1007,12 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, //aContext->Load(anAISIO, aMode, true); if (!aModesActivatedForIO.contains(aMode)) { activateAIS(theIO, aMode, theUpdateViewer); + isActivationChanged = true; } } } } + return isActivationChanged; } bool XGUI_Displayer::customizeObject(ObjectPtr theObject) @@ -871,13 +1030,14 @@ bool XGUI_Displayer::customizeObject(ObjectPtr theObject) 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; + // we ignore presentable not customized objects + if (aPrs.get() == NULL) + aCustomPrs = myCustomPrs; } - return aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs); + bool isCustomized = aCustomPrs.get() && + aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs); + return isCustomized; } @@ -919,6 +1079,6 @@ std::string XGUI_Displayer::getResult2AISObjectMapInfo() const aContent.append(aPtrStr.str().c_str()); } - return QString("myResult2AISObjectMap: size = %1\n%2").arg(myResult2AISObjectMap.size()). + return QString("myResult2AISObjectMap: size = %1\n%2\n").arg(myResult2AISObjectMap.size()). arg(aContent.join("\n")).toStdString().c_str(); }