Salome HOME
Implement OnPlane filter
authorvsv <vsv@opencascade.com>
Fri, 7 Jun 2019 09:52:42 +0000 (12:52 +0300)
committervsv <vsv@opencascade.com>
Fri, 7 Jun 2019 09:52:42 +0000 (12:52 +0300)
src/FiltersPlugin/FiltersPlugin_OnPlane.cpp

index f2771a8cfd5a56d20887ac46b404c29fc8194951..3bb1019a2b9972b877444424c6cb2ba69ec10a5f 100644 (file)
 #include "FiltersPlugin_OnPlane.h"
 
 #include <ModelAPI_AttributeSelectionList.h>
+#include <GeomAPI_Vertex.h>
+#include <GeomAPI_Pnt.h>
+#include <GeomAPI_Face.h>
+#include <GeomAPI_Pln.h>
+#include <GeomAPI_Edge.h>
+#include <GeomAPI_Curve.h>
+#include <GeomAPI_Circ.h>
+#include <GeomAPI_Dir.h>
+
+
+#define LIN_TOLERANCE 1.e-7
 
 bool FiltersPlugin_OnPlane::isSupported(GeomAPI_Shape::ShapeType theType) const
 {
@@ -34,6 +45,13 @@ bool FiltersPlugin_OnPlane::isSupported(GeomAPI_Shape::ShapeType theType) const
   return false;
 }
 
+GeomPlanePtr getPlane(AttributeSelectionPtr theAttr)
+{
+  GeomShapePtr aGeom = theAttr->value();
+  GeomFacePtr aFace(new GeomAPI_Face(aGeom));
+  return aFace->getPlane();
+}
+
 bool FiltersPlugin_OnPlane::isOk(const GeomShapePtr& theShape,
   const ModelAPI_FiltersArgs& theArgs) const
 {
@@ -42,7 +60,53 @@ bool FiltersPlugin_OnPlane::isOk(const GeomShapePtr& theShape,
     std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(aAttr);
   if (!aList.get())
     return false;
-  // ToDo
+  if (theShape->isVertex()) {
+    GeomVertexPtr aVertex(new GeomAPI_Vertex(theShape));
+    GeomPointPtr aPnt = aVertex->point();
+    for (int i = 0; i < aList->size(); i++) {
+      GeomPlanePtr aPlane = getPlane(aList->value(i));
+      if (aPlane->distance(aPnt) < LIN_TOLERANCE)
+        return true;
+    }
+  }
+  else if (theShape->isEdge()) {
+    GeomEdgePtr aEdge(new GeomAPI_Edge(theShape));
+    if (aEdge->isLine()) {
+      GeomPointPtr aPnt1 = aEdge->firstPoint();
+      GeomPointPtr aPnt2 = aEdge->lastPoint();
+      for (int i = 0; i < aList->size(); i++) {
+        GeomPlanePtr aPlane = getPlane(aList->value(i));
+        if ((aPlane->distance(aPnt1) < LIN_TOLERANCE) && (aPlane->distance(aPnt2) < LIN_TOLERANCE))
+          return true;
+      }
+    }
+    else if (aEdge->isCircle()) {
+      GeomCurvePtr aCurve(new GeomAPI_Curve(aEdge));
+      GeomCirclePtr aCircle(new GeomAPI_Circ(aCurve));
+      GeomDirPtr aDir = aCircle->normal();
+      GeomPointPtr aPnt = aCircle->center();
+      for (int i = 0; i < aList->size(); i++) {
+        GeomPlanePtr aPlane = getPlane(aList->value(i));
+        if ((aPlane->direction()->isParallel(aDir)) && (aPlane->distance(aPnt) < LIN_TOLERANCE))
+          return true;
+      }
+    }
+  }
+  else if (theShape->isFace()) {
+    GeomFacePtr aFace(new GeomAPI_Face(theShape));
+    if (aFace->isPlanar()) {
+      GeomPlanePtr aPln = aFace->getPlane();
+      for (int i = 0; i < aList->size(); i++) {
+        AttributeSelectionPtr aAttr = aList->value(i);
+        GeomShapePtr aGeom = aAttr->value();
+        if (!aGeom->isSame(theShape)) {
+          GeomPlanePtr aPlane = getPlane(aAttr);
+          if (aPlane->isCoincident(aPln))
+            return true;
+        }
+      }
+    }
+  }
   return false;
 }