X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=be4b2cee5cec3ddceb395fa7894554352f5375b2;hb=545fb9af2e7ff2640157173275c0bbacd94537d9;hp=83fa8010dd1dce83aedec88d74947ef59887dbd6;hpb=3574a5a3c5d5fd1105c92db5f5975ab2240344ce;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 83fa8010d..be4b2cee5 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -36,6 +37,8 @@ #include #include +#include + #include #include @@ -44,7 +47,7 @@ const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity //#define DEBUG_DISPLAY -//#define DEBUG_ACTIVATE +#define DEBUG_ACTIVATE //#define DEBUG_FEATURE_REDISPLAY //#define DEBUG_SELECTION_FILTERS //#define DEBUG_USE_CLEAR_OUTDATED_SELECTION @@ -93,14 +96,6 @@ 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); @@ -152,14 +147,10 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); if (!anAISIO.IsNull()) { - myResult2AISObjectMap[theObject] = theAIS; - bool aCanBeShaded = ::canBeShaded(anAISIO); + appendResultObject(theObject, theAIS); + // 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, false); if (isShading) @@ -170,13 +161,7 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, if (isCustomized) aContext->Redisplay(anAISIO, false); - if (aCanBeShaded) { - openLocalContext(); - activateObjects(myActiveSelectionModes); - myWorkshop->selector()->setSelectedOwners(aSelectedOwners, false); - } - else - activate(anAISIO, myActiveSelectionModes); + activate(anAISIO, myActiveSelectionModes); } if (isUpdateViewer) updateViewer(); @@ -217,7 +202,7 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) return; } if (aAIS_Obj != aAISObj) { - myResult2AISObjectMap[theObject] = aAIS_Obj; + appendResultObject(theObject, aAIS_Obj); } aAISIO = aAIS_Obj->impl(); } @@ -337,7 +322,7 @@ void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theMode } } -void XGUI_Displayer::activateObjects(const QIntList& theModes) +void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrList& theObjList) { #ifdef DEBUG_ACTIVATE qDebug(QString("activate all features: theModes: %2, myActiveSelectionModes: %3"). @@ -359,19 +344,38 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes) if (!aContext->HasOpenedContext()) return; + // we need to block the sort of the viewer selector during deactivate/activate because + // it takes a lot of time if there are a many objects are processed. It can be performed + // manualy after the activation is peformed + Handle(StdSelect_ViewerSelector3d) aSelector = aContext->LocalContext()->MainSelector(); + bool isUpdateSortPossible = !aSelector.IsNull() && aSelector->IsUpdateSortPossible(); + if (!aSelector.IsNull()) + aSelector->SetUpdateSortPossible(false); + //aContext->UseDisplayedObjects(); //myUseExternalObjects = true; + Handle(AIS_InteractiveObject) anAISIO; AIS_ListOfInteractive aPrsList; - ::displayedObjects(aContext, aPrsList); + if (theObjList.isEmpty()) + ::displayedObjects(aContext, aPrsList); + else { + foreach(ObjectPtr aObj, theObjList) { + if (myResult2AISObjectMap.contains(aObj)) + aPrsList.Append(myResult2AISObjectMap[aObj]->impl()); + } + } - 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); } + // restore the sorting flag and perform the sort of selection + if (!aSelector.IsNull()) { + aSelector->SetUpdateSortPossible(isUpdateSortPossible); + aSelector->UpdateSort(); + } } @@ -686,21 +690,10 @@ void XGUI_Displayer::setDisplayMode(ObjectPtr theObject, DisplayMode theMode, bo return; Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); - bool aCanBeShaded = ::canBeShaded(aAISIO); - // In order to avoid extra closing/opening context SelectMgr_IndexedMapOfOwner aSelectedOwners; - if (aCanBeShaded) { - myWorkshop->selector()->selection()->selectedOwners(aSelectedOwners); - closeLocalContexts(false); - } aContext->SetDisplayMode(aAISIO, theMode, false); // Redisplay in order to update new mode because it could be not computed before aContext->Redisplay(aAISIO, false); - if (aCanBeShaded) { - openLocalContext(); - activateObjects(myActiveSelectionModes); - myWorkshop->selector()->setSelectedOwners(aSelectedOwners, false); - } if (toUpdate) updateViewer(); } @@ -839,25 +832,26 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, if (aTColModes.IsEmpty()) aContext->Load(theIO, -1, true); + // trihedron AIS check should be after the AIS loading. + // If it is not loaded, it is steel selectable in the viewer. 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 + //aContext->Load(anAISIO, -1, true); + // In order to clear active modes list if (theModes.size() == 0) { //aContext->Load(anAISIO, 0, true); aContext->Activate(theIO); -#ifdef DEBUG_ACTIVATE + #ifdef DEBUG_ACTIVATE qDebug("activate in all modes"); -#endif + #endif } else { foreach(int aMode, theModes) { //aContext->Load(anAISIO, aMode, true); if (!aModesActivatedForIO.contains(aMode)) { aContext->Activate(theIO, aMode); -#ifdef DEBUG_ACTIVATE + #ifdef DEBUG_ACTIVATE qDebug(QString("activate: %1").arg(aMode).toStdString().c_str()); -#endif + #endif } } } @@ -902,3 +896,31 @@ QColor XGUI_Displayer::setObjectColor(ObjectPtr theObject, const QColor& theColo updateViewer(); return QColor(aR, aG, aB); } + +void XGUI_Displayer::appendResultObject(ObjectPtr theObject, AISObjectPtr theAIS) +{ + myResult2AISObjectMap[theObject] = theAIS; + +#ifdef DEBUG_DISPLAY + std::ostringstream aPtrStr; + aPtrStr << theObject.get(); + qDebug(QString("display object: %1").arg(aPtrStr.str().c_str()).toStdString().c_str()); + qDebug(getResult2AISObjectMapInfo().c_str()); +#endif +} + +std::string XGUI_Displayer::getResult2AISObjectMapInfo() const +{ + QStringList aContent; + foreach (ObjectPtr aObj, myResult2AISObjectMap.keys()) { + AISObjectPtr aAISObj = myResult2AISObjectMap[aObj]; + std::ostringstream aPtrStr; + aPtrStr << "aObj = " << aObj.get() << ":"; + aPtrStr << "anAIS = " << aAISObj.get() << ":"; + aPtrStr << "[" << ModuleBase_Tools::objectInfo(aObj).toStdString().c_str() << "]"; + + aContent.append(aPtrStr.str().c_str()); + } + return QString("myResult2AISObjectMap: size = %1\n%2").arg(myResult2AISObjectMap.size()). + arg(aContent.join("\n")).toStdString().c_str(); +}