Salome HOME
Issue #2879: "What is" does not work
[modules/shaper.git] / src / ModuleBase / ModuleBase_ViewerFilters.cpp
1 // Copyright (C) 2014-2019  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "ModuleBase_ViewerFilters.h"
21 #include "ModuleBase_IWorkshop.h"
22 #include "ModuleBase_IModule.h"
23
24 #include <ModelAPI_Session.h>
25 #include <ModelAPI_Document.h>
26 #include <ModelAPI_ResultConstruction.h>
27
28 #include <GeomAPI_Edge.h>
29
30 #include <AIS_InteractiveObject.hxx>
31 #include <AIS_Shape.hxx>
32 #ifdef BEFORE_TRIHEDRON_PATCH
33 #include <AIS_Axis.hxx>
34 #include <AIS_Point.hxx>
35 #include <AIS_Plane.hxx>
36 #else
37 #include <AIS_Trihedron.hxx>
38 #include <AIS_TrihedronOwner.hxx>
39 #include <Geom_Axis2Placement.hxx>
40 #endif
41 #include <Geom_Point.hxx>
42 #include <Geom_Line.hxx>
43 #include <Geom_Plane.hxx>
44
45 #include <StdSelect_BRepOwner.hxx>
46
47 #include <BRep_Tool.hxx>
48 #include <TopoDS.hxx>
49 #include <TopoDS_Edge.hxx>
50 #include <Geom_Curve.hxx>
51 #include <gp_Pln.hxx>
52
53 IMPLEMENT_STANDARD_RTTIEXT(ModuleBase_ShapeDocumentFilter, SelectMgr_Filter);
54
55
56 //TODO (VSV): Check bug in OCCT: Filter result is ignored (bug25340)
57 Standard_Boolean ModuleBase_ShapeDocumentFilter::IsOk(
58                                             const Handle(SelectMgr_EntityOwner)& theOwner) const
59 {
60   bool aValid = true;
61
62   ModuleBase_Operation* anOperation = myWorkshop->module()->currentOperation();
63   // the shapes from different documents should be provided if there is no started operation
64   // in order to show/hide results
65   if (anOperation) {
66     aValid = Standard_False;
67     std::shared_ptr<GeomAPI_AISObject> aAISObj = AISObjectPtr(new GeomAPI_AISObject());
68     if (theOwner->HasSelectable()) {
69       Handle(AIS_InteractiveObject) aAisObj =
70                        Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
71       if (!aAisObj.IsNull()) {
72         aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj));
73       }
74     }
75     ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj);
76     if (aObj) {
77       DocumentPtr aDoc = aObj->document();
78       SessionPtr aMgr = ModelAPI_Session::get();
79       aValid = (aDoc == aMgr->activeDocument() || aDoc == aMgr->moduleDocument());
80     }
81     else {
82       // This object is not controlled by the filter
83       aValid = Standard_True;
84     }
85   }
86
87 #ifdef DEBUG_FILTERS
88   qDebug(QString("ModuleBase_ShapeDocumentFilter::IsOk = %1").arg(aValid).toStdString().c_str());
89 #endif
90   return aValid;
91 }
92
93 IMPLEMENT_STANDARD_RTTIEXT(ModuleBase_ShapeInPlaneFilter, SelectMgr_Filter);
94
95 Standard_Boolean ModuleBase_ShapeInPlaneFilter::IsOk(
96                                         const Handle(SelectMgr_EntityOwner)& theOwner) const
97 {
98   bool aValid = true;
99
100   if (myPlane.get()) {
101     aValid = Standard_False;
102     // selectable may be empty if the object is selected in Object Browser and is not visualized
103     // in the viewer(virtual owner is created for this case)
104     //if (theOwner->HasSelectable())
105     {
106       gp_Pln aPlane = myPlane->impl<gp_Pln>();
107       Handle(StdSelect_BRepOwner) aShapeOwner = Handle(StdSelect_BRepOwner)::DownCast(theOwner);
108       if (!aShapeOwner.IsNull() && aShapeOwner->HasShape()) {
109         TopoDS_Shape aShape = aShapeOwner->Shape();
110         TopAbs_ShapeEnum aType = aShape.ShapeType();
111         switch (aType) {
112         case TopAbs_VERTEX:
113           {
114             gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape));
115             return aPlane.SquareDistance(aPnt) < Precision::SquareConfusion();
116           }
117         case TopAbs_EDGE:
118           {
119             std::shared_ptr<GeomAPI_Edge> anEdge(new GeomAPI_Edge);
120             anEdge->setImpl<TopoDS_Shape>(new TopoDS_Shape(aShape));
121             return anEdge->isInPlane(myPlane);
122           }
123         default:
124           // The object can be selected in Object browser and contain, for example, compound.
125           // The compound could not belong to any plane, so the result is false
126           aValid = Standard_False;
127         break;
128         }
129       } else {
130         if (theOwner->HasSelectable()) {
131           // Check Trihedron sub-objects
132           Handle(SelectMgr_SelectableObject) aSelObj = theOwner->Selectable();
133           Handle(Standard_Type) aType = aSelObj->DynamicType();
134           if (aType == STANDARD_TYPE(AIS_Trihedron)) {
135             Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aSelObj);
136             Handle(AIS_TrihedronOwner) aTrOwner = Handle(AIS_TrihedronOwner)::DownCast(theOwner);
137             if (!aTrOwner.IsNull()) {
138               const Prs3d_DatumParts& aPart = aTrOwner->DatumPart();
139               if (aPart >= Prs3d_DP_XAxis && aPart <= Prs3d_DP_ZAxis) {
140                 gp_Ax2 anAxis = aTrihedron->Component()->Ax2();
141                 gp_Dir aDir;
142                 switch (aPart) {
143                 case Prs3d_DP_XAxis:
144                   aDir = anAxis.XDirection();
145                   break;
146                 case Prs3d_DP_YAxis:
147                   aDir = anAxis.YDirection();
148                   break;
149                 case Prs3d_DP_ZAxis:
150                   aDir = anAxis.Direction();
151                   break;
152                 }
153                 gp_Lin aLine(aTrihedron->Component()->Location(), aDir);
154                 return aPlane.Contains(aLine, Precision::Confusion(), Precision::Angular());
155               }
156             }
157           }
158           // This is not object controlled by the filter
159           aValid = Standard_True;
160         }
161       }
162     }
163   }
164 #ifdef DEBUG_FILTERS
165   qDebug(QString("ModuleBase_ShapeDocumentFilter::IsOk = %1").arg(aValid).toStdString().c_str());
166 #endif
167   return aValid;
168 }