1 // OCC_3dBaseDoc.cpp: implementation of the OCC_3dBaseDoc class.
3 //////////////////////////////////////////////////////////////////////
7 #include "OCC_3dBaseDoc.h"
9 #include "OCC_3dView.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>
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)
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)
50 //////////////////////////////////////////////////////////////////////
51 // Construction/Destruction
52 //////////////////////////////////////////////////////////////////////
54 OCC_3dBaseDoc::OCC_3dBaseDoc()
55 :myPopupMenuNumber(0),
60 Handle(Graphic3d_GraphicDriver) aGraphicDriver =
61 ((OCC_App*)AfxGetApp())->GetGraphicDriver();
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);
71 OCC_3dBaseDoc::~OCC_3dBaseDoc()
75 //-----------------------------------------------------------------------------------------
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)
83 // TheState == -1 button down
85 // TheState == 1 button up
87 static Standard_Integer aStartDragX = 0;
88 static Standard_Integer aStartDragY = 0;
93 aStartDragX = theMouseX;
94 aStartDragY = theMouseY;
100 myAISContext->Select (aStartDragX, aStartDragY,
101 theMouseX, theMouseY,
106 //-----------------------------------------------------------------------------------------
108 //-----------------------------------------------------------------------------------------
109 void OCC_3dBaseDoc::InputEvent (const Standard_Integer theMouseX,
110 const Standard_Integer theMouseY,
111 const Handle(V3d_View)& theView)
113 myAISContext->MoveTo (theMouseX, theMouseY, theView);
114 myAISContext->Select();
117 //-----------------------------------------------------------------------------------------
119 //-----------------------------------------------------------------------------------------
120 void OCC_3dBaseDoc::MoveEvent (const Standard_Integer theMouseX,
121 const Standard_Integer theMouseY,
122 const Handle(V3d_View)& theView)
124 myAISContext->MoveTo (theMouseX, theMouseY, theView);
127 //-----------------------------------------------------------------------------------------
129 //-----------------------------------------------------------------------------------------
130 void OCC_3dBaseDoc::ShiftMoveEvent (const Standard_Integer theMouseX,
131 const Standard_Integer theMouseY,
132 const Handle(V3d_View)& theView)
134 myAISContext->MoveTo (theMouseX, theMouseY, theView);
137 //-----------------------------------------------------------------------------------------
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)
145 // TheState == -1 button down
146 // TheState == 0 move
147 // TheState == 1 button up
149 static Standard_Integer aStartDragX = 0;
150 static Standard_Integer aStartDragY = 0;
155 aStartDragX = theMouseX;
156 aStartDragY = theMouseY;
162 myAISContext->ShiftSelect (aStartDragX, aStartDragY,
163 theMouseX, theMouseY,
168 //-----------------------------------------------------------------------------------------
170 //-----------------------------------------------------------------------------------------
171 void OCC_3dBaseDoc::ShiftInputEvent (const Standard_Integer /*theMouseX*/,
172 const Standard_Integer /*theMouseY*/,
173 const Handle(V3d_View)& /*theView*/)
175 myAISContext->ShiftSelect();
178 //-----------------------------------------------------------------------------------------
180 //-----------------------------------------------------------------------------------------
181 void OCC_3dBaseDoc::Popup (const Standard_Integer theMouseX,
182 const Standard_Integer theMouseY,
183 const Handle(V3d_View)& theView)
185 // Base check which context menu to call
186 if (!myPopupMenuNumber)
188 myAISContext->InitCurrent();
189 if (myAISContext->MoreCurrent())
194 VERIFY(menu.LoadMenu(IDR_Popup3D));
195 CMenu* pPopup = menu.GetSubMenu(myPopupMenuNumber);
197 ASSERT(pPopup != NULL);
198 if (myPopupMenuNumber == 1) // more than 1 object.
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);
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,
217 void OCC_3dBaseDoc::Fit()
219 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
220 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
221 OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
225 int OCC_3dBaseDoc::OnFileImportBrep_WithInitDir(LPCTSTR InitialDir)
227 if(CImportExport::ReadBREP(myAISContext, InitialDir) == 1)
233 void OCC_3dBaseDoc::OnFileImportBrep()
235 if(CImportExport::ReadBREP(myAISContext) == 1)
241 void OCC_3dBaseDoc::OnFileExportBrep()
242 { CImportExport::SaveBREP(myAISContext);}
244 void OCC_3dBaseDoc::OnObjectColor()
246 Handle_AIS_InteractiveObject Current ;
248 Quantity_Color CSFColor ;
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.);
257 MSColor = RGB (255,255,255) ;
260 CColorDialog dlgColor(MSColor);
261 if (dlgColor.DoModal() == IDOK)
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());
270 void OCC_3dBaseDoc::OnUpdateObjectColor(CCmdUI* pCmdUI)
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);
280 void OCC_3dBaseDoc::OnObjectErase()
282 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
283 myAISContext->Erase(myAISContext->Current(),Standard_True);
284 myAISContext->ClearCurrents();
286 void OCC_3dBaseDoc::OnUpdateObjectErase(CCmdUI* pCmdUI)
288 bool OneOrMoreIsDisplayed = false;
289 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
290 if (myAISContext->IsDisplayed(myAISContext->Current())) OneOrMoreIsDisplayed=true;
291 pCmdUI->Enable (OneOrMoreIsDisplayed);
294 void OCC_3dBaseDoc::OnObjectWireframe()
296 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
297 myAISContext->SetDisplayMode(myAISContext->Current(),0);
299 void OCC_3dBaseDoc::OnUpdateObjectWireframe(CCmdUI* pCmdUI)
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);
307 void OCC_3dBaseDoc::OnObjectShading()
309 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
310 myAISContext->SetDisplayMode(myAISContext->Current(),1);
313 void OCC_3dBaseDoc::OnUpdateObjectShading(CCmdUI* pCmdUI)
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);
321 void OCC_3dBaseDoc::OnObjectMaterial()
323 CDialogMaterial DialBox(myAISContext);
325 //CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
326 //CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
327 //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
330 void OCC_3dBaseDoc::OnUpdateObjectMaterial(CCmdUI* pCmdUI)
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);
338 BOOL OCC_3dBaseDoc::OnObjectMaterialRange(UINT nID)
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;
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);
353 void OCC_3dBaseDoc::OnUpdateObjectMaterialRange(CCmdUI* pCmdUI)
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)
365 void OCC_3dBaseDoc::OnObjectTransparency()
367 CDialogTransparency DialBox(myAISContext);
369 //CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
370 //CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
371 //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
375 void OCC_3dBaseDoc::OnUpdateObjectTransparency(CCmdUI* pCmdUI)
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);
384 void OCC_3dBaseDoc::OnObjectDisplayall()
386 myAISContext->DisplayAll();
389 void OCC_3dBaseDoc::OnUpdateObjectDisplayall(CCmdUI* pCmdUI)
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;
400 pCmdUI->Enable (IS_ANY_OBJECT_ERASED);
404 void OCC_3dBaseDoc::OnObjectRemove()
406 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->InitCurrent())
407 myAISContext->Remove(myAISContext->Current(),Standard_True);
410 void OCC_3dBaseDoc::OnUpdateObjectRemove(CCmdUI* pCmdUI)
412 bool OneOrMoreIsDisplayed = false;
413 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
414 if (myAISContext->IsDisplayed(myAISContext->Current())) OneOrMoreIsDisplayed=true;
415 pCmdUI->Enable (OneOrMoreIsDisplayed);
418 void OCC_3dBaseDoc::SetMaterial(Graphic3d_NameOfMaterial Material)
420 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
421 myAISContext->SetMaterial (myAISContext->Current(),
422 (Graphic3d_NameOfMaterial)(Material));
425 void OCC_3dBaseDoc::OnObjectAddDimensions()
427 //Add dimentions dialog is opened here
428 myDimensionDlg.ShowWindow(SW_SHOW);
429 myDimensionDlg.UpdateStandardMode ();
432 void OCC_3dBaseDoc::OnUpdateObjectAddDimensions(CCmdUI* /*pCmdUI*/)
434 // Check if local context is opened
435 //pCmdUI->Enable (myAISContext->HasOpenedContext());