Salome HOME
Porting on SALOME 7.6.0
[modules/shaper.git] / src / XGUI / XGUI_Displayer.cpp
index 83fa8010dd1dce83aedec88d74947ef59887dbd6..be4b2cee5cec3ddceb395fa7894554352f5375b2 100644 (file)
@@ -20,6 +20,7 @@
 #include <ModelAPI_AttributeIntArray.h>
 
 #include <ModuleBase_ResultPrs.h>
+#include <ModuleBase_Tools.h>
 
 #include <GeomAPI_Shape.h>
 #include <GeomAPI_IPresentable.h>
@@ -36,6 +37,8 @@
 #include <SelectMgr_ListOfFilter.hxx>
 #include <SelectMgr_ListIteratorOfListOfFilter.hxx>
 
+#include <StdSelect_ViewerSelector3d.hxx>
+
 #include <TColStd_MapOfTransient.hxx>
 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
 
@@ -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<GeomAPI_IPresentable>(theObject);
@@ -152,14 +147,10 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
 
   Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
   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<Handle(AIS_InteractiveObject)>();
   }
@@ -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_InteractiveObject)>());
+    }
+  }
 
-  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<Handle(AIS_InteractiveObject)>();
-  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();
+}