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
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 if (!myView.IsNull())
147 myView->MustBeResized();
150 void COCCDemoView::OnBUTTONBack()
152 myView->SetProj(V3d_Ypos);
155 void COCCDemoView::OnBUTTONFront()
157 myView->SetProj(V3d_Yneg);
160 void COCCDemoView::OnBUTTONBottom()
162 myView->SetProj(V3d_Zneg);
165 void COCCDemoView::OnBUTTONTop()
167 myView->SetProj(V3d_Zpos);
170 void COCCDemoView::OnBUTTONLeft()
172 myView->SetProj(V3d_Xneg);
175 void COCCDemoView::OnBUTTONRight()
177 myView->SetProj(V3d_Xpos);
180 void COCCDemoView::OnBUTTONAxo()
182 myView->SetProj(V3d_XposYnegZpos);
185 void COCCDemoView::OnBUTTONPan()
187 myCurrentMode = CurAction3d_DynamicPanning;
190 void COCCDemoView::OnBUTTONPanGlo()
192 // save the current zoom value
193 myCurZoom = myView->Scale();
197 myCurrentMode = CurAction3d_GlobalPanning;
200 void COCCDemoView::OnBUTTONReset()
205 void COCCDemoView::OnBUTTONRot()
207 myCurrentMode = CurAction3d_DynamicRotation;
210 void COCCDemoView::OnBUTTONZoomAll()
216 void COCCDemoView::OnBUTTONZoomProg()
218 myCurrentMode = CurAction3d_DynamicZooming;
221 void COCCDemoView::OnBUTTONZoomWin()
223 myCurrentMode = CurAction3d_WindowZooming;
226 void COCCDemoView::OnLButtonDown(UINT nFlags, CPoint point)
228 // save the current mouse coordinate in min
229 myXmin=point.x; myYmin=point.y;
230 myXmax=point.x; myYmax=point.y;
232 if ( ! (nFlags & MK_CONTROL) )
234 if (myCurrentMode == CurAction3d_DynamicRotation)
236 myView->SetComputedMode(Standard_False);
237 myView->StartRotation(point.x,point.y);
242 void COCCDemoView::OnLButtonUp(UINT nFlags, CPoint point)
244 if ( !(nFlags & MK_CONTROL) )
246 switch (myCurrentMode)
248 case CurAction3d_Nothing :
252 case CurAction3d_DynamicZooming :
253 myCurrentMode = CurAction3d_Nothing;
255 case CurAction3d_WindowZooming :
256 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
259 if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
260 // Test if the zoom window is greater than a minimale window.
262 // Do the zoom window between Pmin and Pmax
263 myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);
265 myCurrentMode = CurAction3d_Nothing;
267 case CurAction3d_DynamicPanning :
268 myCurrentMode = CurAction3d_Nothing;
270 case CurAction3d_GlobalPanning :
271 myView->Place(point.x,point.y,myCurZoom);
272 myCurrentMode = CurAction3d_Nothing;
274 case CurAction3d_DynamicRotation :
275 if (myVisMode == VIS_HLR)
277 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
278 myView->SetComputedMode(Standard_True);
279 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
281 myCurrentMode = CurAction3d_Nothing;
283 } //switch (myCurrentMode)
287 void COCCDemoView::OnRButtonDown(UINT nFlags, CPoint point)
289 if ( nFlags & MK_CONTROL )
291 myView->SetComputedMode(Standard_False);
292 myView->StartRotation(point.x,point.y);
296 void COCCDemoView::OnRButtonUp(UINT /*nFlags*/, CPoint /*point*/)
298 if (myVisMode == VIS_HLR)
300 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
301 myView->SetComputedMode(Standard_True);
302 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
306 void COCCDemoView::OnMouseMove(UINT nFlags, CPoint point)
308 // ============================ LEFT BUTTON =======================
309 if ( nFlags & MK_LBUTTON)
311 if ( nFlags & MK_CONTROL )
313 // move with MB1 and Control : on the dynamic zooming
314 // Do the zoom in function of mouse's coordinates
315 myView->Zoom(myXmax,myYmax,point.x,point.y);
316 // save the current mouse coordinate in max
322 switch (myCurrentMode)
324 case CurAction3d_Nothing :
328 case CurAction3d_DynamicZooming :
329 myView->Zoom(myXmax,myYmax,point.x,point.y);
330 // save the current mouse coordinate in max;
334 case CurAction3d_WindowZooming :
335 myXmax = point.x; myYmax = point.y;
336 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
337 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
339 case CurAction3d_DynamicPanning :
340 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
341 myXmax = point.x; myYmax = point.y;
343 case CurAction3d_GlobalPanning : // nothing
345 case CurAction3d_DynamicRotation :
346 myView->Rotation(point.x,point.y);
352 // ============================ MIDDLE BUTTON =======================
353 else if ( nFlags & MK_MBUTTON)
355 if ( nFlags & MK_CONTROL )
357 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
358 myXmax = point.x; myYmax = point.y;
361 // ============================ RIGHT BUTTON =======================
362 else if ( nFlags & MK_RBUTTON)
364 if ( nFlags & MK_CONTROL )
366 myView->Rotation(point.x,point.y);
369 // ============================ NO BUTTON =======================
377 void COCCDemoView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI)
379 pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
380 pCmdUI->Enable (myCurrentMode != CurAction3d_GlobalPanning);
383 void COCCDemoView::OnUpdateBUTTONPan(CCmdUI* pCmdUI)
385 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
386 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicPanning );
389 void COCCDemoView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI)
391 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
392 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicZooming);
395 void COCCDemoView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI)
397 pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
398 pCmdUI->Enable (myCurrentMode != CurAction3d_WindowZooming);
401 void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI)
403 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
404 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicRotation);
407 void COCCDemoView::DrawRectangle(const Standard_Integer MinX,
408 const Standard_Integer MinY,
409 const Standard_Integer MaxX,
410 const Standard_Integer MaxY,
411 const Standard_Boolean Draw,
412 const LineStyle aLineStyle)
414 static int m_DrawMode;
415 if (!m_Pen && aLineStyle ==Solid )
417 m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;
419 else if (!m_Pen && aLineStyle ==Dot )
421 m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0)); m_DrawMode = R2_XORPEN;
423 else if (!m_Pen && aLineStyle == ShortDash)
425 m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0)); m_DrawMode = R2_XORPEN;
427 else if (!m_Pen && aLineStyle == LongDash)
429 m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0)); m_DrawMode = R2_NOTXORPEN;
431 else if (aLineStyle == Default)
433 m_Pen = NULL; m_DrawMode = R2_MERGEPENNOT;
436 CPen* aOldPen = NULL;
437 CClientDC clientDC(this);
439 aOldPen = clientDC.SelectObject(m_Pen);
440 clientDC.SetROP2(m_DrawMode);
442 static Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
443 static Standard_Boolean m_IsVisible = Standard_False;
445 if ( m_IsVisible && !Draw) // move or up : erase at the old position
447 clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);
448 clientDC.LineTo(StoredMaxX,StoredMaxY);
449 clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
453 StoredMinX = Min ( MinX, MaxX );
454 StoredMinY = Min ( MinY, MaxY );
455 StoredMaxX = Max ( MinX, MaxX );
456 StoredMaxY = Max ( MinY, MaxY);
458 if (Draw) // move : draw
460 clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);
461 clientDC.LineTo(StoredMaxX,StoredMaxY);
462 clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
467 clientDC.SelectObject(aOldPen);
470 void COCCDemoView::InitButtons()
477 myCurrentMode = CurAction3d_Nothing;
480 void COCCDemoView::Reset()
483 myVisMode = VIS_SHADE;
484 if (!myView.IsNull())
491 void COCCDemoView::RedrawVisMode()
496 GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
497 myView->SetComputedMode (Standard_False);
500 GetDocument()->GetAISContext()->SetDisplayMode(AIS_Shaded);
501 myView->SetComputedMode (Standard_False);
504 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
505 myView->SetComputedMode (Standard_True);
506 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
507 GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
512 void COCCDemoView::OnBUTTONWire()
514 myVisMode = VIS_WIREFRAME;
518 void COCCDemoView::OnBUTTONShade()
520 myVisMode = VIS_SHADE;
524 void COCCDemoView::OnBUTTONHlrOn()
530 void COCCDemoView::OnUpdateBUTTONWire(CCmdUI* pCmdUI)
532 pCmdUI->SetCheck (myVisMode == VIS_WIREFRAME);
533 pCmdUI->Enable (myVisMode != VIS_WIREFRAME);
536 void COCCDemoView::OnUpdateBUTTONShade(CCmdUI* pCmdUI)
538 pCmdUI->SetCheck (myVisMode == VIS_SHADE);
539 pCmdUI->Enable (myVisMode != VIS_SHADE);
542 void COCCDemoView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI)
544 pCmdUI->SetCheck (myVisMode == VIS_HLR);
545 pCmdUI->Enable (myVisMode != VIS_HLR);
548 void COCCDemoView::GetViewAt (V3d_Coordinate& theX, V3d_Coordinate& theY, V3d_Coordinate& theZ) const
550 myView->At (theX, theY, theZ);
553 void COCCDemoView::SetViewAt (const V3d_Coordinate theX, const V3d_Coordinate theY, const V3d_Coordinate theZ)
555 myView->SetAt (theX, theY, theZ);
558 void COCCDemoView::GetViewEye(V3d_Coordinate& X, V3d_Coordinate& Y, V3d_Coordinate& Z)
563 void COCCDemoView::SetViewEye(V3d_Coordinate X, V3d_Coordinate Y, V3d_Coordinate Z)
565 myView->SetEye(X,Y,Z);
568 Quantity_Factor COCCDemoView::GetViewScale()
570 return myView->Scale();
573 void COCCDemoView::SetViewScale(Quantity_Factor Coef)
575 myView->SetScale(Coef);
578 void COCCDemoView::Translate (const Standard_Real theX, const Standard_Real theY)
580 myView->Panning (theX, theY);