X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_MacroArc.cpp;h=d3687c9a3d9924a3e91bb9cbe7f53a145b337db6;hb=06e7f5859095193fc7f498bd89a7d28009794f53;hp=642434753d88f4a5f09967b7875e5a5e800f4f62;hpb=7074394f8f08413d885f63be01df6bd5007b868c;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_MacroArc.cpp b/src/SketchPlugin/SketchPlugin_MacroArc.cpp index 642434753..d3687c9a3 100644 --- a/src/SketchPlugin/SketchPlugin_MacroArc.cpp +++ b/src/SketchPlugin/SketchPlugin_MacroArc.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,15 +12,15 @@ // // 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_MacroArc.h" #include "SketchPlugin_Arc.h" +#include "SketchPlugin_ConstraintPerpendicular.h" #include "SketchPlugin_ConstraintTangent.h" #include "SketchPlugin_Sketch.h" #include "SketchPlugin_Tools.h" @@ -154,6 +154,9 @@ void SketchPlugin_MacroArc::initAttributes() data()->addAttribute(TANGENT_POINT_ID(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(END_POINT_3_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(TRANSVERSAL_POINT_ID(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(END_POINT_4_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(REVERSED_ID(), ModelAPI_AttributeBoolean::typeId()); data()->addAttribute(RADIUS_ID(), ModelAPI_AttributeDouble::typeId()); @@ -196,6 +199,8 @@ void SketchPlugin_MacroArc::attributeChanged(const std::string& theID) SketchPlugin_Tools::resetAttribute(this, PASSED_POINT_REF_ID()); SketchPlugin_Tools::resetAttribute(this, TANGENT_POINT_ID()); SketchPlugin_Tools::resetAttribute(this, END_POINT_3_ID()); + SketchPlugin_Tools::resetAttribute(this, TRANSVERSAL_POINT_ID()); + SketchPlugin_Tools::resetAttribute(this, END_POINT_4_ID()); SketchPlugin_Tools::resetAttribute(this, REVERSED_ID()); SketchPlugin_Tools::resetAttribute(this, RADIUS_ID()); SketchPlugin_Tools::resetAttribute(this, ANGLE_ID()); @@ -210,7 +215,9 @@ void SketchPlugin_MacroArc::attributeChanged(const std::string& theID) else if(anArcType == ARC_TYPE_BY_THREE_POINTS()) fillByThreePassedPoints(); else if(anArcType == ARC_TYPE_BY_TANGENT_EDGE()) - fillByTangentEdge(); + fillByEdge(false); + else if (anArcType == ARC_TYPE_BY_TRANSVERSAL_LINE()) + fillByEdge(true); double aRadius = 0; double anAngle = 0; @@ -274,22 +281,16 @@ GeomShapePtr SketchPlugin_MacroArc::getArcShape(bool isBound) AISObjectPtr SketchPlugin_MacroArc::getAISObject(AISObjectPtr thePrevious) { - if(!myStart.get() || !myEnd.get() || !myCenter.get()) { + GeomShapePtr anArcShape = getArcShape(); + if(!anArcShape.get()) return AISObjectPtr(); - } SketchPlugin_Sketch* aSketch = sketch(); - if(!aSketch) { - return AISObjectPtr(); - } - - GeomShapePtr anArcShape = getArcShape(); std::shared_ptr aCenter = aSketch->to3D(myCenter->x(), myCenter->y());; GeomShapePtr aCenterPointShape = GeomAlgoAPI_PointBuilder::vertex(aCenter); - if(!anArcShape.get() || !aCenterPointShape.get()) { + if(!aCenterPointShape.get()) return AISObjectPtr(); - } std::list > aShapes; aShapes.push_back(anArcShape); @@ -301,6 +302,7 @@ AISObjectPtr SketchPlugin_MacroArc::getAISObject(AISObjectPtr thePrevious) anAIS.reset(new GeomAPI_AISObject()); } anAIS->createShape(aCompound); + SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value()); return anAIS; } @@ -315,53 +317,63 @@ void SketchPlugin_MacroArc::execute() // Create constraints. std::string anArcType = string(ARC_TYPE())->value(); if(anArcType == ARC_TYPE_BY_CENTER_AND_POINTS()) { - SketchPlugin_Tools::createConstraint(this, + SketchPlugin_Tools::createCoincidenceOrTangency(this, CENTER_POINT_REF_ID(), anArcFeature->attribute(SketchPlugin_Arc::CENTER_ID()), ObjectPtr(), false); - SketchPlugin_Tools::createConstraint(this, + SketchPlugin_Tools::createCoincidenceOrTangency(this, START_POINT_REF_ID(), anArcFeature->attribute(SketchPlugin_Arc::START_ID()), ObjectPtr(), false); - SketchPlugin_Tools::createConstraint(this, + SketchPlugin_Tools::createCoincidenceOrTangency(this, END_POINT_REF_ID(), anArcFeature->attribute(SketchPlugin_Arc::END_ID()), ObjectPtr(), false); } else if(anArcType == ARC_TYPE_BY_THREE_POINTS()) { - SketchPlugin_Tools::createConstraint(this, + SketchPlugin_Tools::createCoincidenceOrTangency(this, START_POINT_REF_ID(), anArcFeature->attribute(SketchPlugin_Arc::START_ID()), ObjectPtr(), false); - SketchPlugin_Tools::createConstraint(this, + SketchPlugin_Tools::createCoincidenceOrTangency(this, END_POINT_REF_ID(), anArcFeature->attribute(SketchPlugin_Arc::END_ID()), ObjectPtr(), false); - SketchPlugin_Tools::createConstraint(this, + SketchPlugin_Tools::createCoincidenceOrTangency(this, PASSED_POINT_REF_ID(), AttributePtr(), anArcFeature->lastResult(), true); - } else if(anArcType == ARC_TYPE_BY_TANGENT_EDGE()) { - // constraints for tangent arc - SketchPlugin_Tools::createConstraint(this, - TANGENT_POINT_ID(), + } else { + // coincident with connection point + const std::string& aPointAttr = anArcType == ARC_TYPE_BY_TANGENT_EDGE() ? + TANGENT_POINT_ID() : TRANSVERSAL_POINT_ID(); + SketchPlugin_Tools::createCoincidenceOrTangency(this, + aPointAttr, anArcFeature->attribute(SketchPlugin_Arc::START_ID()), ObjectPtr(), false); - FeaturePtr aTangent = sketch()->addFeature(SketchPlugin_ConstraintTangent::ID()); - AttributeRefAttrPtr aRefAttrA = aTangent->refattr(SketchPlugin_Constraint::ENTITY_A()); - AttributeRefAttrPtr aTgPntRefAttr = refattr(TANGENT_POINT_ID()); + // tangent or perpendicular constraint + FeaturePtr aStartPointConstraint; + if (anArcType == ARC_TYPE_BY_TANGENT_EDGE()) + aStartPointConstraint = sketch()->addFeature(SketchPlugin_ConstraintTangent::ID()); + else + aStartPointConstraint = sketch()->addFeature(SketchPlugin_ConstraintPerpendicular::ID()); + // setting attributes of the start point constraint + AttributeRefAttrPtr aRefAttrA = + aStartPointConstraint->refattr(SketchPlugin_Constraint::ENTITY_A()); + AttributeRefAttrPtr aTgPntRefAttr = refattr(aPointAttr); FeaturePtr aTgFeature = ModelAPI_Feature::feature(aTgPntRefAttr->attr()->owner()); aRefAttrA->setObject(aTgFeature->lastResult()); - AttributeRefAttrPtr aRefAttrB = aTangent->refattr(SketchPlugin_Constraint::ENTITY_B()); + AttributeRefAttrPtr aRefAttrB = + aStartPointConstraint->refattr(SketchPlugin_Constraint::ENTITY_B()); aRefAttrB->setObject(anArcFeature->lastResult()); // constraint for end point - SketchPlugin_Tools::createConstraint(this, + SketchPlugin_Tools::createCoincidenceOrTangency(this, END_POINT_REF_ID(), anArcFeature->attribute(SketchPlugin_Arc::END_ID()), ObjectPtr(), @@ -379,6 +391,7 @@ void SketchPlugin_MacroArc::execute() Events_Loop::loop()->send(aMessage); } +// LCOV_EXCL_START std::string SketchPlugin_MacroArc::processEvent(const std::shared_ptr& theMessage) { std::string aFilledAttributeName; @@ -393,11 +406,17 @@ std::string SketchPlugin_MacroArc::processEvent(const std::shared_ptr( - attribute(aFilledAttributeName)); - FeaturePtr aCreatedFeature = aReentrantMessage->createdFeature(); + AttributeRefAttrPtr aRefAttr = refattr(aFilledAttributeName); aRefAttr->setAttr(aCreatedFeature->attribute(SketchPlugin_Arc::END_ID())); } + else if (anArcType == ARC_TYPE_BY_TRANSVERSAL_LINE()) { + AttributeRefAttrPtr aRefAttr = refattr(TRANSVERSAL_POINT_ID()); + AttributePtr anAttribute = aReentrantMessage->selectedAttribute(); + if (anAttribute) { + aRefAttr->setAttr(anAttribute); + aFilledAttributeName = TRANSVERSAL_POINT_ID(); + } + } else { ObjectPtr anObject = aReentrantMessage->selectedObject(); AttributePtr anAttribute = aReentrantMessage->selectedAttribute(); @@ -425,7 +444,6 @@ std::string SketchPlugin_MacroArc::processEvent(const std::shared_ptrowner().get() || !anAttribute->owner()->data()->isValid()) { - FeaturePtr aCreatedFeature = aReentrantMessage->createdFeature(); if (aCreatedFeature.get()) { std::string anID = anAttribute->id(); std::string anArcID; @@ -442,14 +460,11 @@ std::string SketchPlugin_MacroArc::processEvent(const std::shared_ptrsetAttr(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(); - if (aCreatedFeature.get()) - 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 = ARC_TYPE(); } } } @@ -459,6 +474,7 @@ std::string SketchPlugin_MacroArc::processEvent(const std::shared_ptr()) + return; bool aWasBlocked = data()->blockSendAttributeUpdated(true); // check the end point is referred to another feature @@ -601,35 +620,41 @@ void SketchPlugin_MacroArc::recalculateReversedFlagByPassed( myParamBefore = aEndParam; } -void SketchPlugin_MacroArc::fillByTangentEdge() +void SketchPlugin_MacroArc::fillByEdge(bool theTransversal) { - AttributeRefAttrPtr aTangentAttr = refattr(TANGENT_POINT_ID()); + const std::string& aStartPoint = theTransversal ? TRANSVERSAL_POINT_ID() : TANGENT_POINT_ID(); + const std::string& aEndPoint = theTransversal ? END_POINT_4_ID() : END_POINT_3_ID(); + + AttributeRefAttrPtr aTangentAttr = refattr(aStartPoint); if (!aTangentAttr->isInitialized()) return; - AttributePoint2DPtr aTangentPointAttr = + AttributePoint2DPtr aConnectionPointAttr = std::dynamic_pointer_cast(aTangentAttr->attr()); - if (!aTangentPointAttr->isInitialized()) + if (!aConnectionPointAttr->isInitialized()) return; AttributePoint2DPtr anEndPointAttr = - std::dynamic_pointer_cast(attribute(END_POINT_3_ID())); + std::dynamic_pointer_cast(attribute(aEndPoint)); if (!anEndPointAttr->isInitialized()) return; - myStart = aTangentPointAttr->pnt(); + myStart = aConnectionPointAttr->pnt(); myEnd = anEndPointAttr->pnt(); if (myStart->isEqual(myEnd)) return; // obtain a shape the tangent point belongs to - FeaturePtr aTangentFeature = ModelAPI_Feature::feature(aTangentPointAttr->owner()); - std::shared_ptr aTangentShape = aTangentFeature->lastResult()->shape(); + FeaturePtr aConnectedFeature = ModelAPI_Feature::feature(aConnectionPointAttr->owner()); + std::shared_ptr aTangentShape = aConnectedFeature->lastResult()->shape(); GeomAlgoAPI_Circ2dBuilder aCircBuilder(SketchPlugin_Sketch::plane(sketch())); aCircBuilder.addPassingPoint(myStart); aCircBuilder.addPassingPoint(myEnd); - aCircBuilder.addTangentCurve(aTangentShape); + if (theTransversal) + aCircBuilder.setTransversalLine(aTangentShape); + else + aCircBuilder.addTangentCurve(aTangentShape); std::shared_ptr aCircle = aCircBuilder.circle(); if (!aCircle)