Salome HOME
updated copyright message
[modules/shaper.git] / src / PartSet / PartSet_Filters.cpp
index b7e5ccbb1e62e2d116921ed8220e201ff44e65af..18c92c3c0bf2418e1d47b4733781b1dbaa54f969 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
 
 #include <AIS_InteractiveObject.hxx>
 #include <AIS_Shape.hxx>
+#include <AIS_Trihedron.hxx>
+#include <AIS_ViewCube.hxx>
 #include <StdSelect_BRepOwner.hxx>
 
 
 IMPLEMENT_STANDARD_RTTIEXT(PartSet_GlobalFilter, ModuleBase_ShapeDocumentFilter);
 
+PartSet_GlobalFilter::PartSet_GlobalFilter(ModuleBase_IWorkshop* theWorkshop)
+  : ModuleBase_ShapeDocumentFilter(theWorkshop)
+{
+  addNonSelectableType(ModelAPI_ResultField::group().c_str());
+  addNonSelectableType(ModelAPI_ResultGroup::group().c_str());
+}
+
+
 Standard_Boolean PartSet_GlobalFilter::IsOk(const Handle(SelectMgr_EntityOwner)& theOwner) const
 {
   bool aValid = true;
+  std::shared_ptr<GeomAPI_AISObject> aAISObj = AISObjectPtr(new GeomAPI_AISObject());
+  Handle(AIS_InteractiveObject) aAisObj;
+  if (theOwner->HasSelectable()) {
+    aAisObj = Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
+    if (!aAisObj.IsNull()) {
+      aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj));
+    }
+  }
+  ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj);
   ModuleBase_Operation* anOperation = myWorkshop->module()->currentOperation();
+
+#ifdef HAVE_SALOME
+  if (!aObj.get()) {
+    // Workaround to enable View Cube and Trihedron selection
+    if (!aAisObj.IsNull()) {
+      if (aAisObj->IsKind(STANDARD_TYPE(AIS_Trihedron)) ||
+          aAisObj->IsKind(STANDARD_TYPE(AIS_ViewCube))) {
+        return true;
+      }
+    }
+
+    // Issue #3161: Do not use presentations for non-SHAPER objects
+    if (!anOperation)
+      return false;
+  }
+#endif
+
   // the shapes from different documents should be provided if there is no started operation
   // in order to show/hide results
   if (anOperation) {
     aValid = false;
     if (ModuleBase_ShapeDocumentFilter::IsOk(theOwner)) {
-      std::shared_ptr<GeomAPI_AISObject> aAISObj = AISObjectPtr(new GeomAPI_AISObject());
-      if (theOwner->HasSelectable()) {
-        Handle(AIS_InteractiveObject) aAisObj =
-          Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
-        if (!aAisObj.IsNull()) {
-          aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj));
-        }
-      }
-      ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj);
       if (aObj) {
         ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aObj);
         // result of parts belongs to PartSet document and can be selected only when PartSet
@@ -63,8 +90,7 @@ Standard_Boolean PartSet_GlobalFilter::IsOk(const Handle(SelectMgr_EntityOwner)&
           if (aResultGroupName == ModelAPI_ResultPart::group()) {
             SessionPtr aMgr = ModelAPI_Session::get();
             aValid = aMgr->activeDocument() == aMgr->moduleDocument();
-          } else if (aResultGroupName == ModelAPI_ResultGroup::group() ||
-                     aResultGroupName == ModelAPI_ResultField::group()) {
+          } else if (myNonSelectableTypes.contains(aResultGroupName.c_str())) {
             aValid = Standard_False;
           } else
             aValid = Standard_True;
@@ -73,7 +99,7 @@ Standard_Boolean PartSet_GlobalFilter::IsOk(const Handle(SelectMgr_EntityOwner)&
           // only and there can not be Group feature
           FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
           if (aFeature) {
-            aValid = aFeature->getKind() != "Group";
+            aValid = !myNonSelectableTypes.contains(aFeature->getKind().c_str());
           } else
             aValid = Standard_True;
         }
@@ -172,7 +198,9 @@ Standard_Boolean
   }
 
   FeaturePtr aFeature = aDocument->feature(aResult);
-  if(!aFeature.get() || aFeature->getKind() != "SketchCircle") {
+  if(!aFeature.get() ||
+    ((aFeature->getKind() != "SketchCircle") &&
+    (aFeature->getKind() != "SketchBSplinePeriodic"))) {
     return Standard_True;
   }