]> SALOME platform Git repositories - modules/shaper.git/blob - src/PartSet/PartSet_OperationSketchLine.cpp
Salome HOME
Merge branch 'master' of newgeom:newgeom.git
[modules/shaper.git] / src / PartSet / PartSet_OperationSketchLine.cpp
1 // File:        PartSet_OperationSketchLine.h
2 // Created:     20 Apr 2014
3 // Author:      Natalia ERMOLAEVA
4
5 #include <PartSet_OperationSketchLine.h>
6
7 #include <SketchPlugin_Feature.h>
8 #include <GeomDataAPI_Point2D.h>
9 #include <GeomDataAPI_Point.h>
10 #include <GeomDataAPI_Dir.h>
11 #include <ModelAPI_Data.h>
12 #include <ModelAPI_Document.h>
13
14 #include <SketchPlugin_Sketch.h>
15 #include <SketchPlugin_Line.h>
16
17 #ifdef _DEBUG
18 #include <QDebug>
19 #endif
20
21 using namespace std;
22
23 PartSet_OperationSketchLine::PartSet_OperationSketchLine(const QString& theId,
24                                                   QObject* theParent,
25                                               boost::shared_ptr<ModelAPI_Feature> theFeature)
26 : PartSet_OperationSketchBase(theId, theParent), mySketch(theFeature),
27   myPointSelectionMode(SM_FirstPoint)
28 {
29 }
30
31 PartSet_OperationSketchLine::~PartSet_OperationSketchLine()
32 {
33 }
34
35 bool PartSet_OperationSketchLine::isGranted() const
36 {
37   return true;
38 }
39
40 std::list<int> PartSet_OperationSketchLine::getSelectionModes(boost::shared_ptr<ModelAPI_Feature> theFeature) const
41 {
42   std::list<int> aModes;
43   if (theFeature != feature())
44     aModes.push_back(TopAbs_VERTEX);
45   return aModes;
46 }
47
48 void PartSet_OperationSketchLine::mouseReleased(const gp_Pnt& thePoint)
49 {
50   switch (myPointSelectionMode)
51   {
52     case SM_FirstPoint: {
53       setLinePoint(thePoint, LINE_ATTR_START);
54       myPointSelectionMode = SM_SecondPoint;
55     }
56     break;
57     case SM_SecondPoint: {
58       setLinePoint(thePoint, LINE_ATTR_END);
59       myPointSelectionMode = SM_None;
60     }
61     break;
62     case SM_None: {
63
64     }
65     break;
66     default:
67       break;
68   }
69 }
70
71 void PartSet_OperationSketchLine::mouseMoved(const gp_Pnt& thePoint)
72 {
73   switch (myPointSelectionMode)
74   {
75     case SM_SecondPoint:
76       setLinePoint(thePoint, LINE_ATTR_END);
77       break;
78     case SM_None: {
79       boost::shared_ptr<ModelAPI_Feature> aPrevFeature = feature();
80       // stop the last operation
81       commitOperation();
82       document()->finishOperation();
83       //emit changeSelectionMode(aPrevFeature, TopAbs_VERTEX);
84       // start a new operation
85       document()->startOperation();
86       startOperation();
87       // use the last point of the previous feature as the first of the new one
88       setLinePoint(aPrevFeature, LINE_ATTR_END, LINE_ATTR_START);
89       myPointSelectionMode = SM_SecondPoint;
90
91       emit featureConstructed(aPrevFeature, FM_Deactivation);
92     }
93     break;
94     default:
95       break;
96   }
97 }
98
99 void PartSet_OperationSketchLine::keyReleased(const int theKey)
100 {
101   switch (theKey) {
102     case Qt::Key_Escape: {
103       if (myPointSelectionMode != SM_None)
104         emit featureConstructed(feature(), FM_Abort);
105       abort();
106     }
107     break;
108     case Qt::Key_Return: {
109       if (myPointSelectionMode != SM_None) {
110         emit featureConstructed(feature(), FM_Abort);
111         myPointSelectionMode = SM_FirstPoint;
112         document()->abortOperation();
113       }
114       else
115         myPointSelectionMode = SM_FirstPoint;
116     }
117     break;
118     default:
119     break;
120   }
121 }
122
123 void PartSet_OperationSketchLine::startOperation()
124 {
125   PartSet_OperationSketchBase::startOperation();
126   myPointSelectionMode = SM_FirstPoint;
127 }
128
129 void PartSet_OperationSketchLine::stopOperation()
130 {
131   PartSet_OperationSketchBase::stopOperation();
132   myPointSelectionMode = SM_None;
133 }
134
135 void PartSet_OperationSketchLine::createFeature()
136 {
137   PartSet_OperationSketchBase::createFeature();
138   if (mySketch) {
139     boost::shared_ptr<SketchPlugin_Feature> aFeature = 
140                            boost::dynamic_pointer_cast<SketchPlugin_Feature>(mySketch);
141
142     aFeature->addSub(feature());
143   }
144   //emit featureConstructed(aPrevFeature, FM_Activation);
145 }
146
147 void PartSet_OperationSketchLine::setLinePoint(const gp_Pnt& thePoint,
148                                                const std::string& theAttribute)
149 {
150   boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
151   boost::shared_ptr<GeomDataAPI_Point2D> aPoint =
152         boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(theAttribute));
153
154   double aX = 0;
155   double anY = 0;
156   convertTo2D(thePoint, aX, anY);
157   aPoint->setValue(aX, anY);
158 }
159
160 void PartSet_OperationSketchLine::setLinePoint(boost::shared_ptr<ModelAPI_Feature> theSourceFeature,
161                                                const std::string& theSourceAttribute,
162                                                const std::string& theAttribute)
163 {
164   boost::shared_ptr<ModelAPI_Data> aData = theSourceFeature->data();
165   boost::shared_ptr<GeomDataAPI_Point2D> aPoint =
166         boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(theSourceAttribute));
167   double aX = aPoint->x();
168   double anY = aPoint->y();
169
170   aData = feature()->data();
171   aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(theAttribute));
172   aPoint->setValue(aX, anY);
173 }
174
175 void PartSet_OperationSketchLine::convertTo2D(const gp_Pnt& thePoint, double& theX, double& theY)
176 {
177   if (!mySketch)
178     return;
179
180   boost::shared_ptr<ModelAPI_AttributeDouble> anAttr;
181   boost::shared_ptr<ModelAPI_Data> aData = mySketch->data();
182
183   boost::shared_ptr<GeomDataAPI_Point> anOrigin = 
184     boost::dynamic_pointer_cast<GeomDataAPI_Point>(aData->attribute(SKETCH_ATTR_ORIGIN));
185
186   boost::shared_ptr<GeomDataAPI_Dir> aX = 
187     boost::dynamic_pointer_cast<GeomDataAPI_Dir>(aData->attribute(SKETCH_ATTR_DIRX));
188   boost::shared_ptr<GeomDataAPI_Dir> anY = 
189     boost::dynamic_pointer_cast<GeomDataAPI_Dir>(aData->attribute(SKETCH_ATTR_DIRY));
190
191   gp_Pnt aVec(thePoint.X() - anOrigin->x(), thePoint.Y() - anOrigin->y(), thePoint.Z() - anOrigin->z());
192   theX = aVec.X() * aX->x() + aVec.Y() * aX->y() + aVec.Z() * aX->z();
193   theY = aVec.X() * anY->x() + aVec.Y() * anY->y() + aVec.Z() * anY->z();
194 }