1 // OCC_3dBaseDoc.cpp: implementation of the OCC_3dBaseDoc class.
3 //////////////////////////////////////////////////////////////////////
7 #include "OCC_3dBaseDoc.h"
9 #include "OCC_3dView.h"
10 #include "OCC_3dApp.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>
17 BEGIN_MESSAGE_MAP(OCC_3dBaseDoc, OCC_BaseDoc)
18 //{{AFX_MSG_MAP(OCC_3dBaseDoc)
19 ON_COMMAND(ID_FILE_IMPORT_BREP, OnFileImportBrep)
20 ON_COMMAND(ID_FILE_EXPORT_BREP, OnFileExportBrep)
21 ON_COMMAND(ID_OBJECT_ERASE, OnObjectErase)
22 ON_UPDATE_COMMAND_UI(ID_OBJECT_ERASE, OnUpdateObjectErase)
23 ON_COMMAND(ID_OBJECT_COLOR, OnObjectColor)
24 ON_UPDATE_COMMAND_UI(ID_OBJECT_COLOR, OnUpdateObjectColor)
25 ON_COMMAND(ID_OBJECT_SHADING, OnObjectShading)
26 ON_UPDATE_COMMAND_UI(ID_OBJECT_SHADING, OnUpdateObjectShading)
27 ON_COMMAND(ID_OBJECT_WIREFRAME, OnObjectWireframe)
28 ON_UPDATE_COMMAND_UI(ID_OBJECT_WIREFRAME, OnUpdateObjectWireframe)
29 ON_COMMAND(ID_OBJECT_TRANSPARENCY, OnObjectTransparency)
30 ON_UPDATE_COMMAND_UI(ID_OBJECT_TRANSPARENCY, OnUpdateObjectTransparency)
31 ON_COMMAND(ID_OBJECT_MATERIAL, OnObjectMaterial)
32 ON_UPDATE_COMMAND_UI(ID_OBJECT_MATERIAL, OnUpdateObjectMaterial)
33 ON_COMMAND(ID_OBJECT_DISPLAYALL, OnObjectDisplayall)
34 ON_UPDATE_COMMAND_UI(ID_OBJECT_DISPLAYALL, OnUpdateObjectDisplayall)
35 ON_COMMAND(ID_OBJECT_REMOVE, OnObjectRemove)
36 ON_UPDATE_COMMAND_UI(ID_OBJECT_REMOVE, OnUpdateObjectRemove)
38 ON_COMMAND_EX_RANGE(ID_OBJECT_MATERIAL_BRASS,ID_OBJECT_MATERIAL_DEFAULT, OnObjectMaterialRange)
39 ON_UPDATE_COMMAND_UI_RANGE(ID_OBJECT_MATERIAL_BRASS,ID_OBJECT_MATERIAL_DEFAULT, OnUpdateObjectMaterialRange)
44 //////////////////////////////////////////////////////////////////////
45 // Construction/Destruction
46 //////////////////////////////////////////////////////////////////////
48 OCC_3dBaseDoc::OCC_3dBaseDoc()
52 Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice =
53 ((OCC_3dApp*)AfxGetApp())->GetGraphicDevice();
55 myViewer = new V3d_Viewer(theGraphicDevice,(short *) "Visu3D");
56 myViewer->SetDefaultLights();
57 myViewer->SetLightOn();
58 myAISContext =new AIS_InteractiveContext(myViewer);
61 OCC_3dBaseDoc::~OCC_3dBaseDoc()
67 void OCC_3dBaseDoc::DragEvent(const Standard_Integer x ,
68 const Standard_Integer y ,
69 const Standard_Integer TheState ,
70 const Handle(V3d_View)& aView )
73 // TheState == -1 button down
75 // TheState == 1 button up
77 static Standard_Integer theButtonDownX=0;
78 static Standard_Integer theButtonDownY=0;
87 myAISContext->Select(theButtonDownX,theButtonDownY,x,y,aView);
91 //-----------------------------------------------------------------------------------------
93 //-----------------------------------------------------------------------------------------
94 void OCC_3dBaseDoc::InputEvent(const Standard_Integer x ,
95 const Standard_Integer y ,
96 const Handle(V3d_View)& aView )
98 myAISContext->Select();
101 //-----------------------------------------------------------------------------------------
103 //-----------------------------------------------------------------------------------------
104 void OCC_3dBaseDoc::MoveEvent(const Standard_Integer x ,
105 const Standard_Integer y ,
106 const Handle(V3d_View)& aView )
108 myAISContext->MoveTo(x,y,aView);
111 //-----------------------------------------------------------------------------------------
113 //-----------------------------------------------------------------------------------------
114 void OCC_3dBaseDoc::ShiftMoveEvent(const Standard_Integer x ,
115 const Standard_Integer y ,
116 const Handle(V3d_View)& aView )
118 myAISContext->MoveTo(x,y,aView);
121 //-----------------------------------------------------------------------------------------
123 //-----------------------------------------------------------------------------------------
124 void OCC_3dBaseDoc::ShiftDragEvent(const Standard_Integer x ,
125 const Standard_Integer y ,
126 const Standard_Integer TheState ,
127 const Handle(V3d_View)& aView )
129 static Standard_Integer theButtonDownX=0;
130 static Standard_Integer theButtonDownY=0;
139 myAISContext->ShiftSelect(theButtonDownX,theButtonDownY,x,y,aView);
143 //-----------------------------------------------------------------------------------------
145 //-----------------------------------------------------------------------------------------
146 void OCC_3dBaseDoc::ShiftInputEvent(const Standard_Integer x ,
147 const Standard_Integer y ,
148 const Handle(V3d_View)& aView )
150 myAISContext->ShiftSelect();
153 //-----------------------------------------------------------------------------------------
155 //-----------------------------------------------------------------------------------------
156 void OCC_3dBaseDoc::Popup(const Standard_Integer x,
157 const Standard_Integer y ,
158 const Handle(V3d_View)& aView )
160 Standard_Integer PopupMenuNumber=0;
161 myAISContext->InitCurrent();
162 if (myAISContext->MoreCurrent())
166 VERIFY(menu.LoadMenu(IDR_Popup3D));
167 CMenu* pPopup = menu.GetSubMenu(PopupMenuNumber);
169 ASSERT(pPopup != NULL);
170 if (PopupMenuNumber == 1) // more than 1 object.
172 bool OneOrMoreInShading = false;
173 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
174 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
175 if(!OneOrMoreInShading)
176 pPopup->EnableMenuItem(5, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
179 POINT winCoord = { x , y };
180 Handle(WNT_Window) aWNTWindow=
181 Handle(WNT_Window)::DownCast(aView->Window());
182 ClientToScreen ( (HWND)(aWNTWindow->HWindow()),&winCoord);
183 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON , winCoord.x, winCoord.y ,
187 void OCC_3dBaseDoc::Fit()
189 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
190 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
191 OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
195 int OCC_3dBaseDoc::OnFileImportBrep_WithInitDir(LPCTSTR InitialDir)
197 if(CImportExport::ReadBREP(myAISContext, InitialDir) == 1)
203 void OCC_3dBaseDoc::OnFileImportBrep()
205 if(CImportExport::ReadBREP(myAISContext) == 1)
211 void OCC_3dBaseDoc::OnFileExportBrep()
212 { CImportExport::SaveBREP(myAISContext);}
214 void OCC_3dBaseDoc::OnObjectColor()
216 Handle_AIS_InteractiveObject Current ;
218 Quantity_Color CSFColor ;
220 myAISContext->InitCurrent();
221 Current = myAISContext->Current();
222 if ( Current->HasColor () ) {
223 CSFColor = myAISContext->Color(myAISContext->Current());
224 MSColor = RGB (CSFColor.Red()*255.,CSFColor.Green()*255.,CSFColor.Blue()*255.);
227 MSColor = RGB (255,255,255) ;
230 CColorDialog dlgColor(MSColor);
231 if (dlgColor.DoModal() == IDOK)
233 MSColor = dlgColor.GetColor();
234 CSFColor = Quantity_Color (GetRValue(MSColor)/255.,GetGValue(MSColor)/255.,
235 GetBValue(MSColor)/255.,Quantity_TOC_RGB);
236 for (;myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
237 myAISContext->SetColor (myAISContext->Current(),CSFColor.Name());
240 void OCC_3dBaseDoc::OnUpdateObjectColor(CCmdUI* pCmdUI)
243 bool OneOrMoreIsDisplayed = false;
244 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
245 if (myAISContext->IsDisplayed(myAISContext->Current())) OneOrMoreIsDisplayed=true;
246 pCmdUI->Enable (OneOrMoreIsDisplayed);
248 bool OneOrMoreIsShadingOrWireframe = false;
249 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
250 if (myAISContext->IsDisplayed(myAISContext->Current(),0)
251 ||myAISContext->IsDisplayed(myAISContext->Current(),1))
252 OneOrMoreIsShadingOrWireframe=true;
253 pCmdUI->Enable (OneOrMoreIsShadingOrWireframe);
258 void OCC_3dBaseDoc::OnObjectErase()
260 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
261 myAISContext->Erase(myAISContext->Current(),Standard_True,Standard_False);
262 myAISContext->ClearCurrents();
264 void OCC_3dBaseDoc::OnUpdateObjectErase(CCmdUI* pCmdUI)
266 bool OneOrMoreIsDisplayed = false;
267 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
268 if (myAISContext->IsDisplayed(myAISContext->Current())) OneOrMoreIsDisplayed=true;
269 pCmdUI->Enable (OneOrMoreIsDisplayed);
272 void OCC_3dBaseDoc::OnObjectWireframe()
274 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
275 myAISContext->SetDisplayMode(myAISContext->Current(),0);
277 void OCC_3dBaseDoc::OnUpdateObjectWireframe(CCmdUI* pCmdUI)
279 bool OneOrMoreInShading = false;
280 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
281 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
282 pCmdUI->Enable (OneOrMoreInShading);
285 void OCC_3dBaseDoc::OnObjectShading()
287 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
288 myAISContext->SetDisplayMode(myAISContext->Current(),1);
291 void OCC_3dBaseDoc::OnUpdateObjectShading(CCmdUI* pCmdUI)
293 bool OneOrMoreInWireframe = false;
294 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
295 if (myAISContext->IsDisplayed(myAISContext->Current(),0)) OneOrMoreInWireframe=true;
296 pCmdUI->Enable (OneOrMoreInWireframe);
299 void OCC_3dBaseDoc::OnObjectMaterial()
301 CDialogMaterial DialBox(myAISContext);
303 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
304 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
305 OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
309 void OCC_3dBaseDoc::OnUpdateObjectMaterial(CCmdUI* pCmdUI)
311 bool OneOrMoreInShading = false;
312 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
313 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
314 pCmdUI->Enable (OneOrMoreInShading);
317 BOOL OCC_3dBaseDoc::OnObjectMaterialRange(UINT nID)
319 // the range ID_OBJECT_MATERIAL_BRASS to ID_OBJECT_MATERIAL_SILVER is
320 // continue with the same values as enumeration Type Of Material
321 Standard_Real aTransparency;
323 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ()){
324 aTransparency = myAISContext->Current()->Transparency();
325 myAISContext->SetMaterial (myAISContext->Current(),(Graphic3d_NameOfMaterial)(nID-ID_OBJECT_MATERIAL_BRASS));
326 myAISContext->SetTransparency (myAISContext->Current(),aTransparency);
332 void OCC_3dBaseDoc::OnUpdateObjectMaterialRange(CCmdUI* pCmdUI)
334 bool OneOrMoreInShading = false;
335 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
336 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
337 pCmdUI->Enable (OneOrMoreInShading);
338 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
339 if (myAISContext->Current()->Material() - (pCmdUI->m_nID - ID_OBJECT_MATERIAL_BRASS) == 0)
344 void OCC_3dBaseDoc::OnObjectTransparency()
346 CDialogTransparency DialBox(myAISContext);
348 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
349 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
350 OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
354 void OCC_3dBaseDoc::OnUpdateObjectTransparency(CCmdUI* pCmdUI)
356 bool OneOrMoreInShading = false;
357 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
358 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
359 pCmdUI->Enable (OneOrMoreInShading);
363 void OCC_3dBaseDoc::OnObjectDisplayall()
365 myAISContext->DisplayAll(Standard_False);
368 void OCC_3dBaseDoc::OnUpdateObjectDisplayall(CCmdUI* pCmdUI)
371 AIS_ListOfInteractive aList;
372 myAISContext->ObjectsInside(aList,AIS_KOI_Shape);
373 AIS_ListIteratorOfListOfInteractive aLI;
374 Standard_Boolean IS_ANY_OBJECT_ERASED=FALSE;
375 for (aLI.Initialize(aList);aLI.More();aLI.Next()){
376 if(!myAISContext->IsDisplayed(aLI.Value()))
377 IS_ANY_OBJECT_ERASED=TRUE;
379 pCmdUI->Enable (IS_ANY_OBJECT_ERASED);
383 void OCC_3dBaseDoc::OnObjectRemove()
385 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->InitCurrent())
386 myAISContext->Remove(myAISContext->Current(),Standard_True);
389 void OCC_3dBaseDoc::OnUpdateObjectRemove(CCmdUI* pCmdUI)
391 bool OneOrMoreIsDisplayed = false;
392 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
393 if (myAISContext->IsDisplayed(myAISContext->Current())) OneOrMoreIsDisplayed=true;
394 pCmdUI->Enable (OneOrMoreIsDisplayed);
397 void OCC_3dBaseDoc::SetMaterial(Graphic3d_NameOfMaterial Material)
399 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
400 myAISContext->SetMaterial (myAISContext->Current(),
401 (Graphic3d_NameOfMaterial)(Material));