]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/XGUI/XGUI_Displayer.cpp
Salome HOME
Delete key regression corrections: in previous implementation sketch entities did...
[modules/shaper.git] / src / XGUI / XGUI_Displayer.cpp
index a191509e5bd9723bcfd6ab7844f206a431f8a71f..29b8b997bcf4b7c79b12c09b234f05de24c26ac3 100644 (file)
 #include <AIS_Shape.hxx>
 #include <AIS_Dimension.hxx>
 #include <AIS_Trihedron.hxx>
+#include <AIS_Axis.hxx>
+#include <AIS_Plane.hxx>
+#include <AIS_Point.hxx>
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
 #include <SelectMgr_ListOfFilter.hxx>
 #include <SelectMgr_ListIteratorOfListOfFilter.hxx>
 #include <Prs3d_Drawer.hxx>
 #include <Prs3d_IsoAspect.hxx>
+#include <SelectMgr_SelectionManager.hxx>
 
 #include <StdSelect_ViewerSelector3d.hxx>
 
@@ -99,7 +103,8 @@ QString qIntListInfo(const QIntList& theValues, const QString& theSeparator = QS
 }
 
 XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
-  : myWorkshop(theWorkshop), myEnableUpdateViewer(true), myNeedUpdate(false)
+  : myWorkshop(theWorkshop), myEnableUpdateViewer(true), myNeedUpdate(false),
+  myIsTrihedronActive(false)
 {
   enableUpdateViewer(true);
   myCustomPrs = std::shared_ptr<GeomAPI_ICustomPrs>(new XGUI_CustomPrs());
@@ -221,7 +226,7 @@ bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
     if(anAISIO->Width() > 1) {
       for(int aModeIdx = 0; aModeIdx < myActiveSelectionModes.length(); ++aModeIdx) {
         int aMode = myActiveSelectionModes.value(aModeIdx);
-        double aPrecision = (aMode == getSelectionMode(TopAbs_VERTEX))? 15 : 
+        double aPrecision = (aMode == getSelectionMode(TopAbs_VERTEX))? 20 : 
                                                     (anAISIO->Width() + 2);
         aContext->SetSelectionSensitivity(anAISIO, aMode, aPrecision);
       }
@@ -364,9 +369,9 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject, const bool theUpdateViewer)
 void XGUI_Displayer::deactivateObjects(const QObjectPtrList& theObjList,
                                        const bool theUpdateViewer)
 {
-  //Handle(AIS_InteractiveObject) aTriehedron = getTrihedron();
-  //if (!aTriehedron.IsNull())
-  //  deactivateAIS(aTriehedron);
+  //Handle(AIS_InteractiveObject) aTrihedron = getTrihedron();
+  //if (!aTrihedron.IsNull())
+  //  deactivateAIS(aTrihedron);
 
   QObjectPtrList::const_iterator anIt = theObjList.begin(), aLast = theObjList.end();
   for (; anIt != aLast; anIt++) {
@@ -452,10 +457,12 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL
   //}
 
   // Add trihedron because it has to partisipate in selection
-  Handle(AIS_InteractiveObject) aTrihedron = getTrihedron();
-  if (!aTrihedron.IsNull())
-    aPrsList.Append(aTrihedron);
-
+  Handle(AIS_InteractiveObject) aTrihedron;
+  if (isTrihedronActive()) {
+    aTrihedron = getTrihedron();
+    if (!aTrihedron.IsNull() && aContext->IsDisplayed(aTrihedron))
+      aPrsList.Append(aTrihedron);
+  }
   if (aPrsList.Extent() == 0)
     return;
 
@@ -468,7 +475,7 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL
   }
   if (!aTrihedron.IsNull()) {
     foreach(int aMode, myActiveSelectionModes)
-      aContext->SetSelectionSensitivity(aTrihedron, aMode, 8);
+      aContext->SetSelectionSensitivity(aTrihedron, aMode, 20);
   }
   // VSV It seems that there is no necessity to update viewer on activation
   //if (theUpdateViewer && isActivationChanged)
@@ -494,8 +501,8 @@ void XGUI_Displayer::setSelected(const  QList<ModuleBase_ViewerPrs>& theValues,
   if (aContext.IsNull())
     return;
   if (aContext->HasOpenedContext()) {
-    aContext->UnhilightSelected();
-    aContext->ClearSelected();
+    aContext->UnhilightSelected(false);
+    aContext->ClearSelected(false);
     foreach (ModuleBase_ViewerPrs aPrs, theValues) {
       const TopoDS_Shape& aShape = aPrs.shape();
       if (!aShape.IsNull()) {
@@ -518,8 +525,8 @@ void XGUI_Displayer::setSelected(const  QList<ModuleBase_ViewerPrs>& theValues,
       }
     }
   } else {
-    aContext->UnhilightCurrents();
-    aContext->ClearCurrents();
+    aContext->UnhilightCurrents(false);
+    aContext->ClearCurrents(false);
     foreach (ModuleBase_ViewerPrs aPrs, theValues) {
       ObjectPtr anObject = aPrs.object();
       ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
@@ -570,30 +577,47 @@ bool XGUI_Displayer::eraseAll(const bool theUpdateViewer)
   return aErased;
 }
 
-void XGUI_Displayer::deactivateTrihedron() const
+void deactivateObject(Handle(AIS_InteractiveContext) theContext,
+                      Handle(AIS_InteractiveObject) theObject,
+                      const bool theClear = true)
 {
-  Handle(AIS_InteractiveObject) aTrihedron = getTrihedron();
-  if (!aTrihedron.IsNull()) {
-    Handle(AIS_InteractiveContext) aContext = AISContext();
-    aContext->Deactivate(aTrihedron);
+  if (!theObject.IsNull()) {
+    theContext->Deactivate(theObject);
+    //if (theClear) {
+      //theObject->ClearSelected();
+      //  theContext->LocalContext()->ClearOutdatedSelection(theObject, true);
+    //}
   }
 }
 
-Handle(AIS_InteractiveObject) XGUI_Displayer::getTrihedron() const
+void XGUI_Displayer::deactivateTrihedron(const bool theUpdateViewer) const
 {
+  Handle(AIS_InteractiveObject) aTrihedron = getTrihedron();
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  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()) {
-        return aTrihedron;
-      }
-    }
+  if (!aTrihedron.IsNull() && aContext->IsDisplayed(aTrihedron)) {
+    Handle(AIS_Trihedron) aTrie = Handle(AIS_Trihedron)::DownCast(aTrihedron);
+    deactivateObject(aContext, aTrie);
+
+    /// #1136 hidden axis are selected in sketch
+    /// workaround for Cascade: there is a crash in AIS_LocalContext::ClearOutdatedSelection
+    /// for Position AIS object in SelectionModes.
+    deactivateObject(aContext, aTrie->XAxis());
+    deactivateObject(aContext, aTrie->YAxis());
+    deactivateObject(aContext, aTrie->Axis());
+    deactivateObject(aContext, aTrie->Position());
+
+    deactivateObject(aContext, aTrie->XYPlane());
+    deactivateObject(aContext, aTrie->XZPlane());
+    deactivateObject(aContext, aTrie->YZPlane());
+
+    if (theUpdateViewer)
+      updateViewer();
   }
-  return Handle(AIS_InteractiveObject)();
+}
+
+Handle(AIS_InteractiveObject) XGUI_Displayer::getTrihedron() const
+{
+  return myWorkshop->viewer()->trihedron();
 }
 
 void XGUI_Displayer::openLocalContext()
@@ -778,7 +802,8 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
   if (!aContext.IsNull() && !aContext->HasOpenedContext()) {
     aContext->OpenLocalContext();
-    //deactivateTrihedron();
+    if (!isTrihedronActive())
+      deactivateTrihedron(true);
     aContext->DefaultDrawer()->VIsoAspect()->SetNumber(0);
     aContext->DefaultDrawer()->UIsoAspect()->SetNumber(0);
   }
@@ -1033,22 +1058,21 @@ bool XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO,
 
   // 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);
-  //if (aTrihedron.IsNull()) {
-      //aContext->Load(anAISIO, -1, true);
+  Handle(AIS_Trihedron) aTrihedron;
+  if (!isTrihedronActive())
+    aTrihedron = Handle(AIS_Trihedron)::DownCast(theIO);
+  if (aTrihedron.IsNull()) {
       // In order to clear active modes list
     if (theModes.size() == 0) {
-      //aContext->Load(anAISIO, 0, true);
       activateAIS(theIO, 0, theUpdateViewer);
     } else {
       foreach(int aMode, theModes) {
-        //aContext->Load(anAISIO, aMode, true);
         if (!aModesActivatedForIO.contains(aMode)) {
           activateAIS(theIO, aMode, theUpdateViewer);
           isActivationChanged = true;
         }
       }
-    //}
+    }
   }
   return isActivationChanged;
 }
@@ -1120,3 +1144,43 @@ std::string XGUI_Displayer::getResult2AISObjectMapInfo() const
   return QString("myResult2AISObjectMap: size = %1\n%2\n").arg(myResult2AISObjectMap.size()).
                                             arg(aContent.join("\n")).toStdString().c_str();
 }
+
+void XGUI_Displayer::activateTrihedron(bool theIsActive) 
+{  
+  myIsTrihedronActive = theIsActive; 
+  if (!myIsTrihedronActive) {
+    deactivateTrihedron(true);
+  }
+}
+
+void XGUI_Displayer::displayTrihedron(bool theToDisplay) const
+{
+  Handle(AIS_InteractiveContext) aContext = AISContext();
+  if (aContext.IsNull())
+    return;
+
+  Handle(AIS_Trihedron) aTrihedron = myWorkshop->viewer()->trihedron();
+
+  if (theToDisplay) {
+    if (!aContext->IsDisplayed(aTrihedron))
+      aContext->Display(aTrihedron,
+                        0 /*wireframe*/,
+                        -1 /* selection mode */,
+                        Standard_True /* update viewer*/,
+                        Standard_False /* allow decomposition */,
+                        AIS_DS_Displayed /* xdisplay status */);
+
+    if (!isTrihedronActive())
+      deactivateTrihedron(false);
+    else
+      activate(aTrihedron, myActiveSelectionModes, false);
+  } else {
+    deactivateTrihedron(false);
+    //aContext->LocalContext()->ClearOutdatedSelection(aTrihedron, true);
+    // the selection from the previous activation modes should be cleared manually (#26172)
+
+    aContext->Erase(aTrihedron);
+  }
+
+  updateViewer();
+}