7fd59977 |
1 | // AnimationView3D.cpp : implementation of the CAnimationView3D class |
2 | // |
3 | |
4 | #include "stdafx.h" |
5 | |
6 | #include "AnimationView3D.h" |
7 | |
8 | #include "AnimationApp.h" |
9 | #include "ShadingDialog.h" |
10 | #include "AnimationDoc.h" |
11 | |
12 | #include "Sensitivity.h" |
13 | |
14 | #ifdef _DEBUG |
15 | //#define new DEBUG_NEW by CasCade |
16 | #undef THIS_FILE |
17 | static char THIS_FILE[] = __FILE__; |
18 | #endif |
19 | static int rotCount = 0; |
20 | |
21 | // for elastic bean selection |
22 | #define ValZWMin 1 |
23 | |
24 | |
25 | ///////////////////////////////////////////////////////////////////////////// |
26 | // CAnimationView3D |
27 | |
28 | IMPLEMENT_DYNCREATE(CAnimationView3D, CView) |
29 | |
30 | BEGIN_MESSAGE_MAP(CAnimationView3D, CView) |
31 | //{{AFX_MSG_MAP(CAnimationView3D) |
32 | ON_COMMAND(ID_BUTTONAxo, OnBUTTONAxo) |
33 | ON_COMMAND(ID_BUTTONBack, OnBUTTONBack) |
34 | ON_COMMAND(ID_BUTTONBottom, OnBUTTONBottom) |
35 | ON_COMMAND(ID_BUTTONFront, OnBUTTONFront) |
36 | ON_COMMAND(ID_BUTTONHlrOff, OnBUTTONHlrOff) |
37 | ON_COMMAND(ID_BUTTONHlrOn, OnBUTTONHlrOn) |
38 | ON_COMMAND(ID_BUTTONLeft, OnBUTTONLeft) |
39 | ON_COMMAND(ID_BUTTONPan, OnBUTTONPan) |
40 | ON_COMMAND(ID_BUTTONPanGlo, OnBUTTONPanGlo) |
41 | ON_COMMAND(ID_BUTTONReset, OnBUTTONReset) |
42 | ON_COMMAND(ID_BUTTONRight, OnBUTTONRight) |
43 | ON_COMMAND(ID_BUTTONRot, OnBUTTONRot) |
44 | ON_COMMAND(ID_BUTTONTop, OnBUTTONTop) |
45 | ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll) |
46 | ON_COMMAND(ID_FILE_EXPORT_IMAGE, OnFileExportImage) |
47 | ON_WM_SIZE() |
48 | ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg) |
49 | ON_COMMAND(ID_BUTTONZoomWin, OnBUTTONZoomWin) |
50 | ON_WM_LBUTTONDOWN() |
51 | ON_WM_LBUTTONUP() |
52 | ON_WM_MBUTTONDOWN() |
53 | ON_WM_MBUTTONUP() |
54 | ON_WM_MOUSEMOVE() |
55 | ON_WM_RBUTTONDOWN() |
56 | ON_WM_RBUTTONUP() |
57 | ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOff, OnUpdateBUTTONHlrOff) |
58 | ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn) |
59 | ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo) |
60 | ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan) |
61 | ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg) |
62 | ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin) |
63 | ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot) |
64 | |
65 | ON_COMMAND(ID_Modify_ChangeBackground , OnChangeBackground) |
66 | ON_WM_TIMER() |
67 | ON_COMMAND(ID_STOP, OnStop) |
68 | ON_COMMAND(ID_RESTART, OnRestart) |
69 | |
70 | ON_COMMAND(ID_SENSITIVITY, OnSensitivity) |
71 | ON_COMMAND(ID_BUTTONFly, OnBUTTONFly) |
72 | ON_COMMAND(ID_BUTTONTurn, OnBUTTONTurn) |
73 | ON_UPDATE_COMMAND_UI(ID_BUTTONFly, OnUpdateBUTTONFly) |
74 | ON_UPDATE_COMMAND_UI(ID_BUTTONTurn, OnUpdateBUTTONTurn) |
75 | ON_COMMAND(ID_VIEW_DISPLAYSTATUS, OnViewDisplaystatus) |
76 | ON_UPDATE_COMMAND_UI(ID_VIEW_DISPLAYSTATUS, OnUpdateViewDisplaystatus) |
77 | //}}AFX_MSG_MAP |
78 | // CasCade |
79 | |
80 | END_MESSAGE_MAP() |
81 | |
82 | ///////////////////////////////////////////////////////////////////////////// |
83 | // CAnimationView3D construction/destruction |
84 | |
85 | CAnimationView3D::CAnimationView3D() |
86 | { |
87 | // TODO: add construction code here |
88 | |
89 | myXmin=0; |
90 | myYmin=0; |
91 | myXmax=0; |
92 | myYmax=0; |
93 | myCurZoom=0; |
94 | // will be set in OnInitial update, but, for more security : |
95 | myCurrentMode = CurrentAction3d_Nothing; |
96 | myDegenerateModeIsOn=Standard_True; |
97 | m_Pen = NULL; |
98 | |
99 | myXmin=0; |
100 | myYmin=0; |
101 | myXmax=0; |
102 | myYmax=0; |
103 | myCurZoom=0; |
104 | |
105 | // will be set in OnInitial update, but, for more security : |
106 | m_FlySens = 500. ; |
42e4630c |
107 | m_TurnSens = M_PI / 40. ; |
7fd59977 |
108 | } |
109 | |
110 | CAnimationView3D::~CAnimationView3D() |
111 | { |
112 | myView->Remove(); |
113 | if (m_Pen) delete m_Pen; |
114 | } |
115 | |
116 | BOOL CAnimationView3D::PreCreateWindow(CREATESTRUCT& cs) |
117 | { |
118 | // TODO: Modify the Window class or styles here by modifying |
119 | // the CREATESTRUCT cs |
120 | |
121 | return CView::PreCreateWindow(cs); |
122 | } |
123 | |
124 | ///////////////////////////////////////////////////////////////////////////// |
125 | // CAnimationView3D drawing |
126 | |
127 | void CAnimationView3D::OnDraw(CDC* pDC) |
128 | { |
129 | CAnimationDoc* pDoc = GetDocument(); |
130 | ASSERT_VALID(pDoc); |
131 | |
132 | // TODO: add draw code for native data here |
133 | |
134 | myView->Redraw(); |
135 | |
136 | } |
137 | void CAnimationView3D::OnInitialUpdate() |
138 | { |
139 | CView::OnInitialUpdate(); |
140 | |
141 | // TODO: Add your specialized code here and/or call the base class |
142 | // TODO: Add your specialized code here and/or call the base class |
143 | // myView = GetDocument()->GetViewer()->CreateView(); |
144 | |
145 | Handle(V3d_Viewer) aViewer ; |
146 | |
147 | aViewer = GetDocument()->GetViewer() ; |
148 | aViewer->DefaultPerspectiveView () ; |
149 | aViewer->SetDefaultTypeOfView ( V3d_PERSPECTIVE ) ; |
150 | myView = aViewer->CreateView(); |
151 | |
152 | // store for restore state after rotation (witch is in Degenerated mode) |
153 | myDegenerateModeIsOn = myView->DegenerateModeIsOn(); |
154 | |
dc3fe572 |
155 | Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd ()); |
7fd59977 |
156 | myView->SetWindow(aWNTWindow); |
157 | if (!aWNTWindow->IsMapped()) aWNTWindow->Map(); |
158 | |
159 | // store the mode ( nothing , dynamic zooming, dynamic ... ) |
160 | myCurrentMode = CurrentAction3d_Nothing; |
161 | CFrameWnd* pParentFrm = GetParentFrame(); |
162 | pParentFrm->ActivateFrame(SW_SHOWMAXIMIZED); |
163 | |
164 | Standard_Integer w=100 , h=100 ; /* Debug Matrox */ |
165 | aWNTWindow->Size (w,h) ; /* Keeps me unsatisfied (rlb)..... */ |
166 | /* Resize is not supposed to be done on */ |
167 | /* Matrox */ |
168 | /* I suspect another problem elsewhere */ |
169 | ::PostMessage ( GetSafeHwnd () , WM_SIZE , SIZE_RESTORED , w + h*65536 ) ; |
170 | |
171 | myPView = Handle(V3d_PerspectiveView)::DownCast (myView); |
172 | |
173 | m_Tune.Create ( IDD_TUNE , NULL ) ; |
174 | |
175 | RECT dlgrect; |
176 | m_Tune.GetWindowRect(&dlgrect); |
177 | LONG width = dlgrect.right-dlgrect.left; |
178 | LONG height = dlgrect.bottom-dlgrect.top; |
179 | RECT MainWndRect; |
180 | AfxGetApp()->m_pMainWnd->GetWindowRect(&MainWndRect); |
181 | LONG left = MainWndRect.left+3; |
182 | LONG top = MainWndRect.top + 112; |
183 | m_Tune.MoveWindow(left,top,width,height); |
184 | |
185 | m_Tune.m_pView = this ; |
186 | |
187 | m_Tune.ShowWindow ( SW_HIDE ); |
188 | |
189 | // store the mode ( nothing , dynamic zooming, dynamic ... ) |
190 | |
191 | myCurrentMode = CurrentAction3d_Nothing; |
192 | |
193 | ReloadData () ; |
194 | |
195 | } |
196 | |
197 | void CAnimationView3D::DisplayTuneDialog() |
198 | { |
199 | m_Tune.Create ( IDD_TUNE , NULL ) ; |
200 | |
201 | RECT dlgrect; |
202 | m_Tune.GetWindowRect(&dlgrect); |
203 | LONG width = dlgrect.right-dlgrect.left; |
204 | LONG height = dlgrect.bottom-dlgrect.top; |
205 | RECT MainWndRect; |
206 | AfxGetApp()->m_pMainWnd->GetWindowRect(&MainWndRect); |
207 | LONG left = MainWndRect.left+3; |
208 | LONG top = MainWndRect.top + 112; |
209 | m_Tune.MoveWindow(left,top,width,height); |
210 | |
211 | m_Tune.m_pView = this ; |
212 | } |
213 | |
214 | |
215 | ///////////////////////////////////////////////////////////////////////////// |
216 | // CAnimationView3D diagnostics |
217 | |
218 | #ifdef _DEBUG |
219 | void CAnimationView3D::AssertValid() const |
220 | { |
221 | CView::AssertValid(); |
222 | } |
223 | |
224 | void CAnimationView3D::Dump(CDumpContext& dc) const |
225 | { |
226 | CView::Dump(dc); |
227 | } |
228 | |
229 | CAnimationDoc* CAnimationView3D::GetDocument() // non-debug version is inline |
230 | { |
231 | ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAnimationDoc))); |
232 | return (CAnimationDoc*)m_pDocument; |
233 | } |
234 | #endif //_DEBUG |
235 | |
236 | ///////////////////////////////////////////////////////////////////////////// |
237 | // CAnimationView3D message handlers |
238 | void CAnimationView3D::OnFileExportImage() |
239 | { |
240 | CFileDialog dlg(FALSE,_T("*.BMP"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, |
3994ec41 |
241 | _T("BMP Files (*.BMP)|*.bmp |GIF Files (*.GIF)|*.gif | PNG Files (*.PNG)|*.png" |
242 | "|JPEG Files (*.JPEG)|*.jpeg | PPM Files (*.PPM)|*.ppm | TIFF Files (*.TIFF)" |
243 | "|*.tiff | TGA Files (*.TGA)|*.tga | EXR Files (*.EXR)|*.exr||"), |
7fd59977 |
244 | NULL ); |
245 | |
246 | if (dlg.DoModal() == IDOK) |
247 | { |
248 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); |
3994ec41 |
249 | CString aFileName = dlg.GetPathName(); |
250 | myView->Dump(aFileName); |
7fd59977 |
251 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
252 | } |
253 | } |
254 | |
255 | void CAnimationView3D::OnSize(UINT nType, int cx, int cy) |
256 | { |
257 | m_cx = cx ; |
258 | m_cy = cy ; |
259 | if (!myView.IsNull()) |
260 | myView->MustBeResized(); |
261 | } |
262 | |
263 | void CAnimationView3D::OnBUTTONBack() |
264 | { myView->SetProj(V3d_Xneg); } // See the back View |
265 | void CAnimationView3D::OnBUTTONFront() |
266 | { myView->SetProj(V3d_Xpos); } // See the front View |
267 | |
268 | void CAnimationView3D::OnBUTTONBottom() |
269 | { myView->SetProj(V3d_Zneg); } // See the bottom View |
270 | void CAnimationView3D::OnBUTTONTop() |
271 | { myView->SetProj(V3d_Zpos); } // See the top View |
272 | |
273 | void CAnimationView3D::OnBUTTONLeft() |
274 | { myView->SetProj(V3d_Ypos); } // See the left View |
275 | void CAnimationView3D::OnBUTTONRight() |
276 | { myView->SetProj(V3d_Yneg); } // See the right View |
277 | |
278 | void CAnimationView3D::OnBUTTONAxo() |
279 | { myView->SetProj(V3d_XposYnegZpos); } // See the axonometric View |
280 | |
281 | void CAnimationView3D::OnBUTTONHlrOff() |
282 | { |
283 | myView->SetDegenerateModeOn(); |
284 | myDegenerateModeIsOn = Standard_True; |
285 | } |
286 | |
287 | void CAnimationView3D::OnBUTTONHlrOn() |
288 | { |
289 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); |
290 | myView->SetDegenerateModeOff(); |
291 | myDegenerateModeIsOn = Standard_False; |
292 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
293 | } |
294 | |
295 | void CAnimationView3D::OnBUTTONPan() |
296 | { |
297 | myCurrentMode = CurrentAction3d_DynamicPanning; |
298 | } |
299 | |
300 | void CAnimationView3D::OnBUTTONPanGlo() |
301 | { |
302 | // save the current zoom value |
303 | myCurZoom = myView->Scale(); |
304 | // Do a Global Zoom |
305 | myView->FitAll(); |
306 | // Set the mode |
307 | myCurrentMode = CurrentAction3d_GlobalPanning; |
308 | } |
309 | |
310 | void CAnimationView3D::OnBUTTONReset() |
311 | { myView->Reset(); |
312 | ReloadData(); |
313 | } |
314 | |
315 | void CAnimationView3D::OnBUTTONRot() |
316 | { myCurrentMode = CurrentAction3d_DynamicRotation; } |
317 | |
318 | |
319 | void CAnimationView3D::OnBUTTONZoomAll() |
320 | { |
321 | SetDimensions(); |
322 | myView->FitAll(); |
323 | myView->ZFitAll(); |
324 | } |
325 | |
326 | void CAnimationView3D::OnBUTTONZoomProg() |
327 | { myCurrentMode = CurrentAction3d_DynamicZooming; } |
328 | |
329 | void CAnimationView3D::OnBUTTONZoomWin() |
330 | { myCurrentMode = CurrentAction3d_WindowZooming; } |
331 | |
332 | void CAnimationView3D::OnBUTTONFly() |
333 | { myCurrentMode = CurrentAction3d_Fly; } |
334 | |
335 | void CAnimationView3D::OnBUTTONTurn() |
336 | { myCurrentMode = CurrentAction3d_Turn; } |
337 | |
338 | |
339 | void CAnimationView3D::OnLButtonDown(UINT nFlags, CPoint point) |
340 | { |
341 | // save the current mouse coordinate in min |
342 | myXmin=point.x; myYmin=point.y; |
343 | myXmax=point.x; myYmax=point.y; |
344 | |
345 | if ( nFlags & MK_CONTROL ) |
346 | { |
347 | // Button MB1 down Control :start zomming |
348 | // SetCursor(AfxGetApp()->LoadStandardCursor()); |
349 | } |
350 | else // if ( Ctrl ) |
351 | { |
352 | switch (myCurrentMode) |
353 | { |
354 | case CurrentAction3d_Nothing : // start a drag |
355 | if (nFlags & MK_SHIFT) |
356 | GetDocument()->ShiftDragEvent(myXmax,myYmax,-1,myView); |
357 | else |
358 | GetDocument()->DragEvent(myXmax,myYmax,-1,myView); |
359 | break; |
360 | break; |
361 | case CurrentAction3d_DynamicZooming : // noting |
362 | // SetCursor(AfxGetApp()->LoadStandardCursor()); |
363 | break; |
364 | case CurrentAction3d_WindowZooming : // noting |
365 | break; |
366 | case CurrentAction3d_DynamicPanning :// noting |
367 | break; |
368 | case CurrentAction3d_GlobalPanning :// noting |
369 | break; |
370 | case CurrentAction3d_DynamicRotation : |
371 | if (!myDegenerateModeIsOn) |
372 | myView->SetDegenerateModeOn(); |
373 | myView->StartRotation(point.x,point.y); |
374 | break; |
375 | case CurrentAction3d_Fly : |
376 | KillTimer (1) ; |
377 | SetTimer ( 1 , 100 , NULL ) ; |
378 | break ; |
379 | case CurrentAction3d_Turn : |
380 | KillTimer (1) ; |
381 | SetTimer ( 1 , 100 , NULL ) ; |
382 | break ; |
383 | default : |
384 | Standard_Failure::Raise(" incompatible Current Mode "); |
385 | break; |
386 | } |
387 | } |
388 | } |
389 | |
390 | void CAnimationView3D::OnLButtonUp(UINT nFlags, CPoint point) |
391 | { |
392 | if ( nFlags & MK_CONTROL ) |
393 | { |
394 | return; |
395 | } |
396 | else // if ( Ctrl ) |
397 | { |
398 | switch (myCurrentMode) |
399 | { |
400 | case CurrentAction3d_Nothing : |
401 | if (point.x == myXmin && point.y == myYmin) |
402 | { // no offset between down and up --> selectEvent |
403 | myXmax=point.x; |
404 | myYmax=point.y; |
405 | if (nFlags & MK_SHIFT ) |
406 | GetDocument()->ShiftInputEvent(point.x,point.y,myView); |
407 | else |
408 | GetDocument()->InputEvent (point.x,point.y,myView); |
409 | } else |
410 | { |
411 | DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False); |
412 | myXmax=point.x; |
413 | myYmax=point.y; |
414 | if (nFlags & MK_SHIFT) |
415 | GetDocument()->ShiftDragEvent(point.x,point.y,1,myView); |
416 | else |
417 | GetDocument()->DragEvent(point.x,point.y,1,myView); |
418 | } |
419 | break; |
420 | case CurrentAction3d_DynamicZooming : |
421 | // SetCursor(AfxGetApp()->LoadStandardCursor()); |
422 | myCurrentMode = CurrentAction3d_Nothing; |
423 | break; |
424 | case CurrentAction3d_WindowZooming : |
425 | myXmax=point.x; myYmax=point.y; |
426 | DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash); |
427 | if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin)) |
428 | // Test if the zoom window is greater than a minimale window. |
429 | { |
430 | // Do the zoom window between Pmin and Pmax |
431 | myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax); |
432 | } |
433 | myCurrentMode = CurrentAction3d_Nothing; |
434 | break; |
435 | case CurrentAction3d_DynamicPanning : |
436 | myCurrentMode = CurrentAction3d_Nothing; |
437 | break; |
438 | case CurrentAction3d_GlobalPanning : |
439 | myView->Place(point.x,point.y,myCurZoom); |
440 | myCurrentMode = CurrentAction3d_Nothing; |
441 | break; |
442 | case CurrentAction3d_DynamicRotation : |
443 | myCurrentMode = CurrentAction3d_Nothing; |
444 | break; |
445 | case CurrentAction3d_Fly : |
446 | KillTimer ( 1 ) ; |
447 | case CurrentAction3d_Turn : |
448 | KillTimer ( 1 ) ; |
449 | break; |
450 | default : |
451 | Standard_Failure::Raise(" incompatible Current Mode "); |
452 | break; |
453 | } //switch (myCurrentMode) |
454 | } // else // if ( Ctrl ) |
455 | } |
456 | |
457 | void CAnimationView3D::OnMButtonDown(UINT nFlags, CPoint point) |
458 | { |
459 | if ( nFlags & MK_CONTROL ) |
460 | { |
461 | // Button MB2 down Control : panning init |
462 | // SetCursor(AfxGetApp()->LoadStandardCursor()); |
463 | } |
464 | } |
465 | |
466 | void CAnimationView3D::OnMButtonUp(UINT nFlags, CPoint point) |
467 | { |
468 | if ( nFlags & MK_CONTROL ) |
469 | { |
470 | // Button MB2 down Control : panning init |
471 | // SetCursor(AfxGetApp()->LoadStandardCursor()); |
472 | } |
473 | } |
474 | |
475 | void CAnimationView3D::OnRButtonDown(UINT nFlags, CPoint point) |
476 | { |
477 | if ( nFlags & MK_CONTROL ) |
478 | { |
479 | // SetCursor(AfxGetApp()->LoadStandardCursor()); |
480 | if (!myDegenerateModeIsOn) |
481 | myView->SetDegenerateModeOn(); |
482 | myView->StartRotation(point.x,point.y); |
483 | } |
484 | else // if ( Ctrl ) |
485 | { |
486 | GetDocument()->Popup(point.x,point.y,myView); |
487 | } |
488 | } |
489 | |
490 | void CAnimationView3D::OnRButtonUp(UINT nFlags, CPoint point) |
491 | { |
492 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); |
493 | if (!myDegenerateModeIsOn) |
494 | { |
495 | myView->SetDegenerateModeOff(); |
496 | myDegenerateModeIsOn = Standard_False; |
497 | } else |
498 | { |
499 | myView->SetDegenerateModeOn(); |
500 | myDegenerateModeIsOn = Standard_True; |
501 | } |
502 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
503 | } |
504 | |
505 | void CAnimationView3D::OnMouseMove(UINT nFlags, CPoint point) |
506 | { |
507 | // ============================ LEFT BUTTON ======================= |
508 | m_curx = point.x ; |
509 | m_cury = point.y ; |
510 | |
511 | if ( nFlags & MK_LBUTTON) |
512 | { |
513 | if ( nFlags & MK_CONTROL ) |
514 | { |
515 | // move with MB1 and Control : on the dynamic zooming |
516 | // Do the zoom in function of mouse's coordinates |
517 | myView->Zoom(myXmax,myYmax,point.x,point.y); |
518 | // save the current mouse coordinate in min |
519 | myXmax = point.x; |
520 | myYmax = point.y; |
521 | } |
522 | else // if ( Ctrl ) |
523 | { |
524 | switch (myCurrentMode) |
525 | { |
526 | case CurrentAction3d_Nothing : |
527 | myXmax = point.x; myYmax = point.y; |
528 | DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False); |
529 | if (nFlags & MK_SHIFT) |
530 | GetDocument()->ShiftDragEvent(myXmax,myYmax,0,myView); |
531 | else |
532 | GetDocument()->DragEvent(myXmax,myYmax,0,myView); |
533 | DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True); |
534 | break; |
535 | case CurrentAction3d_DynamicZooming : |
536 | myView->Zoom(myXmax,myYmax,point.x,point.y); |
537 | // save the current mouse coordinate in min \n"; |
538 | myXmax=point.x; myYmax=point.y; |
539 | break; |
540 | case CurrentAction3d_WindowZooming : |
541 | myXmax = point.x; myYmax = point.y; |
542 | DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash); |
543 | DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash); |
544 | break; |
545 | case CurrentAction3d_DynamicPanning : |
546 | myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning |
547 | myXmax = point.x; myYmax = point.y; |
548 | break; |
549 | case CurrentAction3d_GlobalPanning : // nothing |
550 | break; |
551 | case CurrentAction3d_DynamicRotation : |
552 | myView->Rotation(point.x,point.y); |
553 | myView->Redraw(); |
554 | break; |
555 | case CurrentAction3d_Fly : |
556 | break ; |
557 | case CurrentAction3d_Turn : |
558 | break ; |
559 | default : |
560 | Standard_Failure::Raise(" incompatible Current Mode "); |
561 | break; |
562 | }// switch (myCurrentMode) |
563 | }// if ( nFlags & MK_CONTROL ) else |
564 | } else // if ( nFlags & MK_LBUTTON) |
565 | // ============================ MIDDLE BUTTON ======================= |
566 | if ( nFlags & MK_MBUTTON) |
567 | { |
568 | if ( nFlags & MK_CONTROL ) |
569 | { |
570 | myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning |
571 | myXmax = point.x; myYmax = point.y; |
572 | |
573 | } |
574 | } else // if ( nFlags & MK_MBUTTON) |
575 | // ============================ RIGHT BUTTON ======================= |
576 | if ( nFlags & MK_RBUTTON) |
577 | { |
578 | if ( nFlags & MK_CONTROL ) |
579 | { |
580 | rotCount++; |
581 | myView->Rotation(point.x,point.y); |
582 | } |
583 | }else //if ( nFlags & MK_RBUTTON) |
584 | // ============================ NO BUTTON ======================= |
585 | { // No buttons |
586 | myXmax = point.x; myYmax = point.y; |
587 | if (nFlags & MK_SHIFT) |
588 | GetDocument()->ShiftMoveEvent(point.x,point.y,myView); |
589 | else |
590 | GetDocument()->MoveEvent(point.x,point.y,myView); |
591 | } |
592 | } |
593 | |
594 | void CAnimationView3D::OnUpdateBUTTONHlrOff(CCmdUI* pCmdUI) |
595 | { |
596 | pCmdUI->SetCheck (myDegenerateModeIsOn); |
597 | pCmdUI->Enable (!myDegenerateModeIsOn); |
598 | } |
599 | |
600 | void CAnimationView3D::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI) |
601 | { |
602 | pCmdUI->SetCheck (!myDegenerateModeIsOn); |
603 | pCmdUI->Enable (myDegenerateModeIsOn); |
604 | } |
605 | |
606 | void CAnimationView3D::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) |
607 | { |
608 | pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_GlobalPanning); |
609 | pCmdUI->Enable (myCurrentMode != CurrentAction3d_GlobalPanning); |
610 | |
611 | } |
612 | |
613 | void CAnimationView3D::OnUpdateBUTTONPan(CCmdUI* pCmdUI) |
614 | { |
615 | pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_DynamicPanning); |
616 | pCmdUI->Enable (myCurrentMode != CurrentAction3d_DynamicPanning ); |
617 | } |
618 | |
619 | void CAnimationView3D::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) |
620 | { |
621 | pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_DynamicZooming ); |
622 | pCmdUI->Enable (myCurrentMode != CurrentAction3d_DynamicZooming); |
623 | } |
624 | |
625 | void CAnimationView3D::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) |
626 | { |
627 | pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_WindowZooming); |
628 | pCmdUI->Enable (myCurrentMode != CurrentAction3d_WindowZooming); |
629 | } |
630 | |
631 | void CAnimationView3D::OnUpdateBUTTONRot(CCmdUI* pCmdUI) |
632 | { |
633 | pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_DynamicRotation); |
634 | pCmdUI->Enable (myCurrentMode != CurrentAction3d_DynamicRotation); |
635 | } |
636 | |
637 | void CAnimationView3D::OnUpdateBUTTONFly(CCmdUI* pCmdUI) |
638 | { |
639 | pCmdUI->Enable(GetDocument()->m_bIsGridLoaded); |
640 | pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_Fly); |
641 | } |
642 | |
643 | void CAnimationView3D::OnUpdateBUTTONTurn(CCmdUI* pCmdUI) |
644 | { |
645 | pCmdUI->Enable(GetDocument()->m_bIsGridLoaded); |
646 | pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_Turn); |
647 | } |
648 | |
649 | void CAnimationView3D::OnChangeBackground() |
650 | { |
651 | Standard_Real R1; |
652 | Standard_Real G1; |
653 | Standard_Real B1; |
654 | myView->BackgroundColor(Quantity_TOC_RGB,R1,G1,B1); |
655 | COLORREF m_clr ; |
656 | m_clr = RGB(R1*255,G1*255,B1*255); |
657 | |
658 | CColorDialog dlgColor(m_clr); |
659 | if (dlgColor.DoModal() == IDOK) |
660 | { |
661 | m_clr = dlgColor.GetColor(); |
662 | R1 = GetRValue(m_clr)/255.; |
663 | G1 = GetGValue(m_clr)/255.; |
664 | B1 = GetBValue(m_clr)/255.; |
665 | myView->SetBackgroundColor(Quantity_TOC_RGB,R1,G1,B1); |
666 | } |
667 | myView->Redraw(); |
668 | } |
669 | |
670 | //========================================================================================== |
671 | //========================================================================================== |
672 | //========================================================================================== |
673 | |
674 | //----------------------------------------------------------------------------------------- |
675 | // |
676 | //----------------------------------------------------------------------------------------- |
677 | void CAnimationView3D::DrawRectangle(const Standard_Integer MinX , |
678 | const Standard_Integer MinY , |
679 | const Standard_Integer MaxX , |
680 | const Standard_Integer MaxY , |
681 | const Standard_Boolean Draw , |
682 | const LineStyle aLineStyle) |
683 | { |
684 | static int m_DrawMode; |
685 | if (!m_Pen && aLineStyle ==Solid ) |
686 | {m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;} |
687 | else if (!m_Pen && aLineStyle ==Dot ) |
688 | {m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0)); m_DrawMode = R2_XORPEN;} |
689 | else if (!m_Pen && aLineStyle == ShortDash) |
690 | {m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0)); m_DrawMode = R2_XORPEN;} |
691 | else if (!m_Pen && aLineStyle == LongDash) |
692 | {m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0)); m_DrawMode = R2_NOTXORPEN;} |
693 | else if (aLineStyle == Default) |
694 | { m_Pen = NULL; m_DrawMode = R2_MERGEPENNOT;} |
695 | |
696 | CPen* aOldPen; |
697 | CClientDC clientDC(this); |
698 | if (m_Pen) aOldPen = clientDC.SelectObject(m_Pen); |
699 | clientDC.SetROP2(m_DrawMode); |
700 | |
701 | static Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY; |
702 | static Standard_Boolean m_IsVisible; |
703 | |
704 | if ( m_IsVisible && !Draw) // move or up : erase at the old position |
705 | { |
706 | clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); |
707 | clientDC.LineTo(StoredMaxX,StoredMaxY); |
708 | clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY); |
709 | m_IsVisible = false; |
710 | } |
711 | |
712 | StoredMinX = min ( MinX, MaxX ); |
713 | StoredMinY = min ( MinY, MaxY ); |
714 | StoredMaxX = max ( MinX, MaxX ); |
715 | StoredMaxY = max ( MinY, MaxY); |
716 | |
717 | if (Draw) // move : draw |
718 | { |
719 | clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); |
720 | clientDC.LineTo(StoredMaxX,StoredMaxY); |
721 | clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY); |
722 | m_IsVisible = true; |
723 | } |
724 | |
725 | if (m_Pen) |
726 | clientDC.SelectObject(aOldPen); |
727 | } |
728 | void CAnimationView3D::OnStop() |
729 | { |
730 | KillTimer(GetDocument()->myCount); |
731 | } |
732 | |
733 | void CAnimationView3D::OnRestart() |
734 | { |
735 | KillTimer(GetDocument()->myCount); |
736 | SetTimer(GetDocument()->myCount, 1 , NULL); |
737 | } |
738 | |
739 | /* |
740 | void CAnimationView3D::OnTimer(UINT nIDEvent) |
741 | { |
742 | // TODO: Add your message handler code here and/or call default |
743 | GetDocument()->OnMyTimer(); |
744 | CView::OnTimer(nIDEvent); |
745 | } |
746 | */ |
747 | |
748 | |
749 | /********************************************************************************* |
750 | ************** W A L K T H R O U G H ****************************************** |
751 | /********************************************************************************/ |
752 | |
753 | void CAnimationView3D::OnTimer(UINT_PTR nIDEvent) |
754 | { |
755 | if ( !GetDocument()->m_bIsGridLoaded ) |
756 | { |
757 | // TODO: Add your message handler code here and/or call default |
758 | GetDocument()->OnMyTimer(); |
759 | CView::OnTimer(nIDEvent); |
760 | } |
761 | else |
762 | { |
763 | CView::OnTimer(nIDEvent); |
764 | if ( nIDEvent == 1 ) { |
765 | myView->SetImmediateUpdate ( Standard_False ) ; |
766 | if ( myCurrentMode == CurrentAction3d_Fly ) { |
767 | |
768 | Fly ( m_curx , m_cury ) ; |
769 | if ( m_bShift ) |
770 | Roll ( m_curx , m_cury ) ; |
771 | else |
772 | Turn ( m_curx , m_cury ) ; |
773 | |
774 | myView->SetAt ( m_Atx , m_Aty , m_Atz ) ; |
775 | myView->SetEye ( m_Eyex , m_Eyey , m_Eyez ) ; |
776 | |
777 | } |
778 | else if ( myCurrentMode == CurrentAction3d_Turn ) { |
779 | Twist ( m_curx , m_cury ) ; |
780 | } |
781 | else |
782 | KillTimer (1) ; |
783 | |
784 | |
785 | myView->SetImmediateUpdate ( Standard_True ) ; |
786 | |
787 | myView->Update (); |
788 | } |
789 | |
790 | ReloadData () ; |
791 | } |
792 | } |
793 | |
794 | void CAnimationView3D::OnSensitivity() |
795 | { |
796 | CSensitivity dial ; |
797 | |
798 | dial.m_SensFly = m_FlySens ; |
799 | dial.m_SensTurn = m_TurnSens ; |
800 | if ( dial.DoModal () ) { |
801 | m_FlySens = dial.m_SensFly ; |
802 | m_TurnSens = dial.m_SensTurn ; |
803 | } |
804 | } |
805 | |
806 | void CAnimationView3D::Fly (int x , int y) |
807 | { |
808 | double v [3] ; |
809 | double l ; |
810 | double sens ; |
811 | int i ; |
812 | |
813 | sens = (double) myYmin - (double) y ; |
814 | sens /= (double) m_cy ; |
815 | sens *= m_FlySens ; |
816 | |
817 | v [0] = m_Atx - m_Eyex ; |
818 | v [1] = m_Aty - m_Eyey ; |
819 | v [2] = m_Atz - m_Eyez ; |
820 | l = sqrt ( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) ; |
821 | if ( l > 1.e-3 ) { |
822 | for ( i=0 ; i<3 ; i++ ) |
823 | v [i] = v [i] / l * sens ; |
824 | |
825 | m_Atx += v [0] ; |
826 | m_Aty += v [1] ; |
827 | m_Atz += v [2] ; |
828 | |
829 | m_Eyex += v [0] ; |
830 | m_Eyey += v [1] ; |
831 | m_Eyez += v [2] ; |
832 | |
833 | } |
834 | } |
835 | |
836 | /* Rotation */ |
837 | |
838 | void CAnimationView3D::Turn (int x , int y) |
839 | { |
840 | gp_Vec z (0.,0.,1.) ; |
841 | |
842 | double v [3] ; |
843 | double sens ; |
844 | double aX , aY , aZ ; |
845 | |
846 | sens = (double) x - (double) myXmin ; |
847 | sens /= (double) m_cx ; |
848 | sens *= m_TurnSens ; |
849 | |
850 | v [0] = m_Atx - m_Eyex ; |
851 | v [1] = m_Aty - m_Eyey ; |
852 | v [2] = m_Atz - m_Eyez ; |
853 | |
854 | gp_Pnt eye ( m_Eyex , m_Eyey , m_Eyez ) ; |
855 | |
856 | gp_Vec reg (v[0],v[1],v[2] ); |
857 | |
858 | gp_Vec vert = reg ^ z ; |
859 | gp_Vec haut = vert ^ reg ; |
860 | |
861 | gp_Dir dh (haut) ; |
862 | gp_Ax1 rot (eye,dh); |
863 | |
864 | reg.Rotate (rot,sens) ; |
865 | |
866 | reg.Coord ( aX , aY , aZ ) ; |
867 | |
868 | m_Atx = m_Eyex + aX ; |
869 | m_Aty = m_Eyey + aY ; |
870 | m_Atz = m_Eyez + aZ ; |
871 | } |
872 | |
873 | void CAnimationView3D::Roll (int x , int y) |
874 | { |
875 | gp_Vec z (0.,0.,1.) ; |
876 | |
877 | double v [3] ; |
878 | double sens ; |
879 | double aX , aY , aZ ; |
880 | |
881 | sens = (double) x - (double) myXmin ; |
882 | sens /= (double) m_cx ; |
883 | sens *= m_TurnSens ; |
884 | |
885 | v [0] = m_Atx - m_Eyex ; |
886 | v [1] = m_Aty - m_Eyey ; |
887 | v [2] = m_Atz - m_Eyez ; |
888 | |
889 | gp_Pnt eye ( m_Eyex , m_Eyey , m_Eyez ) ; |
890 | |
891 | gp_Vec reg (v[0],v[1],v[2] ); |
892 | |
893 | gp_Vec vert = reg ^ z ; |
894 | |
895 | gp_Dir dh (vert) ; |
896 | gp_Ax1 rot (eye,dh); |
897 | |
898 | reg.Rotate (rot,sens) ; |
899 | |
900 | reg.Coord ( aX , aY , aZ ) ; |
901 | |
902 | m_Atx = m_Eyex + aX ; |
903 | m_Aty = m_Eyey + aY ; |
904 | m_Atz = m_Eyez + aZ ; |
905 | } |
906 | |
907 | void CAnimationView3D::Twist (int x , int y) |
908 | { |
909 | double sens ; |
910 | double a ; |
911 | |
912 | a = myView->Twist () ; |
913 | |
914 | sens = (double) x - (double) myXmin ; |
915 | sens /= (double) m_cx ; |
916 | sens *= m_TurnSens ; |
917 | |
918 | a += sens ; |
919 | |
920 | myView->SetTwist (a) ; |
921 | } |
922 | |
923 | void CAnimationView3D::SetFocal(double dFocus,double dAngle) |
924 | { |
925 | double v [3] ; |
926 | double l ; |
927 | int i ; |
928 | |
929 | v [0] = m_Atx - m_Eyex ; |
930 | v [1] = m_Aty - m_Eyey ; |
931 | v [2] = m_Atz - m_Eyez ; |
932 | |
933 | l = sqrt ( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) ; |
934 | if ( l > 1.e-3 ) { |
935 | for ( i=0 ; i<3 ; i++ ) |
936 | v [i] = v [i] / l * dFocus ; |
937 | |
938 | m_Focus = dFocus ; |
939 | |
940 | m_Atx = v [0] + m_Eyex ; |
941 | m_Aty = v [1] + m_Eyey ; |
942 | m_Atz = v [2] + m_Eyez ; |
943 | |
944 | myView->SetImmediateUpdate ( Standard_False ) ; |
945 | myView->SetAt ( m_Atx , m_Aty , m_Atz ) ; |
946 | m_dAngle = dAngle ; |
42e4630c |
947 | dAngle = dAngle * M_PI / 180. ; |
7fd59977 |
948 | myPView->SetAngle ( dAngle ) ; |
949 | dAngle = myPView->Angle () ; |
950 | |
951 | myView->SetImmediateUpdate ( Standard_True ) ; |
952 | myView->Update (); |
953 | } |
954 | } |
955 | |
956 | void CAnimationView3D::ReloadData() |
957 | { |
958 | char szMsg [128] ; |
959 | double dTwist ; |
960 | |
961 | myView->At ( m_Atx , m_Aty , m_Atz ) ; |
962 | myView->Eye ( m_Eyex , m_Eyey , m_Eyez ) ; |
963 | |
964 | dTwist = myView->Twist () ; |
42e4630c |
965 | dTwist = dTwist * 180. / M_PI ; |
7fd59977 |
966 | |
967 | sprintf_s ( szMsg , "%lf" , m_Atx ) ; |
968 | (m_Tune.GetDlgItem ( IDC_XAT ))->SetWindowText ( szMsg ) ; |
969 | sprintf_s ( szMsg , "%lf" , m_Aty ) ; |
970 | (m_Tune.GetDlgItem ( IDC_YAT ))->SetWindowText ( szMsg ) ; |
971 | sprintf_s ( szMsg , "%lf" , m_Atz ) ; |
972 | (m_Tune.GetDlgItem ( IDC_ZAT ))->SetWindowText ( szMsg ) ; |
973 | |
974 | sprintf_s ( szMsg , "%lf" , m_Eyex ) ; |
975 | (m_Tune.GetDlgItem ( IDC_XEYE ))->SetWindowText ( szMsg ) ; |
976 | sprintf_s ( szMsg , "%lf" , m_Eyey ) ; |
977 | (m_Tune.GetDlgItem ( IDC_YEYE ))->SetWindowText ( szMsg ) ; |
978 | sprintf_s ( szMsg , "%lf" , m_Eyez ) ; |
979 | (m_Tune.GetDlgItem ( IDC_ZEYE ))->SetWindowText ( szMsg ) ; |
980 | |
981 | sprintf_s ( szMsg , "%lf" , dTwist ) ; |
982 | (m_Tune.GetDlgItem ( IDC_TWIST ))->SetWindowText ( szMsg ) ; |
983 | |
984 | double dx,dy,dz ; |
985 | dx = m_Atx - m_Eyex ; |
986 | dy = m_Aty - m_Eyey ; |
987 | dz = m_Atz - m_Eyez ; |
988 | |
989 | m_Focus = sqrt ( dx * dx + dy * dy + dz * dz ) ; |
990 | m_dAngle = myPView->Angle () ; |
42e4630c |
991 | m_dAngle = m_dAngle * 180. / M_PI ; |
7fd59977 |
992 | |
993 | m_Tune.m_dAngle = m_dAngle ; |
994 | m_Tune.m_dFocus = m_Focus ; |
995 | m_Tune.UpdateData ( FALSE ) ; |
996 | } |
997 | |
998 | void CAnimationView3D::SetDimensions() |
999 | { |
1000 | |
1001 | CAnimationDoc* pDoc = GetDocument(); |
1002 | |
1003 | myView->SetImmediateUpdate ( Standard_False ) ; |
1004 | |
1005 | m_Atx = ( pDoc->m_Xmin + pDoc->m_Xmax ) / 2. ; |
1006 | m_Aty = ( pDoc->m_Ymin + pDoc->m_Ymax ) / 2. ; |
1007 | m_Atz = ( pDoc->m_Zmin + pDoc->m_Zmax ) / 2. ; |
1008 | m_Eyex = pDoc->m_Xmax ; |
1009 | m_Eyey = pDoc->m_Ymax ; |
1010 | m_Eyez = pDoc->m_Zmax ; |
1011 | |
1012 | myView->SetAt ( m_Atx , m_Aty , m_Atz ) ; |
1013 | myView->SetEye ( m_Eyex , m_Eyey , m_Eyez ) ; |
1014 | myView->SetTwist (0.) ; |
1015 | |
1016 | myView->SetImmediateUpdate ( Standard_False ) ; |
1017 | myView->FitAll(); |
1018 | myView->SetImmediateUpdate ( Standard_False ) ; |
1019 | myView->ZFitAll(); |
1020 | |
1021 | myView->SetImmediateUpdate ( Standard_True ) ; |
1022 | |
1023 | ReloadData () ; |
1024 | myView->Update (); |
1025 | } |
1026 | |
1027 | void CAnimationView3D::OnViewDisplaystatus() |
1028 | { |
1029 | // TODO: Add your command handler code here |
1030 | |
1031 | if ( m_Tune.IsWindowVisible () ) { |
1032 | |
1033 | } |
1034 | else { |
1035 | m_Tune.ShowWindow ( SW_SHOWNORMAL ) ; |
1036 | } |
1037 | } |
1038 | |
1039 | void CAnimationView3D::OnUpdateViewDisplaystatus(CCmdUI* pCmdUI) |
1040 | { |
1041 | // TODO: Add your command update UI handler code here |
1042 | |
1043 | if ( m_Tune.IsWindowVisible () ) { |
1044 | pCmdUI->SetCheck ( 1 ) ; |
1045 | } |
1046 | else { |
1047 | pCmdUI->SetCheck ( 0 ) ; |
1048 | } |
42e4630c |
1049 | } |