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_ListOfInteractive.hxx>
15 #include <AIS_ListIteratorOfListOfInteractive.hxx>
16 #include <TColStd_ListIteratorOfListOfInteger.hxx>
17 #include <TColStd_ListOfInteger.hxx>
18 #include <TopoDS_Shape.hxx>
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)
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)
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)
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)
58 //////////////////////////////////////////////////////////////////////
59 // Construction/Destruction
60 //////////////////////////////////////////////////////////////////////
62 OCC_3dBaseDoc::OCC_3dBaseDoc()
67 Handle(Graphic3d_GraphicDriver) aGraphicDriver = ((OCC_App*)AfxGetApp())->GetGraphicDriver();
69 myViewer = new V3d_Viewer (aGraphicDriver);
70 myViewer->SetDefaultLights();
71 myViewer->SetLightOn();
72 myAISContext = new AIS_InteractiveContext (myViewer);
74 myRayTracingIsOn = false;
75 myRaytracedShadowsIsOn = true;
76 myRaytracedReflectionsIsOn = false;
77 myRaytracedAntialiasingIsOn = false;
80 OCC_3dBaseDoc::~OCC_3dBaseDoc()
84 //-----------------------------------------------------------------------------------------
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)
92 // TheState == -1 button down
94 // TheState == 1 button up
96 static Standard_Integer aStartDragX = 0;
97 static Standard_Integer aStartDragY = 0;
103 aStartDragX = theMouseX;
104 aStartDragY = theMouseY;
109 myAISContext->UpdateCurrentViewer();
114 myAISContext->Select (aStartDragX, aStartDragY,
115 theMouseX, theMouseY,
116 theView, Standard_True);
122 //-----------------------------------------------------------------------------------------
124 //-----------------------------------------------------------------------------------------
125 void OCC_3dBaseDoc::InputEvent (const Standard_Integer theMouseX,
126 const Standard_Integer theMouseY,
127 const Handle(V3d_View)& theView)
129 myAISContext->MoveTo (theMouseX, theMouseY, theView, Standard_False);
130 myAISContext->Select (Standard_True);
133 //-----------------------------------------------------------------------------------------
135 //-----------------------------------------------------------------------------------------
136 void OCC_3dBaseDoc::MoveEvent (const Standard_Integer theMouseX,
137 const Standard_Integer theMouseY,
138 const Handle(V3d_View)& theView)
140 myAISContext->MoveTo (theMouseX, theMouseY, theView, Standard_True);
143 //-----------------------------------------------------------------------------------------
145 //-----------------------------------------------------------------------------------------
146 void OCC_3dBaseDoc::ShiftMoveEvent (const Standard_Integer theMouseX,
147 const Standard_Integer theMouseY,
148 const Handle(V3d_View)& theView)
150 myAISContext->MoveTo (theMouseX, theMouseY, theView, Standard_True);
153 //-----------------------------------------------------------------------------------------
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)
161 // TheState == -1 button down
162 // TheState == 0 move
163 // TheState == 1 button up
165 static Standard_Integer aStartDragX = 0;
166 static Standard_Integer aStartDragY = 0;
171 aStartDragX = theMouseX;
172 aStartDragY = theMouseY;
178 myAISContext->ShiftSelect (aStartDragX, aStartDragY,
179 theMouseX, theMouseY,
180 theView, Standard_True);
184 //-----------------------------------------------------------------------------------------
186 //-----------------------------------------------------------------------------------------
187 void OCC_3dBaseDoc::ShiftInputEvent (const Standard_Integer /*theMouseX*/,
188 const Standard_Integer /*theMouseY*/,
189 const Handle(V3d_View)& /*theView*/)
191 myAISContext->ShiftSelect (Standard_True);
194 //-----------------------------------------------------------------------------------------
196 //-----------------------------------------------------------------------------------------
197 void OCC_3dBaseDoc::Popup (const Standard_Integer theMouseX,
198 const Standard_Integer theMouseY,
199 const Handle(V3d_View)& theView)
201 // Base check which context menu to call
202 if (!myPopupMenuNumber)
204 myAISContext->InitSelected();
205 if (myAISContext->MoreSelected())
210 VERIFY(menu.LoadMenu(IDR_Popup3D));
211 CMenu* pPopup = menu.GetSubMenu(myPopupMenuNumber);
213 ASSERT(pPopup != NULL);
214 if (myPopupMenuNumber == 1) // more than 1 object.
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);
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,
233 void OCC_3dBaseDoc::Fit()
235 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
236 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
237 OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
241 int OCC_3dBaseDoc::OnFileImportBrep_WithInitDir (const wchar_t* )
243 if (CImportExport::ReadBREP (myAISContext) == 1)
249 void OCC_3dBaseDoc::OnFileImportBrep()
251 OnFileImportBrep_WithInitDir (NULL);
254 void OCC_3dBaseDoc::OnFileExportBrep()
255 { CImportExport::SaveBREP(myAISContext);}
257 void OCC_3dBaseDoc::OnObjectColor()
259 Handle(AIS_InteractiveObject) Current ;
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.);
270 MSColor = RGB (255,255,255) ;
273 CColorDialog dlgColor(MSColor);
274 if (dlgColor.DoModal() == IDOK)
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();
283 void OCC_3dBaseDoc::OnUpdateObjectColor(CCmdUI* pCmdUI)
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);
293 void OCC_3dBaseDoc::OnObjectErase()
295 myAISContext->EraseSelected (Standard_False);
296 myAISContext->ClearSelected (Standard_True);
298 void OCC_3dBaseDoc::OnUpdateObjectErase(CCmdUI* pCmdUI)
300 bool OneOrMoreIsDisplayed = false;
301 for (myAISContext->InitSelected(); myAISContext->MoreSelected(); myAISContext->NextSelected())
303 if (myAISContext->IsDisplayed (myAISContext->SelectedInteractive()))
304 OneOrMoreIsDisplayed = true;
306 pCmdUI->Enable (OneOrMoreIsDisplayed);
309 void OCC_3dBaseDoc::OnObjectWireframe()
311 for(myAISContext->InitSelected();myAISContext->MoreSelected();myAISContext->NextSelected())
312 myAISContext->SetDisplayMode (myAISContext->SelectedInteractive(), 0, Standard_False);
313 myAISContext->UpdateCurrentViewer();
315 void OCC_3dBaseDoc::OnUpdateObjectWireframe(CCmdUI* pCmdUI)
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);
323 void OCC_3dBaseDoc::OnObjectShading()
325 for(myAISContext->InitSelected();myAISContext->MoreSelected();myAISContext->NextSelected())
326 myAISContext->SetDisplayMode (myAISContext->SelectedInteractive(), 1, Standard_False);
327 myAISContext->UpdateCurrentViewer();
330 void OCC_3dBaseDoc::OnUpdateObjectShading(CCmdUI* pCmdUI)
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);
338 void OCC_3dBaseDoc::OnObjectMaterial()
340 CDialogMaterial DialBox(myAISContext);
342 //CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
343 //CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
344 //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
347 void OCC_3dBaseDoc::OnUpdateObjectMaterial(CCmdUI* pCmdUI)
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);
355 BOOL OCC_3dBaseDoc::OnObjectMaterialRange(UINT nID)
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;
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);
366 myAISContext->UpdateCurrentViewer();
371 void OCC_3dBaseDoc::OnUpdateObjectMaterialRange(CCmdUI* pCmdUI)
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)
383 void OCC_3dBaseDoc::OnObjectTransparency()
385 CDialogTransparency DialBox(myAISContext);
387 //CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
388 //CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
389 //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
393 void OCC_3dBaseDoc::OnUpdateObjectTransparency(CCmdUI* pCmdUI)
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);
402 void OCC_3dBaseDoc::OnObjectDisplayall()
404 myAISContext->DisplayAll (Standard_True);
407 void OCC_3dBaseDoc::OnUpdateObjectDisplayall(CCmdUI* pCmdUI)
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;
418 pCmdUI->Enable (IS_ANY_OBJECT_ERASED);
422 void OCC_3dBaseDoc::OnObjectRemove()
424 for(myAISContext->InitSelected();myAISContext->MoreSelected();myAISContext->InitSelected())
425 myAISContext->Remove(myAISContext->SelectedInteractive(),Standard_True);
428 void OCC_3dBaseDoc::OnUpdateObjectRemove(CCmdUI* pCmdUI)
430 bool OneOrMoreIsDisplayed = false;
431 for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
432 if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive())) OneOrMoreIsDisplayed=true;
433 pCmdUI->Enable (OneOrMoreIsDisplayed);
436 void OCC_3dBaseDoc::SetMaterial(Graphic3d_NameOfMaterial Material)
438 for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
439 myAISContext->SetMaterial (myAISContext->SelectedInteractive(),
440 (Graphic3d_NameOfMaterial)(Material), Standard_False);
441 myAISContext->UpdateCurrentViewer();
446 void OCC_3dBaseDoc::OnObjectRayTracing()
448 myRayTracingIsOn = !myRayTracingIsOn;
449 if(!myRayTracingIsOn)
451 myRaytracedShadowsIsOn = false;
452 myRaytracedReflectionsIsOn = false;
453 myRaytracedAntialiasingIsOn = false;
455 OnObjectRayTracingAction();
458 void OCC_3dBaseDoc::OnObjectShadows()
460 myRaytracedShadowsIsOn = !myRaytracedShadowsIsOn;
461 OnObjectRayTracingAction();
464 void OCC_3dBaseDoc::OnObjectReflections()
466 myRaytracedReflectionsIsOn = !myRaytracedReflectionsIsOn;
467 OnObjectRayTracingAction();
470 void OCC_3dBaseDoc::OnObjectAntiAliasing()
472 myRaytracedAntialiasingIsOn = !myRaytracedAntialiasingIsOn;
473 OnObjectRayTracingAction();
475 void OCC_3dBaseDoc::OnUpdateV3dButtons (CCmdUI* pCmdUI)
477 if (pCmdUI->m_nID == ID_OBJECT_RAY_TRACING)
479 pCmdUI->SetCheck(myRayTracingIsOn);
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);
490 // Common function to change raytracing params and redraw view
491 void OCC_3dBaseDoc::OnObjectRayTracingAction()
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;
499 aParams.Method = Graphic3d_RM_RASTERIZATION;
500 aParams.IsShadowEnabled = myRaytracedShadowsIsOn;
501 aParams.IsReflectionEnabled = myRaytracedReflectionsIsOn;
502 aParams.IsAntialiasingEnabled = myRaytracedAntialiasingIsOn;
503 myAISContext->UpdateCurrentViewer();