Salome HOME
updated copyright message
[modules/shaper.git] / src / XGUI / XGUI_Displayer.cpp
index 3f7d23326ef5544ae0d448665bd08a89e2c2c3bf..6ee3b9348ca6d06762f143a943fd7929d856ed6f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -36,7 +36,7 @@
 #include <ModelAPI_Tools.h>
 #include <ModelAPI_AttributeIntArray.h>
 #include <ModelAPI_ResultBody.h>
-#include <ModelAPI_ResultConstruction.h>
+#include <ModelAPI_ResultGroup.h>
 
 #include <ModuleBase_BRepOwner.h>
 #include <ModuleBase_IModule.h>
@@ -56,9 +56,7 @@
 #include <AIS_InteractiveContext.hxx>
 #include <AIS_ListOfInteractive.hxx>
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
-#include <AIS_DimensionSelectionMode.hxx>
 #include <AIS_Shape.hxx>
-#include <AIS_Dimension.hxx>
 #include <AIS_Trihedron.hxx>
 #ifdef BEFORE_TRIHEDRON_PATCH
 #include <AIS_Axis.hxx>
 #include <AIS_Selection.hxx>
 #include <Prs3d_Drawer.hxx>
 #include <Prs3d_IsoAspect.hxx>
+#include <PrsDim_Dimension.hxx>
 #include <SelectMgr_ListOfFilter.hxx>
 #include <SelectMgr_ListIteratorOfListOfFilter.hxx>
 #include <SelectMgr_SelectionManager.hxx>
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
+#include <BRepMesh_IncrementalMesh.hxx>
 
 #include <StdSelect_ViewerSelector3d.hxx>
 
 #include <TColStd_MapOfTransient.hxx>
 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
+#include <Standard_Version.hxx>
 
 #ifdef TINSPECTOR
 #include <inspector/VInspectorAPI_CallBack.hxx>
 
 #include <set>
 
+#ifdef _MSC_VER
+#pragma warning(disable: 4702)
+#endif
+
 /// defines the local context mouse selection sensitivity
 const int MOUSE_SENSITIVITY_IN_PIXEL = 10;
 
+/// defines the display priority for results brought to front
+constexpr int FRONT_DISPLAY_PRIORITY = 8; /* = Graphic3d_DisplayPriority_Highlight-1 */
+
+/// defines the default (normal) display priority for all results
+constexpr int DEFAULT_DISPLAY_PRIORITY = 5; /* = Graphic3d_DisplayPriority_Normal */
+
 //#define DEBUG_DISPLAY
 //#define DEBUG_FEATURE_REDISPLAY
 //#define DEBUG_SELECTION_FILTERS
@@ -124,9 +135,12 @@ QString qIntListInfo(const QIntList& theValues, const QString& theSeparator = QS
 
 //**************************************************************
 XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
-: myWorkshop(theWorkshop), myNeedUpdate(false),
-  myViewerBlockedRecursiveCount(0), myContextId(0)
+: myWorkshop(theWorkshop),
+  myViewerBlockedRecursiveCount(0),
+  myContextId(0),
+  myNeedUpdate(false)
 {
+  BRepMesh_IncrementalMesh::SetParallelDefault(Standard_True);
 }
 
 //**************************************************************
@@ -157,6 +171,8 @@ bool XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
         aScreen->setViewScale(getViewScale());
       }
       anAIS = aPrs->getAISObject(anAIS);
+      if (anAIS.get())
+        myWorkshop->module()->customizePresentation(theObject, anAIS);
     } else {
       anAIS = myWorkshop->module()->createPresentation(theObject);
       isShading = true;
@@ -205,7 +221,14 @@ bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
 
     int aDispMode = isShading? Shading : Wireframe;
     anAISIO->SetDisplayMode(aDispMode);
-    aContext->Display(anAISIO, aDispMode, 0, false, true, AIS_DS_Displayed);
+    aContext->Display(anAISIO, aDispMode, 0, false, AIS_DS_Displayed);
+    ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+    if (ModelAPI_Tools::isBringToFront(aResult)) {
+      // NOTE: do not use a priority higher than 8 as highlight uses priority 9!
+      //       Any higher level prevents the highlight from being visible as it would
+      //       appear "behind" the Groups.
+      aContext->SetDisplayPriority(anAISIO, FRONT_DISPLAY_PRIORITY);
+    }
     #ifdef TINSPECTOR
     if (getCallBack()) getCallBack()->Display(anAISIO);
     #endif
@@ -214,6 +237,7 @@ bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
     emit objectDisplayed(theObject, theAIS);
     selectionActivate()->activate(anAISIO, theUpdateViewer);
   }
