Salome HOME
Issue #720:Set cursor at the same position at editing of text in spin box
[modules/shaper.git] / src / ModuleBase / ModuleBase_ViewerFilters.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        ModuleBase_ViewerFilters.cpp
4 // Created:     07 Okt 2014
5 // Author:      Vitaly SMETANNIKOV
6
7
8 #include "ModuleBase_ViewerFilters.h"
9 #include "ModuleBase_IWorkshop.h"
10 #include "ModuleBase_IModule.h"
11
12 #include <ModelAPI_Session.h>
13 #include <ModelAPI_Document.h>
14 #include <ModelAPI_ResultConstruction.h>
15
16 #include <AIS_InteractiveObject.hxx>
17 #include <AIS_Shape.hxx>
18
19 #include <StdSelect_BRepOwner.hxx>
20
21 #include <BRep_Tool.hxx>
22 #include <TopoDS.hxx>
23 #include <TopoDS_Edge.hxx>
24 #include <Geom_Curve.hxx>
25 #include <gp_Pln.hxx>
26
27 IMPLEMENT_STANDARD_HANDLE(ModuleBase_ShapeDocumentFilter, SelectMgr_Filter);
28 IMPLEMENT_STANDARD_RTTIEXT(ModuleBase_ShapeDocumentFilter, SelectMgr_Filter);
29
30
31 //TODO (VSV): Check bug in OCCT: Filter result is ignored (bug25340)
32 Standard_Boolean ModuleBase_ShapeDocumentFilter::IsOk(const Handle(SelectMgr_EntityOwner)& theOwner) const
33 {
34   ModuleBase_Operation* anOperation = myWorkshop->module()->currentOperation();
35   // the shapes from different documents should be provided if there is no started operation
36   // in order to show/hide results
37   if (!anOperation)
38     return true;
39
40   std::shared_ptr<GeomAPI_AISObject> aAISObj = AISObjectPtr(new GeomAPI_AISObject());
41   if (theOwner->HasSelectable()) {
42     Handle(AIS_InteractiveObject) aAisObj =
43                      Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
44     if (!aAisObj.IsNull()) {
45       aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj));
46     }
47   }
48   ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj);
49   if (aObj) {
50     DocumentPtr aDoc = aObj->document();
51     SessionPtr aMgr = ModelAPI_Session::get();
52     return (aDoc == aMgr->activeDocument() || aDoc == aMgr->moduleDocument());
53   }
54   else {
55     // This object is not controlled by the filter
56     return Standard_True;
57   }
58   return Standard_False;
59 }
60
61 IMPLEMENT_STANDARD_HANDLE(ModuleBase_ShapeInPlaneFilter, SelectMgr_Filter);
62 IMPLEMENT_STANDARD_RTTIEXT(ModuleBase_ShapeInPlaneFilter, SelectMgr_Filter);
63
64 Standard_Boolean ModuleBase_ShapeInPlaneFilter::IsOk(const Handle(SelectMgr_EntityOwner)& theOwner) const
65 {
66   if (!myPlane.get())
67     return Standard_True;
68
69   if (theOwner->HasSelectable()) {
70     Handle(StdSelect_BRepOwner) aShapeOwner = Handle(StdSelect_BRepOwner)::DownCast(theOwner);
71     if (!aShapeOwner.IsNull()) {
72       TopoDS_Shape aShape = aShapeOwner->Shape();
73       TopAbs_ShapeEnum aType = aShape.ShapeType();
74       gp_Pln aPlane = myPlane->impl<gp_Pln>();
75       switch (aType) {
76       case TopAbs_VERTEX:
77         {
78           gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape));
79           return aPlane.Distance(aPnt) < Precision::Confusion();
80         }
81       case TopAbs_EDGE:
82         {
83           TopoDS_Edge aEdge = TopoDS::Edge(aShape);
84           Standard_Real aFirst, aLast;
85           Handle(Geom_Curve) aCurve = BRep_Tool::Curve(aEdge, aFirst, aLast);
86           gp_Pnt aFirstPnt = aCurve->Value(aFirst);
87           gp_Pnt aMidPnt = aCurve->Value((aFirst + aLast) / 2.);
88           gp_Pnt aLastPnt = aCurve->Value(aLast);
89           bool aD1 = aPlane.Distance(aFirstPnt) < Precision::Confusion();
90           bool aD2 = aPlane.Distance(aMidPnt) < Precision::Confusion();
91           bool aD3 = aPlane.Distance(aLastPnt) < Precision::Confusion();
92           return aD1 && aD2 && aD3;
93         }
94       default:
95         // The object can be selected in Object browser and contain, for example, compound.
96         // The compound could not belong to any plane, so the result is false
97         return Standard_False;
98       break;
99       }
100     } else {
101       // This is not object controlled by the filter
102       return Standard_True;
103     }
104   }
105   return Standard_False;
106 }