]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Update of the intersection-points calculation due to the note #9 of the issue #2209.
authormpv <mpv@opencascade.com>
Tue, 24 Oct 2017 09:19:17 +0000 (12:19 +0300)
committermpv <mpv@opencascade.com>
Tue, 24 Oct 2017 09:19:17 +0000 (12:19 +0300)
src/ConstructionPlugin/ConstructionPlugin_Point.cpp
src/ConstructionPlugin/ConstructionPlugin_Point.h
src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp
src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h

index f08cd5fa42661a5d97b3d325f02e52af0fa71928..08ff70a3a7a2ed8a7f5cdba439c975df2f0fe4ef 100644 (file)
@@ -79,7 +79,7 @@ void ConstructionPlugin_Point::execute()
 {
   GeomShapePtr aShape;
 
-   // to support compatibility with old documents where aCreationMethod did not exist
+  // to support compatibility with old documents where aCreationMethod did not exist
   std::string aCreationMethod =
     string(CREATION_METHOD()).get() && !string(CREATION_METHOD())->value().empty() ?
     string(CREATION_METHOD())->value() : CREATION_METHOD_BY_XYZ();
@@ -92,7 +92,20 @@ void ConstructionPlugin_Point::execute()
   } else if(aCreationMethod == CREATION_METHOD_BY_LINES_INTERSECTION()) {
     aShape = createByLinesIntersection();
   }*/ else if(aCreationMethod == CREATION_METHOD_BY_LINE_AND_PLANE_INTERSECTION()) {
-    aShape = createByLineAndPlaneIntersection();
+    // this may produce several points
+    std::list<std::shared_ptr<GeomAPI_Vertex> > aPoints = createByLineAndPlaneIntersection();
+    if (!aPoints.empty()) { // if no points found produce the standard error later
+      int anIndex = 0;
+      std::list<std::shared_ptr<GeomAPI_Vertex> >::iterator aPIter = aPoints.begin();
+      for(; aPIter != aPoints.end(); aPIter++, anIndex++) {
+        std::shared_ptr<ModelAPI_ResultConstruction> aConstr =
+          document()->createConstruction(data(), anIndex);
+        aConstr->setShape(*aPIter);
+        setResult(aConstr, anIndex);
+      }
+      removeResults(anIndex);
+      return;
+    }
   }
 
   if(!aShape.get()) {
@@ -100,6 +113,7 @@ void ConstructionPlugin_Point::execute()
     return;
   }
 
+  removeResults(1); // for case the point type was switched from multi-results type
   std::shared_ptr<ModelAPI_ResultConstruction> aConstr = document()->createConstruction(data());
   aConstr->setShape(aShape);
   setResult(aConstr);
@@ -191,7 +205,8 @@ std::shared_ptr<GeomAPI_Vertex> ConstructionPlugin_Point::createByLinesIntersect
 */
 
 //==================================================================================================
-std::shared_ptr<GeomAPI_Vertex> ConstructionPlugin_Point::createByLineAndPlaneIntersection()
+std::list<std::shared_ptr<GeomAPI_Vertex> >
+  ConstructionPlugin_Point::createByLineAndPlaneIntersection()
 {
   // Get line.
   AttributeSelectionPtr aLineSelection = selection(INTERSECTION_LINE());
@@ -218,5 +233,6 @@ std::shared_ptr<GeomAPI_Vertex> ConstructionPlugin_Point::createByLineAndPlaneIn
     }
   }
 
-  return GeomAlgoAPI_ShapeTools::intersect(anEdge, aFace);
+  return GeomAlgoAPI_ShapeTools::intersect(anEdge, aFace,
+    aPlaneSelection->context()->groupName() == ModelAPI_ResultConstruction::group());
 }
index a9f59d31de4f1c92c91e9afe33f1ec29e4bfe7e4..f983ec3270015565d858b96836e67beecd008c14 100644 (file)
@@ -223,7 +223,7 @@ private:
   /*std::shared_ptr<GeomAPI_Vertex> createByDistanceOnEdge();
   std::shared_ptr<GeomAPI_Vertex> createByProjection();
   std::shared_ptr<GeomAPI_Vertex> createByLinesIntersection();*/
-  std::shared_ptr<GeomAPI_Vertex> createByLineAndPlaneIntersection();
+  std::list<std::shared_ptr<GeomAPI_Vertex> > createByLineAndPlaneIntersection();
 
 };
 
index 04ae892e351dcb00e8e2ede067e17185042ca8fe..503046f783de81ded48b8d216f902b64e05e6ecc 100644 (file)
@@ -54,7 +54,7 @@
 #include <GeomAPI_ProjectPointOnCurve.hxx>
 #include <GeomLib_IsPlanarSurface.hxx>
 #include <GeomLib_Tool.hxx>
-#include <GeomAPI_ExtremaCurveSurface.hxx>
+#include <GeomAPI_IntCS.hxx>
 #include <gp_Pln.hxx>
 #include <GProp_GProps.hxx>
 #include <IntAna_IntConicQuad.hxx>
@@ -750,11 +750,13 @@ bool GeomAlgoAPI_ShapeTools::isParallel(const std::shared_ptr<GeomAPI_Edge> theE
 }
 
 //==================================================================================================
