Salome HOME
Change icons for chamfer
[modules/shaper.git] / src / SketchPlugin / SketchPlugin_Projection.cpp
index e2095844a0def8cb81a0b8c0090d8aff1110e96e..0a1a1b96f1a5d1fe4baab9a5263991b28bbbe717 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 //
 // You should have received a copy of the GNU Lesser General Public
 // License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
 #include <SketchPlugin_Projection.h>
@@ -76,7 +75,7 @@ void SketchPlugin_Projection::execute()
   FeaturePtr aProjection = ModelAPI_Feature::feature(aRefAttr->object());
 
   if (!lastResult().get()) {
-    bool hasProjResult = aProjection->lastResult().get();
+    bool hasProjResult = aProjection->lastResult().get() != NULL;
     ResultConstructionPtr aConstr = document()->createConstruction(data());
     if (hasProjResult)
       aConstr->setShape(aProjection->lastResult()->shape());
@@ -169,6 +168,8 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID)
       aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape());
   }
 
+  keepCurrentFeature();
+
   if (aVertex) {
     std::shared_ptr<GeomAPI_Pnt> aPrjPnt = aSketchPlane->project(aVertex->point());
     std::shared_ptr<GeomAPI_Pnt2d> aPntInSketch = sketch()->to2D(aPrjPnt);
@@ -204,6 +205,10 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID)
     std::shared_ptr<GeomAPI_Circ> aCircle = anEdge->circle();
     double aRadius = aCircle->radius();
 
+    double aNormalsDot = aCircle->normal()->dot(aSketchPlane->direction());
+    if (fabs(fabs(aNormalsDot) - 1.0) > tolerance)
+      return; // circle is not in the plane, parallel to the sketch plane
+
     std::shared_ptr<GeomAPI_Pnt> aCenter = aSketchPlane->project(aCircle->center());
     std::shared_ptr<GeomAPI_Pnt2d> aCenterInSketch = sketch()->to2D(aCenter);
 
@@ -227,7 +232,11 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID)
     std::shared_ptr<GeomAPI_Pnt> aCenter = aSketchPlane->project(aCircle->center());
     std::shared_ptr<GeomAPI_Pnt2d> aCenterInSketch = sketch()->to2D(aCenter);
 
-    bool isInversed = aCircle->normal()->dot(aSketchPlane->direction()) < 0.;
+    double aNormalsDot = aCircle->normal()->dot(aSketchPlane->direction());
+    if (fabs(fabs(aNormalsDot) - 1.0) > tolerance)
+      return; // arc is not in the plane, parallel to the sketch plane
+
+    bool isInversed = aNormalsDot < 0.;
 
     if (!hasPrevProj)
       aProjection = sketch()->addFeature(SketchPlugin_Arc::ID());
@@ -249,7 +258,7 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID)
     aCenterPnt->setValue(aCenterInSketch);
     aProjection->boolean(SketchPlugin_Arc::REVERSED_ID())->setValue(isInversed);
 
-    aProjection->data()->blockSendAttributeUpdated(aWasBlocked, false);
+    aProjection->data()->blockSendAttributeUpdated(aWasBlocked);
   } else
     return;
 
@@ -257,6 +266,8 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID)
   aProjection->execute();
   aRefAttr->setObject(aProjection);
 
+  restoreCurrentFeature();
+
   if (theID == EXTERNAL_FEATURE_ID()) {
     selection(EXTERNAL_ID())->selectValue(aExtFeature);