]> SALOME platform Git repositories - modules/shaper.git/blob - src/PartSet/PartSet_OperationSketchLine.cpp
Salome HOME
refs #30 - Sketch base GUI: create, draw lines
[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 int PartSet_OperationSketchLine::getSelectionMode(boost::shared_ptr<ModelAPI_Feature> theFeature) const
41 {
42   int aMode = 0;
43   if (theFeature != feature())
44     aMode = TopAbs_VERTEX;
45   return aMode;
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);
92     }
93     break;
94     default:
95       break;
96   }
97 }
98
99 void PartSet_OperationSketchLine::startOperation()
100 {
101   PartSet_OperationSketchBase::startOperation();
102
103   if (mySketch) {
104     boost::shared_ptr<SketchPlugin_Feature> aFeature = 
105                            boost::dynamic_pointer_cast<SketchPlugin_Feature>(mySketch);
106
107     aFeature->addSub(feature());
108   }
109   myPointSelectionMode = SM_FirstPoint;
110 }
111
112 void PartSet_OperationSketchLine::stopOperation()
113 {
114   PartSet_OperationSketchBase::stopOperation();
115   myPointSelectionMode = SM_None;
116 }
117
118 void PartSet_OperationSketchLine::setLinePoint(const gp_Pnt& thePoint,
119                                                const std::string& theAttribute)
120 {
121   boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
122   boost::shared_ptr<GeomDataAPI_Point2D> aPoint =
123         boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(theAttribute));
124
125   double aX = 0;
126   double anY = 0;
127   convertTo2D(thePoint, aX, anY);
128   aPoint->setValue(aX, anY);
129 }
130
131 void PartSet_OperationSketchLine::setLinePoint(boost::shared_ptr<ModelAPI_Feature> theSourceFeature,
132                                                const std::string& theSourceAttribute,
133                                                const std::string& theAttribute)
134 {
135   boost::shared_ptr<ModelAPI_Data> aData = theSourceFeature->data();
136   boost::shared_ptr<GeomDataAPI_Point2D> aPoint =
137         boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(theSourceAttribute));
138   double aX = aPoint->x();
139   double anY = aPoint->y();
140
141   aData = feature()->data();
142   aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(theAttribute));
143   aPoint->setValue(aX, anY);
144 }
145
146 void PartSet_OperationSketchLine::convertTo2D(const gp_Pnt& thePoint, double& theX, double& theY)
147 {
148   if (!mySketch)
149     return;
150
151   boost::shared_ptr<ModelAPI_AttributeDouble> anAttr;
152   boost::shared_ptr<ModelAPI_Data> aData = mySketch->data();
153
154   boost::shared_ptr<GeomDataAPI_Point> anOrigin = 
155     boost::dynamic_pointer_cast<GeomDataAPI_Point>(aData->attribute(SKETCH_ATTR_ORIGIN));
156
157   boost::shared_ptr<GeomDataAPI_Dir> aX = 
158     boost::dynamic_pointer_cast<GeomDataAPI_Dir>(aData->attribute(SKETCH_ATTR_DIRX));
159   boost::shared_ptr<GeomDataAPI_Dir> anY = 
160     boost::dynamic_pointer_cast<GeomDataAPI_Dir>(aData->attribute(SKETCH_ATTR_DIRY));
161
162   gp_Pnt aVec(thePoint.X() - anOrigin->x(), thePoint.Y() - anOrigin->y(), thePoint.Z() - anOrigin->z());
163   theX = aVec.X() * aX->x() + aVec.Y() * aX->y() + aVec.Z() * aX->z();
164   theY = aVec.X() * anY->x() + aVec.Y() * anY->y() + aVec.Z() * anY->z();
165 }