X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_MultiRotation.cpp;h=274f8d64a03c6346e99f83a3999891b88e407775;hb=c7a5ff20294ae8270bfb9120b8887f0c9959d658;hp=5864a194e901dcd8a44756c4fed3a7fc5a767374;hpb=3b2f8927207d5327b6ba6f0cd722940dafb8cc25;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_MultiRotation.cpp b/src/SketchPlugin/SketchPlugin_MultiRotation.cpp old mode 100644 new mode 100755 index 5864a194e..274f8d64a --- a/src/SketchPlugin/SketchPlugin_MultiRotation.cpp +++ b/src/SketchPlugin/SketchPlugin_MultiRotation.cpp @@ -5,14 +5,15 @@ // Author: Artem ZHIDKOV #include "SketchPlugin_MultiRotation.h" +#include "SketchPlugin_Tools.h" #include #include +#include #include #include #include #include -#include #include #include #include @@ -27,20 +28,21 @@ #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()); - AttributeSelectionListPtr aSelection = - std::dynamic_pointer_cast(data()->addAttribute( - ROTATION_LIST_ID(), ModelAPI_AttributeSelectionList::typeId())); - aSelection->setSelectionType("EDGE"); + data()->addAttribute(ROTATION_LIST_ID(), ModelAPI_AttributeRefList::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), SketchPlugin_Constraint::ENTITY_A()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), SketchPlugin_Constraint::ENTITY_B()); } @@ -53,19 +55,30 @@ void SketchPlugin_MultiRotation::execute() return; } - AttributeSelectionListPtr aRotationObjectRefs = selectionList(ROTATION_LIST_ID()); - int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value(); + AttributeRefListPtr aRotationObjectRefs = reflist(ROTATION_LIST_ID()); + 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; @@ -84,20 +97,20 @@ void SketchPlugin_MultiRotation::execute() aRefListOfRotated->size() / aRefListOfShapes->size() - 1 : 0; std::list anInitialList = aRefListOfShapes->list(); std::list aTargetList = aRefListOfRotated->list(); - std::list anAddition; + std::list anAddition; std::vector isUsed(anInitialList.size(), false); // collect new items and check the items to remove for(int anInd = 0; anInd < aRotationObjectRefs->size(); anInd++) { - std::shared_ptr aSelect = aRotationObjectRefs->value(anInd); + ObjectPtr anObject = aRotationObjectRefs->object(anInd); std::list::const_iterator anIt = anInitialList.begin(); std::vector::iterator aUsedIt = isUsed.begin(); for (; anIt != anInitialList.end(); anIt++, aUsedIt++) - if (*anIt == aSelect->context()) { + if (*anIt == anObject) { *aUsedIt = true; break; } if (anIt == anInitialList.end()) - anAddition.push_back(aSelect->context()); + anAddition.push_back(anObject); } // remove unused items std::list::iterator anInitIter = anInitialList.begin(); @@ -170,7 +183,7 @@ void SketchPlugin_MultiRotation::execute() aRefListOfRotated->append(*aTargetIter); } // add new items - std::list::iterator anAddIter = anAddition.begin(); + std::list::iterator anAddIter = anAddition.begin(); for (; anAddIter != anAddition.end(); anAddIter++) { aRefListOfShapes->append(*anAddIter); aRefListOfRotated->append(*anAddIter); @@ -281,17 +294,12 @@ void SketchPlugin_MultiRotation::rotateFeature( void SketchPlugin_MultiRotation::attributeChanged(const std::string& theID) { if (theID == ROTATION_LIST_ID()) { - AttributeSelectionListPtr aRotationObjectRefs = selectionList(ROTATION_LIST_ID()); + AttributeRefListPtr aRotationObjectRefs = reflist(ROTATION_LIST_ID()); if (aRotationObjectRefs->size() == 0) { - // the commented code is not necessary here because if an update event is flushed - // before the setFlushed with true value happens, it leads to crash - // Wait all objects being created, then send update events - static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); - //bool isUpdateFlushed = Events_Loop::loop()->isFlushed(anUpdateEvent); - //if (isUpdateFlushed) - // Events_Loop::loop()->setFlushed(anUpdateEvent, false); - - 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())); @@ -315,11 +323,47 @@ void SketchPlugin_MultiRotation::attributeChanged(const std::string& theID) data()->attribute(SketchPlugin_Constraint::ENTITY_A()))->clear(); std::dynamic_pointer_cast( data()->attribute(SketchPlugin_Constraint::ENTITY_B()))->clear(); - - // the commented code is incorrect and obsolete, so it is removed - // send events to update the sub-features by the solver - //if (isUpdateFlushed) - // Events_Loop::loop()->setFlushed(anUpdateEvent, true); + } + } + 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)); + } } } }