Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / occtdemo / Common / WNT / OCCDemoView.cpp
CommitLineData
7fd59977 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
17static char THIS_FILE[] = __FILE__;
18#endif
19
20/////////////////////////////////////////////////////////////////////////////
21// COCCDemoView
22
23IMPLEMENT_DYNCREATE(COCCDemoView, CView)
24
25BEGIN_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
59END_MESSAGE_MAP()
60
61/////////////////////////////////////////////////////////////////////////////
62// COCCDemoView construction/destruction
63
64COCCDemoView::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
78COCCDemoView::~COCCDemoView()
79{
80 if (!myView.IsNull())
81 myView->Remove();
82 if (m_Pen)
83 delete m_Pen;
84}
85
86BOOL 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
97void 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
115void 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
127void COCCDemoView::AssertValid() const
128{
129 CView::AssertValid();
130}
131
132void COCCDemoView::Dump(CDumpContext& dc) const
133{
134 CView::Dump(dc);
135}
136
137COCCDemoDoc* 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
147void COCCDemoView::OnSize(UINT nType, int cx, int cy)
148{
149 if (!myView.IsNull())
150 myView->MustBeResized();
151}
152
153void COCCDemoView::OnBUTTONBack()
154{
155 myView->SetProj(V3d_Ypos);
156}
157
158void COCCDemoView::OnBUTTONFront()
159{
160 myView->SetProj(V3d_Yneg);
161}
162
163void COCCDemoView::OnBUTTONBottom()
164{
165 myView->SetProj(V3d_Zneg);
166}
167
168void COCCDemoView::OnBUTTONTop()
169{
170 myView->SetProj(V3d_Zpos);
171}
172
173void COCCDemoView::OnBUTTONLeft()
174{
175 myView->SetProj(V3d_Xneg);
176}
177
178void COCCDemoView::OnBUTTONRight()
179{
180 myView->SetProj(V3d_Xpos);
181}
182
183void COCCDemoView::OnBUTTONAxo()
184{
185 myView->SetProj(V3d_XposYnegZpos);
186}
187
188void COCCDemoView::OnBUTTONPan()
189{
190 myCurrentMode = CurAction3d_DynamicPanning;
191}
192
193void 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
203void COCCDemoView::OnBUTTONReset()
204{
205 myView->Reset();
206}
207
208void COCCDemoView::OnBUTTONRot()
209{
210 myCurrentMode = CurAction3d_DynamicRotation;
211}
212
213void COCCDemoView::OnBUTTONZoomAll()
214{
215 myView->FitAll();
216 myView->ZFitAll();
217}
218
219void COCCDemoView::OnBUTTONZoomProg()
220{
221 myCurrentMode = CurAction3d_DynamicZooming;
222}
223
224void COCCDemoView::OnBUTTONZoomWin()
225{
226 myCurrentMode = CurAction3d_WindowZooming;
227}
228
229void 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
245void 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
290void 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
299void 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
309void 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
380void COCCDemoView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI)
381{
382 pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
383 pCmdUI->Enable (myCurrentMode != CurAction3d_GlobalPanning);
384}
385
386void COCCDemoView::OnUpdateBUTTONPan(CCmdUI* pCmdUI)
387{
388 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
389 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicPanning );
390}
391
392void COCCDemoView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI)
393{
394 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
395 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicZooming);
396}
397
398void COCCDemoView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI)
399{
400 pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
401 pCmdUI->Enable (myCurrentMode != CurAction3d_WindowZooming);
402}
403
404void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI)
405{
406 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
407 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicRotation);
408}
409
410void 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
473void COCCDemoView::InitButtons()
474{
475 myXmin=0;
476 myYmin=0;
477 myXmax=0;
478 myYmax=0;
479 myCurZoom=0;
480 myCurrentMode = CurAction3d_Nothing;
481}
482
483void COCCDemoView::Reset()
484{
485 InitButtons();
486 myVisMode = VIS_SHADE;
487 if (!myView.IsNull())
488 {
489 RedrawVisMode();
490 myView->Reset();
491 }
492}
493
494void 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
515void COCCDemoView::OnBUTTONWire()
516{
517 myVisMode = VIS_WIREFRAME;
518 RedrawVisMode();
519}
520
521void COCCDemoView::OnBUTTONShade()
522{
523 myVisMode = VIS_SHADE;
524 RedrawVisMode();
525}
526
527void COCCDemoView::OnBUTTONHlrOn()
528{
529 myVisMode = VIS_HLR;
530 RedrawVisMode();
531}
532
533void COCCDemoView::OnUpdateBUTTONWire(CCmdUI* pCmdUI)
534{
535 pCmdUI->SetCheck (myVisMode == VIS_WIREFRAME);
536 pCmdUI->Enable (myVisMode != VIS_WIREFRAME);
537}
538
539void COCCDemoView::OnUpdateBUTTONShade(CCmdUI* pCmdUI)
540{
541 pCmdUI->SetCheck (myVisMode == VIS_SHADE);
542 pCmdUI->Enable (myVisMode != VIS_SHADE);
543}
544
545void COCCDemoView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI)
546{
547 pCmdUI->SetCheck (myVisMode == VIS_HLR);
548 pCmdUI->Enable (myVisMode != VIS_HLR);
549}
550
551void COCCDemoView::GetViewCenter(V3d_Coordinate& Xc, V3d_Coordinate& Yc)
552{
553 myView->Center(Xc,Yc);
554}
555
556void COCCDemoView::SetViewCenter(V3d_Coordinate Xc, V3d_Coordinate Yc)
557{
558 myView->SetCenter(Xc,Yc);
559}
560
561void COCCDemoView::GetViewEye(V3d_Coordinate& X, V3d_Coordinate& Y, V3d_Coordinate& Z)
562{
563 myView->Eye(X,Y,Z);
564}
565
566void COCCDemoView::SetViewEye(V3d_Coordinate X, V3d_Coordinate Y, V3d_Coordinate Z)
567{
568 myView->SetEye(X,Y,Z);
569}
570
571Quantity_Factor COCCDemoView::GetViewScale()
572{
573 return myView->Scale();
574}
575
576void COCCDemoView::SetViewScale(Quantity_Factor Coef)
577{
578 myView->SetScale(Coef);
579}