Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / occtdemo / Common / WNT / OCCDemoView.cpp
1 // OCCDemoView.cpp : implementation of the COCCDemoView class
2 //
3
4 #include "stdafx.h"
5 #include "MainFrm.h"
6 #include "OCCDemo.h"
7 #include "OCCDemoDoc.h"
8 #include "OCCDemoView.h"
9
10 #include <Graphic3d_GraphicDriver.hxx>
11 #include <V3d_Coordinate.hxx>
12
13 #define ValZWMin 1
14
15 #ifdef _DEBUG
16 #undef THIS_FILE
17 static char THIS_FILE[] = __FILE__;
18 #endif
19
20 /////////////////////////////////////////////////////////////////////////////
21 // COCCDemoView
22
23 IMPLEMENT_DYNCREATE(COCCDemoView, CView)
24
25 BEGIN_MESSAGE_MAP(COCCDemoView, CView)
26         //{{AFX_MSG_MAP(COCCDemoView)
27         ON_COMMAND(ID_BUTTONAxo, OnBUTTONAxo)
28         ON_COMMAND(ID_BUTTONBack, OnBUTTONBack)
29         ON_COMMAND(ID_BUTTONBottom, OnBUTTONBottom)
30         ON_COMMAND(ID_BUTTONFront, OnBUTTONFront)
31         ON_COMMAND(ID_BUTTONHlrOn, OnBUTTONHlrOn)
32         ON_COMMAND(ID_BUTTONLeft, OnBUTTONLeft)
33         ON_COMMAND(ID_BUTTONPan, OnBUTTONPan)
34         ON_COMMAND(ID_BUTTONPanGlo, OnBUTTONPanGlo)
35         ON_COMMAND(ID_BUTTONReset, OnBUTTONReset)
36         ON_COMMAND(ID_BUTTONRight, OnBUTTONRight)
37         ON_COMMAND(ID_BUTTONRot, OnBUTTONRot)
38         ON_COMMAND(ID_BUTTONTop, OnBUTTONTop)
39         ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll)
40         ON_WM_SIZE()
41         ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg)
42         ON_COMMAND(ID_BUTTONZoomWin, OnBUTTONZoomWin)
43         ON_WM_LBUTTONDOWN()
44         ON_WM_LBUTTONUP()
45         ON_WM_MOUSEMOVE()
46         ON_WM_RBUTTONDOWN()
47         ON_WM_RBUTTONUP()
48         ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo)
49         ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan)
50         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
51         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
52         ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
53         ON_COMMAND(ID_BUTTONWire, OnBUTTONWire)
54         ON_COMMAND(ID_BUTTONShade, OnBUTTONShade)
55         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn)
56         ON_UPDATE_COMMAND_UI(ID_BUTTONShade, OnUpdateBUTTONShade)
57         ON_UPDATE_COMMAND_UI(ID_BUTTONWire, OnUpdateBUTTONWire)
58         //}}AFX_MSG_MAP
59 END_MESSAGE_MAP()
60
61 /////////////////////////////////////////////////////////////////////////////
62 // COCCDemoView construction/destruction
63
64 COCCDemoView::COCCDemoView()
65 {
66   myXmin=0;
67   myYmin=0;  
68   myXmax=0;
69   myYmax=0;
70   myCurZoom=0;
71   myCurrentMode = CurAction3d_Nothing;
72   myVisMode = VIS_SHADE;
73   m_Pen = NULL;
74   myGraphicDriver = Handle(Graphic3d_GraphicDriver)::DownCast( 
75     ((COCCDemoApp*)AfxGetApp())->GetGraphicDevice()->GraphicDriver() );
76 }
77
78 COCCDemoView::~COCCDemoView()
79 {
80         if (!myView.IsNull())
81     myView->Remove();
82   if (m_Pen)
83     delete m_Pen;
84 }
85
86 BOOL COCCDemoView::PreCreateWindow(CREATESTRUCT& cs)
87 {
88         // TODO: Modify the Window class or styles here by modifying
89         //  the CREATESTRUCT cs
90
91         return CView::PreCreateWindow(cs);
92 }
93
94 /////////////////////////////////////////////////////////////////////////////
95 // COCCDemoView drawing
96
97 void COCCDemoView::OnInitialUpdate() 
98 {
99   CView::OnInitialUpdate();
100   
101   myView = GetDocument()->GetViewer()->CreateView();
102
103   Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice = 
104     ((COCCDemoApp*)AfxGetApp())->GetGraphicDevice();
105   
106   Handle(WNT_Window) aWNTWindow = new WNT_Window(theGraphicDevice,GetSafeHwnd ());
107   myView->SetWindow(aWNTWindow);
108   if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
109
110   myCurrentMode = CurAction3d_Nothing;
111   myVisMode = VIS_SHADE;
112   RedrawVisMode();
113 }
114
115 void COCCDemoView::OnDraw(CDC* pDC)
116 {
117         COCCDemoDoc* pDoc = GetDocument();
118         ASSERT_VALID(pDoc);
119         // TODO: add draw code for native data here
120   myView->Redraw();
121 }
122
123 /////////////////////////////////////////////////////////////////////////////
124 // COCCDemoView diagnostics
125
126 #ifdef _DEBUG
127 void COCCDemoView::AssertValid() const
128 {
129         CView::AssertValid();
130 }
131
132 void COCCDemoView::Dump(CDumpContext& dc) const
133 {
134         CView::Dump(dc);
135 }
136
137 COCCDemoDoc* COCCDemoView::GetDocument() // non-debug version is inline
138 {
139         ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COCCDemoDoc)));
140         return (COCCDemoDoc*)m_pDocument;
141 }
142 #endif //_DEBUG
143
144 /////////////////////////////////////////////////////////////////////////////
145 // COCCDemoView message handlers
146
147 void COCCDemoView::OnSize(UINT nType, int cx, int cy) 
148 {
149   if (!myView.IsNull())
150     myView->MustBeResized();
151 }
152
153 void COCCDemoView::OnBUTTONBack() 
154
155   myView->SetProj(V3d_Ypos);
156 }
157
158 void COCCDemoView::OnBUTTONFront() 
159
160         myView->SetProj(V3d_Yneg);
161 }
162
163 void COCCDemoView::OnBUTTONBottom() 
164
165         myView->SetProj(V3d_Zneg); 
166 }
167
168 void COCCDemoView::OnBUTTONTop() 
169
170         myView->SetProj(V3d_Zpos); 
171 }
172
173 void COCCDemoView::OnBUTTONLeft() 
174
175         myView->SetProj(V3d_Xneg);
176 }
177
178 void COCCDemoView::OnBUTTONRight() 
179
180         myView->SetProj(V3d_Xpos);
181 }
182
183 void COCCDemoView::OnBUTTONAxo() 
184
185         myView->SetProj(V3d_XposYnegZpos); 
186 }
187
188 void COCCDemoView::OnBUTTONPan() 
189 {
190   myCurrentMode = CurAction3d_DynamicPanning;
191 }
192
193 void COCCDemoView::OnBUTTONPanGlo() 
194 {
195   // save the current zoom value 
196   myCurZoom = myView->Scale();
197   // Do a Global Zoom 
198   myView->FitAll();
199   // Set the mode 
200   myCurrentMode = CurAction3d_GlobalPanning;
201 }
202
203 void COCCDemoView::OnBUTTONReset() 
204 {
205   myView->Reset();
206 }
207
208 void COCCDemoView::OnBUTTONRot() 
209 {
210   myCurrentMode = CurAction3d_DynamicRotation;
211 }
212
213 void COCCDemoView::OnBUTTONZoomAll() 
214 {
215   myView->FitAll();
216   myView->ZFitAll();
217 }
218
219 void COCCDemoView::OnBUTTONZoomProg() 
220 {
221   myCurrentMode = CurAction3d_DynamicZooming;
222 }
223
224 void COCCDemoView::OnBUTTONZoomWin() 
225 {
226   myCurrentMode = CurAction3d_WindowZooming;
227 }
228
229 void COCCDemoView::OnLButtonDown(UINT nFlags, CPoint point) 
230 {
231   //  save the current mouse coordinate in min 
232   myXmin=point.x;  myYmin=point.y;
233   myXmax=point.x;  myYmax=point.y;
234   
235   if ( ! (nFlags & MK_CONTROL) ) 
236   {
237     if (myCurrentMode == CurAction3d_DynamicRotation)
238     {
239       myView->SetComputedMode(Standard_False);
240       myView->StartRotation(point.x,point.y);  
241     }
242   }
243 }
244
245 void COCCDemoView::OnLButtonUp(UINT nFlags, CPoint point) 
246 {
247   if ( !(nFlags & MK_CONTROL) )
248   {
249     switch (myCurrentMode)
250     {
251     case CurAction3d_Nothing :
252       myXmax=point.x;  
253       myYmax=point.y;
254       break;
255     case CurAction3d_DynamicZooming :
256       myCurrentMode = CurAction3d_Nothing;
257       break;
258     case CurAction3d_WindowZooming :
259       DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
260       myXmax=point.x;
261       myYmax=point.y;
262       if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
263         // Test if the zoom window is greater than a minimale window.
264       {
265         // Do the zoom window between Pmin and Pmax
266         myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);  
267       }  
268       myCurrentMode = CurAction3d_Nothing;
269       break;
270     case CurAction3d_DynamicPanning :
271       myCurrentMode = CurAction3d_Nothing;
272       break;
273     case CurAction3d_GlobalPanning :
274       myView->Place(point.x,point.y,myCurZoom); 
275       myCurrentMode = CurAction3d_Nothing;
276       break;
277     case  CurAction3d_DynamicRotation :
278       if (myVisMode == VIS_HLR)
279       {
280         SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
281         myView->SetComputedMode(Standard_True);
282         SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
283       }
284       myCurrentMode = CurAction3d_Nothing;
285       break;
286     } //switch (myCurrentMode)
287   }
288 }
289
290 void COCCDemoView::OnRButtonDown(UINT nFlags, CPoint point) 
291 {
292   if ( nFlags & MK_CONTROL ) 
293   {
294     myView->SetComputedMode(Standard_False);
295     myView->StartRotation(point.x,point.y);  
296   }
297 }
298
299 void COCCDemoView::OnRButtonUp(UINT nFlags, CPoint point) 
300 {
301   if (myVisMode == VIS_HLR)
302   {
303     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
304     myView->SetComputedMode(Standard_True);
305     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
306   }
307 }
308
309 void COCCDemoView::OnMouseMove(UINT nFlags, CPoint point) 
310 {
311   //   ============================  LEFT BUTTON =======================
312   if ( nFlags & MK_LBUTTON)
313   {
314     if ( nFlags & MK_CONTROL ) 
315     {
316       // move with MB1 and Control : on the dynamic zooming  
317       // Do the zoom in function of mouse's coordinates  
318       myView->Zoom(myXmax,myYmax,point.x,point.y); 
319       // save the current mouse coordinate in max
320       myXmax = point.x; 
321       myYmax = point.y; 
322     }
323     else // if ( Ctrl )
324     {
325       switch (myCurrentMode)
326       {
327       case CurAction3d_Nothing :
328         myXmax = point.x;
329         myYmax = point.y;
330         break;
331       case CurAction3d_DynamicZooming :
332         myView->Zoom(myXmax,myYmax,point.x,point.y); 
333         // save the current mouse coordinate in max;
334         myXmax=point.x;
335         myYmax=point.y;
336         break;
337       case CurAction3d_WindowZooming :
338         myXmax = point.x; myYmax = point.y;     
339         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
340         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
341         break;
342       case CurAction3d_DynamicPanning :
343         myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
344         myXmax = point.x; myYmax = point.y;     
345         break;
346       case CurAction3d_GlobalPanning : // nothing           
347         break;
348       case  CurAction3d_DynamicRotation :
349         myView->Rotation(point.x,point.y);
350         myView->Redraw();
351         break;
352       }
353     }
354   }
355   //   ============================  MIDDLE BUTTON =======================
356   else if ( nFlags & MK_MBUTTON)
357   {
358     if ( nFlags & MK_CONTROL ) 
359     {
360       myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
361       myXmax = point.x; myYmax = point.y;       
362     }
363   }
364   //   ============================  RIGHT BUTTON =======================
365   else if ( nFlags & MK_RBUTTON)
366   {
367     if ( nFlags & MK_CONTROL ) 
368     {
369       myView->Rotation(point.x,point.y);
370     }
371   }
372   //   ============================  NO BUTTON =======================
373   else
374   {
375     myXmax = point.x;
376     myYmax = point.y;   
377   }
378 }
379
380 void COCCDemoView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) 
381 {
382   pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
383         pCmdUI->Enable   (myCurrentMode != CurAction3d_GlobalPanning);  
384 }
385
386 void COCCDemoView::OnUpdateBUTTONPan(CCmdUI* pCmdUI) 
387 {
388   pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
389         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicPanning );        
390 }
391
392 void COCCDemoView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) 
393 {
394   pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
395         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicZooming); 
396 }
397
398 void COCCDemoView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) 
399 {
400   pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
401         pCmdUI->Enable   (myCurrentMode != CurAction3d_WindowZooming);  
402 }
403
404 void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI) 
405 {
406   pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
407         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicRotation);        
408 }
409
410 void COCCDemoView::DrawRectangle(const Standard_Integer  MinX,
411                                         const Standard_Integer  MinY,
412                                         const Standard_Integer  MaxX,
413                                         const Standard_Integer  MaxY,
414                                         const Standard_Boolean  Draw, 
415                                         const LineStyle aLineStyle)
416 {
417   static int m_DrawMode;
418   if  (!m_Pen && aLineStyle ==Solid )
419   {
420     m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;
421   }
422   else if (!m_Pen && aLineStyle ==Dot )
423   {
424     m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0));   m_DrawMode = R2_XORPEN;
425   }
426   else if (!m_Pen && aLineStyle == ShortDash)
427   {
428     m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0)); m_DrawMode = R2_XORPEN;
429   }
430   else if (!m_Pen && aLineStyle == LongDash)
431   {
432     m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0));   m_DrawMode = R2_NOTXORPEN;
433   }
434   else if (aLineStyle == Default) 
435   {
436     m_Pen = NULL;       m_DrawMode = R2_MERGEPENNOT;
437   }
438
439   CPen* aOldPen;
440   CClientDC clientDC(this);
441   if (m_Pen) 
442     aOldPen = clientDC.SelectObject(m_Pen);
443   clientDC.SetROP2(m_DrawMode);
444
445   static                Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
446   static                Standard_Boolean m_IsVisible = Standard_False;
447
448   if ( m_IsVisible && !Draw) // move or up  : erase at the old position 
449   {
450     clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
451     clientDC.LineTo(StoredMaxX,StoredMaxY); 
452     clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
453     m_IsVisible = false;
454   }
455
456   StoredMinX = min ( MinX, MaxX );
457   StoredMinY = min ( MinY, MaxY );
458   StoredMaxX = max ( MinX, MaxX );
459   StoredMaxY = max ( MinY, MaxY);
460
461   if (Draw) // move : draw
462   {
463     clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
464     clientDC.LineTo(StoredMaxX,StoredMaxY); 
465     clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
466     m_IsVisible = true;
467   }
468
469   if (m_Pen) 
470     clientDC.SelectObject(aOldPen);
471 }
472
473 void COCCDemoView::InitButtons()
474 {
475   myXmin=0;
476   myYmin=0;  
477   myXmax=0;
478   myYmax=0;
479   myCurZoom=0;
480   myCurrentMode = CurAction3d_Nothing;
481 }
482
483 void COCCDemoView::Reset()
484 {
485   InitButtons();
486   myVisMode = VIS_SHADE;
487   if (!myView.IsNull())
488   {
489     RedrawVisMode();
490     myView->Reset();
491   }
492 }
493
494 void COCCDemoView::RedrawVisMode()
495 {
496   switch (myVisMode)
497   {
498   case VIS_WIREFRAME:
499     GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
500     myView->SetComputedMode (Standard_False);
501     break;
502   case VIS_SHADE:
503     GetDocument()->GetAISContext()->SetDisplayMode(AIS_Shaded);
504     myView->SetComputedMode (Standard_False);
505     break;
506   case VIS_HLR:
507     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
508     myView->SetComputedMode (Standard_True);
509     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
510     GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
511     break;
512   }
513 }
514
515 void COCCDemoView::OnBUTTONWire() 
516 {
517   myVisMode = VIS_WIREFRAME;
518   RedrawVisMode();
519 }
520
521 void COCCDemoView::OnBUTTONShade() 
522 {
523   myVisMode = VIS_SHADE;
524   RedrawVisMode();
525 }
526
527 void COCCDemoView::OnBUTTONHlrOn() 
528 {
529   myVisMode = VIS_HLR;
530   RedrawVisMode();
531 }
532
533 void COCCDemoView::OnUpdateBUTTONWire(CCmdUI* pCmdUI) 
534 {
535   pCmdUI->SetCheck (myVisMode == VIS_WIREFRAME);
536         pCmdUI->Enable   (myVisMode != VIS_WIREFRAME);  
537 }
538
539 void COCCDemoView::OnUpdateBUTTONShade(CCmdUI* pCmdUI) 
540 {
541   pCmdUI->SetCheck (myVisMode == VIS_SHADE);
542         pCmdUI->Enable   (myVisMode != VIS_SHADE);      
543 }
544
545 void COCCDemoView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI) 
546 {
547   pCmdUI->SetCheck (myVisMode == VIS_HLR);
548         pCmdUI->Enable   (myVisMode != VIS_HLR);        
549 }
550
551 void COCCDemoView::GetViewCenter(V3d_Coordinate& Xc, V3d_Coordinate& Yc)
552 {
553         myView->Center(Xc,Yc);
554 }
555
556 void COCCDemoView::SetViewCenter(V3d_Coordinate Xc, V3d_Coordinate Yc)
557 {
558         myView->SetCenter(Xc,Yc);
559 }
560
561 void COCCDemoView::GetViewEye(V3d_Coordinate& X, V3d_Coordinate& Y, V3d_Coordinate& Z)
562 {
563         myView->Eye(X,Y,Z);
564 }
565
566 void COCCDemoView::SetViewEye(V3d_Coordinate X, V3d_Coordinate Y, V3d_Coordinate Z)
567 {
568         myView->SetEye(X,Y,Z);
569 }
570
571 Quantity_Factor COCCDemoView::GetViewScale()
572 {
573         return myView->Scale();
574 }
575
576 void COCCDemoView::SetViewScale(Quantity_Factor Coef)
577 {
578         myView->SetScale(Coef);
579 }