X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Listener.cpp;h=24c78b60faf03b8beb774960c21bfedaa1be99d0;hb=43780ffac779af7f061513b0f6243f2edb73602c;hp=0deb7fb74359fd6823902a7b9e3571abcf687b9b;hpb=493ec866e48d17b3f51ebca8e6dc7b359c38fea3;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Listener.cpp b/src/PartSet/PartSet_Listener.cpp index 0deb7fb74..24c78b60f 100644 --- a/src/PartSet/PartSet_Listener.cpp +++ b/src/PartSet/PartSet_Listener.cpp @@ -5,11 +5,19 @@ #include #include +#include +#include +#include #include +#include +#include + +#include #include -#include +#include +#include #ifdef _DEBUG #include @@ -18,12 +26,12 @@ using namespace std; PartSet_Listener::PartSet_Listener(PartSet_Module* theModule) -: myModule(theModule) + : myModule(theModule) { Events_Loop* aLoop = Events_Loop::loop(); - aLoop->registerListener(this, aLoop->eventByName(EVENT_FEATURE_UPDATED)); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_CREATED)); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_DELETED)); + aLoop->registerListener(this, aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED)); } PartSet_Listener::~PartSet_Listener() @@ -31,27 +39,69 @@ PartSet_Listener::~PartSet_Listener() } //****************************************************** -void PartSet_Listener::processEvent(const Events_Message* theMessage) +void PartSet_Listener::processEvent(const boost::shared_ptr& theMessage) { + ModuleBase_Operation* anOperation = myModule->xWorkshop()->operationMgr()->currentOperation(); + PartSet_OperationSketchBase* aSketchOp = dynamic_cast(anOperation); + if (!aSketchOp) + return; + + XGUI_Displayer* aDisplayer = myModule->xWorkshop()->displayer(); QString aType = QString(theMessage->eventID().eventText()); - if (aType == EVENT_FEATURE_UPDATED || - aType == EVENT_FEATURE_CREATED) - { - const Model_FeatureUpdatedMessage* aUpdMsg = dynamic_cast(theMessage); - boost::shared_ptr aFeature = aUpdMsg->feature(); - if (myModule->workshop()->displayer()->IsVisible(aFeature) || - aType == EVENT_FEATURE_CREATED) - myModule->visualizePreview(aFeature, true); - } - if (aType == EVENT_FEATURE_DELETED) - { - const Model_FeatureDeletedMessage* aDelMsg = dynamic_cast(theMessage); + if (aType == EVENT_OBJECT_CREATED) { + boost::shared_ptr aUpdMsg = + boost::dynamic_pointer_cast(theMessage); + std::set aFeatures = aUpdMsg->objects(); + + PartSet_OperationSketch* aSketchOp = + dynamic_cast(myModule->xWorkshop()->operationMgr()->currentOperation()); + + std::set::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end(); + for (; anIt != aLast; anIt++) { + ObjectPtr aObj = (*anIt); + // If current operation is Sketch then there is no active sketching operation + // and possible the object was created by Redo operation + if (aSketchOp) { + XGUI_Displayer* aDisplayer = myModule->xWorkshop()->displayer(); + // Very possible it is not displayed + aDisplayer->display(aObj, false); + } + } + } else if (aType == EVENT_OBJECT_TO_REDISPLAY) { + PartSet_OperationFeatureCreate* aCreationOp = + dynamic_cast + (myModule->xWorkshop()->operationMgr()->currentOperation()); + if (aCreationOp) { + // Deactivate currently creating objects for selection + XGUI_Displayer* aDisplayer = myModule->xWorkshop()->displayer(); + FeaturePtr aFeature = aCreationOp->feature(); + const std::list& aResults = aFeature->results(); + boost::shared_ptr aUpdMsg = + boost::dynamic_pointer_cast(theMessage); + + std::set aFeatures = aUpdMsg->objects(); + std::set::const_iterator aObjIt, aNoObj = aFeatures.cend(); + std::list::const_iterator anIt = aResults.begin(), aLast = aResults.end(); + for (; anIt != aLast; anIt++) { + aObjIt = aFeatures.find(*anIt); + if (aObjIt != aNoObj) { + aDisplayer->deactivate(*aObjIt); + } + } + } + } else if (aType == EVENT_OBJECT_DELETED) { + boost::shared_ptr aDelMsg = + boost::dynamic_pointer_cast(theMessage); boost::shared_ptr aDoc = aDelMsg->document(); - std::string aGroup = aDelMsg->group(); - if (aDelMsg->group().compare("Sketch") == 0) { // Update only Sketch group - //myModule->workshop()->displayer()->EraseDeletedFeatures(); - myModule->updateCurrentPreview(aGroup); + std::set aGroups = aDelMsg->groups(); + std::set::const_iterator anIt = aGroups.begin(), aLast = aGroups.end(); + for (; anIt != aLast; anIt++) { + std::string aGroup = *anIt; + if (aGroup.compare(SketchPlugin_Sketch::ID()) == 0) { // Update only Sketch group + myModule->xWorkshop()->displayer()->eraseDeletedResults(); + myModule->updateCurrentPreview(aGroup); + } } } }