Salome HOME
Create Presentation for rigid constraint
[modules/shaper.git] / src / PartSet / PartSet_Listener.cpp
1 // File:        PartSet_Listener.h
2 // Created:     28 Apr 2014
3 // Author:      Natalia ERMOLAEVA
4
5 #include <PartSet_Listener.h>
6
7 #include <PartSet_Module.h>
8 #include <PartSet_OperationSketchBase.h>
9 #include <PartSet_OperationSketch.h>
10 #include <PartSet_OperationFeatureCreate.h>
11
12 #include <XGUI_Displayer.h>
13 #include <XGUI_Workshop.h>
14 #include <XGUI_OperationMgr.h>
15
16 #include <ModuleBase_Operation.h>
17
18 #include <Events_Loop.h>
19 #include <ModelAPI_Events.h>
20 #include <ModelAPI_Feature.h>
21
22 #ifdef _DEBUG
23 #include <QDebug>
24 #endif
25
26 using namespace std;
27
28 PartSet_Listener::PartSet_Listener(PartSet_Module* theModule)
29     : myModule(theModule)
30 {
31   Events_Loop* aLoop = Events_Loop::loop();
32   aLoop->registerListener(this, aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY));
33   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED));
34   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED));
35 }
36
37 PartSet_Listener::~PartSet_Listener()
38 {
39 }
40
41 //******************************************************
42 void PartSet_Listener::processEvent(const boost::shared_ptr<Events_Message>& theMessage)
43 {
44   ModuleBase_Operation* anOperation = myModule->xWorkshop()->operationMgr()->currentOperation();
45   PartSet_OperationSketchBase* aSketchOp = dynamic_cast<PartSet_OperationSketchBase*>(anOperation);
46   if (!aSketchOp)
47     return;
48
49   XGUI_Displayer* aDisplayer = myModule->xWorkshop()->displayer();
50   QString aType = QString(theMessage->eventID().eventText());
51   if (aType == EVENT_OBJECT_CREATED) {
52     boost::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
53         boost::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
54     std::set<ObjectPtr> aFeatures = aUpdMsg->objects();
55
56     PartSet_OperationSketch* aSketchOp = 
57       dynamic_cast<PartSet_OperationSketch*>(myModule->xWorkshop()->operationMgr()->currentOperation());
58
59     std::set<ObjectPtr>::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end();
60     for (; anIt != aLast; anIt++) {
61       ObjectPtr aObj = (*anIt);
62       // If current operation is Sketch then there is no active sketching operation
63       // and possible the object was created by Redo operation
64       if (aSketchOp) {
65           XGUI_Displayer* aDisplayer = myModule->xWorkshop()->displayer();
66           // Very possible it is not displayed
67           aDisplayer->display(aObj, false);
68       }
69     }
70   } else if (aType == EVENT_OBJECT_TO_REDISPLAY) {
71     PartSet_OperationFeatureCreate* aCreationOp = 
72       dynamic_cast<PartSet_OperationFeatureCreate*>
73       (myModule->xWorkshop()->operationMgr()->currentOperation());
74     if (aCreationOp) {
75       // Deactivate currently creating objects for selection
76       XGUI_Displayer* aDisplayer = myModule->xWorkshop()->displayer();
77       FeaturePtr aFeature = aCreationOp->feature();
78       const std::list<ResultPtr>& aResults = aFeature->results();
79       boost::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
80           boost::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
81
82       std::set<ObjectPtr> aFeatures = aUpdMsg->objects();
83       std::set<ObjectPtr>::const_iterator aObjIt, aNoObj = aFeatures.cend();
84       std::list<ResultPtr>::const_iterator anIt = aResults.begin(), aLast = aResults.end();
85       for (; anIt != aLast; anIt++) {
86         aObjIt = aFeatures.find(*anIt);
87         if (aObjIt != aNoObj) {
88           aDisplayer->deactivate(*aObjIt);
89         }
90       }
91     }
92   } else if (aType == EVENT_OBJECT_DELETED) {
93     boost::shared_ptr<ModelAPI_ObjectDeletedMessage> aDelMsg =
94         boost::dynamic_pointer_cast<ModelAPI_ObjectDeletedMessage>(theMessage);
95     boost::shared_ptr<ModelAPI_Document> aDoc = aDelMsg->document();
96
97     std::set<std::string> aGroups = aDelMsg->groups();
98     std::set<std::string>::const_iterator anIt = aGroups.begin(), aLast = aGroups.end();
99     for (; anIt != aLast; anIt++) {
100       std::string aGroup = *anIt;
101       if (aGroup.compare(SketchPlugin_Sketch::ID()) == 0) {  // Update only Sketch group
102         myModule->xWorkshop()->displayer()->eraseDeletedResults();
103         myModule->updateCurrentPreview(aGroup);
104       }
105     }
106   }
107 }