+  myWorkshop->updateGroupsText();
   if (theUpdateViewer)
     updateViewer();
 
@@ -251,7 +275,7 @@ bool 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
-
+  myWorkshop->updateGroupsText();
   if (theUpdateViewer)
     updateViewer();
 
@@ -314,12 +338,24 @@ bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
       double aTransparency = ModelAPI_Tools::getTransparency(aResult);
       if ((aTransparency >= 0) && (aTransparency != aAISObj->getTransparency()))
         aAISObj->setTransparency(aTransparency);
+
+      // Set Iso-Lines
+      Handle(ModuleBase_ResultPrs) aResPrs = Handle(ModuleBase_ResultPrs)::DownCast(aAISIO);
+      if (!aResPrs.IsNull())
+        aResPrs->updateIsoLines();
+
+      // Only support the "Bring To Front" command for Groups (for now)
+      ResultGroupPtr aGroup = std::dynamic_pointer_cast<ModelAPI_ResultGroup>(aResult);
+      if (aGroup.get()) {
+        bool isInFront = ModelAPI_Tools::isBringToFront(aResult);
+        aContext->SetDisplayPriority(aAISIO, (isInFront ? FRONT_DISPLAY_PRIORITY : DEFAULT_DISPLAY_PRIORITY));
+      }
     }
-    myWorkshop->module()->storeSelection();
+    //myWorkshop->module()->storeSelection();
 
-#ifdef CLEAR_OUTDATED_SELECTION_BEFORE_REDISPLAY
-    myWorkshop->selector()->deselectPresentation(aAISIO);
-#endif
+//#ifdef CLEAR_OUTDATED_SELECTION_BEFORE_REDISPLAY
+    //myWorkshop->selector()->deselectPresentation(aAISIO);
+//#endif
 
     if (aContext->IsDisplayed(aAISIO))
       aContext->Redisplay(aAISIO, false);
@@ -331,12 +367,13 @@ bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
       #endif
 
       //if (aNeedToRestoreSelection)
-    myWorkshop->module()->restoreSelection();
+    //myWorkshop->module()->restoreSelection();
 
     aRedisplayed = true;
     #ifdef DEBUG_FEATURE_REDISPLAY
       qDebug("  Redisplay happens");
     #endif
+    myWorkshop->updateGroupsText();
     if (theUpdateViewer)
       updateViewer();
   }
@@ -518,6 +555,7 @@ bool XGUI_Displayer::eraseAll(const bool theUpdateViewer)
         aErased = true;
       }
     }
+    myWorkshop->updateGroupsText();
     if (theUpdateViewer)
       updateViewer();
   }
@@ -572,7 +610,8 @@ ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO)
     if (!theIO.IsNull()) {
       anAISObj->setImpl(new Handle(AIS_InteractiveObject)(theIO));
     }
-    anObject = myWorkshop->module()->findPresentedObject(anAISObj);
+    if (myWorkshop->module())
+      anObject = myWorkshop->module()->findPresentedObject(anAISObj);
   }
   return anObject;
 }
@@ -623,25 +662,13 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const
     myContextId = aContext.get();
     if (!myWorkshop->selectionActivate()->isTrihedronActive())
       selectionActivate()->deactivateTrihedron(true);
-    // Do not modify default drawer. The same is done in ModuleBase_ResultPrs
-    //aContext->DefaultDrawer()->VIsoAspect()->SetNumber(0);
-    //aContext->DefaultDrawer()->UIsoAspect()->SetNumber(0);
-
-    //Handle(AIS_Trihedron) aTrihedron = myWorkshop->viewer()->trihedron();
-    //aTrihedron->getHighlightPointAspect()->SetScale(2.0);
-    //aTrihedron->getHighlightPointAspect()->SetTypeOfMarker(Aspect_TOM_O_STAR);
 
     // Commented out according to discussion in bug #2825
     ModuleBase_IViewer::DefaultHighlightDrawer = aContext->HighlightStyle();
