1 // OCCDemoView.cpp : implementation of the COCCDemoView class
7 #include "OCCDemoDoc.h"
8 #include "OCCDemoView.h"
10 #include <Graphic3d_GraphicDriver.hxx>
16 static char THIS_FILE[] = __FILE__;
19 /////////////////////////////////////////////////////////////////////////////
22 IMPLEMENT_DYNCREATE(COCCDemoView, CView)
24 BEGIN_MESSAGE_MAP(COCCDemoView, CView)
25 //{{AFX_MSG_MAP(COCCDemoView)
26 ON_COMMAND(ID_BUTTONAxo, OnBUTTONAxo)
27 ON_COMMAND(ID_BUTTONBack, OnBUTTONBack)
28 ON_COMMAND(ID_BUTTONBottom, OnBUTTONBottom)
29 ON_COMMAND(ID_BUTTONFront, OnBUTTONFront)
30 ON_COMMAND(ID_BUTTONHlrOn, OnBUTTONHlrOn)
31 ON_COMMAND(ID_BUTTONLeft, OnBUTTONLeft)
32 ON_COMMAND(ID_BUTTONPan, OnBUTTONPan)
33 ON_COMMAND(ID_BUTTONPanGlo, OnBUTTONPanGlo)
34 ON_COMMAND(ID_BUTTONReset, OnBUTTONReset)
35 ON_COMMAND(ID_BUTTONRight, OnBUTTONRight)
36 ON_COMMAND(ID_BUTTONRot, OnBUTTONRot)
37 ON_COMMAND(ID_BUTTONTop, OnBUTTONTop)
38 ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll)
40 ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg)
41 ON_COMMAND(ID_BUTTONZoomWin, OnBUTTONZoomWin)
47 ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo)
48 ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan)
49 ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
50 ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
51 ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
52 ON_COMMAND(ID_BUTTONWire, OnBUTTONWire)
53 ON_COMMAND(ID_BUTTONShade, OnBUTTONShade)
54 ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn)
55 ON_UPDATE_COMMAND_UI(ID_BUTTONShade, OnUpdateBUTTONShade)
56 ON_UPDATE_COMMAND_UI(ID_BUTTONWire, OnUpdateBUTTONWire)
60 /////////////////////////////////////////////////////////////////////////////
61 // COCCDemoView construction/destruction
63 COCCDemoView::COCCDemoView()
70 myCurrentMode = CurAction3d_Nothing;
71 myVisMode = VIS_SHADE;
73 myGraphicDriver = Handle(Graphic3d_GraphicDriver)::DownCast(
74 ((COCCDemoApp*)AfxGetApp())->GetGraphicDevice()->GraphicDriver() );
77 COCCDemoView::~COCCDemoView()
85 BOOL COCCDemoView::PreCreateWindow(CREATESTRUCT& cs)
87 // TODO: Modify the Window class or styles here by modifying
88 // the CREATESTRUCT cs
90 return CView::PreCreateWindow(cs);
93 /////////////////////////////////////////////////////////////////////////////
94 // COCCDemoView drawing
96 void COCCDemoView::OnInitialUpdate()
98 CView::OnInitialUpdate();
100 myView = GetDocument()->GetViewer()->CreateView();
102 Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice =
103 ((COCCDemoApp*)AfxGetApp())->GetGraphicDevice();
105 Handle(WNT_Window) aWNTWindow = new WNT_Window(theGraphicDevice,GetSafeHwnd ());
106 myView->SetWindow(aWNTWindow);
107 if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
109 myCurrentMode = CurAction3d_Nothing;
110 myVisMode = VIS_SHADE;
114 void COCCDemoView::OnDraw(CDC* pDC)
116 COCCDemoDoc* pDoc = GetDocument();
118 // TODO: add draw code for native data here
122 /////////////////////////////////////////////////////////////////////////////
123 // COCCDemoView diagnostics
126 void COCCDemoView::AssertValid() const
128 CView::AssertValid();
131 void COCCDemoView::Dump(CDumpContext& dc) const
136 COCCDemoDoc* COCCDemoView::GetDocument() // non-debug version is inline
138 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COCCDemoDoc)));
139 return (COCCDemoDoc*)m_pDocument;
143 /////////////////////////////////////////////////////////////////////////////
144 // COCCDemoView message handlers
146 void COCCDemoView::OnSize(UINT nType, int cx, int cy)
148 if (!myView.IsNull())
149 myView->MustBeResized();
152 void COCCDemoView::OnBUTTONBack()
154 myView->SetProj(V3d_Ypos);
157 void COCCDemoView::OnBUTTONFront()
159 myView->SetProj(V3d_Yneg);
162 void COCCDemoView::OnBUTTONBottom()
164 myView->SetProj(V3d_Zneg);
167 void COCCDemoView::OnBUTTONTop()
169 myView->SetProj(V3d_Zpos);
172 void COCCDemoView::OnBUTTONLeft()
174 myView->SetProj(V3d_Xneg);
177 void COCCDemoView::OnBUTTONRight()
179 myView->SetProj(V3d_Xpos);
182 void COCCDemoView::OnBUTTONAxo()
184 myView->SetProj(V3d_XposYnegZpos);
187 void COCCDemoView::OnBUTTONPan()
189 myCurrentMode = CurAction3d_DynamicPanning;
192 void COCCDemoView::OnBUTTONPanGlo()
194 // save the current zoom value
195 myCurZoom = myView->Scale();
199 myCurrentMode = CurAction3d_GlobalPanning;
202 void COCCDemoView::OnBUTTONReset()
207 void COCCDemoView::OnBUTTONRot()
209 myCurrentMode = CurAction3d_DynamicRotation;
212 void COCCDemoView::OnBUTTONZoomAll()
218 void COCCDemoView::OnBUTTONZoomProg()
220 myCurrentMode = CurAction3d_DynamicZooming;
223 void COCCDemoView::OnBUTTONZoomWin()
225 myCurrentMode = CurAction3d_WindowZooming;
228 void COCCDemoView::OnLButtonDown(UINT nFlags, CPoint point)
230 // save the current mouse coordinate in min
231 myXmin=point.x; myYmin=point.y;
232 myXmax=point.x; myYmax=point.y;
234 if ( ! (nFlags & MK_CONTROL) )
236 if (myCurrentMode == CurAction3d_DynamicRotation)
238 myView->SetComputedMode(Standard_False);
239 myView->StartRotation(point.x,point.y);
244 void COCCDemoView::OnLButtonUp(UINT nFlags, CPoint point)
246 if ( !(nFlags & MK_CONTROL) )
248 switch (myCurrentMode)
250 case CurAction3d_Nothing :
254 case CurAction3d_DynamicZooming :
255 myCurrentMode = CurAction3d_Nothing;
257 case CurAction3d_WindowZooming :
258 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
261 if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
262 // Test if the zoom window is greater than a minimale window.
264 // Do the zoom window between Pmin and Pmax
265 myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);
267 myCurrentMode = CurAction3d_Nothing;
269 case CurAction3d_DynamicPanning :
270 myCurrentMode = CurAction3d_Nothing;
272 case CurAction3d_GlobalPanning :
273 myView->Place(point.x,point.y,myCurZoom);
274 myCurrentMode = CurAction3d_Nothing;
276 case CurAction3d_DynamicRotation :
277 if (myVisMode == VIS_HLR)
279 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
280 myView->SetComputedMode(Standard_True);
282 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
284 myCurrentMode = CurAction3d_Nothing;
286 } //switch (myCurrentMode)
290 void COCCDemoView::OnRButtonDown(UINT nFlags, CPoint point)
292 if ( nFlags & MK_CONTROL )
294 myView->SetComputedMode(Standard_False);
295 myView->StartRotation(point.x,point.y);
299 void COCCDemoView::OnRButtonUp(UINT nFlags, CPoint point)
301 if (myVisMode == VIS_HLR)
303 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
304 myView->SetComputedMode(Standard_True);
306 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
310 void COCCDemoView::OnMouseMove(UINT nFlags, CPoint point)
312 // ============================ LEFT BUTTON =======================
313 if ( nFlags & MK_LBUTTON)
315 if ( nFlags & MK_CONTROL )
317 // move with MB1 and Control : on the dynamic zooming
318 // Do the zoom in function of mouse's coordinates
319 myView->Zoom(myXmax,myYmax,point.x,point.y);
320 // save the current mouse coordinate in max
326 switch (myCurrentMode)
328 case CurAction3d_Nothing :
332 case CurAction3d_DynamicZooming :
333 myView->Zoom(myXmax,myYmax,point.x,point.y);
334 // save the current mouse coordinate in max;
338 case CurAction3d_WindowZooming :
339 myXmax = point.x; myYmax = point.y;
340 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
341 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
343 case CurAction3d_DynamicPanning :
344 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
345 myXmax = point.x; myYmax = point.y;
347 case CurAction3d_GlobalPanning : // nothing
349 case CurAction3d_DynamicRotation :
350 myView->Rotation(point.x,point.y);
356 // ============================ MIDDLE BUTTON =======================
357 else if ( nFlags & MK_MBUTTON)
359 if ( nFlags & MK_CONTROL )
361 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
362 myXmax = point.x; myYmax = point.y;
365 // ============================ RIGHT BUTTON =======================
366 else if ( nFlags & MK_RBUTTON)
368 if ( nFlags & MK_CONTROL )
370 myView->Rotation(point.x,point.y);
373 // ============================ NO BUTTON =======================
381 void COCCDemoView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI)
383 pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
384 pCmdUI->Enable (myCurrentMode != CurAction3d_GlobalPanning);
387 void COCCDemoView::OnUpdateBUTTONPan(CCmdUI* pCmdUI)
389 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
390 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicPanning );
393 void COCCDemoView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI)
395 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
396 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicZooming);
399 void COCCDemoView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI)
401 pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
402 pCmdUI->Enable (myCurrentMode != CurAction3d_WindowZooming);
405 void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI)
407 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
408 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicRotation);
411 void COCCDemoView::DrawRectangle(const Standard_Integer MinX,
412 const Standard_Integer MinY,
413 const Standard_Integer MaxX,
414 const Standard_Integer MaxY,
415 const Standard_Boolean Draw,
416 const LineStyle aLineStyle)
418 static int m_DrawMode;
419 if (!m_Pen && aLineStyle ==Solid )
421 m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;
423 else if (!m_Pen && aLineStyle ==Dot )
425 m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0)); m_DrawMode = R2_XORPEN;
427 else if (!m_Pen && aLineStyle == ShortDash)
429 m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0)); m_DrawMode = R2_XORPEN;
431 else if (!m_Pen && aLineStyle == LongDash)
433 m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0)); m_DrawMode = R2_NOTXORPEN;
435 else if (aLineStyle == Default)
437 m_Pen = NULL; m_DrawMode = R2_MERGEPENNOT;
441 CClientDC clientDC(this);
443 aOldPen = clientDC.SelectObject(m_Pen);
444 clientDC.SetROP2(m_DrawMode);
446 static Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
447 static Standard_Boolean m_IsVisible = Standard_False;
449 if ( m_IsVisible && !Draw) // move or up : erase at the old position
451 clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);
452 clientDC.LineTo(StoredMaxX,StoredMaxY);
453 clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
457 StoredMinX = min ( MinX, MaxX );
458 StoredMinY = min ( MinY, MaxY );
459 StoredMaxX = max ( MinX, MaxX );
460 StoredMaxY = max ( MinY, MaxY);
462 if (Draw) // move : draw
464 clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);
465 clientDC.LineTo(StoredMaxX,StoredMaxY);
466 clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
471 clientDC.SelectObject(aOldPen);
474 void COCCDemoView::InitButtons()
481 myCurrentMode = CurAction3d_Nothing;
484 void COCCDemoView::Reset()
487 myVisMode = VIS_SHADE;
488 if (!myView.IsNull())
495 void COCCDemoView::RedrawVisMode()
500 GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
501 myView->SetComputedMode (Standard_False);
505 GetDocument()->GetAISContext()->SetDisplayMode(AIS_Shaded);
506 myView->SetComputedMode (Standard_False);
510 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
511 myView->SetComputedMode (Standard_True);
513 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
514 GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
519 void COCCDemoView::OnBUTTONWire()
521 myVisMode = VIS_WIREFRAME;
525 void COCCDemoView::OnBUTTONShade()
527 myVisMode = VIS_SHADE;
531 void COCCDemoView::OnBUTTONHlrOn()
537 void COCCDemoView::OnUpdateBUTTONWire(CCmdUI* pCmdUI)
539 pCmdUI->SetCheck (myVisMode == VIS_WIREFRAME);
540 pCmdUI->Enable (myVisMode != VIS_WIREFRAME);
543 void COCCDemoView::OnUpdateBUTTONShade(CCmdUI* pCmdUI)
545 pCmdUI->SetCheck (myVisMode == VIS_SHADE);
546 pCmdUI->Enable (myVisMode != VIS_SHADE);
549 void COCCDemoView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI)
551 pCmdUI->SetCheck (myVisMode == VIS_HLR);
552 pCmdUI->Enable (myVisMode != VIS_HLR);
555 void COCCDemoView::GetViewCenter(Standard_Real& Xc, Standard_Real& Yc)
557 myView->Center(Xc,Yc);
560 void COCCDemoView::SetViewCenter(Standard_Real Xc, Standard_Real Yc)
562 myView->SetCenter(Xc,Yc);
565 void COCCDemoView::GetViewEye(Standard_Real& X, Standard_Real& Y, Standard_Real& Z)
570 void COCCDemoView::SetViewEye(Standard_Real X, Standard_Real Y, Standard_Real Z)
572 myView->SetEye(X,Y,Z);
575 Standard_Real COCCDemoView::GetViewScale()
577 return myView->Scale();
580 void COCCDemoView::SetViewScale(Standard_Real Coef)
582 myView->SetScale(Coef);