X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=c79aeafacef1eda8f17476e08c88047584c69a7c;hb=75708cdfd8653e625bfb7aee667a7bb31867f292;hp=68d6ae9dcbb8f72c6962d8f1c50a58356a0b6364;hpb=5a8963c52d15b9ad5abd1517ef968c8cbf5e5663;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 68d6ae9dc..c79aeafac 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -37,12 +38,17 @@ #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 @@ -56,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) { @@ -107,7 +114,20 @@ bool XGUI_Displayer::isVisible(ObjectPtr theObject) const void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) { 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 + redisplay(theObject, theUpdateViewer); } else { AISObjectPtr anAIS; @@ -118,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()); @@ -125,6 +158,9 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer) //anAIS->createShape(aShapePtr); isShading = true; } +#ifdef DEBUG_COMPOSILID_DISPLAY + } // close else +#endif } } if (anAIS) @@ -137,6 +173,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; @@ -194,6 +232,13 @@ void XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer) } } 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 } void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) @@ -237,7 +282,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()); } } } @@ -258,6 +304,19 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer) } } +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) { #ifdef DEBUG_DEACTIVATE @@ -283,6 +342,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)) @@ -311,7 +381,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)); @@ -456,6 +526,10 @@ void XGUI_Displayer::eraseAll(const bool theUpdateViewer) updateViewer(); } myResult2AISObjectMap.clear(); +#ifdef DEBUG_DISPLAY + qDebug("eraseAll"); + qDebug(getResult2AISObjectMapInfo().c_str()); +#endif } void XGUI_Displayer::deactivateTrihedron() const @@ -529,15 +603,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); @@ -646,6 +723,8 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const if ((!aContext.IsNull()) && (!aContext->HasOpenedContext())) { aContext->OpenLocalContext(); deactivateTrihedron(); + aContext->DefaultDrawer()->VIsoAspect()->SetNumber(0); + aContext->DefaultDrawer()->UIsoAspect()->SetNumber(0); } return aContext; } @@ -660,20 +739,25 @@ Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter() return myAndFilter; } -void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool theUpdateViewer) +void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSelectionModes, + bool theUpdateViewer) { 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); + aContext->Display(anAISIO, 0/*wireframe*/, 0, theUpdateViewer, true, AIS_DS_Displayed); + 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); + } } } } @@ -686,7 +770,7 @@ void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool theUpdateViewer) if (aContext.IsNull()) return; Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); - if (!anAISIO.IsNull()) { + if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) { aContext->Remove(anAISIO, theUpdateViewer); } } @@ -726,23 +810,31 @@ 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(); - 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); #ifdef DEBUG_SELECTION_FILTERS int aCount = GetFilter()->StoredFilters().Extent(); @@ -764,6 +856,28 @@ void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFi #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) aCompFilter = GetFilter(); + const SelectMgr_ListOfFilter& aStoredFilters = aCompFilter->StoredFilters(); + for (aIt.Initialize(aStoredFilters); aIt.More() && !aFilterFound; aIt.Next()) { + if (theFilter.Access() == aIt.Value().Access()) + aFilterFound = true; + } + return aFilterFound; +} + void XGUI_Displayer::removeFilters() { Handle(AIS_InteractiveContext) aContext = AISContext(); @@ -885,7 +999,6 @@ bool XGUI_Displayer::customizeObject(ObjectPtr theObject) } bool isCustomized = aCustomPrs.get() && aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs); - myWorkshop->module()->customizeObject(theObject); return isCustomized; } @@ -928,6 +1041,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(); }