-    //Handle(Prs3d_Drawer) aSelStyle = aContext->SelectionStyle();
-    //double aDeflection =
-    //  QString(ModelAPI_ResultConstruction::DEFAULT_DEFLECTION().c_str()).toDouble();
-    //try {
-    //  aDeflection = Config_PropManager::real("Visualization", "construction_deflection");
-    //} catch (...) {}
-
-    //ModuleBase_IViewer::DefaultHighlightDrawer->SetDeviationCoefficient(aDeflection);
-    //aSelStyle->SetDeviationCoefficient(aDeflection);
+
+    Handle(AIS_Trihedron) aTrihedron = myWorkshop->viewer()->trihedron();
+    if (!aTrihedron.IsNull())
+      ModuleBase_Tools::setPointBallHighlighting(aTrihedron.get());
   }
   return aContext;
 }
@@ -696,7 +723,7 @@ bool XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSele
   Handle(AIS_InteractiveContext) aContext = AISContext();
   Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
   if (!aContext.IsNull() && !anAISIO.IsNull()) {
-    aContext->Display(anAISIO, theDisplayMode, 0, false/*update viewer*/, true, AIS_DS_Displayed);
+    aContext->Display(anAISIO, theDisplayMode, 0, false/*update viewer*/, AIS_DS_Displayed);
     #ifdef TINSPECTOR
     if (getCallBack()) getCallBack()->Display(anAISIO);
     #endif
@@ -899,39 +926,6 @@ bool XGUI_Displayer::canBeShaded(ObjectPtr theObject) const
   return ::canBeShaded(anAIS, myWorkshop->module());
 }
 
