0029470: Samples - eliminate references to deprecated Local Context from MFC sample
[occt.git] / samples / mfc / standard / Common / OCC_3dBaseDoc.cpp
1 // OCC_3dBaseDoc.cpp: implementation of the OCC_3dBaseDoc class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include <stdafx.h>
6
7 #include "OCC_3dBaseDoc.h"
8
9 #include "OCC_3dView.h"
10 #include "OCC_App.h"
11 #include <res\OCC_Resource.h>
12 #include "ImportExport/ImportExport.h"
13 #include "AISDialogs.h"
14 #include <AIS_ListOfInteractive.hxx>
15 #include <AIS_ListIteratorOfListOfInteractive.hxx>
16 #include <TColStd_ListIteratorOfListOfInteger.hxx>
17 #include <TColStd_ListOfInteger.hxx>
18 #include <TopoDS_Shape.hxx>
19
20 BEGIN_MESSAGE_MAP(OCC_3dBaseDoc, OCC_BaseDoc)
21   //{{AFX_MSG_MAP(OCC_3dBaseDoc)
22   ON_COMMAND(ID_FILE_IMPORT_BREP, OnFileImportBrep)
23   ON_COMMAND(ID_FILE_EXPORT_BREP, OnFileExportBrep)
24   ON_COMMAND(ID_OBJECT_ERASE, OnObjectErase)
25   ON_UPDATE_COMMAND_UI(ID_OBJECT_ERASE, OnUpdateObjectErase)
26   ON_COMMAND(ID_OBJECT_COLOR, OnObjectColor)
27   ON_UPDATE_COMMAND_UI(ID_OBJECT_COLOR, OnUpdateObjectColor)
28   ON_COMMAND(ID_OBJECT_SHADING, OnObjectShading)
29   ON_UPDATE_COMMAND_UI(ID_OBJECT_SHADING, OnUpdateObjectShading)
30   ON_COMMAND(ID_OBJECT_WIREFRAME, OnObjectWireframe)
31   ON_UPDATE_COMMAND_UI(ID_OBJECT_WIREFRAME, OnUpdateObjectWireframe)
32   ON_COMMAND(ID_OBJECT_TRANSPARENCY, OnObjectTransparency)
33   ON_UPDATE_COMMAND_UI(ID_OBJECT_TRANSPARENCY, OnUpdateObjectTransparency)
34   ON_COMMAND(ID_OBJECT_MATERIAL, OnObjectMaterial)
35   ON_UPDATE_COMMAND_UI(ID_OBJECT_MATERIAL, OnUpdateObjectMaterial)
36   ON_COMMAND(ID_OBJECT_DISPLAYALL, OnObjectDisplayall)
37   ON_UPDATE_COMMAND_UI(ID_OBJECT_DISPLAYALL, OnUpdateObjectDisplayall)
38   ON_COMMAND(ID_OBJECT_REMOVE, OnObjectRemove)
39   ON_UPDATE_COMMAND_UI(ID_OBJECT_REMOVE, OnUpdateObjectRemove)
40
41   //}}AFX_MSG_MAP
42   ON_COMMAND_EX_RANGE(ID_OBJECT_MATERIAL_BRASS,ID_OBJECT_MATERIAL_DEFAULT, OnObjectMaterialRange)
43   ON_UPDATE_COMMAND_UI_RANGE(ID_OBJECT_MATERIAL_BRASS,ID_OBJECT_MATERIAL_DEFAULT, OnUpdateObjectMaterialRange)
44
45   //RayTracing
46   ON_COMMAND(ID_OBJECT_RAY_TRACING,OnObjectRayTracing)
47   ON_COMMAND(ID_OBJECT_SHADOWS,OnObjectShadows)
48   ON_COMMAND(ID_OBJECT_REFLECTIONS,OnObjectReflections)
49   ON_COMMAND(ID_OBJECT_ANTI_ALIASING,OnObjectAntiAliasing)
50
51   ON_UPDATE_COMMAND_UI(ID_OBJECT_RAY_TRACING, OnUpdateV3dButtons)
52   ON_UPDATE_COMMAND_UI(ID_OBJECT_SHADOWS, OnUpdateV3dButtons)
53   ON_UPDATE_COMMAND_UI(ID_OBJECT_REFLECTIONS, OnUpdateV3dButtons)
54   ON_UPDATE_COMMAND_UI(ID_OBJECT_ANTI_ALIASING, OnUpdateV3dButtons)
55 END_MESSAGE_MAP()
56
57
58 //////////////////////////////////////////////////////////////////////
59 // Construction/Destruction
60 //////////////////////////////////////////////////////////////////////
61
62 OCC_3dBaseDoc::OCC_3dBaseDoc()
63 :myPopupMenuNumber(0)
64 {
65   AfxInitRichEdit();
66
67   Handle(Graphic3d_GraphicDriver) aGraphicDriver = ((OCC_App*)AfxGetApp())->GetGraphicDriver();
68
69   myViewer = new V3d_Viewer (aGraphicDriver);
70   myViewer->SetDefaultLights();
71   myViewer->SetLightOn();
72   myAISContext = new AIS_InteractiveContext (myViewer);
73
74   myRayTracingIsOn            = false;
75   myRaytracedShadowsIsOn      = true;
76   myRaytracedReflectionsIsOn  = false;
77   myRaytracedAntialiasingIsOn = false;
78 }
79
80 OCC_3dBaseDoc::~OCC_3dBaseDoc()
81 {
82 }
83
84 //-----------------------------------------------------------------------------------------
85 //
86 //-----------------------------------------------------------------------------------------
87 void OCC_3dBaseDoc::DragEvent (const Standard_Integer theMouseX,
88                                const Standard_Integer theMouseY,
89                                const Standard_Integer theState,
90                                const Handle(V3d_View)& theView)
91 {
92   // TheState == -1  button down
93   // TheState ==  0  move
94   // TheState ==  1  button up
95
96   static Standard_Integer aStartDragX = 0;
97   static Standard_Integer aStartDragY = 0;
98
99   switch (theState)
100   {
101   case -1:
102     {
103       aStartDragX = theMouseX;
104       aStartDragY = theMouseY;
105       break;
106     }
107   case 0:
108     {
109       myAISContext->UpdateCurrentViewer();
110       break;
111     }
112   case 1:
113     {
114       myAISContext->Select (aStartDragX, aStartDragY,
115                             theMouseX, theMouseY,
116                             theView, Standard_True);
117       break;
118     }
119   };
120 }
121
122 //-----------------------------------------------------------------------------------------
123 //
124 //-----------------------------------------------------------------------------------------
125 void OCC_3dBaseDoc::InputEvent (const Standard_Integer theMouseX,
126                                 const Standard_Integer theMouseY,
127                                 const Handle(V3d_View)& theView)
128 {
129   myAISContext->MoveTo (theMouseX, theMouseY, theView, Standard_False);
130   myAISContext->Select (Standard_True);
131 }
132
133 //-----------------------------------------------------------------------------------------
134 //
135 //-----------------------------------------------------------------------------------------
136 void OCC_3dBaseDoc::MoveEvent (const Standard_Integer theMouseX,
137                                const Standard_Integer theMouseY,
138                                const Handle(V3d_View)& theView)
139 {
140   myAISContext->MoveTo (theMouseX, theMouseY, theView, Standard_True);
141 }
142
143 //-----------------------------------------------------------------------------------------
144 //
145 //-----------------------------------------------------------------------------------------
146 void OCC_3dBaseDoc::ShiftMoveEvent (const Standard_Integer theMouseX,
147                                     const Standard_Integer theMouseY,
148                                     const Handle(V3d_View)& theView)
149 {
150   myAISContext->MoveTo (theMouseX, theMouseY, theView, Standard_True);
151 }
152
153 //-----------------------------------------------------------------------------------------
154 //
155 //-----------------------------------------------------------------------------------------
156 void OCC_3dBaseDoc::ShiftDragEvent (const Standard_Integer theMouseX,
157                                     const Standard_Integer theMouseY,
158                                     const Standard_Integer theState,
159                                     const Handle(V3d_View)& theView)
160 {
161   // TheState == -1  button down
162   // TheState ==  0  move
163   // TheState ==  1  button up
164
165   static Standard_Integer aStartDragX = 0;
166   static Standard_Integer aStartDragY = 0;
167
168   if (theState == -1)
169   {
170     // button down
171     aStartDragX = theMouseX;
172     aStartDragY = theMouseY;
173   }
174
175   if (theState == 0)
176   {
177     // button up
178     myAISContext->ShiftSelect (aStartDragX, aStartDragY,
179                                theMouseX, theMouseY,
180                                theView, Standard_True);
181   }
182 }
183
184 //-----------------------------------------------------------------------------------------
185 //
186 //-----------------------------------------------------------------------------------------
187 void OCC_3dBaseDoc::ShiftInputEvent (const Standard_Integer /*theMouseX*/,
188                                      const Standard_Integer /*theMouseY*/,
189                                      const Handle(V3d_View)& /*theView*/)
190 {
191   myAISContext->ShiftSelect (Standard_True);
192 }
193
194 //-----------------------------------------------------------------------------------------
195 //
196 //-----------------------------------------------------------------------------------------
197 void  OCC_3dBaseDoc::Popup (const Standard_Integer theMouseX,
198                             const Standard_Integer theMouseY,
199                             const Handle(V3d_View)& theView)
200 {
201   // Base check which context menu to call
202   if (!myPopupMenuNumber)
203   {
204     myAISContext->InitSelected();
205     if (myAISContext->MoreSelected())
206       myPopupMenuNumber=1;
207   }
208
209   CMenu menu;
210   VERIFY(menu.LoadMenu(IDR_Popup3D));
211   CMenu* pPopup = menu.GetSubMenu(myPopupMenuNumber);
212
213   ASSERT(pPopup != NULL);
214    if (myPopupMenuNumber == 1) // more than 1 object.
215   {
216     bool OneOrMoreInShading = false;
217         for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
218     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),1)) OneOrMoreInShading=true;
219         if(!OneOrMoreInShading)
220         pPopup->EnableMenuItem(5, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
221    }
222
223   POINT winCoord = { theMouseX , theMouseY };
224   Handle(WNT_Window) aWNTWindow=
225   Handle(WNT_Window)::DownCast(theView->Window());
226   ClientToScreen ( (HWND)(aWNTWindow->HWindow()),&winCoord);
227   pPopup->TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON,
228                           winCoord.x,
229                           winCoord.y,
230                           AfxGetMainWnd());
231 }
232
233 void OCC_3dBaseDoc::Fit()
234 {
235         CMDIFrameWnd *pFrame =  (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
236         CMDIChildWnd *pChild =  (CMDIChildWnd *) pFrame->GetActiveFrame();
237         OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
238         pView->FitAll();
239 }
240
241 int OCC_3dBaseDoc::OnFileImportBrep_WithInitDir (const wchar_t* )
242 {
243   if (CImportExport::ReadBREP (myAISContext) == 1)
244     return 1;
245   Fit();
246   return 0;
247 }
248
249 void OCC_3dBaseDoc::OnFileImportBrep() 
250 {   
251   OnFileImportBrep_WithInitDir (NULL);
252 }
253
254 void OCC_3dBaseDoc::OnFileExportBrep() 
255 {   CImportExport::SaveBREP(myAISContext);}
256
257 void OCC_3dBaseDoc::OnObjectColor() 
258 {
259         Handle(AIS_InteractiveObject) Current ;
260         COLORREF MSColor ;
261
262         myAISContext->InitSelected();
263     Current = myAISContext->SelectedInteractive();
264         if ( Current->HasColor () ) {
265       Quantity_Color CSFColor;
266       myAISContext->Color (Current, CSFColor);
267       MSColor = RGB (CSFColor.Red()*255.,CSFColor.Green()*255.,CSFColor.Blue()*255.);
268         }
269         else {
270           MSColor = RGB (255,255,255) ;
271         }
272         
273         CColorDialog dlgColor(MSColor);
274         if (dlgColor.DoModal() == IDOK)
275         {
276           MSColor = dlgColor.GetColor();
277           Quantity_Color CSFColor (GetRValue(MSColor)/255., GetGValue(MSColor)/255., GetBValue(MSColor)/255., Quantity_TOC_RGB);
278           for (;myAISContext->MoreSelected ();myAISContext->NextSelected ())
279       myAISContext->SetColor (myAISContext->SelectedInteractive(), CSFColor, Standard_False);
280     myAISContext->UpdateCurrentViewer();
281         }
282 }
283 void OCC_3dBaseDoc::OnUpdateObjectColor(CCmdUI* pCmdUI) 
284 {
285   bool OneOrMoreIsShadingOrWireframe = false;
286   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
287     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),0)
288                 ||myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),1))
289                 OneOrMoreIsShadingOrWireframe=true;
290   pCmdUI->Enable (OneOrMoreIsShadingOrWireframe);
291 }
292
293 void OCC_3dBaseDoc::OnObjectErase() 
294 {
295   myAISContext->EraseSelected (Standard_False);
296   myAISContext->ClearSelected (Standard_True);
297 }
298 void OCC_3dBaseDoc::OnUpdateObjectErase(CCmdUI* pCmdUI) 
299 {
300   bool OneOrMoreIsDisplayed = false;
301   for (myAISContext->InitSelected(); myAISContext->MoreSelected(); myAISContext->NextSelected())
302   {
303     if (myAISContext->IsDisplayed (myAISContext->SelectedInteractive()))
304       OneOrMoreIsDisplayed = true;
305   }
306   pCmdUI->Enable (OneOrMoreIsDisplayed);
307 }
308
309 void OCC_3dBaseDoc::OnObjectWireframe() 
310 {
311   for(myAISContext->InitSelected();myAISContext->MoreSelected();myAISContext->NextSelected())
312         myAISContext->SetDisplayMode (myAISContext->SelectedInteractive(), 0, Standard_False);
313   myAISContext->UpdateCurrentViewer();
314 }
315 void OCC_3dBaseDoc::OnUpdateObjectWireframe(CCmdUI* pCmdUI) 
316 {
317   bool OneOrMoreInShading = false;
318   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
319     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),1)) OneOrMoreInShading=true;
320         pCmdUI->Enable (OneOrMoreInShading);    
321 }
322
323 void OCC_3dBaseDoc::OnObjectShading() 
324 {
325   for(myAISContext->InitSelected();myAISContext->MoreSelected();myAISContext->NextSelected())
326       myAISContext->SetDisplayMode (myAISContext->SelectedInteractive(), 1, Standard_False);
327   myAISContext->UpdateCurrentViewer();
328 }
329
330 void OCC_3dBaseDoc::OnUpdateObjectShading(CCmdUI* pCmdUI) 
331 {
332   bool OneOrMoreInWireframe = false;
333   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
334     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),0)) OneOrMoreInWireframe=true;
335         pCmdUI->Enable (OneOrMoreInWireframe);  
336 }
337
338 void OCC_3dBaseDoc::OnObjectMaterial() 
339 {
340   CDialogMaterial DialBox(myAISContext);
341   DialBox.DoModal();
342   //CMDIFrameWnd *pFrame =  (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
343   //CMDIChildWnd *pChild =  (CMDIChildWnd *) pFrame->GetActiveFrame();
344   //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
345 }
346
347 void OCC_3dBaseDoc::OnUpdateObjectMaterial(CCmdUI* pCmdUI) 
348 {
349   bool OneOrMoreInShading = false;
350   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
351     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),1)) OneOrMoreInShading=true;
352         pCmdUI->Enable (OneOrMoreInShading);    
353 }
354
355 BOOL OCC_3dBaseDoc::OnObjectMaterialRange(UINT nID) 
356 {
357   // the range ID_OBJECT_MATERIAL_BRASS to ID_OBJECT_MATERIAL_SILVER is
358   // continue with the same values as enumeration Type Of Material
359   Standard_Real aTransparency;
360
361   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ()){
362     aTransparency = myAISContext->SelectedInteractive()->Transparency();
363     myAISContext->SetMaterial (myAISContext->SelectedInteractive(),(Graphic3d_NameOfMaterial)(nID-ID_OBJECT_MATERIAL_BRASS), Standard_False);
364     myAISContext->SetTransparency (myAISContext->SelectedInteractive(),aTransparency, Standard_False);
365   }
366   myAISContext->UpdateCurrentViewer();
367   return true;
368
369 }
370
371 void OCC_3dBaseDoc::OnUpdateObjectMaterialRange(CCmdUI* pCmdUI) 
372 {
373   bool OneOrMoreInShading = false;
374   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
375     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),1)) OneOrMoreInShading=true;
376         pCmdUI->Enable (OneOrMoreInShading);
377   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
378     if (myAISContext->SelectedInteractive()->Material() - (pCmdUI->m_nID - ID_OBJECT_MATERIAL_BRASS) == 0)
379                 pCmdUI->SetCheck(1);    
380 }
381
382
383 void OCC_3dBaseDoc::OnObjectTransparency()
384 {
385         CDialogTransparency DialBox(myAISContext);
386         DialBox.DoModal();
387         //CMDIFrameWnd *pFrame =  (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
388         //CMDIChildWnd *pChild =  (CMDIChildWnd *) pFrame->GetActiveFrame();
389         //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
390 //      pView->Redraw();
391 }
392
393 void OCC_3dBaseDoc::OnUpdateObjectTransparency(CCmdUI* pCmdUI) 
394 {
395   bool OneOrMoreInShading = false;
396   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
397     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),1)) OneOrMoreInShading=true;
398         pCmdUI->Enable (OneOrMoreInShading);    
399 }
400
401
402 void OCC_3dBaseDoc::OnObjectDisplayall() 
403 {
404         myAISContext->DisplayAll (Standard_True);
405 }
406
407 void OCC_3dBaseDoc::OnUpdateObjectDisplayall(CCmdUI* pCmdUI) 
408 {
409         
410         AIS_ListOfInteractive aList;
411         myAISContext->ObjectsInside(aList,AIS_KOI_Shape);
412         AIS_ListIteratorOfListOfInteractive aLI;
413         Standard_Boolean IS_ANY_OBJECT_ERASED=FALSE;
414         for (aLI.Initialize(aList);aLI.More();aLI.Next()){
415                 if(!myAISContext->IsDisplayed(aLI.Value()))
416                 IS_ANY_OBJECT_ERASED=TRUE;
417         }
418         pCmdUI->Enable (IS_ANY_OBJECT_ERASED);
419
420 }
421
422 void OCC_3dBaseDoc::OnObjectRemove() 
423 {
424         for(myAISContext->InitSelected();myAISContext->MoreSelected();myAISContext->InitSelected())
425         myAISContext->Remove(myAISContext->SelectedInteractive(),Standard_True);
426 }
427
428 void OCC_3dBaseDoc::OnUpdateObjectRemove(CCmdUI* pCmdUI) 
429 {
430   bool OneOrMoreIsDisplayed = false;
431   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
432     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive())) OneOrMoreIsDisplayed=true;
433   pCmdUI->Enable (OneOrMoreIsDisplayed);
434 }
435
436 void OCC_3dBaseDoc::SetMaterial(Graphic3d_NameOfMaterial Material) 
437 {
438   for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
439     myAISContext->SetMaterial (myAISContext->SelectedInteractive(),
440     (Graphic3d_NameOfMaterial)(Material), Standard_False);
441   myAISContext->UpdateCurrentViewer();
442 }
443
444
445 // RayTracing
446 void OCC_3dBaseDoc::OnObjectRayTracing()
447 {
448   myRayTracingIsOn = !myRayTracingIsOn;
449   if(!myRayTracingIsOn)
450   {
451     myRaytracedShadowsIsOn = false;
452     myRaytracedReflectionsIsOn = false;
453     myRaytracedAntialiasingIsOn = false;
454   }
455   OnObjectRayTracingAction();
456 }
457 // Shadows
458 void OCC_3dBaseDoc::OnObjectShadows()
459 {
460   myRaytracedShadowsIsOn = !myRaytracedShadowsIsOn;
461   OnObjectRayTracingAction();
462 }
463 // Reflections
464 void OCC_3dBaseDoc::OnObjectReflections()
465 {
466   myRaytracedReflectionsIsOn = !myRaytracedReflectionsIsOn;
467   OnObjectRayTracingAction();
468 }
469 // Anti-aliasing
470 void OCC_3dBaseDoc::OnObjectAntiAliasing()
471 {
472   myRaytracedAntialiasingIsOn = !myRaytracedAntialiasingIsOn;
473   OnObjectRayTracingAction();
474 }
475 void OCC_3dBaseDoc::OnUpdateV3dButtons (CCmdUI* pCmdUI)
476 {
477   if (pCmdUI->m_nID == ID_OBJECT_RAY_TRACING)
478   {
479     pCmdUI->SetCheck(myRayTracingIsOn);
480   } else {
481     pCmdUI->Enable(myRayTracingIsOn);
482     if (pCmdUI->m_nID == ID_OBJECT_SHADOWS)
483       pCmdUI->SetCheck(myRaytracedShadowsIsOn);
484     if (pCmdUI->m_nID == ID_OBJECT_REFLECTIONS)
485       pCmdUI->SetCheck(myRaytracedReflectionsIsOn);
486     if (pCmdUI->m_nID == ID_OBJECT_ANTI_ALIASING)
487       pCmdUI->SetCheck(myRaytracedAntialiasingIsOn);
488   }
489 }
490 // Common function to change raytracing params and redraw view
491 void OCC_3dBaseDoc::OnObjectRayTracingAction()
492 {
493   myAISContext->CurrentViewer()->InitActiveViews();
494   Handle(V3d_View) aView = myAISContext->CurrentViewer()->ActiveView();
495   Graphic3d_RenderingParams& aParams = aView->ChangeRenderingParams();
496   if (myRayTracingIsOn)
497     aParams.Method = Graphic3d_RM_RAYTRACING;
498   else
499     aParams.Method = Graphic3d_RM_RASTERIZATION;
500   aParams.IsShadowEnabled = myRaytracedShadowsIsOn;
501   aParams.IsReflectionEnabled = myRaytracedReflectionsIsOn;
502   aParams.IsAntialiasingEnabled = myRaytracedAntialiasingIsOn;
503   myAISContext->UpdateCurrentViewer();
504 }