X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_MacroArc.cpp;h=5bbb322358f90792c725358c6a973603614ec281;hb=b5893b0a30fac08134c24de4565cb513a43affa6;hp=e2d9940f327cdc845c6e33d140987dcca701f73a;hpb=c3421008f5d9f227e265ebac5132ed866149ea56;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_MacroArc.cpp b/src/SketchPlugin/SketchPlugin_MacroArc.cpp index e2d9940f3..5bbb32235 100644 --- a/src/SketchPlugin/SketchPlugin_MacroArc.cpp +++ b/src/SketchPlugin/SketchPlugin_MacroArc.cpp @@ -113,7 +113,9 @@ static void intersectShapeAndCircle(const GeomShapePtr& theShape, } } } - theIntersection->setValue(anInterPnt); + if(anInterPnt.get()) { + theIntersection->setValue(anInterPnt); + } } @@ -215,6 +217,11 @@ void SketchPlugin_MacroArc::attributeChanged(const std::string& theID) } bool aWasBlocked = data()->blockSendAttributeUpdated(true); + if(myCenter.get()) { + // center attribute is used in processEvent() to set reference to reentrant arc + std::dynamic_pointer_cast(attribute(CENTER_POINT_ID())) + ->setValue(myCenter); + } real(RADIUS_ID())->setValue(aRadius); real(ANGLE_ID())->setValue(anAngle); data()->blockSendAttributeUpdated(aWasBlocked, false); @@ -350,7 +357,7 @@ void SketchPlugin_MacroArc::execute() // message to init reentrant operation static Events_ID anId = SketchPlugin_MacroArcReentrantMessage::eventId(); std::shared_ptr aMessage = std::shared_ptr - (new SketchPlugin_MacroArcReentrantMessage(anId, 0)); + (new SketchPlugin_MacroArcReentrantMessage(anId, this)); std::string anEditArcType = string(EDIT_ARC_TYPE_ID())->value(); aMessage->setTypeOfCreation(!anEditArcType.empty() ? anEditArcType : anArcType); @@ -400,16 +407,33 @@ std::string SketchPlugin_MacroArc::processEvent(const std::shared_ptrsetValue(aClickedPoint); // fill reference attribute AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast( - attribute(aReferenceAttributeName)); + attribute(aReferenceAttributeName)); if (aRefAttr.get()) { - if (anAttribute.get()) + if (anAttribute.get()) { + if (!anAttribute->owner().get() || !anAttribute->owner()->data()->isValid()) { + FeaturePtr aCreatedFeature = aReentrantMessage->createdFeature(); + if (aCreatedFeature.get()) { + std::string anID = anAttribute->id(); + std::string anArcID; + if (anID == END_POINT_1_ID() || anID == END_POINT_2_ID() || + anID == END_POINT_3_ID()) + anArcID = SketchPlugin_Arc::END_ID(); + else if (anID == START_POINT_1_ID() || anID ==START_POINT_2_ID()) + anArcID = SketchPlugin_Arc::START_ID(); + else if (anID == CENTER_POINT_ID()) + anArcID = SketchPlugin_Arc::CENTER_ID(); + anAttribute = aCreatedFeature->attribute(anArcID); + } + } 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(); + if (aCreatedFeature.get()) + anObject = aCreatedFeature->lastResult(); } aRefAttr->setObject(anObject); }