X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_MacroCircle.cpp;h=2725d0be9fc9821c053a44173cf6b1afbb0ac09f;hb=refs%2Fheads%2FV9_11_BR;hp=2b6829c729a7f62aa6058e1698f71e9dd6e1ad25;hpb=5c59bf6725e7e4855b5ca956475d705e2d5b014c;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_MacroCircle.cpp b/src/SketchPlugin/SketchPlugin_MacroCircle.cpp index 2b6829c72..2725d0be9 100644 --- a/src/SketchPlugin/SketchPlugin_MacroCircle.cpp +++ b/src/SketchPlugin/SketchPlugin_MacroCircle.cpp @@ -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 @@ -12,10 +12,9 @@ // // 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 +// 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& theMessage) { @@ -126,7 +126,6 @@ std::string SketchPlugin_MacroCircle::processEvent( std::shared_ptr aReentrantMessage = std::dynamic_pointer_cast(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(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());