Salome HOME
Deactivate selection of trihedron functionality and take it into account in shape...
authorvsv <vitaly.smetannikov@opencascade.com>
Thu, 12 Nov 2015 15:08:50 +0000 (18:08 +0300)
committervsv <vitaly.smetannikov@opencascade.com>
Thu, 12 Nov 2015 15:08:50 +0000 (18:08 +0300)
src/ModuleBase/ModuleBase_ViewerFilters.cpp
src/XGUI/XGUI_Displayer.cpp

index a3d20fce7aeb15047c49690a8c2880b4c2420616..8ee95af0c03c8527e8b0081bc25bb9111ec29659 100644 (file)
 
 #include <AIS_InteractiveObject.hxx>
 #include <AIS_Shape.hxx>
+#include <AIS_Axis.hxx>
+#include <AIS_Point.hxx>
+#include <AIS_Plane.hxx>
+#include <Geom_Point.hxx>
+#include <Geom_Line.hxx>
+#include <Geom_Plane.hxx>
 
 #include <StdSelect_BRepOwner.hxx>
 
@@ -74,11 +80,11 @@ Standard_Boolean ModuleBase_ShapeInPlaneFilter::IsOk(const Handle(SelectMgr_Enti
   if (myPlane.get()) {
     aValid = Standard_False;
     if (theOwner->HasSelectable()) {
+      gp_Pln aPlane = myPlane->impl<gp_Pln>();
       Handle(StdSelect_BRepOwner) aShapeOwner = Handle(StdSelect_BRepOwner)::DownCast(theOwner);
       if (!aShapeOwner.IsNull() && aShapeOwner->HasShape()) {
         TopoDS_Shape aShape = aShapeOwner->Shape();
         TopAbs_ShapeEnum aType = aShape.ShapeType();
-        gp_Pln aPlane = myPlane->impl<gp_Pln>();
         switch (aType) {
         case TopAbs_VERTEX:
           {
@@ -105,6 +111,23 @@ Standard_Boolean ModuleBase_ShapeInPlaneFilter::IsOk(const Handle(SelectMgr_Enti
         break;
         }
       } else {
+        // Check Trihedron sub-objects
+        Handle(SelectMgr_SelectableObject) aSelObj = theOwner->Selectable();
+        Handle(Standard_Type) aType = aSelObj->DynamicType();
+        if (aType == STANDARD_TYPE(AIS_Axis)) {
+          Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(aSelObj);
+          gp_Lin aLine = aAxis->Component()->Lin();
+          return aPlane.Contains(aLine, Precision::Confusion(), Precision::Angular());
+
+        } else if (aType == STANDARD_TYPE(AIS_Point)) {
+          Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(aSelObj);
+          return aPlane.Distance(aPoint->Component()->Pnt()) < Precision::Confusion();
+
+        } else if (aType == STANDARD_TYPE(AIS_Plane)) {
+          Handle(AIS_Plane) aAisPlane = Handle(AIS_Plane)::DownCast(aSelObj);
+          gp_Pln aPln = aAisPlane->Component()->Pln();
+          return aPlane.Distance(aPln) < Precision::Confusion();
+        }
         // This is not object controlled by the filter
         aValid = Standard_True;
       }
index 6c13870775b94f1d70745c7bc223a09bd1f15834..5e27a844aa57b74752e591280874ab38477a941e 100644 (file)
@@ -471,7 +471,7 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL
   }
   if (!aTrihedron.IsNull()) {
     foreach(int aMode, myActiveSelectionModes)
-      aContext->SetSelectionSensitivity(aTrihedron, aMode, 15);
+      aContext->SetSelectionSensitivity(aTrihedron, aMode, 20);
   }
   // VSV It seems that there is no necessity to update viewer on activation
   //if (theUpdateViewer && isActivationChanged)
@@ -573,11 +573,24 @@ bool XGUI_Displayer::eraseAll(const bool theUpdateViewer)
   return aErased;
 }
 
+#define DEACTVATE_COMP(TheComp) \
+  if (!TheComp.IsNull()) \
+    aContext->Deactivate(TheComp);
+
 void XGUI_Displayer::deactivateTrihedron() const
 {
   Handle(AIS_InteractiveObject) aTrihedron = getTrihedron();
   if (!aTrihedron.IsNull()) {
-    deactivateAIS(aTrihedron);
+    Handle(AIS_Trihedron) aTrie = Handle(AIS_Trihedron)::DownCast(aTrihedron);
+    Handle(AIS_InteractiveContext) aContext = AISContext();
+    aContext->Deactivate(aTrie);
+    DEACTVATE_COMP(aTrie->XAxis());
+    DEACTVATE_COMP(aTrie->YAxis());
+    DEACTVATE_COMP(aTrie->Axis());
+    DEACTVATE_COMP(aTrie->Position());
+    DEACTVATE_COMP(aTrie->XYPlane());
+    DEACTVATE_COMP(aTrie->XZPlane());
+    DEACTVATE_COMP(aTrie->YZPlane());
   }
 }
 
@@ -1126,6 +1139,7 @@ std::string XGUI_Displayer::getResult2AISObjectMapInfo() const
 void XGUI_Displayer::activateTrihedron(bool theIsActive) 
 {  
   myIsTrihedronActive = theIsActive; 
-  if (!myIsTrihedronActive) 
+  if (!myIsTrihedronActive) {
     deactivateTrihedron();
+  }
 }