0031521: Samples - update MFC ImportExport sample to use AIS_ViewController
[occt.git] / samples / mfc / standard / Common / OCC_3dView.cpp
1 // OCC_3dView.cpp: implementation of the OCC_3dView class.
2 //
3
4 #include "stdafx.h"
5
6 #include "OCC_3dView.h"
7 #include "OCC_App.h"
8 #include "OCC_3dBaseDoc.h"
9 #include <res\OCC_Resource.h>
10
11 #include <Graphic3d_Camera.hxx>
12
13 #include <OpenGl_GraphicDriver.hxx>
14
15 IMPLEMENT_DYNCREATE(OCC_3dView, OCC_BaseView)
16
17 BEGIN_MESSAGE_MAP(OCC_3dView, OCC_BaseView)
18         //{{AFX_MSG_MAP(OCC_3dView)
19         ON_COMMAND(ID_BUTTONAxo, OnBUTTONAxo)
20         ON_COMMAND(ID_BUTTONBack, OnBUTTONBack)
21         ON_COMMAND(ID_BUTTONBottom, OnBUTTONBottom)
22         ON_COMMAND(ID_BUTTONFront, OnBUTTONFront)
23         ON_COMMAND(ID_BUTTONHlrOff, OnBUTTONHlrOff)
24         ON_COMMAND(ID_BUTTONHlrOn, OnBUTTONHlrOn)
25         ON_COMMAND(ID_BUTTONLeft, OnBUTTONLeft)
26         ON_COMMAND(ID_BUTTONPan, OnBUTTONPan)
27         ON_COMMAND(ID_BUTTONPanGlo, OnBUTTONPanGlo)
28         ON_COMMAND(ID_BUTTONReset, OnBUTTONReset)
29         ON_COMMAND(ID_BUTTONRight, OnBUTTONRight)
30         ON_COMMAND(ID_BUTTONRot, OnBUTTONRot)
31         ON_COMMAND(ID_BUTTONTop, OnBUTTONTop)
32         ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll)
33   ON_COMMAND(ID_BUTTON_STEREOCONFIG, OnStereoConfigButton)
34         ON_WM_SIZE()
35     ON_COMMAND(ID_FILE_EXPORT_IMAGE, OnFileExportImage)
36         ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg)
37         ON_COMMAND(ID_BUTTONZoomWin, OnBUTTONZoomWin)
38         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOff, OnUpdateBUTTONHlrOff)
39         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn)
40         ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo)
41         ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan)
42         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
43         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
44         ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
45   ON_UPDATE_COMMAND_UI(ID_BUTTON_STEREOCONFIG, OnUpdateStereoConfigButton)
46         ON_COMMAND(ID_Modify_ChangeBackground     , OnModifyChangeBackground)
47         //}}AFX_MSG_MAP
48 END_MESSAGE_MAP()
49
50 /////////////////////////////////////////////////////////////////////////////
51 // OCC_3dView construction/destruction
52
53 OCC_3dView::OCC_3dView()
54 {
55   // TODO: add construction code here
56 }
57
58 OCC_3dView::~OCC_3dView()
59 {
60   delete m_pStereoDlg;
61 }
62
63 /////////////////////////////////////////////////////////////////////////////
64 // OCC_3dView drawing
65 void OCC_3dView::OnInitialUpdate() 
66 {
67   OCC_BaseView::OnInitialUpdate();
68   m_pStereoDlg = new OCC_StereoConfigDlg (this);
69   m_pStereoDlg->SetView (myView);
70   m_pStereoDlg->Create (IDD_DIALOG_STEREO, this);
71 }
72
73 /////////////////////////////////////////////////////////////////////////////
74 // OCC_3dView diagnostics
75
76 #ifdef _DEBUG
77 void OCC_3dView::AssertValid() const
78 {
79         CView::AssertValid();
80 }
81
82 void OCC_3dView::Dump(CDumpContext& dc) const
83 {
84         CView::Dump(dc);
85 }
86
87 OCC_3dDoc* OCC_3dView::GetDocument() // non-debug version is inline
88 {
89 //      ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(OCC_3dBaseDoc)));
90         return (OCC_3dDoc*)m_pDocument;
91 }
92
93 #endif //_DEBUG
94
95 /////////////////////////////////////////////////////////////////////////////
96 // OCC_3dView message handlers
97 void OCC_3dView::OnFileExportImage()
98 {
99   GetDocument()->ExportView (myView);
100 }
101
102 // See the back View
103 void OCC_3dView::OnBUTTONBack() 
104 {
105   myView->SetProj(V3d_Ypos);
106   myView->Redraw();
107
108
109 // See the front View
110 void OCC_3dView::OnBUTTONFront() 
111 {
112   myView->SetProj(V3d_Yneg);
113   myView->Redraw();
114
115
116 // See the bottom View
117 void OCC_3dView::OnBUTTONBottom() 
118 {
119   myView->SetProj(V3d_Zneg);
120   myView->Redraw();
121 }
122
123 // See the top View
124 void OCC_3dView::OnBUTTONTop() 
125 {
126   myView->SetProj(V3d_Zpos);
127   myView->Redraw();
128 }       
129
130 // See the left View
131 void OCC_3dView::OnBUTTONLeft() 
132 {
133   myView->SetProj(V3d_Xneg);
134   myView->Redraw();
135 }
136
137 // See the right View
138 void OCC_3dView::OnBUTTONRight() 
139 {
140   myView->SetProj(V3d_Xpos);
141   myView->Redraw();
142
143
144 // See the axonometric View
145 void OCC_3dView::OnBUTTONAxo() 
146 {
147   myView->SetProj(V3d_XposYnegZpos);
148   myView->Redraw();
149
150
151 void OCC_3dView::OnBUTTONHlrOff() 
152 {
153   myView->SetComputedMode (Standard_False);
154   myView->Redraw();
155 }
156
157 void OCC_3dView::OnBUTTONHlrOn() 
158 {
159   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
160   myView->SetComputedMode (Standard_True);
161   myView->Redraw();
162   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
163 }
164
165 void OCC_3dView::OnBUTTONPan() 
166 {
167   setCurrentAction (CurAction3d_DynamicPanning);
168 }
169
170 void OCC_3dView::OnBUTTONPanGlo() 
171 {
172   // save the current zoom value 
173   myCurZoom = myView->Scale();
174   // Do a Global Zoom 
175   myView->FitAll();
176   // Set the mode 
177   setCurrentAction (CurAction3d_GlobalPanning);
178 }
179
180 void OCC_3dView::OnBUTTONReset() 
181 {
182   myView->Reset();
183 }
184
185 void OCC_3dView::OnBUTTONRot() 
186 {
187   setCurrentAction (CurAction3d_DynamicRotation);
188 }
189
190 void OCC_3dView::OnBUTTONZoomAll() 
191 {
192   myView->FitAll();
193   myView->ZFitAll();
194 }
195
196 void OCC_3dView::OnBUTTONZoomProg() 
197 {
198   setCurrentAction (CurAction3d_DynamicZooming);
199 }
200
201 void OCC_3dView::OnBUTTONZoomWin() 
202 {
203   setCurrentAction (CurAction3d_WindowZooming);
204 }
205
206 void OCC_3dView::OnUpdateBUTTONHlrOff(CCmdUI* pCmdUI) 
207 {
208   pCmdUI->SetCheck (!myView->ComputedMode());
209   pCmdUI->Enable   (myView->ComputedMode());
210 }
211
212 void OCC_3dView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI)
213 {
214   pCmdUI->SetCheck (myView->ComputedMode());
215   pCmdUI->Enable   (!myView->ComputedMode());
216 }
217
218 void OCC_3dView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) 
219 {
220   pCmdUI->SetCheck (getCurrentAction() == CurAction3d_GlobalPanning);
221   pCmdUI->Enable   (getCurrentAction() != CurAction3d_GlobalPanning);   
222 }
223
224 void OCC_3dView::OnUpdateBUTTONPan(CCmdUI* pCmdUI) 
225 {
226   pCmdUI->SetCheck (getCurrentAction() == CurAction3d_DynamicPanning);
227   pCmdUI->Enable   (getCurrentAction() != CurAction3d_DynamicPanning ); 
228 }
229
230 void OCC_3dView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) 
231 {
232   pCmdUI->SetCheck (getCurrentAction() == CurAction3d_DynamicZooming );
233   pCmdUI->Enable   (getCurrentAction() != CurAction3d_DynamicZooming);  
234 }
235
236 void OCC_3dView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) 
237 {
238   pCmdUI->SetCheck (getCurrentAction() == CurAction3d_WindowZooming);
239   pCmdUI->Enable   (getCurrentAction() != CurAction3d_WindowZooming);   
240 }
241
242 void OCC_3dView::OnUpdateBUTTONRot(CCmdUI* pCmdUI) 
243 {
244   pCmdUI->SetCheck (getCurrentAction() == CurAction3d_DynamicRotation);
245   pCmdUI->Enable   (getCurrentAction() != CurAction3d_DynamicRotation); 
246 }
247
248 void OCC_3dView::OnModifyChangeBackground() 
249 {
250         Standard_Real R1;
251         Standard_Real G1;
252         Standard_Real B1;
253     myView->BackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
254         COLORREF m_clr ;
255         m_clr = RGB(R1*255,G1*255,B1*255);
256
257         CColorDialog dlgColor(m_clr);
258         if (dlgColor.DoModal() == IDOK)
259         {
260                 m_clr = dlgColor.GetColor();
261                 R1 = GetRValue(m_clr)/255.;
262                 G1 = GetGValue(m_clr)/255.;
263                 B1 = GetBValue(m_clr)/255.;
264         myView->SetBackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
265         }
266     myView->Redraw();
267 }
268
269 //=============================================================================
270 // function: OnStereoConfigButton
271 // purpose: Open stereographic configuration dialog
272 //=============================================================================
273 void OCC_3dView::OnStereoConfigButton()
274 {
275   m_pStereoDlg->ShowWindow (SW_SHOW);
276 }
277
278 //=============================================================================
279 // function: OnUpdateStereoConfigButton
280 // purpose: Enable / disable state of stereo configuration button
281 //=============================================================================
282 void OCC_3dView::OnUpdateStereoConfigButton (CCmdUI* theCmdUI)
283 {
284   // get camera
285   Handle(Graphic3d_Camera) aCamera = myView->Camera();
286
287   // check that button is enabled
288   Standard_Boolean isEnabled = !aCamera.IsNull() && aCamera->IsStereo();
289
290   // update toggle state
291   theCmdUI->Enable (isEnabled);
292
293   if (!isEnabled)
294   {
295     m_pStereoDlg->ShowWindow (SW_HIDE);
296   }
297 }