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 = ((COCCDemoApp*)AfxGetApp())->GetGraphicDriver();
76 COCCDemoView::~COCCDemoView()
84 BOOL COCCDemoView::PreCreateWindow(CREATESTRUCT& cs)
86 // TODO: Modify the Window class or styles here by modifying
87 // the CREATESTRUCT cs
88 cs.lpszClass = ::AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC, ::LoadCursor(NULL, IDC_ARROW), NULL, NULL);
89 return CView::PreCreateWindow(cs);
92 /////////////////////////////////////////////////////////////////////////////
93 // COCCDemoView drawing
95 void COCCDemoView::OnInitialUpdate()
97 CView::OnInitialUpdate();
99 myView = GetDocument()->GetViewer()->CreateView();
100 myView->SetViewMappingDefault();
101 myView->SetViewOrientationDefault();
103 Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd ());
104 myView->SetWindow(aWNTWindow);
105 if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
107 myCurrentMode = CurAction3d_Nothing;
108 myVisMode = VIS_SHADE;
112 void COCCDemoView::OnDraw(CDC* /*pDC*/)
114 COCCDemoDoc* pDoc = GetDocument();
116 // TODO: add draw code for native data here
120 /////////////////////////////////////////////////////////////////////////////
121 // COCCDemoView diagnostics
124 void COCCDemoView::AssertValid() const
126 CView::AssertValid();
129 void COCCDemoView::Dump(CDumpContext& dc) const
134 COCCDemoDoc* COCCDemoView::GetDocument() // non-debug version is inline
136 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COCCDemoDoc)));
137 return (COCCDemoDoc*)m_pDocument;
141 /////////////////////////////////////////////////////////////////////////////
142 // COCCDemoView message handlers
144 void COCCDemoView::OnSize(UINT nType, int cx, int cy)
146 CView::OnSize (nType, cx, cy);
147 if (!myView.IsNull())
148 myView->MustBeResized();
151 void COCCDemoView::OnBUTTONBack()
153 myView->SetProj(V3d_Ypos);
156 void COCCDemoView::OnBUTTONFront()
158 myView->SetProj(V3d_Yneg);
161 void COCCDemoView::OnBUTTONBottom()
163 myView->SetProj(V3d_Zneg);
166 void COCCDemoView::OnBUTTONTop()
168 myView->SetProj(V3d_Zpos);
171 void COCCDemoView::OnBUTTONLeft()
173 myView->SetProj(V3d_Xneg);
176 void COCCDemoView::OnBUTTONRight()
178 myView->SetProj(V3d_Xpos);
181 void COCCDemoView::OnBUTTONAxo()
183 myView->SetProj(V3d_XposYnegZpos);
186 void COCCDemoView::OnBUTTONPan()
188 myCurrentMode = CurAction3d_DynamicPanning;
191 void COCCDemoView::OnBUTTONPanGlo()
193 // save the current zoom value
194 myCurZoom = myView->Scale();
198 myCurrentMode = CurAction3d_GlobalPanning;
201 void COCCDemoView::OnBUTTONReset()
206 void COCCDemoView::OnBUTTONRot()
208 myCurrentMode = CurAction3d_DynamicRotation;
211 void COCCDemoView::OnBUTTONZoomAll()
217 void COCCDemoView::OnBUTTONZoomProg()
219 myCurrentMode = CurAction3d_DynamicZooming;
222 void COCCDemoView::OnBUTTONZoomWin()
224 myCurrentMode = CurAction3d_WindowZooming;
227 void COCCDemoView::OnLButtonDown(UINT nFlags, CPoint point)
229 // save the current mouse coordinate in min
230 myXmin=point.x; myYmin=point.y;
231 myXmax=point.x; myYmax=point.y;
233 if ( ! (nFlags & MK_CONTROL) )
235 if (myCurrentMode == CurAction3d_DynamicRotation)
237 myView->SetComputedMode(Standard_False);
238 myView->StartRotation(point.x,point.y);
243 void COCCDemoView::OnLButtonUp(UINT nFlags, CPoint point)
245 if ( !(nFlags & MK_CONTROL) )
247 switch (myCurrentMode)
249 case CurAction3d_Nothing :
253 case CurAction3d_DynamicZooming :
254 myCurrentMode = CurAction3d_Nothing;
256 case CurAction3d_WindowZooming :
257 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
260 if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
261 // Test if the zoom window is greater than a minimale window.
263 // Do the zoom window between Pmin and Pmax
264 myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);
266 myCurrentMode = CurAction3d_Nothing;
268 case CurAction3d_DynamicPanning :
269 myCurrentMode = CurAction3d_Nothing;
271 case CurAction3d_GlobalPanning :
272 myView->Place(point.x,point.y,myCurZoom);
273 myCurrentMode = CurAction3d_Nothing;
275 case CurAction3d_DynamicRotation :
276 if (myVisMode == VIS_HLR)
278 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
279 myView->SetComputedMode(Standard_True);
280 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
282 myCurrentMode = CurAction3d_Nothing;
284 } //switch (myCurrentMode)
288 void COCCDemoView::OnRButtonDown(UINT nFlags, CPoint point)
290 if ( nFlags & MK_CONTROL )
292 myView->SetComputedMode(Standard_False);
293 myView->StartRotation(point.x,point.y);
297 void COCCDemoView::OnRButtonUp(UINT /*nFlags*/, CPoint /*point*/)
299 if (myVisMode == VIS_HLR)
301 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
302 myView->SetComputedMode(Standard_True);
303 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
307 void COCCDemoView::OnMouseMove(UINT nFlags, CPoint point)
309 // ============================ LEFT BUTTON =======================
310 if ( nFlags & MK_LBUTTON)
312 if ( nFlags & MK_CONTROL )
314 // move with MB1 and Control : on the dynamic zooming
315 // Do the zoom in function of mouse's coordinates
316 myView->Zoom(myXmax,myYmax,point.x,point.y);
317 // save the current mouse coordinate in max
323 switch (myCurrentMode)
325 case CurAction3d_Nothing :
329 case CurAction3d_DynamicZooming :
330 myView->Zoom(myXmax,myYmax,point.x,point.y);
331 // save the current mouse coordinate in max;
335 case CurAction3d_WindowZooming :
336 myXmax = point.x; myYmax = point.y;
337 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
338 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
340 case CurAction3d_DynamicPanning :
341 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
342 myXmax = point.x; myYmax = point.y;
344 case CurAction3d_GlobalPanning : // nothing
346 case CurAction3d_DynamicRotation :
347 myView->Rotation(point.x,point.y);
353 // ============================ MIDDLE BUTTON =======================
354 else if ( nFlags & MK_MBUTTON)
356 if ( nFlags & MK_CONTROL )
358 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
359 myXmax = point.x; myYmax = point.y;
362 // ============================ RIGHT BUTTON =======================
363 else if ( nFlags & MK_RBUTTON)
365 if ( nFlags & MK_CONTROL )
367 myView->Rotation(point.x,point.y);
370 // ============================ NO BUTTON =======================
378 void COCCDemoView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI)
380 pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
381 pCmdUI->Enable (myCurrentMode != CurAction3d_GlobalPanning);
384 void COCCDemoView::OnUpdateBUTTONPan(CCmdUI* pCmdUI)
386 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
387 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicPanning );
390 void COCCDemoView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI)
392 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
393 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicZooming);
396 void COCCDemoView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI)
398 pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
399 pCmdUI->Enable (myCurrentMode != CurAction3d_WindowZooming);
402 void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI)
404 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
405 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicRotation);
408 void COCCDemoView::DrawRectangle(const Standard_Integer MinX,
409 const Standard_Integer MinY,
410 const Standard_Integer MaxX,
411 const Standard_Integer MaxY,
412 const Standard_Boolean Draw,
413 const LineStyle aLineStyle)
415 static int m_DrawMode;
416 if (!m_Pen && aLineStyle ==Solid )
418 m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;
420 else if (!m_Pen && aLineStyle ==Dot )
422 m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0)); m_DrawMode = R2_XORPEN;
424 else if (!m_Pen && aLineStyle == ShortDash)
426 m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0)); m_DrawMode = R2_XORPEN;
428 else if (!m_Pen && aLineStyle == LongDash)
430 m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0)); m_DrawMode = R2_NOTXORPEN;
432 else if (aLineStyle == Default)
434 m_Pen = NULL; m_DrawMode = R2_MERGEPENNOT;
437 CPen* aOldPen = NULL;
438 CClientDC clientDC(this);
440 aOldPen = clientDC.SelectObject(m_Pen);
441 clientDC.SetROP2(m_DrawMode);
443 static Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
444 static Standard_Boolean m_IsVisible = Standard_False;
446 if ( m_IsVisible && !Draw) // move or up : erase at the old position
448 clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);
449 clientDC.LineTo(StoredMaxX,StoredMaxY);
450 clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
454 StoredMinX = Min ( MinX, MaxX );
455 StoredMinY = Min ( MinY, MaxY );
456 StoredMaxX = Max ( MinX, MaxX );
457 StoredMaxY = Max ( MinY, MaxY);
459 if (Draw) // move : draw
461 clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);
462 clientDC.LineTo(StoredMaxX,StoredMaxY);
463 clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
468 clientDC.SelectObject(aOldPen);
471 void COCCDemoView::InitButtons()
478 myCurrentMode = CurAction3d_Nothing;
481 void COCCDemoView::Reset()
484 myVisMode = VIS_SHADE;
485 if (!myView.IsNull())
492 void COCCDemoView::RedrawVisMode()
497 GetDocument()->GetAISContext()->SetDisplayMode (AIS_WireFrame, Standard_True);
498 myView->SetComputedMode (Standard_False);
501 GetDocument()->GetAISContext()->SetDisplayMode (AIS_Shaded, Standard_True);
502 myView->SetComputedMode (Standard_False);
505 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
506 myView->SetComputedMode (Standard_True);
507 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
508 GetDocument()->GetAISContext()->SetDisplayMode (AIS_WireFrame, Standard_True);
513 void COCCDemoView::OnBUTTONWire()
515 myVisMode = VIS_WIREFRAME;
519 void COCCDemoView::OnBUTTONShade()
521 myVisMode = VIS_SHADE;
525 void COCCDemoView::OnBUTTONHlrOn()
531 void COCCDemoView::OnUpdateBUTTONWire(CCmdUI* pCmdUI)
533 pCmdUI->SetCheck (myVisMode == VIS_WIREFRAME);
534 pCmdUI->Enable (myVisMode != VIS_WIREFRAME);
537 void COCCDemoView::OnUpdateBUTTONShade(CCmdUI* pCmdUI)
539 pCmdUI->SetCheck (myVisMode == VIS_SHADE);
540 pCmdUI->Enable (myVisMode != VIS_SHADE);
543 void COCCDemoView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI)
545 pCmdUI->SetCheck (myVisMode == VIS_HLR);
546 pCmdUI->Enable (myVisMode != VIS_HLR);
549 void COCCDemoView::GetViewAt (Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ) const
551 myView->At (theX, theY, theZ);
554 void COCCDemoView::SetViewAt (const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ)
556 myView->SetAt (theX, theY, theZ);
559 void COCCDemoView::GetViewEye(Standard_Real& X, Standard_Real& Y, Standard_Real& Z)
564 void COCCDemoView::SetViewEye(Standard_Real X, Standard_Real Y, Standard_Real Z)
566 myView->SetEye(X,Y,Z);
569 Standard_Real COCCDemoView::GetViewScale()
571 return myView->Scale();
574 void COCCDemoView::SetViewScale(Standard_Real Coef)
576 myView->SetScale(Coef);
579 void COCCDemoView::Translate (const Standard_Real theX, const Standard_Real theY)
581 myView->Panning (theX, theY);