-//**************************************************************
-//bool XGUI_Displayer::customizeObject(ObjectPtr theObject)
-//{
-//  AISObjectPtr anAISObj = getAISObject(theObject);
-//  // correct the result's color it it has the attribute
-//  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
-//
-//  // Customization of presentation
-//  GeomCustomPrsPtr aCustomPrs;
-//  FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
-//  if (aFeature.get() != NULL) {
-//    GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast<GeomAPI_ICustomPrs>(aFeature);
-//    if (aCustPrs.get() != NULL)
-//      aCustomPrs = aCustPrs;
-//  }
-//  if (aCustomPrs.get() == NULL) {
-//    GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
-//    // we ignore presentable not customized objects
-//    if (aPrs.get() == NULL)
-//      aCustomPrs = myCustomPrs;
-//  }
-//  bool isCustomized = aCustomPrs.get() &&
-//                      aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs);
-//  isCustomized = myWorkshop->module()->afterCustomisePresentation(aResult, anAISObj, myCustomPrs)
-//                 || isCustomized;
-//
-//  // update presentation state if faces panel is active
-//  if (anAISObj.get() && myWorkshop->facesPanel())
-//    isCustomized = myWorkshop->facesPanel()->customizeObject(theObject, anAISObj) || isCustomized;
-//
-//  return isCustomized;
-//}
-
 //**************************************************************
 QColor XGUI_Displayer::setObjectColor(ObjectPtr theObject,
                                       const QColor& theColor,
@@ -944,6 +938,7 @@ QColor XGUI_Displayer::setObjectColor(ObjectPtr theObject,
   int aR, aG, aB;
   anAISObj->getColor(aR, aG, aB);
   anAISObj->setColor(theColor.red(), theColor.green(), theColor.blue());
+  myWorkshop->updateGroupsText();
   if (theUpdateViewer)
     updateViewer();
   return QColor(aR, aG, aB);
@@ -1025,9 +1020,9 @@ void XGUI_Displayer::getPresentations(const ObjectPtr& theObject,
     ModelAPI_Tools::allResults(aFeature, aResults);
     std::list<ResultPtr>::const_iterator anIt = aResults.begin(), aLast = aResults.end();
     for (; anIt != aLast; ++anIt) {
-      AISObjectPtr aAISObj = getAISObject(*anIt);
-      if (aAISObj.get() != NULL) {
-        Handle(AIS_InteractiveObject) anAIS = aAISObj->impl<Handle(AIS_InteractiveObject)>();
+      AISObjectPtr aCurAISObj = getAISObject(*anIt);
+      if (aCurAISObj.get() != NULL) {
+        Handle(AIS_InteractiveObject) anAIS = aCurAISObj->impl<Handle(AIS_InteractiveObject)>();
         if (!anAIS.IsNull() && !thePresentations.Contains(anAIS))
           thePresentations.Add(anAIS);
       }
@@ -1051,7 +1046,6 @@ void XGUI_Displayer::displayTrihedron(bool theToDisplay) const
                         0 /*wireframe*/,
                         -1 /* selection mode */,
                         Standard_True /* update viewer*/,
-                        Standard_False /* allow decomposition */,
                         AIS_DS_Displayed /* xdisplay status */);
     #ifdef TINSPECTOR
     if (getCallBack()) getCallBack()->Display(aTrihedron);
@@ -1091,7 +1085,7 @@ void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) th
   /// OCCT: to write about the problem that active owners method returns one owner several times
   QList<size_t> aSelectedIds; // Remember of selected address in order to avoid duplicates
   for (; anOwnersIt.More(); anOwnersIt.Next()) {
-    anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anOwnersIt.Value());
+    anOwner = anOwnersIt.Value();
     if (aSelectedIds.contains((size_t)anOwner.get()))
       continue;
     aSelectedIds.append((size_t)anOwner.get());
@@ -1099,6 +1093,14 @@ void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) th
     Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(anOwner);
     if (!BROwnr.IsNull() && BROwnr->HasShape()) {
       const TopoDS_Shape& aShape = BROwnr->Shape();
+
+      Handle(ModuleBase_ResultPrs) aResPrs =
+          Handle(ModuleBase_ResultPrs)::DownCast(BROwnr->Selectable());
+      TopoDS_Shape aRealShape;
+      if (!aResPrs.IsNull()) {
+        aRealShape = aResPrs->originalShape();
+      }
+
       if (aShape.IsNull())
         continue;
 
@@ -1115,7 +1117,15 @@ void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) th
           // isSame should be used here as it does not check orientation of shapes
           // despite on isEqual of shapes or IsBound for shape in QMap. Orientation is
           // different for Edges shapes in model shape and owner even if this is the same shape
-        if (ModuleBase_Tools::isSameShape(aParameterShape, aShape)) {
+        bool isSame = ModuleBase_Tools::isSameShape(aParameterShape, aShape);
+        if (!isSame) {
+          // In case of using HideFaces panel we can have instead of an original shape
+          // a compaund of faces which represent original shape with hidden faces.
+          // So, we have to compare the parameter with original shape
+          if (!aRealShape.IsNull())
+            isSame = ModuleBase_Tools::isSameShape(aParameterShape, aRealShape);
+        }
+        if (isSame) {
           Handle(AIS_InteractiveObject) anOwnerPresentation =
             Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
           NCollection_Map<Handle(AIS_InteractiveObject)> aPresentations =
@@ -1134,7 +1144,7 @@ void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) th
           Handle(AIS_Shape) anOwnerPresentation =
                             Handle(AIS_Shape)::DownCast(anOwner->Selectable());
           const TopoDS_Shape& aPresentationShape = anOwnerPresentation->Shape();
-          if (aParameterShape.IsSame(anOwnerPresentation->Shape()) &&
+          if (aParameterShape.IsSame(aPresentationShape) &&
               !aCompsolidPresentations.Contains(anOwnerPresentation))
             aCompsolidPresentations.Add(anOwnerPresentation);
         }
@@ -1163,11 +1173,7 @@ GeomPlanePtr XGUI_Displayer::getScreenPlane() const
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (!aContext.IsNull()) {
     Handle(V3d_Viewer) aViewer = aContext->CurrentViewer();
-    Handle(V3d_View) aView;
-    for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews()) {
-      aView = aViewer->ActiveView();
-      break;
-    }
+    Handle(V3d_View) aView = aViewer->ActiveViews().First();
     if (!aView.IsNull()) {
       double aEyeX, aEyeY, aEyeZ;
       aView->Eye(aEyeX, aEyeY, aEyeZ);
@@ -1189,11 +1195,7 @@ double XGUI_Displayer::getViewScale() const
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (!aContext.IsNull()) {
     Handle(V3d_Viewer) aViewer = aContext->CurrentViewer();
-    Handle(V3d_View) aView;
-    for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews()) {
-      aView = aViewer->ActiveView();
-      break;
-    }
+    Handle(V3d_View) aView = aViewer->ActiveViews().First();
     return aView->Camera()->Scale();
   }
   return 1;