]> SALOME platform Git repositories - modules/shaper.git/blob - src/PartSet/PartSet_OperationFeatureEditMulti.cpp
Salome HOME
Merge branch 'master' of newgeom:newgeom
[modules/shaper.git] / src / PartSet / PartSet_OperationFeatureEditMulti.cpp
1 // File:        PartSet_OperationFeatureEditMulti.h
2 // Created:     05 May 2014
3 // Author:      Natalia ERMOLAEVA
4
5 #include <PartSet_OperationFeatureEditMulti.h>
6 #include <PartSet_Tools.h>
7 #include <PartSet_OperationSketch.h>
8
9 #include <ModuleBase_OperationDescription.h>
10 #include <ModuleBase_ViewerPrs.h>
11
12 #include <ModelAPI_Events.h>
13
14 #include <SketchPlugin_Feature.h>
15 #include <GeomDataAPI_Point2D.h>
16 #include <ModelAPI_Data.h>
17 #include <ModelAPI_Document.h>
18
19 #include <ModelAPI_Events.h>
20
21 #include <Events_Loop.h>
22
23 #include <SketchPlugin_Line.h>
24
25 #include <V3d_View.hxx>
26
27 #ifdef _DEBUG
28 #include <QDebug>
29 #endif
30
31 #include <QMouseEvent>
32
33 using namespace std;
34
35 PartSet_OperationFeatureEditMulti::PartSet_OperationFeatureEditMulti(const QString& theId,
36                                                                      QObject* theParent,
37                                                                      FeaturePtr theFeature)
38     : PartSet_OperationSketchBase(theId, theParent),
39       mySketch(theFeature),
40       myIsBlockedSelection(false)
41 {
42   myIsEditing = true;
43 }
44
45 PartSet_OperationFeatureEditMulti::~PartSet_OperationFeatureEditMulti()
46 {
47 }
48
49
50 void PartSet_OperationFeatureEditMulti::initSelection(
51     const std::list<ModuleBase_ViewerPrs>& theSelected,
52     const std::list<ModuleBase_ViewerPrs>& theHighlighted)
53 {
54   if (!theHighlighted.empty()) {
55     // if there is highlighted object, we check whether it is in the list of selected objects
56     // in that case this object is a handle of the moved lines. If there no such object in the selection,
57     // the hightlighted object should moved and the selection is skipped. The skipped selection will be
58     // deselected in the viewer by blockSelection signal in the startOperation method.
59     bool isSelected = false;
60     std::list<ModuleBase_ViewerPrs>::const_iterator anIt = theSelected.begin(), aLast = theSelected
61         .end();
62     for (; anIt != aLast && !isSelected; anIt++) {
63       isSelected = ModelAPI_Feature::feature((*anIt).object()) == feature();
64     }
65     if (!isSelected)
66       myFeatures = theHighlighted;
67     else
68       myFeatures = theSelected;
69   } else
70     myFeatures = theSelected;
71 }
72
73 FeaturePtr PartSet_OperationFeatureEditMulti::sketch() const
74 {
75   return mySketch;
76 }
77
78 void PartSet_OperationFeatureEditMulti::mousePressed(
79     QMouseEvent* theEvent, Handle(V3d_View) theView,
80     const std::list<ModuleBase_ViewerPrs>& /*theSelected*/,
81     const std::list<ModuleBase_ViewerPrs>& theHighlighted)
82 {
83 }
84
85 void PartSet_OperationFeatureEditMulti::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView)
86 {
87   if (!(theEvent->buttons() & Qt::LeftButton))
88     return;
89
90   gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView);
91
92 /*  blockSelection(true);
93   if (myCurPoint.myIsInitialized) {
94     double aCurX, aCurY;
95     PartSet_Tools::convertTo2D(myCurPoint.myPoint, sketch(), theView, aCurX, aCurY);
96
97     double aX, anY;
98     PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY);
99
100     double aDeltaX = aX - aCurX;
101     double aDeltaY = anY - aCurY;
102
103     boost::shared_ptr<SketchPlugin_Feature> aSketchFeature = boost::dynamic_pointer_cast<
104         SketchPlugin_Feature>(sketch());
105     aSketchFeature->move(aDeltaX, aDeltaY);
106
107     std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast = myFeatures
108         .end();
109     for (; anIt != aLast; anIt++) {
110       ObjectPtr aObject = (*anIt).object();
111       if (!aObject || aObject == feature())
112         continue;
113       FeaturePtr aFeature = ModelAPI_Feature::feature(aObject);
114       if (aFeature) {
115         aSketchFeature = boost::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
116         if (aSketchFeature)
117           aSketchFeature->move(aDeltaX, aDeltaY);
118       }
119     }
120   }
121   sendFeatures();
122
123   myCurPoint.setPoint(aPoint);
124   */
125 }
126
127 void PartSet_OperationFeatureEditMulti::mouseReleased(
128     QMouseEvent* theEvent, Handle(V3d_View) theView,
129     const std::list<ModuleBase_ViewerPrs>& /*theSelected*/,
130     const std::list<ModuleBase_ViewerPrs>& /*theHighlighted*/)
131 {
132   if (commit()) {
133     std::list<ModuleBase_ViewerPrs> aFeatures = myFeatures;
134     std::list<ModuleBase_ViewerPrs>::const_iterator anIt = aFeatures.begin(), aLast =
135         aFeatures.end();
136     for (; anIt != aLast; anIt++) {
137       ObjectPtr aFeature = (*anIt).object();
138       if (aFeature) {
139         emit featureConstructed(aFeature, FM_Deactivation);
140       }
141     }
142   }
143 }
144
145 void PartSet_OperationFeatureEditMulti::startOperation()
146 {
147   PartSet_OperationSketchBase::startOperation();
148   emit multiSelectionEnabled(false);
149
150   blockSelection(true);
151
152   myCurPoint.clear();
153 }
154
155 void PartSet_OperationFeatureEditMulti::stopOperation()
156 {
157   emit multiSelectionEnabled(true);
158
159   blockSelection(false, true);
160
161   myFeatures.clear();
162 }
163
164 void PartSet_OperationFeatureEditMulti::blockSelection(bool isBlocked,
165                                                        const bool isRestoreSelection)
166 {
167   if (myIsBlockedSelection == isBlocked)
168     return;
169
170   myIsBlockedSelection = isBlocked;
171   QList<ObjectPtr> aFeatureList;
172   std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast =
173       myFeatures.end();
174   /*for(; anIt != aLast; anIt++)
175    aFeatureList.append((*anIt).feature());*/
176   if (isBlocked) {
177     emit setSelection(QList<ObjectPtr>());
178     emit stopSelection(aFeatureList, true);
179   } else {
180     emit stopSelection(aFeatureList, false);
181     if (isRestoreSelection) {
182       emit setSelection(aFeatureList);
183     }
184   }
185 }
186
187 void PartSet_OperationFeatureEditMulti::sendFeatures()
188 {
189   static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
190
191   std::list<FeaturePtr> aFeatures;
192   std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast =
193       myFeatures.end();
194   for (; anIt != aLast; anIt++) {
195     ObjectPtr aFeature = (*anIt).object();
196     if (!aFeature)
197       continue;
198
199     ModelAPI_EventCreator::get()->sendUpdated(aFeature, anEvent);
200   }
201   Events_Loop::loop()->flush(anEvent);
202   flushUpdated();
203 }
204