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 <AIS_RubberBand.hxx>
11 #include <Graphic3d_GraphicDriver.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
IMPLEMENT_DYNCREATE(COCCDemoView,CView)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 myRect = new AIS_RubberBand (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0);
74 myGraphicDriver = ((COCCDemoApp*)AfxGetApp())->GetGraphicDriver();
75 }
76
~COCCDemoView()77 COCCDemoView::~COCCDemoView()
78 {
79 if (!myView.IsNull())
80 myView->Remove();
81 }
82
PreCreateWindow(CREATESTRUCT & cs)83 BOOL COCCDemoView::PreCreateWindow(CREATESTRUCT& cs)
84 {
85 // TODO: Modify the Window class or styles here by modifying
86 // the CREATESTRUCT cs
87 cs.lpszClass = ::AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC, ::LoadCursor(NULL, IDC_ARROW), NULL, NULL);
88 return CView::PreCreateWindow(cs);
89 }
90
91 /////////////////////////////////////////////////////////////////////////////
92 // COCCDemoView drawing
93
OnInitialUpdate()94 void COCCDemoView::OnInitialUpdate()
95 {
96 CView::OnInitialUpdate();
97
98 myView = GetDocument()->GetViewer()->CreateView();
99 myView->SetViewMappingDefault();
100 myView->SetViewOrientationDefault();
101
102 Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd ());
103 myView->SetWindow(aWNTWindow);
104 if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
105
106 myCurrentMode = CurAction3d_Nothing;
107 myVisMode = VIS_SHADE;
108 RedrawVisMode();
109 }
110
OnDraw(CDC *)111 void COCCDemoView::OnDraw(CDC* /*pDC*/)
112 {
113 COCCDemoDoc* pDoc = GetDocument();
114 ASSERT_VALID(pDoc);
115 // TODO: add draw code for native data here
116 myView->Redraw();
117 }
118
119 /////////////////////////////////////////////////////////////////////////////
120 // COCCDemoView diagnostics
121
122 #ifdef _DEBUG
AssertValid() const123 void COCCDemoView::AssertValid() const
124 {
125 CView::AssertValid();
126 }
127
Dump(CDumpContext & dc) const128 void COCCDemoView::Dump(CDumpContext& dc) const
129 {
130 CView::Dump(dc);
131 }
132
GetDocument()133 COCCDemoDoc* COCCDemoView::GetDocument() // non-debug version is inline
134 {
135 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COCCDemoDoc)));
136 return (COCCDemoDoc*)m_pDocument;
137 }
138 #endif //_DEBUG
139
140 /////////////////////////////////////////////////////////////////////////////
141 // COCCDemoView message handlers
142
OnSize(UINT nType,int cx,int cy)143 void COCCDemoView::OnSize(UINT nType, int cx, int cy)
144 {
145 CView::OnSize (nType, cx, cy);
146 if (!myView.IsNull())
147 myView->MustBeResized();
148 }
149
OnBUTTONBack()150 void COCCDemoView::OnBUTTONBack()
151 {
152 myView->SetProj(V3d_Ypos);
153 }
154
OnBUTTONFront()155 void COCCDemoView::OnBUTTONFront()
156 {
157 myView->SetProj(V3d_Yneg);
158 }
159
OnBUTTONBottom()160 void COCCDemoView::OnBUTTONBottom()
161 {
162 myView->SetProj(V3d_Zneg);
163 }
164
OnBUTTONTop()165 void COCCDemoView::OnBUTTONTop()
166 {
167 myView->SetProj(V3d_Zpos);
168 }
169
OnBUTTONLeft()170 void COCCDemoView::OnBUTTONLeft()
171 {
172 myView->SetProj(V3d_Xneg);
173 }
174
OnBUTTONRight()175 void COCCDemoView::OnBUTTONRight()
176 {
177 myView->SetProj(V3d_Xpos);
178 }
179
OnBUTTONAxo()180 void COCCDemoView::OnBUTTONAxo()
181 {
182 myView->SetProj(V3d_XposYnegZpos);
183 }
184
OnBUTTONPan()185 void COCCDemoView::OnBUTTONPan()
186 {
187 myCurrentMode = CurAction3d_DynamicPanning;
188 }
189
OnBUTTONPanGlo()190 void COCCDemoView::OnBUTTONPanGlo()
191 {
192 // save the current zoom value
193 myCurZoom = myView->Scale();
194 // Do a Global Zoom
195 myView->FitAll();
196 // Set the mode
197 myCurrentMode = CurAction3d_GlobalPanning;
198 }
199
OnBUTTONReset()200 void COCCDemoView::OnBUTTONReset()
201 {
202 myView->Reset();
203 }
204
OnBUTTONRot()205 void COCCDemoView::OnBUTTONRot()
206 {
207 myCurrentMode = CurAction3d_DynamicRotation;
208 }
209
OnBUTTONZoomAll()210 void COCCDemoView::OnBUTTONZoomAll()
211 {
212 myView->FitAll();
213 myView->ZFitAll();
214 }
215
OnBUTTONZoomProg()216 void COCCDemoView::OnBUTTONZoomProg()
217 {
218 myCurrentMode = CurAction3d_DynamicZooming;
219 }
220
OnBUTTONZoomWin()221 void COCCDemoView::OnBUTTONZoomWin()
222 {
223 myCurrentMode = CurAction3d_WindowZooming;
224 }
225
OnLButtonDown(UINT nFlags,CPoint point)226 void COCCDemoView::OnLButtonDown(UINT nFlags, CPoint point)
227 {
228 // save the current mouse coordinate in min
229 myXmin=point.x; myYmin=point.y;
230 myXmax=point.x; myYmax=point.y;
231
232 if ( ! (nFlags & MK_CONTROL) )
233 {
234 if (myCurrentMode == CurAction3d_DynamicRotation)
235 {
236 myView->SetComputedMode(Standard_False);
237 myView->StartRotation(point.x,point.y);
238 }
239 }
240 }
241
OnLButtonUp(UINT nFlags,CPoint point)242 void COCCDemoView::OnLButtonUp(UINT nFlags, CPoint point)
243 {
244 if ( !(nFlags & MK_CONTROL) )
245 {
246 switch (myCurrentMode)
247 {
248 case CurAction3d_Nothing :
249 myXmax=point.x;
250 myYmax=point.y;
251 break;
252 case CurAction3d_DynamicZooming :
253 myCurrentMode = CurAction3d_Nothing;
254 break;
255 case CurAction3d_WindowZooming :
256 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
257 myXmax=point.x;
258 myYmax=point.y;
259 if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
260 // Test if the zoom window is greater than a minimale window.
261 {
262 // Do the zoom window between Pmin and Pmax
263 myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);
264 }
265 myCurrentMode = CurAction3d_Nothing;
266 break;
267 case CurAction3d_DynamicPanning :
268 myCurrentMode = CurAction3d_Nothing;
269 break;
270 case CurAction3d_GlobalPanning :
271 myView->Place(point.x,point.y,myCurZoom);
272 myCurrentMode = CurAction3d_Nothing;
273 break;
274 case CurAction3d_DynamicRotation :
275 if (myVisMode == VIS_HLR)
276 {
277 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
278 myView->SetComputedMode(Standard_True);
279 myView->Redraw();
280 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
281 }
282 myCurrentMode = CurAction3d_Nothing;
283 break;
284 } //switch (myCurrentMode)
285 }
286 }
287
OnRButtonDown(UINT nFlags,CPoint point)288 void COCCDemoView::OnRButtonDown(UINT nFlags, CPoint point)
289 {
290 if ( nFlags & MK_CONTROL )
291 {
292 myView->SetComputedMode(Standard_False);
293 myView->StartRotation(point.x,point.y);
294 }
295 }
296
OnRButtonUp(UINT,CPoint)297 void COCCDemoView::OnRButtonUp(UINT /*nFlags*/, CPoint /*point*/)
298 {
299 if (myVisMode == VIS_HLR)
300 {
301 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
302 myView->SetComputedMode(Standard_True);
303 myView->Redraw();
304 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
305 }
306 }
307
OnMouseMove(UINT nFlags,CPoint point)308 void COCCDemoView::OnMouseMove(UINT nFlags, CPoint point)
309 {
310 // ============================ LEFT BUTTON =======================
311 if ( nFlags & MK_LBUTTON)
312 {
313 if ( nFlags & MK_CONTROL )
314 {
315 // move with MB1 and Control : on the dynamic zooming
316 // Do the zoom in function of mouse's coordinates
317 myView->Zoom(myXmax,myYmax,point.x,point.y);
318 // save the current mouse coordinate in max
319 myXmax = point.x;
320 myYmax = point.y;
321 }
322 else // if ( Ctrl )
323 {
324 switch (myCurrentMode)
325 {
326 case CurAction3d_Nothing :
327 myXmax = point.x;
328 myYmax = point.y;
329 break;
330 case CurAction3d_DynamicZooming :
331 myView->Zoom(myXmax,myYmax,point.x,point.y);
332 // save the current mouse coordinate in max;
333 myXmax=point.x;
334 myYmax=point.y;
335 break;
336 case CurAction3d_WindowZooming :
337 myXmax = point.x; myYmax = point.y;
338 DrawRectangle (myXmin, myYmin, myXmax, myYmax, Standard_True, Aspect_TOL_DASH);
339 break;
340 case CurAction3d_DynamicPanning :
341 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
342 myXmax = point.x; myYmax = point.y;
343 break;
344 case CurAction3d_GlobalPanning : // nothing
345 break;
346 case CurAction3d_DynamicRotation :
347 myView->Rotation(point.x,point.y);
348 myView->Redraw();
349 break;
350 }
351 }
352 }
353 // ============================ MIDDLE BUTTON =======================
354 else if ( nFlags & MK_MBUTTON)
355 {
356 if ( nFlags & MK_CONTROL )
357 {
358 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
359 myXmax = point.x; myYmax = point.y;
360 }
361 }
362 // ============================ RIGHT BUTTON =======================
363 else if ( nFlags & MK_RBUTTON)
364 {
365 if ( nFlags & MK_CONTROL )
366 {
367 myView->Rotation(point.x,point.y);
368 }
369 }
370 // ============================ NO BUTTON =======================
371 else
372 {
373 myXmax = point.x;
374 myYmax = point.y;
375 }
376 }
377
OnUpdateBUTTONPanGlo(CCmdUI * pCmdUI)378 void COCCDemoView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI)
379 {
380 pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
381 pCmdUI->Enable (myCurrentMode != CurAction3d_GlobalPanning);
382 }
383
OnUpdateBUTTONPan(CCmdUI * pCmdUI)384 void COCCDemoView::OnUpdateBUTTONPan(CCmdUI* pCmdUI)
385 {
386 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
387 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicPanning );
388 }
389
OnUpdateBUTTONZoomProg(CCmdUI * pCmdUI)390 void COCCDemoView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI)
391 {
392 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
393 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicZooming);
394 }
395
OnUpdateBUTTONZoomWin(CCmdUI * pCmdUI)396 void COCCDemoView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI)
397 {
398 pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
399 pCmdUI->Enable (myCurrentMode != CurAction3d_WindowZooming);
400 }
401
OnUpdateBUTTONRot(CCmdUI * pCmdUI)402 void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI)
403 {
404 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
405 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicRotation);
406 }
407
DrawRectangle(Standard_Integer theMinX,Standard_Integer theMinY,Standard_Integer theMaxX,Standard_Integer theMaxY,Standard_Boolean theToDraw,Aspect_TypeOfLine theLineType)408 void COCCDemoView::DrawRectangle (Standard_Integer theMinX,
409 Standard_Integer theMinY,
410 Standard_Integer theMaxX,
411 Standard_Integer theMaxY,
412 Standard_Boolean theToDraw,
413 Aspect_TypeOfLine theLineType)
414 {
415 const Handle(AIS_InteractiveContext)& aCtx = GetDocument()->GetAISContext();
416 if (!theToDraw)
417 {
418 aCtx->Remove (myRect, false);
419 aCtx->CurrentViewer()->RedrawImmediate();
420 return;
421 }
422
423 CRect aRect;
424 GetWindowRect (aRect);
425 myRect->SetLineType (theLineType);
426 myRect->SetRectangle (theMinX, aRect.Height() - theMinY, theMaxX, aRect.Height() - theMaxY);
427 if (!aCtx->IsDisplayed (myRect))
428 {
429 aCtx->Display (myRect, false);
430 }
431 else
432 {
433 aCtx->Redisplay (myRect, false);
434 }
435 aCtx->CurrentViewer()->RedrawImmediate();
436 }
437
InitButtons()438 void COCCDemoView::InitButtons()
439 {
440 myXmin=0;
441 myYmin=0;
442 myXmax=0;
443 myYmax=0;
444 myCurZoom=0;
445 myCurrentMode = CurAction3d_Nothing;
446 }
447
Reset()448 void COCCDemoView::Reset()
449 {
450 InitButtons();
451 myVisMode = VIS_SHADE;
452 if (!myView.IsNull())
453 {
454 RedrawVisMode();
455 myView->Reset();
456 }
457 }
458
RedrawVisMode()459 void COCCDemoView::RedrawVisMode()
460 {
461 switch (myVisMode)
462 {
463 case VIS_WIREFRAME:
464 GetDocument()->GetAISContext()->SetDisplayMode (AIS_WireFrame, Standard_True);
465 myView->SetComputedMode (Standard_False);
466 myView->Redraw();
467 break;
468 case VIS_SHADE:
469 GetDocument()->GetAISContext()->SetDisplayMode (AIS_Shaded, Standard_True);
470 myView->SetComputedMode (Standard_False);
471 myView->Redraw();
472 break;
473 case VIS_HLR:
474 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
475 myView->SetComputedMode (Standard_True);
476 myView->Redraw();
477 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
478 GetDocument()->GetAISContext()->SetDisplayMode (AIS_WireFrame, Standard_True);
479 break;
480 }
481 }
482
OnBUTTONWire()483 void COCCDemoView::OnBUTTONWire()
484 {
485 myVisMode = VIS_WIREFRAME;
486 RedrawVisMode();
487 }
488
OnBUTTONShade()489 void COCCDemoView::OnBUTTONShade()
490 {
491 myVisMode = VIS_SHADE;
492 RedrawVisMode();
493 }
494
OnBUTTONHlrOn()495 void COCCDemoView::OnBUTTONHlrOn()
496 {
497 myVisMode = VIS_HLR;
498 RedrawVisMode();
499 }
500
OnUpdateBUTTONWire(CCmdUI * pCmdUI)501 void COCCDemoView::OnUpdateBUTTONWire(CCmdUI* pCmdUI)
502 {
503 pCmdUI->SetCheck (myVisMode == VIS_WIREFRAME);
504 pCmdUI->Enable (myVisMode != VIS_WIREFRAME);
505 }
506
OnUpdateBUTTONShade(CCmdUI * pCmdUI)507 void COCCDemoView::OnUpdateBUTTONShade(CCmdUI* pCmdUI)
508 {
509 pCmdUI->SetCheck (myVisMode == VIS_SHADE);
510 pCmdUI->Enable (myVisMode != VIS_SHADE);
511 }
512
OnUpdateBUTTONHlrOn(CCmdUI * pCmdUI)513 void COCCDemoView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI)
514 {
515 pCmdUI->SetCheck (myVisMode == VIS_HLR);
516 pCmdUI->Enable (myVisMode != VIS_HLR);
517 }
518
GetViewAt(Standard_Real & theX,Standard_Real & theY,Standard_Real & theZ) const519 void COCCDemoView::GetViewAt (Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ) const
520 {
521 myView->At (theX, theY, theZ);
522 }
523
SetViewAt(const Standard_Real theX,const Standard_Real theY,const Standard_Real theZ)524 void COCCDemoView::SetViewAt (const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ)
525 {
526 myView->SetAt (theX, theY, theZ);
527 }
528
GetViewEye(Standard_Real & X,Standard_Real & Y,Standard_Real & Z)529 void COCCDemoView::GetViewEye(Standard_Real& X, Standard_Real& Y, Standard_Real& Z)
530 {
531 myView->Eye(X,Y,Z);
532 }
533
SetViewEye(Standard_Real X,Standard_Real Y,Standard_Real Z)534 void COCCDemoView::SetViewEye(Standard_Real X, Standard_Real Y, Standard_Real Z)
535 {
536 myView->SetEye(X,Y,Z);
537 }
538
GetViewScale()539 Standard_Real COCCDemoView::GetViewScale()
540 {
541 return myView->Scale();
542 }
543
SetViewScale(Standard_Real Coef)544 void COCCDemoView::SetViewScale(Standard_Real Coef)
545 {
546 myView->SetScale(Coef);
547 }
548
Translate(const Standard_Real theX,const Standard_Real theY)549 void COCCDemoView::Translate (const Standard_Real theX, const Standard_Real theY)
550 {
551 myView->Panning (theX, theY);
552 }
553