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)
43 ON_COMMAND_EX_RANGE(ID_OBJECT_MATERIAL_BRASS,ID_OBJECT_MATERIAL_DEFAULT, OnObjectMaterialRange)
44 ON_UPDATE_COMMAND_UI_RANGE(ID_OBJECT_MATERIAL_BRASS,ID_OBJECT_MATERIAL_DEFAULT, OnUpdateObjectMaterialRange)
47 ON_COMMAND(ID_OBJECT_RAY_TRACING,OnObjectRayTracing)
48 ON_COMMAND(ID_OBJECT_SHADOWS,OnObjectShadows)
49 ON_COMMAND(ID_OBJECT_REFLECTIONS,OnObjectReflections)
50 ON_COMMAND(ID_OBJECT_ANTI_ALIASING,OnObjectAntiAliasing)
52 ON_UPDATE_COMMAND_UI(ID_OBJECT_RAY_TRACING, OnUpdateV3dButtons)
53 ON_UPDATE_COMMAND_UI(ID_OBJECT_SHADOWS, OnUpdateV3dButtons)
54 ON_UPDATE_COMMAND_UI(ID_OBJECT_REFLECTIONS, OnUpdateV3dButtons)
55 ON_UPDATE_COMMAND_UI(ID_OBJECT_ANTI_ALIASING, OnUpdateV3dButtons)
59 //////////////////////////////////////////////////////////////////////
60 // Construction/Destruction
61 //////////////////////////////////////////////////////////////////////
63 OCC_3dBaseDoc::OCC_3dBaseDoc()
68 Handle(Graphic3d_GraphicDriver) aGraphicDriver = ((OCC_App*)AfxGetApp())->GetGraphicDriver();
70 myViewer = new V3d_Viewer (aGraphicDriver, Standard_ExtString("Visu3D") );
71 myViewer->SetDefaultLights();
72 myViewer->SetLightOn();
73 myAISContext = new AIS_InteractiveContext (myViewer);
75 myRayTracingIsOn = false;
76 myRaytracedShadowsIsOn = true;
77 myRaytracedReflectionsIsOn = false;
78 myRaytracedAntialiasingIsOn = false;
81 OCC_3dBaseDoc::~OCC_3dBaseDoc()
85 //-----------------------------------------------------------------------------------------
87 //-----------------------------------------------------------------------------------------
88 void OCC_3dBaseDoc::DragEvent (const Standard_Integer theMouseX,
89 const Standard_Integer theMouseY,
90 const Standard_Integer theState,
91 const Handle(V3d_View)& theView)
93 // TheState == -1 button down
95 // TheState == 1 button up
97 static Standard_Integer aStartDragX = 0;
98 static Standard_Integer aStartDragY = 0;
104 aStartDragX = theMouseX;
105 aStartDragY = theMouseY;
110 myAISContext->UpdateCurrentViewer();
115 myAISContext->Select (aStartDragX, aStartDragY,
116 theMouseX, theMouseY,
123 //-----------------------------------------------------------------------------------------
125 //-----------------------------------------------------------------------------------------
126 void OCC_3dBaseDoc::InputEvent (const Standard_Integer theMouseX,
127 const Standard_Integer theMouseY,
128 const Handle(V3d_View)& theView)
130 myAISContext->MoveTo (theMouseX, theMouseY, theView);
131 myAISContext->Select();
134 //-----------------------------------------------------------------------------------------
136 //-----------------------------------------------------------------------------------------
137 void OCC_3dBaseDoc::MoveEvent (const Standard_Integer theMouseX,
138 const Standard_Integer theMouseY,
139 const Handle(V3d_View)& theView)
141 myAISContext->MoveTo (theMouseX, theMouseY, theView);
144 //-----------------------------------------------------------------------------------------
146 //-----------------------------------------------------------------------------------------
147 void OCC_3dBaseDoc::ShiftMoveEvent (const Standard_Integer theMouseX,
148 const Standard_Integer theMouseY,
149 const Handle(V3d_View)& theView)
151 myAISContext->MoveTo (theMouseX, theMouseY, theView);
154 //-----------------------------------------------------------------------------------------
156 //-----------------------------------------------------------------------------------------
157 void OCC_3dBaseDoc::ShiftDragEvent (const Standard_Integer theMouseX,
158 const Standard_Integer theMouseY,
159 const Standard_Integer theState,
160 const Handle(V3d_View)& theView)
162 // TheState == -1 button down
163 // TheState == 0 move
164 // TheState == 1 button up
166 static Standard_Integer aStartDragX = 0;
167 static Standard_Integer aStartDragY = 0;
172 aStartDragX = theMouseX;
173 aStartDragY = theMouseY;
179 myAISContext->ShiftSelect (aStartDragX, aStartDragY,
180 theMouseX, theMouseY,
185 //-----------------------------------------------------------------------------------------
187 //-----------------------------------------------------------------------------------------
188 void OCC_3dBaseDoc::ShiftInputEvent (const Standard_Integer /*theMouseX*/,
189 const Standard_Integer /*theMouseY*/,
190 const Handle(V3d_View)& /*theView*/)
192 myAISContext->ShiftSelect();
195 //-----------------------------------------------------------------------------------------
197 //-----------------------------------------------------------------------------------------
198 void OCC_3dBaseDoc::Popup (const Standard_Integer theMouseX,
199 const Standard_Integer theMouseY,
200 const Handle(V3d_View)& theView)
202 // Base check which context menu to call
203 if (!myPopupMenuNumber)
205 myAISContext->InitCurrent();
206 if (myAISContext->MoreCurrent())
211 VERIFY(menu.LoadMenu(IDR_Popup3D));
212 CMenu* pPopup = menu.GetSubMenu(myPopupMenuNumber);
214 ASSERT(pPopup != NULL);
215 if (myPopupMenuNumber == 1) // more than 1 object.
217 bool OneOrMoreInShading = false;
218 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
219 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
220 if(!OneOrMoreInShading)
221 pPopup->EnableMenuItem(5, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
224 POINT winCoord = { theMouseX , theMouseY };
225 Handle(WNT_Window) aWNTWindow=
226 Handle(WNT_Window)::DownCast(theView->Window());
227 ClientToScreen ( (HWND)(aWNTWindow->HWindow()),&winCoord);
228 pPopup->TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON,
234 void OCC_3dBaseDoc::Fit()
236 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
237 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
238 OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
242 int OCC_3dBaseDoc::OnFileImportBrep_WithInitDir (const wchar_t* )
244 if (CImportExport::ReadBREP (myAISContext) == 1)
250 void OCC_3dBaseDoc::OnFileImportBrep()
252 OnFileImportBrep_WithInitDir (NULL);
255 void OCC_3dBaseDoc::OnFileExportBrep()
256 { CImportExport::SaveBREP(myAISContext);}
258 void OCC_3dBaseDoc::OnObjectColor()
260 Handle_AIS_InteractiveObject Current ;
262 Quantity_Color CSFColor ;
264 myAISContext->InitCurrent();
265 Current = myAISContext->Current();
266 if ( Current->HasColor () ) {
267 CSFColor = myAISContext->Color(myAISContext->Current());
268 MSColor = RGB (CSFColor.Red()*255.,CSFColor.Green()*255.,CSFColor.Blue()*255.);
271 MSColor = RGB (255,255,255) ;
274 CColorDialog dlgColor(MSColor);
275 if (dlgColor.DoModal() == IDOK)
277 MSColor = dlgColor.GetColor();
278 CSFColor = Quantity_Color (GetRValue(MSColor)/255.,GetGValue(MSColor)/255.,
279 GetBValue(MSColor)/255.,Quantity_TOC_RGB);
280 for (;myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
281 myAISContext->SetColor (myAISContext->Current(),CSFColor.Name());
284 void OCC_3dBaseDoc::OnUpdateObjectColor(CCmdUI* pCmdUI)
286 bool OneOrMoreIsShadingOrWireframe = false;
287 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
288 if (myAISContext->IsDisplayed(myAISContext->Current(),0)
289 ||myAISContext->IsDisplayed(myAISContext->Current(),1))
290 OneOrMoreIsShadingOrWireframe=true;
291 pCmdUI->Enable (OneOrMoreIsShadingOrWireframe);
294 void OCC_3dBaseDoc::OnObjectErase()
296 for (myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent())
298 myAISContext->Erase (myAISContext->Current(), Standard_True);
300 myAISContext->ClearCurrents();
302 void OCC_3dBaseDoc::OnUpdateObjectErase(CCmdUI* pCmdUI)
304 bool OneOrMoreIsDisplayed = false;
305 for (myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent())
307 if (myAISContext->IsDisplayed (myAISContext->Current()))
308 OneOrMoreIsDisplayed = true;
310 pCmdUI->Enable (OneOrMoreIsDisplayed);
313 void OCC_3dBaseDoc::OnObjectWireframe()
315 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
316 myAISContext->SetDisplayMode(myAISContext->Current(),0);
318 void OCC_3dBaseDoc::OnUpdateObjectWireframe(CCmdUI* pCmdUI)
320 bool OneOrMoreInShading = false;
321 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
322 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
323 pCmdUI->Enable (OneOrMoreInShading);
326 void OCC_3dBaseDoc::OnObjectShading()
328 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
329 myAISContext->SetDisplayMode(myAISContext->Current(),1);
332 void OCC_3dBaseDoc::OnUpdateObjectShading(CCmdUI* pCmdUI)
334 bool OneOrMoreInWireframe = false;
335 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
336 if (myAISContext->IsDisplayed(myAISContext->Current(),0)) OneOrMoreInWireframe=true;
337 pCmdUI->Enable (OneOrMoreInWireframe);
340 void OCC_3dBaseDoc::OnObjectMaterial()
342 CDialogMaterial DialBox(myAISContext);
344 //CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
345 //CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
346 //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
349 void OCC_3dBaseDoc::OnUpdateObjectMaterial(CCmdUI* pCmdUI)
351 bool OneOrMoreInShading = false;
352 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
353 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
354 pCmdUI->Enable (OneOrMoreInShading);
357 BOOL OCC_3dBaseDoc::OnObjectMaterialRange(UINT nID)
359 // the range ID_OBJECT_MATERIAL_BRASS to ID_OBJECT_MATERIAL_SILVER is
360 // continue with the same values as enumeration Type Of Material
361 Standard_Real aTransparency;
363 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ()){
364 aTransparency = myAISContext->Current()->Transparency();
365 myAISContext->SetMaterial (myAISContext->Current(),(Graphic3d_NameOfMaterial)(nID-ID_OBJECT_MATERIAL_BRASS));
366 myAISContext->SetTransparency (myAISContext->Current(),aTransparency);
372 void OCC_3dBaseDoc::OnUpdateObjectMaterialRange(CCmdUI* pCmdUI)
374 bool OneOrMoreInShading = false;
375 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
376 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
377 pCmdUI->Enable (OneOrMoreInShading);
378 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
379 if (myAISContext->Current()->Material() - (pCmdUI->m_nID - ID_OBJECT_MATERIAL_BRASS) == 0)
384 void OCC_3dBaseDoc::OnObjectTransparency()
386 CDialogTransparency DialBox(myAISContext);
388 //CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
389 //CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
390 //OCC_3dView *pView = (OCC_3dView *) pChild->GetActiveView();
394 void OCC_3dBaseDoc::OnUpdateObjectTransparency(CCmdUI* pCmdUI)
396 bool OneOrMoreInShading = false;
397 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
398 if (myAISContext->IsDisplayed(myAISContext->Current(),1)) OneOrMoreInShading=true;
399 pCmdUI->Enable (OneOrMoreInShading);
403 void OCC_3dBaseDoc::OnObjectDisplayall()
405 myAISContext->DisplayAll();
408 void OCC_3dBaseDoc::OnUpdateObjectDisplayall(CCmdUI* pCmdUI)
411 AIS_ListOfInteractive aList;
412 myAISContext->ObjectsInside(aList,AIS_KOI_Shape);
413 AIS_ListIteratorOfListOfInteractive aLI;
414 Standard_Boolean IS_ANY_OBJECT_ERASED=FALSE;
415 for (aLI.Initialize(aList);aLI.More();aLI.Next()){
416 if(!myAISContext->IsDisplayed(aLI.Value()))
417 IS_ANY_OBJECT_ERASED=TRUE;
419 pCmdUI->Enable (IS_ANY_OBJECT_ERASED);
423 void OCC_3dBaseDoc::OnObjectRemove()
425 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->InitCurrent())
426 myAISContext->Remove(myAISContext->Current(),Standard_True);
429 void OCC_3dBaseDoc::OnUpdateObjectRemove(CCmdUI* pCmdUI)
431 bool OneOrMoreIsDisplayed = false;
432 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
433 if (myAISContext->IsDisplayed(myAISContext->Current())) OneOrMoreIsDisplayed=true;
434 pCmdUI->Enable (OneOrMoreIsDisplayed);
437 void OCC_3dBaseDoc::SetMaterial(Graphic3d_NameOfMaterial Material)
439 for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
440 myAISContext->SetMaterial (myAISContext->Current(),
441 (Graphic3d_NameOfMaterial)(Material));
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();