0023821: Improve qmake project files for Qt samples
[occt.git] / samples / mfc / standard / 08_HLR / src / SelectionDialog.cpp
CommitLineData
7fd59977 1// SelectionDialog.cpp : implementation file
2//
3
4#include "stdafx.h"
5
6#include "SelectionDialog.h"
7
8#include "HLRApp.h"
9#include "OCC_2dView.h"
10#include <ISession2D/ISession2D_Shape.h>
11#include "Prs3d_Projector.hxx"
12
13#ifdef _DEBUG
14//#define new DEBUG_NEW
15#undef THIS_FILE
16static char THIS_FILE[] = __FILE__;
17#endif
18
19// the key for shortcut ( use to activate dynamic rotation, panning )
20#define CASCADESHORTCUTKEY MK_CONTROL
21
22/////////////////////////////////////////////////////////////////////////////
23// CSelectionDialog dialog
24
25CSelectionDialog::CSelectionDialog(CHLRDoc* aDoc,CWnd* pParent /*=NULL*/)
26 : CDialog(CSelectionDialog::IDD, pParent)
27{
28 myDoc = aDoc;
29 myDisplay = false;
30 //{{AFX_DATA_INIT(CSelectionDialog)
31 m_Algo = 0;
32 m_DisplayMode = 0;
33 m_NbIsos = 2;
34 m_DrawHiddenLine = TRUE;
35 m_DegeneratedModeOn = TRUE;
36 //}}AFX_DATA_INIT
37}
38
39void CSelectionDialog::DoDataExchange(CDataExchange* pDX)
40{
41 CDialog::DoDataExchange(pDX);
42 //{{AFX_DATA_MAP(CSelectionDialog)
43 DDX_Radio(pDX, IDC_PolyAlgo, m_Algo);
44 DDX_Radio(pDX, IDC_DisplayDefault, m_DisplayMode);
45 DDX_Text(pDX, IDC_EDIT_NBIsos, m_NbIsos);
46 DDX_Check(pDX, IDC_DrawHiddenLine, m_DrawHiddenLine);
47 DDX_Check(pDX, IDC_DegeneratedMode, m_DegeneratedModeOn);
48 //}}AFX_DATA_MAP
49}
50
51
52BEGIN_MESSAGE_MAP(CSelectionDialog, CDialog)
53 //{{AFX_MSG_MAP(CSelectionDialog)
54 ON_BN_CLICKED(ID_GetShape, OnGetShape)
55 ON_BN_CLICKED(IDC_DisplayDefault, OnDisplayDefault)
56 ON_BN_CLICKED(IDC_VIsoParametrics, OnVIsoParametrics)
57 ON_BN_CLICKED(IDC_VApparentContour, OnVApparentContour)
58 ON_BN_CLICKED(IDC_VSewingEdges, OnVSewingEdges)
59 ON_BN_CLICKED(IDC_VsharpEdges, OnVsharpEdges)
60 ON_BN_CLICKED(IDC_VsmoothEdges, OnVsmoothEdges)
61 ON_BN_CLICKED(IDC_HsharpEdges, OnHsharpEdges)
62 ON_BN_CLICKED(IDC_HsmoothEdges, OnHsmoothEdges)
63 ON_BN_CLICKED(IDC_HSewingEdges, OnHSewingEdges)
64 ON_BN_CLICKED(IDC_HIsoParametrics, OnHIsoParametrics)
65 ON_BN_CLICKED(IDC_HApparentContour, OnHApparentContour)
66 ON_EN_CHANGE(IDC_EDIT_NBIsos, OnChangeEDITNBIsos)
67 ON_BN_CLICKED(IDC_Algo, OnAlgo)
68 ON_BN_CLICKED(IDC_PolyAlgo, OnPolyAlgo)
69 ON_BN_CLICKED(ID_Update2D, OnUpdate2D)
70 ON_BN_CLICKED(IDC_TopView, OnTopView)
71 ON_BN_CLICKED(IDC_BottomView, OnBottomView)
72 ON_BN_CLICKED(IDC_LeftView, OnLeftView)
73 ON_BN_CLICKED(IDC_RightView, OnRightView)
74 ON_BN_CLICKED(IDC_FrontView, OnFrontView)
75 ON_BN_CLICKED(IDC_BackView, OnBackView)
76 ON_BN_CLICKED(IDC_AxoView, OnAxoView)
77 ON_WM_LBUTTONDOWN()
78 ON_WM_LBUTTONUP()
79 ON_WM_RBUTTONDOWN()
80 ON_WM_RBUTTONUP()
81 ON_WM_MOUSEMOVE()
82 ON_BN_CLICKED(IDC_DrawHiddenLine, OnDrawHiddenLine)
83 ON_BN_CLICKED(IDC_DegeneratedMode, OnDegeneratedMode)
84 ON_WM_DRAWITEM()
85 ON_WM_PAINT()
86 //}}AFX_MSG_MAP
87END_MESSAGE_MAP()
88
89/////////////////////////////////////////////////////////////////////////////
90// CSelectionDialog message handlers
91
92BOOL CSelectionDialog::OnInitDialog()
93{
94 CDialog::OnInitDialog();
95
96 VERIFY(TopView.AutoLoad(IDC_TopView, this));
97 VERIFY(BottomView.AutoLoad(IDC_BottomView, this)) ;
98 VERIFY(LeftView .AutoLoad(IDC_LeftView , this)) ;
99 VERIFY(RightView .AutoLoad(IDC_RightView , this)) ;
100 VERIFY(FrontView .AutoLoad(IDC_FrontView , this)) ;
101 VERIFY(BackView .AutoLoad(IDC_BackView , this)) ;
102 VERIFY(AxoView .AutoLoad(IDC_AxoView , this)) ;
103
104 // get the View Window position to managed mouse move
105 CRect BoxRect,ViewRect;
106 GetWindowRect(BoxRect);
107 CWnd * TheViewerWindow = GetDlgItem(IDC_DUMMYBUTTON);
108 TheViewerWindow->GetWindowRect(ViewRect);
109 myPosMinX = ViewRect.TopLeft().x - BoxRect.TopLeft().x;
110 myPosMaxX = ViewRect.Width()+myPosMinX;
111 myPosMinY = ViewRect.TopLeft().y - BoxRect.TopLeft().y;
112 myPosMaxY = myPosMinY + ViewRect.Height();
113
114 ShowHideButton(Standard_False);
115 OnDisplay(true);
116
117 return TRUE; // return TRUE unless you set the focus to a control
118 // EXCEPTION: OCX Property Pages should return FALSE
119}
120
121void CSelectionDialog::OnDisplay(bool isFit)
122{
123 GetDlgItem(IDC_DUMMYBUTTON)->SetRedraw(true);
124 if(!myDisplay) {
125 Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice =
126 ((CHLRApp*)AfxGetApp())->GetGraphicDevice();
127
128 myActiveViewer = new V3d_Viewer(theGraphicDevice,(short *) "Visu3D");
129 myActiveViewer->SetDefaultLights();
130 myActiveViewer->SetLightOn();
131 myActiveView = myActiveViewer->CreateView();
132
133 Handle(WNT_Window) aWNTWindow = new WNT_Window(theGraphicDevice,
134 GetDlgItem(IDC_DUMMYBUTTON)->GetSafeHwnd(),
135 Quantity_NOC_GRAY);
136
137 aWNTWindow->SetDoubleBuffer(Standard_False);
138
139 if (m_DegeneratedModeOn) myActiveView->SetDegenerateModeOn();
140 myActiveView->SetWindow(aWNTWindow);
141
142 myInteractiveContext = new AIS_InteractiveContext(myActiveViewer);
143
144 // TRIHEDRON
145 Handle(Geom_Axis2Placement) aTrihedronAxis=new Geom_Axis2Placement(gp::XOY());
146 myTrihedron=new AIS_Trihedron(aTrihedronAxis);
147
148 myInteractiveContext->Display(myTrihedron);
149 }
150 if(isFit) {
151 myActiveView->ZFitAll();
152 myActiveView->FitAll();
153 }
154 myActiveView->Redraw();
155 myDisplay = Standard_True;
156 GetDlgItem(IDC_DUMMYBUTTON)->SetRedraw(false);
157}
158
159
160void CSelectionDialog::SetTitle(CString & aTitle)
161{
162 SetWindowText(aTitle);
163}
164
165void CSelectionDialog::OnGetShape()
166{
167 UpdateData(true);
168 myDoc->GetInteractiveContext2D()->EraseAll();
169 myDisplayableShape = new ISession2D_Shape( );
170 UpdateProjector();
171 myDisplayableShape->SetNbIsos(m_NbIsos);
172
173 myInteractiveContext->EraseAll(Standard_False);
174 myInteractiveContext->Display(myTrihedron);
175
176 Standard_Boolean OneOrMoreFound = Standard_False;
177 for (myDoc->GetAISContext()->InitCurrent();
178 myDoc->GetAISContext()->MoreCurrent ();
179 myDoc->GetAISContext()->NextCurrent ())
180 {
181 Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(myDoc->GetAISContext()->Current());
182
183 if (!anAISShape.IsNull())
184 {
185 OneOrMoreFound = Standard_True;
186 TopoDS_Shape aShape = anAISShape->Shape();
187 myDisplayableShape->Add( aShape );
188 myInteractiveContext->Display(anAISShape);
189 }
190 }
191
192 Standard_Integer DisplayMode = m_DisplayMode;
193 if (m_Algo == 1) DisplayMode+=100;
194 if (!m_DrawHiddenLine) DisplayMode+=1000;
195
196 myDoc->GetInteractiveContext2D()->Display(myDisplayableShape, // object
197 DisplayMode, // display mode
198 DisplayMode, // selection mode
199 Standard_True); // Redraw
200
201 myDoc->FitAll2DViews(Standard_False); // Update Viewer
202
203
204 // check the selection :
205 // if no object : disable all possiblity!!
206 ShowHideButton(OneOrMoreFound);
207 OnDisplay(true);
208}
209
210void CSelectionDialog::Apply()
211{
212 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
213 myDoc->GetInteractiveContext2D()->EraseAll(Standard_False);
214 UpdateData(true);
215
216 Standard_Integer DisplayMode = m_DisplayMode;
217 if (m_Algo == 1) DisplayMode+=100;
218
219 if (!m_DrawHiddenLine) DisplayMode+=1000;
220
221 myDoc->GetInteractiveContext2D()->Display(myDisplayableShape, // object
222 DisplayMode,
223 DisplayMode,
224 Standard_True); // Redraw
225
226 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
227}
228
229void CSelectionDialog::UpdateProjector()
230{
231 V3d_Coordinate DX,DY,DZ,XAt,YAt,ZAt, Vx,Vy,Vz ;
232 myActiveView->Proj(DX,DY,DZ);
233 myActiveView->At(XAt,YAt,ZAt);
234 myActiveView->Up( Vx,Vy,Vz );
235 OnDisplay(false);
236 Standard_Boolean IsPerspective = (myActiveView->Type() == V3d_PERSPECTIVE);
237 Quantity_Length aFocus = 1;
238 Prs3d_Projector aPrs3dProjector(IsPerspective,aFocus,DX,DY,DZ,XAt,YAt,ZAt,Vx,Vy,Vz);
239 HLRAlgo_Projector aProjector = aPrs3dProjector.Projector();
240
241 if (myDisplayableShape.IsNull()) return;
242 myDisplayableShape->SetProjector(aProjector);
243}
244
245void CSelectionDialog::ShowHideButton(Standard_Boolean EnableButton)
246{
247 UpdateData(true);
248
249 GetDlgItem(ID_Update2D )->EnableWindow(EnableButton);
250 GetDlgItem(IDC_DisplayDefault )->EnableWindow(EnableButton);
251 GetDlgItem(IDC_PolyAlgo )->EnableWindow(EnableButton);
252 GetDlgItem(IDC_Algo )->EnableWindow(EnableButton);
253
254 GetDlgItem(IDC_VsharpEdges )->EnableWindow(EnableButton);
255 GetDlgItem(IDC_VsmoothEdges )->EnableWindow(EnableButton);
256 GetDlgItem(IDC_VSewingEdges )->EnableWindow(EnableButton);
257 GetDlgItem(IDC_VApparentContour )->EnableWindow(EnableButton);
258 GetDlgItem(IDC_VIsoParametrics )->EnableWindow(EnableButton);
259
260 GetDlgItem(IDC_DrawHiddenLine )->EnableWindow(EnableButton);
261
262 GetDlgItem(IDC_HsmoothEdges )->EnableWindow(EnableButton && m_DrawHiddenLine);
263 GetDlgItem(IDC_HSewingEdges )->EnableWindow(EnableButton && m_DrawHiddenLine);
264 GetDlgItem(IDC_HApparentContour )->EnableWindow(EnableButton && m_DrawHiddenLine);
265 GetDlgItem(IDC_HsharpEdges )->EnableWindow(EnableButton && m_DrawHiddenLine);
266 GetDlgItem(IDC_HIsoParametrics )->EnableWindow(EnableButton && m_DrawHiddenLine);
267
268 GetDlgItem(IDC_EDIT_NBIsos )->EnableWindow(EnableButton);
269 GetDlgItem(IDC_STATIC_NbIsos )->EnableWindow(EnableButton);
270
271 if(m_Algo == 0)
272 {
273 if (m_DisplayMode == 5) m_DisplayMode=0;
274 if (m_DisplayMode == 10) m_DisplayMode=0;
275
276 GetDlgItem(IDC_VIsoParametrics)->EnableWindow(false);
277 GetDlgItem(IDC_HIsoParametrics)->EnableWindow(false);
278 GetDlgItem(IDC_STATIC_NbIsos) ->EnableWindow(false);
279 GetDlgItem(IDC_EDIT_NBIsos) ->EnableWindow(false);
280 }
281 else
282 {
283 GetDlgItem(IDC_VIsoParametrics)->EnableWindow(true);
284 GetDlgItem(IDC_HIsoParametrics)->EnableWindow(m_DrawHiddenLine);
285 GetDlgItem(IDC_STATIC_NbIsos) ->EnableWindow(true);
286 GetDlgItem(IDC_EDIT_NBIsos) ->EnableWindow(true);
287 }
288 UpdateData(false);
289}
290
291void CSelectionDialog::OnDisplayDefault()
292{ Apply(); }
293void CSelectionDialog::OnVIsoParametrics()
294{ Apply(); }
295void CSelectionDialog::OnVApparentContour()
296{ Apply(); }
297void CSelectionDialog::OnVSewingEdges()
298{ Apply(); }
299void CSelectionDialog::OnVsharpEdges()
300{ Apply(); }
301void CSelectionDialog::OnVsmoothEdges()
302{ Apply(); }
303void CSelectionDialog::OnHsharpEdges()
304{ Apply(); }
305void CSelectionDialog::OnHsmoothEdges()
306{ Apply(); }
307void CSelectionDialog::OnHSewingEdges()
308{ Apply(); }
309void CSelectionDialog::OnHIsoParametrics()
310{ Apply(); }
311void CSelectionDialog::OnHApparentContour()
312{ Apply(); }
313
314void CSelectionDialog::OnChangeEDITNBIsos()
315{
316 UpdateData(true);
317 myDisplayableShape->SetNbIsos(m_NbIsos);
318 Apply();
319}
320void CSelectionDialog::OnAlgo()
321{ ShowHideButton();
322 Apply();
323}
324
325void CSelectionDialog::OnPolyAlgo()
326{ ShowHideButton();
327 Apply();
328}
329
330void CSelectionDialog::OnDrawHiddenLine()
331{
332 UpdateData(true);
333 if (m_DisplayMode >=6 )
334 { m_DisplayMode=0;
335 UpdateData(false); }
336 ShowHideButton();
337 Apply();
338}
339
340void CSelectionDialog::OnUpdate2D()
341{
342 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
343 myDoc->ActivateFrame(RUNTIME_CLASS(OCC_2dView),SW_NORMAL);
344 UpdateProjector();
345 Apply();
346 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
347}
348
349void CSelectionDialog::OnTopView()
350{
351 myActiveView->SetProj(V3d_Zpos);
352 OnDisplay(true);
353}
354
355void CSelectionDialog::OnBottomView()
356{
357 myActiveView->SetProj(V3d_Zneg);
358 OnDisplay(true);
359}
360
361void CSelectionDialog::OnLeftView()
362{
363 myActiveView->SetProj(V3d_Ypos);
364 OnDisplay(true);
365}
366
367void CSelectionDialog::OnRightView()
368{
369 myActiveView->SetProj(V3d_Yneg);
370 OnDisplay(true);
371}
372
373void CSelectionDialog::OnFrontView()
374{
375 myActiveView->SetProj(V3d_Xpos);
376 OnDisplay(true);
377}
378
379void CSelectionDialog::OnBackView()
380{
381 myActiveView->SetProj(V3d_Xneg);
382 OnDisplay(true);
383}
384
385void CSelectionDialog::OnAxoView()
386{
387 myActiveView->SetProj(V3d_XposYnegZpos);
388 OnDisplay(true);
389}
390
391void CSelectionDialog::OnDegeneratedMode()
392{
393 UpdateData(true);
394
395 if(m_DegeneratedModeOn)
396 {
397 myActiveView->SetDegenerateModeOn();
398 m_DegeneratedModeOn = Standard_True;
399 }
400 else
401 {
402 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
403 myActiveView->SetDegenerateModeOff();
404 m_DegeneratedModeOn = Standard_False;
405 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
406 }
407 OnDisplay(false);
408}
409
410void CSelectionDialog::OnLButtonDown(UINT nFlags, CPoint point)
411{
412 CDialog::OnLButtonDown(nFlags, point);
413
414 if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
415 (myPosMinY > point.y) ||(myPosMaxY < point.y))
416 return;
417
418 // save the current mouse coordinate
419 myXmax=point.x; myYmax=point.y;
420}
421
422void CSelectionDialog::OnLButtonUp(UINT nFlags, CPoint point)
423{
424 CDialog::OnLButtonUp(nFlags, point);
425
426 if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
427 (myPosMinY > point.y) ||(myPosMaxY < point.y))
428 return;
429}
430
431void CSelectionDialog::OnRButtonDown(UINT nFlags, CPoint point)
432{
433 CDialog::OnRButtonDown(nFlags, point);
434
435 if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
436 (myPosMinY > point.y) ||(myPosMaxY < point.y))
437 return;
438
439 if ( nFlags & CASCADESHORTCUTKEY )
440 {
441 if (!m_DegeneratedModeOn)
442 myActiveView->SetDegenerateModeOn();
443 myActiveView->StartRotation(point.x,point.y);
444 OnDisplay(false);
445 }
446}
447
448void CSelectionDialog::OnRButtonUp(UINT nFlags, CPoint point)
449{
450 CDialog::OnRButtonUp(nFlags, point);
451
452 if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
453 (myPosMinY > point.y) ||(myPosMaxY < point.y))
454 return;
455
456 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
457 // reset tyhe good Degenerated mode according to the strored one
458 // --> dynamic rotation may have change it
459 if (!m_DegeneratedModeOn)
460 myActiveView->SetDegenerateModeOff();
461 else
462 myActiveView->SetDegenerateModeOn();
463 OnDisplay(false);
464 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
465}
466
467void CSelectionDialog::OnMouseMove(UINT nFlags, CPoint point)
468{
469 CDialog::OnMouseMove(nFlags, point);
470
471 if ((myPosMinX > point.x)||(myPosMaxX < point.x) ||
472 (myPosMinY > point.y) ||(myPosMaxY < point.y))
473 return;
474
475 // ============================ LEFT BUTTON =======================
476 if ( nFlags & MK_LBUTTON)
477 {
478 if ( nFlags & CASCADESHORTCUTKEY )
479 {
480 // move with MB1 and Control : on the dynamic zooming
481 // Do the zoom in function of mouse's coordinates
482 myActiveView->Zoom(myXmax,myYmax,point.x,point.y);
483 // save the current mouse coordinate
484 myXmax = point.x; myYmax = point.y;
485 }// if ( nFlags & CASCADESHORTCUTKEY ) else
486 } else // if ( nFlags & MK_LBUTTON)
487 // ============================ MIDDLE BUTTON =======================
488 if ( nFlags & MK_MBUTTON)
489 {
490 if ( nFlags & CASCADESHORTCUTKEY )
491 {
492 myActiveView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
493 myXmax = point.x; myYmax = point.y;
494 }
495 } else // if ( nFlags & MK_MBUTTON)
496 // ============================ RIGHT BUTTON =======================
497 if ( nFlags & MK_RBUTTON)
498 {
499 if ( nFlags & CASCADESHORTCUTKEY )
500 {
501 myActiveView->Rotation(point.x,point.y);
502 }
503 } else //if ( nFlags & MK_RBUTTON)
504 // ============================ NO BUTTON =======================
505 { // No buttons
506 myXmax = point.x; myYmax = point.y;
507 }
508 OnDisplay(false);
509}
510
511void CSelectionDialog::OnOK()
512{
513 CDialog::OnOK();
514}
515
516void CSelectionDialog::OnPaint()
517{
518 CPaintDC dc(this); // device context for painting
519
520 OnDisplay(false);
521}