X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=3ee0ccdaaacabcc9d5bf91ccc46aa6680a4dfb5a;hb=b070f5d30325537aa8cf883a55f8d3315115c384;hp=cb2503f0486e7522f106b6eab129bbf0db0a0004;hpb=3a9418e989aabf61341c20e01628e43ca030c491;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index cb2503f04..3ee0ccdaa 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -46,6 +46,9 @@ #include #include +#include +#include + #include const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity @@ -108,8 +111,9 @@ 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)) { #ifdef DEBUG_COMPOSILID_DISPLAY ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(theObject); @@ -124,10 +128,9 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) } else #endif - redisplay(theObject, theUpdateViewer); + aDisplayed = redisplay(theObject, theUpdateViewer); } else { AISObjectPtr anAIS; - GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); bool isShading = false; if (aPrs.get() != NULL) { @@ -161,8 +164,9 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) } } if (anAIS) - display(theObject, anAIS, isShading, theUpdateViewer); + aDisplayed = display(theObject, anAIS, isShading, theUpdateViewer); } + return aDisplayed; } bool canBeShaded(Handle(AIS_InteractiveObject) theAIS) @@ -186,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()) { @@ -204,28 +210,40 @@ 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); @@ -236,12 +254,14 @@ void XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer) 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(); @@ -250,8 +270,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); @@ -259,14 +279,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 (!aAISIO.IsNull() && !aContext.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 @@ -292,6 +309,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 @@ -299,6 +317,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) @@ -326,6 +358,17 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject, const bool theUpdateViewer) } } +void XGUI_Displayer::deactivateObjects(const QObjectPtrList& theObjList, + const bool theUpdateViewer) +{ + QObjectPtrList::const_iterator anIt = theObjList.begin(), aLast = theObjList.end(); + for (; anIt != aLast; anIt++) { + deactivate(*anIt, false); + } + if (theUpdateViewer) + updateViewer(); +} + void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theModes) { if (!isVisible(theObject)) @@ -354,7 +397,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)); @@ -482,8 +525,9 @@ void XGUI_Displayer::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()) { @@ -493,6 +537,7 @@ void XGUI_Displayer::eraseAll(const bool theUpdateViewer) if (!anIO.IsNull()) { emit beforeObjectErase(aObj, aAISObj); aContext->Remove(anIO, false); + aErased = true; } } if (theUpdateViewer) @@ -503,6 +548,7 @@ void XGUI_Displayer::eraseAll(const bool theUpdateViewer) qDebug("eraseAll"); qDebug(getResult2AISObjectMapInfo().c_str()); #endif + return aErased; } void XGUI_Displayer::deactivateTrihedron() const @@ -576,15 +622,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); @@ -709,35 +758,46 @@ Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter() 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; + return aDisplayed; 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); + 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; + return aErased; Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); - if (!anAISIO.IsNull()) { + if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) { aContext->Remove(anAISIO, theUpdateViewer); + aErased = true; } + return aErased; } @@ -775,6 +835,24 @@ 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() && !aContext.IsNull()) { + bool aFound = false; + 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(); @@ -946,7 +1024,6 @@ bool XGUI_Displayer::customizeObject(ObjectPtr theObject) } bool isCustomized = aCustomPrs.get() && aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs); - myWorkshop->module()->customizeObject(theObject); return isCustomized; } @@ -989,6 +1066,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(); }