X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_MultiRotation.cpp;h=274f8d64a03c6346e99f83a3999891b88e407775;hb=c7a5ff20294ae8270bfb9120b8887f0c9959d658;hp=726ffe4dd5e847feac88b6994b2baf7b182645fc;hpb=8f09d362a50ccbc085841c24af2e755121e458ba;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_MultiRotation.cpp b/src/SketchPlugin/SketchPlugin_MultiRotation.cpp index 726ffe4dd..274f8d64a 100755 --- a/src/SketchPlugin/SketchPlugin_MultiRotation.cpp +++ b/src/SketchPlugin/SketchPlugin_MultiRotation.cpp @@ -5,9 +5,11 @@ // Author: Artem ZHIDKOV #include "SketchPlugin_MultiRotation.h" +#include "SketchPlugin_Tools.h" #include #include +#include #include #include #include @@ -26,14 +28,18 @@ #define PI 3.1415926535897932 SketchPlugin_MultiRotation::SketchPlugin_MultiRotation() +: myBlockAngle(false) { } void SketchPlugin_MultiRotation::initAttributes() { data()->addAttribute(CENTER_ID(), GeomDataAPI_Point2D::typeId()); + + data()->addAttribute(ANGLE_TYPE(), ModelAPI_AttributeString::typeId()); data()->addAttribute(ANGLE_ID(), ModelAPI_AttributeDouble::typeId()); - data()->addAttribute(NUMBER_OF_COPIES_ID(), ModelAPI_AttributeInteger::typeId()); + data()->addAttribute(ANGLE_FULL_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(NUMBER_OF_OBJECTS_ID(), ModelAPI_AttributeInteger::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefList::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefList::typeId()); data()->addAttribute(ROTATION_LIST_ID(), ModelAPI_AttributeRefList::typeId()); @@ -50,18 +56,29 @@ void SketchPlugin_MultiRotation::execute() } AttributeRefListPtr aRotationObjectRefs = reflist(ROTATION_LIST_ID()); - int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value(); + int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value() - 1; + if (aNbCopies <= 0) + return; // Obtain center and angle of rotation std::shared_ptr aCenter = std::dynamic_pointer_cast( attribute(CENTER_ID())); if (!aCenter || !aCenter->isInitialized()) return; + + if (attribute(ANGLE_ID())->isInitialized() && !attribute(ANGLE_FULL_ID())->isInitialized()) { + myBlockAngle = true; + SketchPlugin_Tools::updateMultiAttribute(attribute(ANGLE_ID()), attribute(ANGLE_FULL_ID()), + aNbCopies, true); + myBlockAngle = false; + } + // make a visible points SketchPlugin_Sketch::createPoint2DResult(this, sketch(), CENTER_ID(), 0); double anAngle = std::dynamic_pointer_cast( - attribute(ANGLE_ID()))->value(); + attribute(ANGLE_ID()))->value(); + // Convert angle to radians anAngle *= PI / 180.0; @@ -279,7 +296,10 @@ void SketchPlugin_MultiRotation::attributeChanged(const std::string& theID) if (theID == ROTATION_LIST_ID()) { AttributeRefListPtr aRotationObjectRefs = reflist(ROTATION_LIST_ID()); if (aRotationObjectRefs->size() == 0) { - int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value(); + int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value()-1; + if (aNbCopies <= 0) + return; + // Clear list of objects AttributeRefListPtr aRefListOfRotated = std::dynamic_pointer_cast( data()->attribute(SketchPlugin_Constraint::ENTITY_B())); @@ -305,4 +325,45 @@ void SketchPlugin_MultiRotation::attributeChanged(const std::string& theID) data()->attribute(SketchPlugin_Constraint::ENTITY_B()))->clear(); } } + else if (theID == ANGLE_ID() && !myBlockAngle) { + int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value() - 1; + if (aNbCopies > 0) { + myBlockAngle = true; + SketchPlugin_Tools::updateMultiAttribute(attribute(ANGLE_ID()), attribute(ANGLE_FULL_ID()), + aNbCopies, true); + myBlockAngle = false; + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + } + } + else if (theID == ANGLE_FULL_ID() && !myBlockAngle) { + int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value() - 1; + if (aNbCopies > 0) { + myBlockAngle = true; + SketchPlugin_Tools::updateMultiAttribute(attribute(ANGLE_FULL_ID()), attribute(ANGLE_ID()), + aNbCopies, false); + myBlockAngle = false; + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + } + } + else if (theID == NUMBER_OF_OBJECTS_ID()) { + if (attribute(NUMBER_OF_OBJECTS_ID())->isInitialized() && + attribute(ANGLE_ID())->isInitialized() && + attribute(ANGLE_TYPE())->isInitialized()) { + AttributeStringPtr aMethodTypeAttr = string(ANGLE_TYPE()); + std::string aMethodType = aMethodTypeAttr->value(); + int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value() - 1; + if (aNbCopies > 0) { + myBlockAngle = true; + if (aMethodType == "SingleAngle") + SketchPlugin_Tools::updateMultiAttribute(attribute(ANGLE_ID()), attribute(ANGLE_FULL_ID()), + aNbCopies, true); + else { + SketchPlugin_Tools::updateMultiAttribute(attribute(ANGLE_FULL_ID()), attribute(ANGLE_ID()), + aNbCopies, false); + } + myBlockAngle = false; + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + } + } + } }