0027900: Coding rules - drop redundant Name parameter from V3d_Viewer constructor
[occt.git] / samples / mfc / standard / 08_HLR / src / SelectionDialog.cpp
1 // SelectionDialog.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5
6 #include "SelectionDialog.h"
7
8 #include "HLRApp.h"
9 #include "OCC_2dView.h"
10 #include <ISession2D/ISession2D_Shape.h>
11 #include "Prs3d_Projector.hxx"
12
13 #ifdef _DEBUG
14 //#define new DEBUG_NEW
15 #undef THIS_FILE
16 static char THIS_FILE[] = __FILE__;
17 #endif
18
19 // the key for shortcut ( use to activate dynamic rotation, panning )
20 #define CASCADESHORTCUTKEY MK_CONTROL
21
22 /////////////////////////////////////////////////////////////////////////////
23 // CSelectionDialog dialog
24
25 CSelectionDialog::CSelectionDialog (CHLRDoc* aDoc,CWnd* pParent /*=NULL*/)
26 : CDialog(CSelectionDialog::IDD, pParent)
27 {
28   myDoc =  aDoc;
29   myIsDisplayed = false;
30   //{{AFX_DATA_INIT(CSelectionDialog)
31   m_Algo        = 0;
32   m_DisplayMode = 0;
33   m_NbIsos      = 2;
34   m_DrawHiddenLine = TRUE;
35   m_HlrModeIsOn = TRUE;
36   //}}AFX_DATA_INIT
37 }
38
39 void CSelectionDialog::DoDataExchange (CDataExchange* pDX)
40 {
41   CDialog::DoDataExchange(pDX);
42   //{{AFX_DATA_MAP(CSelectionDialog)
43   DDX_Radio(pDX, IDC_PolyAlgo, m_Algo);
44   DDX_Radio(pDX, IDC_DisplayDefault, m_DisplayMode);
45   DDX_Text(pDX, IDC_EDIT_NBIsos, m_NbIsos);
46   DDX_Check(pDX, IDC_DrawHiddenLine, m_DrawHiddenLine);
47   DDX_Check(pDX, IDC_HlrModeIsOn, m_HlrModeIsOn);
48   //}}AFX_DATA_MAP
49 }
50
51
52 BEGIN_MESSAGE_MAP(CSelectionDialog, CDialog)
53   //{{AFX_MSG_MAP(CSelectionDialog)
54   ON_BN_CLICKED(ID_GetShape, OnGetSelectedShapes)
55   ON_BN_CLICKED(IDC_DisplayDefault, OnDisplayDefault)
56   ON_BN_CLICKED(IDC_VIsoParametrics, OnVIsoParametrics)
57   ON_BN_CLICKED(IDC_VApparentContour, OnVApparentContour)
58   ON_BN_CLICKED(IDC_VSewingEdges, OnVSewingEdges)
59   ON_BN_CLICKED(IDC_VsharpEdges, OnVsharpEdges)
60   ON_BN_CLICKED(IDC_VsmoothEdges, OnVsmoothEdges)
61   ON_BN_CLICKED(IDC_HsharpEdges, OnHsharpEdges)
62   ON_BN_CLICKED(IDC_HsmoothEdges, OnHsmoothEdges)
63   ON_BN_CLICKED(IDC_HSewingEdges, OnHSewingEdges)
64   ON_BN_CLICKED(IDC_HIsoParametrics, OnHIsoParametrics)
65   ON_BN_CLICKED(IDC_HApparentContour, OnHApparentContour)
66   ON_EN_CHANGE(IDC_EDIT_NBIsos, OnChangeEDITNBIsos)
67   ON_BN_CLICKED(IDC_Algo, OnAlgo)
68   ON_BN_CLICKED(IDC_PolyAlgo, OnPolyAlgo)
69   ON_BN_CLICKED(ID_Update2D, OnUpdate2D)
70   ON_BN_CLICKED(IDC_TopView, OnTopView)
71   ON_BN_CLICKED(IDC_BottomView, OnBottomView)
72   ON_BN_CLICKED(IDC_LeftView, OnLeftView)
73   ON_BN_CLICKED(IDC_RightView, OnRightView)
74   ON_BN_CLICKED(IDC_FrontView, OnFrontView)
75   ON_BN_CLICKED(IDC_BackView, OnBackView)
76   ON_BN_CLICKED(IDC_AxoView, OnAxoView)
77   ON_WM_LBUTTONDOWN()
78   ON_WM_LBUTTONUP()
79   ON_WM_RBUTTONDOWN()
80   ON_WM_RBUTTONUP()
81   ON_WM_MOUSEMOVE()
82   ON_BN_CLICKED(IDC_DrawHiddenLine, OnDrawHiddenLine)
83   ON_BN_CLICKED(IDC_HlrModeIsOn, OnHlrMode)
84   ON_WM_DRAWITEM()
85   ON_WM_PAINT()
86   //}}AFX_MSG_MAP
87 END_MESSAGE_MAP()
88
89 /////////////////////////////////////////////////////////////////////////////
90 // CSelectionDialog message handlers
91
92 BOOL CSelectionDialog::OnInitDialog()
93 {
94   CDialog::OnInitDialog();
95
96   VERIFY(TopView.AutoLoad (IDC_TopView, this));
97   VERIFY(BottomView.AutoLoad (IDC_BottomView, this)) ;
98   VERIFY(LeftView  .AutoLoad (IDC_LeftView  , this)) ;
99   VERIFY(RightView .AutoLoad (IDC_RightView , this)) ;
100   VERIFY(FrontView .AutoLoad (IDC_FrontView , this)) ;
101   VERIFY(BackView  .AutoLoad (IDC_BackView  , this)) ;
102   VERIFY(AxoView   .AutoLoad (IDC_AxoView   , this)) ;
103
104   // get the View Window position to managed mouse move
105   CRect BoxRect,ViewRect;
106   GetWindowRect (BoxRect);
107   CWnd * TheViewerWindow = GetDlgItem (IDC_HlrDlgView);
108   TheViewerWindow->GetWindowRect (ViewRect);
109   myPosMinX = ViewRect.TopLeft().x - BoxRect.TopLeft().x;
110   myPosMaxX = ViewRect.Width() + myPosMinX;
111   myPosMinY = ViewRect.TopLeft().y - BoxRect.TopLeft().y;
112   myPosMaxY = myPosMinY + ViewRect.Height();
113
114   ShowHideButton (Standard_False);
115   OnDisplay (true);
116
117   // return TRUE unless you set the focus to a control
118   // EXCEPTION: OCX Property Pages should return FALSE
119   return TRUE;
120 }
121
122 void CSelectionDialog::OnDisplay (bool isFit)
123 {
124   // GetDlgItem(IDC_HlrDlgView)->SetRedraw() wrapping of this method makes view blinking,
125   // but displaying of big models may be faster.
126   //GetDlgItem(IDC_HlrDlgView)->SetRedraw(true);
127   if (!myIsDisplayed)
128   {
129     Handle(Graphic3d_GraphicDriver) aGraphicDriver =
130       ((CHLRApp*)AfxGetApp())->GetGraphicDriver();
131
132     myActiveViewer = new V3d_Viewer (aGraphicDriver);
133     myActiveViewer->SetDefaultLights();
134     myActiveViewer->SetLightOn();
135     myActiveView = myActiveViewer->CreateView();
136
137     Handle(WNT_Window) aWNTWindow = new WNT_Window (GetDlgItem (IDC_HlrDlgView)->GetSafeHwnd(),
138                                                     Quantity_NOC_GRAY);
139     myActiveView->SetComputedMode (m_HlrModeIsOn != 0);
140     myActiveView->SetWindow(aWNTWindow);
141
142     myInteractiveContext = new AIS_InteractiveContext (myActiveViewer);
143
144     // TRIHEDRON
145     Handle(Geom_Axis2Placement) aTrihedronAxis = new Geom_Axis2Placement (gp::XOY());
146     myTrihedron = new AIS_Trihedron (aTrihedronAxis);
147
148     myInteractiveContext->Display (myTrihedron);
149     myIsDisplayed = Standard_True;
150   }
151   if(isFit)
152   {
153     myActiveView->ZFitAll();
154     myActiveView->FitAll();
155   }
156
157   myActiveView->Redraw();
158   //GetDlgItem (IDC_HlrDlgView)->SetRedraw (false);
159 }
160
161
162 void CSelectionDialog::SetTitle (const CString & aTitle)
163 {
164   SetWindowText (aTitle);
165 }
166
167 void CSelectionDialog::UpdateViews()
168 {
169   // Clear HLR dialog view
170   myInteractiveContext->RemoveAll();
171   myInteractiveContext->Display (myTrihedron);
172
173   UpdateProjector();
174
175   // Display chosen shapes in the HLR dialog view.
176   Standard_Boolean OneOrMoreFound = Standard_False;
177   for (myDoc->GetAISContext()->InitCurrent();
178        myDoc->GetAISContext()->MoreCurrent();
179        myDoc->GetAISContext()->NextCurrent())
180   {
181     Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast (myDoc->GetAISContext()->Current());
182     if (!anAISShape.IsNull())
183     {
184       OneOrMoreFound = Standard_True;
185       myInteractiveContext->Display (anAISShape);
186     }
187   }
188
189   // Apply HLR to chosen shapes and display result into the 2d view.
190   Apply();
191   // Update viewer
192   myDoc->FitAll2DViews (Standard_False);
193   // Check the selection: if no object : disable all possiblity.
194   ShowHideButton (OneOrMoreFound);
195   OnDisplay (true);
196 }
197
198 void CSelectionDialog::OnGetSelectedShapes()
199 {
200   // Create new displayable shape.
201   myDisplayableShape = new ISession2D_Shape();
202   UpdateProjector();
203   myDisplayableShape->SetNbIsos (m_NbIsos);
204
205   // Clear HLR dialog view
206   myInteractiveContext->RemoveAll();
207   myInteractiveContext->Display (myTrihedron);
208
209   Standard_Boolean OneOrMoreFound = Standard_False;
210   for (myDoc->GetAISContext()->InitCurrent();
211        myDoc->GetAISContext()->MoreCurrent();
212        myDoc->GetAISContext()->NextCurrent())
213   {
214     Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast (myDoc->GetAISContext()->Current());
215
216     if (!anAISShape.IsNull())
217     {
218       OneOrMoreFound = Standard_True;
219       TopoDS_Shape aShape = anAISShape->Shape();
220       myDisplayableShape->Add (aShape);
221       Handle(AIS_Shape) aSelectedShape = new AIS_Shape (aShape);
222       myInteractiveContext->Display (aSelectedShape);
223     }
224   }
225
226   // Apply HLR to chosen shapes and display result into the 2d view.
227   Apply();
228   // Update viewer
229   myDoc->FitAll2DViews (Standard_False);
230
231   // Check the selection: if no object : disable all possiblity.
232   ShowHideButton (OneOrMoreFound);
233   OnDisplay (true);
234 }
235
236 void CSelectionDialog::Apply()
237 {
238   SetCursor(AfxGetApp()->LoadStandardCursor (IDC_WAIT));
239   myDoc->GetInteractiveContext2D()->RemoveAll();
240   UpdateData (true);
241
242   Standard_Integer aDisplayMode = m_DisplayMode;
243
244   if (m_Algo == 1)
245   {
246     aDisplayMode += 100;
247   }
248
249   if (!m_DrawHiddenLine)
250   {
251     aDisplayMode += 1000;
252   }
253
254   myDoc->GetInteractiveContext2D()->Display (myDisplayableShape,  // object
255                                              aDisplayMode,
256                                              aDisplayMode,
257                                              Standard_True); // Redraw
258
259   SetCursor(AfxGetApp()->LoadStandardCursor (IDC_ARROW));
260 }
261
262 void CSelectionDialog::UpdateProjector()
263 {
264   V3d_Coordinate DX,DY,DZ,XAt,YAt,ZAt, Vx,Vy,Vz ;
265   myActiveView->Proj(DX,DY,DZ);
266   myActiveView->At(XAt,YAt,ZAt);
267   myActiveView->Up( Vx,Vy,Vz );
268   OnDisplay(false);
269   Standard_Boolean IsPerspective = (myActiveView->Type() == V3d_PERSPECTIVE);
270   Quantity_Length aFocus = 1;
271   Prs3d_Projector aPrs3dProjector(IsPerspective,aFocus,DX,DY,DZ,XAt,YAt,ZAt,Vx,Vy,Vz);
272   HLRAlgo_Projector aProjector = aPrs3dProjector.Projector();
273
274   if (myDisplayableShape.IsNull()) return;
275   myDisplayableShape->SetProjector(aProjector);
276 }
277
278 void CSelectionDialog::ShowHideButton(Standard_Boolean EnableButton)
279 {
280   UpdateData(true);
281
282   GetDlgItem(ID_Update2D          )->EnableWindow(EnableButton);
283   GetDlgItem(IDC_DisplayDefault   )->EnableWindow(EnableButton);
284   GetDlgItem(IDC_PolyAlgo         )->EnableWindow(EnableButton);
285   GetDlgItem(IDC_Algo             )->EnableWindow(EnableButton);
286
287   GetDlgItem(IDC_VsharpEdges      )->EnableWindow(EnableButton);
288   GetDlgItem(IDC_VsmoothEdges     )->EnableWindow(EnableButton);
289   GetDlgItem(IDC_VSewingEdges     )->EnableWindow(EnableButton);
290   GetDlgItem(IDC_VApparentContour )->EnableWindow(EnableButton);
291   GetDlgItem(IDC_VIsoParametrics  )->EnableWindow(EnableButton);
292
293   GetDlgItem(IDC_DrawHiddenLine   )->EnableWindow(EnableButton);
294
295   GetDlgItem(IDC_HsmoothEdges     )->EnableWindow(EnableButton && m_DrawHiddenLine);
296   GetDlgItem(IDC_HSewingEdges     )->EnableWindow(EnableButton && m_DrawHiddenLine);
297   GetDlgItem(IDC_HApparentContour )->EnableWindow(EnableButton && m_DrawHiddenLine);
298   GetDlgItem(IDC_HsharpEdges      )->EnableWindow(EnableButton && m_DrawHiddenLine);
299   GetDlgItem(IDC_HIsoParametrics  )->EnableWindow(EnableButton && m_DrawHiddenLine);
300
301   GetDlgItem(IDC_EDIT_NBIsos      )->EnableWindow(EnableButton);
302   GetDlgItem(IDC_STATIC_NbIsos    )->EnableWindow(EnableButton);
303
304   if(m_Algo == 0)
305   {
306     if (m_DisplayMode == 5 || m_DisplayMode == 10)
307     {
308       m_DisplayMode=0;
309     }
310
311     GetDlgItem(IDC_VIsoParametrics)->EnableWindow(false);
312     GetDlgItem(IDC_HIsoParametrics)->EnableWindow(false);
313     GetDlgItem(IDC_STATIC_NbIsos)  ->EnableWindow(false);
314     GetDlgItem(IDC_EDIT_NBIsos)    ->EnableWindow(false);
315   }
316   else
317   {
318     GetDlgItem(IDC_VIsoParametrics)->EnableWindow(true);
319     GetDlgItem(IDC_HIsoParametrics)->EnableWindow(m_DrawHiddenLine);
320     GetDlgItem(IDC_STATIC_NbIsos)  ->EnableWindow(true);
321     GetDlgItem(IDC_EDIT_NBIsos)    ->EnableWindow(true);
322   }
323   UpdateData(false);
324
325
326 void CSelectionDialog::OnDisplayDefault() 
327 { Apply(); }
328 void CSelectionDialog::OnVIsoParametrics() 
329 { Apply(); }
330 void CSelectionDialog::OnVApparentContour() 
331 { Apply(); }
332 void CSelectionDialog::OnVSewingEdges() 
333 { Apply(); }
334 void CSelectionDialog::OnVsharpEdges() 
335 { Apply(); }
336 void CSelectionDialog::OnVsmoothEdges() 
337 { Apply(); }
338 void CSelectionDialog::OnHsharpEdges() 
339 { Apply(); }
340 void CSelectionDialog::OnHsmoothEdges() 
341 { Apply(); }
342 void CSelectionDialog::OnHSewingEdges() 
343 { Apply(); }
344 void CSelectionDialog::OnHIsoParametrics() 
345 { Apply(); }
346 void CSelectionDialog::OnHApparentContour() 
347 { Apply(); }
348
349 void CSelectionDialog::OnChangeEDITNBIsos() 
350 {
351   UpdateData(true);
352   myDisplayableShape->SetNbIsos(m_NbIsos);
353   Apply(); 
354 }
355 void CSelectionDialog::OnAlgo() 
356 {
357   ShowHideButton();
358   Apply();
359 }
360
361 void CSelectionDialog::OnPolyAlgo() 
362 {
363   ShowHideButton();
364   Apply();
365 }
366
367 void CSelectionDialog::OnDrawHiddenLine() 
368 {
369   UpdateData(true);
370   if(m_DisplayMode >=6 )
371   {
372     m_DisplayMode=0;
373     UpdateData(false);
374   }
375   ShowHideButton();
376   Apply();
377 }
378
379 void CSelectionDialog::OnUpdate2D() 
380 {
381   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
382   myDoc->ActivateFrame(RUNTIME_CLASS(OCC_2dView),SW_NORMAL);
383   UpdateProjector();
384   Apply();
385   myDoc->FitAll2DViews(Standard_False);
386   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
387 }
388
389 void CSelectionDialog::OnTopView() 
390 {
391   myActiveView->SetProj(V3d_Zpos);
392   OnDisplay(true);
393 }
394
395 void CSelectionDialog::OnBottomView() 
396 {
397   myActiveView->SetProj(V3d_Zneg);
398   OnDisplay(true);
399 }
400
401 void CSelectionDialog::OnLeftView() 
402 {
403   myActiveView->SetProj(V3d_Xneg);
404   OnDisplay(true);
405 }
406
407 void CSelectionDialog::OnRightView() 
408 {
409   myActiveView->SetProj(V3d_Xpos);
410   OnDisplay(true);
411 }
412
413 void CSelectionDialog::OnFrontView() 
414 {
415   myActiveView->SetProj(V3d_Yneg);
416   OnDisplay(true);
417 }
418
419 void CSelectionDialog::OnBackView() 
420 {
421   myActiveView->SetProj(V3d_Ypos);
422   OnDisplay(true);
423 }
424
425 void CSelectionDialog::OnAxoView() 
426 {
427   myActiveView->SetProj(V3d_XposYnegZpos);
428   OnDisplay(true);
429 }
430
431 void CSelectionDialog::OnHlrMode()
432 {
433   UpdateData(true);
434
435   if (!m_HlrModeIsOn)
436   {
437     myActiveView->SetComputedMode (m_HlrModeIsOn != 0);
438   }
439   else
440   {
441     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
442     myActiveView->SetComputedMode (m_HlrModeIsOn != 0);
443     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
444   }
445   OnDisplay(false);
446 }
447
448 void CSelectionDialog::OnLButtonDown(UINT nFlags, CPoint point) 
449 {
450   CDialog::OnLButtonDown(nFlags, point);
451
452   if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
453     (myPosMinY > point.y) ||(myPosMaxY < point.y))
454     return;
455
456   //  save the current mouse coordinate
457   myXmax=point.x;  myYmax=point.y;
458 }
459
460 void CSelectionDialog::OnLButtonUp(UINT nFlags, CPoint point) 
461 {
462   CDialog::OnLButtonUp(nFlags, point);
463
464   if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
465     (myPosMinY > point.y) ||(myPosMaxY < point.y))
466     return;
467 }
468
469 void CSelectionDialog::OnRButtonDown(UINT nFlags, CPoint point) 
470 {
471   CDialog::OnRButtonDown(nFlags, point);
472
473   if ((myPosMinX > point.x) || (myPosMaxX < point.x) ||
474       (myPosMinY > point.y) || (myPosMaxY < point.y))
475   {
476     return;
477   }
478
479   if ( nFlags & CASCADESHORTCUTKEY )
480   {
481     if (m_HlrModeIsOn)
482     {
483       myActiveView->SetComputedMode (Standard_False);
484     }
485     myActiveView->StartRotation (point.x, point.y);
486     OnDisplay (false);
487   }
488 }
489
490 void CSelectionDialog::OnRButtonUp(UINT nFlags, CPoint point) 
491 {
492   CDialog::OnRButtonUp(nFlags, point);
493
494   if ((myPosMinX > point.x) || (myPosMaxX < point.x) ||
495       (myPosMinY > point.y) || (myPosMaxY < point.y))
496   {
497     return;
498   }
499
500   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
501   // reset the good HLR mode according to the stored one
502   //   --> dynamic rotation may have change it
503   myActiveView->SetComputedMode (m_HlrModeIsOn != 0);
504   OnDisplay(false);
505   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
506 }
507
508 void CSelectionDialog::OnMouseMove(UINT nFlags, CPoint point) 
509 {
510   CDialog::OnMouseMove(nFlags, point);
511
512   if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
513     (myPosMinY > point.y) ||(myPosMaxY < point.y))
514     return;
515
516   if ( nFlags & MK_LBUTTON)
517   {//left button
518     if ( nFlags & CASCADESHORTCUTKEY ) 
519     {
520       // move with MB1 and Control : on the dynamic zooming  
521       // Do the zoom in function of mouse's coordinates  
522       myActiveView->Zoom(myXmax,myYmax,point.x,point.y); 
523       // save the current mouse coordinate 
524       myXmax = point.x;    myYmax = point.y;    
525     }// if ( nFlags & CASCADESHORTCUTKEY )  else 
526   }
527   else if ( nFlags & MK_MBUTTON)
528   {
529     if ( nFlags & CASCADESHORTCUTKEY ) 
530     {
531       myActiveView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
532       myXmax = point.x; myYmax = point.y;       
533     }
534   }
535   else if ( nFlags & MK_RBUTTON)
536   {//right button
537     if ( nFlags & CASCADESHORTCUTKEY ) 
538     {
539       myActiveView->Rotation(point.x,point.y);
540     }
541   } 
542   else
543   {// No buttons 
544     myXmax = point.x; myYmax = point.y; 
545   }
546   OnDisplay(false);
547 }
548
549 void CSelectionDialog::OnOK() 
550 {
551   CDialog::OnOK();
552 }
553
554 void CSelectionDialog::OnPaint() 
555 {
556   OnDisplay(false);
557 }