101de8c2d16b2102154e048556c63d70ecaf27c9
[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 <Visual3d_View.hxx>
12
13 #include <Graphic3d_ExportFormat.hxx>
14 #include <Graphic3d_Camera.hxx>
15
16 #include <OpenGl_GraphicDriver.hxx>
17
18 #define ValZWMin 1
19
20 IMPLEMENT_DYNCREATE(OCC_3dView, CView)
21
22 BEGIN_MESSAGE_MAP(OCC_3dView, CView)
23         //{{AFX_MSG_MAP(OCC_3dView)
24         ON_COMMAND(ID_BUTTONAxo, OnBUTTONAxo)
25         ON_COMMAND(ID_BUTTONBack, OnBUTTONBack)
26         ON_COMMAND(ID_BUTTONBottom, OnBUTTONBottom)
27         ON_COMMAND(ID_BUTTONFront, OnBUTTONFront)
28         ON_COMMAND(ID_BUTTONHlrOff, OnBUTTONHlrOff)
29         ON_COMMAND(ID_BUTTONHlrOn, OnBUTTONHlrOn)
30         ON_COMMAND(ID_BUTTONLeft, OnBUTTONLeft)
31         ON_COMMAND(ID_BUTTONPan, OnBUTTONPan)
32         ON_COMMAND(ID_BUTTONPanGlo, OnBUTTONPanGlo)
33         ON_COMMAND(ID_BUTTONReset, OnBUTTONReset)
34         ON_COMMAND(ID_BUTTONRight, OnBUTTONRight)
35         ON_COMMAND(ID_BUTTONRot, OnBUTTONRot)
36         ON_COMMAND(ID_BUTTONTop, OnBUTTONTop)
37         ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll)
38   ON_COMMAND(ID_BUTTON_STEREOCONFIG, OnStereoConfigButton)
39         ON_WM_SIZE()
40     ON_COMMAND(ID_FILE_EXPORT_IMAGE, OnFileExportImage)
41         ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg)
42         ON_COMMAND(ID_BUTTONZoomWin, OnBUTTONZoomWin)
43         ON_WM_LBUTTONDOWN()
44         ON_WM_LBUTTONUP()
45         ON_WM_MBUTTONDOWN()
46         ON_WM_MBUTTONUP()
47         ON_WM_MOUSEMOVE()
48         ON_WM_RBUTTONDOWN()
49         ON_WM_RBUTTONUP()
50         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOff, OnUpdateBUTTONHlrOff)
51         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn)
52         ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo)
53         ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan)
54         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
55         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
56         ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
57   ON_UPDATE_COMMAND_UI(ID_BUTTON_STEREOCONFIG, OnUpdateStereoConfigButton)
58         ON_COMMAND(ID_Modify_ChangeBackground     , OnModifyChangeBackground)
59         //}}AFX_MSG_MAP
60 END_MESSAGE_MAP()
61
62 /////////////////////////////////////////////////////////////////////////////
63 // OCC_3dView construction/destruction
64
65 OCC_3dView::OCC_3dView()
66 : myCurrentMode (CurAction3d_Nothing),
67   myXmin (0),
68   myYmin (0),
69   myXmax (0),
70   myYmax (0),
71   myCurZoom (0.0),
72   myWidth  (0),
73   myHeight (0),
74   myHlrModeIsOn (Standard_False),
75   m_Pen (NULL)
76 {
77   // TODO: add construction code here
78 }
79
80 OCC_3dView::~OCC_3dView()
81 {
82   if (myView)
83   {
84     myView->Remove();
85   }
86
87   delete m_pStereoDlg;
88   delete m_Pen;
89 }
90
91 BOOL OCC_3dView::PreCreateWindow(CREATESTRUCT& cs)
92 {
93         // TODO: Modify the Window class or styles here by modifying
94         //  the CREATESTRUCT cs
95         return CView::PreCreateWindow(cs);
96 }
97
98 /////////////////////////////////////////////////////////////////////////////
99 // OCC_3dView drawing
100 void OCC_3dView::OnInitialUpdate() 
101 {
102   CView::OnInitialUpdate();
103
104   myView = GetDocument()->GetViewer()->CreateView();
105
106   // store for restore state after rotation (which is in Degenerated mode)
107   myHlrModeIsOn = Standard_False;
108   myView->SetComputedMode (myHlrModeIsOn);
109
110   Handle(OpenGl_GraphicDriver) aDriver = 
111     Handle(OpenGl_GraphicDriver)::DownCast (((OCC_App*)AfxGetApp())->GetGraphicDriver());
112
113   Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd());
114
115   myView->SetWindow(aWNTWindow);
116   myView->Camera()->SetProjectionType (aDriver->Options().contextStereo
117     ? Graphic3d_Camera::Projection_Stereo
118     : Graphic3d_Camera::Projection_Orthographic);
119
120   if (!aWNTWindow->IsMapped())
121   {
122     aWNTWindow->Map();
123   }
124
125   // store the mode ( nothing , dynamic zooming, dynamic ... )
126   myCurrentMode = CurAction3d_Nothing;
127
128   m_pStereoDlg = new OCC_StereoConfigDlg (this);
129   m_pStereoDlg->SetView (myView);
130   m_pStereoDlg->Create (IDD_DIALOG_STEREO, this);
131 }
132
133 void OCC_3dView::OnDraw(CDC* /*pDC*/)
134 {
135   CRect aRect;
136   GetWindowRect(aRect);
137   if(myWidth != aRect.Width() || myHeight != aRect.Height()) {
138     myWidth = aRect.Width();
139     myHeight = aRect.Height();
140     ::PostMessage ( GetSafeHwnd () , WM_SIZE , SW_SHOW , myWidth + myHeight*65536 );
141   }
142   myView->Redraw();
143 }
144
145 /////////////////////////////////////////////////////////////////////////////
146 // OCC_3dView diagnostics
147
148 #ifdef _DEBUG
149 void OCC_3dView::AssertValid() const
150 {
151         CView::AssertValid();
152 }
153
154 void OCC_3dView::Dump(CDumpContext& dc) const
155 {
156         CView::Dump(dc);
157 }
158
159 OCC_3dDoc* OCC_3dView::GetDocument() // non-debug version is inline
160 {
161 //      ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(OCC_3dBaseDoc)));
162         return (OCC_3dDoc*)m_pDocument;
163 }
164
165 #endif //_DEBUG
166
167 /////////////////////////////////////////////////////////////////////////////
168 // OCC_3dView message handlers
169 void OCC_3dView::OnFileExportImage()
170 {
171   GetDocument()->ExportView (myView);
172 }
173
174 void OCC_3dView::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/) 
175 {
176   if (!myView.IsNull())
177    myView->MustBeResized();
178 }
179
180 // See the back View
181 void OCC_3dView::OnBUTTONBack() 
182 {
183   myView->SetProj(V3d_Xneg);
184
185
186 // See the front View
187 void OCC_3dView::OnBUTTONFront() 
188 {
189   myView->SetProj(V3d_Xpos);
190
191
192 // See the bottom View
193 void OCC_3dView::OnBUTTONBottom() 
194 {
195   myView->SetProj(V3d_Zneg);
196 }
197
198 // See the top View
199 void OCC_3dView::OnBUTTONTop() 
200 {
201   myView->SetProj(V3d_Zpos);
202 }       
203
204 // See the left View
205 void OCC_3dView::OnBUTTONLeft() 
206 {
207   myView->SetProj(V3d_Ypos);
208 }
209
210 // See the right View
211 void OCC_3dView::OnBUTTONRight() 
212 {
213   myView->SetProj(V3d_Yneg);
214
215
216 // See the axonometric View
217 void OCC_3dView::OnBUTTONAxo() 
218 {
219   myView->SetProj(V3d_XposYnegZpos);
220
221
222 void OCC_3dView::OnBUTTONHlrOff() 
223 {
224   myHlrModeIsOn = Standard_False;
225   myView->SetComputedMode (myHlrModeIsOn);
226 }
227
228 void OCC_3dView::OnBUTTONHlrOn() 
229 {
230   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
231   myHlrModeIsOn = Standard_True;
232   myView->SetComputedMode (myHlrModeIsOn);
233   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
234 }
235
236 void OCC_3dView::OnBUTTONPan() 
237 {
238   myCurrentMode = CurAction3d_DynamicPanning;
239 }
240
241 void OCC_3dView::OnBUTTONPanGlo() 
242 {
243   // save the current zoom value 
244   myCurZoom = myView->Scale();
245   // Do a Global Zoom 
246   //myView->FitAll();
247   // Set the mode 
248   myCurrentMode = CurAction3d_GlobalPanning;
249 }
250
251 void OCC_3dView::OnBUTTONReset() 
252 {
253   myView->Reset();
254 }
255
256 void OCC_3dView::OnBUTTONRot() 
257 {
258   myCurrentMode = CurAction3d_DynamicRotation; 
259 }
260
261 void OCC_3dView::OnBUTTONZoomAll() 
262 {
263   myView->FitAll();
264   myView->ZFitAll();
265 }
266
267 void OCC_3dView::OnBUTTONZoomProg() 
268 {  myCurrentMode = CurAction3d_DynamicZooming; }
269
270 void OCC_3dView::OnBUTTONZoomWin() 
271 {  myCurrentMode = CurAction3d_WindowZooming; }
272
273 void OCC_3dView::OnLButtonDown(UINT nFlags, CPoint point) 
274 {
275   //  save the current mouse coordinate in min 
276   myXmin=point.x;  myYmin=point.y;
277   myXmax=point.x;  myYmax=point.y;
278
279   if ( nFlags & MK_CONTROL ) 
280   {
281     // Button MB1 down Control :start zomming 
282     // SetCursor(AfxGetApp()->LoadStandardCursor());
283   }
284   else // if ( Ctrl )
285   {
286     switch (myCurrentMode)
287     {
288     case CurAction3d_Nothing : // start a drag
289       if (nFlags & MK_SHIFT)
290         GetDocument()->ShiftDragEvent(myXmax,myYmax,-1,myView);
291       else
292         GetDocument()->DragEvent(myXmax,myYmax,-1,myView);
293       break;
294       break;
295     case CurAction3d_DynamicZooming : // noting
296       break;
297     case CurAction3d_WindowZooming : // noting
298       break;
299     case CurAction3d_DynamicPanning :// noting
300       break;
301     case CurAction3d_GlobalPanning :// noting
302       break;
303     case  CurAction3d_DynamicRotation :
304       if (myHlrModeIsOn)
305       {
306         myView->SetComputedMode (Standard_False);
307       }
308
309       myView->StartRotation(point.x,point.y);  
310       break;
311     default :
312       Standard_Failure::Raise(" incompatible Current Mode ");
313       break;
314     }
315   }
316 }
317
318 void OCC_3dView::OnLButtonUp(UINT nFlags, CPoint point) 
319 {
320   if ( nFlags & MK_CONTROL ) 
321   {
322     return;
323   }
324   else // if ( Ctrl )
325   {
326     switch (myCurrentMode)
327     {
328     case CurAction3d_Nothing :
329       if (point.x == myXmin && point.y == myYmin)
330       { // no offset between down and up --> selectEvent
331         myXmax=point.x;  
332         myYmax=point.y;
333         if (nFlags & MK_SHIFT )
334           GetDocument()->ShiftInputEvent(point.x,point.y,myView);
335         else
336           GetDocument()->InputEvent     (point.x,point.y,myView);
337       } else
338       {
339         myXmax=point.x;    myYmax=point.y;
340         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
341         if (nFlags & MK_SHIFT)
342           GetDocument()->ShiftDragEvent(point.x,point.y,1,myView);
343         else
344           GetDocument()->DragEvent(point.x,point.y,1,myView);
345       }
346       break;
347     case CurAction3d_DynamicZooming :
348       // SetCursor(AfxGetApp()->LoadStandardCursor());         
349       myCurrentMode = CurAction3d_Nothing;
350       break;
351     case CurAction3d_WindowZooming :
352       myXmax=point.x;        myYmax=point.y;
353       DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
354       if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
355         // Test if the zoom window is greater than a minimale window.
356       {
357         // Do the zoom window between Pmin and Pmax
358         myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);  
359       }  
360       myCurrentMode = CurAction3d_Nothing;
361       break;
362     case CurAction3d_DynamicPanning :
363       myCurrentMode = CurAction3d_Nothing;
364       break;
365     case CurAction3d_GlobalPanning :
366       myView->Place(point.x,point.y,myCurZoom); 
367       myCurrentMode = CurAction3d_Nothing;
368       break;
369     case  CurAction3d_DynamicRotation :
370       myCurrentMode = CurAction3d_Nothing;
371       if (myHlrModeIsOn)
372       {
373         CWaitCursor aWaitCursor;
374         myView->SetComputedMode (myHlrModeIsOn);
375       }
376       else
377       {
378         myView->SetComputedMode (myHlrModeIsOn);
379       }
380       break;
381     default :
382       Standard_Failure::Raise(" incompatible Current Mode ");
383       break;
384     } //switch (myCurrentMode)
385   } //  else // if ( Ctrl )
386 }
387
388 void OCC_3dView::OnMButtonDown(UINT nFlags, CPoint /*point*/) 
389 {
390   if ( nFlags & MK_CONTROL ) 
391   {
392     // Button MB2 down Control : panning init  
393     // SetCursor(AfxGetApp()->LoadStandardCursor());   
394   }
395 }
396
397 void OCC_3dView::OnMButtonUp(UINT nFlags, CPoint /*point*/) 
398 {
399   if ( nFlags & MK_CONTROL ) 
400   {
401     // Button MB2 down Control : panning init  
402     // SetCursor(AfxGetApp()->LoadStandardCursor());   
403   }
404 }
405
406 void OCC_3dView::OnRButtonDown(UINT nFlags, CPoint point) 
407 {
408   if ( nFlags & MK_CONTROL )
409   {
410     if (myHlrModeIsOn)
411     {
412       myView->SetComputedMode (Standard_False);
413     }
414     myView->StartRotation(point.x,point.y);  
415   }
416   else // if ( Ctrl )
417   {
418     GetDocument()->Popup(point.x,point.y,myView);
419   }     
420 }
421
422 void OCC_3dView::OnRButtonUp(UINT /*nFlags*/, CPoint /*point*/) 
423 {
424     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
425     myView->SetComputedMode (myHlrModeIsOn);
426     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
427 }
428
429 void OCC_3dView::OnMouseMove(UINT nFlags, CPoint point) 
430 {
431    //   ============================  LEFT BUTTON =======================
432   if ( nFlags & MK_LBUTTON)
433   {
434     if ( nFlags & MK_CONTROL ) 
435     {
436       // move with MB1 and Control : on the dynamic zooming  
437       // Do the zoom in function of mouse's coordinates  
438       myView->Zoom(myXmax,myYmax,point.x,point.y); 
439       // save the current mouse coordinate in min 
440       myXmax = point.x; 
441       myYmax = point.y; 
442     }
443     else // if ( Ctrl )
444     {
445       switch (myCurrentMode)
446       {
447       case CurAction3d_Nothing :
448         myXmax = point.x;  myYmax = point.y;
449         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
450         if (nFlags & MK_SHIFT)          
451           GetDocument()->ShiftDragEvent(myXmax,myYmax,0,myView);
452         else
453           GetDocument()->DragEvent(myXmax,myYmax,0,myView);
454         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True);
455
456         break;
457       case CurAction3d_DynamicZooming :
458         myView->Zoom(myXmax,myYmax,point.x,point.y); 
459         // save the current mouse coordinate in min \n";
460         myXmax=point.x;  myYmax=point.y;
461         break;
462       case CurAction3d_WindowZooming :
463         myXmax = point.x; myYmax = point.y;     
464         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
465         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
466         break;
467       case CurAction3d_DynamicPanning :
468         myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
469         myXmax = point.x; myYmax = point.y;     
470         break;
471       case CurAction3d_GlobalPanning : // nothing           
472         break;
473       case  CurAction3d_DynamicRotation :
474         myView->Rotation(point.x,point.y);
475         myView->Redraw();
476         break;
477       default :
478         Standard_Failure::Raise(" incompatible Current Mode ");
479         break;
480       }//  switch (myCurrentMode)
481     }// if ( nFlags & MK_CONTROL )  else 
482   } 
483   else if ( nFlags & MK_MBUTTON)
484   {
485     if ( nFlags & MK_CONTROL ) 
486     {
487       myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
488       myXmax = point.x; myYmax = point.y;       
489
490     }
491   } 
492   else if ( nFlags & MK_RBUTTON)
493   {
494     if ( nFlags & MK_CONTROL ) 
495     {
496       myView->Rotation(point.x,point.y);
497     }
498   }
499   else 
500   {  // No buttons 
501     myXmax = point.x; myYmax = point.y; 
502     if (nFlags & MK_SHIFT)
503       GetDocument()->ShiftMoveEvent(point.x,point.y,myView);
504     else
505       GetDocument()->MoveEvent(point.x,point.y,myView);
506   }
507 }
508
509 void OCC_3dView::DrawRectangle(const Standard_Integer  MinX    ,
510                                                             const Standard_Integer  MinY    ,
511                                         const Standard_Integer  MaxX ,
512                                                             const Standard_Integer  MaxY ,
513                                                             const Standard_Boolean  Draw , 
514                                         const LineStyle aLineStyle)
515 {
516     static int m_DrawMode;
517     if  (!m_Pen && aLineStyle ==Solid )
518         {m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;}
519     else if (!m_Pen && aLineStyle ==Dot )
520         {m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0));   m_DrawMode = R2_XORPEN;}
521     else if (!m_Pen && aLineStyle == ShortDash)
522         {m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0));    m_DrawMode = R2_XORPEN;}
523     else if (!m_Pen && aLineStyle == LongDash)
524         {m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0));      m_DrawMode = R2_NOTXORPEN;}
525     else if (aLineStyle == Default) 
526         { m_Pen = NULL; m_DrawMode = R2_MERGEPENNOT;}
527
528     CPen* aOldPen = NULL;
529     CClientDC clientDC(this);
530     if (m_Pen) aOldPen = clientDC.SelectObject(m_Pen);
531     clientDC.SetROP2(m_DrawMode);
532
533     static              Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
534     static              Standard_Boolean m_IsVisible;
535
536     if ( m_IsVisible && !Draw) // move or up  : erase at the old position 
537     {
538      clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
539      clientDC.LineTo(StoredMaxX,StoredMaxY); 
540          clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
541      m_IsVisible = false;
542     }
543
544     StoredMinX = min ( MinX, MaxX );
545     StoredMinY = min ( MinY, MaxY );
546     StoredMaxX = max ( MinX, MaxX );
547     StoredMaxY = max ( MinY, MaxY);
548
549     if (Draw) // move : draw
550     {
551      clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
552      clientDC.LineTo(StoredMaxX,StoredMaxY); 
553          clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
554      m_IsVisible = true;
555    }
556
557     if (m_Pen) clientDC.SelectObject(aOldPen);
558 }
559
560
561
562 void OCC_3dView::OnUpdateBUTTONHlrOff(CCmdUI* pCmdUI) 
563 {
564   pCmdUI->SetCheck (!myHlrModeIsOn);
565   pCmdUI->Enable   (myHlrModeIsOn);
566 }
567
568 void OCC_3dView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI)
569 {
570   pCmdUI->SetCheck (myHlrModeIsOn);
571   pCmdUI->Enable   (!myHlrModeIsOn);
572 }
573
574 void OCC_3dView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) 
575 {
576     pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
577         pCmdUI->Enable   (myCurrentMode != CurAction3d_GlobalPanning);  
578         
579 }
580
581 void OCC_3dView::OnUpdateBUTTONPan(CCmdUI* pCmdUI) 
582 {
583     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
584         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicPanning );        
585 }
586
587 void OCC_3dView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) 
588 {
589     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
590         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicZooming); 
591 }
592
593 void OCC_3dView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) 
594 {
595     pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
596         pCmdUI->Enable   (myCurrentMode != CurAction3d_WindowZooming);  
597 }
598
599 void OCC_3dView::OnUpdateBUTTONRot(CCmdUI* pCmdUI) 
600 {
601     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
602         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicRotation);        
603 }
604
605 void OCC_3dView::OnModifyChangeBackground() 
606 {
607         Standard_Real R1;
608         Standard_Real G1;
609         Standard_Real B1;
610     myView->BackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
611         COLORREF m_clr ;
612         m_clr = RGB(R1*255,G1*255,B1*255);
613
614         CColorDialog dlgColor(m_clr);
615         if (dlgColor.DoModal() == IDOK)
616         {
617                 m_clr = dlgColor.GetColor();
618                 R1 = GetRValue(m_clr)/255.;
619                 G1 = GetGValue(m_clr)/255.;
620                 B1 = GetBValue(m_clr)/255.;
621         myView->SetBackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
622         }
623     myView->Redraw();
624 }
625
626 //=============================================================================
627 // function: OnStereoConfigButton
628 // purpose: Open stereographic configuration dialog
629 //=============================================================================
630 void OCC_3dView::OnStereoConfigButton()
631 {
632   m_pStereoDlg->ShowWindow (SW_SHOW);
633 }
634
635 //=============================================================================
636 // function: OnUpdateStereoConfigButton
637 // purpose: Enable / disable state of stereo configuration button
638 //=============================================================================
639 void OCC_3dView::OnUpdateStereoConfigButton (CCmdUI* theCmdUI)
640 {
641   // get camera
642   Handle(Graphic3d_Camera) aCamera = myView->Camera();
643
644   // check that button is enabled
645   Standard_Boolean isEnabled = !aCamera.IsNull() && aCamera->IsStereo();
646
647   // update toggle state
648   theCmdUI->Enable (isEnabled);
649
650   if (!isEnabled)
651   {
652     m_pStereoDlg->ShowWindow (SW_HIDE);
653   }
654 }