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();
101 Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd ());
102 myView->SetWindow(aWNTWindow);
103 if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
105 myCurrentMode = CurAction3d_Nothing;
106 myVisMode = VIS_SHADE;
110 void COCCDemoView::OnDraw(CDC* /*pDC*/)
112 COCCDemoDoc* pDoc = GetDocument();
114 // TODO: add draw code for native data here
118 /////////////////////////////////////////////////////////////////////////////
119 // COCCDemoView diagnostics
122 void COCCDemoView::AssertValid() const
124 CView::AssertValid();
127 void COCCDemoView::Dump(CDumpContext& dc) const
132 COCCDemoDoc* COCCDemoView::GetDocument() // non-debug version is inline
134 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COCCDemoDoc)));
135 return (COCCDemoDoc*)m_pDocument;
139 /////////////////////////////////////////////////////////////////////////////
140 // COCCDemoView message handlers
142 void COCCDemoView::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
144 if (!myView.IsNull())
145 myView->MustBeResized();
148 void COCCDemoView::OnBUTTONBack()
150 myView->SetProj(V3d_Ypos);
153 void COCCDemoView::OnBUTTONFront()
155 myView->SetProj(V3d_Yneg);
158 void COCCDemoView::OnBUTTONBottom()
160 myView->SetProj(V3d_Zneg);
163 void COCCDemoView::OnBUTTONTop()
165 myView->SetProj(V3d_Zpos);
168 void COCCDemoView::OnBUTTONLeft()
170 myView->SetProj(V3d_Xneg);
173 void COCCDemoView::OnBUTTONRight()
175 myView->SetProj(V3d_Xpos);
178 void COCCDemoView::OnBUTTONAxo()
180 myView->SetProj(V3d_XposYnegZpos);
183 void COCCDemoView::OnBUTTONPan()
185 myCurrentMode = CurAction3d_DynamicPanning;
188 void COCCDemoView::OnBUTTONPanGlo()
190 // save the current zoom value
191 myCurZoom = myView->Scale();
195 myCurrentMode = CurAction3d_GlobalPanning;
198 void COCCDemoView::OnBUTTONReset()
203 void COCCDemoView::OnBUTTONRot()
205 myCurrentMode = CurAction3d_DynamicRotation;
208 void COCCDemoView::OnBUTTONZoomAll()
214 void COCCDemoView::OnBUTTONZoomProg()
216 myCurrentMode = CurAction3d_DynamicZooming;
219 void COCCDemoView::OnBUTTONZoomWin()
221 myCurrentMode = CurAction3d_WindowZooming;
224 void COCCDemoView::OnLButtonDown(UINT nFlags, CPoint point)
226 // save the current mouse coordinate in min
227 myXmin=point.x; myYmin=point.y;
228 myXmax=point.x; myYmax=point.y;
230 if ( ! (nFlags & MK_CONTROL) )
232 if (myCurrentMode == CurAction3d_DynamicRotation)
234 myView->SetComputedMode(Standard_False);
235 myView->StartRotation(point.x,point.y);
240 void COCCDemoView::OnLButtonUp(UINT nFlags, CPoint point)
242 if ( !(nFlags & MK_CONTROL) )
244 switch (myCurrentMode)
246 case CurAction3d_Nothing :
250 case CurAction3d_DynamicZooming :
251 myCurrentMode = CurAction3d_Nothing;
253 case CurAction3d_WindowZooming :
254 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
257 if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
258 // Test if the zoom window is greater than a minimale window.
260 // Do the zoom window between Pmin and Pmax
261 myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);
263 myCurrentMode = CurAction3d_Nothing;
265 case CurAction3d_DynamicPanning :
266 myCurrentMode = CurAction3d_Nothing;
268 case CurAction3d_GlobalPanning :
269 myView->Place(point.x,point.y,myCurZoom);
270 myCurrentMode = CurAction3d_Nothing;
272 case CurAction3d_DynamicRotation :
273 if (myVisMode == VIS_HLR)
275 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
276 myView->SetComputedMode(Standard_True);
277 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
279 myCurrentMode = CurAction3d_Nothing;
281 } //switch (myCurrentMode)
285 void COCCDemoView::OnRButtonDown(UINT nFlags, CPoint point)
287 if ( nFlags & MK_CONTROL )
289 myView->SetComputedMode(Standard_False);
290 myView->StartRotation(point.x,point.y);
294 void COCCDemoView::OnRButtonUp(UINT /*nFlags*/, CPoint /*point*/)
296 if (myVisMode == VIS_HLR)
298 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
299 myView->SetComputedMode(Standard_True);
300 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
304 void COCCDemoView::OnMouseMove(UINT nFlags, CPoint point)
306 // ============================ LEFT BUTTON =======================
307 if ( nFlags & MK_LBUTTON)
309 if ( nFlags & MK_CONTROL )
311 // move with MB1 and Control : on the dynamic zooming
312 // Do the zoom in function of mouse's coordinates
313 myView->Zoom(myXmax,myYmax,point.x,point.y);
314 // save the current mouse coordinate in max
320 switch (myCurrentMode)
322 case CurAction3d_Nothing :
326 case CurAction3d_DynamicZooming :
327 myView->Zoom(myXmax,myYmax,point.x,point.y);
328 // save the current mouse coordinate in max;
332 case CurAction3d_WindowZooming :
333 myXmax = point.x; myYmax = point.y;
334 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
335 DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
337 case CurAction3d_DynamicPanning :
338 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
339 myXmax = point.x; myYmax = point.y;
341 case CurAction3d_GlobalPanning : // nothing
343 case CurAction3d_DynamicRotation :
344 myView->Rotation(point.x,point.y);
350 // ============================ MIDDLE BUTTON =======================
351 else if ( nFlags & MK_MBUTTON)
353 if ( nFlags & MK_CONTROL )
355 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
356 myXmax = point.x; myYmax = point.y;
359 // ============================ RIGHT BUTTON =======================
360 else if ( nFlags & MK_RBUTTON)
362 if ( nFlags & MK_CONTROL )
364 myView->Rotation(point.x,point.y);
367 // ============================ NO BUTTON =======================
375 void COCCDemoView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI)
377 pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
378 pCmdUI->Enable (myCurrentMode != CurAction3d_GlobalPanning);
381 void COCCDemoView::OnUpdateBUTTONPan(CCmdUI* pCmdUI)
383 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
384 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicPanning );
387 void COCCDemoView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI)
389 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
390 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicZooming);
393 void COCCDemoView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI)
395 pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
396 pCmdUI->Enable (myCurrentMode != CurAction3d_WindowZooming);
399 void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI)
401 pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
402 pCmdUI->Enable (myCurrentMode != CurAction3d_DynamicRotation);
405 void COCCDemoView::DrawRectangle(const Standard_Integer MinX,
406 const Standard_Integer MinY,
407 const Standard_Integer MaxX,
408 const Standard_Integer MaxY,
409 const Standard_Boolean Draw,
410 const LineStyle aLineStyle)
412 static int m_DrawMode;
413 if (!m_Pen && aLineStyle ==Solid )
415 m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;
417 else if (!m_Pen && aLineStyle ==Dot )
419 m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0)); m_DrawMode = R2_XORPEN;
421 else if (!m_Pen && aLineStyle == ShortDash)
423 m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0)); m_DrawMode = R2_XORPEN;
425 else if (!m_Pen && aLineStyle == LongDash)
427 m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0)); m_DrawMode = R2_NOTXORPEN;
429 else if (aLineStyle == Default)
431 m_Pen = NULL; m_DrawMode = R2_MERGEPENNOT;
434 CPen* aOldPen = NULL;
435 CClientDC clientDC(this);
437 aOldPen = clientDC.SelectObject(m_Pen);
438 clientDC.SetROP2(m_DrawMode);
440 static Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
441 static Standard_Boolean m_IsVisible = Standard_False;
443 if ( m_IsVisible && !Draw) // move or up : erase at the old position
445 clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);
446 clientDC.LineTo(StoredMaxX,StoredMaxY);
447 clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
451 StoredMinX = min ( MinX, MaxX );
452 StoredMinY = min ( MinY, MaxY );
453 StoredMaxX = max ( MinX, MaxX );
454 StoredMaxY = max ( MinY, MaxY);
456 if (Draw) // move : draw
458 clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);
459 clientDC.LineTo(StoredMaxX,StoredMaxY);
460 clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
465 clientDC.SelectObject(aOldPen);
468 void COCCDemoView::InitButtons()
475 myCurrentMode = CurAction3d_Nothing;
478 void COCCDemoView::Reset()
481 myVisMode = VIS_SHADE;
482 if (!myView.IsNull())
489 void COCCDemoView::RedrawVisMode()
494 GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
495 myView->SetComputedMode (Standard_False);
498 GetDocument()->GetAISContext()->SetDisplayMode(AIS_Shaded);
499 myView->SetComputedMode (Standard_False);
502 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
503 myView->SetComputedMode (Standard_True);
504 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
505 GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
510 void COCCDemoView::OnBUTTONWire()
512 myVisMode = VIS_WIREFRAME;
516 void COCCDemoView::OnBUTTONShade()
518 myVisMode = VIS_SHADE;
522 void COCCDemoView::OnBUTTONHlrOn()
528 void COCCDemoView::OnUpdateBUTTONWire(CCmdUI* pCmdUI)
530 pCmdUI->SetCheck (myVisMode == VIS_WIREFRAME);
531 pCmdUI->Enable (myVisMode != VIS_WIREFRAME);
534 void COCCDemoView::OnUpdateBUTTONShade(CCmdUI* pCmdUI)
536 pCmdUI->SetCheck (myVisMode == VIS_SHADE);
537 pCmdUI->Enable (myVisMode != VIS_SHADE);
540 void COCCDemoView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI)
542 pCmdUI->SetCheck (myVisMode == VIS_HLR);
543 pCmdUI->Enable (myVisMode != VIS_HLR);
546 void COCCDemoView::GetViewCenter(V3d_Coordinate& Xc, V3d_Coordinate& Yc)
548 myView->Center(Xc,Yc);
551 void COCCDemoView::SetViewCenter(V3d_Coordinate Xc, V3d_Coordinate Yc)
553 myView->SetCenter(Xc,Yc);
556 void COCCDemoView::GetViewEye(V3d_Coordinate& X, V3d_Coordinate& Y, V3d_Coordinate& Z)
561 void COCCDemoView::SetViewEye(V3d_Coordinate X, V3d_Coordinate Y, V3d_Coordinate Z)
563 myView->SetEye(X,Y,Z);
566 Quantity_Factor COCCDemoView::GetViewScale()
568 return myView->Scale();
571 void COCCDemoView::SetViewScale(Quantity_Factor Coef)
573 myView->SetScale(Coef);