1 // File: PartSet_OperationEditLine.h
2 // Created: 05 May 2014
3 // Author: Natalia ERMOLAEVA
5 #include <PartSet_OperationEditLine.h>
6 #include <PartSet_Tools.h>
7 #include <PartSet_OperationSketch.h>
9 #include <ModuleBase_OperationDescription.h>
10 #include <Model_Events.h>
12 #include <XGUI_ViewerPrs.h>
14 #include <SketchPlugin_Feature.h>
15 #include <GeomDataAPI_Point2D.h>
16 #include <ModelAPI_Data.h>
17 #include <ModelAPI_Document.h>
19 #include <Model_Events.h>
21 #include <Events_Loop.h>
23 #include <SketchPlugin_Line.h>
25 #include <V3d_View.hxx>
31 #include <QMouseEvent>
35 PartSet_OperationEditLine::PartSet_OperationEditLine(const QString& theId,
37 boost::shared_ptr<ModelAPI_Feature> theFeature)
38 : PartSet_OperationSketchBase(theId, theParent), mySketch(theFeature), myIsBlockedSelection(false)
42 PartSet_OperationEditLine::~PartSet_OperationEditLine()
46 bool PartSet_OperationEditLine::isGranted(ModuleBase_IOperation* theOperation) const
48 return theOperation->getDescription()->operationId().toStdString() == PartSet_OperationSketch::Type();
51 std::list<int> PartSet_OperationEditLine::getSelectionModes(boost::shared_ptr<ModelAPI_Feature> theFeature) const
53 return PartSet_OperationSketchBase::getSelectionModes(theFeature);
56 void PartSet_OperationEditLine::init(boost::shared_ptr<ModelAPI_Feature> theFeature,
57 const std::list<XGUI_ViewerPrs>& theSelected,
58 const std::list<XGUI_ViewerPrs>& theHighlighted)
60 setFeature(theFeature);
62 if (!theHighlighted.empty()) {
63 // if there is highlighted object, we check whether it is in the list of selected objects
64 // in that case this object is a handle of the moved lines. If there no such object in the selection,
65 // the hightlighted object should moved and the selection is skipped. The skipped selection will be
66 // deselected in the viewer by blockSelection signal in the startOperation method.
67 bool isSelected = false;
68 std::list<XGUI_ViewerPrs>::const_iterator anIt = theSelected.begin(), aLast = theSelected.end();
69 for (; anIt != aLast && !isSelected; anIt++) {
70 isSelected = (*anIt).feature() == feature();
73 myFeatures = theHighlighted;
75 myFeatures = theSelected;
78 myFeatures = theSelected;
81 boost::shared_ptr<ModelAPI_Feature> PartSet_OperationEditLine::sketch() const
86 void PartSet_OperationEditLine::mousePressed(QMouseEvent* theEvent, Handle(V3d_View) theView,
87 const std::list<XGUI_ViewerPrs>& /*theSelected*/,
88 const std::list<XGUI_ViewerPrs>& theHighlighted)
90 if (myFeatures.size() == 1)
92 boost::shared_ptr<ModelAPI_Feature> aFeature;
93 if (!theHighlighted.empty())
94 aFeature = theHighlighted.front().feature();
96 if (aFeature && aFeature == feature()) { // continue the feature edit
99 XGUI_ViewerPrs aFeaturePrs = myFeatures.front();
101 emit featureConstructed(feature(), FM_Deactivation);
103 bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier);
104 if(aHasShift && !theHighlighted.empty()) {
105 std::list<XGUI_ViewerPrs> aSelected;
106 aSelected.push_back(aFeaturePrs);
107 aSelected.push_back(theHighlighted.front());
108 emit setSelection(aSelected);
111 restartOperation(PartSet_OperationEditLine::Type(), aFeature);
117 void PartSet_OperationEditLine::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView)
119 if (!(theEvent->buttons() & Qt::LeftButton))
122 gp_Pnt aPoint = PartSet_Tools::ConvertClickToPoint(theEvent->pos(), theView);
124 blockSelection(true);
125 if (myCurPoint.myIsInitialized) {
127 PartSet_Tools::ConvertTo2D(myCurPoint.myPoint, sketch(), theView, aCurX, aCurY);
130 PartSet_Tools::ConvertTo2D(aPoint, sketch(), theView, aX, anY);
132 double aDeltaX = aX - aCurX;
133 double aDeltaY = anY - aCurY;
135 moveLinePoint(feature(), aDeltaX, aDeltaY, LINE_ATTR_START);
136 moveLinePoint(feature(), aDeltaX, aDeltaY, LINE_ATTR_END);
138 std::list<XGUI_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast = myFeatures.end();
139 for (; anIt != aLast; anIt++) {
140 boost::shared_ptr<ModelAPI_Feature> aFeature = (*anIt).feature();
141 if (!aFeature || aFeature == feature())
143 moveLinePoint(aFeature, aDeltaX, aDeltaY, LINE_ATTR_START);
144 moveLinePoint(aFeature, aDeltaX, aDeltaY, LINE_ATTR_END);
149 myCurPoint.setPoint(aPoint);
152 void PartSet_OperationEditLine::mouseReleased(QMouseEvent* theEvent, Handle(V3d_View) theView,
153 const std::list<XGUI_ViewerPrs>& /*theSelected*/,
154 const std::list<XGUI_ViewerPrs>& /*theHighlighted*/)
156 std::list<XGUI_ViewerPrs> aFeatures = myFeatures;
157 if (myFeatures.size() == 1) {
158 blockSelection(false);
162 std::list<XGUI_ViewerPrs>::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end();
163 for (; anIt != aLast; anIt++) {
164 boost::shared_ptr<ModelAPI_Feature> aFeature = (*anIt).feature();
166 emit featureConstructed(aFeature, FM_Deactivation);
171 void PartSet_OperationEditLine::startOperation()
173 // do nothing in order to do not create a new feature
174 emit multiSelectionEnabled(false);
176 if (myFeatures.size() > 1)
177 blockSelection(true);
182 void PartSet_OperationEditLine::stopOperation()
184 emit multiSelectionEnabled(true);
186 blockSelection(false, myFeatures.size() > 1);
191 void PartSet_OperationEditLine::blockSelection(bool isBlocked, const bool isRestoreSelection)
193 if (myIsBlockedSelection == isBlocked)
196 myIsBlockedSelection = isBlocked;
198 emit setSelection(std::list<XGUI_ViewerPrs>());
199 emit stopSelection(myFeatures, true);
202 emit stopSelection(myFeatures, false);
203 if (isRestoreSelection)
204 emit setSelection(myFeatures);
208 boost::shared_ptr<ModelAPI_Feature> PartSet_OperationEditLine::createFeature(const bool /*theFlushMessage*/)
210 // do nothing in order to do not create a new feature
211 return boost::shared_ptr<ModelAPI_Feature>();
214 void PartSet_OperationEditLine::moveLinePoint(boost::shared_ptr<ModelAPI_Feature> theFeature,
215 double theDeltaX, double theDeltaY,
216 const std::string& theAttribute)
218 if (!theFeature || theFeature->getKind() != "SketchLine")
221 boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
222 if (!aData->isValid())
224 boost::shared_ptr<GeomDataAPI_Point2D> aPoint =
225 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(theAttribute));
227 aPoint->setValue(aPoint->x() + theDeltaX, aPoint->y() + theDeltaY);
230 void PartSet_OperationEditLine::sendFeatures()
232 static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_MOVED);
234 std::list<boost::shared_ptr<ModelAPI_Feature> > aFeatures;
235 std::list<XGUI_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast = myFeatures.end();
236 for (; anIt != aLast; anIt++) {
237 boost::shared_ptr<ModelAPI_Feature> aFeature = (*anIt).feature();
241 Model_FeatureUpdatedMessage aMessage(aFeature, anEvent);
242 Events_Loop::loop()->send(aMessage);
244 Events_Loop::loop()->flush(anEvent);