-std::shared_ptr<GeomAPI_Vertex> GeomAlgoAPI_ShapeTools::intersect(
-  const std::shared_ptr<GeomAPI_Edge> theEdge, const std::shared_ptr<GeomAPI_Face> theFace)
+std::list<std::shared_ptr<GeomAPI_Vertex> > GeomAlgoAPI_ShapeTools::intersect(
+  const std::shared_ptr<GeomAPI_Edge> theEdge, const std::shared_ptr<GeomAPI_Face> theFace,
+  const bool thePointsOutsideFace)
 {
+  std::list<std::shared_ptr<GeomAPI_Vertex> > aResult;
   if(!theEdge.get() || !theFace.get()) {
-    return std::shared_ptr<GeomAPI_Vertex>();
+    return aResult;
   }
 
   TopoDS_Edge anEdge = TopoDS::Edge(theEdge->impl<TopoDS_Shape>());
@@ -764,33 +766,33 @@ std::shared_ptr<GeomAPI_Vertex> GeomAlgoAPI_ShapeTools::intersect(
   TopoDS_Face aFace  = TopoDS::Face(theFace->impl<TopoDS_Shape>());
   Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace);
 
-  GeomAPI_ExtremaCurveSurface anExt(aCurve, aSurf);
-  // searching for the best point-intersection
-  int aMaxLevel = 0;
-  gp_Pnt aResult;
-  for(int anIntNum = 1; anIntNum <= anExt.NbExtrema(); anIntNum++) {
-    if (anExt.Distance(anIntNum) > Precision::Confusion())
-      continue;
-    Standard_Real aW, aU, aV;
-    anExt.Parameters(anIntNum, aW, aU, aV);
-    gp_Pnt2d aPointOfSurf(aU, aV);
-    // level of the intersection: if it is inside of edge and/or face the level is higher
-    int aIntLevel = aW > aFirstOnCurve && aW < aLastOnCurve ? 2 : 1;
-    BRepClass_FaceClassifier aFClass(aFace, aPointOfSurf, Precision::Confusion());
-    if (aFClass.State() == TopAbs_IN) // "in" is better than "on"
-      aIntLevel += 2;
-    else if (aFClass.State() == TopAbs_ON)
-      aIntLevel += 1;
-    if (aMaxLevel < aIntLevel) {
-      aMaxLevel = anIntNum;
-      anExt.Points(anIntNum, aResult, aResult);
+  GeomAPI_IntCS anIntAlgo(aCurve, aSurf);
+  if (!anIntAlgo.IsDone())
+    return aResult;
+  // searching for points-intersection
+  for(int anIntNum = 1; anIntNum <= anIntAlgo.NbPoints() + anIntAlgo.NbSegments(); anIntNum++) {
+    gp_Pnt anInt;
+    if (anIntNum <= anIntAlgo.NbPoints()) {
+      anInt = anIntAlgo.Point(anIntNum);
+    } else { // take the middle point on the segment of the intersection
+      Handle(Geom_Curve) anIntCurve = anIntAlgo.Segment(anIntNum - anIntAlgo.NbPoints());
+      anIntCurve->D0((anIntCurve->FirstParameter() + anIntCurve->LastParameter()) / 2., anInt);
     }
+    if (!thePointsOutsideFace) {
+      Standard_Real aW, aU, aV;
+      anExt.Parameters(anIntNum, aW, aU, aV);
+      gp_Pnt2d aPointOfSurf(aU, aV);
+      BRepClass_FaceClassifier aFClass(aFace, aPointOfSurf, Precision::Confusion());
+      if (aFClass.State() == TopAbs_OUT)
+        continue; // outside points are filtered out if not needed
+    }
+    gp_Pnt anIntPnt;
+    anExt.Points(anIntNum, anIntPnt, anIntPnt);
+
+    aResult.push_back(std::shared_ptr<GeomAPI_Vertex>(
+      new GeomAPI_Vertex(anInt.X(), anInt.Y(), anInt.Z())));
   }
-  if (aMaxLevel > 0) { // intersection found
-    return std::shared_ptr<GeomAPI_Vertex>(
-      new GeomAPI_Vertex(aResult.X(), aResult.Y(), aResult.Z()));
-  }
-  return std::shared_ptr<GeomAPI_Vertex>(); // no intersection found
+  return aResult;
 }
 
 //==================================================================================================
index 168e076098a486fe4bc4384bd97425ea13cbd745..a7f051a8dfc1f22b7c0166dc770f88dbf38df036 100644 (file)
@@ -137,8 +137,9 @@ public:
   // Computes intersection point between the edge curve and a face surface (only one point, with
   // preferences to point that belongs to edge and face boundaries.
   /// \returns null if there is no intersection
-  GEOMALGOAPI_EXPORT static std::shared_ptr<GeomAPI_Vertex> intersect(
-    const std::shared_ptr<GeomAPI_Edge> theEdge, const std::shared_ptr<GeomAPI_Face> theFace);
+  GEOMALGOAPI_EXPORT static std::list<std::shared_ptr<GeomAPI_Vertex> > intersect(
+    const std::shared_ptr<GeomAPI_Edge> theEdge, const std::shared_ptr<GeomAPI_Face> theFace,
+    const bool thePointsOutsideFace);
 
   typedef std::map<std::shared_ptr<GeomAPI_Pnt>,
                    std::pair<std::list<std::shared_ptr<GeomDataAPI_Point2D> >,