Salome HOME
Clean Property panel before starting of a new operation.
[modules/shaper.git] / src / PartSet / PartSet_TestOCC.cpp
1 // File:        PartSet_TestOCC.h
2 // Created:     28 Apr 2014
3 // Author:      Natalia ERMOLAEVA
4
5 #include <PartSet_TestOCC.h>
6
7 #include <XGUI_Workshop.h>
8 #include <XGUI_OperationMgr.h>
9 #include <XGUI_Displayer.h>
10 #include <XGUI_ViewerPrs.h>
11 #include <XGUI_ViewerProxy.h>
12 #include <PartSet_OperationSketchLine.h>
13 #include <PartSet_Presentation.h>
14
15 #include <ModelAPI_Feature.h>
16
17 #include <SketchPlugin_Line.h>
18 #include <ModelAPI_Document.h>
19
20 static double myTestDelta;
21 static FeaturePtr myTestFeature;
22
23 #include <AIS_InteractiveContext.hxx>
24 #include <AIS_Shape.hxx>
25 #include <V3d_View.hxx>
26 #include <BRepBuilderAPI_MakeEdge.hxx>
27 #include <BRep_Tool.hxx>
28 #include <TopoDS_Shape.hxx>
29 #include <TopoDS_Edge.hxx>
30 #include <TopoDS.hxx>
31
32 void PartSet_TestOCC::testSelection(XGUI_Workshop* theWorkshop)
33 {
34   if (!myTestFeature) {
35     PartSet_TestOCC::createTestLine(theWorkshop);
36     PartSet_TestOCC::moveMouse(theWorkshop->viewer()->AISContext(),
37                                theWorkshop->viewer()->activeView());
38     PartSet_TestOCC::changeTestLine(theWorkshop);
39   }
40   Handle(AIS_InteractiveObject) anIO = theWorkshop->displayer()->getAISObject(myTestFeature);
41   if (!anIO.IsNull()) {
42     theWorkshop->viewer()->AISContext()->MoveTo(0, 0, theWorkshop->viewer()->activeView());
43     theWorkshop->viewer()->AISContext()->Select(0, 0, 2500, 2500, theWorkshop->viewer()->activeView());
44   }
45 }
46
47 void PartSet_TestOCC::local_selection_change_shape(Handle_AIS_InteractiveContext theContext,
48                                                    Handle_V3d_View theView)
49 {
50   // 1. Create shape
51   gp_Pnt aPnt1(100, 100, 0);
52   gp_Pnt aPnt2(150, 300, 0);
53   TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(aPnt1, aPnt2).Edge();
54
55   // 2. Display shape and activate it in the local context
56   Handle(AIS_Shape) anAIS = new AIS_Shape(anEdge);
57   if (!theContext->HasOpenedContext()) {
58     theContext->ClearCurrents(false);
59     theContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/);
60   }
61   theContext->Display(anAIS, false);
62   theContext->Load(anAIS, -1, true/*allow decomposition*/);
63   theContext->Activate(anAIS, AIS_Shape::SelectionMode(TopAbs_VERTEX));
64   theContext->Activate(anAIS, AIS_Shape::SelectionMode(TopAbs_EDGE));
65
66   // 3. Change selection in the viewer
67   // emulate rectangle selection in the viewer
68   theContext->Select(0, 0, 2500, 2500, theView);
69
70   // 3. Change the shape of AIS presentation
71   gp_Pnt aPnt3(-100, -100, 0);
72   gp_Pnt aPnt4(200, 200, 0);
73   TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(aPnt3, aPnt4).Edge();
74   anAIS->Set(anEdge2);
75   anAIS->Redisplay(Standard_True);
76   theContext->RecomputeSelectionOnly(anAIS);
77
78   // 4. Check the current viewer selection
79   Handle(AIS_InteractiveContext) aContext = theContext;
80   bool isFirstLinePoint = false;
81   bool isShapeSelected = false;
82   for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
83     TopoDS_Shape aShape = aContext->SelectedShape();
84     if (aShape.ShapeType() == TopAbs_VERTEX) {
85       const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape);
86       if (!aVertex.IsNull()) {
87         gp_Pnt aPoint = BRep_Tool::Pnt(aVertex);
88         double aD_1 = aPoint.Distance(aPnt1);
89         double aD_2 = aPoint.Distance(aPnt2);
90         isFirstLinePoint = aD_1 < Precision::Confusion() || aD_2 < Precision::Confusion();
91       }
92     }
93   }
94   if (isFirstLinePoint)
95     std::cout << "Error: The point of the first line should not be selected." << std::endl;
96 }
97
98 void PartSet_TestOCC::local_selection_erase(Handle_AIS_InteractiveContext theContext,
99                                     Handle_V3d_View theView)
100 {
101   // 1. Create shape
102   gp_Pnt aPnt1(100, 100, 0);
103   gp_Pnt aPnt2(150, 300, 0);
104   TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(aPnt1, aPnt2).Edge();
105
106   // 2. Display shape and activate it in the local context
107   Handle(AIS_Shape) anAIS = new AIS_Shape(anEdge);
108   if (!theContext->HasOpenedContext()) {
109     theContext->ClearCurrents(false);
110     theContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/);
111   }
112   theContext->Display(anAIS, false);
113   theContext->Load(anAIS, -1, true/*allow decomposition*/);
114   theContext->Activate(anAIS, AIS_Shape::SelectionMode(TopAbs_VERTEX));
115   theContext->Activate(anAIS, AIS_Shape::SelectionMode(TopAbs_EDGE));
116
117   // 3. Change selection in the viewer
118   // emulate rectangle selection in the viewer
119   theContext->Select(0, 0, 2500, 2500, theView);
120
121   theContext->Erase(anAIS);
122 }
123
124 void PartSet_TestOCC::createTestLine(XGUI_Workshop* theWorkshop)
125 {
126   myTestDelta = 80;
127
128   ModuleBase_Operation* anOperation = theWorkshop->operationMgr()->currentOperation();
129   PartSet_OperationSketchBase* aPreviewOp = dynamic_cast<PartSet_OperationSketchBase*>(anOperation);
130     FeaturePtr aSketch;
131
132   if (aPreviewOp) {
133     // create a line
134     boost::shared_ptr<ModelAPI_Document> aDoc = ModelAPI_PluginManager::get()->rootDocument();
135     FeaturePtr aFeature = aDoc->addFeature(
136                                                    PartSet_OperationSketchLine::Type().c_str());
137     if (aFeature) // TODO: generate an error if feature was not created
138       aFeature->execute();
139
140     boost::shared_ptr<SketchPlugin_Feature> aSketch = 
141                         boost::dynamic_pointer_cast<SketchPlugin_Feature>(aPreviewOp->sketch());
142     aSketch->addSub(aFeature);
143
144     PartSet_OperationSketchLine::setLinePoint(aFeature, 100, 100, LINE_ATTR_START);
145     PartSet_OperationSketchLine::setLinePoint(aFeature, 150, 300, LINE_ATTR_END);
146
147     boost::shared_ptr<GeomAPI_Shape> aPreview = PartSet_OperationSketchLine::preview(aFeature);
148
149     XGUI_Displayer* aDisplayer = theWorkshop->displayer();
150
151     Handle(AIS_InteractiveObject) anAIS = PartSet_Presentation::createPresentation(
152                            aFeature, aSketch,
153                            aPreview ? aPreview->impl<TopoDS_Shape>() : TopoDS_Shape(), NULL);
154     if (!anAIS.IsNull())
155       aDisplayer->redisplay(aFeature, anAIS, -1, false);
156
157     std::list<int> aModes;
158     aModes.push_back(TopAbs_VERTEX);
159     aModes.push_back(TopAbs_EDGE);
160     aDisplayer->activateInLocalContext(aFeature, aModes, true);
161
162     // change the line
163     /*double aDelta = -200;
164     for (int i = 0; i < 20; i++) {
165       aDelta = aDelta - i*2;
166       PartSet_OperationSketchLine::setLinePoint(aFeature, 100+aDelta, 200+aDelta, LINE_ATTR_START);
167       PartSet_OperationSketchLine::setLinePoint(aFeature, 300+aDelta, 500+aDelta, LINE_ATTR_END);
168
169       boost::shared_ptr<GeomAPI_Shape> aPreview = PartSet_OperationSketchLine::preview(aFeature);
170       Handle(AIS_InteractiveObject) anAIS = PartSet_Presentation::createPresentation(
171                              aFeature, aSketch,
172                              aPreview ? aPreview->impl<TopoDS_Shape>() : TopoDS_Shape(), NULL);
173       if (!anAIS.IsNull())
174         aDisplayer->redisplay(aFeature, anAIS, -1, true);
175
176       int aVal = 90;
177       for (int j = 0; j < 10000000; j++)
178         aVal = aVal/aVal+aVal*2;
179     }*/
180     //std::list<int> aModes;
181     //aModes.clear();
182     //aModes.push_back(TopAbs_VERTEX);
183     //aModes.push_back(TopAbs_EDGE);
184     //aDisplayer->activateInLocalContext(aFeature, aModes, true);
185     myTestFeature = aFeature;
186
187     std::list<XGUI_ViewerPrs> aPrs;
188     aPrs.push_back(XGUI_ViewerPrs(myTestFeature, TopoDS_Shape(), NULL));
189     aDisplayer->setSelected(aPrs, true);
190   }
191 }
192
193 void PartSet_TestOCC::changeTestLine(XGUI_Workshop* theWorkshop)
194 {
195   // change the line
196   if (!myTestFeature)
197     return;
198   FeaturePtr aFeature = myTestFeature;
199
200   myTestDelta = myTestDelta - 50;
201   double aDelta = myTestDelta;
202   PartSet_OperationSketchLine::setLinePoint(aFeature, -100/*aDelta*/, -100/*aDelta*/, LINE_ATTR_START);
203   PartSet_OperationSketchLine::setLinePoint(aFeature, 200/*aDelta*2*/, 200/*aDelta*2*/, LINE_ATTR_END);
204   boost::shared_ptr<GeomAPI_Shape> aPreview = PartSet_OperationSketchLine::preview(aFeature);
205
206   Handle(AIS_InteractiveObject) aPrevAIS;
207   FeaturePtr aSketch;//NULL
208   Handle(AIS_InteractiveObject) anAIS = PartSet_Presentation::createPresentation(
209                           aFeature, aSketch,
210                           aPreview ? aPreview->impl<TopoDS_Shape>() : TopoDS_Shape(),
211                           aPrevAIS);
212   if (!anAIS.IsNull())
213     theWorkshop->displayer()->redisplay(aFeature, anAIS, -1, true);
214   //std::list<int> aModes;
215   //aModes.clear();
216   //aModes.push_back(TopAbs_VERTEX);
217   //aModes.push_back(TopAbs_EDGE);
218   //aDisplayer->activateInLocalContext(aFeature, aModes, true);
219
220   /*std::list<XGUI_ViewerPrs> aPrs;
221   aPrs.push_back(XGUI_ViewerPrs(myTestFeature, TopoDS_Shape()));
222   theWorkshop->displayer()->setSelected(aPrs, true);*/
223
224   theWorkshop->displayer()->updateViewer();
225 }
226
227 void PartSet_TestOCC::moveMouse(Handle(AIS_InteractiveContext) theContext, Handle(V3d_View) theView)
228 {
229   theContext->MoveTo(10, 10, theView);
230   theContext->Select();
231 }