b579e8b055cb2f69628b00eddec787d7aef89ba1
[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_LocalContext.hxx>
15 #include <AIS_ListOfInteractive.hxx>
16 #include <AIS_ListIteratorOfListOfInteractive.hxx>
17 #include <TColStd_ListIteratorOfListOfInteger.hxx>
18 #include <TColStd_ListOfInteger.hxx>
19 #include <TopoDS_Shape.hxx>
20
21 BEGIN_MESSAGE_MAP(OCC_3dBaseDoc, OCC_BaseDoc)
22   //{{AFX_MSG_MAP(OCC_3dBaseDoc)
23   ON_COMMAND(ID_FILE_IMPORT_BREP, OnFileImportBrep)
24   ON_COMMAND(ID_FILE_EXPORT_BREP, OnFileExportBrep)
25   ON_COMMAND(ID_OBJECT_ERASE, OnObjectErase)
26   ON_UPDATE_COMMAND_UI(ID_OBJECT_ERASE, OnUpdateObjectErase)
27   ON_COMMAND(ID_OBJECT_COLOR, OnObjectColor)
28   ON_UPDATE_COMMAND_UI(ID_OBJECT_COLOR, OnUpdateObjectColor)
29   ON_COMMAND(ID_OBJECT_SHADING, OnObjectShading)
30   ON_UPDATE_COMMAND_UI(ID_OBJECT_SHADING, OnUpdateObjectShading)
31   ON_COMMAND(ID_OBJECT_WIREFRAME, OnObjectWireframe)
32   ON_UPDATE_COMMAND_UI(ID_OBJECT_WIREFRAME, OnUpdateObjectWireframe)
33   ON_COMMAND(ID_OBJECT_TRANSPARENCY, OnObjectTransparency)
34   ON_UPDATE_COMMAND_UI(ID_OBJECT_TRANSPARENCY, OnUpdateObjectTransparency)
35   ON_COMMAND(ID_OBJECT_MATERIAL, OnObjectMaterial)
36   ON_UPDATE_COMMAND_UI(ID_OBJECT_MATERIAL, OnUpdateObjectMaterial)
37   ON_COMMAND(ID_OBJECT_DISPLAYALL, OnObjectDisplayall)
38   ON_UPDATE_COMMAND_UI(ID_OBJECT_DISPLAYALL, OnUpdateObjectDisplayall)
39   ON_COMMAND(ID_OBJECT_REMOVE, OnObjectRemove)
40   ON_UPDATE_COMMAND_UI(ID_OBJECT_REMOVE, OnUpdateObjectRemove)
41   ON_COMMAND(ID_OBJECT_DIM, OnObjectAddDimensions)
42   ON_UPDATE_COMMAND_UI(ID_OBJECT_DIM, OnUpdateObjectAddDimensions)
43
44   //}}AFX_MSG_MAP
45   ON_COMMAND_EX_RANGE(ID_OBJECT_MATERIAL_BRASS,ID_OBJECT_MATERIAL_DEFAULT, OnObjectMaterialRange)
46   ON_UPDATE_COMMAND_UI_RANGE(ID_OBJECT_MATERIAL_BRASS,ID_OBJECT_MATERIAL_DEFAULT, OnUpdateObjectMaterialRange)
47 END_MESSAGE_MAP()
48
49
50 //////////////////////////////////////////////////////////////////////
51 // Construction/Destruction
52 //////////////////////////////////////////////////////////////////////
53
54 OCC_3dBaseDoc::OCC_3dBaseDoc()
55 :myPopupMenuNumber(0),
56  myDimensionDlg()
57 {
58   AfxInitRichEdit();
59
60   Handle(Graphic3d_GraphicDriver) aGraphicDriver = 
61     ((OCC_App*)AfxGetApp())->GetGraphicDriver();
62
63   myViewer = new V3d_Viewer (aGraphicDriver, Standard_ExtString("Visu3D") );
64   myViewer->SetDefaultLights();
65   myViewer->SetLightOn();
66   myAISContext = new AIS_InteractiveContext (myViewer);
67   myDimensionDlg.SetContext (myAISContext);
68   myDimensionDlg.Create(CDimensionDlg::IDD, NULL);
69 }
70
71 OCC_3dBaseDoc::~OCC_3dBaseDoc()
72 {
73 }
74
75 //-----------------------------------------------------------------------------------------
76 //
77 //-----------------------------------------------------------------------------------------
78 void OCC_3dBaseDoc::DragEvent (const Standard_Integer theMouseX,
79                                const Standard_Integer theMouseY,
80                                const Standard_Integer theState,
81                                const Handle(V3d_View)& theView)
82 {
83   // TheState == -1  button down
84   // TheState ==  0  move
85   // TheState ==  1  button up
86
87   static Standard_Integer aStartDragX = 0;
88   static Standard_Integer aStartDragY = 0;
89
90   if (theState == -1)
91   {
92     // button down
93     aStartDragX = theMouseX;
94     aStartDragY = theMouseY;
95   }
96
97   if (theState == 1)
98   {
99     // button up
100     myAISContext->Select (aStartDragX, aStartDragY,
101                           theMouseX, theMouseY,
102                           theView);
103   }
104 }
105
106 //-----------------------------------------------------------------------------------------
107 //
108 //-----------------------------------------------------------------------------------------
109 void OCC_3dBaseDoc::InputEvent (const Standard_Integer theMouseX,
110                                 const Standard_Integer theMouseY,
111                                 const Handle(V3d_View)& theView)
112 {
113   myAISContext->MoveTo (theMouseX, theMouseY, theView);
114   myAISContext->Select();
115 }
116
117 //-----------------------------------------------------------------------------------------
118 //
119 //-----------------------------------------------------------------------------------------
120 void OCC_3dBaseDoc::MoveEvent (const Standard_Integer theMouseX,
121                                const Standard_Integer theMouseY,
122                                const Handle(V3d_View)& theView)
123 {
124   myAISContext->MoveTo (theMouseX, theMouseY, theView);
125 }
126
127 //-----------------------------------------------------------------------------------------
128 //
129 //-----------------------------------------------------------------------------------------
130 void OCC_3dBaseDoc::ShiftMoveEvent (const Standard_Integer theMouseX,
131                                     const Standard_Integer theMouseY,
132                                     const Handle(V3d_View)& theView)
133 {
134   myAISContext->MoveTo (theMouseX, theMouseY, theView);
135 }
136
137 //-----------------------------------------------------------------------------------------
138 //
139 //-----------------------------------------------------------------------------------------
140 void OCC_3dBaseDoc::ShiftDragEvent (const Standard_Integer theMouseX,
141                                     const Standard_Integer theMouseY,
142                                     const Standard_Integer theState,
143                                     const Handle(V3d_View)& theView)
144 {
145   // TheState == -1  button down
146   // TheState ==  0  move
147   // TheState ==  1  button up
148
149   static Standard_Integer aStartDragX = 0;
150   static Standard_Integer aStartDragY = 0;
151
152   if (theState == -1)
153   {
154     // button down
155     aStartDragX = theMouseX;
156     aStartDragY = theMouseY;
157   }
158
159   if (theState == 0)
160   {
161     // button up
162     myAISContext->ShiftSelect (aStartDragX, aStartDragY,
163                                theMouseX, theMouseY,
164                                theView);
165   }
166 }
167
168 //-----------------------------------------------------------------------------------------
169 //
170 //-----------------------------------------------------------------------------------------
171 void OCC_3dBaseDoc::ShiftInputEvent (const Standard_Integer /*theMouseX*/,
172                                      const Standard_Integer /*theMouseY*/,
173                                      const Handle(V3d_View)& /*theView*/)
174 {
175   myAISContext->ShiftSelect();
176 }
177
178 //-----------------------------------------------------------------------------------------
179 //
180 //-----------------------------------------------------------------------------------------
181 void  OCC_3dBaseDoc::Popup (const Standard_Integer theMouseX,
182                             const Standard_Integer theMouseY,
183                             const Handle(V3d_View)& theView)
184 {
185   // Base check which context menu to call
186   if (!myPopupMenuNumber)
187   {
188     myAISContext->InitCurrent();
189     if (myAISContext->MoreCurrent())
190       myPopupMenuNumber=1;
191   }
192
193   CMenu menu;
194   VERIFY(menu.LoadMenu(IDR_Popup3D));
195   CMenu* pPopup = menu.GetSubMenu(myPopupMenuNumber);
196
197   ASSERT(pPopup != NULL);
198    if (myPopupMenuNumber == 1) // more than 1 object.
199   {
200     bool OneOrMoreInShading = false;
201         for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
202     if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
203         if(!OneOrMoreInShading)
204         pPopup->EnableMenuItem(5, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
205    }
206
207   POINT winCoord = { theMouseX , theMouseY };
208   Handle(WNT_Window) aWNTWindow=
209   Handle(WNT_Window)::DownCast(theView->Window());
210   ClientToScreen ( (HWND)(aWNTWindow->HWindow()),&winCoord);
211   pPopup->TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON,
212                           winCoord.x,
213                           winCoord.y,
214                           AfxGetMainWnd());
215 }
216
217 void OCC_3dBaseDoc::Fit()
218 {
219         CMDIFrameWnd *pFrame =  (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
220         CMDIChildWnd *pChild =  (CMDIChildWnd *) pFrame->GetActiveFrame();
221         OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
222         pView->FitAll();
223 }
224
225 int OCC_3dBaseDoc::OnFileImportBrep_WithInitDir(LPCTSTR InitialDir) 
226 {   
227         if(CImportExport::ReadBREP(myAISContext, InitialDir) == 1)
228                 return 1;
229         Fit();
230         return 0;
231 }
232
233 void OCC_3dBaseDoc::OnFileImportBrep() 
234 {   
235         if(CImportExport::ReadBREP(myAISContext) == 1)
236                 return;
237         Fit();
238         
239 }
240
241 void OCC_3dBaseDoc::OnFileExportBrep() 
242 {   CImportExport::SaveBREP(myAISContext);}
243
244 void OCC_3dBaseDoc::OnObjectColor() 
245 {
246         Handle_AIS_InteractiveObject Current ;
247         COLORREF MSColor ;
248         Quantity_Color CSFColor ;
249
250         myAISContext->InitCurrent();
251     Current = myAISContext->Current();
252         if ( Current->HasColor () ) {
253       CSFColor = myAISContext->Color(myAISContext->Current());
254       MSColor = RGB (CSFColor.Red()*255.,CSFColor.Green()*255.,CSFColor.Blue()*255.);
255         }
256         else {
257           MSColor = RGB (255,255,255) ;
258         }
259         
260         CColorDialog dlgColor(MSColor);
261         if (dlgColor.DoModal() == IDOK)
262         {
263           MSColor = dlgColor.GetColor();
264           CSFColor = Quantity_Color (GetRValue(MSColor)/255.,GetGValue(MSColor)/255.,
265                                                          GetBValue(MSColor)/255.,Quantity_TOC_RGB); 
266           for (;myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
267           myAISContext->SetColor (myAISContext->Current(),CSFColor.Name());
268         }
269 }
270 void OCC_3dBaseDoc::OnUpdateObjectColor(CCmdUI* pCmdUI) 
271 {
272   bool OneOrMoreIsShadingOrWireframe = false;
273   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
274     if (myAISContext->IsDisplayed(myAISContext->Current(),0)
275                 ||myAISContext->IsDisplayed(myAISContext->Current(),1)) 
276                 OneOrMoreIsShadingOrWireframe=true;
277   pCmdUI->Enable (OneOrMoreIsShadingOrWireframe);       
278 }
279
280 void OCC_3dBaseDoc::OnObjectErase() 
281 {
282   for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
283         myAISContext->Erase(myAISContext->Current(),Standard_True);
284         myAISContext->ClearCurrents();
285 }
286 void OCC_3dBaseDoc::OnUpdateObjectErase(CCmdUI* pCmdUI) 
287 {
288   bool OneOrMoreIsDisplayed = false;
289   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
290     if (myAISContext->IsDisplayed(myAISContext->Current())) OneOrMoreIsDisplayed=true;
291   pCmdUI->Enable (OneOrMoreIsDisplayed);        
292 }
293
294 void OCC_3dBaseDoc::OnObjectWireframe() 
295 {
296   for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
297         myAISContext->SetDisplayMode(myAISContext->Current(),0);
298 }
299 void OCC_3dBaseDoc::OnUpdateObjectWireframe(CCmdUI* pCmdUI) 
300 {
301   bool OneOrMoreInShading = false;
302   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
303     if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
304         pCmdUI->Enable (OneOrMoreInShading);    
305 }
306
307 void OCC_3dBaseDoc::OnObjectShading() 
308 {
309   for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
310       myAISContext->SetDisplayMode(myAISContext->Current(),1);
311 }
312
313 void OCC_3dBaseDoc::OnUpdateObjectShading(CCmdUI* pCmdUI) 
314 {
315   bool OneOrMoreInWireframe = false;
316   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
317     if (myAISContext->IsDisplayed(myAISContext->Current(),0)) OneOrMoreInWireframe=true;
318         pCmdUI->Enable (OneOrMoreInWireframe);  
319 }
320
321 void OCC_3dBaseDoc::OnObjectMaterial() 
322 {
323   CDialogMaterial DialBox(myAISContext);
324   DialBox.DoModal();
325   //CMDIFrameWnd *pFrame =  (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
326   //CMDIChildWnd *pChild =  (CMDIChildWnd *) pFrame->GetActiveFrame();
327   //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
328 }
329
330 void OCC_3dBaseDoc::OnUpdateObjectMaterial(CCmdUI* pCmdUI) 
331 {
332   bool OneOrMoreInShading = false;
333   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
334     if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
335         pCmdUI->Enable (OneOrMoreInShading);    
336 }
337
338 BOOL OCC_3dBaseDoc::OnObjectMaterialRange(UINT nID) 
339 {
340   // the range ID_OBJECT_MATERIAL_BRASS to ID_OBJECT_MATERIAL_SILVER is
341   // continue with the same values as enumeration Type Of Material
342   Standard_Real aTransparency;
343
344   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ()){
345         aTransparency = myAISContext->Current()->Transparency();
346         myAISContext->SetMaterial (myAISContext->Current(),(Graphic3d_NameOfMaterial)(nID-ID_OBJECT_MATERIAL_BRASS));
347         myAISContext->SetTransparency (myAISContext->Current(),aTransparency);
348   }
349   return true;
350
351 }
352
353 void OCC_3dBaseDoc::OnUpdateObjectMaterialRange(CCmdUI* pCmdUI) 
354 {
355   bool OneOrMoreInShading = false;
356   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
357     if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
358         pCmdUI->Enable (OneOrMoreInShading);
359   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
360     if (myAISContext->Current()->Material() - (pCmdUI->m_nID - ID_OBJECT_MATERIAL_BRASS) == 0) 
361                 pCmdUI->SetCheck(1);    
362 }
363
364
365 void OCC_3dBaseDoc::OnObjectTransparency()
366 {
367         CDialogTransparency DialBox(myAISContext);
368         DialBox.DoModal();
369         //CMDIFrameWnd *pFrame =  (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
370         //CMDIChildWnd *pChild =  (CMDIChildWnd *) pFrame->GetActiveFrame();
371         //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
372 //      pView->Redraw();
373 }
374
375 void OCC_3dBaseDoc::OnUpdateObjectTransparency(CCmdUI* pCmdUI) 
376 {
377   bool OneOrMoreInShading = false;
378   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
379     if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
380         pCmdUI->Enable (OneOrMoreInShading);    
381 }
382
383
384 void OCC_3dBaseDoc::OnObjectDisplayall() 
385 {
386         myAISContext->DisplayAll();
387 }
388
389 void OCC_3dBaseDoc::OnUpdateObjectDisplayall(CCmdUI* pCmdUI) 
390 {
391         
392         AIS_ListOfInteractive aList;
393         myAISContext->ObjectsInside(aList,AIS_KOI_Shape);
394         AIS_ListIteratorOfListOfInteractive aLI;
395         Standard_Boolean IS_ANY_OBJECT_ERASED=FALSE;
396         for (aLI.Initialize(aList);aLI.More();aLI.Next()){
397                 if(!myAISContext->IsDisplayed(aLI.Value()))
398                 IS_ANY_OBJECT_ERASED=TRUE;
399         }
400         pCmdUI->Enable (IS_ANY_OBJECT_ERASED);
401
402 }
403
404 void OCC_3dBaseDoc::OnObjectRemove() 
405 {
406         for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->InitCurrent())
407         myAISContext->Remove(myAISContext->Current(),Standard_True);
408 }
409
410 void OCC_3dBaseDoc::OnUpdateObjectRemove(CCmdUI* pCmdUI) 
411 {
412   bool OneOrMoreIsDisplayed = false;
413   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
414     if (myAISContext->IsDisplayed(myAISContext->Current())) OneOrMoreIsDisplayed=true;
415   pCmdUI->Enable (OneOrMoreIsDisplayed);
416 }
417
418 void OCC_3dBaseDoc::SetMaterial(Graphic3d_NameOfMaterial Material) 
419 {
420   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
421     myAISContext->SetMaterial (myAISContext->Current(),
422     (Graphic3d_NameOfMaterial)(Material));
423 }
424
425 void OCC_3dBaseDoc::OnObjectAddDimensions() 
426 {
427   //Add dimentions dialog is opened here
428   myDimensionDlg.ShowWindow(SW_SHOW);
429   myDimensionDlg.UpdateStandardMode ();
430 }
431
432 void OCC_3dBaseDoc::OnUpdateObjectAddDimensions(CCmdUI* /*pCmdUI*/) 
433 {
434   // Check if local context is opened
435   //pCmdUI->Enable (myAISContext->HasOpenedContext());
436 }
437
438