Salome HOME
updated copyright message
[modules/shaper.git] / src / SketchPlugin / SketchPlugin_MacroCircle.cpp
index 2b6829c729a7f62aa6058e1698f71e9dd6e1ad25..2725d0be9fc9821c053a44173cf6b1afbb0ac09f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023  CEA, EDF
 //
 // 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_MacroCircle.h"
@@ -119,6 +118,7 @@ void SketchPlugin_MacroCircle::execute()
   Events_Loop::loop()->send(aMessage);
 }
 
+// LCOV_EXCL_START
 std::string SketchPlugin_MacroCircle::processEvent(
                                               const std::shared_ptr<Events_Message>& theMessage)
 {
@@ -126,7 +126,6 @@ std::string SketchPlugin_MacroCircle::processEvent(
   std::shared_ptr<SketchPlugin_MacroArcReentrantMessage> aReentrantMessage =
         std::dynamic_pointer_cast<SketchPlugin_MacroArcReentrantMessage>(theMessage);
   if (aReentrantMessage.get()) {
-    FeaturePtr aCreatedFeature = aReentrantMessage->createdFeature();
     std::string aCircleType = aReentrantMessage->typeOfCreation();
 
     string(CIRCLE_TYPE())->setValue(aCircleType);
@@ -168,13 +167,11 @@ std::string SketchPlugin_MacroCircle::processEvent(
           aRefAttr->setAttr(anAttribute);
         }
         else if (anObject.get()) {
-          // if presentation of previous reentrant macro arc is used, the object is invalid,
-          // we should use result of previous feature of the message(Arc)
-          if (!anObject->data()->isValid()) {
-            FeaturePtr aCreatedFeature = aReentrantMessage->createdFeature();
-            anObject = aCreatedFeature->lastResult();
-          }
-          aRefAttr->setObject(anObject);
+          // if attribute is NULL, only object is defined, it should be processed outside
+          // the feature because it might be an external feature, that will be
+          // removed/created again after restart operation
+          // #2468 - Crash when sketching circles successively on a repetition
+          aFilledAttributeName = CIRCLE_TYPE();
         }
       }
     }
@@ -182,15 +179,16 @@ std::string SketchPlugin_MacroCircle::processEvent(
   }
   return aFilledAttributeName;
 }
+// LCOV_EXCL_STOP
 
 void SketchPlugin_MacroCircle::constraintsForCircleByCenterAndPassed(FeaturePtr theCircleFeature)
 {
   // Create constraints.
-  SketchPlugin_Tools::createConstraint(
+  SketchPlugin_Tools::createCoincidenceOrTangency(
       this, CENTER_POINT_REF_ID(),
       theCircleFeature->attribute(SketchPlugin_Circle::CENTER_ID()),
       ObjectPtr(), false);
-  SketchPlugin_Tools::createConstraint(
+  SketchPlugin_Tools::createCoincidenceOrTangency(
       this, PASSED_POINT_REF_ID(), AttributePtr(),
       theCircleFeature->lastResult(), true);
 }
@@ -203,8 +201,10 @@ void SketchPlugin_MacroCircle::constraintsForCircleByThreePoints(FeaturePtr theC
 
   // Create constraints.
   ResultPtr aCircleResult = theCircleFeature->lastResult();
-  for (int i = 0; i < 3; ++i)
-    SketchPlugin_Tools::createConstraint(this, aPointRef[i], AttributePtr(), aCircleResult, true);
+  for (int i = 0; i < 3; ++i) {
+    SketchPlugin_Tools::createCoincidenceOrTangency(
+        this, aPointRef[i], AttributePtr(), aCircleResult, true);
+  }
 }
 
 FeaturePtr SketchPlugin_MacroCircle::createCircleFeature()
@@ -288,10 +288,10 @@ void SketchPlugin_MacroCircle::fillByThreePoints()
       aCircBuilder.addPassingPoint(aPassedPoint);
     else {
       aCircBuilder.addTangentCurve(aTangentCurve);
-      AttributePoint2DPtr aPassedPoint =
+      AttributePoint2DPtr aPassedPointAttr =
           std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aPassedAttr);
-      if (aPassedPoint)
-        aCircBuilder.setClosestPoint(aPassedPoint->pnt());
+      if (aPassedPointAttr)
+        aCircBuilder.setClosestPoint(aPassedPointAttr->pnt());
     }
   }
 
@@ -388,11 +388,14 @@ AISObjectPtr SketchPlugin_MacroCircle::getAISObject(AISObjectPtr thePrevious)
     anAIS.reset(new GeomAPI_AISObject());
   }
   anAIS->createShape(aCompound);
+
+  // Modify attributes
+  SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
+
   return anAIS;
 }
 
 void SketchPlugin_MacroCircle::attributeChanged(const std::string& theID) {
-  double aRadius = 0.0;
   // If circle type switched reset all attributes.
   if(theID == CIRCLE_TYPE()) {
     SketchPlugin_Tools::resetAttribute(this, CENTER_POINT_ID());