4dffd897683343561044b353d8524a6ba15425f4
[occt.git] / src / ViewerTest / ViewerTest_EventManager.cxx
1 // Created on: 1998-08-27
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1998-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <ViewerTest_EventManager.hxx>
18
19 #include <AIS_AnimationCamera.hxx>
20 #include <AIS_InteractiveContext.hxx>
21 #include <AIS_Shape.hxx>
22 #include <Aspect_Grid.hxx>
23 #include <Draw.hxx>
24 #include <ViewerTest_V3dView.hxx>
25
26 Standard_IMPORT Standard_Boolean Draw_Interprete (const char* theCommand);
27
28 IMPLEMENT_STANDARD_RTTIEXT(ViewerTest_EventManager,Standard_Transient)
29
30 //=======================================================================
31 //function : GlobalViewAnimation
32 //purpose  :
33 //=======================================================================
34 const Handle(AIS_AnimationCamera)& ViewerTest_EventManager::GlobalViewAnimation()
35 {
36   static Handle(AIS_AnimationCamera) THE_CAMERA_ANIM = new AIS_AnimationCamera ("ViewerTest_EventManager_ViewAnimation", Handle(V3d_View)());
37   return THE_CAMERA_ANIM;
38 }
39
40 //=======================================================================
41 //function : ViewerTest_EventManager
42 //purpose  :
43 //=======================================================================
44 ViewerTest_EventManager::ViewerTest_EventManager (const Handle(V3d_View)&               theView,
45                                                   const Handle(AIS_InteractiveContext)& theCtx)
46 : myCtx  (theCtx),
47   myView (theView),
48   myToPickPnt (Standard_False)
49 {
50   myViewAnimation = GlobalViewAnimation();
51 }
52
53 //=======================================================================
54 //function : ~ViewerTest_EventManager
55 //purpose  :
56 //=======================================================================
57 ViewerTest_EventManager::~ViewerTest_EventManager()
58 {
59   if (!myViewAnimation.IsNull()
60     && myViewAnimation->View() == myView)
61   {
62     myViewAnimation->Stop();
63     myViewAnimation->SetView (Handle(V3d_View)());
64   }
65 }
66
67 //=======================================================================
68 //function : UpdateMouseButtons
69 //purpose  :
70 //=======================================================================
71 bool ViewerTest_EventManager::UpdateMouseButtons (const Graphic3d_Vec2i& thePoint,
72                                                   Aspect_VKeyMouse theButtons,
73                                                   Aspect_VKeyFlags theModifiers,
74                                                   bool theIsEmulated)
75 {
76   SetAllowRotation (!ViewerTest_V3dView::IsCurrentViewIn2DMode());
77
78   if (theButtons == Aspect_VKeyMouse_LeftButton)
79   {
80     if (myToPickPnt && (theModifiers & Aspect_VKeyFlags_CTRL) != 0)
81     {
82       Graphic3d_Vec3d anXYZ;
83       myView->Convert (thePoint.x(), thePoint.y(), anXYZ.x(), anXYZ.y(), anXYZ.z());
84       Draw::Set (myPickPntArgVec[0].ToCString(), anXYZ.x());
85       Draw::Set (myPickPntArgVec[1].ToCString(), anXYZ.y());
86       Draw::Set (myPickPntArgVec[2].ToCString(), anXYZ.z());
87       myToPickPnt = false;
88     }
89   }
90
91   return AIS_ViewController::UpdateMouseButtons (thePoint, theButtons, theModifiers, theIsEmulated);
92 }
93
94 //==============================================================================
95 //function : ProcessExpose
96 //purpose  :
97 //==============================================================================
98 void ViewerTest_EventManager::ProcessExpose()
99 {
100   if (!myView.IsNull())
101   {
102     myView->Invalidate();
103     FlushViewEvents (myCtx, myView, true);
104   }
105 }
106
107 //==============================================================================
108 //function : ProcessConfigure
109 //purpose  :
110 //==============================================================================
111 void ViewerTest_EventManager::ProcessConfigure()
112 {
113   if (!myView.IsNull())
114   {
115     myView->MustBeResized();
116     FlushViewEvents (myCtx, myView, true);
117   }
118 }
119
120 //=======================================================================
121 //function : KeyUp
122 //purpose  :
123 //=======================================================================
124 void ViewerTest_EventManager::KeyUp (Aspect_VKey theKey,
125                                      double theTime)
126 {
127   AIS_ViewController::KeyUp (theKey, theTime);
128   ProcessKeyPress (theKey);
129 }
130
131 //==============================================================================
132 //function : ProcessKeyPress
133 //purpose  :
134 //==============================================================================
135 void ViewerTest_EventManager::ProcessKeyPress (Aspect_VKey theKey)
136 {
137   if (myCtx.IsNull()
138    || myView.IsNull())
139   {
140     return;
141   }
142
143   switch (theKey)
144   {
145     case Aspect_VKey_A: // AXO
146     {
147       if (!ViewerTest_V3dView::IsCurrentViewIn2DMode())
148       {
149         myView->SetProj(V3d_XposYnegZpos);
150       }
151       break;
152     }
153     case Aspect_VKey_D: // Reset
154     {
155       if (!ViewerTest_V3dView::IsCurrentViewIn2DMode())
156       {
157         myView->Reset();
158       }
159       break;
160     }
161     case Aspect_VKey_F:
162     {
163       if (myCtx->NbSelected() > 0)
164       {
165         myCtx->FitSelected (myView);
166       }
167       else
168       {
169         myView->FitAll();
170       }
171       break;
172     }
173     case Aspect_VKey_H: // HLR
174     {
175       std::cout << "HLR\n";
176       myView->SetComputedMode (!myView->ComputedMode());
177       myView->Redraw();
178       break;
179     }
180     case Aspect_VKey_P: // Type of HLR
181     {
182       myCtx->DefaultDrawer()->SetTypeOfHLR (myCtx->DefaultDrawer()->TypeOfHLR() == Prs3d_TOH_Algo
183                                           ? Prs3d_TOH_PolyAlgo
184                                           : Prs3d_TOH_Algo);
185       if (myCtx->NbSelected() == 0)
186       {
187         AIS_ListOfInteractive aListOfShapes;
188         myCtx->DisplayedObjects (aListOfShapes);
189         for (AIS_ListIteratorOfListOfInteractive anIter (aListOfShapes); anIter.More(); anIter.Next())
190         {
191           if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (anIter.Value()))
192           {
193             aShape->SetTypeOfHLR (aShape->TypeOfHLR() == Prs3d_TOH_PolyAlgo
194                                 ? Prs3d_TOH_Algo
195                                 : Prs3d_TOH_PolyAlgo);
196             myCtx->Redisplay (aShape, Standard_False);
197           }
198         }
199       }
200       else
201       {
202         for (myCtx->InitSelected(); myCtx->MoreSelected(); myCtx->NextSelected())
203         {
204           if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (myCtx->SelectedInteractive()))
205           {
206             aShape->SetTypeOfHLR (aShape->TypeOfHLR() == Prs3d_TOH_PolyAlgo
207                                 ? Prs3d_TOH_Algo
208                                 : Prs3d_TOH_PolyAlgo);
209             myCtx->Redisplay (aShape, Standard_False);
210           }
211         }
212       }
213       myCtx->UpdateCurrentViewer();
214       break;
215     }
216     case Aspect_VKey_S:
217     case Aspect_VKey_W:
218     {
219       Standard_Integer aDispMode = AIS_Shaded;
220       if (theKey == Aspect_VKey_S)
221       {
222         aDispMode = AIS_Shaded;
223         std::cout << "setup Shaded display mode\n";
224       }
225       else
226       {
227         aDispMode = AIS_WireFrame;
228         std::cout << "setup WireFrame display mode\n";
229       }
230
231       if (myCtx->NbSelected() == 0)
232       {
233         myCtx->SetDisplayMode (aDispMode, true);
234       }
235       else
236       {
237         for (myCtx->InitSelected(); myCtx->MoreSelected(); myCtx->NextSelected())
238         {
239           myCtx->SetDisplayMode (myCtx->SelectedInteractive(), aDispMode, false);
240         }
241         myCtx->UpdateCurrentViewer();
242       }
243       break;
244     }
245     case Aspect_VKey_U: // Unset display mode
246     {
247       std::cout << "reset display mode to defaults\n";
248       if (myCtx->NbSelected() == 0)
249       {
250         myCtx->SetDisplayMode (AIS_WireFrame, true);
251       }
252       else
253       {
254         for (myCtx->InitSelected(); myCtx->MoreSelected(); myCtx->NextSelected())
255         {
256           myCtx->UnsetDisplayMode (myCtx->SelectedInteractive(), false);
257         }
258         myCtx->UpdateCurrentViewer();
259       }
260       break;
261     }
262     case Aspect_VKey_T:
263     {
264       if (!ViewerTest_V3dView::IsCurrentViewIn2DMode())
265       {
266         myView->SetProj (V3d_TypeOfOrientation_Zup_Top);
267       }
268       break;
269     }
270     case Aspect_VKey_B:
271     {
272       if (!ViewerTest_V3dView::IsCurrentViewIn2DMode())
273       {
274         myView->SetProj (V3d_TypeOfOrientation_Zup_Bottom);
275       }
276       break;
277     }
278     case Aspect_VKey_L:
279     {
280       if (!ViewerTest_V3dView::IsCurrentViewIn2DMode())
281       {
282         myView->SetProj (V3d_TypeOfOrientation_Zup_Left);
283       }
284       break;
285     }
286     case Aspect_VKey_R:
287     {
288       if (!ViewerTest_V3dView::IsCurrentViewIn2DMode())
289       {
290         myView->SetProj (V3d_TypeOfOrientation_Zup_Right);
291       }
292       break;
293     }
294     case Aspect_VKey_Comma:
295     {
296       myCtx->HilightNextDetected (myView);
297       break;
298     }
299     case Aspect_VKey_Period:
300     {
301       myCtx->HilightPreviousDetected (myView);
302       break;
303     }
304     case Aspect_VKey_Slash:
305     case Aspect_VKey_NumpadDivide:
306     {
307       Handle(Graphic3d_Camera) aCamera = myView->Camera();
308       if (aCamera->IsStereo())
309       {
310         aCamera->SetIOD (aCamera->GetIODType(), aCamera->IOD() - 0.01);
311         myView->Redraw();
312       }
313       break;
314     }
315     case Aspect_VKey_NumpadMultiply:
316     {
317       Handle(Graphic3d_Camera) aCamera = myView->Camera();
318       if (aCamera->IsStereo())
319       {
320         aCamera->SetIOD (aCamera->GetIODType(), aCamera->IOD() + 0.01);
321         myView->Redraw();
322       }
323       break;
324     }
325     case Aspect_VKey_Delete:
326     {
327       if (!myCtx.IsNull()
328         && myCtx->NbSelected() > 0)
329       {
330         Draw_Interprete ("verase");
331       }
332       break;
333     }
334     case Aspect_VKey_Escape:
335     {
336       if (!myCtx.IsNull()
337         && ViewerTest_EventManager::ToCloseViewOnEscape())
338       {
339         Draw_Interprete (ViewerTest_EventManager::ToExitOnCloseView() ? "exit" : "vclose");
340       }
341     }
342   }
343
344   if (theKey >= Aspect_VKey_0
345    && theKey <= Aspect_VKey_7)
346   {
347     const Standard_Integer aSelMode = theKey - Aspect_VKey_0;
348     bool toEnable = true;
349     if (!myCtx.IsNull())
350     {
351       AIS_ListOfInteractive aPrsList;
352       myCtx->DisplayedObjects (aPrsList);
353       for (AIS_ListOfInteractive::Iterator aPrsIter (aPrsList); aPrsIter.More() && toEnable; aPrsIter.Next())
354       {
355         TColStd_ListOfInteger aModes;
356         myCtx->ActivatedModes (aPrsIter.Value(), aModes);
357         for (TColStd_ListOfInteger::Iterator aModeIter (aModes); aModeIter.More() && toEnable; aModeIter.Next())
358         {
359           if (aModeIter.Value() == aSelMode)
360           {
361             toEnable = false;
362           }
363         }
364       }
365     }
366     TCollection_AsciiString aCmd = TCollection_AsciiString ("vselmode ") + aSelMode + (toEnable ? " 1" : " 0");
367     Draw_Interprete (aCmd.ToCString());
368   }
369 }