0024372: HLR Sample: erased objects are shown in HLR
[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_DUMMYBUTTON);
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_DUMMYBUTTON)->SetRedraw (true);
125   if (!myIsDisplayed)
126   {
127     Handle(Graphic3d_GraphicDriver) aGraphicDriver = 
128       ((CHLRApp*)AfxGetApp())->GetGraphicDriver();
129
130     myActiveViewer = new V3d_Viewer (aGraphicDriver, (short *) "Visu3D");
131     myActiveViewer->SetDefaultLights();
132     myActiveViewer->SetLightOn();
133     myActiveView = myActiveViewer->CreateView();
134
135     Handle(WNT_Window) aWNTWindow = new WNT_Window (GetDlgItem (IDC_DUMMYBUTTON)->GetSafeHwnd(),
136                                                     Quantity_NOC_GRAY);
137     myActiveView->SetComputedMode (m_HlrModeIsOn);
138     myActiveView->SetWindow(aWNTWindow);
139
140     myInteractiveContext = new AIS_InteractiveContext (myActiveViewer);
141
142     // TRIHEDRON
143     Handle(Geom_Axis2Placement) aTrihedronAxis = new Geom_Axis2Placement (gp::XOY());
144     myTrihedron = new AIS_Trihedron (aTrihedronAxis);
145
146     myInteractiveContext->Display (myTrihedron);
147   }
148   if(isFit)
149   {
150     myActiveView->ZFitAll();
151     myActiveView->FitAll();
152   }
153
154   myActiveView->Redraw();
155   myIsDisplayed = Standard_True;
156   GetDlgItem (IDC_DUMMYBUTTON)->SetRedraw (false);
157 }
158
159
160 void CSelectionDialog::SetTitle (const CString & aTitle)
161 {
162   SetWindowText (aTitle);
163 }
164
165 void CSelectionDialog::UpdateViews()
166 {
167   // Clear HLR dialog view
168   myInteractiveContext->RemoveAll();
169   myInteractiveContext->Display (myTrihedron);
170
171   UpdateProjector();
172
173   // Display chosen shapes in the HLR dialog view.
174   Standard_Boolean OneOrMoreFound = Standard_False;
175   for (myDoc->GetAISContext()->InitCurrent();
176        myDoc->GetAISContext()->MoreCurrent();
177        myDoc->GetAISContext()->NextCurrent())
178   {
179     Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast (myDoc->GetAISContext()->Current());
180     if (!anAISShape.IsNull())
181     {
182       OneOrMoreFound = Standard_True;
183       myInteractiveContext->Display (anAISShape);
184     }
185   }
186
187   // Apply HLR to chosen shapes and display result into the 2d view.
188   Apply();
189   // Update viewer
190   myDoc->FitAll2DViews (Standard_False);
191   // Check the selection: if no object : disable all possiblity.
192   ShowHideButton (OneOrMoreFound);
193   OnDisplay (true);
194 }
195
196 void CSelectionDialog::OnGetSelectedShapes()
197 {
198   // Create new displayable shape.
199   myDisplayableShape = new ISession2D_Shape();
200   UpdateProjector();
201   myDisplayableShape->SetNbIsos (m_NbIsos);
202
203   // Clear HLR dialog view
204   myInteractiveContext->RemoveAll();
205   myInteractiveContext->Display (myTrihedron);
206
207   Standard_Boolean OneOrMoreFound = Standard_False;
208   for (myDoc->GetAISContext()->InitCurrent();
209        myDoc->GetAISContext()->MoreCurrent();
210        myDoc->GetAISContext()->NextCurrent())
211   {
212     Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast (myDoc->GetAISContext()->Current());
213
214     if (!anAISShape.IsNull())
215     {
216       OneOrMoreFound = Standard_True;
217       TopoDS_Shape aShape = anAISShape->Shape();
218       myDisplayableShape->Add (aShape);
219       myInteractiveContext->Display (anAISShape);
220     }
221   }
222
223   // Apply HLR to chosen shapes and display result into the 2d view.
224   Apply();
225   // Update viewer
226   myDoc->FitAll2DViews (Standard_False);
227
228   // Check the selection: if no object : disable all possiblity.
229   ShowHideButton (OneOrMoreFound);
230   OnDisplay (true);
231 }
232
233 void CSelectionDialog::Apply()
234 {
235   SetCursor(AfxGetApp()->LoadStandardCursor (IDC_WAIT));
236   myDoc->GetInteractiveContext2D()->RemoveAll();
237   UpdateData (true);
238
239   Standard_Integer aDisplayMode = m_DisplayMode;
240
241   if (m_Algo == 1)
242   {
243     aDisplayMode += 100;
244   }
245
246   if (!m_DrawHiddenLine)
247   {
248     aDisplayMode += 1000;
249   }
250
251   myDoc->GetInteractiveContext2D()->Display (myDisplayableShape,  // object
252                                              aDisplayMode,
253                                              aDisplayMode,
254                                              Standard_True); // Redraw
255
256   SetCursor(AfxGetApp()->LoadStandardCursor (IDC_ARROW));
257 }
258
259 void CSelectionDialog::UpdateProjector()
260 {
261   V3d_Coordinate DX,DY,DZ,XAt,YAt,ZAt, Vx,Vy,Vz ;
262   myActiveView->Proj(DX,DY,DZ);
263   myActiveView->At(XAt,YAt,ZAt);
264   myActiveView->Up( Vx,Vy,Vz );
265   OnDisplay(false);
266   Standard_Boolean IsPerspective = (myActiveView->Type() == V3d_PERSPECTIVE);
267   Quantity_Length aFocus = 1;
268   Prs3d_Projector aPrs3dProjector(IsPerspective,aFocus,DX,DY,DZ,XAt,YAt,ZAt,Vx,Vy,Vz);
269   HLRAlgo_Projector aProjector = aPrs3dProjector.Projector();
270
271   if (myDisplayableShape.IsNull()) return;
272   myDisplayableShape->SetProjector(aProjector);
273 }
274
275 void CSelectionDialog::ShowHideButton(Standard_Boolean EnableButton)
276 {
277   UpdateData(true);
278
279   GetDlgItem(ID_Update2D          )->EnableWindow(EnableButton);
280   GetDlgItem(IDC_DisplayDefault   )->EnableWindow(EnableButton);
281   GetDlgItem(IDC_PolyAlgo         )->EnableWindow(EnableButton);
282   GetDlgItem(IDC_Algo             )->EnableWindow(EnableButton);
283
284   GetDlgItem(IDC_VsharpEdges      )->EnableWindow(EnableButton);
285   GetDlgItem(IDC_VsmoothEdges     )->EnableWindow(EnableButton);
286   GetDlgItem(IDC_VSewingEdges     )->EnableWindow(EnableButton);
287   GetDlgItem(IDC_VApparentContour )->EnableWindow(EnableButton);
288   GetDlgItem(IDC_VIsoParametrics  )->EnableWindow(EnableButton);
289
290   GetDlgItem(IDC_DrawHiddenLine   )->EnableWindow(EnableButton);
291
292   GetDlgItem(IDC_HsmoothEdges     )->EnableWindow(EnableButton && m_DrawHiddenLine);
293   GetDlgItem(IDC_HSewingEdges     )->EnableWindow(EnableButton && m_DrawHiddenLine);
294   GetDlgItem(IDC_HApparentContour )->EnableWindow(EnableButton && m_DrawHiddenLine);
295   GetDlgItem(IDC_HsharpEdges      )->EnableWindow(EnableButton && m_DrawHiddenLine);
296   GetDlgItem(IDC_HIsoParametrics  )->EnableWindow(EnableButton && m_DrawHiddenLine);
297
298   GetDlgItem(IDC_EDIT_NBIsos      )->EnableWindow(EnableButton);
299   GetDlgItem(IDC_STATIC_NbIsos    )->EnableWindow(EnableButton);
300
301   if(m_Algo == 0)
302   {
303     if (m_DisplayMode == 5 || m_DisplayMode == 10)
304     {
305       m_DisplayMode=0;
306     }
307
308     GetDlgItem(IDC_VIsoParametrics)->EnableWindow(false);
309     GetDlgItem(IDC_HIsoParametrics)->EnableWindow(false);
310     GetDlgItem(IDC_STATIC_NbIsos)  ->EnableWindow(false);
311     GetDlgItem(IDC_EDIT_NBIsos)    ->EnableWindow(false);
312   }
313   else
314   {
315     GetDlgItem(IDC_VIsoParametrics)->EnableWindow(true);
316     GetDlgItem(IDC_HIsoParametrics)->EnableWindow(m_DrawHiddenLine);
317     GetDlgItem(IDC_STATIC_NbIsos)  ->EnableWindow(true);
318     GetDlgItem(IDC_EDIT_NBIsos)    ->EnableWindow(true);
319   }
320   UpdateData(false);
321
322
323 void CSelectionDialog::OnDisplayDefault() 
324 { Apply(); }
325 void CSelectionDialog::OnVIsoParametrics() 
326 { Apply(); }
327 void CSelectionDialog::OnVApparentContour() 
328 { Apply(); }
329 void CSelectionDialog::OnVSewingEdges() 
330 { Apply(); }
331 void CSelectionDialog::OnVsharpEdges() 
332 { Apply(); }
333 void CSelectionDialog::OnVsmoothEdges() 
334 { Apply(); }
335 void CSelectionDialog::OnHsharpEdges() 
336 { Apply(); }
337 void CSelectionDialog::OnHsmoothEdges() 
338 { Apply(); }
339 void CSelectionDialog::OnHSewingEdges() 
340 { Apply(); }
341 void CSelectionDialog::OnHIsoParametrics() 
342 { Apply(); }
343 void CSelectionDialog::OnHApparentContour() 
344 { Apply(); }
345
346 void CSelectionDialog::OnChangeEDITNBIsos() 
347 {
348   UpdateData(true);
349   myDisplayableShape->SetNbIsos(m_NbIsos);
350   Apply(); 
351 }
352 void CSelectionDialog::OnAlgo() 
353 {
354   ShowHideButton();
355   Apply();
356 }
357
358 void CSelectionDialog::OnPolyAlgo() 
359 {
360   ShowHideButton();
361   Apply();
362 }
363
364 void CSelectionDialog::OnDrawHiddenLine() 
365 {
366   UpdateData(true);
367   if(m_DisplayMode >=6 )
368   {
369     m_DisplayMode=0;
370     UpdateData(false);
371   }
372   ShowHideButton();
373   Apply();
374 }
375
376 void CSelectionDialog::OnUpdate2D() 
377 {
378   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
379   myDoc->ActivateFrame(RUNTIME_CLASS(OCC_2dView),SW_NORMAL);
380   UpdateProjector();
381   Apply();
382   myDoc->FitAll2DViews(Standard_False);
383   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
384 }
385
386 void CSelectionDialog::OnTopView() 
387 {
388   myActiveView->SetProj(V3d_Zpos);
389   OnDisplay(true);
390 }
391
392 void CSelectionDialog::OnBottomView() 
393 {
394   myActiveView->SetProj(V3d_Zneg);
395   OnDisplay(true);
396 }
397
398 void CSelectionDialog::OnLeftView() 
399 {
400   myActiveView->SetProj(V3d_Ypos);
401   OnDisplay(true);
402 }
403
404 void CSelectionDialog::OnRightView() 
405 {
406   myActiveView->SetProj(V3d_Yneg);
407   OnDisplay(true);
408 }
409
410 void CSelectionDialog::OnFrontView() 
411 {
412   myActiveView->SetProj(V3d_Xpos);
413   OnDisplay(true);
414 }
415
416 void CSelectionDialog::OnBackView() 
417 {
418   myActiveView->SetProj(V3d_Xneg);
419   OnDisplay(true);
420 }
421
422 void CSelectionDialog::OnAxoView() 
423 {
424   myActiveView->SetProj(V3d_XposYnegZpos);
425   OnDisplay(true);
426 }
427
428 void CSelectionDialog::OnHlrMode()
429 {
430   UpdateData(true);
431
432   if (!m_HlrModeIsOn)
433   {
434     myActiveView->SetComputedMode (m_HlrModeIsOn);
435   }
436   else
437   {
438     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
439     myActiveView->SetComputedMode (m_HlrModeIsOn);
440     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
441   }
442   OnDisplay(false);
443 }
444
445 void CSelectionDialog::OnLButtonDown(UINT nFlags, CPoint point) 
446 {
447   CDialog::OnLButtonDown(nFlags, point);
448
449   if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
450     (myPosMinY > point.y) ||(myPosMaxY < point.y))
451     return;
452
453   //  save the current mouse coordinate
454   myXmax=point.x;  myYmax=point.y;
455 }
456
457 void CSelectionDialog::OnLButtonUp(UINT nFlags, CPoint point) 
458 {
459   CDialog::OnLButtonUp(nFlags, point);
460
461   if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
462     (myPosMinY > point.y) ||(myPosMaxY < point.y))
463     return;
464 }
465
466 void CSelectionDialog::OnRButtonDown(UINT nFlags, CPoint point) 
467 {
468   CDialog::OnRButtonDown(nFlags, point);
469
470   if ((myPosMinX > point.x) || (myPosMaxX < point.x) ||
471       (myPosMinY > point.y) || (myPosMaxY < point.y))
472   {
473     return;
474   }
475
476   if ( nFlags & CASCADESHORTCUTKEY )
477   {
478     if (m_HlrModeIsOn)
479     {
480       myActiveView->SetComputedMode (Standard_False);
481     }
482     myActiveView->StartRotation (point.x, point.y);
483     OnDisplay (false);
484   }
485 }
486
487 void CSelectionDialog::OnRButtonUp(UINT nFlags, CPoint point) 
488 {
489   CDialog::OnRButtonUp(nFlags, point);
490
491   if ((myPosMinX > point.x) || (myPosMaxX < point.x) ||
492       (myPosMinY > point.y) || (myPosMaxY < point.y))
493   {
494     return;
495   }
496
497   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
498   // reset the good HLR mode according to the stored one
499   //   --> dynamic rotation may have change it
500   myActiveView->SetComputedMode (m_HlrModeIsOn);
501   OnDisplay(false);
502   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
503 }
504
505 void CSelectionDialog::OnMouseMove(UINT nFlags, CPoint point) 
506 {
507   CDialog::OnMouseMove(nFlags, point);
508
509   if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
510     (myPosMinY > point.y) ||(myPosMaxY < point.y))
511     return;
512
513   if ( nFlags & MK_LBUTTON)
514   {//left button
515     if ( nFlags & CASCADESHORTCUTKEY ) 
516     {
517       // move with MB1 and Control : on the dynamic zooming  
518       // Do the zoom in function of mouse's coordinates  
519       myActiveView->Zoom(myXmax,myYmax,point.x,point.y); 
520       // save the current mouse coordinate 
521       myXmax = point.x;    myYmax = point.y;    
522     }// if ( nFlags & CASCADESHORTCUTKEY )  else 
523   }
524   else if ( nFlags & MK_MBUTTON)
525   {
526     if ( nFlags & CASCADESHORTCUTKEY ) 
527     {
528       myActiveView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
529       myXmax = point.x; myYmax = point.y;       
530     }
531   }
532   else if ( nFlags & MK_RBUTTON)
533   {//right button
534     if ( nFlags & CASCADESHORTCUTKEY ) 
535     {
536       myActiveView->Rotation(point.x,point.y);
537     }
538   } 
539   else
540   {// No buttons 
541     myXmax = point.x; myYmax = point.y; 
542   }
543   OnDisplay(false);
544 }
545
546 void CSelectionDialog::OnOK() 
547 {
548   CDialog::OnOK();
549 }
550
551 void CSelectionDialog::OnPaint() 
552 {
553   CPaintDC dc(this); // device context for painting
554   OnDisplay(false);
555 }