1 // Created on: 1998-09-01
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1998-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <OpenGl_GlCore20.hxx>
19 #include <AIS_Animation.hxx>
20 #include <AIS_AnimationCamera.hxx>
21 #include <AIS_AnimationObject.hxx>
22 #include <AIS_ColorScale.hxx>
23 #include <AIS_Manipulator.hxx>
24 #include <AIS_RubberBand.hxx>
25 #include <AIS_Shape.hxx>
26 #include <AIS_InteractiveObject.hxx>
27 #include <AIS_ListOfInteractive.hxx>
28 #include <AIS_ListIteratorOfListOfInteractive.hxx>
30 #include <Draw_ProgressIndicator.hxx>
31 #include <Graphic3d_ArrayOfPolylines.hxx>
32 #include <Graphic3d_AspectMarker3d.hxx>
33 #include <Graphic3d_ExportFormat.hxx>
34 #include <Graphic3d_NameOfTextureEnv.hxx>
35 #include <Graphic3d_GraduatedTrihedron.hxx>
36 #include <Graphic3d_TextureEnv.hxx>
37 #include <Graphic3d_TextureParams.hxx>
38 #include <Graphic3d_TypeOfTextureFilter.hxx>
39 #include <Graphic3d_AspectFillArea3d.hxx>
40 #include <ViewerTest.hxx>
41 #include <ViewerTest_AutoUpdater.hxx>
42 #include <ViewerTest_EventManager.hxx>
43 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
44 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
45 #include <ViewerTest_CmdParser.hxx>
46 #include <V3d_AmbientLight.hxx>
47 #include <V3d_DirectionalLight.hxx>
48 #include <V3d_PositionalLight.hxx>
49 #include <V3d_SpotLight.hxx>
50 #include <Message_ProgressSentry.hxx>
51 #include <NCollection_DoubleMap.hxx>
52 #include <NCollection_List.hxx>
53 #include <NCollection_Vector.hxx>
54 #include <AIS_InteractiveContext.hxx>
55 #include <Draw_Interpretor.hxx>
57 #include <Draw_Appli.hxx>
58 #include <Image_AlienPixMap.hxx>
59 #include <Image_VideoRecorder.hxx>
60 #include <OpenGl_GraphicDriver.hxx>
61 #include <OSD_Timer.hxx>
62 #include <TColStd_HSequenceOfAsciiString.hxx>
63 #include <TColStd_SequenceOfInteger.hxx>
64 #include <TColStd_HSequenceOfReal.hxx>
65 #include <TColgp_Array1OfPnt2d.hxx>
66 #include <TColStd_MapOfAsciiString.hxx>
67 #include <Aspect_TypeOfLine.hxx>
68 #include <Image_Diff.hxx>
69 #include <Aspect_DisplayConnection.hxx>
73 #include <PrsMgr_PresentableObject.hxx>
74 #include <Graphic3d_ClipPlane.hxx>
75 #include <NCollection_DataMap.hxx>
76 #include <Graphic3d_Texture2Dmanual.hxx>
77 #include <Prs3d_ShadingAspect.hxx>
78 #include <Prs3d_Drawer.hxx>
79 #include <Prs3d_LineAspect.hxx>
80 #include <Prs3d_Root.hxx>
81 #include <Prs3d_Text.hxx>
82 #include <Select3D_SensitivePrimitiveArray.hxx>
91 #include <WNT_WClass.hxx>
92 #include <WNT_Window.hxx>
93 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
94 #include <Cocoa_Window.hxx>
96 #include <Xw_Window.hxx>
97 #include <X11/Xlib.h> /* contains some dangerous #defines such as Status, True etc. */
98 #include <X11/Xutil.h>
102 // Auxiliary definitions
103 static const char THE_KEY_DELETE = 127;
104 static const char THE_KEY_ESCAPE = 27;
106 //==============================================================================
107 // VIEWER GLOBAL VARIABLES
108 //==============================================================================
110 Standard_IMPORT Standard_Boolean Draw_VirtualWindows;
111 Standard_IMPORT Standard_Boolean Draw_Interprete (const char* theCommand);
113 Standard_EXPORT int ViewerMainLoop(Standard_Integer , const char** argv);
114 extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
116 extern int VErase (Draw_Interpretor& theDI,
117 Standard_Integer theArgNb,
118 const char** theArgVec);
121 static Handle(WNT_Window)& VT_GetWindow() {
122 static Handle(WNT_Window) WNTWin;
125 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
126 static Handle(Cocoa_Window)& VT_GetWindow()
128 static Handle(Cocoa_Window) aWindow;
131 extern void ViewerTest_SetCocoaEventManagerView (const Handle(Cocoa_Window)& theWindow);
132 extern void SetCocoaWindowTitle (const Handle(Cocoa_Window)& theWindow, Standard_CString theTitle);
133 extern void GetCocoaScreenResolution (Standard_Integer& theWidth, Standard_Integer& theHeight);
136 static Handle(Xw_Window)& VT_GetWindow(){
137 static Handle(Xw_Window) XWWin;
141 static void VProcessEvents(ClientData,int);
144 static Handle(Aspect_DisplayConnection)& GetDisplayConnection()
146 static Handle(Aspect_DisplayConnection) aDisplayConnection;
147 return aDisplayConnection;
150 static void SetDisplayConnection (const Handle(Aspect_DisplayConnection)& theDisplayConnection)
152 GetDisplayConnection() = theDisplayConnection;
155 #if defined(_WIN32) || (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
156 Aspect_Handle GetWindowHandle(const Handle(Aspect_Window)& theWindow)
158 Aspect_Handle aWindowHandle = (Aspect_Handle)NULL;
160 const Handle (WNT_Window) aWindow = Handle(WNT_Window)::DownCast (theWindow);
161 if (!aWindow.IsNull())
162 return aWindow->HWindow();
163 #elif (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
164 const Handle (Xw_Window) aWindow = Handle(Xw_Window)::DownCast (theWindow);
165 if (!aWindow.IsNull())
166 return aWindow->XWindow();
168 return aWindowHandle;
172 NCollection_DoubleMap <TCollection_AsciiString, Handle(V3d_View)> ViewerTest_myViews;
173 static NCollection_DoubleMap <TCollection_AsciiString, Handle(AIS_InteractiveContext)> ViewerTest_myContexts;
174 static NCollection_DoubleMap <TCollection_AsciiString, Handle(Graphic3d_GraphicDriver)> ViewerTest_myDrivers;
175 static OpenGl_Caps ViewerTest_myDefaultCaps;
177 static void OSWindowSetup();
181 Quantity_Color FlatColor;
182 Quantity_Color GradientColor1;
183 Quantity_Color GradientColor2;
184 Aspect_GradientFillMethod FillMethod;
185 } ViewerTest_DefaultBackground = { Quantity_NOC_BLACK, Quantity_NOC_BLACK, Quantity_NOC_BLACK, Aspect_GFM_NONE };
187 //==============================================================================
188 // EVENT GLOBAL VARIABLES
189 //==============================================================================
191 static int Start_Rot = 0;
192 Standard_Boolean HasHlrOnBeforeRotation = Standard_False;
193 int X_Motion = 0; // Current cursor position
195 int X_ButtonPress = 0; // Last ButtonPress position
196 int Y_ButtonPress = 0;
197 Standard_Boolean IsDragged = Standard_False;
198 Standard_Boolean DragFirst = Standard_False;
199 Standard_Boolean TheIsAnimating = Standard_False;
200 Standard_Boolean Draw_ToExitOnCloseView = Standard_False;
201 Standard_Boolean Draw_ToCloseViewOnEsc = Standard_False;
204 Standard_EXPORT const Handle(AIS_RubberBand)& GetRubberBand()
206 static Handle(AIS_RubberBand) aBand;
209 aBand = new AIS_RubberBand (Quantity_NOC_LIGHTBLUE, Aspect_TOL_SOLID, Quantity_NOC_LIGHTBLUE, 0.4, 1.0);
210 aBand->SetDisplayMode (0);
215 typedef NCollection_Map<AIS_Manipulator*> ViewerTest_MapOfAISManipulators;
217 Standard_EXPORT ViewerTest_MapOfAISManipulators& GetMapOfAISManipulators()
219 static ViewerTest_MapOfAISManipulators aMap;
223 Standard_EXPORT Handle(AIS_Manipulator) GetActiveAISManipulator()
225 ViewerTest_MapOfAISManipulators::Iterator anIt (GetMapOfAISManipulators());
226 for (; anIt.More(); anIt.Next())
228 if (anIt.Value()->HasActiveMode())
236 //==============================================================================
239 static LRESULT WINAPI ViewerWindowProc(
244 static LRESULT WINAPI AdvViewerWindowProc(
252 //==============================================================================
255 //==============================================================================
257 const Handle(Standard_Transient)& ViewerTest::WClass()
259 static Handle(Standard_Transient) theWClass;
261 if (theWClass.IsNull())
263 theWClass = new WNT_WClass ("GW3D_Class", (Standard_Address )AdvViewerWindowProc,
264 CS_VREDRAW | CS_HREDRAW, 0, 0,
265 ::LoadCursorW (NULL, IDC_ARROW));
271 //==============================================================================
272 //function : CreateName
273 //purpose : Create numerical name for new object in theMap
274 //==============================================================================
275 template <typename ObjectType>
276 TCollection_AsciiString CreateName (const NCollection_DoubleMap <TCollection_AsciiString, ObjectType>& theObjectMap,
277 const TCollection_AsciiString& theDefaultString)
279 if (theObjectMap.IsEmpty())
280 return theDefaultString + TCollection_AsciiString(1);
282 Standard_Integer aNextKey = 1;
283 Standard_Boolean isFound = Standard_False;
286 TCollection_AsciiString aStringKey = theDefaultString + TCollection_AsciiString(aNextKey);
287 // Look for objects with default names
288 if (theObjectMap.IsBound1(aStringKey))
293 isFound = Standard_True;
296 return theDefaultString + TCollection_AsciiString(aNextKey);
299 //==============================================================================
300 //structure : ViewerTest_Names
301 //purpose : Allow to operate with full view name: driverName/viewerName/viewName
302 //==============================================================================
303 struct ViewerTest_Names
306 TCollection_AsciiString myDriverName;
307 TCollection_AsciiString myViewerName;
308 TCollection_AsciiString myViewName;
312 const TCollection_AsciiString& GetDriverName () const
316 void SetDriverName (const TCollection_AsciiString& theDriverName)
318 myDriverName = theDriverName;
320 const TCollection_AsciiString& GetViewerName () const
324 void SetViewerName (const TCollection_AsciiString& theViewerName)
326 myViewerName = theViewerName;
328 const TCollection_AsciiString& GetViewName () const
332 void SetViewName (const TCollection_AsciiString& theViewName)
334 myViewName = theViewName;
337 //===========================================================================
338 //function : Constructor for ViewerTest_Names
339 //purpose : Get view, viewer, driver names from custom string
340 //===========================================================================
342 ViewerTest_Names (const TCollection_AsciiString& theInputString)
344 TCollection_AsciiString aName(theInputString);
345 if (theInputString.IsEmpty())
347 // Get current configuration
348 if (ViewerTest_myDrivers.IsEmpty())
349 myDriverName = CreateName<Handle(Graphic3d_GraphicDriver)>
350 (ViewerTest_myDrivers, TCollection_AsciiString("Driver"));
352 myDriverName = ViewerTest_myDrivers.Find2
353 (ViewerTest::GetAISContext()->CurrentViewer()->Driver());
355 if(ViewerTest_myContexts.IsEmpty())
357 myViewerName = CreateName <Handle(AIS_InteractiveContext)>
358 (ViewerTest_myContexts, TCollection_AsciiString (myDriverName + "/Viewer"));
362 myViewerName = ViewerTest_myContexts.Find2 (ViewerTest::GetAISContext());
365 myViewName = CreateName <Handle(V3d_View)> (ViewerTest_myViews, TCollection_AsciiString(myViewerName + "/View"));
369 // There is at least view name
370 Standard_Integer aParserNumber = 0;
371 for (Standard_Integer i = 0; i < 3; ++i)
373 Standard_Integer aParserPos = aName.SearchFromEnd("/");
377 aName.Split(aParserPos-1);
382 if (aParserNumber == 0)
385 if (!ViewerTest::GetAISContext().IsNull())
387 myDriverName = ViewerTest_myDrivers.Find2
388 (ViewerTest::GetAISContext()->CurrentViewer()->Driver());
389 myViewerName = ViewerTest_myContexts.Find2
390 (ViewerTest::GetAISContext());
394 // There is no opened contexts here, need to create names for viewer and driver
395 myDriverName = CreateName<Handle(Graphic3d_GraphicDriver)>
396 (ViewerTest_myDrivers, TCollection_AsciiString("Driver"));
398 myViewerName = CreateName <Handle(AIS_InteractiveContext)>
399 (ViewerTest_myContexts, TCollection_AsciiString (myDriverName + "/Viewer"));
401 myViewName = TCollection_AsciiString(myViewerName + "/" + theInputString);
403 else if (aParserNumber == 1)
405 // Here is viewerName/viewName
406 if (!ViewerTest::GetAISContext().IsNull())
407 myDriverName = ViewerTest_myDrivers.Find2
408 (ViewerTest::GetAISContext()->CurrentViewer()->Driver());
411 // There is no opened contexts here, need to create name for driver
412 myDriverName = CreateName<Handle(Graphic3d_GraphicDriver)>
413 (ViewerTest_myDrivers, TCollection_AsciiString("Driver"));
415 myViewerName = TCollection_AsciiString(myDriverName + "/" + aName);
417 myViewName = TCollection_AsciiString(myDriverName + "/" + theInputString);
421 //Here is driverName/viewerName/viewName
422 myDriverName = TCollection_AsciiString(aName);
424 TCollection_AsciiString aViewerName(theInputString);
425 aViewerName.Split(aViewerName.SearchFromEnd("/") - 1);
426 myViewerName = TCollection_AsciiString(aViewerName);
428 myViewName = TCollection_AsciiString(theInputString);
434 //==============================================================================
435 //function : FindContextByView
436 //purpose : Find AIS_InteractiveContext by View
437 //==============================================================================
439 Handle(AIS_InteractiveContext) FindContextByView (const Handle(V3d_View)& theView)
441 Handle(AIS_InteractiveContext) anAISContext;
443 for (NCollection_DoubleMap<TCollection_AsciiString, Handle(AIS_InteractiveContext)>::Iterator
444 anIter (ViewerTest_myContexts); anIter.More(); anIter.Next())
446 if (anIter.Value()->CurrentViewer() == theView->Viewer())
447 return anIter.Key2();
453 //==============================================================================
454 //function : SetWindowTitle
455 //purpose : Set window title
456 //==============================================================================
458 void SetWindowTitle (const Handle(Aspect_Window)& theWindow,
459 Standard_CString theTitle)
462 const TCollection_ExtendedString theTitleW (theTitle);
463 SetWindowTextW ((HWND )Handle(WNT_Window)::DownCast(theWindow)->HWindow(), theTitleW.ToWideString());
464 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
465 SetCocoaWindowTitle (Handle(Cocoa_Window)::DownCast(theWindow), theTitle);
467 if(GetDisplayConnection()->GetDisplay())
470 Handle(Xw_Window)::DownCast(theWindow)->XWindow();
471 XStoreName (GetDisplayConnection()->GetDisplay(), aWindow , theTitle);
476 //==============================================================================
477 //function : IsWindowOverlapped
478 //purpose : Check if theWindow overlapp another view
479 //==============================================================================
481 Standard_Boolean IsWindowOverlapped (const Standard_Integer thePxLeft,
482 const Standard_Integer thePxTop,
483 const Standard_Integer thePxRight,
484 const Standard_Integer thePxBottom,
485 TCollection_AsciiString& theViewId)
487 for(NCollection_DoubleMap <TCollection_AsciiString, Handle(V3d_View)>::Iterator
488 anIter(ViewerTest_myViews); anIter.More(); anIter.Next())
490 Standard_Integer aTop = 0,
494 anIter.Value()->Window()->Position(aLeft, aTop, aRight, aBottom);
495 if ((thePxLeft >= aLeft && thePxLeft <= aRight && thePxTop >= aTop && thePxTop <= aBottom) ||
496 (thePxLeft >= aLeft && thePxLeft <= aRight && thePxBottom >= aTop && thePxBottom <= aBottom) ||
497 (thePxRight >= aLeft && thePxRight <= aRight && thePxTop >= aTop && thePxTop <= aBottom) ||
498 (thePxRight >= aLeft && thePxRight <= aRight && thePxBottom >= aTop && thePxBottom <= aBottom))
500 theViewId = anIter.Key1();
501 return Standard_True;
504 return Standard_False;
507 // Workaround: to create and delete non-orthographic views outside ViewerTest
508 void ViewerTest::RemoveViewName (const TCollection_AsciiString& theName)
510 ViewerTest_myViews.UnBind1 (theName);
513 void ViewerTest::InitViewName (const TCollection_AsciiString& theName,
514 const Handle(V3d_View)& theView)
516 ViewerTest_myViews.Bind (theName, theView);
519 TCollection_AsciiString ViewerTest::GetCurrentViewName ()
521 return ViewerTest_myViews.Find2( ViewerTest::CurrentView());
523 //==============================================================================
524 //function : ViewerInit
525 //purpose : Create the window viewer and initialize all the global variable
526 //==============================================================================
528 TCollection_AsciiString ViewerTest::ViewerInit (const Standard_Integer thePxLeft,
529 const Standard_Integer thePxTop,
530 const Standard_Integer thePxWidth,
531 const Standard_Integer thePxHeight,
532 Standard_CString theViewName,
533 Standard_CString theDisplayName)
535 // Default position and dimension of the viewer window.
536 // Note that left top corner is set to be sufficiently small to have
537 // window fit in the small screens (actual for remote desktops, see #23003).
538 // The position corresponds to the window's client area, thus some
539 // gap is added for window frame to be visible.
540 Standard_Integer aPxLeft = 20;
541 Standard_Integer aPxTop = 40;
542 Standard_Integer aPxWidth = 409;
543 Standard_Integer aPxHeight = 409;
544 Standard_Boolean toCreateViewer = Standard_False;
546 Handle(OpenGl_GraphicDriver) aGraphicDriver;
547 ViewerTest_Names aViewNames(theViewName);
548 if (ViewerTest_myViews.IsBound1 (aViewNames.GetViewName ()))
549 aViewNames.SetViewName (aViewNames.GetViewerName() + "/" + CreateName<Handle(V3d_View)>(ViewerTest_myViews, "View"));
556 aPxWidth = thePxWidth;
557 if (thePxHeight != 0)
558 aPxHeight = thePxHeight;
560 // Get graphic driver (create it or get from another view)
561 if (!ViewerTest_myDrivers.IsBound1 (aViewNames.GetDriverName()))
563 // Get connection string
564 #if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
565 TCollection_AsciiString aDisplayName(theDisplayName);
566 if (!aDisplayName.IsEmpty())
567 SetDisplayConnection (new Aspect_DisplayConnection ());
569 SetDisplayConnection (new Aspect_DisplayConnection (aDisplayName));
571 (void)theDisplayName; // avoid warning on unused argument
572 SetDisplayConnection (new Aspect_DisplayConnection ());
575 if (Draw_VirtualWindows)
577 // don't waste the time waiting for VSync when window is not displayed on the screen
578 ViewerTest_myDefaultCaps.swapInterval = 0;
579 // alternatively we can disable buffer swap at all, but this might be inappropriate for testing
580 //ViewerTest_myDefaultCaps.buffersNoSwap = true;
582 aGraphicDriver = new OpenGl_GraphicDriver (GetDisplayConnection());
583 aGraphicDriver->ChangeOptions() = ViewerTest_myDefaultCaps;
585 ViewerTest_myDrivers.Bind (aViewNames.GetDriverName(), aGraphicDriver);
586 toCreateViewer = Standard_True;
590 aGraphicDriver = Handle(OpenGl_GraphicDriver)::DownCast (ViewerTest_myDrivers.Find1 (aViewNames.GetDriverName()));
593 //Dispose the window if input parameters are default
594 if (!ViewerTest_myViews.IsEmpty() && thePxLeft == 0 && thePxTop == 0)
596 Standard_Integer aTop = 0,
603 // Get screen resolution
604 #if defined(_WIN32) || defined(__WIN32__)
606 GetClientRect(GetDesktopWindow(), &aWindowSize);
607 aScreenHeight = aWindowSize.bottom;
608 aScreenWidth = aWindowSize.right;
609 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
610 GetCocoaScreenResolution (aScreenWidth, aScreenHeight);
612 Screen *aScreen = DefaultScreenOfDisplay(GetDisplayConnection()->GetDisplay());
613 aScreenWidth = WidthOfScreen(aScreen);
614 aScreenHeight = HeightOfScreen(aScreen);
617 TCollection_AsciiString anOverlappedViewId("");
619 while (IsWindowOverlapped (aPxLeft, aPxTop, aPxLeft + aPxWidth, aPxTop + aPxHeight, anOverlappedViewId))
621 ViewerTest_myViews.Find1(anOverlappedViewId)->Window()->Position (aLeft, aTop, aRight, aBottom);
623 if (IsWindowOverlapped (aRight + 20, aPxTop, aRight + 20 + aPxWidth, aPxTop + aPxHeight, anOverlappedViewId)
624 && aRight + 2*aPxWidth + 40 > aScreenWidth)
626 if (aBottom + aPxHeight + 40 > aScreenHeight)
633 aPxTop = aBottom + 40;
636 aPxLeft = aRight + 20;
641 TCollection_AsciiString aTitle("3D View - ");
642 aTitle = aTitle + aViewNames.GetViewName() + "(*)";
644 // Change name of current active window
645 if (!ViewerTest::CurrentView().IsNull())
647 TCollection_AsciiString anActiveWindowTitle("3D View - ");
648 anActiveWindowTitle = anActiveWindowTitle
649 + ViewerTest_myViews.Find2 (ViewerTest::CurrentView());
650 SetWindowTitle (ViewerTest::CurrentView()->Window(), anActiveWindowTitle.ToCString());
654 Handle(V3d_Viewer) a3DViewer;
655 // If it's the single view, we first look for empty context
656 if (ViewerTest_myViews.IsEmpty() && !ViewerTest_myContexts.IsEmpty())
658 NCollection_DoubleMap <TCollection_AsciiString, Handle(AIS_InteractiveContext)>::Iterator
659 anIter(ViewerTest_myContexts);
661 ViewerTest::SetAISContext (anIter.Value());
662 a3DViewer = ViewerTest::GetAISContext()->CurrentViewer();
664 else if (ViewerTest_myContexts.IsBound1(aViewNames.GetViewerName()))
666 ViewerTest::SetAISContext(ViewerTest_myContexts.Find1(aViewNames.GetViewerName()));
667 a3DViewer = ViewerTest::GetAISContext()->CurrentViewer();
669 else if (a3DViewer.IsNull())
671 toCreateViewer = Standard_True;
672 a3DViewer = new V3d_Viewer(aGraphicDriver);
673 a3DViewer->SetDefaultBackgroundColor (ViewerTest_DefaultBackground.FlatColor);
674 a3DViewer->SetDefaultBgGradientColors (ViewerTest_DefaultBackground.GradientColor1,
675 ViewerTest_DefaultBackground.GradientColor2,
676 ViewerTest_DefaultBackground.FillMethod);
680 if (ViewerTest::GetAISContext().IsNull() ||
681 !(ViewerTest_myContexts.IsBound1(aViewNames.GetViewerName())))
683 Handle(AIS_InteractiveContext) aContext = new AIS_InteractiveContext (a3DViewer);
684 ViewerTest::SetAISContext (aContext);
685 ViewerTest_myContexts.Bind (aViewNames.GetViewerName(), ViewerTest::GetAISContext());
689 ViewerTest::ResetEventManager();
694 VT_GetWindow() = new WNT_Window (aTitle.ToCString(),
695 Handle(WNT_WClass)::DownCast (WClass()),
696 Draw_VirtualWindows ? WS_POPUP : WS_OVERLAPPEDWINDOW,
700 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
701 VT_GetWindow() = new Cocoa_Window (aTitle.ToCString(),
703 aPxWidth, aPxHeight);
704 ViewerTest_SetCocoaEventManagerView (VT_GetWindow());
706 VT_GetWindow() = new Xw_Window (aGraphicDriver->GetDisplayConnection(),
709 aPxWidth, aPxHeight);
711 VT_GetWindow()->SetVirtual (Draw_VirtualWindows);
714 Handle(V3d_View) aView = a3DViewer->CreateView();
715 aView->SetWindow (VT_GetWindow());
716 ViewerTest::GetAISContext()->RedrawImmediate (a3DViewer);
718 ViewerTest::CurrentView(aView);
719 ViewerTest_myViews.Bind (aViewNames.GetViewName(), aView);
721 // Setup for X11 or NT
724 // Set parameters for V3d_View and V3d_Viewer
725 const Handle (V3d_View) aV3dView = ViewerTest::CurrentView();
726 aV3dView->SetComputedMode(Standard_False);
728 a3DViewer->SetDefaultBackgroundColor(Quantity_NOC_BLACK);
731 a3DViewer->SetDefaultLights();
732 a3DViewer->SetLightOn();
735 #if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
736 #if TCL_MAJOR_VERSION < 8
737 Tk_CreateFileHandler((void*)XConnectionNumber(GetDisplayConnection()->GetDisplay()),
738 TK_READABLE, VProcessEvents, (ClientData) VT_GetWindow()->XWindow() );
740 Tk_CreateFileHandler(XConnectionNumber(GetDisplayConnection()->GetDisplay()),
741 TK_READABLE, VProcessEvents, (ClientData) VT_GetWindow()->XWindow() );
745 VT_GetWindow()->Map();
747 // Set the handle of created view in the event manager
748 ViewerTest::ResetEventManager();
750 ViewerTest::CurrentView()->Redraw();
755 return aViewNames.GetViewName();
758 //==============================================================================
759 //function : RedrawAllViews
760 //purpose : Redraw all created views
761 //==============================================================================
762 void ViewerTest::RedrawAllViews()
764 NCollection_DoubleMap<TCollection_AsciiString, Handle(V3d_View)>::Iterator aViewIt(ViewerTest_myViews);
765 for (; aViewIt.More(); aViewIt.Next())
767 const Handle(V3d_View)& aView = aViewIt.Key2();
772 //==============================================================================
774 //purpose : Create the window viewer and initialize all the global variable
775 // Use Tk_CreateFileHandler on UNIX to catch the X11 Viewer event
776 //==============================================================================
778 static int VInit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgVec)
780 TCollection_AsciiString aViewName, aDisplayName;
781 Standard_Integer aPxLeft = 0, aPxTop = 0, aPxWidth = 0, aPxHeight = 0;
782 TCollection_AsciiString aName, aValue;
783 for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
785 const TCollection_AsciiString anArg = theArgVec[anArgIt];
786 TCollection_AsciiString anArgCase = anArg;
787 anArgCase.LowerCase();
788 if (anArgIt + 1 < theArgsNb
789 && anArgCase == "-name")
791 aViewName = theArgVec[++anArgIt];
793 else if (anArgIt + 1 < theArgsNb
794 && (anArgCase == "-left"
795 || anArgCase == "-l"))
797 aPxLeft = Draw::Atoi (theArgVec[++anArgIt]);
799 else if (anArgIt + 1 < theArgsNb
800 && (anArgCase == "-top"
801 || anArgCase == "-t"))
803 aPxTop = Draw::Atoi (theArgVec[++anArgIt]);
805 else if (anArgIt + 1 < theArgsNb
806 && (anArgCase == "-width"
807 || anArgCase == "-w"))
809 aPxWidth = Draw::Atoi (theArgVec[++anArgIt]);
811 else if (anArgIt + 1 < theArgsNb
812 && (anArgCase == "-height"
813 || anArgCase == "-h"))
815 aPxHeight = Draw::Atoi (theArgVec[++anArgIt]);
817 else if (anArgCase == "-exitonclose")
819 Draw_ToExitOnCloseView = true;
820 if (anArgIt + 1 < theArgsNb
821 && ViewerTest::ParseOnOff (theArgVec[anArgIt + 1], Draw_ToExitOnCloseView))
826 else if (anArgCase == "-closeonescape"
827 || anArgCase == "-closeonesc")
829 Draw_ToCloseViewOnEsc = true;
830 if (anArgIt + 1 < theArgsNb
831 && ViewerTest::ParseOnOff (theArgVec[anArgIt + 1], Draw_ToCloseViewOnEsc))
836 else if (anArgIt + 1 < theArgsNb
837 && (anArgCase == "-disp"
838 || anArgCase == "-display"))
840 aDisplayName = theArgVec[++anArgIt];
843 else if (ViewerTest::SplitParameter (anArg, aName, aValue))
850 else if (aName == "l"
853 aPxLeft = aValue.IntegerValue();
855 else if (aName == "t"
858 aPxTop = aValue.IntegerValue();
860 else if (aName == "disp"
861 || aName == "display")
863 aDisplayName = aValue;
865 else if (aName == "w"
868 aPxWidth = aValue.IntegerValue();
870 else if (aName == "h"
871 || aName == "height")
873 aPxHeight = aValue.IntegerValue();
877 std::cout << "Syntax error: unknown argument " << anArg << ".\n";
881 else if (aViewName.IsEmpty())
887 std::cout << "Syntax error: unknown argument " << anArg << ".\n";
892 #if defined(_WIN32) || (defined(__APPLE__) && !defined(MACOSX_USE_GLX))
893 if (!aDisplayName.IsEmpty())
895 aDisplayName.Clear();
896 std::cout << "Warning: display parameter will be ignored.\n";
900 ViewerTest_Names aViewNames (aViewName);
901 if (ViewerTest_myViews.IsBound1 (aViewNames.GetViewName()))
903 TCollection_AsciiString aCommand = TCollection_AsciiString ("vactivate ") + aViewNames.GetViewName();
904 theDi.Eval (aCommand.ToCString());
908 TCollection_AsciiString aViewId = ViewerTest::ViewerInit (aPxLeft, aPxTop, aPxWidth, aPxHeight,
909 aViewName.ToCString(),
910 aDisplayName.ToCString());
915 //! Parse HLR algo type.
916 static Standard_Boolean parseHlrAlgoType (const char* theName,
917 Prs3d_TypeOfHLR& theType)
919 TCollection_AsciiString aName (theName);
921 if (aName == "polyalgo")
923 theType = Prs3d_TOH_PolyAlgo;
925 else if (aName == "algo")
927 theType = Prs3d_TOH_Algo;
931 return Standard_False;
933 return Standard_True;
936 //==============================================================================
938 //purpose : hidden lines removal algorithm
939 //==============================================================================
941 static int VHLR (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
943 const Handle(V3d_View) aView = ViewerTest::CurrentView();
944 const Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
947 std::cerr << "Error: No opened viewer!\n";
951 Standard_Boolean hasHlrOnArg = Standard_False;
952 Standard_Boolean hasShowHiddenArg = Standard_False;
953 Standard_Boolean isHLROn = Standard_False;
954 Standard_Boolean toShowHidden = aCtx->DefaultDrawer()->DrawHiddenLine();
955 Prs3d_TypeOfHLR aTypeOfHLR = Prs3d_TOH_NotSet;
956 ViewerTest_AutoUpdater anUpdateTool (Handle(AIS_InteractiveContext)(), aView);
957 for (Standard_Integer anArgIter = 1; anArgIter < argc; ++anArgIter)
959 TCollection_AsciiString anArg (argv[anArgIter]);
961 if (anUpdateTool.parseRedrawMode (anArg))
965 else if (anArg == "-showhidden"
966 && anArgIter + 1 < argc
967 && ViewerTest::ParseOnOff (argv[anArgIter + 1], toShowHidden))
970 hasShowHiddenArg = Standard_True;
973 else if ((anArg == "-type"
975 || anArg == "-algotype")
976 && anArgIter + 1 < argc
977 && parseHlrAlgoType (argv[anArgIter + 1], aTypeOfHLR))
982 else if (!hasHlrOnArg
983 && ViewerTest::ParseOnOff (argv[anArgIter], isHLROn))
985 hasHlrOnArg = Standard_True;
989 else if (!hasShowHiddenArg
990 && ViewerTest::ParseOnOff(argv[anArgIter], toShowHidden))
992 hasShowHiddenArg = Standard_True;
997 std::cout << "Syntax error at '" << argv[anArgIter] << "'\n";
1003 di << "HLR: " << aView->ComputedMode() << "\n";
1004 di << "HiddenLine: " << aCtx->DefaultDrawer()->DrawHiddenLine() << "\n";
1006 switch (aCtx->DefaultDrawer()->TypeOfHLR())
1008 case Prs3d_TOH_NotSet: di << "NotSet\n"; break;
1009 case Prs3d_TOH_PolyAlgo: di << "PolyAlgo\n"; break;
1010 case Prs3d_TOH_Algo: di << "Algo\n"; break;
1012 anUpdateTool.Invalidate();
1016 Standard_Boolean toRecompute = Standard_False;
1017 if (aTypeOfHLR != Prs3d_TOH_NotSet
1018 && aTypeOfHLR != aCtx->DefaultDrawer()->TypeOfHLR())
1020 toRecompute = Standard_True;
1021 aCtx->DefaultDrawer()->SetTypeOfHLR (aTypeOfHLR);
1023 if (toShowHidden != aCtx->DefaultDrawer()->DrawHiddenLine())
1025 toRecompute = Standard_True;
1028 aCtx->DefaultDrawer()->EnableDrawHiddenLine();
1032 aCtx->DefaultDrawer()->DisableDrawHiddenLine();
1037 if (aView->ComputedMode() && isHLROn && toRecompute)
1039 AIS_ListOfInteractive aListOfShapes;
1040 aCtx->DisplayedObjects (aListOfShapes);
1041 for (AIS_ListIteratorOfListOfInteractive anIter (aListOfShapes); anIter.More(); anIter.Next())
1043 if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anIter.Value()))
1045 aCtx->Redisplay (aShape, Standard_False);
1050 aView->SetComputedMode (isHLROn);
1054 //==============================================================================
1055 //function : VHLRType
1056 //purpose : change type of using HLR algorithm
1057 //==============================================================================
1059 static int VHLRType (Draw_Interpretor& , Standard_Integer argc, const char** argv)
1061 const Handle(V3d_View) aView = ViewerTest::CurrentView();
1062 const Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
1065 std::cerr << "Error: No opened viewer!\n";
1069 Prs3d_TypeOfHLR aTypeOfHLR = Prs3d_TOH_NotSet;
1070 ViewerTest_AutoUpdater anUpdateTool (Handle(AIS_InteractiveContext)(), aView);
1071 AIS_ListOfInteractive aListOfShapes;
1072 for (Standard_Integer anArgIter = 1; anArgIter < argc; ++anArgIter)
1074 TCollection_AsciiString anArg (argv[anArgIter]);
1076 if (anUpdateTool.parseRedrawMode (anArg))
1080 else if ((anArg == "-type"
1082 || anArg == "-algotype")
1083 && anArgIter + 1 < argc
1084 && parseHlrAlgoType (argv[anArgIter + 1], aTypeOfHLR))
1090 else if (aTypeOfHLR == Prs3d_TOH_NotSet
1091 && parseHlrAlgoType (argv[anArgIter], aTypeOfHLR))
1097 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
1098 TCollection_AsciiString aName (argv[anArgIter]);
1099 if (!aMap.IsBound2 (aName))
1101 std::cout << "Syntax error: Wrong shape name '" << aName << "'.\n";
1105 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (aMap.Find2 (aName));
1106 if (aShape.IsNull())
1108 std::cout << "Syntax error: '" << aName << "' is not a shape presentation.\n";
1111 aListOfShapes.Append (aShape);
1115 if (aTypeOfHLR == Prs3d_TOH_NotSet)
1117 std::cout << "Syntax error: wrong number of arguments!\n";
1121 const Standard_Boolean isGlobal = aListOfShapes.IsEmpty();
1124 aCtx->DisplayedObjects (aListOfShapes);
1125 aCtx->DefaultDrawer()->SetTypeOfHLR (aTypeOfHLR);
1128 for (AIS_ListIteratorOfListOfInteractive anIter(aListOfShapes); anIter.More(); anIter.Next())
1130 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anIter.Value());
1131 if (aShape.IsNull())
1136 const bool toUpdateShape = aShape->TypeOfHLR() != aTypeOfHLR
1137 && aView->ComputedMode();
1139 || aShape->TypeOfHLR() != aTypeOfHLR)
1141 aShape->SetTypeOfHLR (aTypeOfHLR);
1145 aCtx->Redisplay (aShape, Standard_False);
1151 //==============================================================================
1152 //function : FindViewIdByWindowHandle
1153 //purpose : Find theView Id in the map of views by window handle
1154 //==============================================================================
1155 #if defined(_WIN32) || defined(__WIN32__) || (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
1156 TCollection_AsciiString FindViewIdByWindowHandle(const Aspect_Handle theWindowHandle)
1158 for (NCollection_DoubleMap<TCollection_AsciiString, Handle(V3d_View)>::Iterator
1159 anIter(ViewerTest_myViews); anIter.More(); anIter.Next())
1161 Aspect_Handle aWindowHandle = GetWindowHandle(anIter.Value()->Window());
1162 if (aWindowHandle == theWindowHandle)
1163 return anIter.Key1();
1165 return TCollection_AsciiString("");
1169 //==============================================================================
1170 //function : ActivateView
1171 //purpose : Make the view active
1172 //==============================================================================
1174 void ActivateView (const TCollection_AsciiString& theViewName)
1176 const Handle(V3d_View) aView = ViewerTest_myViews.Find1(theViewName);
1177 if (!aView.IsNull())
1179 Handle(AIS_InteractiveContext) anAISContext = FindContextByView(aView);
1180 if (!anAISContext.IsNull())
1182 if (!ViewerTest::CurrentView().IsNull())
1184 TCollection_AsciiString aTitle("3D View - ");
1185 aTitle = aTitle + ViewerTest_myViews.Find2 (ViewerTest::CurrentView());
1186 SetWindowTitle (ViewerTest::CurrentView()->Window(), aTitle.ToCString());
1189 ViewerTest::CurrentView (aView);
1190 ViewerTest::SetAISContext (anAISContext);
1191 TCollection_AsciiString aTitle = TCollection_AsciiString("3D View - ") + theViewName + "(*)";
1192 SetWindowTitle (ViewerTest::CurrentView()->Window(), aTitle.ToCString());
1194 VT_GetWindow() = Handle(WNT_Window)::DownCast(ViewerTest::CurrentView()->Window());
1195 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
1196 VT_GetWindow() = Handle(Cocoa_Window)::DownCast(ViewerTest::CurrentView()->Window());
1198 VT_GetWindow() = Handle(Xw_Window)::DownCast(ViewerTest::CurrentView()->Window());
1200 SetDisplayConnection(ViewerTest::CurrentView()->Viewer()->Driver()->GetDisplayConnection());
1201 ViewerTest::CurrentView()->Redraw();
1206 //==============================================================================
1207 //function : RemoveView
1209 //==============================================================================
1210 void ViewerTest::RemoveView (const Handle(V3d_View)& theView,
1211 const Standard_Boolean theToRemoveContext)
1213 if (!ViewerTest_myViews.IsBound2 (theView))
1218 const TCollection_AsciiString aViewName = ViewerTest_myViews.Find2 (theView);
1219 RemoveView (aViewName, theToRemoveContext);
1222 //==============================================================================
1223 //function : RemoveView
1224 //purpose : Close and remove view from display, clear maps if neccessary
1225 //==============================================================================
1226 void ViewerTest::RemoveView (const TCollection_AsciiString& theViewName, const Standard_Boolean isContextRemoved)
1228 if (!ViewerTest_myViews.IsBound1(theViewName))
1230 cout << "Wrong view name\n";
1234 // Activate another view if it's active now
1235 if (ViewerTest_myViews.Find1(theViewName) == ViewerTest::CurrentView())
1237 if (ViewerTest_myViews.Extent() > 1)
1239 TCollection_AsciiString aNewViewName;
1240 for (NCollection_DoubleMap <TCollection_AsciiString, Handle(V3d_View)>::Iterator anIter (ViewerTest_myViews);
1241 anIter.More(); anIter.Next())
1243 if (anIter.Key1() != theViewName)
1245 aNewViewName = anIter.Key1();
1249 ActivateView (aNewViewName);
1253 Handle(V3d_View) anEmptyView;
1254 #if defined(_WIN32) || defined(__WIN32__)
1255 Handle(WNT_Window) anEmptyWindow;
1256 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
1257 Handle(Cocoa_Window) anEmptyWindow;
1259 Handle(Xw_Window) anEmptyWindow;
1261 VT_GetWindow() = anEmptyWindow;
1262 ViewerTest::CurrentView (anEmptyView);
1263 if (isContextRemoved)
1265 Handle(AIS_InteractiveContext) anEmptyContext;
1266 ViewerTest::SetAISContext(anEmptyContext);
1272 Handle(V3d_View) aView = ViewerTest_myViews.Find1(theViewName);
1273 Handle(AIS_InteractiveContext) aCurrentContext = FindContextByView(aView);
1275 // Remove view resources
1276 ViewerTest_myViews.UnBind1(theViewName);
1277 aView->Window()->Unmap();
1280 #if !defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
1281 XFlush (GetDisplayConnection()->GetDisplay());
1284 // Keep context opened only if the closed view is last to avoid
1285 // unused empty contexts
1286 if (!aCurrentContext.IsNull())
1288 // Check if there are more difined views in the viewer
1289 aCurrentContext->CurrentViewer()->InitDefinedViews();
1290 if ((isContextRemoved || ViewerTest_myContexts.Size() != 1) && !aCurrentContext->CurrentViewer()->MoreDefinedViews())
1292 // Remove driver if there is no viewers that use it
1293 Standard_Boolean isRemoveDriver = Standard_True;
1294 for(NCollection_DoubleMap<TCollection_AsciiString, Handle(AIS_InteractiveContext)>::Iterator
1295 anIter(ViewerTest_myContexts); anIter.More(); anIter.Next())
1297 if (aCurrentContext != anIter.Key2() &&
1298 aCurrentContext->CurrentViewer()->Driver() == anIter.Value()->CurrentViewer()->Driver())
1300 isRemoveDriver = Standard_False;
1305 aCurrentContext->RemoveAll (Standard_False);
1308 ViewerTest_myDrivers.UnBind2 (aCurrentContext->CurrentViewer()->Driver());
1309 #if !defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
1310 #if TCL_MAJOR_VERSION < 8
1311 Tk_DeleteFileHandler((void*)XConnectionNumber(aCurrentContext->CurrentViewer()->Driver()->GetDisplayConnection()->GetDisplay()));
1313 Tk_DeleteFileHandler(XConnectionNumber(aCurrentContext->CurrentViewer()->Driver()->GetDisplayConnection()->GetDisplay()));
1318 ViewerTest_myContexts.UnBind2(aCurrentContext);
1321 cout << "3D View - " << theViewName << " was deleted.\n";
1322 if (Draw_ToExitOnCloseView)
1324 Draw_Interprete ("exit");
1328 //==============================================================================
1330 //purpose : Remove the view defined by its name
1331 //==============================================================================
1333 static int VClose (Draw_Interpretor& /*theDi*/,
1334 Standard_Integer theArgsNb,
1335 const char** theArgVec)
1337 NCollection_List<TCollection_AsciiString> aViewList;
1340 TCollection_AsciiString anArg (theArgVec[1]);
1342 if (anArg.IsEqual ("ALL")
1343 || anArg.IsEqual ("*"))
1345 for (NCollection_DoubleMap<TCollection_AsciiString, Handle(V3d_View)>::Iterator anIter (ViewerTest_myViews);
1346 anIter.More(); anIter.Next())
1348 aViewList.Append (anIter.Key1());
1350 if (aViewList.IsEmpty())
1352 std::cout << "No view to close\n";
1358 ViewerTest_Names aViewName (theArgVec[1]);
1359 if (!ViewerTest_myViews.IsBound1 (aViewName.GetViewName()))
1361 std::cerr << "The view with name '" << theArgVec[1] << "' does not exist\n";
1364 aViewList.Append (aViewName.GetViewName());
1369 // close active view
1370 if (ViewerTest::CurrentView().IsNull())
1372 std::cerr << "No active view!\n";
1375 aViewList.Append (ViewerTest_myViews.Find2 (ViewerTest::CurrentView()));
1378 Standard_Boolean toRemoveContext = (theArgsNb != 3 || Draw::Atoi (theArgVec[2]) != 1);
1379 for (NCollection_List<TCollection_AsciiString>::Iterator anIter(aViewList);
1380 anIter.More(); anIter.Next())
1382 ViewerTest::RemoveView (anIter.Value(), toRemoveContext);
1388 //==============================================================================
1389 //function : VActivate
1390 //purpose : Activate the view defined by its ID
1391 //==============================================================================
1393 static int VActivate (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgVec)
1397 theDi << theArgVec[0] << ": wrong number of command arguments.\n"
1398 << "Usage: " << theArgVec[0] << " ViewID\n";
1403 theDi.Eval("vviewlist");
1407 TCollection_AsciiString aNameString(theArgVec[1]);
1408 if ( strcasecmp( aNameString.ToCString(), "NONE" ) == 0 )
1410 TCollection_AsciiString aTitle("3D View - ");
1411 aTitle = aTitle + ViewerTest_myViews.Find2(ViewerTest::CurrentView());
1412 SetWindowTitle (ViewerTest::CurrentView()->Window(), aTitle.ToCString());
1413 Handle(V3d_View) anEmptyView;
1414 #if defined(_WIN32) || defined(__WIN32__)
1415 Handle(WNT_Window) anEmptyWindow;
1416 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
1417 Handle(Cocoa_Window) anEmptyWindow;
1419 Handle(Xw_Window) anEmptyWindow;
1421 VT_GetWindow() = anEmptyWindow;
1422 ViewerTest::CurrentView (anEmptyView);
1423 ViewerTest::ResetEventManager();
1424 theDi << theArgVec[0] << ": all views are inactive\n";
1428 ViewerTest_Names aViewNames(aNameString);
1430 // Check if this view exists in the viewer with the driver
1431 if (!ViewerTest_myViews.IsBound1(aViewNames.GetViewName()))
1433 theDi << "Wrong view name\n";
1437 // Check if it is active already
1438 if (ViewerTest::CurrentView() == ViewerTest_myViews.Find1(aViewNames.GetViewName()))
1440 theDi << theArgVec[0] << ": the view is active already\n";
1444 ActivateView (aViewNames.GetViewName());
1448 //==============================================================================
1449 //function : VViewList
1450 //purpose : Print current list of views per viewer and graphic driver ID
1451 // shared between viewers
1452 //==============================================================================
1454 static int VViewList (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgVec)
1458 theDi << theArgVec[0] << ": Wrong number of command arguments\n"
1459 << "Usage: " << theArgVec[0] << " name";
1462 if (ViewerTest_myContexts.Size() < 1)
1465 Standard_Boolean isTreeView =
1466 (( theArgsNb==1 ) || ( strcasecmp( theArgVec[1], "long" ) != 0 ));
1470 theDi << theArgVec[0] <<":\n";
1473 for (NCollection_DoubleMap <TCollection_AsciiString, Handle(Graphic3d_GraphicDriver)>::Iterator aDriverIter (ViewerTest_myDrivers);
1474 aDriverIter.More(); aDriverIter.Next())
1477 theDi << aDriverIter.Key1() << ":\n";
1479 for (NCollection_DoubleMap <TCollection_AsciiString, Handle(AIS_InteractiveContext)>::Iterator
1480 aContextIter(ViewerTest_myContexts); aContextIter.More(); aContextIter.Next())
1482 if (aContextIter.Key1().Search(aDriverIter.Key1()) != -1)
1486 TCollection_AsciiString aContextName(aContextIter.Key1());
1487 theDi << " " << aContextName.Split(aDriverIter.Key1().Length() + 1) << ":\n";
1490 for (NCollection_DoubleMap <TCollection_AsciiString, Handle(V3d_View)>::Iterator aViewIter (ViewerTest_myViews);
1491 aViewIter.More(); aViewIter.Next())
1493 if (aViewIter.Key1().Search(aContextIter.Key1()) != -1)
1495 TCollection_AsciiString aViewName(aViewIter.Key1());
1498 if (aViewIter.Value() == ViewerTest::CurrentView())
1499 theDi << " " << aViewName.Split(aContextIter.Key1().Length() + 1) << "(*)\n";
1501 theDi << " " << aViewName.Split(aContextIter.Key1().Length() + 1) << "\n";
1505 theDi << aViewName << " ";
1515 //==============================================================================
1516 //function : VT_ProcessKeyPress
1517 //purpose : Handle KeyPress event from a CString
1518 //==============================================================================
1519 void VT_ProcessKeyPress (const char* buf_ret)
1521 //cout << "KeyPress" << endl;
1522 const Handle(V3d_View) aView = ViewerTest::CurrentView();
1523 // Letter in alphabetic order
1525 if (!strcasecmp (buf_ret, "A"))
1528 aView->SetProj(V3d_XposYnegZpos);
1530 else if (!strcasecmp (buf_ret, "D"))
1535 else if (!strcasecmp (buf_ret, "F"))
1537 if (ViewerTest::GetAISContext()->NbSelected() > 0)
1539 ViewerTest::GetAISContext()->FitSelected (aView);
1547 else if (!strcasecmp (buf_ret, "H"))
1550 std::cout << "HLR" << std::endl;
1551 aView->SetComputedMode (!aView->ComputedMode());
1554 else if (!strcasecmp (buf_ret, "P"))
1557 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
1558 if (aContext->DefaultDrawer()->TypeOfHLR() == Prs3d_TOH_Algo)
1559 aContext->DefaultDrawer()->SetTypeOfHLR(Prs3d_TOH_PolyAlgo);
1561 aContext->DefaultDrawer()->SetTypeOfHLR(Prs3d_TOH_Algo);
1562 if (aContext->NbSelected()==0)
1564 AIS_ListOfInteractive aListOfShapes;
1565 aContext->DisplayedObjects(aListOfShapes);
1566 for (AIS_ListIteratorOfListOfInteractive anIter(aListOfShapes);
1567 anIter.More(); anIter.Next())
1569 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anIter.Value());
1570 if (aShape.IsNull())
1572 if (aShape->TypeOfHLR() == Prs3d_TOH_PolyAlgo)
1573 aShape->SetTypeOfHLR (Prs3d_TOH_Algo);
1575 aShape->SetTypeOfHLR (Prs3d_TOH_PolyAlgo);
1576 aContext->Redisplay (aShape, Standard_False);
1581 for (aContext->InitSelected();aContext->MoreSelected();aContext->NextSelected())
1583 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aContext->SelectedInteractive());
1584 if (aShape.IsNull())
1586 if(aShape->TypeOfHLR() == Prs3d_TOH_PolyAlgo)
1587 aShape->SetTypeOfHLR (Prs3d_TOH_Algo);
1589 aShape->SetTypeOfHLR (Prs3d_TOH_PolyAlgo);
1590 aContext->Redisplay (aShape, Standard_False);
1594 aContext->UpdateCurrentViewer();
1597 else if (!strcasecmp (buf_ret, "S"))
1599 std::cout << "setup Shaded display mode" << std::endl;
1601 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1602 if(Ctx->NbSelected()==0)
1603 Ctx->SetDisplayMode (AIS_Shaded, Standard_True);
1605 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1606 Ctx->SetDisplayMode(Ctx->SelectedInteractive(),1,Standard_False);
1607 Ctx->UpdateCurrentViewer();
1610 else if (!strcasecmp (buf_ret, "U"))
1612 // Unset display mode
1613 std::cout << "reset display mode to defaults" << std::endl;
1615 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1616 if(Ctx->NbSelected()==0)
1617 Ctx->SetDisplayMode (AIS_WireFrame, Standard_True);
1619 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1620 Ctx->UnsetDisplayMode(Ctx->SelectedInteractive(),Standard_False);
1621 Ctx->UpdateCurrentViewer();
1625 else if (!strcasecmp (buf_ret, "T"))
1628 aView->SetProj(V3d_Zpos);
1630 else if (!strcasecmp (buf_ret, "B"))
1633 aView->SetProj(V3d_Zneg);
1635 else if (!strcasecmp (buf_ret, "L"))
1638 aView->SetProj(V3d_Xneg);
1640 else if (!strcasecmp (buf_ret, "R"))
1643 aView->SetProj(V3d_Xpos);
1645 else if (!strcasecmp (buf_ret, "W"))
1647 std::cout << "setup WireFrame display mode" << std::endl;
1648 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1649 if(Ctx->NbSelected()==0)
1650 Ctx->SetDisplayMode (AIS_WireFrame, Standard_True);
1652 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1653 Ctx->SetDisplayMode(Ctx->SelectedInteractive(),0,Standard_False);
1654 Ctx->UpdateCurrentViewer();
1657 else if (!strcasecmp (buf_ret, ","))
1659 ViewerTest::GetAISContext()->HilightNextDetected(ViewerTest::CurrentView());
1661 else if (!strcasecmp (buf_ret, "."))
1663 ViewerTest::GetAISContext()->HilightPreviousDetected(ViewerTest::CurrentView());
1665 else if (!strcasecmp (buf_ret, "/"))
1667 Handle(Graphic3d_Camera) aCamera = aView->Camera();
1668 if (aCamera->IsStereo())
1670 aCamera->SetIOD (aCamera->GetIODType(), aCamera->IOD() - 0.01);
1674 else if (!strcasecmp (buf_ret, "*"))
1676 Handle(Graphic3d_Camera) aCamera = aView->Camera();
1677 if (aCamera->IsStereo())
1679 aCamera->SetIOD (aCamera->GetIODType(), aCamera->IOD() + 0.01);
1683 else if (*buf_ret == THE_KEY_DELETE)
1685 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
1687 && aCtx->NbSelected() > 0)
1689 Draw_Interprete ("verase");
1692 else if (*buf_ret == THE_KEY_ESCAPE)
1694 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
1696 && Draw_ToCloseViewOnEsc)
1698 Draw_Interprete (Draw_ToExitOnCloseView ? "exit" : "vclose");
1704 Standard_Integer Num = Draw::Atoi(buf_ret);
1705 if(Num>=0 && Num<=7)
1706 ViewerTest::StandardModeActivation(Num);
1710 //==============================================================================
1711 //function : VT_ProcessExpose
1712 //purpose : Redraw the View on an Expose Event
1713 //==============================================================================
1714 void VT_ProcessExpose()
1716 Handle(V3d_View) aView3d = ViewerTest::CurrentView();
1717 if (!aView3d.IsNull())
1723 //==============================================================================
1724 //function : VT_ProcessConfigure
1725 //purpose : Resize the View on an Configure Event
1726 //==============================================================================
1727 void VT_ProcessConfigure()
1729 Handle(V3d_View) aView3d = ViewerTest::CurrentView();
1730 if (aView3d.IsNull())
1735 aView3d->MustBeResized();
1740 //==============================================================================
1741 //function : VT_ProcessButton1Press
1743 //==============================================================================
1744 Standard_Boolean VT_ProcessButton1Press (Standard_Integer ,
1745 const char** theArgVec,
1746 Standard_Boolean theToPick,
1747 Standard_Boolean theIsShift)
1751 TheIsAnimating = Standard_False;
1752 return Standard_False;
1757 Standard_Real X, Y, Z;
1758 ViewerTest::CurrentView()->Convert (X_Motion, Y_Motion, X, Y, Z);
1760 Draw::Set (theArgVec[1], X);
1761 Draw::Set (theArgVec[2], Y);
1762 Draw::Set (theArgVec[3], Z);
1767 ViewerTest::CurrentEventManager()->ShiftSelect();
1771 ViewerTest::CurrentEventManager()->Select();
1774 return Standard_False;
1777 //==============================================================================
1778 //function : VT_ProcessButton1Release
1779 //purpose : End selecting
1780 //==============================================================================
1781 void VT_ProcessButton1Release (Standard_Boolean theIsShift)
1785 IsDragged = Standard_False;
1786 Handle(ViewerTest_EventManager) EM = ViewerTest::CurrentEventManager();
1789 EM->ShiftSelect (X_ButtonPress, Y_ButtonPress,
1790 X_Motion, Y_Motion);
1794 EM->Select (X_ButtonPress, Y_ButtonPress,
1795 X_Motion, Y_Motion);
1800 //==============================================================================
1801 //function : VT_ProcessButton3Press
1802 //purpose : Start Rotation
1803 //==============================================================================
1804 void VT_ProcessButton3Press()
1807 HasHlrOnBeforeRotation = ViewerTest::CurrentView()->ComputedMode();
1808 if (HasHlrOnBeforeRotation)
1810 ViewerTest::CurrentView()->SetComputedMode (Standard_False);
1812 ViewerTest::CurrentView()->StartRotation( X_ButtonPress, Y_ButtonPress );
1815 //==============================================================================
1816 //function : VT_ProcessButton3Release
1817 //purpose : End rotation
1818 //==============================================================================
1819 void VT_ProcessButton3Release()
1824 if (HasHlrOnBeforeRotation)
1826 HasHlrOnBeforeRotation = Standard_False;
1827 ViewerTest::CurrentView()->SetComputedMode (Standard_True);
1828 ViewerTest::CurrentView()->Redraw();
1833 //==============================================================================
1834 //function : ProcessControlButton1Motion
1836 //==============================================================================
1838 #if defined(_WIN32) || ! defined(__APPLE__) || defined(MACOSX_USE_GLX)
1839 static void ProcessControlButton1Motion()
1841 ViewerTest::CurrentView()->Zoom( X_ButtonPress, Y_ButtonPress, X_Motion, Y_Motion);
1843 X_ButtonPress = X_Motion;
1844 Y_ButtonPress = Y_Motion;
1848 //==============================================================================
1849 //function : VT_ProcessControlButton2Motion
1851 //==============================================================================
1852 void VT_ProcessControlButton2Motion()
1854 Standard_Integer aDx = X_Motion - X_ButtonPress;
1855 Standard_Integer aDy = Y_Motion - Y_ButtonPress;
1857 aDy = -aDy; // Xwindow Y axis is from top to Bottom
1859 ViewerTest::CurrentView()->Pan (aDx, aDy);
1861 X_ButtonPress = X_Motion;
1862 Y_ButtonPress = Y_Motion;
1865 //==============================================================================
1866 //function : VT_ProcessControlButton3Motion
1867 //purpose : Rotation
1868 //==============================================================================
1869 void VT_ProcessControlButton3Motion()
1873 ViewerTest::CurrentView()->Rotation (X_Motion, Y_Motion);
1877 //==============================================================================
1878 //function : VT_ProcessMotion
1880 //==============================================================================
1881 void VT_ProcessMotion()
1883 //pre-hilights detected objects at mouse position
1885 Handle(ViewerTest_EventManager) EM = ViewerTest::CurrentEventManager();
1886 EM->MoveTo(X_Motion, Y_Motion);
1890 void ViewerTest::GetMousePosition(Standard_Integer& Xpix,Standard_Integer& Ypix)
1892 Xpix = X_Motion;Ypix=Y_Motion;
1895 //==============================================================================
1896 //function : ViewProject: implements VAxo, VTop, VLeft, ...
1897 //purpose : Switches to an axonometric, top, left and other views
1898 //==============================================================================
1900 static int ViewProject(Draw_Interpretor& di, const V3d_TypeOfOrientation ori)
1902 if ( ViewerTest::CurrentView().IsNull() )
1904 di<<"Call vinit before this command, please\n";
1908 ViewerTest::CurrentView()->SetProj(ori);
1912 //==============================================================================
1914 //purpose : Switch to an Axonometric view
1915 //Draw arg : No args
1916 //==============================================================================
1918 static int VAxo(Draw_Interpretor& di, Standard_Integer , const char** )
1920 return ViewProject(di, V3d_XposYnegZpos);
1923 //==============================================================================
1925 //purpose : Switch to a Top View
1926 //Draw arg : No args
1927 //==============================================================================
1929 static int VTop(Draw_Interpretor& di, Standard_Integer , const char** )
1931 return ViewProject(di, V3d_Zpos);
1934 //==============================================================================
1935 //function : VBottom
1936 //purpose : Switch to a Bottom View
1937 //Draw arg : No args
1938 //==============================================================================
1940 static int VBottom(Draw_Interpretor& di, Standard_Integer , const char** )
1942 return ViewProject(di, V3d_Zneg);
1945 //==============================================================================
1947 //purpose : Switch to a Left View
1948 //Draw arg : No args
1949 //==============================================================================
1951 static int VLeft(Draw_Interpretor& di, Standard_Integer , const char** )
1953 return ViewProject(di, V3d_Xneg);
1956 //==============================================================================
1958 //purpose : Switch to a Right View
1959 //Draw arg : No args
1960 //==============================================================================
1962 static int VRight(Draw_Interpretor& di, Standard_Integer , const char** )
1964 return ViewProject(di, V3d_Xpos);
1967 //==============================================================================
1969 //purpose : Switch to a Front View
1970 //Draw arg : No args
1971 //==============================================================================
1973 static int VFront(Draw_Interpretor& di, Standard_Integer , const char** )
1975 return ViewProject(di, V3d_Yneg);
1978 //==============================================================================
1980 //purpose : Switch to a Back View
1981 //Draw arg : No args
1982 //==============================================================================
1984 static int VBack(Draw_Interpretor& di, Standard_Integer , const char** )
1986 return ViewProject(di, V3d_Ypos);
1989 //==============================================================================
1991 //purpose : Dsiplay help on viewer Keyboead and mouse commands
1992 //Draw arg : No args
1993 //==============================================================================
1995 static int VHelp(Draw_Interpretor& di, Standard_Integer , const char** )
1998 di << "Q : Quit the application\n";
2000 di << "=========================\n";
2001 di << "F : FitAll\n";
2002 di << "T : TopView\n";
2003 di << "B : BottomView\n";
2004 di << "R : RightView\n";
2005 di << "L : LeftView\n";
2006 di << "A : AxonometricView\n";
2007 di << "D : ResetView\n";
2009 di << "=========================\n";
2010 di << "S : Shading\n";
2011 di << "W : Wireframe\n";
2012 di << "H : HidelLineRemoval\n";
2013 di << "U : Unset display mode\n";
2014 di << "Delete : Remove selection from viewer\n";
2016 di << "=========================\n";
2017 di << "Selection mode \n";
2018 di << "0 : Shape\n";
2019 di << "1 : Vertex\n";
2023 di << "5 : Shell\n";
2024 di << "6 : Solid\n";
2025 di << "7 : Compound\n";
2027 di << "=========================\n";
2028 di << "Z : Switch Z clipping On/Off\n";
2029 di << ", : Hilight next detected\n";
2030 di << ". : Hilight previous detected\n";
2037 static Standard_Boolean Ppick = 0;
2038 static Standard_Integer Pargc = 0;
2039 static const char** Pargv = NULL;
2042 static LRESULT WINAPI AdvViewerWindowProc( HWND hwnd,
2047 if (!ViewerTest_myViews.IsEmpty()) {
2049 WPARAM fwKeys = wParam;
2054 // Delete view from map of views
2055 ViewerTest::RemoveView(FindViewIdByWindowHandle(hwnd));
2060 if(LOWORD(wParam) == WA_CLICKACTIVE || LOWORD(wParam) == WA_ACTIVE
2061 || ViewerTest::CurrentView().IsNull())
2063 // Activate inactive window
2064 if(GetWindowHandle(VT_GetWindow()) != hwnd)
2066 ActivateView (FindViewIdByWindowHandle(hwnd));
2072 if (IsDragged && !DragFirst)
2074 if (!GetActiveAISManipulator().IsNull())
2076 GetActiveAISManipulator()->StopTransform();
2077 ViewerTest::GetAISContext()->ClearSelected (Standard_True);
2080 if (ViewerTest::GetAISContext()->IsDisplayed (GetRubberBand()))
2082 ViewerTest::GetAISContext()->Remove (GetRubberBand(), Standard_False);
2083 ViewerTest::GetAISContext()->CurrentViewer()->RedrawImmediate();
2086 VT_ProcessButton1Release ((fwKeys & MK_SHIFT) != 0);
2088 IsDragged = Standard_False;
2089 return ViewerWindowProc( hwnd, Msg, wParam, lParam );
2092 if (IsDragged && !DragFirst)
2094 if (!GetActiveAISManipulator().IsNull())
2096 GetActiveAISManipulator()->StopTransform (Standard_False);
2097 ViewerTest::GetAISContext()->ClearSelected (Standard_True);
2099 IsDragged = Standard_False;
2101 return ViewerWindowProc (hwnd, Msg, wParam, lParam);
2103 case WM_LBUTTONDOWN:
2104 if (!GetActiveAISManipulator().IsNull())
2106 IsDragged = ( fwKeys == MK_LBUTTON );
2110 IsDragged = ( fwKeys == MK_LBUTTON || fwKeys == ( MK_LBUTTON | MK_SHIFT ) );
2115 DragFirst = Standard_True;
2116 X_ButtonPress = LOWORD(lParam);
2117 Y_ButtonPress = HIWORD(lParam);
2119 return ViewerWindowProc( hwnd, Msg, wParam, lParam );
2124 X_Motion = LOWORD (lParam);
2125 Y_Motion = HIWORD (lParam);
2126 if (!GetActiveAISManipulator().IsNull())
2130 GetActiveAISManipulator()->StartTransform (X_ButtonPress, Y_ButtonPress, ViewerTest::CurrentView());
2134 GetActiveAISManipulator()->Transform (X_Motion, Y_Motion, ViewerTest::CurrentView());
2135 ViewerTest::GetAISContext()->CurrentViewer()->Redraw();
2140 bool toRedraw = false;
2141 if (!DragFirst && ViewerTest::GetAISContext()->IsDisplayed (GetRubberBand()))
2143 ViewerTest::GetAISContext()->Remove (GetRubberBand(), Standard_False);
2148 if (GetClientRect (hwnd, &aRect))
2150 int aHeight = aRect.bottom - aRect.top;
2151 GetRubberBand()->SetRectangle (X_ButtonPress, aHeight - Y_ButtonPress, X_Motion, aHeight - Y_Motion);
2152 ViewerTest::GetAISContext()->Display (GetRubberBand(), 0, -1, Standard_False, Standard_True, AIS_DS_Displayed);
2157 ViewerTest::GetAISContext()->CurrentViewer()->RedrawImmediate();
2161 DragFirst = Standard_False;
2164 return ViewerWindowProc( hwnd, Msg, wParam, lParam );
2168 return ViewerWindowProc( hwnd, Msg, wParam, lParam );
2172 return ViewerWindowProc( hwnd, Msg, wParam, lParam );
2176 static LRESULT WINAPI ViewerWindowProc( HWND hwnd,
2182 const Handle(V3d_View)& aView = ViewerTest::CurrentView();
2185 return DefWindowProcW (hwnd, Msg, wParam, lParam);
2192 BeginPaint(hwnd, &ps);
2193 EndPaint(hwnd, &ps);
2198 VT_ProcessConfigure();
2203 switch (aView->RenderingParams().StereoMode)
2205 case Graphic3d_StereoMode_RowInterlaced:
2206 case Graphic3d_StereoMode_ColumnInterlaced:
2207 case Graphic3d_StereoMode_ChessBoard:
2208 VT_ProcessConfigure(); // track window moves to reverse stereo pair
2216 if ((wParam != VK_SHIFT) && (wParam != VK_CONTROL))
2219 c[0] = (char) wParam;
2221 if (wParam == VK_DELETE)
2223 c[0] = THE_KEY_DELETE;
2225 else if (wParam == VK_ESCAPE)
2227 c[0] = THE_KEY_ESCAPE;
2230 else if (wParam == VK_OEM_COMMA)
2235 else if (wParam == VK_OEM_PERIOD)
2239 else if (wParam == VK_DIVIDE)
2244 else if (wParam == VK_MULTIPLY)
2248 VT_ProcessKeyPress (c);
2256 VT_ProcessButton3Release();
2259 case WM_LBUTTONDOWN:
2260 case WM_MBUTTONDOWN:
2261 case WM_RBUTTONDOWN:
2263 WPARAM fwKeys = wParam;
2267 X_ButtonPress = LOWORD(lParam);
2268 Y_ButtonPress = HIWORD(lParam);
2270 if (Msg == WM_LBUTTONDOWN)
2272 if ((fwKeys & MK_CONTROL) != 0)
2274 Ppick = VT_ProcessButton1Press (Pargc, Pargv, Ppick, (fwKeys & MK_SHIFT) != 0);
2278 VT_ProcessButton1Press (Pargc, Pargv, Ppick, (fwKeys & MK_SHIFT) != 0);
2281 else if (Msg == WM_RBUTTONDOWN)
2284 VT_ProcessButton3Press();
2291 int aDelta = GET_WHEEL_DELTA_WPARAM (wParam);
2292 if (wParam & MK_CONTROL)
2294 if (aView->Camera()->IsStereo())
2296 Standard_Real aFocus = aView->Camera()->ZFocus() + (aDelta > 0 ? 0.05 : -0.05);
2300 aView->Camera()->SetZFocus (aView->Camera()->ZFocusType(), aFocus);
2307 aView->Zoom (0, 0, aDelta / 40, aDelta / 40);
2314 //cout << "\t WM_MOUSEMOVE" << endl;
2315 WPARAM fwKeys = wParam;
2316 X_Motion = LOWORD(lParam);
2317 Y_Motion = HIWORD(lParam);
2320 (fwKeys & ( MK_LBUTTON|MK_MBUTTON|MK_RBUTTON )) != 0 )
2323 X_ButtonPress = LOWORD(lParam);
2324 Y_ButtonPress = HIWORD(lParam);
2326 if ((fwKeys & MK_RBUTTON) != 0) {
2328 VT_ProcessButton3Press();
2332 if ((fwKeys & MK_CONTROL) != 0)
2334 if ((fwKeys & MK_LBUTTON) != 0)
2336 ProcessControlButton1Motion();
2338 else if ((fwKeys & MK_MBUTTON) != 0
2339 || ((fwKeys & MK_LBUTTON) != 0
2340 && (fwKeys & MK_RBUTTON) != 0))
2342 VT_ProcessControlButton2Motion();
2344 else if ((fwKeys & MK_RBUTTON) != 0)
2346 VT_ProcessControlButton3Motion();
2349 else if (GetWindowHandle (VT_GetWindow()) == hwnd)
2357 return DefWindowProcW (hwnd, Msg, wParam, lParam);
2362 //==============================================================================
2363 //function : ViewerMainLoop
2364 //purpose : Get a Event on the view and dispatch it
2365 //==============================================================================
2368 int ViewerMainLoop(Standard_Integer argc, const char** argv)
2370 Ppick = (argc > 0)? 1 : 0;
2378 cout << "Start picking" << endl;
2380 while ( Ppick == 1 ) {
2381 // Wait for a VT_ProcessButton1Press() to toggle pick to 1 or 0
2382 if (GetMessageW (&msg, NULL, 0, 0))
2384 TranslateMessage (&msg);
2385 DispatchMessageW (&msg);
2389 cout << "Picking done" << endl;
2395 #elif !defined(__APPLE__) || defined(MACOSX_USE_GLX)
2397 int min( int a, int b )
2405 int max( int a, int b )
2413 int ViewerMainLoop(Standard_Integer argc, const char** argv)
2416 static XEvent aReport;
2417 Standard_Boolean pick = argc > 0;
2418 Display *aDisplay = GetDisplayConnection()->GetDisplay();
2419 XNextEvent (aDisplay, &aReport);
2421 // Handle event for the chosen display connection
2422 switch (aReport.type) {
2425 if((Atom)aReport.xclient.data.l[0] == GetDisplayConnection()->GetAtom(Aspect_XA_DELETE_WINDOW))
2428 ViewerTest::RemoveView(FindViewIdByWindowHandle (aReport.xclient.window));
2434 // Activate inactive view
2435 Window aWindow = GetWindowHandle(VT_GetWindow());
2436 if(aWindow != aReport.xfocus.window)
2438 ActivateView (FindViewIdByWindowHandle (aReport.xfocus.window));
2447 case ConfigureNotify:
2449 VT_ProcessConfigure();
2458 XComposeStatus status_in_out;
2460 ret_len = XLookupString( ( XKeyEvent *)&aReport ,
2461 (char *) buf_ret , 10 ,
2462 &ks_ret , &status_in_out ) ;
2465 buf_ret[ret_len] = '\0' ;
2469 VT_ProcessKeyPress (buf_ret);
2475 X_ButtonPress = aReport.xbutton.x;
2476 Y_ButtonPress = aReport.xbutton.y;
2478 if (aReport.xbutton.button == Button1)
2480 if (aReport.xbutton.state & ControlMask)
2482 pick = VT_ProcessButton1Press (argc, argv, pick, (aReport.xbutton.state & ShiftMask));
2486 IsDragged = Standard_True;
2487 DragFirst = Standard_True;
2490 else if (aReport.xbutton.button == Button3)
2493 VT_ProcessButton3Press();
2503 if (ViewerTest::GetAISContext()->IsDisplayed (GetRubberBand()))
2505 ViewerTest::GetAISContext()->Remove (GetRubberBand(), Standard_False);
2506 ViewerTest::GetAISContext()->CurrentViewer()->RedrawImmediate();
2510 Handle( AIS_InteractiveContext ) aContext = ViewerTest::GetAISContext();
2511 if( aContext.IsNull() )
2513 cout << "The context is null. Please use vinit before createmesh" << endl;
2517 Standard_Boolean ShiftPressed = ( aReport.xbutton.state & ShiftMask );
2518 if( aReport.xbutton.button==1 )
2522 aContext->ShiftSelect (Standard_True);
2526 aContext->Select (Standard_True);
2531 aContext->ShiftSelect(Min(X_ButtonPress, X_Motion), Min(Y_ButtonPress, Y_Motion),
2532 Max(X_ButtonPress, X_Motion), Max(Y_ButtonPress, Y_Motion),
2533 ViewerTest::CurrentView(), Standard_True);
2537 aContext->Select(Min(X_ButtonPress, X_Motion), Min(Y_ButtonPress, Y_Motion),
2538 Max(X_ButtonPress, X_Motion), Max(Y_ButtonPress, Y_Motion),
2539 ViewerTest::CurrentView(), Standard_True);
2542 VT_ProcessButton3Release();
2544 IsDragged = Standard_False;
2547 VT_ProcessButton3Release();
2552 if (GetWindowHandle (VT_GetWindow()) != aReport.xmotion.window)
2560 if (ViewerTest::GetAISContext()->IsDisplayed (GetRubberBand()))
2562 ViewerTest::GetAISContext()->Remove (GetRubberBand(), Standard_False);
2566 X_Motion = aReport.xmotion.x;
2567 Y_Motion = aReport.xmotion.y;
2568 DragFirst = Standard_False;
2570 Window aWindow = GetWindowHandle(VT_GetWindow());
2573 unsigned int aWidth, aHeight, aBorderWidth, aDepth;
2574 XGetGeometry (aDisplay, aWindow, &aRoot, &anX, &anY, &aWidth, &aHeight, &aBorderWidth, &aDepth);
2575 GetRubberBand()->SetRectangle (X_ButtonPress, aHeight - Y_ButtonPress, X_Motion, aHeight - Y_Motion);
2576 ViewerTest::GetAISContext()->Display (GetRubberBand(), 0, -1, Standard_False, Standard_True, AIS_DS_Displayed);
2577 ViewerTest::GetAISContext()->CurrentViewer()->RedrawImmediate();
2581 X_Motion = aReport.xmotion.x;
2582 Y_Motion = aReport.xmotion.y;
2584 // remove all the ButtonMotionMaskr
2585 while( XCheckMaskEvent( aDisplay, ButtonMotionMask, &aReport) ) ;
2587 if ( aReport.xmotion.state & ControlMask ) {
2588 if ( aReport.xmotion.state & Button1Mask ) {
2589 ProcessControlButton1Motion();
2591 else if ( aReport.xmotion.state & Button2Mask ) {
2592 VT_ProcessControlButton2Motion();
2594 else if ( aReport.xmotion.state & Button3Mask ) {
2595 VT_ProcessControlButton3Motion();
2609 //==============================================================================
2610 //function : VProcessEvents
2611 //purpose : call by Tk_CreateFileHandler() to be able to manage the
2612 // event in the Viewer window
2613 //==============================================================================
2615 static void VProcessEvents(ClientData,int)
2617 NCollection_Vector<int> anEventNumbers;
2618 // Get number of messages from every display
2619 for (NCollection_DoubleMap <TCollection_AsciiString, Handle(Graphic3d_GraphicDriver)>::Iterator
2620 anIter (ViewerTest_myDrivers); anIter.More(); anIter.Next())
2622 anEventNumbers.Append(XPending (anIter.Key2()->GetDisplayConnection()->GetDisplay()));
2624 // Handle events for every display
2625 int anEventIter = 0;
2626 for (NCollection_DoubleMap <TCollection_AsciiString, Handle(Graphic3d_GraphicDriver)>::Iterator
2627 anIter (ViewerTest_myDrivers); anIter.More(); anIter.Next(), anEventIter++)
2629 for (int i = 0; i < anEventNumbers.Value(anEventIter) &&
2630 XPending (anIter.Key2()->GetDisplayConnection()->GetDisplay()) > 0; ++i)
2632 SetDisplayConnection (anIter.Key2()->GetDisplayConnection());
2633 int anEventResult = ViewerMainLoop( 0, NULL);
2634 // If window is closed or context was not found finish current event processing loop
2640 SetDisplayConnection (ViewerTest::GetAISContext()->CurrentViewer()->Driver()->GetDisplayConnection());
2645 //==============================================================================
2646 //function : OSWindowSetup
2647 //purpose : Setup for the X11 window to be able to cath the event
2648 //==============================================================================
2651 static void OSWindowSetup()
2653 #if !defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
2656 Window window = VT_GetWindow()->XWindow();
2657 SetDisplayConnection (ViewerTest::CurrentView()->Viewer()->Driver()->GetDisplayConnection());
2658 Display *aDisplay = GetDisplayConnection()->GetDisplay();
2659 XSynchronize(aDisplay, 1);
2661 // X11 : For keyboard on SUN
2663 wmhints.flags = InputHint;
2666 XSetWMHints( aDisplay, window, &wmhints);
2668 XSelectInput( aDisplay, window, ExposureMask | KeyPressMask |
2669 ButtonPressMask | ButtonReleaseMask |
2670 StructureNotifyMask |
2672 Button1MotionMask | Button2MotionMask |
2673 Button3MotionMask | FocusChangeMask
2675 Atom aDeleteWindowAtom = GetDisplayConnection()->GetAtom(Aspect_XA_DELETE_WINDOW);
2676 XSetWMProtocols(aDisplay, window, &aDeleteWindowAtom, 1);
2678 XSynchronize(aDisplay, 0);
2686 //==============================================================================
2689 //==============================================================================
2691 static int VFit (Draw_Interpretor& /*theDi*/, Standard_Integer theArgNb, const char** theArgv)
2693 const Handle(V3d_View) aView = ViewerTest::CurrentView();
2696 std::cout << "Error: no active viewer!\n";
2700 Standard_Boolean toFit = Standard_True;
2701 ViewerTest_AutoUpdater anUpdateTool (Handle(AIS_InteractiveContext)(), aView);
2702 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
2704 TCollection_AsciiString anArg (theArgv[anArgIter]);
2706 if (anUpdateTool.parseRedrawMode (anArg))
2710 else if (anArg == "-selected")
2712 ViewerTest::GetAISContext()->FitSelected (aView, 0.01, Standard_False);
2713 toFit = Standard_False;
2717 std::cout << "Syntax error at '" << anArg << "'\n";
2723 aView->FitAll (0.01, Standard_False);
2728 //=======================================================================
2729 //function : VFitArea
2730 //purpose : Fit view to show area located between two points
2731 // : given in world 2D or 3D coordinates.
2732 //=======================================================================
2733 static int VFitArea (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec)
2735 Handle(V3d_View) aView = ViewerTest::CurrentView();
2738 std::cerr << theArgVec[0] << "Error: No active view.\n";
2743 gp_Pnt aWorldPnt1 (0.0, 0.0, 0.0);
2744 gp_Pnt aWorldPnt2 (0.0, 0.0, 0.0);
2748 aWorldPnt1.SetX (Draw::Atof (theArgVec[1]));
2749 aWorldPnt1.SetY (Draw::Atof (theArgVec[2]));
2750 aWorldPnt2.SetX (Draw::Atof (theArgVec[3]));
2751 aWorldPnt2.SetY (Draw::Atof (theArgVec[4]));
2753 else if (theArgNb == 7)
2755 aWorldPnt1.SetX (Draw::Atof (theArgVec[1]));
2756 aWorldPnt1.SetY (Draw::Atof (theArgVec[2]));
2757 aWorldPnt1.SetZ (Draw::Atof (theArgVec[3]));
2758 aWorldPnt2.SetX (Draw::Atof (theArgVec[4]));
2759 aWorldPnt2.SetY (Draw::Atof (theArgVec[5]));
2760 aWorldPnt2.SetZ (Draw::Atof (theArgVec[6]));
2764 std::cerr << theArgVec[0] << "Error: Invalid number of arguments.\n";
2765 theDI.PrintHelp(theArgVec[0]);
2769 // Convert model coordinates to view space
2770 Handle(Graphic3d_Camera) aCamera = aView->Camera();
2771 gp_Pnt aViewPnt1 = aCamera->ConvertWorld2View (aWorldPnt1);
2772 gp_Pnt aViewPnt2 = aCamera->ConvertWorld2View (aWorldPnt2);
2774 // Determine fit area
2775 gp_Pnt2d aMinCorner (Min (aViewPnt1.X(), aViewPnt2.X()), Min (aViewPnt1.Y(), aViewPnt2.Y()));
2776 gp_Pnt2d aMaxCorner (Max (aViewPnt1.X(), aViewPnt2.X()), Max (aViewPnt1.Y(), aViewPnt2.Y()));
2778 Standard_Real aDiagonal = aMinCorner.Distance (aMaxCorner);
2780 if (aDiagonal < Precision::Confusion())
2782 std::cerr << theArgVec[0] << "Error: view area is too small.\n";
2786 aView->FitAll (aMinCorner.X(), aMinCorner.Y(), aMaxCorner.X(), aMaxCorner.Y());
2790 //==============================================================================
2792 //purpose : ZFitall, no DRAW arguments
2793 //Draw arg : No args
2794 //==============================================================================
2795 static int VZFit (Draw_Interpretor& /*theDi*/, Standard_Integer theArgsNb, const char** theArgVec)
2797 const Handle(V3d_View)& aCurrentView = ViewerTest::CurrentView();
2799 if (aCurrentView.IsNull())
2801 std::cout << theArgVec[0] << ": Call vinit before this command, please.\n";
2807 aCurrentView->ZFitAll();
2808 aCurrentView->Redraw();
2812 Standard_Real aScale = 1.0;
2816 aScale = Draw::Atoi (theArgVec[1]);
2819 aCurrentView->ZFitAll (aScale);
2820 aCurrentView->Redraw();
2825 //==============================================================================
2826 //function : VRepaint
2828 //==============================================================================
2829 static int VRepaint (Draw_Interpretor& , Standard_Integer theArgNb, const char** theArgVec)
2831 Handle(V3d_View) aView = ViewerTest::CurrentView();
2834 std::cout << "Error: no active viewer!\n";
2838 Standard_Boolean isImmediateUpdate = Standard_False;
2839 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
2841 TCollection_AsciiString anArg (theArgVec[anArgIter]);
2843 if (anArg == "-immediate")
2845 isImmediateUpdate = Standard_True;
2846 if (anArgIter + 1 < theArgNb
2847 && ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], isImmediateUpdate))
2854 std::cout << "Syntax error at '" << anArg << "'\n";
2858 if (isImmediateUpdate)
2860 aView->RedrawImmediate();
2869 //==============================================================================
2871 //purpose : Remove all the object from the viewer
2872 //Draw arg : No args
2873 //==============================================================================
2875 static int VClear(Draw_Interpretor& , Standard_Integer , const char** )
2877 Handle(V3d_View) V = ViewerTest::CurrentView();
2879 ViewerTest::Clear();
2883 //==============================================================================
2886 //==============================================================================
2888 static int VPick(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
2889 { if (ViewerTest::CurrentView().IsNull() ) return 1;
2892 di << argv[0] << "Invalid number of arguments\n";
2896 while (ViewerMainLoop( argc, argv)) {
2902 //==============================================================================
2904 //purpose : Load image as background
2905 //==============================================================================
2907 static int VSetBg(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
2909 if (argc < 2 || argc > 3)
2911 di << "Usage : " << argv[0] << " imagefile [filltype] : Load image as background\n";
2912 di << "filltype can be one of CENTERED, TILED, STRETCH, NONE\n";
2916 Handle(AIS_InteractiveContext) AISContext = ViewerTest::GetAISContext();
2917 if(AISContext.IsNull())
2919 di << "use 'vinit' command before " << argv[0] << "\n";
2923 Aspect_FillMethod aFillType = Aspect_FM_CENTERED;
2926 const char* szType = argv[2];
2927 if (strcmp(szType, "NONE" ) == 0) aFillType = Aspect_FM_NONE;
2928 else if (strcmp(szType, "CENTERED") == 0) aFillType = Aspect_FM_CENTERED;
2929 else if (strcmp(szType, "TILED" ) == 0) aFillType = Aspect_FM_TILED;
2930 else if (strcmp(szType, "STRETCH" ) == 0) aFillType = Aspect_FM_STRETCH;
2933 di << "Wrong fill type : " << szType << "\n";
2934 di << "Must be one of CENTERED, TILED, STRETCH, NONE\n";
2939 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
2940 V3dView->SetBackgroundImage(argv[1], aFillType, Standard_True);
2945 //==============================================================================
2946 //function : VSetBgMode
2947 //purpose : Change background image fill type
2948 //==============================================================================
2950 static int VSetBgMode(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
2954 di << "Usage : " << argv[0] << " filltype : Change background image mode\n";
2955 di << "filltype must be one of CENTERED, TILED, STRETCH, NONE\n";
2959 Handle(AIS_InteractiveContext) AISContext = ViewerTest::GetAISContext();
2960 if(AISContext.IsNull())
2962 di << "use 'vinit' command before " << argv[0] << "\n";
2965 Aspect_FillMethod aFillType = Aspect_FM_NONE;
2966 const char* szType = argv[1];
2967 if (strcmp(szType, "NONE" ) == 0) aFillType = Aspect_FM_NONE;
2968 else if (strcmp(szType, "CENTERED") == 0) aFillType = Aspect_FM_CENTERED;
2969 else if (strcmp(szType, "TILED" ) == 0) aFillType = Aspect_FM_TILED;
2970 else if (strcmp(szType, "STRETCH" ) == 0) aFillType = Aspect_FM_STRETCH;
2973 di << "Wrong fill type : " << szType << "\n";
2974 di << "Must be one of CENTERED, TILED, STRETCH, NONE\n";
2977 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
2978 V3dView->SetBgImageStyle(aFillType, Standard_True);
2982 //==============================================================================
2983 //function : VSetGradientBg
2984 //purpose : Mount gradient background
2985 //==============================================================================
2986 static int VSetGradientBg(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
2990 di << "Usage : " << argv[0] << " R1 G1 B1 R2 G2 B2 Type : Mount gradient background\n";
2991 di << "R1,G1,B1,R2,G2,B2 = [0..255]\n";
2992 di << "Type must be one of 0 = NONE, 1 = HOR, 2 = VER, 3 = DIAG1, 4 = DIAG2\n";
2993 di << " 5 = CORNER1, 6 = CORNER2, 7 = CORNER3, 8 = CORNER4\n";
2997 Handle(AIS_InteractiveContext) AISContext = ViewerTest::GetAISContext();
2998 if(AISContext.IsNull())
3000 di << "use 'vinit' command before " << argv[0] << "\n";
3006 Standard_Real R1 = Draw::Atof(argv[1])/255.;
3007 Standard_Real G1 = Draw::Atof(argv[2])/255.;
3008 Standard_Real B1 = Draw::Atof(argv[3])/255.;
3009 Quantity_Color aColor1(R1,G1,B1,Quantity_TOC_RGB);
3011 Standard_Real R2 = Draw::Atof(argv[4])/255.;
3012 Standard_Real G2 = Draw::Atof(argv[5])/255.;
3013 Standard_Real B2 = Draw::Atof(argv[6])/255.;
3015 Quantity_Color aColor2(R2,G2,B2,Quantity_TOC_RGB);
3016 int aType = Draw::Atoi(argv[7]);
3017 if( aType < 0 || aType > 8 )
3019 di << "Wrong fill type \n";
3020 di << "Must be one of 0 = NONE, 1 = HOR, 2 = VER, 3 = DIAG1, 4 = DIAG2\n";
3021 di << " 5 = CORNER1, 6 = CORNER2, 7 = CORNER3, 8 = CORNER4\n";
3025 Aspect_GradientFillMethod aMethod = Aspect_GradientFillMethod(aType);
3027 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
3028 V3dView->SetBgGradientColors( aColor1, aColor2, aMethod, 1);
3034 //==============================================================================
3035 //function : VSetGradientBgMode
3036 //purpose : Change gradient background fill style
3037 //==============================================================================
3038 static int VSetGradientBgMode(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3042 di << "Usage : " << argv[0] << " Type : Change gradient background fill type\n";
3043 di << "Type must be one of 0 = NONE, 1 = HOR, 2 = VER, 3 = DIAG1, 4 = DIAG2\n";
3044 di << " 5 = CORNER1, 6 = CORNER2, 7 = CORNER3, 8 = CORNER4\n";
3048 Handle(AIS_InteractiveContext) AISContext = ViewerTest::GetAISContext();
3049 if(AISContext.IsNull())
3051 di << "use 'vinit' command before " << argv[0] << "\n";
3056 int aType = Draw::Atoi(argv[1]);
3057 if( aType < 0 || aType > 8 )
3059 di << "Wrong fill type \n";
3060 di << "Must be one of 0 = NONE, 1 = HOR, 2 = VER, 3 = DIAG1, 4 = DIAG2\n";
3061 di << " 5 = CORNER1, 6 = CORNER2, 7 = CORNER3, 8 = CORNER4\n";
3065 Aspect_GradientFillMethod aMethod = Aspect_GradientFillMethod(aType);
3067 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
3068 V3dView->SetBgGradientStyle( aMethod, 1 );
3074 //==============================================================================
3075 //function : VSetColorBg
3076 //purpose : Set color background
3077 //==============================================================================
3078 static int VSetColorBg(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3082 di << "Usage : " << argv[0] << " R G B : Set color background\n";
3083 di << "R,G,B = [0..255]\n";
3087 Handle(AIS_InteractiveContext) AISContext = ViewerTest::GetAISContext();
3088 if(AISContext.IsNull())
3090 di << "use 'vinit' command before " << argv[0] << "\n";
3096 Standard_Real R = Draw::Atof(argv[1])/255.;
3097 Standard_Real G = Draw::Atof(argv[2])/255.;
3098 Standard_Real B = Draw::Atof(argv[3])/255.;
3099 Quantity_Color aColor(R,G,B,Quantity_TOC_RGB);
3101 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
3102 V3dView->SetBackgroundColor( aColor );
3109 //==============================================================================
3110 //function : VSetDefaultBg
3111 //purpose : Set default viewer background fill color
3112 //==============================================================================
3113 static int VSetDefaultBg (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec)
3118 std::cout << "Error: wrong syntax! See usage:\n";
3119 theDI.PrintHelp (theArgVec[0]);
3123 ViewerTest_DefaultBackground.FillMethod =
3124 theArgNb == 4 ? Aspect_GFM_NONE
3125 : (Aspect_GradientFillMethod) Draw::Atoi (theArgVec[7]);
3129 Standard_Real R = Draw::Atof (theArgVec[1]) / 255.;
3130 Standard_Real G = Draw::Atof (theArgVec[2]) / 255.;
3131 Standard_Real B = Draw::Atof (theArgVec[3]) / 255.;
3132 ViewerTest_DefaultBackground.FlatColor.SetValues (R, G, B, Quantity_TOC_RGB);
3136 Standard_Real R1 = Draw::Atof (theArgVec[1]) / 255.;
3137 Standard_Real G1 = Draw::Atof (theArgVec[2]) / 255.;
3138 Standard_Real B1 = Draw::Atof (theArgVec[3]) / 255.;
3139 ViewerTest_DefaultBackground.GradientColor1.SetValues (R1, G1, B1, Quantity_TOC_RGB);
3141 Standard_Real R2 = Draw::Atof (theArgVec[4]) / 255.;
3142 Standard_Real G2 = Draw::Atof (theArgVec[5]) / 255.;
3143 Standard_Real B2 = Draw::Atof (theArgVec[6]) / 255.;
3144 ViewerTest_DefaultBackground.GradientColor2.SetValues (R2, G2, B2, Quantity_TOC_RGB);
3147 for (NCollection_DoubleMap<TCollection_AsciiString, Handle(AIS_InteractiveContext)>::Iterator
3148 anIter (ViewerTest_myContexts); anIter.More(); anIter.Next())
3150 const Handle(V3d_Viewer)& aViewer = anIter.Value()->CurrentViewer();
3151 aViewer->SetDefaultBackgroundColor (ViewerTest_DefaultBackground.FlatColor);
3152 aViewer->SetDefaultBgGradientColors (ViewerTest_DefaultBackground.GradientColor1,
3153 ViewerTest_DefaultBackground.GradientColor2,
3154 ViewerTest_DefaultBackground.FillMethod);
3160 //==============================================================================
3162 //purpose : View Scaling
3163 //==============================================================================
3165 static int VScale(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3167 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
3168 if ( V3dView.IsNull() ) return 1;
3171 di << argv[0] << "Invalid number of arguments\n";
3174 V3dView->SetAxialScale( Draw::Atof(argv[1]), Draw::Atof(argv[2]), Draw::Atof(argv[3]) );
3177 //==============================================================================
3178 //function : VZBuffTrihedron
3180 //==============================================================================
3182 static int VZBuffTrihedron (Draw_Interpretor& /*theDI*/,
3183 Standard_Integer theArgNb,
3184 const char** theArgVec)
3186 Handle(V3d_View) aView = ViewerTest::CurrentView();
3189 std::cout << "Error: no active viewer!\n";
3193 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), aView);
3195 Aspect_TypeOfTriedronPosition aPosition = Aspect_TOTP_LEFT_LOWER;
3196 V3d_TypeOfVisualization aVisType = V3d_ZBUFFER;
3197 Quantity_Color aLabelsColor = Quantity_NOC_WHITE;
3198 Quantity_Color anArrowColorX = Quantity_NOC_RED;
3199 Quantity_Color anArrowColorY = Quantity_NOC_GREEN;
3200 Quantity_Color anArrowColorZ = Quantity_NOC_BLUE1;
3201 Standard_Real aScale = 0.1;
3202 Standard_Real aSizeRatio = 0.8;
3203 Standard_Real anArrowDiam = 0.05;
3204 Standard_Integer aNbFacets = 12;
3205 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
3207 Standard_CString anArg = theArgVec[anArgIter];
3208 TCollection_AsciiString aFlag (anArg);
3210 if (anUpdateTool.parseRedrawMode (aFlag))
3214 else if (aFlag == "-on")
3218 else if (aFlag == "-off")
3220 aView->TriedronErase();
3223 else if (aFlag == "-pos"
3224 || aFlag == "-position"
3225 || aFlag == "-corner")
3227 if (++anArgIter >= theArgNb)
3229 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3233 TCollection_AsciiString aPosName (theArgVec[anArgIter]);
3234 aPosName.LowerCase();
3235 if (aPosName == "center")
3237 aPosition = Aspect_TOTP_CENTER;
3239 else if (aPosName == "left_lower"
3240 || aPosName == "lower_left"
3241 || aPosName == "leftlower"
3242 || aPosName == "lowerleft")
3244 aPosition = Aspect_TOTP_LEFT_LOWER;
3246 else if (aPosName == "left_upper"
3247 || aPosName == "upper_left"
3248 || aPosName == "leftupper"
3249 || aPosName == "upperleft")
3251 aPosition = Aspect_TOTP_LEFT_UPPER;
3253 else if (aPosName == "right_lower"
3254 || aPosName == "lower_right"
3255 || aPosName == "rightlower"
3256 || aPosName == "lowerright")
3258 aPosition = Aspect_TOTP_RIGHT_LOWER;
3260 else if (aPosName == "right_upper"
3261 || aPosName == "upper_right"
3262 || aPosName == "rightupper"
3263 || aPosName == "upperright")
3265 aPosition = Aspect_TOTP_RIGHT_UPPER;
3269 std::cerr << "Error: wrong syntax at '" << anArg << "' - unknown position '" << aPosName << "'\n";
3273 else if (aFlag == "-type")
3275 if (++anArgIter >= theArgNb)
3277 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3281 TCollection_AsciiString aTypeName (theArgVec[anArgIter]);
3282 aTypeName.LowerCase();
3283 if (aTypeName == "wireframe"
3284 || aTypeName == "wire")
3286 aVisType = V3d_WIREFRAME;
3288 else if (aTypeName == "zbuffer"
3289 || aTypeName == "shaded")
3291 aVisType = V3d_ZBUFFER;
3295 std::cerr << "Error: wrong syntax at '" << anArg << "' - unknown type '" << aTypeName << "'\n";
3298 else if (aFlag == "-scale")
3300 if (++anArgIter >= theArgNb)
3302 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3306 aScale = Draw::Atof (theArgVec[anArgIter]);
3308 else if (aFlag == "-size"
3309 || aFlag == "-sizeratio")
3311 if (++anArgIter >= theArgNb)
3313 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3317 aSizeRatio = Draw::Atof (theArgVec[anArgIter]);
3319 else if (aFlag == "-arrowdiam"
3320 || aFlag == "-arrowdiameter")
3322 if (++anArgIter >= theArgNb)
3324 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3328 anArrowDiam = Draw::Atof (theArgVec[anArgIter]);
3330 else if (aFlag == "-nbfacets")
3332 if (++anArgIter >= theArgNb)
3334 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3338 aNbFacets = Draw::Atoi (theArgVec[anArgIter]);
3340 else if (aFlag == "-colorlabel"
3341 || aFlag == "-colorlabels")
3343 Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgNb - anArgIter - 1,
3344 theArgVec + anArgIter + 1,
3348 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3351 anArgIter += aNbParsed;
3353 else if (aFlag == "-colorarrowx")
3355 Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgNb - anArgIter - 1,
3356 theArgVec + anArgIter + 1,
3360 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3363 anArgIter += aNbParsed;
3365 else if (aFlag == "-colorarrowy")
3367 Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgNb - anArgIter - 1,
3368 theArgVec + anArgIter + 1,
3372 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3375 anArgIter += aNbParsed;
3377 else if (aFlag == "-colorarrowz")
3379 Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgNb - anArgIter - 1,
3380 theArgVec + anArgIter + 1,
3384 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3387 anArgIter += aNbParsed;
3391 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3396 aView->ZBufferTriedronSetup (anArrowColorX.Name(), anArrowColorY.Name(), anArrowColorZ.Name(),
3397 aSizeRatio, anArrowDiam, aNbFacets);
3398 aView->TriedronDisplay (aPosition, aLabelsColor.Name(), aScale, aVisType);
3403 //==============================================================================
3404 //function : VRotate
3405 //purpose : Camera Rotating
3406 //==============================================================================
3408 static int VRotate (Draw_Interpretor& /*theDi*/, Standard_Integer theArgNb, const char** theArgVec)
3410 Handle(V3d_View) aView = ViewerTest::CurrentView();
3413 std::cout << "No active view!\n";
3417 Standard_Boolean hasFlags = Standard_False;
3418 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
3420 Standard_CString anArg (theArgVec[anArgIter]);
3421 TCollection_AsciiString aFlag (anArg);
3423 if (aFlag == "-mousestart"
3424 || aFlag == "-mousefrom")
3426 hasFlags = Standard_True;
3427 if (anArgIter + 2 >= theArgNb)
3429 std::cout << "Error: wrong syntax at '" << anArg << "'\n";
3433 Standard_Integer anX = Draw::Atoi (theArgVec[++anArgIter]);
3434 Standard_Integer anY = Draw::Atoi (theArgVec[++anArgIter]);
3435 aView->StartRotation (anX, anY);
3437 else if (aFlag == "-mousemove")
3439 hasFlags = Standard_True;
3440 if (anArgIter + 2 >= theArgNb)
3442 std::cout << "Error: wrong syntax at '" << anArg << "'\n";
3446 Standard_Integer anX = Draw::Atoi (theArgVec[++anArgIter]);
3447 Standard_Integer anY = Draw::Atoi (theArgVec[++anArgIter]);
3448 aView->Rotation (anX, anY);
3450 else if (theArgNb != 4
3453 std::cout << "Error: wrong syntax at '" << anArg << "'\n";
3462 else if (theArgNb == 4)
3464 Standard_Real anAX = Draw::Atof (theArgVec[1]);
3465 Standard_Real anAY = Draw::Atof (theArgVec[2]);
3466 Standard_Real anAZ = Draw::Atof (theArgVec[3]);
3467 aView->Rotate (anAX, anAY, anAZ);
3470 else if (theArgNb == 7)
3472 Standard_Real anAX = Draw::Atof (theArgVec[1]);
3473 Standard_Real anAY = Draw::Atof (theArgVec[2]);
3474 Standard_Real anAZ = Draw::Atof (theArgVec[3]);
3476 Standard_Real anX = Draw::Atof (theArgVec[4]);
3477 Standard_Real anY = Draw::Atof (theArgVec[5]);
3478 Standard_Real anZ = Draw::Atof (theArgVec[6]);
3480 aView->Rotate (anAX, anAY, anAZ, anX, anY, anZ);
3484 std::cout << "Error: Invalid number of arguments\n";
3488 //==============================================================================
3490 //purpose : View zoom in / out (relative to current zoom)
3491 //==============================================================================
3493 static int VZoom( Draw_Interpretor& di, Standard_Integer argc, const char** argv ) {
3494 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
3495 if ( V3dView.IsNull() ) {
3500 Standard_Real coef = Draw::Atof(argv[1]);
3501 if ( coef <= 0.0 ) {
3502 di << argv[1] << "Invalid value\n";
3505 V3dView->SetZoom( Draw::Atof(argv[1]) );
3508 di << argv[0] << " Invalid number of arguments\n";
3513 //==============================================================================
3515 //purpose : View panning (in pixels)
3516 //==============================================================================
3518 static int VPan( Draw_Interpretor& di, Standard_Integer argc, const char** argv ) {
3519 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
3520 if ( V3dView.IsNull() ) return 1;
3523 V3dView->Pan( Draw::Atoi(argv[1]), Draw::Atoi(argv[2]) );
3526 di << argv[0] << " Invalid number of arguments\n";
3531 //==============================================================================
3533 //purpose : Place the point (in pixels) at the center of the window
3534 //==============================================================================
3535 static int VPlace (Draw_Interpretor& /*theDi*/, Standard_Integer theArgNb, const char** theArgs)
3537 Handle(V3d_View) aView = ViewerTest::CurrentView();
3540 std::cerr << theArgs[0] << "Error: no active view." << std::endl;
3546 std::cerr << theArgs[0] << "Error: invalid number of arguments." << std::endl;
3550 aView->Place (Draw::Atoi (theArgs[1]), Draw::Atoi (theArgs[2]), aView->Scale());
3555 //==============================================================================
3556 //function : VExport
3557 //purpose : Export the view to a vector graphic format (PS, EMF, PDF)
3558 //==============================================================================
3560 static int VExport(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3562 Handle(V3d_View) V3dView = ViewerTest::CurrentView();
3563 if (V3dView.IsNull())
3568 std::cout << "Usage: " << argv[0] << " Filename [Format]\n";
3572 Graphic3d_ExportFormat anExpFormat = Graphic3d_EF_PDF;
3573 TCollection_AsciiString aFormatStr;
3575 TCollection_AsciiString aFileName (argv[1]);
3576 Standard_Integer aLen = aFileName.Length();
3580 aFormatStr = TCollection_AsciiString (argv[2]);
3584 if (aFileName.Value (aLen - 2) == '.')
3586 aFormatStr = aFileName.ToCString() + aLen - 2;
3588 else if (aFileName.Value (aLen - 3) == '.')
3590 aFormatStr = aFileName.ToCString() + aLen - 3;
3594 std::cout << "Export format couln't be detected from filename '" << argv[1] << "'\n";
3600 std::cout << "Export format couln't be detected from filename '" << argv[1] << "'\n";
3604 aFormatStr.UpperCase();
3605 if (aFormatStr == "PS")
3606 anExpFormat = Graphic3d_EF_PostScript;
3607 else if (aFormatStr == "EPS")
3608 anExpFormat = Graphic3d_EF_EnhPostScript;
3609 else if (aFormatStr == "TEX")
3610 anExpFormat = Graphic3d_EF_TEX;
3611 else if (aFormatStr == "PDF")
3612 anExpFormat = Graphic3d_EF_PDF;
3613 else if (aFormatStr == "SVG")
3614 anExpFormat = Graphic3d_EF_SVG;
3615 else if (aFormatStr == "PGF")
3616 anExpFormat = Graphic3d_EF_PGF;
3617 else if (aFormatStr == "EMF")
3618 anExpFormat = Graphic3d_EF_EMF;
3621 std::cout << "Invalid export format '" << aFormatStr << "'\n";
3625 Standard_DISABLE_DEPRECATION_WARNINGS
3628 if (!V3dView->Export (argv[1], anExpFormat))
3630 di << "Error: export of image to " << aFormatStr << " failed!\n";
3633 catch (Standard_Failure const& anException)
3635 di << "Error: export of image to " << aFormatStr << " failed";
3636 di << " (exception: " << anException.GetMessageString() << ")";
3638 Standard_ENABLE_DEPRECATION_WARNINGS
3642 static int VColorScale (Draw_Interpretor& theDI,
3643 Standard_Integer theArgNb,
3644 const char** theArgVec)
3646 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
3647 Handle(V3d_View) aView = ViewerTest::CurrentView();
3648 if (aContext.IsNull())
3650 std::cout << "Error: no active view!\n";
3655 std::cout << "Error: wrong syntax at command '" << theArgVec[0] << "'!\n";
3659 Handle(AIS_ColorScale) aColorScale;
3660 if (GetMapOfAIS().IsBound2 (theArgVec[1]))
3662 // find existing object
3663 aColorScale = Handle(AIS_ColorScale)::DownCast (GetMapOfAIS().Find2 (theArgVec[1]));
3664 if (aColorScale.IsNull())
3666 std::cout << "Error: object '" << theArgVec[1] << "'is already defined and is not a color scale!\n";
3673 if (aColorScale.IsNull())
3675 std::cout << "Syntax error: colorscale with a given name does not exist.\n";
3679 theDI << "Color scale parameters for '"<< theArgVec[1] << "':\n"
3680 << "Min range: " << aColorScale->GetMin() << "\n"
3681 << "Max range: " << aColorScale->GetMax() << "\n"
3682 << "Number of intervals: " << aColorScale->GetNumberOfIntervals() << "\n"
3683 << "Text height: " << aColorScale->GetTextHeight() << "\n"
3684 << "Color scale position: " << aColorScale->GetXPosition() << " " << aColorScale->GetYPosition() << "\n"
3685 << "Color scale title: " << aColorScale->GetTitle() << "\n"
3686 << "Label position: ";
3687 switch (aColorScale->GetLabelPosition())
3689 case Aspect_TOCSP_NONE:
3692 case Aspect_TOCSP_LEFT:
3695 case Aspect_TOCSP_RIGHT:
3698 case Aspect_TOCSP_CENTER:
3699 theDI << "Center\n";
3705 if (aColorScale.IsNull())
3707 aColorScale = new AIS_ColorScale();
3708 aColorScale->SetZLayer (Graphic3d_ZLayerId_TopOSD);
3709 aContext->SetTransformPersistence (aColorScale, new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_LOWER));
3712 ViewerTest_AutoUpdater anUpdateTool (aContext, aView);
3713 for (Standard_Integer anArgIter = 2; anArgIter < theArgNb; ++anArgIter)
3715 Standard_CString anArg = theArgVec[anArgIter];
3716 TCollection_AsciiString aFlag (anArg);
3718 if (anUpdateTool.parseRedrawMode (aFlag))
3722 else if (aFlag == "-range")
3724 if (anArgIter + 3 >= theArgNb)
3726 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3730 const TCollection_AsciiString aRangeMin (theArgVec[++anArgIter]);
3731 const TCollection_AsciiString aRangeMax (theArgVec[++anArgIter]);
3732 const TCollection_AsciiString aNbIntervals (theArgVec[++anArgIter]);
3733 if (!aRangeMin.IsRealValue()
3734 || !aRangeMax.IsRealValue())
3736 std::cout << "Error: the range values should be real!\n";
3739 else if (!aNbIntervals.IsIntegerValue())
3741 std::cout << "Error: the number of intervals should be integer!\n";
3745 aColorScale->SetRange (aRangeMin.RealValue(), aRangeMax.RealValue());
3746 aColorScale->SetNumberOfIntervals (aNbIntervals.IntegerValue());
3748 else if (aFlag == "-font")
3750 if (anArgIter + 1 >= theArgNb)
3752 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3755 TCollection_AsciiString aFontArg(theArgVec[anArgIter + 1]);
3756 if (!aFontArg.IsIntegerValue())
3758 std::cout << "Error: HeightFont value should be integer!\n";
3762 aColorScale->SetTextHeight (aFontArg.IntegerValue());
3765 else if (aFlag == "-textpos")
3767 if (anArgIter + 1 >= theArgNb)
3769 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3773 TCollection_AsciiString aTextPosArg(theArgVec[++anArgIter]);
3774 aTextPosArg.LowerCase();
3775 Aspect_TypeOfColorScalePosition aLabPosition = Aspect_TOCSP_NONE;
3776 if (aTextPosArg == "none")
3778 aLabPosition = Aspect_TOCSP_NONE;
3780 else if (aTextPosArg == "left")
3782 aLabPosition = Aspect_TOCSP_LEFT;
3784 else if (aTextPosArg == "right")
3786 aLabPosition = Aspect_TOCSP_RIGHT;
3788 else if (aTextPosArg == "center")
3790 aLabPosition = Aspect_TOCSP_CENTER;
3794 std::cout << "Error: unknown position '" << aTextPosArg << "'!\n";
3797 aColorScale->SetLabelPosition (aLabPosition);
3799 else if (aFlag == "-logarithmic"
3802 if (anArgIter + 1 >= theArgNb)
3804 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3808 Standard_Boolean IsLog;
3809 if (!ViewerTest::ParseOnOff(theArgVec[++anArgIter], IsLog))
3811 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3814 aColorScale->SetLogarithmic (IsLog);
3816 else if (aFlag == "-huerange"
3819 if (anArgIter + 2 >= theArgNb)
3821 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3825 const Standard_Real aHueMin = Draw::Atof (theArgVec[++anArgIter]);
3826 const Standard_Real aHueMax = Draw::Atof (theArgVec[++anArgIter]);
3827 aColorScale->SetHueRange (aHueMin, aHueMax);
3829 else if (aFlag == "-colorrange")
3831 Quantity_Color aColorMin, aColorMax;
3832 Standard_Integer aNbParsed1 = ViewerTest::ParseColor (theArgNb - (anArgIter + 1),
3833 theArgVec + (anArgIter + 1),
3835 anArgIter += aNbParsed1;
3836 Standard_Integer aNbParsed2 = ViewerTest::ParseColor (theArgNb - (anArgIter + 1),
3837 theArgVec + (anArgIter + 1),
3839 anArgIter += aNbParsed2;
3843 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3847 aColorScale->SetColorRange (aColorMin, aColorMax);
3849 else if (aFlag == "-reversed"
3850 || aFlag == "-inverted"
3851 || aFlag == "-topdown"
3852 || aFlag == "-bottomup")
3854 Standard_Boolean toEnable = Standard_True;
3855 if (anArgIter + 1 < theArgNb
3856 && ViewerTest::ParseOnOff(theArgVec[anArgIter + 1], toEnable))
3860 aColorScale->SetReversed ((aFlag == "-topdown") ? !toEnable : toEnable);
3862 else if (aFlag == "-smooth"
3863 || aFlag == "-smoothtransition")
3865 Standard_Boolean toEnable = Standard_True;
3866 if (anArgIter + 1 < theArgNb
3867 && ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], toEnable))
3871 aColorScale->SetSmoothTransition (toEnable);
3873 else if (aFlag == "-xy")
3875 if (anArgIter + 2 >= theArgNb)
3877 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3881 const TCollection_AsciiString anX (theArgVec[++anArgIter]);
3882 const TCollection_AsciiString anY (theArgVec[++anArgIter]);
3883 if (!anX.IsIntegerValue()
3884 || !anY.IsIntegerValue())
3886 std::cout << "Error: coordinates should be integer values!\n";
3890 aColorScale->SetPosition (anX.IntegerValue(), anY.IntegerValue());
3892 else if (aFlag == "-width"
3894 || aFlag == "-breadth")
3896 if (anArgIter + 1 >= theArgNb)
3898 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3902 const TCollection_AsciiString aBreadth (theArgVec[++anArgIter]);
3903 if (!aBreadth.IsIntegerValue())
3905 std::cout << "Error: a width should be an integer value!\n";
3908 aColorScale->SetBreadth (aBreadth.IntegerValue());
3910 else if (aFlag == "-height"
3913 if (anArgIter + 1 >= theArgNb)
3915 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3919 const TCollection_AsciiString aHeight (theArgVec[++anArgIter]);
3920 if (!aHeight.IsIntegerValue())
3922 std::cout << "Error: a width should be an integer value!\n";
3925 aColorScale->SetHeight (aHeight.IntegerValue());
3927 else if (aFlag == "-color")
3929 if (aColorScale->GetColorType() != Aspect_TOCSD_USER)
3931 std::cout << "Error: wrong color type! Call -colors before to set user-specified colors!\n";
3934 else if (anArgIter + 2 >= theArgNb)
3936 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3940 const TCollection_AsciiString anInd (theArgVec[++anArgIter]);
3941 if (!anInd.IsIntegerValue())
3943 std::cout << "Error: Index value should be integer!\n";
3946 const Standard_Integer anIndex = anInd.IntegerValue();
3947 if (anIndex <= 0 || anIndex > aColorScale->GetNumberOfIntervals())
3949 std::cout << "Error: Index value should be within range 1.." << aColorScale->GetNumberOfIntervals() <<"!\n";
3953 Quantity_Color aColor;
3954 Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgNb - (anArgIter + 1),
3955 theArgVec + (anArgIter + 1),
3959 std::cerr << "Error: wrong syntax at '" << anArg << "'\n";
3962 aColorScale->SetIntervalColor (aColor, anIndex);
3963 aColorScale->SetColorType (Aspect_TOCSD_USER);
3964 anArgIter += aNbParsed;
3966 else if (aFlag == "-label")
3968 if (aColorScale->GetColorType() != Aspect_TOCSD_USER)
3970 std::cout << "Error: wrong label type! Call -labels before to set user-specified labels!\n";
3973 else if (anArgIter + 2 >= theArgNb)
3975 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
3979 Standard_Integer anIndex = Draw::Atoi (theArgVec[anArgIter + 1]);
3980 if (anIndex <= 0 || anIndex > aColorScale->GetNumberOfIntervals() + 1)
3982 std::cout << "Error: Index value should be within range 1.." << aColorScale->GetNumberOfIntervals() + 1 <<"!\n";
3986 TCollection_ExtendedString aText (theArgVec[anArgIter + 2]);
3987 aColorScale->SetLabel (aText, anIndex);
3988 aColorScale->SetLabelType (Aspect_TOCSD_USER);
3991 else if (aFlag == "-labelat"
3992 || aFlag == "-labat"
3993 || aFlag == "-labelatborder"
3994 || aFlag == "-labatborder"
3995 || aFlag == "-labelatcenter"
3996 || aFlag == "-labatcenter")
3998 Standard_Boolean toEnable = Standard_True;
3999 if (aFlag == "-labelat"
4000 || aFlag == "-labat")
4002 Standard_Integer aLabAtBorder = -1;
4003 if (++anArgIter >= theArgNb)
4005 TCollection_AsciiString anAtBorder (theArgVec[anArgIter]);
4006 anAtBorder.LowerCase();
4007 if (anAtBorder == "border")
4011 else if (anAtBorder == "center")
4016 if (aLabAtBorder == -1)
4018 std::cout << "Syntax error at argument '" << anArg << "'!\n";
4021 toEnable = (aLabAtBorder == 1);
4023 else if (anArgIter + 1 < theArgNb
4024 && ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], toEnable))
4028 aColorScale->SetLabelAtBorder (aFlag == "-labelatcenter"
4029 || aFlag == "-labatcenter"
4033 else if (aFlag == "-colors")
4035 Aspect_SequenceOfColor aSeq;
4038 Quantity_Color aColor;
4039 Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgNb - (anArgIter + 1),
4040 theArgVec + (anArgIter + 1),
4046 anArgIter += aNbParsed;
4047 aSeq.Append (aColor);
4049 if (aSeq.Length() != aColorScale->GetNumberOfIntervals())
4051 std::cout << "Error: not enough arguments! You should provide color names or RGB color values for every interval of the "
4052 << aColorScale->GetNumberOfIntervals() << " intervals\n";
4056 aColorScale->SetColors (aSeq);
4057 aColorScale->SetColorType (Aspect_TOCSD_USER);
4059 else if (aFlag == "-labels"
4060 || aFlag == "-freelabels")
4062 if (anArgIter + 1 >= theArgNb)
4064 std::cout << "Syntax error at argument '" << anArg << "'!\n";
4068 Standard_Integer aNbLabels = aColorScale->IsLabelAtBorder()
4069 ? aColorScale->GetNumberOfIntervals() + 1
4070 : aColorScale->GetNumberOfIntervals();
4071 if (aFlag == "-freelabels")
4074 aNbLabels = Draw::Atoi (theArgVec[anArgIter]);
4076 if (anArgIter + aNbLabels >= theArgNb)
4078 std::cout << "Error: not enough arguments! " << aNbLabels << " text labels are expected.\n";
4082 TColStd_SequenceOfExtendedString aSeq;
4083 for (Standard_Integer aLabelIter = 0; aLabelIter < aNbLabels; ++aLabelIter)
4085 aSeq.Append (TCollection_ExtendedString (theArgVec[++anArgIter]));
4087 aColorScale->SetLabels (aSeq);
4088 aColorScale->SetLabelType (Aspect_TOCSD_USER);
4090 else if (aFlag == "-title")
4092 if (anArgIter + 1 >= theArgNb)
4094 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
4098 Standard_Boolean isTwoArgs = Standard_False;
4099 if (anArgIter + 2 < theArgNb)
4101 TCollection_AsciiString aSecondArg (theArgVec[anArgIter + 2]);
4102 aSecondArg.LowerCase();
4103 Standard_DISABLE_DEPRECATION_WARNINGS
4104 if (aSecondArg == "none")
4106 aColorScale->SetTitlePosition (Aspect_TOCSP_NONE);
4107 isTwoArgs = Standard_True;
4109 else if (aSecondArg == "left")
4111 aColorScale->SetTitlePosition (Aspect_TOCSP_LEFT);
4112 isTwoArgs = Standard_True;
4114 else if (aSecondArg == "right")
4116 aColorScale->SetTitlePosition (Aspect_TOCSP_RIGHT);
4117 isTwoArgs = Standard_True;
4119 else if (aSecondArg == "center")
4121 aColorScale->SetTitlePosition (Aspect_TOCSP_CENTER);
4122 isTwoArgs = Standard_True;
4124 Standard_ENABLE_DEPRECATION_WARNINGS
4127 aColorScale->SetTitle (theArgVec[anArgIter + 1]);
4134 else if (aFlag == "-demoversion"
4135 || aFlag == "-demo")
4137 aColorScale->SetPosition (0, 0);
4138 aColorScale->SetTextHeight (16);
4139 aColorScale->SetRange (0.0, 100.0);
4140 aColorScale->SetNumberOfIntervals (10);
4141 aColorScale->SetBreadth (0);
4142 aColorScale->SetHeight (0);
4143 aColorScale->SetLabelPosition (Aspect_TOCSP_RIGHT);
4144 aColorScale->SetColorType (Aspect_TOCSD_AUTO);
4145 aColorScale->SetLabelType (Aspect_TOCSD_AUTO);
4147 else if (aFlag == "-findcolor")
4149 if (anArgIter + 1 >= theArgNb)
4151 std::cout << "Error: wrong syntax at argument '" << anArg << "'!\n";
4155 TCollection_AsciiString anArg1 (theArgVec[++anArgIter]);
4157 if (!anArg1.IsRealValue())
4159 std::cout << "Error: the value should be real!\n";
4163 Quantity_Color aColor;
4164 aColorScale->FindColor (anArg1.RealValue(), aColor);
4165 theDI << Quantity_Color::StringName (aColor.Name());
4170 std::cout << "Error: wrong syntax at " << anArg << " - unknown argument!\n";
4175 Standard_Integer aWinWidth = 0, aWinHeight = 0;
4176 aView->Window()->Size (aWinWidth, aWinHeight);
4177 if (aColorScale->GetBreadth() == 0)
4179 aColorScale->SetBreadth (aWinWidth);
4181 if (aColorScale->GetHeight() == 0)
4183 aColorScale->SetHeight (aWinHeight);
4185 aColorScale->SetToUpdate();
4186 ViewerTest::Display (theArgVec[1], aColorScale, Standard_False, Standard_True);
4190 //==============================================================================
4191 //function : VGraduatedTrihedron
4192 //purpose : Displays or hides a graduated trihedron
4193 //==============================================================================
4194 static Standard_Boolean GetColor (const TCollection_AsciiString& theValue,
4195 Quantity_Color& theColor)
4197 Quantity_NameOfColor aColorName;
4198 TCollection_AsciiString aVal = theValue;
4200 if (!Quantity_Color::ColorFromName (aVal.ToCString(), aColorName))
4202 return Standard_False;
4204 theColor = Quantity_Color (aColorName);
4205 return Standard_True;
4208 static int VGraduatedTrihedron (Draw_Interpretor& /*theDi*/, Standard_Integer theArgNum, const char** theArgs)
4212 std::cout << theArgs[0] << " error: wrong number of parameters. Type 'help"
4213 << theArgs[0] <<"' for more information.\n";
4214 return 1; //TCL_ERROR
4217 NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)> aMapOfArgs;
4218 TCollection_AsciiString aParseKey;
4219 for (Standard_Integer anArgIt = 1; anArgIt < theArgNum; ++anArgIt)
4221 TCollection_AsciiString anArg (theArgs [anArgIt]);
4223 if (anArg.Value (1) == '-' && !anArg.IsRealValue())
4226 aParseKey.Remove (1);
4227 aParseKey.LowerCase();
4228 aMapOfArgs.Bind (aParseKey, new TColStd_HSequenceOfAsciiString);
4232 if (aParseKey.IsEmpty())
4237 aMapOfArgs(aParseKey)->Append (anArg);
4241 for (NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)>::Iterator aMapIt (aMapOfArgs);
4242 aMapIt.More(); aMapIt.Next())
4244 const TCollection_AsciiString& aKey = aMapIt.Key();
4245 const Handle(TColStd_HSequenceOfAsciiString)& anArgs = aMapIt.Value();
4247 // Bool key, without arguments
4248 if ((aKey.IsEqual ("on") || aKey.IsEqual ("off"))
4249 && anArgs->IsEmpty())
4255 if ( (aKey.IsEqual ("xname") || aKey.IsEqual ("yname") || aKey.IsEqual ("zname"))
4256 && anArgs->Length() == 1)
4262 if ((aKey.IsEqual ("xdrawname") || aKey.IsEqual ("ydrawname") || aKey.IsEqual ("zdrawname")
4263 || aKey.IsEqual ("xdrawticks") || aKey.IsEqual ("ydrawticks") || aKey.IsEqual ("zdrawticks")
4264 || aKey.IsEqual ("xdrawvalues") || aKey.IsEqual ("ydrawvalues") || aKey.IsEqual ("zdrawvalues")
4265 || aKey.IsEqual ("drawgrid") || aKey.IsEqual ("drawaxes"))
4266 && anArgs->Length() == 1 && (anArgs->Value(1).IsEqual ("on") || anArgs->Value(1).IsEqual ("off")))
4271 // One string argument
4272 if ( (aKey.IsEqual ("xnamecolor") || aKey.IsEqual ("ynamecolor") || aKey.IsEqual ("znamecolor")
4273 || aKey.IsEqual ("xcolor") || aKey.IsEqual ("ycolor") || aKey.IsEqual ("zcolor"))
4274 && anArgs->Length() == 1 && !anArgs->Value(1).IsIntegerValue() && !anArgs->Value(1).IsRealValue())
4279 // One integer argument
4280 if ( (aKey.IsEqual ("xticks") || aKey.IsEqual ("yticks") || aKey.IsEqual ("zticks")
4281 || aKey.IsEqual ("xticklength") || aKey.IsEqual ("yticklength") || aKey.IsEqual ("zticklength")
4282 || aKey.IsEqual ("xnameoffset") || aKey.IsEqual ("ynameoffset") || aKey.IsEqual ("znameoffset")
4283 || aKey.IsEqual ("xvaluesoffset") || aKey.IsEqual ("yvaluesoffset") || aKey.IsEqual ("zvaluesoffset"))
4284 && anArgs->Length() == 1 && anArgs->Value(1).IsIntegerValue())
4289 // One real argument
4290 if ( aKey.IsEqual ("arrowlength")
4291 && anArgs->Length() == 1 && (anArgs->Value(1).IsIntegerValue() || anArgs->Value(1).IsRealValue()))
4296 // Two string arguments
4297 if ( (aKey.IsEqual ("namefont") || aKey.IsEqual ("valuesfont"))
4298 && anArgs->Length() == 1 && !anArgs->Value(1).IsIntegerValue() && !anArgs->Value(1).IsRealValue())
4303 TCollection_AsciiString aLowerKey;
4306 aLowerKey.LowerCase();
4307 std::cout << theArgs[0] << ": " << aLowerKey << " is unknown option, or the arguments are unacceptable.\n";
4308 std::cout << "Type help for more information.\n";
4312 Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
4313 if (anAISContext.IsNull())
4315 std::cout << theArgs[0] << ": please use 'vinit' command to initialize view.\n";
4319 Standard_Boolean toDisplay = Standard_True;
4320 Quantity_Color aColor;
4321 Graphic3d_GraduatedTrihedron aTrihedronData;
4322 // Process parameters
4323 Handle(TColStd_HSequenceOfAsciiString) aValues;
4324 if (aMapOfArgs.Find ("off", aValues))
4326 toDisplay = Standard_False;
4330 if (aMapOfArgs.Find ("xname", aValues))
4332 aTrihedronData.ChangeXAxisAspect().SetName (aValues->Value(1));
4334 if (aMapOfArgs.Find ("yname", aValues))
4336 aTrihedronData.ChangeYAxisAspect().SetName (aValues->Value(1));
4338 if (aMapOfArgs.Find ("zname", aValues))
4340 aTrihedronData.ChangeZAxisAspect().SetName (aValues->Value(1));
4342 if (aMapOfArgs.Find ("xdrawname", aValues))
4344 aTrihedronData.ChangeXAxisAspect().SetDrawName (aValues->Value(1).IsEqual ("on"));
4346 if (aMapOfArgs.Find ("ydrawname", aValues))
4348 aTrihedronData.ChangeYAxisAspect().SetDrawName (aValues->Value(1).IsEqual ("on"));
4350 if (aMapOfArgs.Find ("zdrawname", aValues))
4352 aTrihedronData.ChangeZAxisAspect().SetDrawName (aValues->Value(1).IsEqual ("on"));
4354 if (aMapOfArgs.Find ("xnameoffset", aValues))
4356 aTrihedronData.ChangeXAxisAspect().SetNameOffset (aValues->Value(1).IntegerValue());
4358 if (aMapOfArgs.Find ("ynameoffset", aValues))
4360 aTrihedronData.ChangeYAxisAspect().SetNameOffset (aValues->Value(1).IntegerValue());
4362 if (aMapOfArgs.Find ("znameoffset", aValues))
4364 aTrihedronData.ChangeZAxisAspect().SetNameOffset (aValues->Value(1).IntegerValue());
4368 if (aMapOfArgs.Find ("xnamecolor", aValues))
4370 if (!GetColor (aValues->Value(1), aColor))
4372 std::cout << theArgs[0] << "error: -xnamecolor wrong color name.\n";
4375 aTrihedronData.ChangeXAxisAspect().SetNameColor (aColor);
4377 if (aMapOfArgs.Find ("ynamecolor", aValues))
4379 if (!GetColor (aValues->Value(1), aColor))
4381 std::cout << theArgs[0] << "error: -ynamecolor wrong color name.\n";
4384 aTrihedronData.ChangeYAxisAspect().SetNameColor (aColor);
4386 if (aMapOfArgs.Find ("znamecolor", aValues))
4388 if (!GetColor (aValues->Value(1), aColor))
4390 std::cout << theArgs[0] << "error: -znamecolor wrong color name.\n";
4393 aTrihedronData.ChangeZAxisAspect().SetNameColor (aColor);
4395 if (aMapOfArgs.Find ("xcolor", aValues))
4397 if (!GetColor (aValues->Value(1), aColor))
4399 std::cout << theArgs[0] << "error: -xcolor wrong color name.\n";
4402 aTrihedronData.ChangeXAxisAspect().SetColor (aColor);
4404 if (aMapOfArgs.Find ("ycolor", aValues))
4406 if (!GetColor (aValues->Value(1), aColor))
4408 std::cout << theArgs[0] << "error: -ycolor wrong color name.\n";
4411 aTrihedronData.ChangeYAxisAspect().SetColor (aColor);
4413 if (aMapOfArgs.Find ("zcolor", aValues))
4415 if (!GetColor (aValues->Value(1), aColor))
4417 std::cout << theArgs[0] << "error: -zcolor wrong color name.\n";
4420 aTrihedronData.ChangeZAxisAspect().SetColor (aColor);
4424 if (aMapOfArgs.Find ("xticks", aValues))
4426 aTrihedronData.ChangeXAxisAspect().SetTickmarksNumber (aValues->Value(1).IntegerValue());
4428 if (aMapOfArgs.Find ("yticks", aValues))
4430 aTrihedronData.ChangeYAxisAspect().SetTickmarksNumber (aValues->Value(1).IntegerValue());
4432 if (aMapOfArgs.Find ("zticks", aValues))
4434 aTrihedronData.ChangeZAxisAspect().SetTickmarksNumber (aValues->Value(1).IntegerValue());
4436 if (aMapOfArgs.Find ("xticklength", aValues))
4438 aTrihedronData.ChangeXAxisAspect().SetTickmarksLength (aValues->Value(1).IntegerValue());
4440 if (aMapOfArgs.Find ("yticklength", aValues))
4442 aTrihedronData.ChangeYAxisAspect().SetTickmarksLength (aValues->Value(1).IntegerValue());
4444 if (aMapOfArgs.Find ("zticklength", aValues))
4446 aTrihedronData.ChangeZAxisAspect().SetTickmarksLength (aValues->Value(1).IntegerValue());
4448 if (aMapOfArgs.Find ("xdrawticks", aValues))
4450 aTrihedronData.ChangeXAxisAspect().SetDrawTickmarks (aValues->Value(1).IsEqual ("on"));
4452 if (aMapOfArgs.Find ("ydrawticks", aValues))
4454 aTrihedronData.ChangeYAxisAspect().SetDrawTickmarks (aValues->Value(1).IsEqual ("on"));
4456 if (aMapOfArgs.Find ("zdrawticks", aValues))
4458 aTrihedronData.ChangeZAxisAspect().SetDrawTickmarks (aValues->Value(1).IsEqual ("on"));
4462 if (aMapOfArgs.Find ("xdrawvalues", aValues))
4464 aTrihedronData.ChangeXAxisAspect().SetDrawValues (aValues->Value(1).IsEqual ("on"));
4466 if (aMapOfArgs.Find ("ydrawvalues", aValues))
4468 aTrihedronData.ChangeYAxisAspect().SetDrawValues (aValues->Value(1).IsEqual ("on"));
4470 if (aMapOfArgs.Find ("zdrawvalues", aValues))
4472 aTrihedronData.ChangeZAxisAspect().SetDrawValues (aValues->Value(1).IsEqual ("on"));
4474 if (aMapOfArgs.Find ("xvaluesoffset", aValues))
4476 aTrihedronData.ChangeXAxisAspect().SetValuesOffset (aValues->Value(1).IntegerValue());
4478 if (aMapOfArgs.Find ("yvaluesoffset", aValues))
4480 aTrihedronData.ChangeYAxisAspect().SetValuesOffset (aValues->Value(1).IntegerValue());
4482 if (aMapOfArgs.Find ("zvaluesoffset", aValues))
4484 aTrihedronData.ChangeZAxisAspect().SetValuesOffset (aValues->Value(1).IntegerValue());
4488 if (aMapOfArgs.Find ("arrowlength", aValues))
4490 aTrihedronData.SetArrowsLength ((Standard_ShortReal) aValues->Value(1).RealValue());
4494 if (aMapOfArgs.Find ("namefont", aValues))
4496 aTrihedronData.SetNamesFont (aValues->Value(1));
4498 if (aMapOfArgs.Find ("valuesfont", aValues))
4500 aTrihedronData.SetValuesFont (aValues->Value(1));
4503 if (aMapOfArgs.Find ("drawgrid", aValues))
4505 aTrihedronData.SetDrawGrid (aValues->Value(1).IsEqual ("on"));
4507 if (aMapOfArgs.Find ("drawaxes", aValues))
4509 aTrihedronData.SetDrawAxes (aValues->Value(1).IsEqual ("on"));
4512 // The final step: display of erase trihedron
4515 ViewerTest::CurrentView()->GraduatedTrihedronDisplay (aTrihedronData);
4519 ViewerTest::CurrentView()->GraduatedTrihedronErase();
4522 ViewerTest::GetAISContext()->UpdateCurrentViewer();
4523 ViewerTest::CurrentView()->Redraw();
4528 //==============================================================================
4531 //==============================================================================
4532 static int VTile (Draw_Interpretor& theDI,
4533 Standard_Integer theArgNb,
4534 const char** theArgVec)
4536 Handle(V3d_View) aView = ViewerTest::CurrentView();
4539 std::cerr << "Error: no active viewer.\n";
4543 Graphic3d_CameraTile aTile = aView->Camera()->Tile();
4546 theDI << "Total size: " << aTile.TotalSize.x() << " " << aTile.TotalSize.y() << "\n"
4547 << "Tile size: " << aTile.TileSize.x() << " " << aTile.TileSize.y() << "\n"
4548 << "Lower left: " << aTile.Offset.x() << " " << aTile.Offset.y() << "\n";
4552 aView->Window()->Size (aTile.TileSize.x(), aTile.TileSize.y());
4553 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
4555 TCollection_AsciiString anArg (theArgVec[anArgIter]);
4557 if (anArg == "-lowerleft"
4558 || anArg == "-upperleft")
4560 if (anArgIter + 3 < theArgNb)
4562 std::cerr << "Syntax error at '" << theArgVec[anArgIter] << "'.\n";
4565 aTile.IsTopDown = (anArg == "-upperleft") == Standard_True;
4566 aTile.Offset.x() = Draw::Atoi (theArgVec[anArgIter + 1]);
4567 aTile.Offset.y() = Draw::Atoi (theArgVec[anArgIter + 2]);
4569 else if (anArg == "-total"
4570 || anArg == "-totalsize"
4571 || anArg == "-viewsize")
4573 if (anArgIter + 3 < theArgNb)
4575 std::cerr << "Syntax error at '" << theArgVec[anArgIter] << "'.\n";
4578 aTile.TotalSize.x() = Draw::Atoi (theArgVec[anArgIter + 1]);
4579 aTile.TotalSize.y() = Draw::Atoi (theArgVec[anArgIter + 2]);
4580 if (aTile.TotalSize.x() < 1
4581 || aTile.TotalSize.y() < 1)
4583 std::cerr << "Error: total size is incorrect.\n";
4587 else if (anArg == "-tilesize")
4589 if (anArgIter + 3 < theArgNb)
4591 std::cerr << "Syntax error at '" << theArgVec[anArgIter] << "'.\n";
4595 aTile.TileSize.x() = Draw::Atoi (theArgVec[anArgIter + 1]);
4596 aTile.TileSize.y() = Draw::Atoi (theArgVec[anArgIter + 2]);
4597 if (aTile.TileSize.x() < 1
4598 || aTile.TileSize.y() < 1)
4600 std::cerr << "Error: tile size is incorrect.\n";
4604 else if (anArg == "-unset")
4606 aView->Camera()->SetTile (Graphic3d_CameraTile());
4612 if (aTile.TileSize.x() < 1
4613 || aTile.TileSize.y() < 1)
4615 std::cerr << "Error: tile size is undefined.\n";
4618 else if (aTile.TotalSize.x() < 1
4619 || aTile.TotalSize.y() < 1)
4621 std::cerr << "Error: total size is undefined.\n";
4625 aView->Camera()->SetTile (aTile);
4630 //! Format ZLayer ID.
4631 inline const char* formZLayerId (const Standard_Integer theLayerId)
4635 case Graphic3d_ZLayerId_UNKNOWN: return "[INVALID]";
4636 case Graphic3d_ZLayerId_Default: return "[DEFAULT]";
4637 case Graphic3d_ZLayerId_Top: return "[TOP]";
4638 case Graphic3d_ZLayerId_Topmost: return "[TOPMOST]";
4639 case Graphic3d_ZLayerId_TopOSD: return "[OVERLAY]";
4640 case Graphic3d_ZLayerId_BotOSD: return "[UNDERLAY]";
4645 //! Print the ZLayer information.
4646 inline void printZLayerInfo (Draw_Interpretor& theDI,
4647 const Graphic3d_ZLayerSettings& theLayer)
4649 if (!theLayer.Name().IsEmpty())
4651 theDI << " Name: " << theLayer.Name() << "\n";
4653 if (theLayer.IsImmediate())
4655 theDI << " Immediate: TRUE\n";
4657 theDI << " Origin: " << theLayer.Origin().X() << " " << theLayer.Origin().Y() << " " << theLayer.Origin().Z() << "\n";
4658 theDI << " Depth test: " << (theLayer.ToEnableDepthTest() ? "enabled" : "disabled") << "\n";
4659 theDI << " Depth write: " << (theLayer.ToEnableDepthWrite() ? "enabled" : "disabled") << "\n";
4660 theDI << " Depth buffer clearing: " << (theLayer.ToClearDepth() ? "enabled" : "disabled") << "\n";
4661 if (theLayer.PolygonOffset().Mode != Aspect_POM_None)
4663 theDI << " Depth offset: " << theLayer.PolygonOffset().Factor << " " << theLayer.PolygonOffset().Units << "\n";
4667 //==============================================================================
4668 //function : VZLayer
4669 //purpose : Test z layer operations for v3d viewer
4670 //==============================================================================
4671 static int VZLayer (Draw_Interpretor& theDI,
4672 Standard_Integer theArgNb,
4673 const char** theArgVec)
4675 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
4676 if (aContextAIS.IsNull())
4678 std::cout << "No active viewer!\n";
4682 const Handle(V3d_Viewer)& aViewer = aContextAIS->CurrentViewer();
4685 TColStd_SequenceOfInteger aLayers;
4686 aViewer->GetAllZLayers (aLayers);
4687 for (TColStd_SequenceOfInteger::Iterator aLayeriter (aLayers); aLayeriter.More(); aLayeriter.Next())
4689 theDI << "ZLayer " << aLayeriter.Value() << " " << formZLayerId (aLayeriter.Value()) << "\n";
4690 Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (aLayeriter.Value());
4691 printZLayerInfo (theDI, aSettings);
4696 Standard_Integer anArgIter = 1;
4697 Standard_Integer aLayerId = Graphic3d_ZLayerId_UNKNOWN;
4698 ViewerTest_AutoUpdater anUpdateTool (aContextAIS, ViewerTest::CurrentView());
4699 if (anUpdateTool.parseRedrawMode (theArgVec[anArgIter]))
4704 TCollection_AsciiString aFirstArg (theArgVec[anArgIter]);
4705 if (aFirstArg.IsIntegerValue())
4708 aLayerId = aFirstArg.IntegerValue();
4712 aFirstArg.LowerCase();
4713 if (aFirstArg == "default"
4714 || aFirstArg == "def")
4716 aLayerId = Graphic3d_ZLayerId_Default;
4719 else if (aFirstArg == "top")
4721 aLayerId = Graphic3d_ZLayerId_Top;
4724 else if (aFirstArg == "topmost")
4726 aLayerId = Graphic3d_ZLayerId_Topmost;
4729 else if (aFirstArg == "overlay"
4730 || aFirstArg == "toposd")
4732 aLayerId = Graphic3d_ZLayerId_TopOSD;
4735 else if (aFirstArg == "underlay"
4736 || aFirstArg == "botosd")
4738 aLayerId = Graphic3d_ZLayerId_BotOSD;
4743 TColStd_SequenceOfInteger aLayers;
4744 aViewer->GetAllZLayers (aLayers);
4745 for (TColStd_SequenceOfInteger::Iterator aLayeriter (aLayers); aLayeriter.More(); aLayeriter.Next())
4747 Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (aLayeriter.Value());
4748 if (TCollection_AsciiString::IsSameString (aSettings.Name(), aFirstArg, Standard_False))
4750 aLayerId = aLayeriter.Value();
4758 for (; anArgIter < theArgNb; ++anArgIter)
4760 // perform operation
4761 TCollection_AsciiString anArg (theArgVec[anArgIter]);
4763 if (anUpdateTool.parseRedrawMode (anArg))
4767 else if (anArg == "-add"
4770 aLayerId = Graphic3d_ZLayerId_UNKNOWN;
4771 if (!aViewer->AddZLayer (aLayerId))
4773 std::cout << "Error: can not add a new z layer!\n";
4779 else if (anArg == "-del"
4780 || anArg == "-delete"
4783 if (aLayerId == Graphic3d_ZLayerId_UNKNOWN)
4785 if (++anArgIter >= theArgNb)
4787 std::cout << "Syntax error: id of z layer to remove is missing\n";
4791 aLayerId = Draw::Atoi (theArgVec[anArgIter]);
4794 if (aLayerId == Graphic3d_ZLayerId_UNKNOWN
4795 || aLayerId == Graphic3d_ZLayerId_Default
4796 || aLayerId == Graphic3d_ZLayerId_Top
4797 || aLayerId == Graphic3d_ZLayerId_Topmost
4798 || aLayerId == Graphic3d_ZLayerId_TopOSD
4799 || aLayerId == Graphic3d_ZLayerId_BotOSD)
4801 std::cout << "Syntax error: standard Z layer can not be removed\n";
4805 // move all object displayed in removing layer to default layer
4806 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anObjIter (GetMapOfAIS());
4807 anObjIter.More(); anObjIter.Next())
4809 Handle(PrsMgr_PresentableObject) aPrs = Handle(PrsMgr_PresentableObject)::DownCast (anObjIter.Key1());
4811 || aPrs->ZLayer() != aLayerId)
4815 aPrs->SetZLayer (Graphic3d_ZLayerId_Default);
4818 if (!aViewer->RemoveZLayer (aLayerId))
4820 std::cout << "Z layer can not be removed!\n";
4824 theDI << aLayerId << " ";
4827 else if (anArg == "-get"
4830 TColStd_SequenceOfInteger aLayers;
4831 aViewer->GetAllZLayers (aLayers);
4832 for (TColStd_SequenceOfInteger::Iterator aLayeriter (aLayers); aLayeriter.More(); aLayeriter.Next())
4834 theDI << aLayeriter.Value() << " ";
4839 else if (anArg == "-name")
4841 if (aLayerId == Graphic3d_ZLayerId_UNKNOWN)
4843 std::cout << "Syntax error: id of Z layer is missing\n";
4847 if (++anArgIter >= theArgNb)
4849 std::cout << "Syntax error: name is missing\n";
4853 Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (aLayerId);
4854 aSettings.SetName (theArgVec[anArgIter]);
4855 aViewer->SetZLayerSettings (aLayerId, aSettings);
4857 else if (anArg == "-origin")
4859 if (aLayerId == Graphic3d_ZLayerId_UNKNOWN)
4861 std::cout << "Syntax error: id of Z layer is missing\n";
4865 if (anArgIter + 2 >= theArgNb)
4867 std::cout << "Syntax error: origin coordinates are missing\n";
4871 Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (aLayerId);
4873 anOrigin.SetX (Draw::Atof (theArgVec[anArgIter + 1]));
4874 anOrigin.SetY (Draw::Atof (theArgVec[anArgIter + 2]));
4875 anOrigin.SetZ (0.0);
4876 if (anArgIter + 3 < theArgNb)
4878 anOrigin.SetZ (Draw::Atof (theArgVec[anArgIter + 3]));
4885 aSettings.SetOrigin (anOrigin);
4886 aViewer->SetZLayerSettings (aLayerId, aSettings);
4888 else if (anArg == "-settings"
4889 || anArg == "settings")
4891 if (aLayerId == Graphic3d_ZLayerId_UNKNOWN)
4893 if (++anArgIter >= theArgNb)
4895 std::cout << "Syntax error: id of Z layer is missing\n";
4899 aLayerId = Draw::Atoi (theArgVec[anArgIter]);
4902 Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (aLayerId);
4903 printZLayerInfo (theDI, aSettings);
4905 else if (anArg == "-enable"
4906 || anArg == "enable"
4907 || anArg == "-disable"
4908 || anArg == "disable")
4910 const Standard_Boolean toEnable = anArg == "-enable"
4911 || anArg == "enable";
4912 if (++anArgIter >= theArgNb)
4914 std::cout << "Syntax error: option name is missing\n";
4918 TCollection_AsciiString aSubOp (theArgVec[anArgIter]);
4920 if (aLayerId == Graphic3d_ZLayerId_UNKNOWN)
4922 if (++anArgIter >= theArgNb)
4924 std::cout << "Syntax error: id of Z layer is missing\n";
4928 aLayerId = Draw::Atoi (theArgVec[anArgIter]);
4931 Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (aLayerId);
4932 if (aSubOp == "depthtest"
4933 || aSubOp == "test")
4935 aSettings.SetEnableDepthTest (toEnable);
4937 else if (aSubOp == "depthwrite"
4938 || aSubOp == "write")
4940 aSettings.SetEnableDepthWrite (toEnable);
4942 else if (aSubOp == "depthclear"
4943 || aSubOp == "clear")
4945 aSettings.SetClearDepth (toEnable);
4947 else if (aSubOp == "depthoffset"
4948 || aSubOp == "offset")
4950 Graphic3d_PolygonOffset aParams;
4951 aParams.Mode = toEnable ? Aspect_POM_Fill : Aspect_POM_None;
4954 if (anArgIter + 2 >= theArgNb)
4956 std::cout << "Syntax error: factor and units values for depth offset are missing\n";
4960 aParams.Factor = static_cast<Standard_ShortReal> (Draw::Atof (theArgVec[++anArgIter]));
4961 aParams.Units = static_cast<Standard_ShortReal> (Draw::Atof (theArgVec[++anArgIter]));
4963 aSettings.SetPolygonOffset (aParams);
4965 else if (aSubOp == "positiveoffset"
4966 || aSubOp == "poffset")
4970 aSettings.SetDepthOffsetPositive();
4974 aSettings.SetPolygonOffset (Graphic3d_PolygonOffset());
4977 else if (aSubOp == "negativeoffset"
4978 || aSubOp == "noffset")
4982 aSettings.SetDepthOffsetNegative();
4986 aSettings.SetPolygonOffset(Graphic3d_PolygonOffset());
4989 else if (aSubOp == "textureenv")
4991 aSettings.SetEnvironmentTexture (toEnable);
4994 aViewer->SetZLayerSettings (aLayerId, aSettings);
4998 std::cout << "Syntax error: unknown option " << theArgVec[anArgIter] << "\n";
5006 // The interactive presentation of 2d layer item
5007 // for "vlayerline" command it provides a presentation of
5008 // line with user-defined linewidth, linetype and transparency.
5009 class V3d_LineItem : public AIS_InteractiveObject
5013 DEFINE_STANDARD_RTTI_INLINE(V3d_LineItem,AIS_InteractiveObject)
5016 Standard_EXPORT V3d_LineItem(Standard_Real X1, Standard_Real Y1,
5017 Standard_Real X2, Standard_Real Y2,
5018 Aspect_TypeOfLine theType = Aspect_TOL_SOLID,
5019 Standard_Real theWidth = 0.5,
5020 Standard_Real theTransp = 1.0);
5024 void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager,
5025 const Handle(Prs3d_Presentation)& thePresentation,
5026 const Standard_Integer theMode) Standard_OVERRIDE;
5028 void ComputeSelection (const Handle(SelectMgr_Selection)& /*aSelection*/,
5029 const Standard_Integer /*aMode*/) Standard_OVERRIDE
5034 Standard_Real myX1, myY1, myX2, myY2;
5035 Aspect_TypeOfLine myType;
5036 Standard_Real myWidth;
5039 // default constructor for line item
5040 V3d_LineItem::V3d_LineItem(Standard_Real X1, Standard_Real Y1,
5041 Standard_Real X2, Standard_Real Y2,
5042 Aspect_TypeOfLine theType,
5043 Standard_Real theWidth,
5044 Standard_Real theTransp) :
5045 myX1(X1), myY1(Y1), myX2(X2), myY2(Y2),
5046 myType(theType), myWidth(theWidth)
5048 SetTransparency (1-theTransp);
5052 void V3d_LineItem::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePresentationManager*/,
5053 const Handle(Prs3d_Presentation)& thePresentation,
5054 const Standard_Integer /*theMode*/)
5056 thePresentation->Clear();
5057 Quantity_Color aColor (1.0, 0, 0, Quantity_TOC_RGB);
5058 Standard_Integer aWidth, aHeight;
5059 ViewerTest::CurrentView()->Window()->Size (aWidth, aHeight);
5060 Handle (Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation);
5061 Handle(Graphic3d_ArrayOfPolylines) aPrim = new Graphic3d_ArrayOfPolylines(5);
5062 aPrim->AddVertex(myX1, aHeight-myY1, 0.);
5063 aPrim->AddVertex(myX2, aHeight-myY2, 0.);
5064 Handle(Prs3d_LineAspect) anAspect = new Prs3d_LineAspect (aColor, (Aspect_TypeOfLine)myType, myWidth);
5065 aGroup->SetPrimitivesAspect (anAspect->Aspect());
5066 aGroup->AddPrimitiveArray (aPrim);
5069 //=============================================================================
5070 //function : VLayerLine
5071 //purpose : Draws line in the v3d view layer with given attributes: linetype,
5072 // : linewidth, transparency coefficient
5073 //============================================================================
5074 static int VLayerLine(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
5076 // get the active view
5077 Handle(V3d_View) aView = ViewerTest::CurrentView();
5080 di << "Call vinit before!\n";
5085 di << "Use: " << argv[0];
5086 di << " x1 y1 x2 y2 [linewidth = 0.5] [linetype = 0] [transparency = 1]\n";
5087 di << " linetype : { 0 | 1 | 2 | 3 } \n";
5088 di << " 0 - solid \n";
5089 di << " 1 - dashed \n";
5090 di << " 2 - dot \n";
5091 di << " 3 - dashdot\n";
5092 di << " transparency : { 0.0 - 1.0 } \n";
5093 di << " 0.0 - transparent\n";
5094 di << " 1.0 - visible \n";
5098 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
5099 // get the input params
5100 Standard_Real X1 = Draw::Atof(argv[1]);
5101 Standard_Real Y1 = Draw::Atof(argv[2]);
5102 Standard_Real X2 = Draw::Atof(argv[3]);
5103 Standard_Real Y2 = Draw::Atof(argv[4]);
5105 Standard_Real aWidth = 0.5;
5106 Standard_Real aTransparency = 1.0;
5110 aWidth = Draw::Atof(argv[5]);
5112 // select appropriate line type
5113 Aspect_TypeOfLine aLineType = Aspect_TOL_SOLID;
5115 && !ViewerTest::ParseLineType (argv[6], aLineType))
5117 std::cout << "Syntax error: unknown line type '" << argv[6] << "'\n";
5124 aTransparency = Draw::Atof(argv[7]);
5125 if (aTransparency < 0 || aTransparency > 1.0)
5126 aTransparency = 1.0;
5129 static Handle (V3d_LineItem) aLine;
5130 if (!aLine.IsNull())
5132 aContext->Erase (aLine, Standard_False);
5134 aLine = new V3d_LineItem (X1, Y1, X2, Y2,
5138 aContext->SetTransformPersistence (aLine, new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_LOWER));
5139 aLine->SetZLayer (Graphic3d_ZLayerId_TopOSD);
5140 aLine->SetToUpdate();
5141 aContext->Display (aLine, Standard_True);
5147 //==============================================================================
5150 //==============================================================================
5152 static int VGrid (Draw_Interpretor& /*theDI*/,
5153 Standard_Integer theArgNb,
5154 const char** theArgVec)
5156 // get the active view
5157 Handle(V3d_View) aView = ViewerTest::CurrentView();
5158 Handle(V3d_Viewer) aViewer = ViewerTest::GetViewerFromContext();
5159 if (aView.IsNull() || aViewer.IsNull())
5161 std::cerr << "No active view. Please call vinit.\n";
5165 Aspect_GridType aType = aViewer->GridType();
5166 Aspect_GridDrawMode aMode = aViewer->GridDrawMode();
5167 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), aView);
5168 Standard_Integer anIter = 1;
5169 for (; anIter < theArgNb; ++anIter)
5171 const char* aValue = theArgVec[anIter];
5172 if (anUpdateTool.parseRedrawMode (aValue))
5176 else if (*aValue == 'r')
5178 aType = Aspect_GT_Rectangular;
5180 else if (*aValue == 'c')
5182 aType = Aspect_GT_Circular;
5184 else if (*aValue == 'l')
5186 aMode = Aspect_GDM_Lines;
5188 else if (*aValue == 'p')
5190 aMode = Aspect_GDM_Points;
5192 else if (strcmp (aValue, "off" ) == 0)
5194 aViewer->DeactivateGrid();
5203 Standard_Integer aTail = (theArgNb - anIter);
5206 aViewer->ActivateGrid (aType, aMode);
5209 else if (aTail != 2 && aTail != 5)
5211 std::cerr << "Incorrect arguments number! Usage:\n"
5212 << "vgrid [off] [Mode={r|c}] [Type={l|p}] [OriginX OriginY [StepX/StepRadius StepY/DivNb RotAngle]]\n";
5216 Standard_Real anOriginX, anOriginY, aRotAngle;
5217 if (aType == Aspect_GT_Rectangular)
5219 Standard_Real aRStepX, aRStepY;
5220 aViewer->RectangularGridValues (anOriginX, anOriginY, aRStepX, aRStepY, aRotAngle);
5222 anOriginX = Draw::Atof (theArgVec[anIter++]);
5223 anOriginY = Draw::Atof (theArgVec[anIter++]);
5226 aRStepX = Draw::Atof (theArgVec[anIter++]);
5227 aRStepY = Draw::Atof (theArgVec[anIter++]);
5228 aRotAngle = Draw::Atof (theArgVec[anIter++]);
5230 aViewer->SetRectangularGridValues (anOriginX, anOriginY, aRStepX, aRStepY, aRotAngle);
5231 aViewer->ActivateGrid (aType, aMode);
5233 else if (aType == Aspect_GT_Circular)
5235 Standard_Real aRadiusStep;
5236 Standard_Integer aDivisionNumber;
5237 aViewer->CircularGridValues (anOriginX, anOriginY, aRadiusStep, aDivisionNumber, aRotAngle);
5239 anOriginX = Draw::Atof (theArgVec[anIter++]);
5240 anOriginY = Draw::Atof (theArgVec[anIter++]);
5243 aRadiusStep = Draw::Atof (theArgVec[anIter++]);
5244 aDivisionNumber = Draw::Atoi (theArgVec[anIter++]);
5245 aRotAngle = Draw::Atof (theArgVec[anIter++]);
5248 aViewer->SetCircularGridValues (anOriginX, anOriginY, aRadiusStep, aDivisionNumber, aRotAngle);
5249 aViewer->ActivateGrid (aType, aMode);
5255 //==============================================================================
5256 //function : VPriviledgedPlane
5258 //==============================================================================
5260 static int VPriviledgedPlane (Draw_Interpretor& theDI,
5261 Standard_Integer theArgNb,
5262 const char** theArgVec)
5264 if (theArgNb != 1 && theArgNb != 7 && theArgNb != 10)
5266 std::cerr << "Error: wrong number of arguments! See usage:\n";
5267 theDI.PrintHelp (theArgVec[0]);
5271 // get the active viewer
5272 Handle(V3d_Viewer) aViewer = ViewerTest::GetViewerFromContext();
5273 if (aViewer.IsNull())
5275 std::cerr << "Error: no active viewer. Please call vinit.\n";
5281 gp_Ax3 aPriviledgedPlane = aViewer->PrivilegedPlane();
5282 const gp_Pnt& anOrig = aPriviledgedPlane.Location();
5283 const gp_Dir& aNorm = aPriviledgedPlane.Direction();
5284 const gp_Dir& aXDir = aPriviledgedPlane.XDirection();
5285 theDI << "Origin: " << anOrig.X() << " " << anOrig.Y() << " " << anOrig.Z() << " "
5286 << "Normal: " << aNorm.X() << " " << aNorm.Y() << " " << aNorm.Z() << " "
5287 << "X-dir: " << aXDir.X() << " " << aXDir.Y() << " " << aXDir.Z() << "\n";
5291 Standard_Integer anArgIdx = 1;
5292 Standard_Real anOrigX = Draw::Atof (theArgVec[anArgIdx++]);
5293 Standard_Real anOrigY = Draw::Atof (theArgVec[anArgIdx++]);
5294 Standard_Real anOrigZ = Draw::Atof (theArgVec[anArgIdx++]);
5295 Standard_Real aNormX = Draw::Atof (theArgVec[anArgIdx++]);
5296 Standard_Real aNormY = Draw::Atof (theArgVec[anArgIdx++]);
5297 Standard_Real aNormZ = Draw::Atof (theArgVec[anArgIdx++]);
5299 gp_Ax3 aPriviledgedPlane;
5300 gp_Pnt anOrig (anOrigX, anOrigY, anOrigZ);
5301 gp_Dir aNorm (aNormX, aNormY, aNormZ);
5304 Standard_Real aXDirX = Draw::Atof (theArgVec[anArgIdx++]);
5305 Standard_Real aXDirY = Draw::Atof (theArgVec[anArgIdx++]);
5306 Standard_Real aXDirZ = Draw::Atof (theArgVec[anArgIdx++]);
5307 gp_Dir aXDir (aXDirX, aXDirY, aXDirZ);
5308 aPriviledgedPlane = gp_Ax3 (anOrig, aNorm, aXDir);
5312 aPriviledgedPlane = gp_Ax3 (anOrig, aNorm);
5315 aViewer->SetPrivilegedPlane (aPriviledgedPlane);
5320 //==============================================================================
5321 //function : VConvert
5323 //==============================================================================
5325 static int VConvert (Draw_Interpretor& theDI,
5326 Standard_Integer theArgNb,
5327 const char** theArgVec)
5329 // get the active view
5330 Handle(V3d_View) aView = ViewerTest::CurrentView();
5333 std::cerr << "Error: no active view. Please call vinit.\n";
5337 enum { Model, Ray, View, Window, Grid } aMode = Model;
5339 // access coordinate arguments
5340 TColStd_SequenceOfReal aCoord;
5341 Standard_Integer anArgIdx = 1;
5342 for (; anArgIdx < 4 && anArgIdx < theArgNb; ++anArgIdx)
5344 TCollection_AsciiString anArg (theArgVec[anArgIdx]);
5345 if (!anArg.IsRealValue())
5349 aCoord.Append (anArg.RealValue());
5352 // non-numeric argument too early
5353 if (aCoord.IsEmpty())
5355 std::cerr << "Error: wrong number of arguments! See usage:\n";
5356 theDI.PrintHelp (theArgVec[0]);
5360 // collect all other arguments and options
5361 for (; anArgIdx < theArgNb; ++anArgIdx)
5363 TCollection_AsciiString anArg (theArgVec[anArgIdx]);
5365 if (anArg == "window") aMode = Window;
5366 else if (anArg == "view") aMode = View;
5367 else if (anArg == "grid") aMode = Grid;
5368 else if (anArg == "ray") aMode = Ray;
5371 std::cerr << "Error: wrong argument " << anArg << "! See usage:\n";
5372 theDI.PrintHelp (theArgVec[0]);
5377 // complete input checks
5378 if ((aCoord.Length() == 1 && theArgNb > 3) ||
5379 (aCoord.Length() == 2 && theArgNb > 4) ||
5380 (aCoord.Length() == 3 && theArgNb > 5))
5382 std::cerr << "Error: wrong number of arguments! See usage:\n";
5383 theDI.PrintHelp (theArgVec[0]);
5387 Standard_Real aXYZ[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
5388 Standard_Integer aXYp[2] = {0, 0};
5390 // convert one-dimensional coordinate
5391 if (aCoord.Length() == 1)
5395 case View : theDI << "View Vv: " << aView->Convert ((Standard_Integer)aCoord (1)); return 0;
5396 case Window : theDI << "Window Vp: " << aView->Convert (aCoord (1)); return 0;
5398 std::cerr << "Error: wrong arguments! See usage:\n";
5399 theDI.PrintHelp (theArgVec[0]);
5404 // convert 2D coordinates from projection or view reference space
5405 if (aCoord.Length() == 2)
5410 aView->Convert ((Standard_Integer) aCoord (1), (Standard_Integer) aCoord (2), aXYZ[0], aXYZ[1], aXYZ[2]);
5411 theDI << "Model X,Y,Z: " << aXYZ[0] << " " << aXYZ[1] << " " << aXYZ[2] << "\n";
5415 aView->Convert ((Standard_Integer) aCoord (1), (Standard_Integer) aCoord (2), aXYZ[0], aXYZ[1]);
5416 theDI << "View Xv,Yv: " << aXYZ[0] << " " << aXYZ[1] << "\n";
5420 aView->Convert (aCoord (1), aCoord (2), aXYp[0], aXYp[1]);
5421 theDI << "Window Xp,Yp: " << aXYp[0] << " " << aXYp[1] << "\n";
5425 aView->Convert ((Standard_Integer) aCoord (1), (Standard_Integer) aCoord (2), aXYZ[0], aXYZ[1], aXYZ[2]);
5426 aView->ConvertToGrid (aXYZ[0], aXYZ[1], aXYZ[2], aXYZ[3], aXYZ[4], aXYZ[5]);
5427 theDI << "Model X,Y,Z: " << aXYZ[3] << " " << aXYZ[4] << " " << aXYZ[5] << "\n";
5431 aView->ConvertWithProj ((Standard_Integer) aCoord (1),
5432 (Standard_Integer) aCoord (2),
5433 aXYZ[0], aXYZ[1], aXYZ[2],
5434 aXYZ[3], aXYZ[4], aXYZ[5]);
5435 theDI << "Model DX,DY,DZ: " << aXYZ[3] << " " << aXYZ[4] << " " << aXYZ[5] << "\n";
5439 std::cerr << "Error: wrong arguments! See usage:\n";
5440 theDI.PrintHelp (theArgVec[0]);
5445 // convert 3D coordinates from view reference space
5446 else if (aCoord.Length() == 3)
5451 aView->Convert (aCoord (1), aCoord (2), aCoord (3), aXYp[0], aXYp[1]);
5452 theDI << "Window Xp,Yp: " << aXYp[0] << " " << aXYp[1] << "\n";
5456 aView->ConvertToGrid (aCoord (1), aCoord (2), aCoord (3), aXYZ[0], aXYZ[1], aXYZ[2]);
5457 theDI << "Model X,Y,Z: " << aXYZ[0] << " " << aXYZ[1] << " " << aXYZ[2] << "\n";
5461 std::cerr << "Error: wrong arguments! See usage:\n";
5462 theDI.PrintHelp (theArgVec[0]);
5470 //==============================================================================
5473 //==============================================================================
5475 static int VFps (Draw_Interpretor& theDI,
5476 Standard_Integer theArgNb,
5477 const char** theArgVec)
5479 // get the active view
5480 Handle(V3d_View) aView = ViewerTest::CurrentView();
5483 std::cerr << "No active view. Please call vinit.\n";
5487 Standard_Integer aFramesNb = (theArgNb > 1) ? Draw::Atoi(theArgVec[1]) : 100;
5490 std::cerr << "Incorrect arguments!\n";
5494 // the time is meaningless for first call
5495 // due to async OpenGl rendering
5498 // redraw view in loop to estimate average values
5501 for (Standard_Integer anInter = 0; anInter < aFramesNb; ++anInter)
5507 const Standard_Real aTime = aTimer.ElapsedTime();
5508 aTimer.OSD_Chronometer::Show (aCpu);
5510 const Standard_Real aFpsAver = Standard_Real(aFramesNb) / aTime;
5511 const Standard_Real aCpuAver = aCpu / Standard_Real(aFramesNb);
5513 // return statistics
5514 theDI << "FPS: " << aFpsAver << "\n"
5515 << "CPU: " << (1000.0 * aCpuAver) << " msec\n";
5517 // compute additional statistics in ray-tracing mode
5518 Graphic3d_RenderingParams& aParams = aView->ChangeRenderingParams();
5520 if (aParams.Method == Graphic3d_RM_RAYTRACING)
5522 Standard_Integer aSizeX;
5523 Standard_Integer aSizeY;
5525 aView->Window()->Size (aSizeX, aSizeY);
5527 // 1 shadow ray and 1 secondary ray pew each bounce
5528 const Standard_Real aMRays = aSizeX * aSizeY * aFpsAver * aParams.RaytracingDepth * 2 / 1.0e6f;
5530 theDI << "MRays/sec (upper bound): " << aMRays << "\n";
5536 //==============================================================================
5537 //function : VGlDebug
5539 //==============================================================================
5541 static int VGlDebug (Draw_Interpretor& theDI,
5542 Standard_Integer theArgNb,
5543 const char** theArgVec)
5545 Handle(OpenGl_GraphicDriver) aDriver;
5546 Handle(V3d_View) aView = ViewerTest::CurrentView();
5547 if (!aView.IsNull())
5549 aDriver = Handle(OpenGl_GraphicDriver)::DownCast (aView->Viewer()->Driver());
5551 OpenGl_Caps* aDefCaps = &ViewerTest_myDefaultCaps;
5552 OpenGl_Caps* aCaps = !aDriver.IsNull() ? &aDriver->ChangeOptions() : NULL;
5556 TCollection_AsciiString aDebActive, aSyncActive;
5563 Standard_Boolean isActive = OpenGl_Context::CheckExtension ((const char* )::glGetString (GL_EXTENSIONS),
5564 "GL_ARB_debug_output");
5565 aDebActive = isActive ? " (active)" : " (inactive)";
5568 // GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB
5569 aSyncActive = ::glIsEnabled (0x8242) == GL_TRUE ? " (active)" : " (inactive)";
5573 theDI << "debug: " << (aCaps->contextDebug ? "1" : "0") << aDebActive << "\n"
5574 << "sync: " << (aCaps->contextSyncDebug ? "1" : "0") << aSyncActive << "\n"
5575 << "glslWarn:" << (aCaps->glslWarnings ? "1" : "0") << "\n"
5576 << "extraMsg:" << (aCaps->suppressExtraMsg ? "0" : "1") << "\n";
5580 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
5582 Standard_CString anArg = theArgVec[anArgIter];
5583 TCollection_AsciiString anArgCase (anArg);
5584 anArgCase.LowerCase();
5585 Standard_Boolean toEnableDebug = Standard_True;
5586 if (anArgCase == "-glsl"
5587 || anArgCase == "-glslwarn"
5588 || anArgCase == "-glslwarns"
5589 || anArgCase == "-glslwarnings")
5591 Standard_Boolean toShowWarns = Standard_True;
5592 if (++anArgIter < theArgNb
5593 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toShowWarns))
5597 aDefCaps->glslWarnings = toShowWarns;
5600 aCaps->glslWarnings = toShowWarns;
5603 else if (anArgCase == "-extra"
5604 || anArgCase == "-extramsg"
5605 || anArgCase == "-extramessages")
5607 Standard_Boolean toShow = Standard_True;
5608 if (++anArgIter < theArgNb
5609 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toShow))
5613 aDefCaps->suppressExtraMsg = !toShow;
5616 aCaps->suppressExtraMsg = !toShow;
5619 else if (anArgCase == "-noextra"
5620 || anArgCase == "-noextramsg"
5621 || anArgCase == "-noextramessages")
5623 Standard_Boolean toSuppress = Standard_True;
5624 if (++anArgIter < theArgNb
5625 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toSuppress))
5629 aDefCaps->suppressExtraMsg = toSuppress;
5632 aCaps->suppressExtraMsg = toSuppress;
5635 else if (anArgCase == "-sync")
5637 Standard_Boolean toSync = Standard_True;
5638 if (++anArgIter < theArgNb
5639 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toSync))
5643 aDefCaps->contextSyncDebug = toSync;
5646 aDefCaps->contextDebug = Standard_True;
5649 else if (anArgCase == "-debug")
5651 if (++anArgIter < theArgNb
5652 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnableDebug))
5656 aDefCaps->contextDebug = toEnableDebug;
5658 else if (ViewerTest::ParseOnOff (anArg, toEnableDebug)
5659 && (anArgIter + 1 == theArgNb))
5661 // simple alias to turn on almost everything
5662 aDefCaps->contextDebug = toEnableDebug;
5663 aDefCaps->contextSyncDebug = toEnableDebug;
5664 aDefCaps->glslWarnings = toEnableDebug;
5668 std::cout << "Error: wrong syntax at '" << anArg << "'\n";
5676 //==============================================================================
5679 //==============================================================================
5681 static int VVbo (Draw_Interpretor& theDI,
5682 Standard_Integer theArgNb,
5683 const char** theArgVec)
5685 const Standard_Boolean toSet = (theArgNb > 1);
5686 const Standard_Boolean toUseVbo = toSet ? (Draw::Atoi (theArgVec[1]) == 0) : 1;
5689 ViewerTest_myDefaultCaps.vboDisable = toUseVbo;
5693 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
5694 if (aContextAIS.IsNull())
5698 std::cerr << "No active view!\n";
5702 Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (aContextAIS->CurrentViewer()->Driver());
5703 if (!aDriver.IsNull())
5707 theDI << (aDriver->Options().vboDisable ? "0" : "1") << "\n";
5711 aDriver->ChangeOptions().vboDisable = toUseVbo;
5718 //==============================================================================
5721 //==============================================================================
5723 static int VCaps (Draw_Interpretor& theDI,
5724 Standard_Integer theArgNb,
5725 const char** theArgVec)
5727 OpenGl_Caps* aCaps = &ViewerTest_myDefaultCaps;
5728 Handle(OpenGl_GraphicDriver) aDriver;
5729 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
5730 if (!aContext.IsNull())
5732 aDriver = Handle(OpenGl_GraphicDriver)::DownCast (aContext->CurrentViewer()->Driver());
5733 aCaps = &aDriver->ChangeOptions();
5738 theDI << "VBO: " << (aCaps->vboDisable ? "0" : "1") << "\n";
5739 theDI << "Sprites: " << (aCaps->pntSpritesDisable ? "0" : "1") << "\n";
5740 theDI << "SoftMode:" << (aCaps->contextNoAccel ? "1" : "0") << "\n";
5741 theDI << "FFP: " << (aCaps->ffpEnable ? "1" : "0") << "\n";
5742 theDI << "VSync: " << aCaps->swapInterval << "\n";
5743 theDI << "Compatible:" << (aCaps->contextCompatible ? "1" : "0") << "\n";
5744 theDI << "Stereo: " << (aCaps->contextStereo ? "1" : "0") << "\n";
5745 theDI << "WinBuffer: " << (aCaps->useSystemBuffer ? "1" : "0") << "\n";
5749 ViewerTest_AutoUpdater anUpdateTool (aContext, ViewerTest::CurrentView());
5750 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
5752 Standard_CString anArg = theArgVec[anArgIter];
5753 TCollection_AsciiString anArgCase (anArg);
5754 anArgCase.LowerCase();
5755 if (anUpdateTool.parseRedrawMode (anArg))
5759 else if (anArgCase == "-vsync"
5760 || anArgCase == "-swapinterval")
5762 Standard_Boolean toEnable = Standard_True;
5763 if (++anArgIter < theArgNb
5764 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5768 aCaps->swapInterval = toEnable;
5770 else if (anArgCase == "-ffp")
5772 Standard_Boolean toEnable = Standard_True;
5773 if (++anArgIter < theArgNb
5774 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5778 aCaps->ffpEnable = toEnable;
5780 else if (anArgCase == "-vbo")
5782 Standard_Boolean toEnable = Standard_True;
5783 if (++anArgIter < theArgNb
5784 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5788 aCaps->vboDisable = !toEnable;
5790 else if (anArgCase == "-sprite"
5791 || anArgCase == "-sprites")
5793 Standard_Boolean toEnable = Standard_True;
5794 if (++anArgIter < theArgNb
5795 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5799 aCaps->pntSpritesDisable = !toEnable;
5801 else if (anArgCase == "-softmode")
5803 Standard_Boolean toEnable = Standard_True;
5804 if (++anArgIter < theArgNb
5805 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5809 aCaps->contextNoAccel = toEnable;
5811 else if (anArgCase == "-winbuffer"
5812 || anArgCase == "-windowbuffer"
5813 || anArgCase == "-usewinbuffer"
5814 || anArgCase == "-usewindowbuffer"
5815 || anArgCase == "-usesystembuffer")
5817 Standard_Boolean toEnable = Standard_True;
5818 if (++anArgIter < theArgNb
5819 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5823 aCaps->useSystemBuffer = toEnable;
5825 else if (anArgCase == "-accel"
5826 || anArgCase == "-acceleration")
5828 Standard_Boolean toEnable = Standard_True;
5829 if (++anArgIter < theArgNb
5830 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5834 aCaps->contextNoAccel = !toEnable;
5836 else if (anArgCase == "-compat"
5837 || anArgCase == "-compatprofile"
5838 || anArgCase == "-compatible"
5839 || anArgCase == "-compatibleprofile")
5841 Standard_Boolean toEnable = Standard_True;
5842 if (++anArgIter < theArgNb
5843 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5847 aCaps->contextCompatible = toEnable;
5848 if (!aCaps->contextCompatible)
5850 aCaps->ffpEnable = Standard_False;
5853 else if (anArgCase == "-core"
5854 || anArgCase == "-coreprofile")
5856 Standard_Boolean toEnable = Standard_True;
5857 if (++anArgIter < theArgNb
5858 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5862 aCaps->contextCompatible = !toEnable;
5863 if (!aCaps->contextCompatible)
5865 aCaps->ffpEnable = Standard_False;
5868 else if (anArgCase == "-stereo"
5869 || anArgCase == "-quadbuffer")
5871 Standard_Boolean toEnable = Standard_True;
5872 if (++anArgIter < theArgNb
5873 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
5877 aCaps->contextStereo = toEnable;
5881 std::cout << "Error: unknown argument '" << anArg << "'\n";
5885 if (aCaps != &ViewerTest_myDefaultCaps)
5887 ViewerTest_myDefaultCaps = *aCaps;
5892 //==============================================================================
5893 //function : VMemGpu
5895 //==============================================================================
5897 static int VMemGpu (Draw_Interpretor& theDI,
5898 Standard_Integer theArgNb,
5899 const char** theArgVec)
5902 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
5903 if (aContextAIS.IsNull())
5905 std::cerr << "No active view. Please call vinit.\n";
5909 Handle(Graphic3d_GraphicDriver) aDriver = aContextAIS->CurrentViewer()->Driver();
5910 if (aDriver.IsNull())
5912 std::cerr << "Graphic driver not available.\n";
5916 Standard_Size aFreeBytes = 0;
5917 TCollection_AsciiString anInfo;
5918 if (!aDriver->MemoryInfo (aFreeBytes, anInfo))
5920 std::cerr << "Information not available.\n";
5924 if (theArgNb > 1 && *theArgVec[1] == 'f')
5926 theDI << Standard_Real (aFreeBytes);
5936 // ==============================================================================
5937 // function : VReadPixel
5939 // ==============================================================================
5940 static int VReadPixel (Draw_Interpretor& theDI,
5941 Standard_Integer theArgNb,
5942 const char** theArgVec)
5944 // get the active view
5945 Handle(V3d_View) aView = ViewerTest::CurrentView();
5948 std::cerr << "No active view. Please call vinit.\n";
5951 else if (theArgNb < 3)
5953 std::cerr << "Usage : " << theArgVec[0] << " xPixel yPixel [{rgb|rgba|depth|hls|rgbf|rgbaf}=rgba] [name]\n";
5957 Image_Format aFormat = Image_Format_RGBA;
5958 Graphic3d_BufferType aBufferType = Graphic3d_BT_RGBA;
5960 Standard_Integer aWidth, aHeight;
5961 aView->Window()->Size (aWidth, aHeight);
5962 const Standard_Integer anX = Draw::Atoi (theArgVec[1]);
5963 const Standard_Integer anY = Draw::Atoi (theArgVec[2]);
5964 if (anX < 0 || anX >= aWidth || anY < 0 || anY > aHeight)
5966 std::cerr << "Pixel coordinates (" << anX << "; " << anY << ") are out of view (" << aWidth << " x " << aHeight << ")\n";
5970 Standard_Boolean toShowName = Standard_False;
5971 Standard_Boolean toShowHls = Standard_False;
5972 for (Standard_Integer anIter = 3; anIter < theArgNb; ++anIter)
5974 TCollection_AsciiString aParam (theArgVec[anIter]);
5976 if (aParam == "rgb")
5978 aFormat = Image_Format_RGB;
5979 aBufferType = Graphic3d_BT_RGB;
5981 else if (aParam == "hls")
5983 aFormat = Image_Format_RGB;
5984 aBufferType = Graphic3d_BT_RGB;
5985 toShowHls = Standard_True;
5987 else if (aParam == "rgbf")
5989 aFormat = Image_Format_RGBF;
5990 aBufferType = Graphic3d_BT_RGB;
5992 else if (aParam == "rgba")
5994 aFormat = Image_Format_RGBA;
5995 aBufferType = Graphic3d_BT_RGBA;
5997 else if (aParam == "rgbaf")
5999 aFormat = Image_Format_RGBAF;
6000 aBufferType = Graphic3d_BT_RGBA;
6002 else if (aParam == "depth")
6004 aFormat = Image_Format_GrayF;
6005 aBufferType = Graphic3d_BT_Depth;
6007 else if (aParam == "name")
6009 toShowName = Standard_True;
6013 Image_PixMap anImage;
6014 if (!anImage.InitTrash (aFormat, aWidth, aHeight))
6016 std::cerr << "Image allocation failed\n";
6019 else if (!aView->ToPixMap (anImage, aWidth, aHeight, aBufferType))
6021 std::cerr << "Image dump failed\n";
6025 Quantity_ColorRGBA aColor = anImage.PixelColor (anX, anY);
6028 if (aBufferType == Graphic3d_BT_RGBA)
6030 theDI << Quantity_Color::StringName (aColor.GetRGB().Name()) << " " << aColor.Alpha();
6034 theDI << Quantity_Color::StringName (aColor.GetRGB().Name());
6039 switch (aBufferType)
6042 case Graphic3d_BT_RGB:
6046 theDI << aColor.GetRGB().Hue() << " " << aColor.GetRGB().Light() << " " << aColor.GetRGB().Saturation();
6050 theDI << aColor.GetRGB().Red() << " " << aColor.GetRGB().Green() << " " << aColor.GetRGB().Blue();
6054 case Graphic3d_BT_RGBA:
6056 theDI << aColor.GetRGB().Red() << " " << aColor.GetRGB().Green() << " " << aColor.GetRGB().Blue() << " " << aColor.Alpha();
6059 case Graphic3d_BT_Depth:
6061 theDI << aColor.GetRGB().Red();
6070 //! Auxiliary presentation for an image plane.
6071 class ViewerTest_ImagePrs : public AIS_InteractiveObject
6074 //! Main constructor.
6075 ViewerTest_ImagePrs (const Handle(Image_PixMap)& theImage,
6076 const Standard_Real theWidth,
6077 const Standard_Real theHeight,
6078 const TCollection_AsciiString& theLabel)
6079 : myLabel (theLabel), myWidth (theWidth), myHeight(theHeight)
6083 myDynHilightDrawer->SetZLayer (Graphic3d_ZLayerId_Topmost);
6085 myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
6086 const Handle(Graphic3d_AspectFillArea3d)& aFillAspect = myDrawer->ShadingAspect()->Aspect();
6087 Graphic3d_MaterialAspect aMat;
6088 aMat.SetMaterialType (Graphic3d_MATERIAL_PHYSIC);
6089 aMat.SetAmbient (1.0);
6090 aMat.SetDiffuse (1.0);
6091 aMat.SetSpecular (1.0);
6092 aMat.SetEmissive (1.0);
6093 aMat.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
6094 aMat.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
6095 aMat.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
6096 aMat.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
6097 aMat.SetAmbientColor (Quantity_Color (0.0, 0.0, 0.0, Quantity_TOC_RGB));
6098 aMat.SetDiffuseColor (Quantity_Color (1.0, 1.0, 1.0, Quantity_TOC_RGB));
6099 aMat.SetSpecularColor (Quantity_Color (0.0, 0.0, 0.0, Quantity_TOC_RGB));
6100 aMat.SetEmissiveColor (Quantity_Color (0.0, 0.0, 0.0, Quantity_TOC_RGB));
6101 aFillAspect->SetFrontMaterial (aMat);
6102 aFillAspect->SetTextureMap (new Graphic3d_Texture2Dmanual (theImage));
6103 aFillAspect->SetTextureMapOn();
6106 Handle(Prs3d_TextAspect) aTextAspect = new Prs3d_TextAspect();
6107 aTextAspect->SetHorizontalJustification (Graphic3d_HTA_CENTER);
6108 aTextAspect->SetVerticalJustification (Graphic3d_VTA_CENTER);
6109 myDrawer->SetTextAspect (aTextAspect);
6112 const gp_Dir aNorm (0.0, 0.0, 1.0);
6113 myTris = new Graphic3d_ArrayOfTriangles (4, 6, true, false, true);
6114 myTris->AddVertex (gp_Pnt(-myWidth * 0.5, -myHeight * 0.5, 0.0), aNorm, gp_Pnt2d (0.0, 0.0));
6115 myTris->AddVertex (gp_Pnt( myWidth * 0.5, -myHeight * 0.5, 0.0), aNorm, gp_Pnt2d (1.0, 0.0));
6116 myTris->AddVertex (gp_Pnt(-myWidth * 0.5, myHeight * 0.5, 0.0), aNorm, gp_Pnt2d (0.0, 1.0));
6117 myTris->AddVertex (gp_Pnt( myWidth * 0.5, myHeight * 0.5, 0.0), aNorm, gp_Pnt2d (1.0, 1.0));
6118 myTris->AddEdge (1);
6119 myTris->AddEdge (2);
6120 myTris->AddEdge (3);
6121 myTris->AddEdge (3);
6122 myTris->AddEdge (2);
6123 myTris->AddEdge (4);
6125 myRect = new Graphic3d_ArrayOfPolylines (4);
6126 myRect->AddVertex (myTris->Vertice (1));
6127 myRect->AddVertex (myTris->Vertice (3));
6128 myRect->AddVertex (myTris->Vertice (4));
6129 myRect->AddVertex (myTris->Vertice (2));
6133 //! Returns TRUE for accepted display modes.
6134 virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0 || theMode == 1; }
6136 //! Compute presentation.
6137 virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& , const Handle(Prs3d_Presentation)& thePrs, const Standard_Integer theMode) Standard_OVERRIDE
6143 Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
6144 aGroup->AddPrimitiveArray (myTris);
6145 aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
6146 aGroup->AddPrimitiveArray (myRect);
6147 aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect());
6152 Prs3d_Text::Draw (thePrs->NewGroup(), myDrawer->TextAspect(), myLabel, gp_Pnt(0.0, 0.0, 0.0));
6153 Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
6154 aGroup->AddPrimitiveArray (myRect);
6155 aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect());
6161 //! Compute selection.
6162 virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSel, const Standard_Integer theMode) Standard_OVERRIDE
6166 Handle(SelectMgr_EntityOwner) anEntityOwner = new SelectMgr_EntityOwner (this, 5);
6167 Handle(Select3D_SensitivePrimitiveArray) aSensitive = new Select3D_SensitivePrimitiveArray (anEntityOwner);
6168 aSensitive->InitTriangulation (myTris->Attributes(), myTris->Indices(), TopLoc_Location());
6169 theSel->Add (aSensitive);
6174 Handle(Graphic3d_ArrayOfTriangles) myTris;
6175 Handle(Graphic3d_ArrayOfPolylines) myRect;
6176 TCollection_AsciiString myLabel;
6177 Standard_Real myWidth;
6178 Standard_Real myHeight;
6181 //==============================================================================
6182 //function : VDiffImage
6183 //purpose : The draw-command compares two images.
6184 //==============================================================================
6186 static int VDiffImage (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec)
6190 std::cout << "Syntax error: not enough arguments.\n";
6194 Standard_Integer anArgIter = 1;
6195 TCollection_AsciiString anImgPathRef (theArgVec[anArgIter++]);
6196 TCollection_AsciiString anImgPathNew (theArgVec[anArgIter++]);
6197 TCollection_AsciiString aDiffImagePath;
6198 Standard_Real aTolColor = -1.0;
6199 Standard_Integer toBlackWhite = -1;
6200 Standard_Integer isBorderFilterOn = -1;
6201 Standard_Boolean isOldSyntax = Standard_False;
6202 TCollection_AsciiString aViewName, aPrsNameRef, aPrsNameNew, aPrsNameDiff;
6203 for (; anArgIter < theArgNb; ++anArgIter)
6205 TCollection_AsciiString anArg (theArgVec[anArgIter]);
6207 if (anArgIter + 1 < theArgNb
6208 && (anArg == "-toleranceofcolor"
6209 || anArg == "-tolerancecolor"
6210 || anArg == "-tolerance"
6211 || anArg == "-toler"))
6213 aTolColor = Atof (theArgVec[++anArgIter]);
6214 if (aTolColor < 0.0 || aTolColor > 1.0)
6216 std::cout << "Syntax error at '" << anArg << " " << theArgVec[anArgIter] << "'\n";
6220 else if (anArg == "-blackwhite")
6222 Standard_Boolean toEnable = Standard_True;
6223 if (anArgIter + 1 < theArgNb
6224 && ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], toEnable))
6228 toBlackWhite = toEnable ? 1 : 0;
6230 else if (anArg == "-borderfilter")
6232 Standard_Boolean toEnable = Standard_True;
6233 if (anArgIter + 1 < theArgNb
6234 && ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], toEnable))
6238 isBorderFilterOn = toEnable ? 1 : 0;
6240 else if (anArg == "-exitonclose")
6242 Draw_ToExitOnCloseView = true;
6243 if (anArgIter + 1 < theArgNb
6244 && ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], Draw_ToExitOnCloseView))
6249 else if (anArg == "-closeonescape"
6250 || anArg == "-closeonesc")
6252 Draw_ToCloseViewOnEsc = true;
6253 if (anArgIter + 1 < theArgNb
6254 && ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], Draw_ToCloseViewOnEsc))
6259 else if (anArgIter + 3 < theArgNb
6260 && anArg == "-display")
6262 aViewName = theArgVec[++anArgIter];
6263 aPrsNameRef = theArgVec[++anArgIter];
6264 aPrsNameNew = theArgVec[++anArgIter];
6265 if (anArgIter + 1 < theArgNb
6266 && *theArgVec[anArgIter + 1] != '-')
6268 aPrsNameDiff = theArgVec[++anArgIter];
6271 else if (aTolColor < 0.0
6272 && anArg.IsRealValue())
6274 isOldSyntax = Standard_True;
6275 aTolColor = anArg.RealValue();
6276 if (aTolColor < 0.0 || aTolColor > 1.0)
6278 std::cout << "Syntax error at '" << anArg << " " << theArgVec[anArgIter] << "'\n";
6282 else if (isOldSyntax
6283 && toBlackWhite == -1
6284 && (anArg == "0" || anArg == "1"))
6286 toBlackWhite = anArg == "1" ? 1 : 0;
6288 else if (isOldSyntax
6289 && isBorderFilterOn == -1
6290 && (anArg == "0" || anArg == "1"))
6292 isBorderFilterOn = anArg == "1" ? 1 : 0;
6294 else if (aDiffImagePath.IsEmpty())
6296 aDiffImagePath = theArgVec[anArgIter];
6300 std::cout << "Syntax error at '" << theArgVec[anArgIter] << "'\n";
6305 Handle(Image_AlienPixMap) anImgRef = new Image_AlienPixMap();
6306 Handle(Image_AlienPixMap) anImgNew = new Image_AlienPixMap();
6307 if (!anImgRef->Load (anImgPathRef))
6309 std::cout << "Error: image file '" << anImgPathRef << "' cannot be read\n";
6312 if (!anImgNew->Load (anImgPathNew))
6314 std::cout << "Error: image file '" << anImgPathNew << "' cannot be read\n";
6318 // compare the images
6319 Image_Diff aComparer;
6320 Standard_Integer aDiffColorsNb = -1;
6321 if (aComparer.Init (anImgRef, anImgNew, toBlackWhite == 1))
6323 aComparer.SetColorTolerance (aTolColor >= 0.0 ? aTolColor : 0.0);
6324 aComparer.SetBorderFilterOn (isBorderFilterOn == 1);
6325 aDiffColorsNb = aComparer.Compare();
6326 theDI << aDiffColorsNb << "\n";
6329 // save image of difference
6330 Handle(Image_AlienPixMap) aDiff;
6331 if (aDiffColorsNb > 0
6332 && (!aDiffImagePath.IsEmpty() || !aPrsNameDiff.IsEmpty()))
6334 aDiff = new Image_AlienPixMap();
6335 if (!aDiff->InitTrash (Image_Format_Gray, anImgRef->SizeX(), anImgRef->SizeY()))
6337 std::cout << "Error: cannot allocate memory for diff image " << anImgRef->SizeX() << "x" << anImgRef->SizeY() << "\n";
6340 aComparer.SaveDiffImage (*aDiff);
6341 if (!aDiffImagePath.IsEmpty()
6342 && !aDiff->Save (aDiffImagePath))
6344 std::cout << "Error: diff image file '" << aDiffImagePath << "' cannot be written\n";
6349 if (aViewName.IsEmpty())
6354 ViewerTest_Names aViewNames (aViewName);
6355 if (ViewerTest_myViews.IsBound1 (aViewNames.GetViewName()))
6357 TCollection_AsciiString aCommand = TCollection_AsciiString ("vclose ") + aViewNames.GetViewName();
6358 theDI.Eval (aCommand.ToCString());
6361 Standard_Integer aPxLeft = 0;
6362 Standard_Integer aPxTop = 0;
6363 Standard_Integer aWinSizeX = int(anImgRef->SizeX() * 2);
6364 Standard_Integer aWinSizeY = !aDiff.IsNull() && !aPrsNameDiff.IsEmpty()
6365 ? int(anImgRef->SizeY() * 2)
6366 : int(anImgRef->SizeY());
6367 TCollection_AsciiString aDisplayName;
6368 TCollection_AsciiString aViewId = ViewerTest::ViewerInit (aPxLeft, aPxTop,
6369 aWinSizeX, aWinSizeY,
6370 aViewName.ToCString(),
6371 aDisplayName.ToCString());
6373 Standard_Real aRatio = anImgRef->Ratio();
6374 Standard_Real aSizeX = 1.0;
6375 Standard_Real aSizeY = aSizeX / aRatio;
6377 OSD_Path aPath (anImgPathRef);
6378 TCollection_AsciiString aLabelRef;
6379 if (!aPath.Name().IsEmpty())
6381 aLabelRef = aPath.Name() + aPath.Extension();
6383 aLabelRef += TCollection_AsciiString() + "\n" + int(anImgRef->SizeX()) + "x" + int(anImgRef->SizeY());
6385 Handle(ViewerTest_ImagePrs) anImgRefPrs = new ViewerTest_ImagePrs (anImgRef, aSizeX, aSizeY, aLabelRef);
6387 aTrsfRef.SetTranslationPart (gp_Vec (-aSizeX * 0.5, 0.0, 0.0));
6388 anImgRefPrs->SetLocalTransformation (aTrsfRef);
6389 ViewerTest::Display (aPrsNameRef, anImgRefPrs, false, true);
6392 OSD_Path aPath (anImgPathNew);
6393 TCollection_AsciiString aLabelNew;
6394 if (!aPath.Name().IsEmpty())
6396 aLabelNew = aPath.Name() + aPath.Extension();
6398 aLabelNew += TCollection_AsciiString() + "\n" + int(anImgNew->SizeX()) + "x" + int(anImgNew->SizeY());
6400 Handle(ViewerTest_ImagePrs) anImgNewPrs = new ViewerTest_ImagePrs (anImgNew, aSizeX, aSizeY, aLabelNew);
6402 aTrsfRef.SetTranslationPart (gp_Vec (aSizeX * 0.5, 0.0, 0.0));
6403 anImgNewPrs->SetLocalTransformation (aTrsfRef);
6404 ViewerTest::Display (aPrsNameNew, anImgNewPrs, false, true);
6406 Handle(ViewerTest_ImagePrs) anImgDiffPrs;
6407 if (!aDiff.IsNull())
6409 anImgDiffPrs = new ViewerTest_ImagePrs (aDiff, aSizeX, aSizeY, TCollection_AsciiString() + "Difference: " + aDiffColorsNb + " pixels");
6411 aTrsfDiff.SetTranslationPart (gp_Vec (0.0, -aSizeY, 0.0));
6412 anImgDiffPrs->SetLocalTransformation (aTrsfDiff);
6414 if (!aPrsNameDiff.IsEmpty())
6416 ViewerTest::Display (aPrsNameDiff, anImgDiffPrs, false, true);
6418 ViewerTest::CurrentView()->SetProj (V3d_Zpos);
6419 ViewerTest::CurrentView()->FitAll();
6423 //=======================================================================
6424 //function : VSelect
6425 //purpose : Emulates different types of selection by mouse:
6426 // 1) single click selection
6427 // 2) selection with rectangle having corners at pixel positions (x1,y1) and (x2,y2)
6428 // 3) selection with polygon having corners at
6429 // pixel positions (x1,y1),...,(xn,yn)
6430 // 4) any of these selections with shift button pressed
6431 //=======================================================================
6432 static Standard_Integer VSelect (Draw_Interpretor& di,
6433 Standard_Integer argc,
6438 di << "Usage : " << argv[0] << " x1 y1 [x2 y2 [... xn yn]] [shift_selection = 1|0]\n";
6442 Handle(AIS_InteractiveContext) myAIScontext = ViewerTest::GetAISContext();
6443 if(myAIScontext.IsNull())
6445 di << "use 'vinit' command before " << argv[0] << "\n";
6449 const Standard_Boolean isShiftSelection = (argc > 3 && !(argc % 2) && (atoi (argv[argc - 1]) == 1));
6450 Standard_Integer aCoordsNb = isShiftSelection ? argc - 2 : argc - 1;
6451 TCollection_AsciiString anArg;
6452 anArg = isShiftSelection ? argv[argc - 3] : argv[argc - 2];
6454 if (anArg == "-allowoverlap")
6456 Standard_Boolean isValidated = isShiftSelection ? argc == 8
6460 di << "Wrong number of arguments! -allowoverlap key is applied only for rectangle selection";
6464 Standard_Integer isToAllow = isShiftSelection ? Draw::Atoi(argv[argc - 2]) : Draw::Atoi(argv[argc - 1]);
6465 myAIScontext->MainSelector()->AllowOverlapDetection (isToAllow != 0);
6469 Handle(ViewerTest_EventManager) aCurrentEventManager = ViewerTest::CurrentEventManager();
6470 aCurrentEventManager->MoveTo(atoi(argv[1]),atoi(argv[2]));
6473 if(isShiftSelection)
6474 aCurrentEventManager->ShiftSelect();
6476 aCurrentEventManager->Select();
6478 else if(aCoordsNb == 4)
6480 if(isShiftSelection)
6481 aCurrentEventManager->ShiftSelect (atoi (argv[1]), atoi (argv[2]), atoi (argv[3]), atoi (argv[4]), Standard_False);
6483 aCurrentEventManager->Select (atoi (argv[1]), atoi (argv[2]), atoi (argv[3]), atoi (argv[4]), Standard_False);
6487 TColgp_Array1OfPnt2d aPolyline (1,aCoordsNb / 2);
6489 for(Standard_Integer i=1;i<=aCoordsNb / 2;++i)
6490 aPolyline.SetValue(i,gp_Pnt2d(atoi(argv[2*i-1]),atoi(argv[2*i])));
6492 if(isShiftSelection)
6493 aCurrentEventManager->ShiftSelect(aPolyline);
6495 aCurrentEventManager->Select(aPolyline);
6500 //=======================================================================
6501 //function : VMoveTo
6502 //purpose : Emulates cursor movement to defined pixel position
6503 //=======================================================================
6504 static Standard_Integer VMoveTo (Draw_Interpretor& di,
6505 Standard_Integer argc,
6510 di << "Usage : " << argv[0] << " x y\n";
6514 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
6515 if(aContext.IsNull())
6517 di << "use 'vinit' command before " << argv[0] << "\n";
6520 ViewerTest::CurrentEventManager()->MoveTo(atoi(argv[1]),atoi(argv[2]));
6526 //! Global map storing all animations registered in ViewerTest.
6527 static NCollection_DataMap<TCollection_AsciiString, Handle(AIS_Animation)> ViewerTest_AnimationTimelineMap;
6529 //! The animation calling the Draw Harness command.
6530 class ViewerTest_AnimationProc : public AIS_Animation
6534 //! Main constructor.
6535 ViewerTest_AnimationProc (const TCollection_AsciiString& theAnimationName,
6536 Draw_Interpretor* theDI,
6537 const TCollection_AsciiString& theCommand)
6538 : AIS_Animation (theAnimationName),
6540 myCommand (theCommand)
6547 //! Evaluate the command.
6548 virtual void update (const AIS_AnimationProgress& theProgress) Standard_OVERRIDE
6550 TCollection_AsciiString aCmd = myCommand;
6551 replace (aCmd, "%pts", TCollection_AsciiString(theProgress.Pts));
6552 replace (aCmd, "%localpts", TCollection_AsciiString(theProgress.LocalPts));
6553 replace (aCmd, "%ptslocal", TCollection_AsciiString(theProgress.LocalPts));
6554 replace (aCmd, "%normalized", TCollection_AsciiString(theProgress.LocalNormalized));
6555 replace (aCmd, "%localnormalized", TCollection_AsciiString(theProgress.LocalNormalized));
6556 myDrawInter->Eval (aCmd.ToCString());
6559 //! Find the keyword in the command and replace it with value.
6560 //! @return the position of the keyword to pass value
6561 void replace (TCollection_AsciiString& theCmd,
6562 const TCollection_AsciiString& theKey,
6563 const TCollection_AsciiString& theVal)
6565 TCollection_AsciiString aCmd (theCmd);
6567 const Standard_Integer aPos = aCmd.Search (theKey);
6573 TCollection_AsciiString aPart1, aPart2;
6574 Standard_Integer aPart1To = aPos - 1;
6576 && aPart1To <= theCmd.Length())
6578 aPart1 = theCmd.SubString (1, aPart1To);
6581 Standard_Integer aPart2From = aPos + theKey.Length();
6583 && aPart2From <= theCmd.Length())
6585 aPart2 = theCmd.SubString (aPart2From, theCmd.Length());
6588 theCmd = aPart1 + theVal + aPart2;
6593 Draw_Interpretor* myDrawInter;
6594 TCollection_AsciiString myCommand;
6598 //! Replace the animation with the new one.
6599 static void replaceAnimation (const Handle(AIS_Animation)& theParentAnimation,
6600 Handle(AIS_Animation)& theAnimation,
6601 const Handle(AIS_Animation)& theAnimationNew)
6603 theAnimationNew->CopyFrom (theAnimation);
6604 if (!theParentAnimation.IsNull())
6606 theParentAnimation->Replace (theAnimation, theAnimationNew);
6610 ViewerTest_AnimationTimelineMap.UnBind (theAnimationNew->Name());
6611 ViewerTest_AnimationTimelineMap.Bind (theAnimationNew->Name(), theAnimationNew);
6613 theAnimation = theAnimationNew;
6616 //! Parse the point.
6617 static Standard_Boolean parseXYZ (const char** theArgVec, gp_XYZ& thePnt)
6619 const TCollection_AsciiString anXYZ[3] = { theArgVec[0], theArgVec[1], theArgVec[2] };
6620 if (!anXYZ[0].IsRealValue()
6621 || !anXYZ[1].IsRealValue()
6622 || !anXYZ[2].IsRealValue())
6624 return Standard_False;
6627 thePnt.SetCoord (anXYZ[0].RealValue(), anXYZ[1].RealValue(), anXYZ[2].RealValue());
6628 return Standard_True;
6631 //! Parse the quaternion.
6632 static Standard_Boolean parseQuaternion (const char** theArgVec, gp_Quaternion& theQRot)
6634 const TCollection_AsciiString anXYZW[4] = {theArgVec[0], theArgVec[1], theArgVec[2], theArgVec[3]};
6635 if (!anXYZW[0].IsRealValue()
6636 || !anXYZW[1].IsRealValue()
6637 || !anXYZW[2].IsRealValue()
6638 || !anXYZW[3].IsRealValue())
6640 return Standard_False;
6643 theQRot.Set (anXYZW[0].RealValue(), anXYZW[1].RealValue(), anXYZW[2].RealValue(), anXYZW[3].RealValue());
6644 return Standard_True;
6647 //! Auxiliary class for flipping image upside-down.
6652 //! Empty constructor.
6653 ImageFlipper() : myTmp (NCollection_BaseAllocator::CommonBaseAllocator()) {}
6655 //! Perform flipping.
6656 Standard_Boolean FlipY (Image_PixMap& theImage)
6658 if (theImage.IsEmpty()
6659 || theImage.SizeX() == 0
6660 || theImage.SizeY() == 0)
6662 return Standard_False;
6665 const Standard_Size aRowSize = theImage.SizeRowBytes();
6666 if (myTmp.Size() < aRowSize
6667 && !myTmp.Allocate (aRowSize))
6669 return Standard_False;
6672 // for odd height middle row should be left as is
6673 Standard_Size aNbRowsHalf = theImage.SizeY() / 2;
6674 for (Standard_Size aRowT = 0, aRowB = theImage.SizeY() - 1; aRowT < aNbRowsHalf; ++aRowT, --aRowB)
6676 Standard_Byte* aTop = theImage.ChangeRow (aRowT);
6677 Standard_Byte* aBot = theImage.ChangeRow (aRowB);
6678 memcpy (myTmp.ChangeData(), aTop, aRowSize);
6679 memcpy (aTop, aBot, aRowSize);
6680 memcpy (aBot, myTmp.Data(), aRowSize);
6682 return Standard_True;
6686 NCollection_Buffer myTmp;
6691 //=================================================================================================
6692 //function : VViewParams
6693 //purpose : Gets or sets AIS View characteristics
6694 //=================================================================================================
6695 static int VViewParams (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgVec)
6697 Handle(V3d_View) aView = ViewerTest::CurrentView();
6700 std::cout << theArgVec[0] << ": please initialize or activate view.\n";
6704 Standard_Boolean toSetProj = Standard_False;
6705 Standard_Boolean toSetUp = Standard_False;
6706 Standard_Boolean toSetAt = Standard_False;
6707 Standard_Boolean toSetEye = Standard_False;
6708 Standard_Boolean toSetScale = Standard_False;
6709 Standard_Boolean toSetSize = Standard_False;
6710 Standard_Boolean toSetCenter2d = Standard_False;
6711 Standard_Real aViewScale = aView->Scale();
6712 Standard_Real aViewSize = 1.0;
6713 Graphic3d_Vec2i aCenter2d;
6714 gp_XYZ aViewProj, aViewUp, aViewAt, aViewEye;
6715 aView->Proj (aViewProj.ChangeCoord (1), aViewProj.ChangeCoord (2), aViewProj.ChangeCoord (3));
6716 aView->Up (aViewUp .ChangeCoord (1), aViewUp .ChangeCoord (2), aViewUp .ChangeCoord (3));
6717 aView->At (aViewAt .ChangeCoord (1), aViewAt .ChangeCoord (2), aViewAt .ChangeCoord (3));
6718 aView->Eye (aViewEye .ChangeCoord (1), aViewEye .ChangeCoord (2), aViewEye .ChangeCoord (3));
6721 // print all of the available view parameters
6725 "Proj: %12g %12g %12g\n"
6726 "Up: %12g %12g %12g\n"
6727 "At: %12g %12g %12g\n"
6728 "Eye: %12g %12g %12g\n",
6730 aViewProj.X(), aViewProj.Y(), aViewProj.Z(),
6731 aViewUp.X(), aViewUp.Y(), aViewUp.Z(),
6732 aViewAt.X(), aViewAt.Y(), aViewAt.Z(),
6733 aViewEye.X(), aViewEye.Y(), aViewEye.Z());
6738 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), aView);
6739 for (Standard_Integer anArgIter = 1; anArgIter < theArgsNb; ++anArgIter)
6741 TCollection_AsciiString anArg (theArgVec[anArgIter]);
6743 if (anUpdateTool.parseRedrawMode (anArg))
6747 else if (anArg == "-cmd"
6748 || anArg == "-command"
6749 || anArg == "-args")
6758 aViewProj.X(), aViewProj.Y(), aViewProj.Z(),
6759 aViewUp.X(), aViewUp.Y(), aViewUp.Z(),
6760 aViewAt.X(), aViewAt.Y(), aViewAt.Z());
6763 else if (anArg == "-scale"
6764 || anArg == "-size")
6766 if (anArgIter + 1 < theArgsNb
6767 && *theArgVec[anArgIter + 1] != '-')
6769 const TCollection_AsciiString aValueArg (theArgVec[anArgIter + 1]);
6770 if (aValueArg.IsRealValue())
6773 if (anArg == "-scale")
6775 toSetScale = Standard_True;
6776 aViewScale = aValueArg.RealValue();
6778 else if (anArg == "-size")
6780 toSetSize = Standard_True;
6781 aViewSize = aValueArg.RealValue();
6786 if (anArg == "-scale")
6788 theDi << "Scale: " << aView->Scale() << "\n";
6790 else if (anArg == "-size")
6792 Graphic3d_Vec2d aSizeXY;
6793 aView->Size (aSizeXY.x(), aSizeXY.y());
6794 theDi << "Size: " << aSizeXY.x() << " " << aSizeXY.y() << "\n";
6797 else if (anArg == "-eye"
6800 || anArg == "-proj")
6802 if (anArgIter + 3 < theArgsNb)
6805 if (parseXYZ (theArgVec + anArgIter + 1, anXYZ))
6808 if (anArg == "-eye")
6810 toSetEye = Standard_True;
6813 else if (anArg == "-at")
6815 toSetAt = Standard_True;
6818 else if (anArg == "-up")
6820 toSetUp = Standard_True;
6823 else if (anArg == "-proj")
6825 toSetProj = Standard_True;
6832 if (anArg == "-eye")
6834 theDi << "Eye: " << aViewEye.X() << " " << aViewEye.Y() << " " << aViewEye.Z() << "\n";
6836 else if (anArg == "-at")
6838 theDi << "At: " << aViewAt.X() << " " << aViewAt.Y() << " " << aViewAt.Z() << "\n";
6840 else if (anArg == "-up")
6842 theDi << "Up: " << aViewUp.X() << " " << aViewUp.Y() << " " << aViewUp.Z() << "\n";
6844 else if (anArg == "-proj")
6846 theDi << "Proj: " << aViewProj.X() << " " << aViewProj.Y() << " " << aViewProj.Z() << "\n";
6849 else if (anArg == "-center")
6851 if (anArgIter + 2 < theArgsNb)
6853 const TCollection_AsciiString anX (theArgVec[anArgIter + 1]);
6854 const TCollection_AsciiString anY (theArgVec[anArgIter + 2]);
6855 if (anX.IsIntegerValue()
6856 && anY.IsIntegerValue())
6858 toSetCenter2d = Standard_True;
6859 aCenter2d = Graphic3d_Vec2i (anX.IntegerValue(), anY.IntegerValue());
6865 std::cout << "Syntax error at '" << anArg << "'\n";
6870 // change view parameters in proper order
6873 aView->SetScale (aViewScale);
6877 aView->SetSize (aViewSize);
6881 aView->SetEye (aViewEye.X(), aViewEye.Y(), aViewEye.Z());
6885 aView->SetAt (aViewAt.X(), aViewAt.Y(), aViewAt.Z());
6889 aView->SetProj (aViewProj.X(), aViewProj.Y(), aViewProj.Z());
6893 aView->SetUp (aViewUp.X(), aViewUp.Y(), aViewUp.Z());
6897 aView->SetCenter (aCenter2d.x(), aCenter2d.y());
6903 //==============================================================================
6904 //function : VAnimation
6906 //==============================================================================
6907 static Standard_Integer VAnimation (Draw_Interpretor& theDI,
6908 Standard_Integer theArgNb,
6909 const char** theArgVec)
6911 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
6914 for (NCollection_DataMap<TCollection_AsciiString, Handle(AIS_Animation)>::Iterator
6915 anAnimIter (ViewerTest_AnimationTimelineMap); anAnimIter.More(); anAnimIter.Next())
6917 theDI << anAnimIter.Key() << " " << anAnimIter.Value()->Duration() << " sec\n";
6923 std::cout << "Error: no active view\n";
6927 Standard_Integer anArgIter = 1;
6928 TCollection_AsciiString aNameArg (theArgVec[anArgIter++]);
6929 if (aNameArg.IsEmpty())
6931 std::cout << "Syntax error: animation name is not defined.\n";
6935 TCollection_AsciiString aNameArgLower = aNameArg;
6936 aNameArgLower.LowerCase();
6937 if (aNameArgLower == "-reset"
6938 || aNameArgLower == "-clear")
6940 ViewerTest_AnimationTimelineMap.Clear();
6943 else if (aNameArg.Value (1) == '-')
6945 std::cout << "Syntax error: invalid animation name '" << aNameArg << "'.\n";
6949 const char* aNameSplitter = "/";
6950 Standard_Integer aSplitPos = aNameArg.Search (aNameSplitter);
6951 if (aSplitPos == -1)
6953 aNameSplitter = ".";
6954 aSplitPos = aNameArg.Search (aNameSplitter);
6957 // find existing or create a new animation by specified name within syntax "parent.child".
6958 Handle(AIS_Animation) aRootAnimation, aParentAnimation, anAnimation;
6959 for (; !aNameArg.IsEmpty();)
6961 TCollection_AsciiString aNameParent;
6962 if (aSplitPos != -1)
6964 if (aSplitPos == aNameArg.Length())
6966 std::cout << "Syntax error: animation name is not defined.\n";
6970 aNameParent = aNameArg.SubString ( 1, aSplitPos - 1);
6971 aNameArg = aNameArg.SubString (aSplitPos + 1, aNameArg.Length());
6973 aSplitPos = aNameArg.Search (aNameSplitter);
6977 aNameParent = aNameArg;
6981 if (anAnimation.IsNull())
6983 if (!ViewerTest_AnimationTimelineMap.Find (aNameParent, anAnimation))
6985 anAnimation = new AIS_Animation (aNameParent);
6986 ViewerTest_AnimationTimelineMap.Bind (aNameParent, anAnimation);
6988 aRootAnimation = anAnimation;
6992 aParentAnimation = anAnimation;
6993 anAnimation = aParentAnimation->Find (aNameParent);
6994 if (anAnimation.IsNull())
6996 anAnimation = new AIS_Animation (aNameParent);
6997 aParentAnimation->Add (anAnimation);
7002 if (anArgIter >= theArgNb)
7004 // just print the list of children
7005 for (NCollection_Sequence<Handle(AIS_Animation)>::Iterator anAnimIter (anAnimation->Children()); anAnimIter.More(); anAnimIter.Next())
7007 theDI << anAnimIter.Value()->Name() << " " << anAnimIter.Value()->Duration() << " sec\n";
7012 // animation parameters
7013 Standard_Boolean toPlay = Standard_False;
7014 Standard_Real aPlaySpeed = 1.0;
7015 Standard_Real aPlayStartTime = anAnimation->StartPts();
7016 Standard_Real aPlayDuration = anAnimation->Duration();
7017 Standard_Boolean isFreeCamera = Standard_False;
7018 Standard_Boolean isLockLoop = Standard_False;
7020 // video recording parameters
7021 TCollection_AsciiString aRecFile;
7022 Image_VideoParams aRecParams;
7024 Handle(V3d_View) aView = ViewerTest::CurrentView();
7025 for (; anArgIter < theArgNb; ++anArgIter)
7027 TCollection_AsciiString anArg (theArgVec[anArgIter]);
7030 if (anArg == "-reset"
7031 || anArg == "-clear")
7033 anAnimation->Clear();
7035 else if (anArg == "-remove"
7037 || anArg == "-delete")
7039 if (!aParentAnimation.IsNull())
7041 ViewerTest_AnimationTimelineMap.UnBind (anAnimation->Name());
7045 aParentAnimation->Remove (anAnimation);
7049 else if (anArg == "-play")
7051 toPlay = Standard_True;
7052 if (++anArgIter < theArgNb)
7054 if (*theArgVec[anArgIter] == '-')
7059 aPlayStartTime = Draw::Atof (theArgVec[anArgIter]);
7061 if (++anArgIter < theArgNb)
7063 if (*theArgVec[anArgIter] == '-')
7068 aPlayDuration = Draw::Atof (theArgVec[anArgIter]);
7072 else if (anArg == "-resume")
7074 toPlay = Standard_True;
7075 aPlayStartTime = anAnimation->ElapsedTime();
7076 if (++anArgIter < theArgNb)
7078 if (*theArgVec[anArgIter] == '-')
7084 aPlayDuration = Draw::Atof (theArgVec[anArgIter]);
7087 else if (anArg == "-playspeed"
7088 || anArg == "-speed")
7090 if (++anArgIter >= theArgNb)
7092 std::cout << "Syntax error at " << anArg << ".\n";
7095 aPlaySpeed = Draw::Atof (theArgVec[anArgIter]);
7097 else if (anArg == "-lock"
7098 || anArg == "-lockloop"
7099 || anArg == "-playlockloop")
7101 isLockLoop = Standard_True;
7103 else if (anArg == "-freecamera"
7104 || anArg == "-playfreecamera"
7105 || anArg == "-freelook")
7107 isFreeCamera = Standard_True;
7109 // video recodring options
7110 else if (anArg == "-rec"
7111 || anArg == "-record")
7113 if (++anArgIter >= theArgNb)
7115 std::cout << "Syntax error at " << anArg << ".\n";
7119 aRecFile = theArgVec[anArgIter];
7120 if (aRecParams.FpsNum <= 0)
7122 aRecParams.FpsNum = 24;
7125 if (anArgIter + 2 < theArgNb
7126 && *theArgVec[anArgIter + 1] != '-'
7127 && *theArgVec[anArgIter + 2] != '-')
7129 TCollection_AsciiString aWidthArg (theArgVec[anArgIter + 1]);
7130 TCollection_AsciiString aHeightArg (theArgVec[anArgIter + 2]);
7131 if (aWidthArg .IsIntegerValue()
7132 && aHeightArg.IsIntegerValue())
7134 aRecParams.Width = aWidthArg .IntegerValue();
7135 aRecParams.Height = aHeightArg.IntegerValue();
7140 else if (anArg == "-fps")
7142 if (++anArgIter >= theArgNb)
7144 std::cout << "Syntax error at " << anArg << ".\n";
7148 TCollection_AsciiString aFpsArg (theArgVec[anArgIter]);
7149 Standard_Integer aSplitIndex = aFpsArg.FirstLocationInSet ("/", 1, aFpsArg.Length());
7150 if (aSplitIndex == 0)
7152 aRecParams.FpsNum = aFpsArg.IntegerValue();
7156 const TCollection_AsciiString aDenStr = aFpsArg.Split (aSplitIndex);
7157 aFpsArg.Split (aFpsArg.Length() - 1);
7158 const TCollection_AsciiString aNumStr = aFpsArg;
7159 aRecParams.FpsNum = aNumStr.IntegerValue();
7160 aRecParams.FpsDen = aDenStr.IntegerValue();
7161 if (aRecParams.FpsDen < 1)
7163 std::cout << "Syntax error at " << anArg << ".\n";
7168 else if (anArg == "-format")
7170 if (++anArgIter >= theArgNb)
7172 std::cout << "Syntax error at " << anArg << ".\n";
7175 aRecParams.Format = theArgVec[anArgIter];
7177 else if (anArg == "-pix_fmt"
7178 || anArg == "-pixfmt"
7179 || anArg == "-pixelformat")
7181 if (++anArgIter >= theArgNb)
7183 std::cout << "Syntax error at " << anArg << ".\n";
7186 aRecParams.PixelFormat = theArgVec[anArgIter];
7188 else if (anArg == "-codec"
7189 || anArg == "-vcodec"
7190 || anArg == "-videocodec")
7192 if (++anArgIter >= theArgNb)
7194 std::cout << "Syntax error at " << anArg << ".\n";
7197 aRecParams.VideoCodec = theArgVec[anArgIter];
7199 else if (anArg == "-crf"
7200 || anArg == "-preset"
7203 const TCollection_AsciiString aParamName = anArg.SubString (2, anArg.Length());
7204 if (++anArgIter >= theArgNb)
7206 std::cout << "Syntax error at " << anArg << ".\n";
7210 aRecParams.VideoCodecParams.Bind (aParamName, theArgVec[anArgIter]);
7212 // animation definition options
7213 else if (anArg == "-start"
7214 || anArg == "-starttime"
7215 || anArg == "-startpts")
7217 if (++anArgIter >= theArgNb)
7219 std::cout << "Syntax error at " << anArg << ".\n";
7223 anAnimation->SetStartPts (Draw::Atof (theArgVec[anArgIter]));
7224 aRootAnimation->UpdateTotalDuration();
7226 else if (anArg == "-end"
7227 || anArg == "-endtime"
7228 || anArg == "-endpts")
7230 if (++anArgIter >= theArgNb)
7232 std::cout << "Syntax error at " << anArg << ".\n";
7236 anAnimation->SetOwnDuration (Draw::Atof (theArgVec[anArgIter]) - anAnimation->StartPts());
7237 aRootAnimation->UpdateTotalDuration();
7239 else if (anArg == "-dur"
7240 || anArg == "-duration")
7242 if (++anArgIter >= theArgNb)
7244 std::cout << "Syntax error at " << anArg << ".\n";
7248 anAnimation->SetOwnDuration (Draw::Atof (theArgVec[anArgIter]));
7249 aRootAnimation->UpdateTotalDuration();
7251 else if (anArg == "-command"
7253 || anArg == "-invoke"
7255 || anArg == "-proc")
7257 if (++anArgIter >= theArgNb)
7259 std::cout << "Syntax error at " << anArg << ".\n";
7263 Handle(ViewerTest_AnimationProc) aCmdAnimation = new ViewerTest_AnimationProc (anAnimation->Name(), &theDI, theArgVec[anArgIter]);
7264 replaceAnimation (aParentAnimation, anAnimation, aCmdAnimation);
7266 else if (anArg == "-objecttrsf"
7267 || anArg == "-objectransformation"
7268 || anArg == "-objtransformation"
7269 || anArg == "-objtrsf"
7270 || anArg == "-object"
7273 if (++anArgIter >= theArgNb)
7275 std::cout << "Syntax error at " << anArg << ".\n";
7279 TCollection_AsciiString anObjName (theArgVec[anArgIter]);
7280 const ViewerTest_DoubleMapOfInteractiveAndName& aMapOfAIS = GetMapOfAIS();
7281 if (!aMapOfAIS.IsBound2 (anObjName))
7283 std::cout << "Syntax error: wrong object name at " << anArg << "\n";
7287 Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast (aMapOfAIS.Find2 (anObjName));
7288 gp_Trsf aTrsfs [2] = { anObject->LocalTransformation(), anObject->LocalTransformation() };
7289 gp_Quaternion aRotQuats[2] = { aTrsfs[0].GetRotation(), aTrsfs[1].GetRotation() };
7290 gp_XYZ aLocPnts [2] = { aTrsfs[0].TranslationPart(), aTrsfs[1].TranslationPart() };
7291 Standard_Real aScales [2] = { aTrsfs[0].ScaleFactor(), aTrsfs[1].ScaleFactor() };
7292 Standard_Boolean isTrsfSet = Standard_False;
7293 Standard_Integer aTrsfArgIter = anArgIter + 1;
7294 for (; aTrsfArgIter < theArgNb; ++aTrsfArgIter)
7296 TCollection_AsciiString aTrsfArg (theArgVec[aTrsfArgIter]);
7297 aTrsfArg.LowerCase();
7298 const Standard_Integer anIndex = aTrsfArg.EndsWith ("1") ? 0 : 1;
7299 if (aTrsfArg.StartsWith ("-rotation")
7300 || aTrsfArg.StartsWith ("-rot"))
7302 isTrsfSet = Standard_True;
7303 if (aTrsfArgIter + 4 >= theArgNb
7304 || !parseQuaternion (theArgVec + aTrsfArgIter + 1, aRotQuats[anIndex]))
7306 std::cout << "Syntax error at " << aTrsfArg << ".\n";
7311 else if (aTrsfArg.StartsWith ("-location")
7312 || aTrsfArg.StartsWith ("-loc"))
7314 isTrsfSet = Standard_True;
7315 if (aTrsfArgIter + 3 >= theArgNb
7316 || !parseXYZ (theArgVec + aTrsfArgIter + 1, aLocPnts[anIndex]))
7318 std::cout << "Syntax error at " << aTrsfArg << ".\n";
7323 else if (aTrsfArg.StartsWith ("-scale"))
7325 isTrsfSet = Standard_True;
7326 if (++aTrsfArgIter >= theArgNb)
7328 std::cout << "Syntax error at " << aTrsfArg << ".\n";
7332 const TCollection_AsciiString aScaleStr (theArgVec[aTrsfArgIter]);
7333 if (!aScaleStr.IsRealValue())
7335 std::cout << "Syntax error at " << aTrsfArg << ".\n";
7338 aScales[anIndex] = aScaleStr.RealValue();
7342 anArgIter = aTrsfArgIter - 1;
7348 std::cout << "Syntax error at " << anArg << ".\n";
7351 else if (aTrsfArgIter >= theArgNb)
7353 anArgIter = theArgNb;
7356 aTrsfs[0].SetRotation (aRotQuats[0]);
7357 aTrsfs[1].SetRotation (aRotQuats[1]);
7358 aTrsfs[0].SetTranslationPart (aLocPnts[0]);
7359 aTrsfs[1].SetTranslationPart (aLocPnts[1]);
7360 aTrsfs[0].SetScaleFactor (aScales[0]);
7361 aTrsfs[1].SetScaleFactor (aScales[1]);
7363 Handle(AIS_AnimationObject) anObjAnimation = new AIS_AnimationObject (anAnimation->Name(), aCtx, anObject, aTrsfs[0], aTrsfs[1]);
7364 replaceAnimation (aParentAnimation, anAnimation, anObjAnimation);
7366 else if (anArg == "-viewtrsf"
7367 || anArg == "-view")
7369 Handle(AIS_AnimationCamera) aCamAnimation = Handle(AIS_AnimationCamera)::DownCast (anAnimation);
7370 if (aCamAnimation.IsNull())
7372 aCamAnimation = new AIS_AnimationCamera (anAnimation->Name(), aView);
7373 replaceAnimation (aParentAnimation, anAnimation, aCamAnimation);
7376 Handle(Graphic3d_Camera) aCams[2] =
7378 new Graphic3d_Camera (aCamAnimation->View()->Camera()),
7379 new Graphic3d_Camera (aCamAnimation->View()->Camera())
7382 Standard_Boolean isTrsfSet = Standard_False;
7383 Standard_Integer aViewArgIter = anArgIter + 1;
7384 for (; aViewArgIter < theArgNb; ++aViewArgIter)
7386 TCollection_AsciiString aViewArg (theArgVec[aViewArgIter]);
7387 aViewArg.LowerCase();
7388 const Standard_Integer anIndex = aViewArg.EndsWith("1") ? 0 : 1;
7389 if (aViewArg.StartsWith ("-scale"))
7391 isTrsfSet = Standard_True;
7392 if (++aViewArgIter >= theArgNb)
7394 std::cout << "Syntax error at " << anArg << ".\n";
7398 const TCollection_AsciiString aScaleStr (theArgVec[aViewArgIter]);
7399 if (!aScaleStr.IsRealValue())
7401 std::cout << "Syntax error at " << aViewArg << ".\n";
7404 Standard_Real aScale = aScaleStr.RealValue();
7405 aScale = aCamAnimation->View()->DefaultCamera()->Scale() / aScale;
7406 aCams[anIndex]->SetScale (aScale);
7408 else if (aViewArg.StartsWith ("-eye")
7409 || aViewArg.StartsWith ("-center")
7410 || aViewArg.StartsWith ("-at")
7411 || aViewArg.StartsWith ("-up"))
7413 isTrsfSet = Standard_True;
7415 if (aViewArgIter + 3 >= theArgNb
7416 || !parseXYZ (theArgVec + aViewArgIter + 1, anXYZ))
7418 std::cout << "Syntax error at " << aViewArg << ".\n";
7423 if (aViewArg.StartsWith ("-eye"))
7425 aCams[anIndex]->SetEye (anXYZ);
7427 else if (aViewArg.StartsWith ("-center")
7428 || aViewArg.StartsWith ("-at"))
7430 aCams[anIndex]->SetCenter (anXYZ);
7432 else if (aViewArg.StartsWith ("-up"))
7434 aCams[anIndex]->SetUp (anXYZ);
7439 anArgIter = aViewArgIter - 1;
7445 std::cout << "Syntax error at " << anArg << ".\n";
7448 else if (aViewArgIter >= theArgNb)
7450 anArgIter = theArgNb;
7453 aCamAnimation->SetCameraStart(aCams[0]);
7454 aCamAnimation->SetCameraEnd (aCams[1]);
7458 std::cout << "Syntax error at " << anArg << ".\n";
7463 if (!toPlay && aRecFile.IsEmpty())
7468 // Start animation timeline and process frame updating.
7469 TheIsAnimating = Standard_True;
7470 const Standard_Boolean wasImmediateUpdate = aView->SetImmediateUpdate (Standard_False);
7471 Handle(Graphic3d_Camera) aCameraBack = new Graphic3d_Camera (aView->Camera());
7472 anAnimation->StartTimer (aPlayStartTime, aPlaySpeed, Standard_True, aPlayDuration <= 0.0);
7475 aView->Camera()->Copy (aCameraBack);
7478 const Standard_Real anUpperPts = aPlayStartTime + aPlayDuration;
7479 if (aRecParams.FpsNum <= 0)
7481 while (!anAnimation->IsStopped())
7483 aCameraBack->Copy (aView->Camera());
7484 const Standard_Real aPts = anAnimation->UpdateTimer();
7487 aView->Camera()->Copy (aCameraBack);
7490 if (aPts >= anUpperPts)
7492 anAnimation->Pause();
7496 if (aView->IsInvalidated())
7502 aView->RedrawImmediate();
7507 // handle user events
7508 theDI.Eval ("after 1 set waiter 1");
7509 theDI.Eval ("vwait waiter");
7511 if (!TheIsAnimating)
7513 anAnimation->Pause();
7519 if (aView->IsInvalidated())
7525 aView->RedrawImmediate();
7530 OSD_Timer aPerfTimer;
7533 Handle(Image_VideoRecorder) aRecorder;
7534 ImageFlipper aFlipper;
7535 Handle(Draw_ProgressIndicator) aProgress;
7536 if (!aRecFile.IsEmpty())
7538 if (aRecParams.Width <= 0
7539 || aRecParams.Height <= 0)
7541 aView->Window()->Size (aRecParams.Width, aRecParams.Height);
7544 aRecorder = new Image_VideoRecorder();
7545 if (!aRecorder->Open (aRecFile.ToCString(), aRecParams))
7547 std::cout << "Error: failed to open video file for recording\n";
7551 aProgress = new Draw_ProgressIndicator (theDI, 1);
7554 // Manage frame-rated animation here
7555 Standard_Real aPts = aPlayStartTime;
7556 int64_t aNbFrames = 0;
7557 Message_ProgressSentry aPSentry (aProgress, "Video recording, sec", 0, Max (1, Standard_Integer(aPlayDuration / aPlaySpeed)), 1);
7558 Standard_Integer aSecondsProgress = 0;
7559 for (; aPts <= anUpperPts && aPSentry.More();)
7561 const Standard_Real aRecPts = aPlaySpeed * ((Standard_Real(aRecParams.FpsDen) / Standard_Real(aRecParams.FpsNum)) * Standard_Real(aNbFrames));
7562 aPts = aPlayStartTime + aRecPts;
7564 if (!anAnimation->Update (aPts))
7569 if (!aRecorder.IsNull())
7571 V3d_ImageDumpOptions aDumpParams;
7572 aDumpParams.Width = aRecParams.Width;
7573 aDumpParams.Height = aRecParams.Height;
7574 aDumpParams.BufferType = Graphic3d_BT_RGBA;
7575 aDumpParams.StereoOptions = V3d_SDO_MONO;
7576 aDumpParams.ToAdjustAspect = Standard_True;
7577 if (!aView->ToPixMap (aRecorder->ChangeFrame(), aDumpParams))
7579 std::cout << "Error: view dump is failed!\n";
7582 aFlipper.FlipY (aRecorder->ChangeFrame());
7583 if (!aRecorder->PushFrame())
7593 while (aSecondsProgress < Standard_Integer(aRecPts / aPlaySpeed))
7601 anAnimation->Stop();
7602 const Standard_Real aRecFps = Standard_Real(aNbFrames) / aPerfTimer.ElapsedTime();
7603 theDI << "Average FPS: " << aRecFps << "\n"
7604 << "Nb. Frames: " << Standard_Real(aNbFrames);
7609 aView->SetImmediateUpdate (wasImmediateUpdate);
7610 TheIsAnimating = Standard_False;
7615 //=======================================================================
7616 //function : VChangeSelected
7617 //purpose : Adds the shape to selection or remove one from it
7618 //=======================================================================
7619 static Standard_Integer VChangeSelected (Draw_Interpretor& di,
7620 Standard_Integer argc,
7625 di<<"Usage : " << argv[0] << " shape \n";
7629 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
7630 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
7631 TCollection_AsciiString aName(argv[1]);
7632 Handle(AIS_InteractiveObject) anAISObject;
7634 if(!aMap.IsBound2(aName))
7636 di<<"Use 'vdisplay' before";
7641 anAISObject = Handle(AIS_InteractiveObject)::DownCast(aMap.Find2(aName));
7642 if(anAISObject.IsNull()){
7643 di<<"No interactive object \n";
7647 aContext->AddOrRemoveSelected(anAISObject, Standard_True);
7652 //=======================================================================
7653 //function : VNbSelected
7654 //purpose : Returns number of selected objects
7655 //=======================================================================
7656 static Standard_Integer VNbSelected (Draw_Interpretor& di,
7657 Standard_Integer argc,
7662 di << "Usage : " << argv[0] << "\n";
7665 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
7666 if(aContext.IsNull())
7668 di << "use 'vinit' command before " << argv[0] << "\n";
7671 di << aContext->NbSelected() << "\n";
7675 //=======================================================================
7676 //function : VPurgeDisplay
7677 //purpose : Switches altialiasing on or off
7678 //=======================================================================
7679 static Standard_Integer VPurgeDisplay (Draw_Interpretor& di,
7680 Standard_Integer argc,
7685 di << "Usage : " << argv[0] << "\n";
7688 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
7689 if (aContext.IsNull())
7691 di << "use 'vinit' command before " << argv[0] << "\n";
7695 di << aContext->PurgeDisplay() << "\n";
7699 //=======================================================================
7700 //function : VSetViewSize
7702 //=======================================================================
7703 static Standard_Integer VSetViewSize (Draw_Interpretor& di,
7704 Standard_Integer argc,
7707 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
7708 if(aContext.IsNull())
7710 di << "use 'vinit' command before " << argv[0] << "\n";
7715 di<<"Usage : " << argv[0] << " Size\n";
7718 Standard_Real aSize = Draw::Atof (argv[1]);
7721 di<<"Bad Size value : " << aSize << "\n";
7725 Handle(V3d_View) aView = ViewerTest::CurrentView();
7726 aView->SetSize(aSize);
7730 //=======================================================================
7731 //function : VMoveView
7733 //=======================================================================
7734 static Standard_Integer VMoveView (Draw_Interpretor& di,
7735 Standard_Integer argc,
7738 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
7739 if(aContext.IsNull())
7741 di << "use 'vinit' command before " << argv[0] << "\n";
7744 if(argc < 4 || argc > 5)
7746 di<<"Usage : " << argv[0] << " Dx Dy Dz [Start = 1|0]\n";
7749 Standard_Real Dx = Draw::Atof (argv[1]);
7750 Standard_Real Dy = Draw::Atof (argv[2]);
7751 Standard_Real Dz = Draw::Atof (argv[3]);
7752 Standard_Boolean aStart = Standard_True;
7755 aStart = (Draw::Atoi (argv[4]) > 0);
7758 Handle(V3d_View) aView = ViewerTest::CurrentView();
7759 aView->Move(Dx,Dy,Dz,aStart);
7763 //=======================================================================
7764 //function : VTranslateView
7766 //=======================================================================
7767 static Standard_Integer VTranslateView (Draw_Interpretor& di,
7768 Standard_Integer argc,
7771 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
7772 if(aContext.IsNull())
7774 di << "use 'vinit' command before " << argv[0] << "\n";
7777 if(argc < 4 || argc > 5)
7779 di<<"Usage : " << argv[0] << " Dx Dy Dz [Start = 1|0]\n";
7782 Standard_Real Dx = Draw::Atof (argv[1]);
7783 Standard_Real Dy = Draw::Atof (argv[2]);
7784 Standard_Real Dz = Draw::Atof (argv[3]);
7785 Standard_Boolean aStart = Standard_True;
7788 aStart = (Draw::Atoi (argv[4]) > 0);
7791 Handle(V3d_View) aView = ViewerTest::CurrentView();
7792 aView->Translate(Dx,Dy,Dz,aStart);
7796 //=======================================================================
7797 //function : VTurnView
7799 //=======================================================================
7800 static Standard_Integer VTurnView (Draw_Interpretor& di,
7801 Standard_Integer argc,
7804 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
7805 if(aContext.IsNull()) {
7806 di << "use 'vinit' command before " << argv[0] << "\n";
7809 if(argc < 4 || argc > 5){
7810 di<<"Usage : " << argv[0] << " Ax Ay Az [Start = 1|0]\n";
7813 Standard_Real Ax = Draw::Atof (argv[1]);
7814 Standard_Real Ay = Draw::Atof (argv[2]);
7815 Standard_Real Az = Draw::Atof (argv[3]);
7816 Standard_Boolean aStart = Standard_True;
7819 aStart = (Draw::Atoi (argv[4]) > 0);
7822 Handle(V3d_View) aView = ViewerTest::CurrentView();
7823 aView->Turn(Ax,Ay,Az,aStart);
7827 //==============================================================================
7828 //function : VTextureEnv
7829 //purpose : ENables or disables environment mapping
7830 //==============================================================================
7831 class OCC_TextureEnv : public Graphic3d_TextureEnv
7834 OCC_TextureEnv(const Standard_CString FileName);
7835 OCC_TextureEnv(const Graphic3d_NameOfTextureEnv aName);
7836 void SetTextureParameters(const Standard_Boolean theRepeatFlag,
7837 const Standard_Boolean theModulateFlag,
7838 const Graphic3d_TypeOfTextureFilter theFilter,
7839 const Standard_ShortReal theXScale,
7840 const Standard_ShortReal theYScale,
7841 const Standard_ShortReal theXShift,
7842 const Standard_ShortReal theYShift,
7843 const Standard_ShortReal theAngle);
7844 DEFINE_STANDARD_RTTI_INLINE(OCC_TextureEnv,Graphic3d_TextureEnv)
7846 DEFINE_STANDARD_HANDLE(OCC_TextureEnv, Graphic3d_TextureEnv)
7848 OCC_TextureEnv::OCC_TextureEnv(const Standard_CString theFileName)
7849 : Graphic3d_TextureEnv(theFileName)
7853 OCC_TextureEnv::OCC_TextureEnv(const Graphic3d_NameOfTextureEnv theTexId)
7854 : Graphic3d_TextureEnv(theTexId)
7858 void OCC_TextureEnv::SetTextureParameters(const Standard_Boolean theRepeatFlag,
7859 const Standard_Boolean theModulateFlag,
7860 const Graphic3d_TypeOfTextureFilter theFilter,
7861 const Standard_ShortReal theXScale,
7862 const Standard_ShortReal theYScale,
7863 const Standard_ShortReal theXShift,
7864 const Standard_ShortReal theYShift,
7865 const Standard_ShortReal theAngle)
7867 myParams->SetRepeat (theRepeatFlag);
7868 myParams->SetModulate (theModulateFlag);
7869 myParams->SetFilter (theFilter);
7870 myParams->SetScale (Graphic3d_Vec2(theXScale, theYScale));
7871 myParams->SetTranslation(Graphic3d_Vec2(theXShift, theYShift));
7872 myParams->SetRotation (theAngle);
7875 static int VTextureEnv (Draw_Interpretor& /*theDI*/, Standard_Integer theArgNb, const char** theArgVec)
7877 // get the active view
7878 Handle(V3d_View) aView = ViewerTest::CurrentView();
7881 std::cerr << "No active view. Please call vinit.\n";
7885 // Checking the input arguments
7886 Standard_Boolean anEnableFlag = Standard_False;
7887 Standard_Boolean isOk = theArgNb >= 2;
7890 TCollection_AsciiString anEnableOpt(theArgVec[1]);
7891 anEnableFlag = anEnableOpt.IsEqual("on");
7892 isOk = anEnableFlag || anEnableOpt.IsEqual("off");
7896 isOk = (theArgNb == 3 || theArgNb == 11);
7899 TCollection_AsciiString aTextureOpt(theArgVec[2]);
7900 isOk = (!aTextureOpt.IsIntegerValue() ||
7901 (aTextureOpt.IntegerValue() >= 0 && aTextureOpt.IntegerValue() < Graphic3d_NOT_ENV_UNKNOWN));
7903 if (isOk && theArgNb == 11)
7905 TCollection_AsciiString aRepeatOpt (theArgVec[3]),
7906 aModulateOpt(theArgVec[4]),
7907 aFilterOpt (theArgVec[5]),
7908 aSScaleOpt (theArgVec[6]),
7909 aTScaleOpt (theArgVec[7]),
7910 aSTransOpt (theArgVec[8]),
7911 aTTransOpt (theArgVec[9]),
7912 anAngleOpt (theArgVec[10]);
7913 isOk = ((aRepeatOpt. IsEqual("repeat") || aRepeatOpt. IsEqual("clamp")) &&
7914 (aModulateOpt.IsEqual("modulate") || aModulateOpt.IsEqual("decal")) &&
7915 (aFilterOpt. IsEqual("nearest") || aFilterOpt. IsEqual("bilinear") || aFilterOpt.IsEqual("trilinear")) &&
7916 aSScaleOpt.IsRealValue() && aTScaleOpt.IsRealValue() &&
7917 aSTransOpt.IsRealValue() && aTTransOpt.IsRealValue() &&
7918 anAngleOpt.IsRealValue());
7925 std::cerr << "Usage :" << std::endl;
7926 std::cerr << theArgVec[0] << " off" << std::endl;
7927 std::cerr << theArgVec[0] << " on {index_of_std_texture(0..7)|texture_file_name} [{clamp|repeat} {decal|modulate} {nearest|bilinear|trilinear} scale_s scale_t translation_s translation_t rotation_degrees]" << std::endl;
7933 TCollection_AsciiString aTextureOpt(theArgVec[2]);
7934 Handle(OCC_TextureEnv) aTexEnv = aTextureOpt.IsIntegerValue() ?
7935 new OCC_TextureEnv((Graphic3d_NameOfTextureEnv)aTextureOpt.IntegerValue()) :
7936 new OCC_TextureEnv(theArgVec[2]);
7940 TCollection_AsciiString aRepeatOpt(theArgVec[3]), aModulateOpt(theArgVec[4]), aFilterOpt(theArgVec[5]);
7941 aTexEnv->SetTextureParameters(
7942 aRepeatOpt. IsEqual("repeat"),
7943 aModulateOpt.IsEqual("modulate"),
7944 aFilterOpt. IsEqual("nearest") ? Graphic3d_TOTF_NEAREST :
7945 aFilterOpt.IsEqual("bilinear") ? Graphic3d_TOTF_BILINEAR :
7946 Graphic3d_TOTF_TRILINEAR,
7947 (Standard_ShortReal)Draw::Atof(theArgVec[6]),
7948 (Standard_ShortReal)Draw::Atof(theArgVec[7]),
7949 (Standard_ShortReal)Draw::Atof(theArgVec[8]),
7950 (Standard_ShortReal)Draw::Atof(theArgVec[9]),
7951 (Standard_ShortReal)Draw::Atof(theArgVec[10])
7954 aView->SetTextureEnv(aTexEnv);
7956 else // Disabling environment mapping
7958 Handle(Graphic3d_TextureEnv) aTexture;
7959 aView->SetTextureEnv(aTexture); // Passing null handle to clear the texture data
7968 typedef NCollection_DataMap<TCollection_AsciiString, Handle(Graphic3d_ClipPlane)> MapOfPlanes;
7970 //! Remove registered clipping plane from all views and objects.
7971 static void removePlane (MapOfPlanes& theRegPlanes,
7972 const TCollection_AsciiString& theName)
7974 Handle(Graphic3d_ClipPlane) aClipPlane;
7975 if (!theRegPlanes.Find (theName, aClipPlane))
7977 std::cout << "Warning: no such plane.\n";
7981 theRegPlanes.UnBind (theName);
7982 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIObjIt (GetMapOfAIS());
7983 anIObjIt.More(); anIObjIt.Next())
7985 Handle(PrsMgr_PresentableObject) aPrs = Handle(PrsMgr_PresentableObject)::DownCast (anIObjIt.Key1());
7986 aPrs->RemoveClipPlane (aClipPlane);
7989 for (NCollection_DoubleMap<TCollection_AsciiString, Handle(V3d_View)>::Iterator aViewIt(ViewerTest_myViews);
7990 aViewIt.More(); aViewIt.Next())
7992 const Handle(V3d_View)& aView = aViewIt.Key2();
7993 aView->RemoveClipPlane(aClipPlane);
7996 ViewerTest::RedrawAllViews();
8000 //===============================================================================================
8001 //function : VClipPlane
8003 //===============================================================================================
8004 static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgVec)
8006 // use short-cut for created clip planes map of created (or "registered by name") clip planes
8007 static MapOfPlanes aRegPlanes;
8011 for (MapOfPlanes::Iterator aPlaneIter (aRegPlanes); aPlaneIter.More(); aPlaneIter.Next())
8013 theDi << aPlaneIter.Key() << " ";
8018 TCollection_AsciiString aCommand (theArgVec[1]);
8019 aCommand.LowerCase();
8020 const Handle(V3d_View)& anActiveView = ViewerTest::CurrentView();
8021 if (anActiveView.IsNull())
8023 std::cout << "Error: no active view.\n";
8027 // print maximum number of planes for current viewer
8028 if (aCommand == "-maxplanes"
8029 || aCommand == "maxplanes")
8031 theDi << anActiveView->Viewer()->Driver()->InquirePlaneLimit()
8032 << " plane slots provided by driver.\n";
8036 // create / delete plane instance
8037 if (aCommand == "-create"
8038 || aCommand == "create"
8039 || aCommand == "-delete"
8040 || aCommand == "delete"
8041 || aCommand == "-clone"
8042 || aCommand == "clone")
8046 std::cout << "Syntax error: plane name is required.\n";
8050 Standard_Boolean toCreate = aCommand == "-create"
8051 || aCommand == "create";
8052 Standard_Boolean toClone = aCommand == "-clone"
8053 || aCommand == "clone";
8054 Standard_Boolean toDelete = aCommand == "-delete"
8055 || aCommand == "delete";
8056 TCollection_AsciiString aPlane (theArgVec[2]);
8060 if (aRegPlanes.IsBound (aPlane))
8062 std::cout << "Warning: existing plane has been overridden.\n";
8067 aRegPlanes.Bind (aPlane, new Graphic3d_ClipPlane());
8071 else if (toClone) // toClone
8073 if (!aRegPlanes.IsBound (aPlane))
8075 std::cout << "Error: no such plane.\n";
8078 else if (theArgsNb < 4)
8080 std::cout << "Syntax error: enter name for new plane.\n";
8084 TCollection_AsciiString aClone (theArgVec[3]);
8085 if (aRegPlanes.IsBound (aClone))
8087 std::cout << "Error: plane name is in use.\n";
8091 const Handle(Graphic3d_ClipPlane)& aClipPlane = aRegPlanes.Find (aPlane);
8093 aRegPlanes.Bind (aClone, aClipPlane->Clone());
8103 for (MapOfPlanes::Iterator aPlaneIter (aRegPlanes); aPlaneIter.More();)
8105 aPlane = aPlaneIter.Key();
8106 removePlane (aRegPlanes, aPlane);
8107 aPlaneIter = MapOfPlanes::Iterator (aRegPlanes);
8112 removePlane (aRegPlanes, aPlane);
8118 aRegPlanes.Bind (aPlane, new Graphic3d_ClipPlane());
8123 // set / unset plane command
8124 if (aCommand == "set"
8125 || aCommand == "unset")
8129 std::cout << "Syntax error: need more arguments.\n";
8133 // redirect to new syntax
8134 NCollection_Array1<const char*> anArgVec (1, theArgsNb - 1);
8135 anArgVec.SetValue (1, theArgVec[0]);
8136 anArgVec.SetValue (2, theArgVec[2]);
8137 anArgVec.SetValue (3, aCommand == "set" ? "-set" : "-unset");
8138 for (Standard_Integer anIt = 4; anIt < theArgsNb; ++anIt)
8140 anArgVec.SetValue (anIt, theArgVec[anIt]);
8143 return VClipPlane (theDi, anArgVec.Length(), &anArgVec.ChangeFirst());
8146 // change plane command
8147 TCollection_AsciiString aPlaneName;
8148 Handle(Graphic3d_ClipPlane) aClipPlane;
8149 Standard_Integer anArgIter = 0;
8150 if (aCommand == "-change"
8151 || aCommand == "change")
8153 // old syntax support
8156 std::cout << "Syntax error: need more arguments.\n";
8161 aPlaneName = theArgVec[2];
8162 if (!aRegPlanes.Find (aPlaneName, aClipPlane))
8164 std::cout << "Error: no such plane '" << aPlaneName << "'.\n";
8168 else if (aRegPlanes.Find (theArgVec[1], aClipPlane))
8171 aPlaneName = theArgVec[1];
8176 aPlaneName = theArgVec[1];
8177 aClipPlane = new Graphic3d_ClipPlane();
8178 aRegPlanes.Bind (aPlaneName, aClipPlane);
8179 theDi << "Created new plane " << aPlaneName << ".\n";
8182 if (theArgsNb - anArgIter < 1)
8184 std::cout << "Syntax error: need more arguments.\n";
8188 for (; anArgIter < theArgsNb; ++anArgIter)
8190 const char** aChangeArgs = theArgVec + anArgIter;
8191 Standard_Integer aNbChangeArgs = theArgsNb - anArgIter;
8192 TCollection_AsciiString aChangeArg (aChangeArgs[0]);
8193 aChangeArg.LowerCase();
8195 Standard_Boolean toEnable = Standard_True;
8196 if (ViewerTest::ParseOnOff (aChangeArgs[0], toEnable))
8198 aClipPlane->SetOn (toEnable);
8200 else if (aChangeArg == "-equation"
8201 || aChangeArg == "equation")
8203 if (aNbChangeArgs < 5)
8205 std::cout << "Syntax error: need more arguments.\n";
8209 Standard_Real aCoeffA = Draw::Atof (aChangeArgs [1]);
8210 Standard_Real aCoeffB = Draw::Atof (aChangeArgs [2]);
8211 Standard_Real aCoeffC = Draw::Atof (aChangeArgs [3]);
8212 Standard_Real aCoeffD = Draw::Atof (aChangeArgs [4]);
8213 aClipPlane->SetEquation (gp_Pln (aCoeffA, aCoeffB, aCoeffC, aCoeffD));
8216 else if (aChangeArg == "-capping"
8217 || aChangeArg == "capping")
8219 if (aNbChangeArgs < 2)
8221 std::cout << "Syntax error: need more arguments.\n";
8225 if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
8227 aClipPlane->SetCapping (toEnable);
8232 // just skip otherwise (old syntax)
8235 else if (aChangeArg == "-useobjectmaterial"
8236 || aChangeArg == "-useobjectmat"
8237 || aChangeArg == "-useobjmat"
8238 || aChangeArg == "-useobjmaterial")
8240 if (aNbChangeArgs < 2)
8242 std::cout << "Syntax error: need more arguments.\n";
8246 if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
8248 aClipPlane->SetUseObjectMaterial (toEnable == Standard_True);
8252 else if (aChangeArg == "-useobjecttexture"
8253 || aChangeArg == "-useobjecttex"
8254 || aChangeArg == "-useobjtexture"
8255 || aChangeArg == "-useobjtex")
8257 if (aNbChangeArgs < 2)
8259 std::cout << "Syntax error: need more arguments.\n";
8263 if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
8265 aClipPlane->SetUseObjectTexture (toEnable == Standard_True);
8269 else if (aChangeArg == "-useobjectshader"
8270 || aChangeArg == "-useobjshader")
8272 if (aNbChangeArgs < 2)
8274 std::cout << "Syntax error: need more arguments.\n";
8278 if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
8280 aClipPlane->SetUseObjectShader (toEnable == Standard_True);
8284 else if (aChangeArg == "-color"
8285 || aChangeArg == "color")
8287 Quantity_Color aColor;
8288 Standard_Integer aNbParsed = ViewerTest::ParseColor (aNbChangeArgs - 1,
8293 std::cout << "Syntax error: need more arguments.\n";
8297 Graphic3d_MaterialAspect aMat = aClipPlane->CappingMaterial();
8298 aMat.SetAmbientColor (aColor);
8299 aMat.SetDiffuseColor (aColor);
8300 aClipPlane->SetCappingMaterial (aMat);
8301 anArgIter += aNbParsed;
8303 else if (aChangeArg == "-texname"
8304 || aChangeArg == "texname")
8306 if (aNbChangeArgs < 2)
8308 std::cout << "Syntax error: need more arguments.\n";
8312 TCollection_AsciiString aTextureName (aChangeArgs[1]);
8313 Handle(Graphic3d_Texture2Dmanual) aTexture = new Graphic3d_Texture2Dmanual(aTextureName);
8314 if (!aTexture->IsDone())
8316 aClipPlane->SetCappingTexture (NULL);
8320 aTexture->EnableModulate();
8321 aTexture->EnableRepeat();
8322 aClipPlane->SetCappingTexture (aTexture);
8326 else if (aChangeArg == "-texscale"
8327 || aChangeArg == "texscale")
8329 if (aClipPlane->CappingTexture().IsNull())
8331 std::cout << "Error: no texture is set.\n";
8335 if (aNbChangeArgs < 3)
8337 std::cout << "Syntax error: need more arguments.\n";
8341 Standard_ShortReal aSx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
8342 Standard_ShortReal aSy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
8343 aClipPlane->CappingTexture()->GetParams()->SetScale (Graphic3d_Vec2 (aSx, aSy));
8346 else if (aChangeArg == "-texorigin"
8347 || aChangeArg == "texorigin") // texture origin
8349 if (aClipPlane->CappingTexture().IsNull())
8351 std::cout << "Error: no texture is set.\n";
8355 if (aNbChangeArgs < 3)
8357 std::cout << "Syntax error: need more arguments.\n";
8361 Standard_ShortReal aTx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
8362 Standard_ShortReal aTy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
8364 aClipPlane->CappingTexture()->GetParams()->SetTranslation (Graphic3d_Vec2 (aTx, aTy));
8367 else if (aChangeArg == "-texrotate"
8368 || aChangeArg == "texrotate") // texture rotation
8370 if (aClipPlane->CappingTexture().IsNull())
8372 std::cout << "Error: no texture is set.\n";
8376 if (aNbChangeArgs < 2)
8378 std::cout << "Syntax error: need more arguments.\n";
8382 Standard_ShortReal aRot = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
8383 aClipPlane->CappingTexture()->GetParams()->SetRotation (aRot);
8386 else if (aChangeArg == "-hatch"
8387 || aChangeArg == "hatch")
8389 if (aNbChangeArgs < 2)
8391 std::cout << "Syntax error: need more arguments.\n";
8395 TCollection_AsciiString aHatchStr (aChangeArgs[1]);
8396 aHatchStr.LowerCase();
8397 if (aHatchStr == "on")
8399 aClipPlane->SetCappingHatchOn();
8401 else if (aHatchStr == "off")
8403 aClipPlane->SetCappingHatchOff();
8407 aClipPlane->SetCappingHatch ((Aspect_HatchStyle)Draw::Atoi (aChangeArgs[1]));
8411 else if (aChangeArg == "-delete"
8412 || aChangeArg == "delete")
8414 removePlane (aRegPlanes, aPlaneName);
8417 else if (aChangeArg == "-set"
8418 || aChangeArg == "-unset")
8420 // set / unset plane command
8421 Standard_Boolean toSet = aChangeArg == "-set";
8422 Standard_Integer anIt = 1;
8423 for (; anIt < aNbChangeArgs; ++anIt)
8425 TCollection_AsciiString anEntityName (aChangeArgs[anIt]);
8426 if (anEntityName.IsEmpty()
8427 || anEntityName.Value (1) == '-')
8431 else if (ViewerTest_myViews.IsBound1 (anEntityName))
8433 Handle(V3d_View) aView = ViewerTest_myViews.Find1 (anEntityName);
8436 aView->AddClipPlane (aClipPlane);
8440 aView->RemoveClipPlane (aClipPlane);
8444 else if (GetMapOfAIS().IsBound2 (anEntityName))
8446 Handle(AIS_InteractiveObject) aIObj = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anEntityName));
8449 aIObj->AddClipPlane (aClipPlane);
8453 aIObj->RemoveClipPlane (aClipPlane);
8458 std::cout << "Error: object/view '" << anEntityName << "' is not found!\n";
8465 // apply to active view
8468 anActiveView->AddClipPlane (aClipPlane);
8472 anActiveView->RemoveClipPlane (aClipPlane);
8477 anArgIter = anArgIter + anIt - 1;
8482 std::cout << "Syntax error: unknown argument '" << aChangeArg << "'.\n";
8487 ViewerTest::RedrawAllViews();
8491 //===============================================================================================
8492 //function : VZRange
8494 //===============================================================================================
8495 static int VZRange (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgVec)
8497 const Handle(V3d_View)& aCurrentView = ViewerTest::CurrentView();
8499 if (aCurrentView.IsNull())
8501 std::cout << theArgVec[0] << ": Call vinit before this command, please.\n";
8505 Handle(Graphic3d_Camera) aCamera = aCurrentView->Camera();
8509 theDi << "ZNear: " << aCamera->ZNear() << "\n";
8510 theDi << "ZFar: " << aCamera->ZFar() << "\n";
8516 Standard_Real aNewZNear = Draw::Atof (theArgVec[1]);
8517 Standard_Real aNewZFar = Draw::Atof (theArgVec[2]);
8519 if (aNewZNear >= aNewZFar)
8521 std::cout << theArgVec[0] << ": invalid arguments: znear should be less than zfar.\n";
8525 if (!aCamera->IsOrthographic() && (aNewZNear <= 0.0 || aNewZFar <= 0.0))
8527 std::cout << theArgVec[0] << ": invalid arguments: ";
8528 std::cout << "znear, zfar should be positive for perspective camera.\n";
8532 aCamera->SetZRange (aNewZNear, aNewZFar);
8536 std::cout << theArgVec[0] << ": wrong command arguments. Type help for more information.\n";
8540 aCurrentView->Redraw();
8545 //===============================================================================================
8546 //function : VAutoZFit
8548 //===============================================================================================
8549 static int VAutoZFit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgVec)
8551 const Handle(V3d_View)& aCurrentView = ViewerTest::CurrentView();
8553 if (aCurrentView.IsNull())
8555 std::cout << theArgVec[0] << ": Call vinit before this command, please.\n";
8559 Standard_Real aScale = aCurrentView->AutoZFitScaleFactor();
8563 std::cout << theArgVec[0] << ": wrong command arguments. Type help for more information.\n";
8569 theDi << "Auto z-fit mode: \n"
8570 << "On: " << (aCurrentView->AutoZFitMode() ? "enabled" : "disabled") << "\n"
8571 << "Scale: " << aScale << "\n";
8575 Standard_Boolean isOn = Draw::Atoi (theArgVec[1]) == 1;
8579 aScale = Draw::Atoi (theArgVec[2]);
8582 aCurrentView->SetAutoZFitMode (isOn, aScale);
8583 aCurrentView->AutoZFit();
8584 aCurrentView->Redraw();
8589 //! Auxiliary function to print projection type
8590 inline const char* projTypeName (Graphic3d_Camera::Projection theProjType)
8592 switch (theProjType)
8594 case Graphic3d_Camera::Projection_Orthographic: return "orthographic";
8595 case Graphic3d_Camera::Projection_Perspective: return "perspective";
8596 case Graphic3d_Camera::Projection_Stereo: return "stereoscopic";
8597 case Graphic3d_Camera::Projection_MonoLeftEye: return "monoLeftEye";
8598 case Graphic3d_Camera::Projection_MonoRightEye: return "monoRightEye";
8603 //===============================================================================================
8604 //function : VCamera
8606 //===============================================================================================
8607 static int VCamera (Draw_Interpretor& theDI,
8608 Standard_Integer theArgsNb,
8609 const char** theArgVec)
8611 Handle(V3d_View) aView = ViewerTest::CurrentView();
8614 std::cout << "Error: no active view.\n";
8618 Handle(Graphic3d_Camera) aCamera = aView->Camera();
8621 theDI << "ProjType: " << projTypeName (aCamera->ProjectionType()) << "\n";
8622 theDI << "FOVy: " << aCamera->FOVy() << "\n";
8623 theDI << "Distance: " << aCamera->Distance() << "\n";
8624 theDI << "IOD: " << aCamera->IOD() << "\n";
8625 theDI << "IODType: " << (aCamera->GetIODType() == Graphic3d_Camera::IODType_Absolute ? "absolute" : "relative") << "\n";
8626 theDI << "ZFocus: " << aCamera->ZFocus() << "\n";
8627 theDI << "ZFocusType: " << (aCamera->ZFocusType() == Graphic3d_Camera::FocusType_Absolute ? "absolute" : "relative") << "\n";
8631 for (Standard_Integer anArgIter = 1; anArgIter < theArgsNb; ++anArgIter)
8633 Standard_CString anArg = theArgVec[anArgIter];
8634 TCollection_AsciiString anArgCase (anArg);
8635 anArgCase.LowerCase();
8636 if (anArgCase == "-proj"
8637 || anArgCase == "-projection"
8638 || anArgCase == "-projtype"
8639 || anArgCase == "-projectiontype")
8641 theDI << projTypeName (aCamera->ProjectionType()) << " ";
8643 else if (anArgCase == "-ortho"
8644 || anArgCase == "-orthographic")
8646 aCamera->SetProjectionType (Graphic3d_Camera::Projection_Orthographic);
8648 else if (anArgCase == "-persp"
8649 || anArgCase == "-perspective"
8650 || anArgCase == "-perspmono"
8651 || anArgCase == "-perspectivemono"
8652 || anArgCase == "-mono")
8654 aCamera->SetProjectionType (Graphic3d_Camera::Projection_Perspective);
8656 else if (anArgCase == "-stereo"
8657 || anArgCase == "-stereoscopic"
8658 || anArgCase == "-perspstereo"
8659 || anArgCase == "-perspectivestereo")
8661 aCamera->SetProjectionType (Graphic3d_Camera::Projection_Stereo);
8663 else if (anArgCase == "-left"
8664 || anArgCase == "-lefteye"
8665 || anArgCase == "-monoleft"
8666 || anArgCase == "-monolefteye"
8667 || anArgCase == "-perpsleft"
8668 || anArgCase == "-perpslefteye")
8670 aCamera->SetProjectionType (Graphic3d_Camera::Projection_MonoLeftEye);
8672 else if (anArgCase == "-right"
8673 || anArgCase == "-righteye"
8674 || anArgCase == "-monoright"
8675 || anArgCase == "-monorighteye"
8676 || anArgCase == "-perpsright")
8678 aCamera->SetProjectionType (Graphic3d_Camera::Projection_MonoRightEye);
8680 else if (anArgCase == "-dist"
8681 || anArgCase == "-distance")
8683 Standard_CString anArgValue = (anArgIter + 1 < theArgsNb) ? theArgVec[anArgIter + 1] : NULL;
8684 if (anArgValue != NULL
8685 && *anArgValue != '-')
8688 aCamera->SetDistance (Draw::Atof (anArgValue));
8691 theDI << aCamera->Distance() << " ";
8693 else if (anArgCase == "-iod")
8695 Standard_CString anArgValue = (anArgIter + 1 < theArgsNb) ? theArgVec[anArgIter + 1] : NULL;
8696 if (anArgValue != NULL
8697 && *anArgValue != '-')
8700 aCamera->SetIOD (aCamera->GetIODType(), Draw::Atof (anArgValue));
8703 theDI << aCamera->IOD() << " ";
8705 else if (anArgCase == "-iodtype")
8707 Standard_CString anArgValue = (anArgIter + 1 < theArgsNb) ? theArgVec[anArgIter + 1] : "";
8708 TCollection_AsciiString anValueCase (anArgValue);
8709 anValueCase.LowerCase();
8710 if (anValueCase == "abs"
8711 || anValueCase == "absolute")
8714 aCamera->SetIOD (Graphic3d_Camera::IODType_Absolute, aCamera->IOD());
8717 else if (anValueCase == "rel"
8718 || anValueCase == "relative")
8721 aCamera->SetIOD (Graphic3d_Camera::IODType_Relative, aCamera->IOD());
8724 else if (*anArgValue != '-')
8726 std::cout << "Error: unknown IOD type '" << anArgValue << "'\n";
8729 switch (aCamera->GetIODType())
8731 case Graphic3d_Camera::IODType_Absolute: theDI << "absolute "; break;
8732 case Graphic3d_Camera::IODType_Relative: theDI << "relative "; break;
8735 else if (anArgCase == "-zfocus")
8737 Standard_CString anArgValue = (anArgIter + 1 < theArgsNb) ? theArgVec[anArgIter + 1] : NULL;
8738 if (anArgValue != NULL
8739 && *anArgValue != '-')
8742 aCamera->SetZFocus (aCamera->ZFocusType(), Draw::Atof (anArgValue));
8745 theDI << aCamera->ZFocus() << " ";
8747 else if (anArgCase == "-zfocustype")
8749 Standard_CString anArgValue = (anArgIter + 1 < theArgsNb) ? theArgVec[anArgIter + 1] : "";
8750 TCollection_AsciiString anValueCase (anArgValue);
8751 anValueCase.LowerCase();
8752 if (anValueCase == "abs"
8753 || anValueCase == "absolute")
8756 aCamera->SetZFocus (Graphic3d_Camera::FocusType_Absolute, aCamera->ZFocus());
8759 else if (anValueCase == "rel"
8760 || anValueCase == "relative")
8763 aCamera->SetZFocus (Graphic3d_Camera::FocusType_Relative, aCamera->ZFocus());
8766 else if (*anArgValue != '-')
8768 std::cout << "Error: unknown ZFocus type '" << anArgValue << "'\n";
8771 switch (aCamera->ZFocusType())
8773 case Graphic3d_Camera::FocusType_Absolute: theDI << "absolute "; break;
8774 case Graphic3d_Camera::FocusType_Relative: theDI << "relative "; break;
8777 else if (anArgCase == "-fov"
8778 || anArgCase == "-fovy")
8780 Standard_CString anArgValue = (anArgIter + 1 < theArgsNb) ? theArgVec[anArgIter + 1] : NULL;
8781 if (anArgValue != NULL
8782 && *anArgValue != '-')
8785 aCamera->SetFOVy (Draw::Atof (anArgValue));
8788 theDI << aCamera->FOVy() << " ";
8792 std::cout << "Error: unknown argument '" << anArg << "'\n";
8803 //! Parse stereo output mode
8804 inline Standard_Boolean parseStereoMode (Standard_CString theArg,
8805 Graphic3d_StereoMode& theMode)
8807 TCollection_AsciiString aFlag (theArg);
8809 if (aFlag == "quadbuffer")
8811 theMode = Graphic3d_StereoMode_QuadBuffer;
8813 else if (aFlag == "anaglyph")
8815 theMode = Graphic3d_StereoMode_Anaglyph;
8817 else if (aFlag == "row"
8818 || aFlag == "rowinterlaced")
8820 theMode = Graphic3d_StereoMode_RowInterlaced;
8822 else if (aFlag == "col"
8823 || aFlag == "colinterlaced"
8824 || aFlag == "columninterlaced")
8826 theMode = Graphic3d_StereoMode_ColumnInterlaced;
8828 else if (aFlag == "chess"
8829 || aFlag == "chessboard")
8831 theMode = Graphic3d_StereoMode_ChessBoard;
8833 else if (aFlag == "sbs"
8834 || aFlag == "sidebyside")
8836 theMode = Graphic3d_StereoMode_SideBySide;
8838 else if (aFlag == "ou"
8839 || aFlag == "overunder")
8841 theMode = Graphic3d_StereoMode_OverUnder;
8843 else if (aFlag == "pageflip"
8844 || aFlag == "softpageflip")
8846 theMode = Graphic3d_StereoMode_SoftPageFlip;
8850 return Standard_False;
8852 return Standard_True;
8855 //! Parse anaglyph filter
8856 inline Standard_Boolean parseAnaglyphFilter (Standard_CString theArg,
8857 Graphic3d_RenderingParams::Anaglyph& theFilter)
8859 TCollection_AsciiString aFlag (theArg);
8861 if (aFlag == "redcyansimple")
8863 theFilter = Graphic3d_RenderingParams::Anaglyph_RedCyan_Simple;
8865 else if (aFlag == "redcyan"
8866 || aFlag == "redcyanoptimized")
8868 theFilter = Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized;
8870 else if (aFlag == "yellowbluesimple")
8872 theFilter = Graphic3d_RenderingParams::Anaglyph_YellowBlue_Simple;
8874 else if (aFlag == "yellowblue"
8875 || aFlag == "yellowblueoptimized")
8877 theFilter = Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized;
8879 else if (aFlag == "greenmagenta"
8880 || aFlag == "greenmagentasimple")
8882 theFilter = Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple;
8886 return Standard_False;
8888 return Standard_True;
8891 //==============================================================================
8892 //function : VStereo
8894 //==============================================================================
8896 static int VStereo (Draw_Interpretor& theDI,
8897 Standard_Integer theArgNb,
8898 const char** theArgVec)
8900 Handle(V3d_View) aView = ViewerTest::CurrentView();
8905 std::cout << "Error: no active viewer!\n";
8909 Standard_Boolean isActive = ViewerTest_myDefaultCaps.contextStereo;
8910 theDI << "Stereo " << (isActive ? "ON" : "OFF") << "\n";
8913 TCollection_AsciiString aMode;
8914 switch (aView->RenderingParams().StereoMode)
8916 case Graphic3d_StereoMode_QuadBuffer : aMode = "quadBuffer"; break;
8917 case Graphic3d_StereoMode_RowInterlaced : aMode = "rowInterlaced"; break;
8918 case Graphic3d_StereoMode_ColumnInterlaced : aMode = "columnInterlaced"; break;
8919 case Graphic3d_StereoMode_ChessBoard : aMode = "chessBoard"; break;
8920 case Graphic3d_StereoMode_SideBySide : aMode = "sideBySide"; break;
8921 case Graphic3d_StereoMode_OverUnder : aMode = "overUnder"; break;
8922 case Graphic3d_StereoMode_SoftPageFlip : aMode = "softpageflip"; break;
8923 case Graphic3d_StereoMode_Anaglyph :
8925 switch (aView->RenderingParams().AnaglyphFilter)
8927 case Graphic3d_RenderingParams::Anaglyph_RedCyan_Simple : aMode.AssignCat (" (redCyanSimple)"); break;
8928 case Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized : aMode.AssignCat (" (redCyan)"); break;
8929 case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Simple : aMode.AssignCat (" (yellowBlueSimple)"); break;
8930 case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized: aMode.AssignCat (" (yellowBlue)"); break;
8931 case Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple : aMode.AssignCat (" (greenMagentaSimple)"); break;
8936 theDI << "Mode " << aMode << "\n";
8941 Handle(Graphic3d_Camera) aCamera;
8942 Graphic3d_RenderingParams* aParams = NULL;
8943 Graphic3d_StereoMode aMode = Graphic3d_StereoMode_QuadBuffer;
8944 if (!aView.IsNull())
8946 aParams = &aView->ChangeRenderingParams();
8947 aMode = aParams->StereoMode;
8948 aCamera = aView->Camera();
8951 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), aView);
8952 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
8954 Standard_CString anArg = theArgVec[anArgIter];
8955 TCollection_AsciiString aFlag (anArg);
8957 if (anUpdateTool.parseRedrawMode (aFlag))
8961 else if (aFlag == "0"
8964 if (++anArgIter < theArgNb)
8966 std::cout << "Error: wrong number of arguments!\n";
8970 if (!aCamera.IsNull()
8971 && aCamera->ProjectionType() == Graphic3d_Camera::Projection_Stereo)
8973 aCamera->SetProjectionType (Graphic3d_Camera::Projection_Perspective);
8975 ViewerTest_myDefaultCaps.contextStereo = Standard_False;
8978 else if (aFlag == "1"
8981 if (++anArgIter < theArgNb)
8983 std::cout << "Error: wrong number of arguments!\n";
8987 if (!aCamera.IsNull())
8989 aCamera->SetProjectionType (Graphic3d_Camera::Projection_Stereo);
8991 ViewerTest_myDefaultCaps.contextStereo = Standard_True;
8994 else if (aFlag == "-reverse"
8995 || aFlag == "-reversed"
8996 || aFlag == "-swap")
8998 Standard_Boolean toEnable = Standard_True;
8999 if (++anArgIter < theArgNb
9000 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
9004 aParams->ToReverseStereo = toEnable;
9006 else if (aFlag == "-noreverse"
9007 || aFlag == "-noswap")
9009 Standard_Boolean toDisable = Standard_True;
9010 if (++anArgIter < theArgNb
9011 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toDisable))
9015 aParams->ToReverseStereo = !toDisable;
9017 else if (aFlag == "-mode"
9018 || aFlag == "-stereomode")
9020 if (++anArgIter >= theArgNb
9021 || !parseStereoMode (theArgVec[anArgIter], aMode))
9023 std::cout << "Error: syntax error at '" << anArg << "'\n";
9027 if (aMode == Graphic3d_StereoMode_QuadBuffer)
9029 ViewerTest_myDefaultCaps.contextStereo = Standard_True;
9032 else if (aFlag == "-anaglyph"
9033 || aFlag == "-anaglyphfilter")
9035 Graphic3d_RenderingParams::Anaglyph aFilter = Graphic3d_RenderingParams::Anaglyph_RedCyan_Simple;
9036 if (++anArgIter >= theArgNb
9037 || !parseAnaglyphFilter (theArgVec[anArgIter], aFilter))
9039 std::cout << "Error: syntax error at '" << anArg << "'\n";
9043 aMode = Graphic3d_StereoMode_Anaglyph;
9044 aParams->AnaglyphFilter = aFilter;
9046 else if (parseStereoMode (anArg, aMode)) // short syntax
9048 if (aMode == Graphic3d_StereoMode_QuadBuffer)
9050 ViewerTest_myDefaultCaps.contextStereo = Standard_True;
9055 std::cout << "Error: syntax error at '" << anArg << "'\n";
9060 if (!aView.IsNull())
9062 aParams->StereoMode = aMode;
9063 aCamera->SetProjectionType (Graphic3d_Camera::Projection_Stereo);
9068 //===============================================================================================
9069 //function : VDefaults
9071 //===============================================================================================
9072 static int VDefaults (Draw_Interpretor& theDi,
9073 Standard_Integer theArgsNb,
9074 const char** theArgVec)
9076 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
9079 std::cerr << "No active viewer!\n";
9083 Handle(Prs3d_Drawer) aDefParams = aCtx->DefaultDrawer();
9086 if (aDefParams->TypeOfDeflection() == Aspect_TOD_RELATIVE)
9088 theDi << "DeflType: relative\n"
9089 << "DeviationCoeff: " << aDefParams->DeviationCoefficient() << "\n";
9093 theDi << "DeflType: absolute\n"
9094 << "AbsoluteDeflection: " << aDefParams->MaximalChordialDeviation() << "\n";
9096 theDi << "AngularDeflection: " << (180.0 * aDefParams->HLRAngle() / M_PI) << "\n";
9097 theDi << "AutoTriangulation: " << (aDefParams->IsAutoTriangulation() ? "on" : "off") << "\n";
9101 for (Standard_Integer anArgIter = 1; anArgIter < theArgsNb; ++anArgIter)
9103 TCollection_AsciiString anArg (theArgVec[anArgIter]);
9105 if (anArg == "-ABSDEFL"
9106 || anArg == "-ABSOLUTEDEFLECTION"
9108 || anArg == "-DEFLECTION")
9110 if (++anArgIter >= theArgsNb)
9112 std::cout << "Error: wrong syntax at " << anArg << "\n";
9115 aDefParams->SetTypeOfDeflection (Aspect_TOD_ABSOLUTE);
9116 aDefParams->SetMaximalChordialDeviation (Draw::Atof (theArgVec[anArgIter]));
9118 else if (anArg == "-RELDEFL"
9119 || anArg == "-RELATIVEDEFLECTION"
9120 || anArg == "-DEVCOEFF"
9121 || anArg == "-DEVIATIONCOEFF"
9122 || anArg == "-DEVIATIONCOEFFICIENT")
9124 if (++anArgIter >= theArgsNb)
9126 std::cout << "Error: wrong syntax at " << anArg << "\n";
9129 aDefParams->SetTypeOfDeflection (Aspect_TOD_RELATIVE);
9130 aDefParams->SetDeviationCoefficient (Draw::Atof (theArgVec[anArgIter]));
9132 else if (anArg == "-ANGDEFL"
9133 || anArg == "-ANGULARDEFL"
9134 || anArg == "-ANGULARDEFLECTION")
9136 if (++anArgIter >= theArgsNb)
9138 std::cout << "Error: wrong syntax at " << anArg << "\n";
9141 // currently HLRDeviationAngle is used instead of DeviationAngle in most places
9142 aDefParams->SetHLRAngle (M_PI * Draw::Atof (theArgVec[anArgIter]) / 180.0);
9144 else if (anArg == "-AUTOTR"
9145 || anArg == "-AUTOTRIANG"
9146 || anArg == "-AUTOTRIANGULATION")
9148 if (++anArgIter >= theArgsNb)
9150 std::cout << "Error: wrong syntax at " << anArg << "\n";
9153 TCollection_AsciiString aValue (theArgVec[anArgIter]);
9158 aDefParams->SetAutoTriangulation (Standard_True);
9160 else if (aValue == "off"
9163 aDefParams->SetAutoTriangulation (Standard_False);
9168 std::cerr << "Warning, unknown argument '" << anArg.ToCString() << "'\n";
9175 //! Auxiliary method
9176 inline void addLight (const Handle(V3d_Light)& theLightNew,
9177 const Standard_Boolean theIsGlobal)
9179 if (theLightNew.IsNull())
9186 ViewerTest::GetViewerFromContext()->SetLightOn (theLightNew);
9190 ViewerTest::CurrentView()->SetLightOn (theLightNew);
9194 //! Auxiliary method
9195 inline Standard_Integer getLightId (const TCollection_AsciiString& theArgNext)
9197 TCollection_AsciiString anArgNextCase (theArgNext);
9198 anArgNextCase.UpperCase();
9199 if (anArgNextCase.Length() > 5
9200 && anArgNextCase.SubString (1, 5).IsEqual ("LIGHT"))
9202 return theArgNext.SubString (6, theArgNext.Length()).IntegerValue();
9206 return theArgNext.IntegerValue();
9210 //===============================================================================================
9213 //===============================================================================================
9214 static int VLight (Draw_Interpretor& theDi,
9215 Standard_Integer theArgsNb,
9216 const char** theArgVec)
9218 Handle(V3d_View) aView = ViewerTest::CurrentView();
9219 Handle(V3d_Viewer) aViewer = ViewerTest::GetViewerFromContext();
9221 || aViewer.IsNull())
9223 std::cerr << "No active viewer!\n";
9227 Standard_Real anXYZ[3] = {};
9228 Standard_Real anAtten[2] = {};
9231 // print lights info
9232 Standard_Integer aLightId = 0;
9233 for (V3d_ListOfLightIterator aLightIter (aView->ActiveLightIterator()); aLightIter.More(); aLightIter.Next(), ++aLightId)
9235 Handle(V3d_Light) aLight = aLightIter.Value();
9236 const Quantity_Color aColor = aLight->Color();
9237 theDi << "Light" << aLightId << "\n";
9238 switch (aLight->Type())
9242 theDi << " Type: Ambient\n";
9243 theDi << " Intensity: " << aLight->Intensity() << "\n";
9246 case V3d_DIRECTIONAL:
9248 Handle(V3d_DirectionalLight) aLightDir = Handle(V3d_DirectionalLight)::DownCast (aLight);
9249 theDi << " Type: Directional\n";
9250 theDi << " Intensity: " << aLight->Intensity() << "\n";
9251 theDi << " Headlight: " << (aLight->Headlight() ? "TRUE" : "FALSE") << "\n";
9252 theDi << " Smoothness: " << aLight->Smoothness() << "\n";
9253 if (!aLightDir.IsNull())
9255 aLightDir->Position (anXYZ[0], anXYZ[1], anXYZ[2]);
9256 theDi << " Position: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
9257 aLightDir->Direction (anXYZ[0], anXYZ[1], anXYZ[2]);
9258 theDi << " Direction: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
9262 case V3d_POSITIONAL:
9264 Handle(V3d_PositionalLight) aLightPos = Handle(V3d_PositionalLight)::DownCast (aLight);
9265 theDi << " Type: Positional\n";
9266 theDi << " Intensity: " << aLight->Intensity() << "\n";
9267 theDi << " Headlight: " << (aLight->Headlight() ? "TRUE" : "FALSE") << "\n";
9268 theDi << " Smoothness: " << aLight->Smoothness() << "\n";
9269 if (!aLightPos.IsNull())
9271 aLightPos->Position (anXYZ[0], anXYZ[1], anXYZ[2]);
9272 theDi << " Position: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
9273 aLightPos->Attenuation (anAtten[0], anAtten[1]);
9274 theDi << " Atten.: " << anAtten[0] << " " << anAtten[1] << "\n";
9280 Handle(V3d_SpotLight) aLightSpot = Handle(V3d_SpotLight)::DownCast (aLight);
9281 theDi << " Type: Spot\n";
9282 theDi << " Intensity: " << aLight->Intensity() << "\n";
9283 theDi << " Headlight: " << (aLight->Headlight() ? "TRUE" : "FALSE") << "\n";
9284 if (!aLightSpot.IsNull())
9286 aLightSpot->Position (anXYZ[0], anXYZ[1], anXYZ[2]);
9287 theDi << " Position: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
9288 aLightSpot->Direction (anXYZ[0], anXYZ[1], anXYZ[2]);
9289 theDi << " Direction: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
9290 aLightSpot->Attenuation (anAtten[0], anAtten[1]);
9291 theDi << " Atten.: " << anAtten[0] << " " << anAtten[1] << "\n";
9292 theDi << " Angle: " << (aLightSpot->Angle() * 180.0 / M_PI) << "\n";
9293 theDi << " Exponent: " << aLightSpot->Concentration() << "\n";
9299 theDi << " Type: UNKNOWN\n";
9303 theDi << " Color: " << aColor.Red() << ", " << aColor.Green() << ", " << aColor.Blue() << "\n";
9307 Handle(V3d_Light) aLightNew;
9308 Handle(V3d_Light) aLightOld;
9309 Standard_Boolean isGlobal = Standard_True;
9310 Standard_Boolean toCreate = Standard_False;
9311 for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
9313 Handle(V3d_Light) aLightCurr = aLightNew.IsNull() ? aLightOld : aLightNew;
9314 Handle(V3d_AmbientLight) aLightAmb = Handle(V3d_AmbientLight) ::DownCast (aLightCurr);
9315 Handle(V3d_DirectionalLight) aLightDir = Handle(V3d_DirectionalLight)::DownCast (aLightCurr);
9316 Handle(V3d_PositionalLight) aLightPos = Handle(V3d_PositionalLight) ::DownCast (aLightCurr);
9317 Handle(V3d_SpotLight) aLightSpot = Handle(V3d_SpotLight) ::DownCast (aLightCurr);
9319 TCollection_AsciiString aName, aValue;
9320 const TCollection_AsciiString anArg (theArgVec[anArgIt]);
9321 TCollection_AsciiString anArgCase (anArg);
9322 anArgCase.UpperCase();
9323 if (anArgCase.IsEqual ("NEW")
9324 || anArgCase.IsEqual ("ADD")
9325 || anArgCase.IsEqual ("CREATE"))
9327 toCreate = Standard_True;
9329 else if (anArgCase.IsEqual ("GLOB")
9330 || anArgCase.IsEqual ("GLOBAL"))
9332 isGlobal = Standard_True;
9334 else if (anArgCase.IsEqual ("LOC")
9335 || anArgCase.IsEqual ("LOCAL"))
9337 isGlobal = Standard_False;
9339 else if (anArgCase.IsEqual ("DEF")
9340 || anArgCase.IsEqual ("DEFAULTS"))
9342 toCreate = Standard_False;
9343 aViewer->SetDefaultLights();
9345 else if (anArgCase.IsEqual ("CLR")
9346 || anArgCase.IsEqual ("CLEAR"))
9348 toCreate = Standard_False;
9349 for (V3d_ListOfLightIterator aLightIter (aView->ActiveLightIterator()); aLightIter.More();)
9351 Handle(V3d_Light) aLight = aLightIter.Value();
9352 aViewer->DelLight (aLight);
9353 aLightIter = aView->ActiveLightIterator();
9356 else if (anArgCase.IsEqual ("AMB")
9357 || anArgCase.IsEqual ("AMBIENT")
9358 || anArgCase.IsEqual ("AMBLIGHT"))
9360 addLight (aLightNew, isGlobal);
9363 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9366 toCreate = Standard_False;
9367 aLightNew = new V3d_AmbientLight (aViewer);
9369 else if (anArgCase.IsEqual ("DIRECTIONAL")
9370 || anArgCase.IsEqual ("DIRLIGHT"))
9372 addLight (aLightNew, isGlobal);
9375 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9378 toCreate = Standard_False;
9379 aLightNew = new V3d_DirectionalLight (aViewer);
9381 else if (anArgCase.IsEqual ("SPOT")
9382 || anArgCase.IsEqual ("SPOTLIGHT"))
9384 addLight (aLightNew, isGlobal);
9387 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9390 toCreate = Standard_False;
9391 aLightNew = new V3d_SpotLight (aViewer, 0.0, 0.0, 0.0);
9393 else if (anArgCase.IsEqual ("POSLIGHT")
9394 || anArgCase.IsEqual ("POSITIONAL"))
9396 addLight (aLightNew, isGlobal);
9399 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9402 toCreate = Standard_False;
9403 aLightNew = new V3d_PositionalLight (aViewer, 0.0, 0.0, 0.0);
9405 else if (anArgCase.IsEqual ("CHANGE"))
9407 addLight (aLightNew, isGlobal);
9408 aLightNew.Nullify();
9409 if (++anArgIt >= theArgsNb)
9411 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9415 const Standard_Integer aLightId = getLightId (theArgVec[anArgIt]);
9416 Standard_Integer aLightIt = 0;
9417 for (V3d_ListOfLightIterator aLightIter (aView->ActiveLightIterator()); aLightIter.More(); aLightIter.Next(), ++aLightIt)
9419 if (aLightIt == aLightId)
9421 aLightOld = aLightIter.Value();
9426 if (aLightOld.IsNull())
9428 std::cerr << "Light " << theArgVec[anArgIt] << " is undefined!\n";
9432 else if (anArgCase.IsEqual ("DEL")
9433 || anArgCase.IsEqual ("DELETE"))
9435 Handle(V3d_Light) aLightDel;
9436 if (++anArgIt >= theArgsNb)
9438 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9442 const TCollection_AsciiString anArgNext (theArgVec[anArgIt]);
9443 const Standard_Integer aLightDelId = getLightId (theArgVec[anArgIt]);
9444 Standard_Integer aLightIt = 0;
9445 for (V3d_ListOfLightIterator aLightIter (aView->ActiveLightIterator()); aLightIter.More(); aLightIter.Next(), ++aLightIt)
9447 aLightDel = aLightIter.Value();
9448 if (aLightIt == aLightDelId)
9453 if (!aLightDel.IsNull())
9455 aViewer->DelLight (aLightDel);
9458 else if (anArgCase.IsEqual ("COLOR")
9459 || anArgCase.IsEqual ("COLOUR"))
9461 if (++anArgIt >= theArgsNb)
9463 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9467 TCollection_AsciiString anArgNext (theArgVec[anArgIt]);
9468 anArgNext.UpperCase();
9469 const Quantity_Color aColor = ViewerTest::GetColorFromName (anArgNext.ToCString());
9470 if (!aLightCurr.IsNull())
9472 aLightCurr->SetColor (aColor);
9475 else if (anArgCase.IsEqual ("POS")
9476 || anArgCase.IsEqual ("POSITION"))
9478 if ((anArgIt + 3) >= theArgsNb)
9480 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9484 anXYZ[0] = Atof (theArgVec[++anArgIt]);
9485 anXYZ[1] = Atof (theArgVec[++anArgIt]);
9486 anXYZ[2] = Atof (theArgVec[++anArgIt]);
9487 if (!aLightDir.IsNull())
9489 aLightDir->SetPosition (anXYZ[0], anXYZ[1], anXYZ[2]);
9491 else if (!aLightPos.IsNull())
9493 aLightPos->SetPosition (anXYZ[0], anXYZ[1], anXYZ[2]);
9495 else if (!aLightSpot.IsNull())
9497 aLightSpot->SetPosition (anXYZ[0], anXYZ[1], anXYZ[2]);
9501 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9505 else if (anArgCase.IsEqual ("DIR")
9506 || anArgCase.IsEqual ("DIRECTION"))
9508 if ((anArgIt + 3) >= theArgsNb)
9510 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9514 anXYZ[0] = Atof (theArgVec[++anArgIt]);
9515 anXYZ[1] = Atof (theArgVec[++anArgIt]);
9516 anXYZ[2] = Atof (theArgVec[++anArgIt]);
9517 if (!aLightDir.IsNull())
9519 aLightDir->SetDirection (anXYZ[0], anXYZ[1], anXYZ[2]);
9521 else if (!aLightSpot.IsNull())
9523 aLightSpot->SetDirection (anXYZ[0], anXYZ[1], anXYZ[2]);
9527 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9531 else if (anArgCase.IsEqual ("SM")
9532 || anArgCase.IsEqual ("SMOOTHNESS"))
9534 if (++anArgIt >= theArgsNb)
9536 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9540 Standard_Real aSmoothness = Atof (theArgVec[anArgIt]);
9542 if (fabs (aSmoothness) < Precision::Confusion())
9544 aLightCurr->SetIntensity (1.f);
9546 else if (fabs (aLightCurr->Smoothness()) < Precision::Confusion())
9548 aLightCurr->SetIntensity ((aSmoothness * aSmoothness) / 3.f);
9552 Standard_ShortReal aSmoothnessRatio = static_cast<Standard_ShortReal> (aSmoothness / aLightCurr->Smoothness());
9553 aLightCurr->SetIntensity (aLightCurr->Intensity() / (aSmoothnessRatio * aSmoothnessRatio));
9556 if (!aLightPos.IsNull())
9558 aLightPos->SetSmoothRadius (aSmoothness);
9560 else if (!aLightDir.IsNull())
9562 aLightDir->SetSmoothAngle (aSmoothness);
9565 else if (anArgCase.IsEqual ("INT")
9566 || anArgCase.IsEqual ("INTENSITY"))
9568 if (++anArgIt >= theArgsNb)
9570 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9574 Standard_Real aIntensity = Atof (theArgVec[anArgIt]);
9576 if (!aLightCurr.IsNull())
9578 aLightCurr->SetIntensity (aIntensity);
9581 else if (anArgCase.IsEqual ("ANG")
9582 || anArgCase.IsEqual ("ANGLE"))
9584 if (++anArgIt >= theArgsNb)
9586 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9590 Standard_Real anAngle = Atof (theArgVec[anArgIt]);
9592 if (!aLightSpot.IsNull())
9594 aLightSpot->SetAngle (anAngle / 180.0 * M_PI);
9597 else if (anArgCase.IsEqual ("CONSTATTEN")
9598 || anArgCase.IsEqual ("CONSTATTENUATION"))
9600 if (++anArgIt >= theArgsNb)
9602 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9606 if (!aLightPos.IsNull())
9608 aLightPos->Attenuation (anAtten[0], anAtten[1]);
9609 anAtten[0] = Atof (theArgVec[anArgIt]);
9610 aLightPos->SetAttenuation (anAtten[0], anAtten[1]);
9612 else if (!aLightSpot.IsNull())
9614 aLightSpot->Attenuation (anAtten[0], anAtten[1]);
9615 anAtten[0] = Atof (theArgVec[anArgIt]);
9616 aLightSpot->SetAttenuation (anAtten[0], anAtten[1]);
9620 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9624 else if (anArgCase.IsEqual ("LINATTEN")
9625 || anArgCase.IsEqual ("LINEARATTEN")
9626 || anArgCase.IsEqual ("LINEARATTENUATION"))
9628 if (++anArgIt >= theArgsNb)
9630 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9634 if (!aLightPos.IsNull())
9636 aLightPos->Attenuation (anAtten[0], anAtten[1]);
9637 anAtten[1] = Atof (theArgVec[anArgIt]);
9638 aLightPos->SetAttenuation (anAtten[0], anAtten[1]);
9640 else if (!aLightSpot.IsNull())
9642 aLightSpot->Attenuation (anAtten[0], anAtten[1]);
9643 anAtten[1] = Atof (theArgVec[anArgIt]);
9644 aLightSpot->SetAttenuation (anAtten[0], anAtten[1]);
9648 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9652 else if (anArgCase.IsEqual ("EXP")
9653 || anArgCase.IsEqual ("EXPONENT")
9654 || anArgCase.IsEqual ("SPOTEXP")
9655 || anArgCase.IsEqual ("SPOTEXPONENT"))
9657 if (++anArgIt >= theArgsNb)
9659 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9663 if (!aLightSpot.IsNull())
9665 aLightSpot->SetConcentration (Atof (theArgVec[anArgIt]));
9669 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9673 else if (anArgCase.IsEqual ("HEAD")
9674 || anArgCase.IsEqual ("HEADLIGHT"))
9676 if (++anArgIt >= theArgsNb)
9678 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9682 if (aLightAmb.IsNull()
9683 && !aLightCurr.IsNull())
9685 aLightCurr->SetHeadlight (Draw::Atoi (theArgVec[anArgIt]) != 0);
9689 std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
9695 std::cerr << "Warning: unknown argument '" << anArg << "'\n";
9699 addLight (aLightNew, isGlobal);
9700 aViewer->UpdateLights();
9705 //=======================================================================
9706 //function : VRenderParams
9707 //purpose : Enables/disables rendering features
9708 //=======================================================================
9710 static Standard_Integer VRenderParams (Draw_Interpretor& theDI,
9711 Standard_Integer theArgNb,
9712 const char** theArgVec)
9714 Handle(V3d_View) aView = ViewerTest::CurrentView();
9717 std::cerr << "Error: no active viewer!\n";
9721 Graphic3d_RenderingParams& aParams = aView->ChangeRenderingParams();
9722 TCollection_AsciiString aCmdName (theArgVec[0]);
9723 aCmdName.LowerCase();
9724 if (aCmdName == "vraytrace")
9728 theDI << (aParams.Method == Graphic3d_RM_RAYTRACING ? "on" : "off") << " ";
9731 else if (theArgNb == 2)
9733 TCollection_AsciiString aValue (theArgVec[1]);
9738 aParams.Method = Graphic3d_RM_RAYTRACING;
9742 else if (aValue == "off"
9745 aParams.Method = Graphic3d_RM_RASTERIZATION;
9751 std::cout << "Error: unknown argument '" << theArgVec[1] << "'\n";
9757 std::cout << "Error: wrong number of arguments\n";
9764 theDI << "renderMode: ";
9765 switch (aParams.Method)
9767 case Graphic3d_RM_RASTERIZATION: theDI << "rasterization "; break;
9768 case Graphic3d_RM_RAYTRACING: theDI << "raytrace "; break;
9771 theDI << "transparency: ";
9772 switch (aParams.TransparencyMethod)
9774 case Graphic3d_RTM_BLEND_UNORDERED: theDI << "Basic blended transparency with non-commuting operator "; break;
9775 case Graphic3d_RTM_BLEND_OIT: theDI << "Weighted Blended Order-Independent Transparency, depth weight factor: "
9776 << TCollection_AsciiString (aParams.OitDepthFactor); break;
9779 theDI << "msaa: " << aParams.NbMsaaSamples << "\n";
9780 theDI << "rendScale: " << aParams.RenderResolutionScale << "\n";
9781 theDI << "rayDepth: " << aParams.RaytracingDepth << "\n";
9782 theDI << "fsaa: " << (aParams.IsAntialiasingEnabled ? "on" : "off") << "\n";
9783 theDI << "shadows: " << (aParams.IsShadowEnabled ? "on" : "off") << "\n";
9784 theDI << "reflections: " << (aParams.IsReflectionEnabled ? "on" : "off") << "\n";
9785 theDI << "gleam: " << (aParams.IsTransparentShadowEnabled ? "on" : "off") << "\n";
9786 theDI << "GI: " << (aParams.IsGlobalIlluminationEnabled ? "on" : "off") << "\n";
9787 theDI << "blocked RNG: " << (aParams.CoherentPathTracingMode ? "on" : "off") << "\n";
9788 theDI << "iss: " << (aParams.AdaptiveScreenSampling ? "on" : "off") << "\n";
9789 theDI << "iss debug: " << (aParams.ShowSamplingTiles ? "on" : "off") << "\n";
9790 theDI << "two-sided BSDF: " << (aParams.TwoSidedBsdfModels ? "on" : "off") << "\n";
9791 theDI << "max radiance: " << aParams.RadianceClampingValue << "\n";
9792 theDI << "nb tiles (iss): " << aParams.NbRayTracingTiles << "\n";
9793 theDI << "shadingModel: ";
9794 switch (aView->ShadingModel())
9796 case V3d_COLOR: theDI << "color"; break;
9797 case V3d_FLAT: theDI << "flat"; break;
9798 case V3d_GOURAUD: theDI << "gouraud"; break;
9799 case V3d_PHONG: theDI << "phong"; break;
9805 Standard_Boolean toPrint = Standard_False;
9806 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), aView);
9807 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
9809 Standard_CString anArg (theArgVec[anArgIter]);
9810 TCollection_AsciiString aFlag (anArg);
9812 if (anUpdateTool.parseRedrawMode (aFlag))
9816 else if (aFlag == "-echo"
9817 || aFlag == "-print")
9819 toPrint = Standard_True;
9820 anUpdateTool.Invalidate();
9822 else if (aFlag == "-mode"
9823 || aFlag == "-rendermode"
9824 || aFlag == "-render_mode")
9828 switch (aParams.Method)
9830 case Graphic3d_RM_RASTERIZATION: theDI << "rasterization "; break;
9831 case Graphic3d_RM_RAYTRACING: theDI << "ray-tracing "; break;
9837 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
9841 else if (aFlag == "-ray"
9842 || aFlag == "-raytrace")
9846 theDI << (aParams.Method == Graphic3d_RM_RAYTRACING ? "true" : "false") << " ";
9850 aParams.Method = Graphic3d_RM_RAYTRACING;
9852 else if (aFlag == "-rast"
9853 || aFlag == "-raster"
9854 || aFlag == "-rasterization")
9858 theDI << (aParams.Method == Graphic3d_RM_RASTERIZATION ? "true" : "false") << " ";
9862 aParams.Method = Graphic3d_RM_RASTERIZATION;
9864 else if (aFlag == "-msaa")
9868 theDI << aParams.NbMsaaSamples << " ";
9871 else if (++anArgIter >= theArgNb)
9873 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
9877 const Standard_Integer aNbSamples = Draw::Atoi (theArgVec[anArgIter]);
9880 std::cerr << "Error: invalid number of MSAA samples " << aNbSamples << ".\n";
9885 aParams.NbMsaaSamples = aNbSamples;
9888 else if (aFlag == "-oit")
9892 if (aParams.TransparencyMethod == Graphic3d_RTM_BLEND_OIT)
9894 theDI << "on, depth weight factor: " << TCollection_AsciiString (aParams.OitDepthFactor) << " ";
9898 theDI << "off" << " ";
9902 else if (++anArgIter >= theArgNb)
9904 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
9908 TCollection_AsciiString aParam = theArgVec[anArgIter];
9910 if (aParam.IsRealValue())
9912 const Standard_ShortReal aWeight = (Standard_ShortReal) Draw::Atof (theArgVec[anArgIter]);
9913 if (aWeight < 0.f || aWeight > 1.f)
9915 std::cerr << "Error: invalid value of Weighted Order-Independent Transparency depth weight factor " << aWeight << ". Should be within range [0.0; 1.0]\n";
9919 aParams.TransparencyMethod = Graphic3d_RTM_BLEND_OIT;
9920 aParams.OitDepthFactor = aWeight;
9922 else if (aParam == "off")
9924 aParams.TransparencyMethod = Graphic3d_RTM_BLEND_UNORDERED;
9928 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
9932 else if (aFlag == "-rendscale"
9933 || aFlag == "-renderscale"
9934 || aFlag == "-renderresolutionscale")
9938 theDI << aParams.RenderResolutionScale << " ";
9941 else if (++anArgIter >= theArgNb)
9943 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
9947 const Standard_Real aScale = Draw::Atof (theArgVec[anArgIter]);
9950 std::cerr << "Error: invalid rendering resolution scale " << aScale << ".\n";
9955 aParams.RenderResolutionScale = Standard_ShortReal(aScale);
9958 else if (aFlag == "-raydepth"
9959 || aFlag == "-ray_depth")
9963 theDI << aParams.RaytracingDepth << " ";
9966 else if (++anArgIter >= theArgNb)
9968 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
9972 const Standard_Integer aDepth = Draw::Atoi (theArgVec[anArgIter]);
9974 // We allow RaytracingDepth be more than 10 in case of GI enabled
9975 if (aDepth < 1 || (aDepth > 10 && !aParams.IsGlobalIlluminationEnabled))
9977 std::cerr << "Error: invalid ray-tracing depth " << aDepth << ". Should be within range [1; 10]\n";
9982 aParams.RaytracingDepth = aDepth;
9985 else if (aFlag == "-shad"
9986 || aFlag == "-shadows")
9990 theDI << (aParams.IsShadowEnabled ? "on" : "off") << " ";
9994 Standard_Boolean toEnable = Standard_True;
9995 if (++anArgIter < theArgNb
9996 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10000 aParams.IsShadowEnabled = toEnable;
10002 else if (aFlag == "-refl"
10003 || aFlag == "-reflections")
10007 theDI << (aParams.IsReflectionEnabled ? "on" : "off") << " ";
10011 Standard_Boolean toEnable = Standard_True;
10012 if (++anArgIter < theArgNb
10013 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10017 aParams.IsReflectionEnabled = toEnable;
10019 else if (aFlag == "-fsaa")
10023 theDI << (aParams.IsAntialiasingEnabled ? "on" : "off") << " ";
10027 Standard_Boolean toEnable = Standard_True;
10028 if (++anArgIter < theArgNb
10029 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10033 aParams.IsAntialiasingEnabled = toEnable;
10035 else if (aFlag == "-gleam")
10039 theDI << (aParams.IsTransparentShadowEnabled ? "on" : "off") << " ";
10043 Standard_Boolean toEnable = Standard_True;
10044 if (++anArgIter < theArgNb
10045 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10049 aParams.IsTransparentShadowEnabled = toEnable;
10051 else if (aFlag == "-gi")
10055 theDI << (aParams.IsGlobalIlluminationEnabled ? "on" : "off") << " ";
10059 Standard_Boolean toEnable = Standard_True;
10060 if (++anArgIter < theArgNb
10061 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10065 aParams.IsGlobalIlluminationEnabled = toEnable;
10068 aParams.RaytracingDepth = Min (aParams.RaytracingDepth, 10);
10071 else if (aFlag == "-blockedrng"
10072 || aFlag == "-brng")
10076 theDI << (aParams.CoherentPathTracingMode ? "on" : "off") << " ";
10080 Standard_Boolean toEnable = Standard_True;
10081 if (++anArgIter < theArgNb
10082 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10086 aParams.CoherentPathTracingMode = toEnable;
10088 else if (aFlag == "-maxrad")
10092 theDI << aParams.RadianceClampingValue << " ";
10095 else if (++anArgIter >= theArgNb)
10097 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
10101 const TCollection_AsciiString aMaxRadStr = theArgVec[anArgIter];
10102 if (!aMaxRadStr.IsRealValue())
10104 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
10108 const Standard_Real aMaxRadiance = aMaxRadStr.RealValue();
10109 if (aMaxRadiance <= 0.0)
10111 std::cerr << "Error: invalid radiance clamping value " << aMaxRadiance << ".\n";
10116 aParams.RadianceClampingValue = static_cast<Standard_ShortReal> (aMaxRadiance);
10119 else if (aFlag == "-iss")
10123 theDI << (aParams.AdaptiveScreenSampling ? "on" : "off") << " ";
10127 Standard_Boolean toEnable = Standard_True;
10128 if (++anArgIter < theArgNb
10129 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10133 aParams.AdaptiveScreenSampling = toEnable;
10135 else if (aFlag == "-issd")
10139 theDI << (aParams.ShowSamplingTiles ? "on" : "off") << " ";
10143 Standard_Boolean toEnable = Standard_True;
10144 if (++anArgIter < theArgNb
10145 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10149 aParams.ShowSamplingTiles = toEnable;
10151 else if (aFlag == "-nbtiles")
10155 theDI << aParams.NbRayTracingTiles << " ";
10158 else if (++anArgIter >= theArgNb)
10160 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
10164 const Standard_Integer aNbTiles = Draw::Atoi (theArgVec[anArgIter]);
10168 std::cerr << "Error: invalid number of ISS tiles " << aNbTiles << ".\n";
10169 std::cerr << "Specify value in range [64, 1024].\n";
10174 aParams.NbRayTracingTiles = aNbTiles;
10177 else if (aFlag == "-env")
10181 theDI << (aParams.UseEnvironmentMapBackground ? "on" : "off") << " ";
10185 Standard_Boolean toEnable = Standard_True;
10186 if (++anArgIter < theArgNb
10187 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10191 aParams.UseEnvironmentMapBackground = toEnable;
10193 else if (aFlag == "-twoside")
10197 theDI << (aParams.TwoSidedBsdfModels ? "on" : "off") << " ";
10201 Standard_Boolean toEnable = Standard_True;
10202 if (++anArgIter < theArgNb
10203 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10207 aParams.TwoSidedBsdfModels = toEnable;
10209 else if (aFlag == "-shademodel"
10210 || aFlag == "-shadingmodel"
10211 || aFlag == "-shading")
10215 switch (aView->ShadingModel())
10217 case V3d_COLOR: theDI << "color "; break;
10218 case V3d_FLAT: theDI << "flat "; break;
10219 case V3d_GOURAUD: theDI << "gouraud "; break;
10220 case V3d_PHONG: theDI << "phong "; break;
10225 if (++anArgIter >= theArgNb)
10227 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
10230 TCollection_AsciiString aMode (theArgVec[anArgIter]);
10232 if (aMode == "color"
10233 || aMode == "none")
10235 aView->SetShadingModel (V3d_COLOR);
10237 else if (aMode == "flat"
10238 || aMode == "facet")
10240 aView->SetShadingModel (V3d_FLAT);
10242 else if (aMode == "gouraud"
10243 || aMode == "vertex"
10244 || aMode == "vert")
10246 aView->SetShadingModel (V3d_GOURAUD);
10248 else if (aMode == "phong"
10249 || aMode == "fragment"
10251 || aMode == "pixel")
10253 aView->SetShadingModel (V3d_PHONG);
10257 std::cout << "Error: unknown shading model '" << aMode << "'\n";
10261 else if (aFlag == "-resolution")
10263 if (++anArgIter >= theArgNb)
10265 std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
10269 TCollection_AsciiString aResolution (theArgVec[anArgIter]);
10270 if (aResolution.IsIntegerValue())
10272 aView->ChangeRenderingParams().Resolution = static_cast<unsigned int> (Draw::Atoi (aResolution.ToCString()));
10276 std::cout << "Error: wrong syntax at argument'" << anArg << "'.\n";
10280 else if (aFlag == "-rebuildglsl"
10281 || aFlag == "-rebuild")
10285 theDI << (aParams.RebuildRayTracingShaders ? "on" : "off") << " ";
10289 Standard_Boolean toEnable = Standard_True;
10290 if (++anArgIter < theArgNb
10291 && !ViewerTest::ParseOnOff (theArgVec[anArgIter], toEnable))
10295 aParams.RebuildRayTracingShaders = toEnable;
10297 else if (aFlag == "-focal")
10299 if (++anArgIter >= theArgNb)
10301 std::cout << "Error: wrong syntax at argument '" << anArg << "'\n";
10305 TCollection_AsciiString aParam (theArgVec[anArgIter]);
10306 if (aParam.IsRealValue())
10308 float aFocalDist = static_cast<float> (aParam.RealValue());
10309 if (aFocalDist < 0)
10311 std::cout << "Error: parameter can't be negative at argument '" << anArg << "'.\n";
10314 aView->ChangeRenderingParams().CameraFocalPlaneDist = aFocalDist;
10318 std::cout << "Error: wrong syntax at argument'" << anArg << "'.\n";
10322 else if (aFlag == "-aperture")
10324 if (++anArgIter >= theArgNb)
10326 std::cout << "Error: wrong syntax at argument '" << anArg << "'\n";
10330 TCollection_AsciiString aParam(theArgVec[anArgIter]);
10331 if (aParam.IsRealValue())
10333 float aApertureSize = static_cast<float> (aParam.RealValue());
10334 if (aApertureSize < 0)
10336 std::cout << "Error: parameter can't be negative at argument '" << anArg << "'.\n";
10339 aView->ChangeRenderingParams().CameraApertureRadius = aApertureSize;
10343 std::cout << "Error: wrong syntax at argument'" << anArg << "'.\n";
10347 else if (aFlag == "-exposure")
10349 if (++anArgIter >= theArgNb)
10351 std::cout << "Error: wrong syntax at argument '" << anArg << "'\n";
10355 TCollection_AsciiString anExposure (theArgVec[anArgIter]);
10356 if (anExposure.IsRealValue())
10358 aView->ChangeRenderingParams().Exposure = static_cast<float> (anExposure.RealValue());
10362 std::cout << "Error: wrong syntax at argument'" << anArg << "'.\n";
10366 else if (aFlag == "-whitepoint")
10368 if (++anArgIter >= theArgNb)
10370 std::cout << "Error: wrong syntax at argument '" << anArg << "'\n";
10374 TCollection_AsciiString aWhitePoint (theArgVec[anArgIter]);
10375 if (aWhitePoint.IsRealValue())
10377 aView->ChangeRenderingParams().WhitePoint = static_cast<float> (aWhitePoint.RealValue());
10381 std::cout << "Error: wrong syntax at argument'" << anArg << "'.\n";
10385 else if (aFlag == "-tonemapping")
10387 if (++anArgIter >= theArgNb)
10389 std::cout << "Error: wrong syntax at argument '" << anArg << "'\n";
10393 TCollection_AsciiString aMode (theArgVec[anArgIter]);
10396 if (aMode == "disabled")
10398 aView->ChangeRenderingParams().ToneMappingMethod = Graphic3d_ToneMappingMethod_Disabled;
10400 else if (aMode == "filmic")
10402 aView->ChangeRenderingParams().ToneMappingMethod = Graphic3d_ToneMappingMethod_Filmic;
10406 std::cout << "Error: wrong syntax at argument'" << anArg << "'.\n";
10412 std::cout << "Error: wrong syntax, unknown flag '" << anArg << "'\n";
10420 //=======================================================================
10421 //function : VProgressiveMode
10423 //=======================================================================
10424 #if defined(_WIN32)
10425 static Standard_Integer VProgressiveMode (Draw_Interpretor& /*theDI*/,
10426 Standard_Integer /*theNbArgs*/,
10427 const char** /*theArgs*/)
10429 Handle(V3d_View) aView = ViewerTest::CurrentView();
10430 if (aView.IsNull())
10432 std::cerr << "Error: no active viewer!\n";
10436 std::cout << "Press Enter or Escape key to exit progressive rendering mode" << std::endl;
10442 Standard_Boolean toExit = Standard_False;
10445 while (PeekMessageW (&aMsg, NULL, 0, 0, PM_REMOVE))
10447 if (aMsg.message == WM_KEYDOWN && (aMsg.wParam == 0x0d || aMsg.wParam == 0x1b))
10449 toExit = Standard_True;
10452 TranslateMessage (&aMsg);
10453 DispatchMessageW (&aMsg);
10466 //=======================================================================
10467 //function : VFrustumCulling
10468 //purpose : enables/disables view volume's culling.
10469 //=======================================================================
10470 static int VFrustumCulling (Draw_Interpretor& theDI,
10471 Standard_Integer theArgNb,
10472 const char** theArgVec)
10474 Handle(V3d_View) aView = ViewerTest::CurrentView();
10475 if (aView.IsNull())
10477 std::cout << theArgVec[0] << " Error: Use 'vinit' command before\n";
10483 theDI << (aView->IsCullingEnabled() ? "on" : "off");
10486 else if (theArgNb != 2)
10488 std::cout << theArgVec[0] << " Syntax error: Specify the mode\n";
10492 TCollection_AsciiString aModeStr (theArgVec[1]);
10493 aModeStr.LowerCase();
10494 Standard_Boolean toEnable = 0;
10495 if (aModeStr == "on")
10499 else if (aModeStr == "off")
10505 toEnable = Draw::Atoi (theArgVec[1]) != 0;
10508 aView->SetFrustumCulling (toEnable);
10513 //=======================================================================
10514 //function : VHighlightSelected
10516 //=======================================================================
10517 static int VHighlightSelected (Draw_Interpretor& theDI,
10518 Standard_Integer theArgNb,
10519 const char** theArgVec)
10521 if (ViewerTest::GetAISContext().IsNull())
10523 std::cout << theArgVec[0] << " error : Context is not created. Please call vinit before.\n";
10527 const Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
10531 theDI << (aContext->ToHilightSelected() ? "on" : "off");
10537 std::cout << theArgVec[0] << " error : wrong number of parameters."
10538 << "Type 'help" << theArgVec[0] << "' for more information.";
10543 TCollection_AsciiString aMode (theArgVec[1]);
10545 Standard_Boolean toEnable = Standard_False;
10546 if (aMode.IsEqual ("on"))
10548 toEnable = Standard_True;
10550 else if (aMode.IsEqual ("off"))
10552 toEnable = Standard_False;
10556 toEnable = Draw::Atoi (theArgVec[1]) != 0;
10559 if (toEnable != aContext->ToHilightSelected())
10561 aContext->SetToHilightSelected (toEnable);
10563 // Move cursor to null position and back to process updating of detection
10564 // and highlighting of selected object immediatly.
10565 Standard_Integer aPixX = 0;
10566 Standard_Integer aPixY = 0;
10567 const Handle(ViewerTest_EventManager)& anEventManager = ViewerTest::CurrentEventManager();
10569 anEventManager->GetCurrentPosition (aPixX, aPixY);
10570 anEventManager->MoveTo (0, 0);
10571 anEventManager->MoveTo (aPixX, aPixY);
10577 //=======================================================================
10578 //function : VXRotate
10580 //=======================================================================
10581 static Standard_Integer VXRotate (Draw_Interpretor& di,
10582 Standard_Integer argc,
10583 const char ** argv)
10585 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
10586 if (aContext.IsNull())
10588 di << argv[0] << "ERROR : use 'vinit' command before \n";
10594 di << "ERROR : Usage : " << argv[0] << " name angle\n";
10598 TCollection_AsciiString aName (argv[1]);
10599 Standard_Real anAngle = Draw::Atof (argv[2]);
10602 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
10603 Handle(AIS_InteractiveObject) anIObj;
10604 if (!aMap.IsBound2 (aName) )
10606 di << "Use 'vdisplay' before\n";
10611 anIObj = Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (aName));
10613 gp_Trsf aTransform;
10614 aTransform.SetRotation (gp_Ax1 (gp_Pnt (0.0, 0.0, 0.0), gp_Vec (1.0, 0.0, 0.0)), anAngle);
10615 aTransform.SetTranslationPart (anIObj->LocalTransformation().TranslationPart());
10617 aContext->SetLocation (anIObj, aTransform);
10618 aContext->UpdateCurrentViewer();
10624 //===============================================================================================
10625 //class : ViewerTest_AISManipulator
10626 //purpose : Proxy class maintaining automated registry map to enlist existing AIS_Manipulator instances
10627 //===============================================================================================
10628 DEFINE_STANDARD_HANDLE (ViewerTest_AISManipulator, AIS_Manipulator)
10630 class ViewerTest_AISManipulator : public AIS_Manipulator
10634 ViewerTest_AISManipulator() : AIS_Manipulator()
10636 GetMapOfAISManipulators().Add (this);
10639 virtual ~ViewerTest_AISManipulator()
10641 GetMapOfAISManipulators().Remove (this);
10644 DEFINE_STANDARD_RTTIEXT(ViewerTest_AISManipulator, AIS_Manipulator)
10647 IMPLEMENT_STANDARD_HANDLE (ViewerTest_AISManipulator, AIS_Manipulator)
10648 IMPLEMENT_STANDARD_RTTIEXT(ViewerTest_AISManipulator, AIS_Manipulator)
10650 //===============================================================================================
10651 //function : VManipulator
10653 //===============================================================================================
10654 static int VManipulator (Draw_Interpretor& theDi,
10655 Standard_Integer theArgsNb,
10656 const char** theArgVec)
10658 Handle(V3d_View) aView = ViewerTest::CurrentView();
10659 Handle(V3d_Viewer) aViewer = ViewerTest::GetViewerFromContext();
10660 ViewerTest::GetAISContext()->MainSelector()->SetPickClosest (Standard_False);
10662 || aViewer.IsNull())
10664 std::cerr << "No active viewer!\n";
10668 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), ViewerTest::CurrentView());
10669 Standard_Integer anArgIter = 1;
10670 for (; anArgIter < theArgsNb; ++anArgIter)
10672 anUpdateTool.parseRedrawMode (theArgVec[anArgIter]);
10675 ViewerTest_CmdParser aCmd;
10676 aCmd.AddDescription ("Manages manipulator for interactive objects:");
10677 aCmd.AddOption ("attach", "... object - attach manipulator to an object");
10678 aCmd.AddOption ("adjustPosition", "... {0|1} - adjust position when attaching");
10679 aCmd.AddOption ("adjustSize", "... {0|1} - adjust size when attaching ");
10680 aCmd.AddOption ("enableModes", "... {0|1} - enable modes when attaching ");
10681 aCmd.AddOption ("detach", "... - detach manipulator");
10683 aCmd.AddOption ("startTransform", "... mouse_x mouse_y - invoke start transformation");
10684 aCmd.AddOption ("transform", "... mouse_x mouse_y - invoke transformation");
10685 aCmd.AddOption ("stopTransform", "... [abort] - invoke stop transformation");
10687 aCmd.AddOption ("move", "... x y z - move object");
10688 aCmd.AddOption ("rotate", "... x y z dx dy dz angle - rotate object");
10689 aCmd.AddOption ("scale", "... factor - scale object");
10691 aCmd.AddOption ("autoActivate", "... {0|1} - set activation on detection");
10692 aCmd.AddOption ("followTranslation", "... {0|1} - set following translation transform");
10693 aCmd.AddOption ("followRotation", "... {0|1} - set following rotation transform");
10694 aCmd.AddOption ("gap", "... value - set gap between sub-parts");
10695 aCmd.AddOption ("part", "... axis mode {0|1} - set visual part");
10696 aCmd.AddOption ("pos", "... x y z [nx ny nz [xx xy xz]] - set position of manipulator");
10697 aCmd.AddOption ("size", "... size - set size of manipulator");
10698 aCmd.AddOption ("zoomable", "... {0|1} - set zoom persistence");
10700 aCmd.Parse (theArgsNb, theArgVec);
10702 if (aCmd.HasOption ("help"))
10704 theDi.PrintHelp (theArgVec[0]);
10708 ViewerTest_DoubleMapOfInteractiveAndName& aMapAIS = GetMapOfAIS();
10710 TCollection_AsciiString aName (aCmd.Arg ("", 0).c_str());
10712 if (aName.IsEmpty())
10714 std::cerr << theArgVec[0] << " error: please specify AIS manipulator's name as the first argument.\n";
10718 // ----------------------------------
10719 // detach existing manipulator object
10720 // ----------------------------------
10722 if (aCmd.HasOption ("detach"))
10724 if (!aMapAIS.IsBound2 (aName))
10726 std::cerr << theArgVec[0] << " error: could not find \"" << aName << "\" AIS object.\n";
10730 Handle(AIS_Manipulator) aManipulator = Handle(AIS_Manipulator)::DownCast (aMapAIS.Find2 (aName));
10731 if (aManipulator.IsNull())
10733 std::cerr << theArgVec[0] << " error: \"" << aName << "\" is not an AIS manipulator.\n";
10737 aManipulator->Detach();
10738 aMapAIS.UnBind2 (aName);
10739 ViewerTest::GetAISContext()->Remove (aManipulator, Standard_True);
10744 // -----------------------------------------------
10745 // find or create manipulator if it does not exist
10746 // -----------------------------------------------
10748 Handle(AIS_Manipulator) aManipulator;
10749 if (!aMapAIS.IsBound2 (aName))
10751 std::cout << theArgVec[0] << ": AIS object \"" << aName << "\" has been created.\n";
10753 aManipulator = new ViewerTest_AISManipulator();
10754 aMapAIS.Bind (aManipulator, aName);
10758 aManipulator = Handle(AIS_Manipulator)::DownCast (aMapAIS.Find2 (aName));
10759 if (aManipulator.IsNull())
10761 std::cerr << theArgVec[0] << " error: \"" << aName << "\" is not an AIS manipulator.\n";
10766 // -----------------------------------------
10767 // change properties of manipulator instance
10768 // -----------------------------------------
10770 if (aCmd.HasOption ("autoActivate", 1, Standard_True))
10772 aManipulator->SetModeActivationOnDetection (aCmd.ArgBool ("autoActivate"));
10774 if (aCmd.HasOption ("followTranslation", 1, Standard_True))
10776 aManipulator->ChangeTransformBehavior().SetFollowTranslation (aCmd.ArgBool ("followTranslation"));
10778 if (aCmd.HasOption ("followRotation", 1, Standard_True))
10780 aManipulator->ChangeTransformBehavior().SetFollowRotation (aCmd.ArgBool ("followRotation"));
10782 if (aCmd.HasOption ("gap", 1, Standard_True))
10784 aManipulator->SetGap (aCmd.ArgFloat ("gap"));
10786 if (aCmd.HasOption ("part", 3, Standard_True))
10788 Standard_Integer anAxis = aCmd.ArgInt ("part", 0);
10789 Standard_Integer aMode = aCmd.ArgInt ("part", 1);
10790 Standard_Boolean aOnOff = aCmd.ArgBool ("part", 2);
10791 if (aMode < 1 || aMode > 3)
10793 std::cerr << theArgVec[0] << " error: mode value should be in range [1, 3].\n";
10797 aManipulator->SetPart (anAxis, static_cast<AIS_ManipulatorMode> (aMode), aOnOff);
10799 if (aCmd.HasOption ("pos", 3, Standard_True))
10801 gp_Pnt aLocation = aCmd.ArgPnt ("pos", 0);
10802 gp_Dir aVDir = aCmd.HasOption ("pos", 6) ? gp_Dir (aCmd.ArgVec ("pos", 3)) : aManipulator->Position().Direction();
10803 gp_Dir aXDir = aCmd.HasOption ("pos", 9) ? gp_Dir (aCmd.ArgVec ("pos", 6)) : aManipulator->Position().XDirection();
10805 aManipulator->SetPosition (gp_Ax2 (aLocation, aVDir, aXDir));
10807 if (aCmd.HasOption ("size", 1, Standard_True))
10809 aManipulator->SetSize (aCmd.ArgFloat ("size"));
10811 if (aCmd.HasOption ("zoomable", 1, Standard_True))
10813 aManipulator->SetZoomPersistence (!aCmd.ArgBool ("zoomable"));
10815 if (ViewerTest::GetAISContext()->IsDisplayed (aManipulator))
10817 ViewerTest::GetAISContext()->Remove (aManipulator, Standard_False);
10818 ViewerTest::GetAISContext()->Display (aManipulator, Standard_False);
10822 // ---------------------------------------------------
10823 // attach, detach or access manipulator from an object
10824 // ---------------------------------------------------
10826 if (aCmd.HasOption ("attach"))
10828 // Find an object and attach manipulator to it
10829 if (!aCmd.HasOption ("attach", 1, Standard_True))
10834 TCollection_AsciiString anObjName (aCmd.Arg ("attach", 0).c_str());
10835 if (!aMapAIS.IsBound2 (anObjName))
10837 std::cerr << theArgVec[0] << " error: AIS object \"" << anObjName << "\" does not exist.\n";
10841 Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast (aMapAIS.Find2 (anObjName));
10842 ViewerTest_MapOfAISManipulators::Iterator anIt (GetMapOfAISManipulators());
10843 for (; anIt.More(); anIt.Next())
10845 if (anIt.Value()->IsAttached()
10846 && anIt.Value()->Object() == anObject)
10848 std::cerr << theArgVec[0] << " error: AIS object \"" << anObjName << "\" already has manipulator.\n";
10853 AIS_Manipulator::OptionsForAttach anOptions;
10854 if (aCmd.HasOption ("adjustPosition", 1, Standard_True))
10856 anOptions.SetAdjustPosition (aCmd.ArgBool ("adjustPosition"));
10858 if (aCmd.HasOption ("adjustSize", 1, Standard_True))
10860 anOptions.SetAdjustSize (aCmd.ArgBool ("adjustSize"));
10862 if (aCmd.HasOption ("enableModes", 1, Standard_True))
10864 anOptions.SetEnableModes (aCmd.ArgBool ("enableModes"));
10867 aManipulator->Attach (anObject, anOptions);
10870 // --------------------------------------
10871 // apply transformation using manipulator
10872 // --------------------------------------
10874 if (aCmd.HasOption ("startTransform", 2, Standard_True))
10876 aManipulator->StartTransform (aCmd.ArgInt ("startTransform", 0), aCmd.ArgInt ("startTransform", 1), ViewerTest::CurrentView());
10878 if (aCmd.HasOption ("transform", 2, Standard_True))
10880 aManipulator->Transform (aCmd.ArgInt ("transform", 0), aCmd.ArgInt ("transform", 1), ViewerTest::CurrentView());
10882 if (aCmd.HasOption ("stopTransform"))
10884 Standard_Boolean toApply = !aCmd.HasOption ("stopTransform", 1) || (aCmd.Arg ("stopTransform", 0) != "abort");
10886 aManipulator->StopTransform (toApply);
10890 if (aCmd.HasOption ("move", 3, Standard_True))
10892 aT.SetTranslationPart (aCmd.ArgVec ("move"));
10894 if (aCmd.HasOption ("rotate", 7, Standard_True))
10896 aT.SetRotation (gp_Ax1 (aCmd.ArgPnt ("rotate", 0), aCmd.ArgVec ("rotate", 3)), aCmd.ArgDouble ("rotate", 6));
10898 if (aCmd.HasOption ("scale", 1))
10900 aT.SetScale (gp_Pnt(), aCmd.ArgDouble("scale"));
10903 if (aT.Form() != gp_Identity)
10905 aManipulator->Transform (aT);
10908 ViewerTest::GetAISContext()->Redisplay (aManipulator, Standard_True);
10913 //===============================================================================================
10914 //function : VSelectionProperties
10916 //===============================================================================================
10917 static int VSelectionProperties (Draw_Interpretor& theDi,
10918 Standard_Integer theArgsNb,
10919 const char** theArgVec)
10921 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
10924 std::cerr << "No active viewer!\n";
10928 Standard_Boolean toPrint = theArgsNb == 1;
10929 Standard_Boolean toRedraw = Standard_False;
10930 Standard_Integer anArgIter = 1;
10931 Prs3d_TypeOfHighlight aType = Prs3d_TypeOfHighlight_None;
10932 if (anArgIter < theArgsNb)
10934 TCollection_AsciiString anArgFirst (theArgVec[anArgIter]);
10935 anArgFirst.LowerCase();
10937 if (anArgFirst == "dynhighlight"
10938 || anArgFirst == "dynhilight"
10939 || anArgFirst == "dynamichighlight"
10940 || anArgFirst == "dynamichilight")
10942 aType = Prs3d_TypeOfHighlight_Dynamic;
10944 else if (anArgFirst == "localdynhighlight"
10945 || anArgFirst == "localdynhilight"
10946 || anArgFirst == "localdynamichighlight"
10947 || anArgFirst == "localdynamichilight")
10949 aType = Prs3d_TypeOfHighlight_LocalDynamic;
10951 else if (anArgFirst == "selhighlight"
10952 || anArgFirst == "selhilight"
10953 || anArgFirst == "selectedhighlight"
10954 || anArgFirst == "selectedhilight")
10956 aType = Prs3d_TypeOfHighlight_Selected;
10958 else if (anArgFirst == "localselhighlight"
10959 || anArgFirst == "localselhilight"
10960 || anArgFirst == "localselectedhighlight"
10961 || anArgFirst == "localselectedhilight")
10963 aType = Prs3d_TypeOfHighlight_LocalSelected;
10970 for (; anArgIter < theArgsNb; ++anArgIter)
10972 TCollection_AsciiString anArg (theArgVec[anArgIter]);
10974 if (anArg == "-help")
10976 theDi.PrintHelp (theArgVec[0]);
10979 else if (anArg == "-print")
10981 toPrint = Standard_True;
10983 else if (anArg == "-autoactivate")
10985 Standard_Boolean toEnable = Standard_True;
10986 if (anArgIter + 1 < theArgsNb
10987 && ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], toEnable))
10991 aCtx->SetAutoActivateSelection (toEnable);
10993 else if (anArg == "-pickstrategy"
10994 || anArg == "-pickingstrategy")
10996 if (++anArgIter >= theArgsNb)
10998 std::cout << "Syntax error: type of highlighting is undefined\n";
11002 SelectMgr_PickingStrategy aStrategy = SelectMgr_PickingStrategy_FirstAcceptable;
11003 TCollection_AsciiString aVal (theArgVec[anArgIter]);
11005 if (aVal == "first"
11006 || aVal == "firstaccepted"
11007 || aVal == "firstacceptable")
11009 aStrategy = SelectMgr_PickingStrategy_FirstAcceptable;
11011 else if (aVal == "topmost"
11012 || aVal == "onlyTopmost")
11014 aStrategy = SelectMgr_PickingStrategy_OnlyTopmost;
11018 std::cout << "Syntax error: unknwon picking strategy '" << aVal << "'\n";
11022 aCtx->SetPickingStrategy (aStrategy);
11024 else if (anArg == "-pixtol"
11025 && anArgIter + 1 < theArgsNb)
11027 aCtx->SetPixelTolerance (Draw::Atoi (theArgVec[++anArgIter]));
11029 else if ((anArg == "-mode"
11030 || anArg == "-dispmode")
11031 && anArgIter + 1 < theArgsNb)
11033 if (aType == Prs3d_TypeOfHighlight_None)
11035 std::cout << "Syntax error: type of highlighting is undefined\n";
11039 const Standard_Integer aDispMode = Draw::Atoi (theArgVec[++anArgIter]);
11040 const Handle(Prs3d_Drawer)& aStyle = aCtx->HighlightStyle (aType);
11041 aStyle->SetDisplayMode (aDispMode);
11042 toRedraw = Standard_True;
11044 else if (anArg == "-layer"
11045 && anArgIter + 1 < theArgsNb)
11047 if (aType == Prs3d_TypeOfHighlight_None)
11049 std::cout << "Syntax error: type of highlighting is undefined\n";
11053 const Standard_Integer aNewLayer = Draw::Atoi (theArgVec[++anArgIter]);
11054 if (aNewLayer != Graphic3d_ZLayerId_UNKNOWN)
11056 TColStd_SequenceOfInteger aLayers;
11057 aCtx->CurrentViewer()->GetAllZLayers (aLayers);
11058 if (std::find (aLayers.begin(), aLayers.end(), aNewLayer) == aLayers.end())
11060 std::cout << "Syntax error: Layer " << aNewLayer << " is undefined\n";
11065 const Handle(Prs3d_Drawer)& aStyle = aCtx->HighlightStyle (aType);
11066 aStyle->SetZLayer (aNewLayer);
11067 toRedraw = Standard_True;
11069 else if (anArg == "-hicolor"
11070 || anArg == "-selcolor"
11071 || anArg == "-color")
11073 if (anArg.StartsWith ("-hi"))
11075 aType = Prs3d_TypeOfHighlight_Dynamic;
11077 else if (anArg.StartsWith ("-sel"))
11079 aType = Prs3d_TypeOfHighlight_Selected;
11081 else if (aType == Prs3d_TypeOfHighlight_None)
11083 std::cout << "Syntax error: type of highlighting is undefined\n";
11087 Quantity_Color aColor;
11088 Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgsNb - anArgIter - 1,
11089 theArgVec + anArgIter + 1,
11091 if (aNbParsed == 0)
11093 std::cout << "Syntax error: need more arguments.\n";
11096 anArgIter += aNbParsed;
11098 const Handle(Prs3d_Drawer)& aStyle = aCtx->HighlightStyle (aType);
11099 aStyle->SetColor (aColor);
11100 toRedraw = Standard_True;
11102 else if ((anArg == "-transp"
11103 || anArg == "-transparency"
11104 || anArg == "-hitransp"
11105 || anArg == "-seltransp"
11106 || anArg == "-hitransplocal"
11107 || anArg == "-seltransplocal")
11108 && anArgIter + 1 < theArgsNb)
11110 if (anArg.StartsWith ("-hi"))
11112 aType = Prs3d_TypeOfHighlight_Dynamic;
11114 else if (anArg.StartsWith ("-sel"))
11116 aType = Prs3d_TypeOfHighlight_Selected;
11118 else if (aType == Prs3d_TypeOfHighlight_None)
11120 std::cout << "Syntax error: type of highlighting is undefined\n";
11124 const Standard_Real aTransp = Draw::Atof (theArgVec[++anArgIter]);
11125 const Handle(Prs3d_Drawer)& aStyle = aCtx->HighlightStyle (aType);
11126 aStyle->SetTransparency ((Standard_ShortReal )aTransp);
11127 toRedraw = Standard_True;
11129 else if ((anArg == "-mat"
11130 || anArg == "-material")
11131 && anArgIter + 1 < theArgsNb)
11133 if (aType == Prs3d_TypeOfHighlight_None)
11135 std::cout << "Syntax error: type of highlighting is undefined\n";
11139 const Handle(Prs3d_Drawer)& aStyle = aCtx->HighlightStyle (aType);
11140 Graphic3d_NameOfMaterial aMatName = Graphic3d_MaterialAspect::MaterialFromName (theArgVec[anArgIter + 1]);
11141 if (aMatName != Graphic3d_NOM_DEFAULT)
11144 Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d();
11145 *anAspect = *aCtx->DefaultDrawer()->ShadingAspect()->Aspect();
11146 Graphic3d_MaterialAspect aMat (aMatName);
11147 aMat.SetColor (aStyle->Color());
11148 aMat.SetTransparency (aStyle->Transparency());
11149 anAspect->SetFrontMaterial (aMat);
11150 anAspect->SetInteriorColor (aStyle->Color());
11151 aStyle->SetBasicFillAreaAspect (anAspect);
11155 aStyle->SetBasicFillAreaAspect (Handle(Graphic3d_AspectFillArea3d)());
11157 toRedraw = Standard_True;
11161 std::cout << "Syntax error at '" << theArgVec[anArgIter] << "'\n";
11167 const Handle(Prs3d_Drawer)& aHiStyle = aCtx->HighlightStyle();
11168 const Handle(Prs3d_Drawer)& aSelStyle = aCtx->SelectionStyle();
11169 theDi << "Auto-activation : " << (aCtx->GetAutoActivateSelection() ? "On" : "Off") << "\n";
11170 theDi << "Selection pixel tolerance : " << aCtx->MainSelector()->PixelTolerance() << "\n";
11171 theDi << "Selection color : " << Quantity_Color::StringName (aSelStyle->Color().Name()) << "\n";
11172 theDi << "Dynamic highlight color : " << Quantity_Color::StringName (aHiStyle->Color().Name()) << "\n";
11173 theDi << "Selection transparency : " << aSelStyle->Transparency() << "\n";
11174 theDi << "Dynamic highlight transparency : " << aHiStyle->Transparency() << "\n";
11175 theDi << "Selection mode : " << aSelStyle->DisplayMode() << "\n";
11176 theDi << "Dynamic highlight mode : " << aHiStyle->DisplayMode() << "\n";
11177 theDi << "Selection layer : " << aSelStyle->ZLayer() << "\n";
11178 theDi << "Dynamic layer : " << aHiStyle->ZLayer() << "\n";
11181 if (aCtx->NbSelected() != 0 && toRedraw)
11183 aCtx->HilightSelected (Standard_True);
11189 //===============================================================================================
11190 //function : VDumpSelectionImage
11192 //===============================================================================================
11193 static int VDumpSelectionImage (Draw_Interpretor& /*theDi*/,
11194 Standard_Integer theArgsNb,
11195 const char** theArgVec)
11199 std::cout << "Syntax error: wrong number arguments for '" << theArgVec[0] << "'\n";
11203 const Handle(AIS_InteractiveContext)& aContext = ViewerTest::GetAISContext();
11204 if (aContext.IsNull())
11206 std::cout << "Error: no active view.\n";
11210 TCollection_AsciiString aFile;
11211 StdSelect_TypeOfSelectionImage aType = StdSelect_TypeOfSelectionImage_NormalizedDepth;
11212 Image_Format anImgFormat = Image_Format_BGR;
11213 Standard_Integer aPickedIndex = 1;
11214 for (Standard_Integer anArgIter = 1; anArgIter < theArgsNb; ++anArgIter)
11216 TCollection_AsciiString aParam (theArgVec[anArgIter]);
11217 aParam.LowerCase();
11218 if (aParam == "-type")
11220 if (++anArgIter >= theArgsNb)
11222 std::cout << "Syntax error: wrong number parameters of flag '-depth'.\n";
11226 TCollection_AsciiString aValue (theArgVec[anArgIter]);
11227 aValue.LowerCase();
11228 if (aValue == "depth"
11229 || aValue == "normdepth"
11230 || aValue == "normalizeddepth")
11232 aType = StdSelect_TypeOfSelectionImage_NormalizedDepth;
11233 anImgFormat = Image_Format_GrayF;
11235 if (aValue == "depthinverted"
11236 || aValue == "normdepthinverted"
11237 || aValue == "normalizeddepthinverted"
11238 || aValue == "inverted")
11240 aType = StdSelect_TypeOfSelectionImage_NormalizedDepthInverted;
11241 anImgFormat = Image_Format_GrayF;
11243 else if (aValue == "unnormdepth"
11244 || aValue == "unnormalizeddepth")
11246 aType = StdSelect_TypeOfSelectionImage_UnnormalizedDepth;
11247 anImgFormat = Image_Format_GrayF;
11249 else if (aValue == "objectcolor"
11250 || aValue == "object"
11251 || aValue == "color")
11253 aType = StdSelect_TypeOfSelectionImage_ColoredDetectedObject;
11255 else if (aValue == "entitycolor"
11256 || aValue == "entity")
11258 aType = StdSelect_TypeOfSelectionImage_ColoredEntity;
11260 else if (aValue == "ownercolor"
11261 || aValue == "owner")
11263 aType = StdSelect_TypeOfSelectionImage_ColoredOwner;
11265 else if (aValue == "selectionmodecolor"
11266 || aValue == "selectionmode"
11267 || aValue == "selmodecolor"
11268 || aValue == "selmode")
11270 aType = StdSelect_TypeOfSelectionImage_ColoredSelectionMode;
11273 else if (aParam == "-picked"
11274 || aParam == "-pickeddepth"
11275 || aParam == "-pickedindex")
11277 if (++anArgIter >= theArgsNb)
11279 std::cout << "Syntax error: wrong number parameters at '" << aParam << "'.\n";
11283 aPickedIndex = Draw::Atoi (theArgVec[anArgIter]);
11285 else if (aFile.IsEmpty())
11287 aFile = theArgVec[anArgIter];
11291 std::cout << "Syntax error: unknown argument '" << theArgVec[anArgIter] << "'.\n";
11295 if (aFile.IsEmpty())
11297 std::cout << "Syntax error: image file name is missing.\n";
11301 const Handle(V3d_View)& aView = ViewerTest::CurrentView();
11302 Standard_Integer aWidth = 0, aHeight = 0;
11303 aView->Window()->Size (aWidth, aHeight);
11305 Image_AlienPixMap aPixMap;
11306 if (!aPixMap.InitZero (anImgFormat, aWidth, aHeight))
11308 std::cout << "Error: can't allocate image.\n";
11311 if (!aContext->MainSelector()->ToPixMap (aPixMap, aView, aType, aPickedIndex))
11313 std::cout << "Error: can't generate selection image.\n";
11316 if (!aPixMap.Save (aFile))
11318 std::cout << "Error: can't save selection image.\n";
11324 //=======================================================================
11325 //function : ViewerCommands
11327 //=======================================================================
11329 void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
11332 const char *group = "ZeViewer";
11333 theCommands.Add("vinit",
11334 "vinit [-name viewName] [-left leftPx] [-top topPx] [-width widthPx] [-height heightPx]"
11335 "\n\t\t: [-exitOnClose] [-closeOnEscape]"
11336 #if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
11337 "\n\t\t: [-display displayName]"
11339 "\n\t\t: Creates new View window with specified name viewName."
11340 "\n\t\t: By default the new view is created in the viewer and in"
11341 "\n\t\t: graphic driver shared with active view."
11342 "\n\t\t: -name {driverName/viewerName/viewName | viewerName/viewName | viewName}"
11343 "\n\t\t: If driverName isn't specified the driver will be shared with active view."
11344 "\n\t\t: If viewerName isn't specified the viewer will be shared with active view."
11345 #if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
11346 "\n\t\t: -display HostName.DisplayNumber[:ScreenNumber]"
11347 "\n\t\t: Display name will be used within creation of graphic driver, when specified."
11349 "\n\t\t: -left, -top pixel position of left top corner of the window."
11350 "\n\t\t: -width, -height width and heigth of window respectively."
11351 "\n\t\t: -exitOnClose when specified, closing the view will exit application."
11352 "\n\t\t: -closeOnEscape when specified, view will be closed on pressing Escape."
11353 "\n\t\t: Additional commands for operations with views: vclose, vactivate, vviewlist.",
11354 __FILE__,VInit,group);
11355 theCommands.Add("vclose" ,
11356 "[view_id [keep_context=0|1]]\n"
11357 "or vclose ALL - to remove all created views\n"
11358 " - removes view(viewer window) defined by its view_id.\n"
11359 " - keep_context: by default 0; if 1 and the last view is deleted"
11360 " the current context is not removed.",
11361 __FILE__,VClose,group);
11362 theCommands.Add("vactivate" ,
11364 " - activates view(viewer window) defined by its view_id",
11365 __FILE__,VActivate,group);
11366 theCommands.Add("vviewlist",
11367 "vviewlist [format={tree, long}]"
11368 " - prints current list of views per viewer and graphic_driver ID shared between viewers"
11369 " - format: format of result output, if tree the output is a tree view;"
11370 "otherwise it's a list of full view names. By default format = tree",
11371 __FILE__,VViewList,group);
11372 theCommands.Add("vhelp" ,
11373 "vhelp : display help on the viewer commands",
11374 __FILE__,VHelp,group);
11375 theCommands.Add("vtop" ,
11376 "vtop or <T> : Top view. Orientation +X+Y" ,
11377 __FILE__,VTop,group);
11378 theCommands.Add("vbottom" ,
11379 "vbottom : Bottom view. Orientation +X-Y" ,
11380 __FILE__,VBottom,group);
11381 theCommands.Add("vleft" ,
11382 "vleft : Left view. Orientation -Y+Z" ,
11383 __FILE__,VLeft,group);
11384 theCommands.Add("vright" ,
11385 "vright : Right view. Orientation +Y+Z" ,
11386 __FILE__,VRight,group);
11387 theCommands.Add("vaxo" ,
11388 " vaxo or <A> : Axonometric view. Orientation +X-Y+Z",
11389 __FILE__,VAxo,group);
11390 theCommands.Add("vfront" ,
11391 "vfront : Front view. Orientation +X+Z" ,
11392 __FILE__,VFront,group);
11393 theCommands.Add("vback" ,
11394 "vback : Back view. Orientation -X+Z" ,
11395 __FILE__,VBack,group);
11396 theCommands.Add("vpick" ,
11397 "vpick : vpick X Y Z [shape subshape] ( all variables as string )",
11399 theCommands.Add("vfit",
11400 "vfit or <F> [-selected] [-noupdate]"
11401 "\n\t\t: [-selected] fits the scene according to bounding box of currently selected objects",
11402 __FILE__,VFit,group);
11403 theCommands.Add ("vfitarea",
11404 "vfitarea x1 y1 x2 y2"
11405 "\n\t\t: vfitarea x1 y1 z1 x2 y2 z2"
11406 "\n\t\t: Fit view to show area located between two points"
11407 "\n\t\t: given in world 2D or 3D corrdinates.",
11408 __FILE__, VFitArea, group);
11409 theCommands.Add ("vzfit", "vzfit [scale]\n"
11410 " Matches Z near, Z far view volume planes to the displayed objects.\n"
11411 " \"scale\" - specifies factor to scale computed z range.\n",
11412 __FILE__, VZFit, group);
11413 theCommands.Add("vrepaint",
11414 "vrepaint [-immediate]"
11415 "\n\t\t: force redraw",
11416 __FILE__,VRepaint,group);
11417 theCommands.Add("vclear",
11419 "\n\t\t: remove all the object from the viewer",
11420 __FILE__,VClear,group);
11421 theCommands.Add("vsetbg",
11422 "vsetbg : vsetbg imagefile [filltype] : Load image as background",
11423 __FILE__,VSetBg,group);
11424 theCommands.Add("vsetbgmode",
11425 "vsetbgmode : vsetbgmode filltype : Change background image fill type",
11426 __FILE__,VSetBgMode,group);
11427 theCommands.Add("vsetgradientbg",
11428 "vsetgradientbg : vsetgradientbg r1 g1 b1 r2 g2 b2 filltype : Mount gradient background",
11429 __FILE__,VSetGradientBg,group);
11430 theCommands.Add("vsetgrbgmode",
11431 "vsetgrbgmode : vsetgrbgmode filltype : Change gradient background fill type",
11432 __FILE__,VSetGradientBgMode,group);
11433 theCommands.Add("vsetcolorbg",
11434 "vsetcolorbg : vsetcolorbg r g b : Set background color",
11435 __FILE__,VSetColorBg,group);
11436 theCommands.Add("vsetdefaultbg",
11437 "vsetdefaultbg r g b\n"
11438 "\n\t\t: vsetdefaultbg r1 g1 b1 r2 g2 b2 fillmode"
11439 "\n\t\t: Set default viewer background fill color (flat/gradient).",
11440 __FILE__,VSetDefaultBg,group);
11441 theCommands.Add("vscale",
11442 "vscale : vscale X Y Z",
11443 __FILE__,VScale,group);
11444 theCommands.Add("vzbufftrihedron",
11445 "vzbufftrihedron [{-on|-off}=-on] [-type {wireframe|zbuffer}=zbuffer]"
11446 "\n\t\t: [-position center|left_lower|left_upper|right_lower|right_upper]"
11447 "\n\t\t: [-scale value=0.1] [-size value=0.8] [-arrowDiam value=0.05]"
11448 "\n\t\t: [-colorArrowX color=RED] [-colorArrowY color=GREEN] [-colorArrowZ color=BLUE]"
11449 "\n\t\t: [-nbfacets value=12] [-colorLabels color=WHITE]"
11450 "\n\t\t: Displays a trihedron",
11451 __FILE__,VZBuffTrihedron,group);
11452 theCommands.Add("vrotate",
11453 "vrotate [[-mouseStart X Y] [-mouseMove X Y]]|[AX AY AZ [X Y Z]]"
11454 "\n : Option -mouseStart starts rotation according to the mouse position"
11455 "\n : Option -mouseMove continues rotation with angle computed"
11456 "\n : from last and new mouse position."
11457 "\n : vrotate AX AY AZ [X Y Z]",
11458 __FILE__,VRotate,group);
11459 theCommands.Add("vzoom",
11460 "vzoom : vzoom coef",
11461 __FILE__,VZoom,group);
11462 theCommands.Add("vpan",
11463 "vpan : vpan dx dy",
11464 __FILE__,VPan,group);
11465 theCommands.Add("vexport",
11466 "vexport : vexport full_file_path {PS | EPS | TEX | PDF | SVG | PGF | EMF }"
11467 " : exports the view to a vector file of a given format"
11468 " : notice that EMF format requires patched gl2ps",
11469 __FILE__,VExport,group);
11470 theCommands.Add("vcolorscale",
11471 "vcolorscale name [-noupdate|-update] [-demo]"
11472 "\n\t\t: [-range RangeMin=0 RangeMax=1 NbIntervals=10]"
11473 "\n\t\t: [-font HeightFont=20]"
11474 "\n\t\t: [-logarithmic {on|off}=off] [-reversed {on|off}=off]"
11475 "\n\t\t: [-smoothTransition {on|off}=off]"
11476 "\n\t\t: [-hueRange MinAngle=230 MaxAngle=0]"
11477 "\n\t\t: [-colorRange MinColor=BLUE1 MaxColor=RED]"
11478 "\n\t\t: [-textpos {left|right|center|none}=right]"
11479 "\n\t\t: [-labelAtBorder {on|off}=on]"
11480 "\n\t\t: [-colors Color1 Color2 ...] [-color Index Color]"
11481 "\n\t\t: [-labels Label1 Label2 ...] [-label Index Label]"
11482 "\n\t\t: [-freeLabels NbOfLabels Label1 Label2 ...]"
11483 "\n\t\t: [-xy Left=0 Bottom=0]"
11484 "\n\t\t: -demo - displays a color scale with demonstratio values"
11485 "\n\t\t: -colors - set colors for all intervals"
11486 "\n\t\t: -color - set color for specific interval"
11487 "\n\t\t: -textpos - horizontal label position relative to color scale bar"
11488 "\n\t\t: -labelAtBorder - vertical label position relative to color interval;"
11489 "\n\t\t: at border means the value inbetween neighbor intervals,"
11490 "\n\t\t: at center means the center value within current interval"
11491 "\n\t\t: -labels - set labels for all intervals"
11492 "\n\t\t: -freeLabels - same as -labels but does not require"
11493 "\n\t\t: matching the number of intervals"
11494 "\n\t\t: -label - set label for specific interval"
11495 "\n\t\t: -title - set title"
11496 "\n\t\t: -reversed - setup smooth color transition between intervals"
11497 "\n\t\t: -smoothTransition - swap colorscale direction"
11498 "\n\t\t: -hueRange - set hue angles corresponding to minimum and maximum values"
11499 __FILE__, VColorScale, group);
11500 theCommands.Add("vgraduatedtrihedron",
11501 "vgraduatedtrihedron : -on/-off [-xname Name] [-yname Name] [-zname Name] [-arrowlength Value]\n"
11502 "\t[-namefont Name] [-valuesfont Name]\n"
11503 "\t[-xdrawname on/off] [-ydrawname on/off] [-zdrawname on/off]\n"
11504 "\t[-xnameoffset IntVal] [-ynameoffset IntVal] [-znameoffset IntVal]"
11505 "\t[-xnamecolor Color] [-ynamecolor Color] [-znamecolor Color]\n"
11506 "\t[-xdrawvalues on/off] [-ydrawvalues on/off] [-zdrawvalues on/off]\n"
11507 "\t[-xvaluesoffset IntVal] [-yvaluesoffset IntVal] [-zvaluesoffset IntVal]"
11508 "\t[-xcolor Color] [-ycolor Color] [-zcolor Color]\n"
11509 "\t[-xdrawticks on/off] [-ydrawticks on/off] [-zdrawticks on/off]\n"
11510 "\t[-xticks Number] [-yticks Number] [-zticks Number]\n"
11511 "\t[-xticklength IntVal] [-yticklength IntVal] [-zticklength IntVal]\n"
11512 "\t[-drawgrid on/off] [-drawaxes on/off]\n"
11513 " - Displays or erases graduated trihedron"
11514 " - xname, yname, zname - names of axes, default: X, Y, Z\n"
11515 " - namefont - font of axes names. Default: Arial\n"
11516 " - xnameoffset, ynameoffset, znameoffset - offset of name from values or tickmarks or axis. Default: 30\n"
11517 " - xnamecolor, ynamecolor, znamecolor - colors of axes names\n"
11518 " - xvaluesoffset, yvaluesoffset, zvaluesoffset - offset of values from tickmarks or axis. Default: 10\n"
11519 " - valuesfont - font of axes values. Default: Arial\n"
11520 " - xcolor, ycolor, zcolor - color of axis and values\n"
11521 " - xticks, yticks, xzicks - number of tickmark on axes. Default: 5\n"
11522 " - xticklength, yticklength, xzicklength - length of tickmark on axes. Default: 10\n",
11523 __FILE__,VGraduatedTrihedron,group);
11524 theCommands.Add("vtile" ,
11525 "vtile [-totalSize W H] [-lowerLeft X Y] [-upperLeft X Y] [-tileSize W H]"
11526 "\n\t\t: Setup view to draw a tile (a part of virtual bigger viewport)."
11527 "\n\t\t: -totalSize the size of virtual bigger viewport"
11528 "\n\t\t: -tileSize tile size (the view size will be used if omitted)"
11529 "\n\t\t: -lowerLeft tile offset as lower left corner"
11530 "\n\t\t: -upperLeft tile offset as upper left corner",
11531 __FILE__, VTile, group);
11532 theCommands.Add("vzlayer",
11533 "vzlayer [layerId]"
11534 "\n\t\t: [-add|-delete|-get|-settings]"
11535 "\n\t\t: [-enable|-disable {depthTest|depthWrite|depthClear|depthoffset}]"
11536 "\n\t\t: [-enable|-disable {positiveOffset|negativeOffset|textureenv}]"
11537 "\n\t\t: ZLayer list management:"
11538 "\n\t\t: -add add new z layer to viewer and print its id"
11539 "\n\t\t: -delete delete z layer"
11540 "\n\t\t: -get print sequence of z layers"
11541 "\n\t\t: -settings print status of z layer settings"
11542 "\n\t\t: -disable disables given setting"
11543 "\n\t\t: -enable enables given setting",
11544 __FILE__,VZLayer,group);
11545 theCommands.Add("vlayerline",
11546 "vlayerline : vlayerline x1 y1 x2 y2 [linewidth=0.5] [linetype=0] [transparency=1.0]",
11547 __FILE__,VLayerLine,group);
11548 theCommands.Add ("vgrid",
11549 "vgrid [off] [Mode={r|c}] [Type={l|p}] [OriginX OriginY [StepX/StepRadius StepY/DivNb RotAngle]]"
11550 " : Mode - rectangular or circular"
11551 " : Type - lines or points",
11552 __FILE__, VGrid, group);
11553 theCommands.Add ("vpriviledgedplane",
11554 "vpriviledgedplane [Ox Oy Oz Nx Ny Nz [Xx Xy Xz]]"
11555 "\n\t\t: Ox, Oy, Oz - plane origin"
11556 "\n\t\t: Nx, Ny, Nz - plane normal direction"
11557 "\n\t\t: Xx, Xy, Xz - plane x-reference axis direction"
11558 "\n\t\t: Sets or prints viewer's priviledged plane geometry.",
11559 __FILE__, VPriviledgedPlane, group);
11560 theCommands.Add ("vconvert",
11561 "vconvert v [Mode={window|view}]"
11562 "\n\t\t: vconvert x y [Mode={window|view|grid|ray}]"
11563 "\n\t\t: vconvert x y z [Mode={window|grid}]"
11564 "\n\t\t: window - convert to window coordinates, pixels"
11565 "\n\t\t: view - convert to view projection plane"
11566 "\n\t\t: grid - convert to model coordinates, given on grid"
11567 "\n\t\t: ray - convert projection ray to model coordiantes"
11568 "\n\t\t: - vconvert v window : convert view to window;"
11569 "\n\t\t: - vconvert v view : convert window to view;"
11570 "\n\t\t: - vconvert x y window : convert view to window;"
11571 "\n\t\t: - vconvert x y view : convert window to view;"
11572 "\n\t\t: - vconvert x y : convert window to model;"
11573 "\n\t\t: - vconvert x y grid : convert window to model using grid;"
11574 "\n\t\t: - vconvert x y ray : convert window projection line to model;"
11575 "\n\t\t: - vconvert x y z window : convert model to window;"
11576 "\n\t\t: - vconvert x y z grid : convert view to model using grid;"
11577 "\n\t\t: Converts the given coordinates to window/view/model space.",
11578 __FILE__, VConvert, group);
11579 theCommands.Add ("vfps",
11580 "vfps [framesNb=100] : estimate average frame rate for active view",
11581 __FILE__, VFps, group);
11582 theCommands.Add ("vgldebug",
11583 "vgldebug [-sync {0|1}] [-debug {0|1}] [-glslWarn {0|1}]"
11584 "\n\t\t: [-extraMsg {0|1}] [{0|1}]"
11585 "\n\t\t: Request debug GL context. Should be called BEFORE vinit."
11586 "\n\t\t: Debug context can be requested only on Windows"
11587 "\n\t\t: with GL_ARB_debug_output extension implemented by GL driver!"
11588 "\n\t\t: -sync - request synchronized debug GL context"
11589 "\n\t\t: -glslWarn - log GLSL compiler/linker warnings,"
11590 "\n\t\t: which are suppressed by default,"
11591 "\n\t\t: -extraMsg - log extra diagnostic messages from GL context,"
11592 "\n\t\t: which are suppressed by default",
11593 __FILE__, VGlDebug, group);
11594 theCommands.Add ("vvbo",
11595 "vvbo [{0|1}] : turn VBO usage On/Off; affects only newly displayed objects",
11596 __FILE__, VVbo, group);
11597 theCommands.Add ("vstereo",
11598 "vstereo [0|1] [-mode Mode] [-reverse {0|1}]"
11599 "\n\t\t: [-anaglyph Filter]"
11600 "\n\t\t: Control stereo output mode. Available modes for -mode:"
11601 "\n\t\t: quadBuffer - OpenGL QuadBuffer stereo,"
11602 "\n\t\t: requires driver support."
11603 "\n\t\t: Should be called BEFORE vinit!"
11604 "\n\t\t: anaglyph - Anaglyph glasses"
11605 "\n\t\t: rowInterlaced - row-interlaced display"
11606 "\n\t\t: columnInterlaced - column-interlaced display"
11607 "\n\t\t: chessBoard - chess-board output"
11608 "\n\t\t: sideBySide - horizontal pair"
11609 "\n\t\t: overUnder - vertical pair"
11610 "\n\t\t: Available Anaglyph filters for -anaglyph:"
11611 "\n\t\t: redCyan, redCyanSimple, yellowBlue, yellowBlueSimple,"
11612 "\n\t\t: greenMagentaSimple",
11613 __FILE__, VStereo, group);
11614 theCommands.Add ("vcaps",
11615 "vcaps [-vbo {0|1}] [-sprites {0|1}] [-ffp {0|1}]"
11616 "\n\t\t: [-compatibleProfile {0|1}]"
11617 "\n\t\t: [-vsync {0|1}] [-useWinBuffer {0|1}]"
11618 "\n\t\t: [-quadBuffer {0|1}] [-stereo {0|1}]"
11619 "\n\t\t: [-softMode {0|1}] [-noupdate|-update]"
11620 "\n\t\t: Modify particular graphic driver options:"
11621 "\n\t\t: FFP - use fixed-function pipeline instead of"
11622 "\n\t\t: built-in GLSL programs"
11623 "\n\t\t: (requires compatible profile)"
11624 "\n\t\t: VBO - use Vertex Buffer Object (copy vertex"
11625 "\n\t\t: arrays to GPU memory)"
11626 "\n\t\t: sprite - use textured sprites instead of bitmaps"
11627 "\n\t\t: vsync - switch VSync on or off"
11628 "\n\t\t: winBuffer - allow using window buffer for rendering"
11629 "\n\t\t: Context creation options:"
11630 "\n\t\t: softMode - software OpenGL implementation"
11631 "\n\t\t: compatibleProfile - backward-compatible profile"
11632 "\n\t\t: quadbuffer - QuadBuffer"
11633 "\n\t\t: Unlike vrenderparams, these parameters control alternative"
11634 "\n\t\t: rendering paths producing the same visual result when"
11635 "\n\t\t: possible."
11636 "\n\t\t: Command is intended for testing old hardware compatibility.",
11637 __FILE__, VCaps, group);
11638 theCommands.Add ("vmemgpu",
11639 "vmemgpu [f]: print system-dependent GPU memory information if available;"
11640 " with f option returns free memory in bytes",
11641 __FILE__, VMemGpu, group);
11642 theCommands.Add ("vreadpixel",
11643 "vreadpixel xPixel yPixel [{rgb|rgba|depth|hls|rgbf|rgbaf}=rgba] [name]"
11644 " : Read pixel value for active view",
11645 __FILE__, VReadPixel, group);
11646 theCommands.Add("diffimage",
11647 "diffimage imageFile1 imageFile2 [diffImageFile]"
11648 "\n\t\t: [-toleranceOfColor {0..1}=0] [-blackWhite {on|off}=off] [-borderFilter {on|off}=off]"
11649 "\n\t\t: [-display viewName prsName1 prsName2 prsNameDiff] [-exitOnClose] [-closeOnEscape]"
11650 "\n\t\t: Compare two images by content and generate difference image."
11651 "\n\t\t: When -exitOnClose is specified, closing the view will exit application."
11652 "\n\t\t: When -closeOnEscape is specified, view will be closed on pressing Escape.",
11653 __FILE__, VDiffImage, group);
11654 theCommands.Add ("vselect",
11655 "vselect x1 y1 [x2 y2 [x3 y3 ... xn yn]] [-allowoverlap 0|1] [shift_selection = 0|1]\n"
11656 "- emulates different types of selection:\n"
11657 "- 1) single click selection\n"
11658 "- 2) selection with rectangle having corners at pixel positions (x1,y1) and (x2,y2)\n"
11659 "- 3) selection with polygon having corners in pixel positions (x1,y1), (x2,y2),...,(xn,yn)\n"
11660 "- 4) -allowoverlap manages overlap and inclusion detection in rectangular selection.\n"
11661 " If the flag is set to 1, both sensitives that were included completely and overlapped partially by defined rectangle will be detected,\n"
11662 " otherwise algorithm will chose only fully included sensitives. Default behavior is to detect only full inclusion. "
11663 " (partial inclusion - overlap - is not allowed by default)\n"
11664 "- 5) any of these selections with shift button pressed",
11665 __FILE__, VSelect, group);
11666 theCommands.Add ("vmoveto",
11668 "- emulates cursor movement to pixel postion (x,y)",
11669 __FILE__, VMoveTo, group);
11670 theCommands.Add ("vviewparams",
11671 "vviewparams [-args] [-scale [s]]"
11672 "\n\t\t: [-eye [x y z]] [-at [x y z]] [-up [x y z]]"
11673 "\n\t\t: [-proj [x y z]] [-center x y] [-size sx]"
11674 "\n\t\t: Manage current view parameters or prints all"
11675 "\n\t\t: current values when called without argument."
11676 "\n\t\t: -scale [s] prints or sets viewport relative scale"
11677 "\n\t\t: -eye [x y z] prints or sets eye location"
11678 "\n\t\t: -at [x y z] prints or sets center of look"
11679 "\n\t\t: -up [x y z] prints or sets direction of up vector"
11680 "\n\t\t: -proj [x y z] prints or sets direction of look"
11681 "\n\t\t: -center x y sets location of center of the screen in pixels"
11682 "\n\t\t: -size [sx] prints viewport projection width and height sizes"
11683 "\n\t\t: or changes the size of its maximum dimension"
11684 "\n\t\t: -args prints vviewparams arguments for restoring current view",
11685 __FILE__, VViewParams, group);
11687 theCommands.Add("vanimation", "Alias for vanim",
11688 __FILE__, VAnimation, group);
11690 theCommands.Add("vanim",
11691 "List existing animations:"
11693 "\n\t\t: Animation playback:"
11694 "\n\t\t: vanim name -play|-resume [playFrom [playDuration]]"
11695 "\n\t\t: [-speed Coeff] [-freeLook] [-lockLoop]"
11696 "\n\t\t: -speed playback speed (1.0 is normal speed)"
11697 "\n\t\t: -freeLook skip camera animations"
11698 "\n\t\t: -lockLoop disable any interactions"
11700 "\n\t\t: Animation definition:"
11701 "\n\t\t: vanim Name/sub/name [-clear] [-delete]"
11702 "\n\t\t: [start TimeSec] [duration TimeSec]"
11704 "\n\t\t: Animation name defined in path-style (anim/name or anim.name)"
11705 "\n\t\t: specifies nested animations."
11706 "\n\t\t: There is no syntax to explicitly add new animation,"
11707 "\n\t\t: and all non-existing animations within the name will be"
11708 "\n\t\t: implicitly created on first use (including parents)."
11710 "\n\t\t: Each animation might define the SINGLE action (see below),"
11711 "\n\t\t: like camera transition, object transformation or custom callback."
11712 "\n\t\t: Child animations can be used for defining concurrent actions."
11714 "\n\t\t: Camera animation:"
11715 "\n\t\t: vanim name -view [-eye1 X Y Z] [-eye2 X Y Z]"
11716 "\n\t\t: [-at1 X Y Z] [-at2 X Y Z]"
11717 "\n\t\t: [-up1 X Y Z] [-up2 X Y Z]"
11718 "\n\t\t: [-scale1 Scale] [-scale2 Scale]"
11719 "\n\t\t: -eyeX camera Eye positions pair (start and end)"
11720 "\n\t\t: -atX camera Center positions pair"
11721 "\n\t\t: -upX camera Up directions pair"
11722 "\n\t\t: -scaleX camera Scale factors pair"
11723 "\n\t\t: Object animation:"
11724 "\n\t\t: vanim name -object [-loc1 X Y Z] [-loc2 X Y Z]"
11725 "\n\t\t: [-rot1 QX QY QZ QW] [-rot2 QX QY QZ QW]"
11726 "\n\t\t: [-scale1 Scale] [-scale2 Scale]"
11727 "\n\t\t: -locX object Location points pair (translation)"
11728 "\n\t\t: -rotX object Orientations pair (quaternions)"
11729 "\n\t\t: -scaleX object Scale factors pair (quaternions)"
11730 "\n\t\t: Custom callback:"
11731 "\n\t\t: vanim name -invoke \"Command Arg1 Arg2 %Pts %LocalPts %Normalized ArgN\""
11732 "\n\t\t: %Pts overall animation presentation timestamp"
11733 "\n\t\t: %LocalPts local animation timestamp"
11734 "\n\t\t: %Normalized local animation normalized value in range 0..1"
11736 "\n\t\t: Video recording:"
11737 "\n\t\t: vanim name -record FileName [Width Height] [-fps FrameRate=24]"
11738 "\n\t\t: [-format Format] [-vcodec Codec] [-pix_fmt PixelFormat]"
11739 "\n\t\t: [-crf Value] [-preset Preset]"
11740 "\n\t\t: -fps video framerate"
11741 "\n\t\t: -format file format, container (matroska, etc.)"
11742 "\n\t\t: -vcodec video codec identifier (ffv1, mjpeg, etc.)"
11743 "\n\t\t: -pix_fmt image pixel format (yuv420p, rgb24, etc.)"
11744 "\n\t\t: -crf constant rate factor (specific to codec)"
11745 "\n\t\t: -preset codec parameters preset (specific to codec)"
11746 __FILE__, VAnimation, group);
11748 theCommands.Add("vchangeselected",
11749 "vchangeselected shape"
11750 "- adds to shape to selection or remove one from it",
11751 __FILE__, VChangeSelected, group);
11752 theCommands.Add ("vnbselected",
11754 "\n\t\t: Returns number of selected objects", __FILE__, VNbSelected, group);
11755 theCommands.Add ("vcamera",
11756 "vcamera [-ortho] [-projtype]"
11758 "\n\t\t: [-fovy [Angle]] [-distance [Distance]]"
11759 "\n\t\t: [-stereo] [-leftEye] [-rightEye]"
11760 "\n\t\t: [-iod [Distance]] [-iodType [absolute|relative]]"
11761 "\n\t\t: [-zfocus [Value]] [-zfocusType [absolute|relative]]"
11762 "\n\t\t: Manage camera parameters."
11763 "\n\t\t: Prints current value when option called without argument."
11764 "\n\t\t: Orthographic camera:"
11765 "\n\t\t: -ortho activate orthographic projection"
11766 "\n\t\t: Perspective camera:"
11767 "\n\t\t: -persp activate perspective projection (mono)"
11768 "\n\t\t: -fovy field of view in y axis, in degrees"
11769 "\n\t\t: -distance distance of eye from camera center"
11770 "\n\t\t: Stereoscopic camera:"
11771 "\n\t\t: -stereo perspective projection (stereo)"
11772 "\n\t\t: -leftEye perspective projection (left eye)"
11773 "\n\t\t: -rightEye perspective projection (right eye)"
11774 "\n\t\t: -iod intraocular distance value"
11775 "\n\t\t: -iodType distance type, absolute or relative"
11776 "\n\t\t: -zfocus stereographic focus value"
11777 "\n\t\t: -zfocusType focus type, absolute or relative",
11778 __FILE__, VCamera, group);
11779 theCommands.Add ("vautozfit", "command to enable or disable automatic z-range adjusting\n"
11780 "- vautozfit [on={1|0}] [scale]\n"
11781 " Prints or changes parameters of automatic z-fit mode:\n"
11782 " \"on\" - turns automatic z-fit on or off\n"
11783 " \"scale\" - specifies factor to scale computed z range.\n",
11784 __FILE__, VAutoZFit, group);
11785 theCommands.Add ("vzrange", "command to manually access znear and zfar values\n"
11786 " vzrange - without parameters shows current values\n"
11787 " vzrange [znear] [zfar] - applies provided values to view",
11788 __FILE__,VZRange, group);
11789 theCommands.Add ("vpurgedisplay",
11791 "- removes structures which don't belong to objects displayed in neutral point",
11792 __FILE__, VPurgeDisplay, group);
11793 theCommands.Add("vsetviewsize",
11794 "vsetviewsize size",
11795 __FILE__,VSetViewSize,group);
11796 theCommands.Add("vmoveview",
11797 "vmoveview Dx Dy Dz [Start = 1|0]",
11798 __FILE__,VMoveView,group);
11799 theCommands.Add("vtranslateview",
11800 "vtranslateview Dx Dy Dz [Start = 1|0)]",
11801 __FILE__,VTranslateView,group);
11802 theCommands.Add("vturnview",
11803 "vturnview Ax Ay Az [Start = 1|0]",
11804 __FILE__,VTurnView,group);
11805 theCommands.Add("vtextureenv",
11806 "Enables or disables environment mapping in the 3D view, loading the texture from the given standard "
11807 "or user-defined file and optionally applying texture mapping parameters\n"
11809 " vtextureenv off - disables environment mapping\n"
11810 " vtextureenv on {std_texture|texture_file_name} [rep mod flt ss st ts tt rot] - enables environment mapping\n"
11811 " std_texture = (0..7)\n"
11812 " rep = {clamp|repeat}\n"
11813 " mod = {decal|modulate}\n"
11814 " flt = {nearest|bilinear|trilinear}\n"
11815 " ss, st - scale factors for s and t texture coordinates\n"
11816 " ts, tt - translation for s and t texture coordinates\n"
11817 " rot - texture rotation angle in degrees",
11818 __FILE__, VTextureEnv, group);
11819 theCommands.Add("vhlr",
11820 "vhlr {on|off} [-showHidden={1|0}] [-algoType={algo|polyAlgo}] [-noupdate]"
11821 "\n\t\t: Hidden Line Removal algorithm."
11822 "\n\t\t: -showHidden if set ON, hidden lines are drawn as dotted ones"
11823 "\n\t\t: -algoType type of HLR algorithm.\n",
11824 __FILE__,VHLR,group);
11825 theCommands.Add("vhlrtype",
11826 "vhlrtype {algo|polyAlgo} [shape_1 ... shape_n] [-noupdate]"
11827 "\n\t\t: Changes the type of HLR algorithm using for shapes:"
11828 "\n\t\t: 'algo' - exact HLR algorithm is applied"
11829 "\n\t\t: 'polyAlgo' - polygonal HLR algorithm is applied"
11830 "\n\t\t: If shapes are not given - option is applied to all shapes in the view",
11831 __FILE__,VHLRType,group);
11832 theCommands.Add("vclipplane",
11833 "vclipplane planeName [{0|1}]"
11834 "\n\t\t: [-equation A B C D]"
11835 "\n\t\t: [-set|-unset [objects|views]]"
11836 "\n\t\t: [-maxPlanes]"
11837 "\n\t\t: [-capping {0|1}]"
11838 "\n\t\t: [-color R G B] [-hatch {on|off|ID}]"
11839 "\n\t\t: [-texName Texture] [-texScale SX SY] [-texOrigin TX TY]"
11840 "\n\t\t: [-texRotate Angle]"
11841 "\n\t\t: [-useObjMaterial {0|1}] [-useObjTexture {0|1}]"
11842 "\n\t\t: [-useObjShader {0|1}]"
11843 "\n\t\t: Clipping planes management:"
11844 "\n\t\t: -maxPlanes print plane limit for view"
11845 "\n\t\t: -delete delete plane with given name"
11846 "\n\t\t: {off|on|0|1} turn clipping on/off"
11847 "\n\t\t: -set|-unset set/unset plane for Object or View list;"
11848 "\n\t\t: applied to active View when list is omitted"
11849 "\n\t\t: -equation A B C D change plane equation"
11850 "\n\t\t: -clone SourcePlane NewPlane clone the plane definition."
11851 "\n\t\t: Capping options:"
11852 "\n\t\t: -capping {off|on|0|1} turn capping on/off"
11853 "\n\t\t: -color R G B set capping color"
11854 "\n\t\t: -texName Texture set capping texture"
11855 "\n\t\t: -texScale SX SY set capping tex scale"
11856 "\n\t\t: -texOrigin TX TY set capping tex origin"
11857 "\n\t\t: -texRotate Angle set capping tex rotation"
11858 "\n\t\t: -hatch {on|off|ID} set capping hatching mask"
11859 "\n\t\t: -useObjMaterial {off|on|0|1} use material of clipped object"
11860 "\n\t\t: -useObjTexture {off|on|0|1} use texture of clipped object"
11861 "\n\t\t: -useObjShader {off|on|0|1} use shader program of object",
11862 __FILE__, VClipPlane, group);
11863 theCommands.Add("vdefaults",
11864 "vdefaults [-absDefl value]"
11865 "\n\t\t: [-devCoeff value]"
11866 "\n\t\t: [-angDefl value]"
11867 "\n\t\t: [-autoTriang {off/on | 0/1}]"
11868 , __FILE__, VDefaults, group);
11869 theCommands.Add("vlight",
11870 "tool to manage light sources, without arguments shows list of lights."
11871 "\n Main commands: "
11872 "\n 'clear' to clear lights"
11873 "\n '{def}aults' to load deafault lights"
11874 "\n 'add' (or 'new') <type> to add any light source"
11875 "\n where <type> is one of {amb}ient|directional|{spot}light|positional"
11876 "\n 'change' <lightId> to edit light source with specified lightId"
11877 "\n\n In addition to 'add' and 'change' commands you can use light parameters:"
11878 "\n {pos}ition X Y Z"
11879 "\n {dir}ection X Y Z (for directional light or for spotlight)"
11880 "\n color colorName"
11881 "\n {head}light 0|1"
11882 "\n {sm}oothness value"
11883 "\n {int}ensity value"
11884 "\n {constAtten}uation value"
11885 "\n {linearAtten}uation value"
11886 "\n angle angleDeg"
11887 "\n {spotexp}onent value"
11889 "\n\n example: vlight add positional head 1 pos 0 1 1 color red"
11890 "\n example: vlight change 0 direction 0 -1 0 linearAttenuation 0.2",
11891 __FILE__, VLight, group);
11892 theCommands.Add("vraytrace",
11894 "\n\t\t: Turns on/off ray-tracing renderer."
11895 "\n\t\t: 'vraytrace 0' alias for 'vrenderparams -raster'."
11896 "\n\t\t: 'vraytrace 1' alias for 'vrenderparams -rayTrace'.",
11897 __FILE__, VRenderParams, group);
11898 theCommands.Add("vrenderparams",
11899 "\n Manages rendering parameters: "
11900 "\n '-raster' Disables GPU ray-tracing"
11901 "\n '-msaa 0..4' Specifies number of samples for MSAA"
11902 "\n '-oit off|0.0-1.0' Enables/disables OIT and sets depth weight factor"
11903 "\n '-rendScale value Rendering resolution scale factor"
11904 "\n '-rayTrace' Enables GPU ray-tracing"
11905 "\n '-rayDepth 0..10' Defines maximum ray-tracing depth"
11906 "\n '-shadows on|off' Enables/disables shadows rendering"
11907 "\n '-reflections on|off' Enables/disables specular reflections"
11908 "\n '-fsaa on|off' Enables/disables adaptive anti-aliasing"
11909 "\n '-gleam on|off' Enables/disables transparency shadow effects"
11910 "\n '-gi on|off' Enables/disables global illumination effects"
11911 "\n '-brng on|off' Enables/disables blocked RNG (fast coherent PT)"
11912 "\n '-env on|off' Enables/disables environment map background"
11913 "\n '-twoside on|off' Enables/disables two-sided BSDF models (PT mode)"
11914 "\n '-iss on|off' Enables/disables adaptive screen sampling (PT mode)"
11915 "\n '-issd on|off' Shows screen sampling distribution in ISS mode"
11916 "\n '-maxrad > 0.0' Value used for clamping radiance estimation (PT mode)"
11917 "\n '-nbtiles 64..1024' Specifies number of screen tiles in ISS mode"
11918 "\n '-rebuildGlsl on|off' Rebuild Ray-Tracing GLSL programs (for debugging)"
11919 "\n '-shadingModel model' Controls shading model from enumeration"
11920 "\n color, flat, gouraud, phong"
11921 "\n '-resolution value' Sets a new pixels density (PPI), defines scaling factor for parameters like text size"
11922 "\n '-aperture >= 0.0' Aperture size of perspective camera for depth-of-field effect (0 disables DOF)"
11923 "\n '-focal >= 0.0' Focal distance of perspective camera for depth-of-field effect"
11924 "\n '-exposure value' Exposure value for tone mapping (0.0 value disables the effect)"
11925 "\n '-whitepoint value' White point value for filmic tone mapping"
11926 "\n '-tonemapping mode' Tone mapping mode (disabled, filmic)"
11927 "\n Unlike vcaps, these parameters dramatically change visual properties."
11928 "\n Command is intended to control presentation quality depending on"
11929 "\n hardware capabilities and performance.",
11930 __FILE__, VRenderParams, group);
11931 theCommands.Add("vfrustumculling",
11932 "vfrustumculling [toEnable]: enables/disables objects clipping",
11933 __FILE__,VFrustumCulling,group);
11934 theCommands.Add("vhighlightselected",
11935 "vhighlightselected [0|1] or vhighlightselected [on|off]: enables/disables highlighting of selected objects.\n"
11936 "Without arguments it shows if highlighting of selected objects is enabled now.",
11937 __FILE__,VHighlightSelected,group);
11938 theCommands.Add ("vplace",
11940 "\n\t\t: Places the point (in pixels) at the center of the window",
11941 __FILE__, VPlace, group);
11942 theCommands.Add("vxrotate",
11944 __FILE__,VXRotate,group);
11946 theCommands.Add("vmanipulator",
11947 "\n vmanipulator Name [-attach AISObject | -detach | ...]"
11948 "\n tool to create and manage AIS manipulators."
11950 "\n '-attach AISObject' attach manipulator to AISObject"
11951 "\n '-adjustPosition {0|1}' adjust position when attaching"
11952 "\n '-adjustSize {0|1}' adjust size when attaching"
11953 "\n '-enableModes {0|1}' enable modes when attaching"
11954 "\n '-detach' detach manipulator"
11955 "\n '-startTransform mouse_x mouse_y' - invoke start of transformation"
11956 "\n '-transform mouse_x mouse_y' - invoke transformation"
11957 "\n '-stopTransform [abort]' - invoke stop of transformation"
11958 "\n '-move x y z' - move attached object"
11959 "\n '-rotate x y z dx dy dz angle' - rotate attached object"
11960 "\n '-scale factor' - scale attached object"
11961 "\n '-autoActivate {0|1}' - set activation on detection"
11962 "\n '-followTranslation {0|1}' - set following translation transform"
11963 "\n '-followRotation {0|1}' - set following rotation transform"
11964 "\n '-gap value' - set gap between sub-parts"
11965 "\n '-part axis mode {0|1}' - set visual part"
11966 "\n '-pos x y z [nx ny nz [xx xy xz]' - set position of manipulator"
11967 "\n '-size value' - set size of manipulator"
11968 "\n '-zoomable {0|1}' - set zoom persistence",
11969 __FILE__, VManipulator, group);
11971 theCommands.Add("vselprops",
11972 "\n vselprops [dynHighlight|localDynHighlight|selHighlight|localSelHighlight] [options]"
11973 "\n Customizes selection and dynamic highlight parameters for the whole interactive context:"
11974 "\n -autoActivate {0|1} : disables|enables default computation and activation of global selection mode"
11975 "\n -pickStrategy {first|topmost} : defines picking strategy"
11976 "\n 'first' to pick first acceptable (default)"
11977 "\n 'topmost' to pick only topmost (and nothing, if topmost is rejected by filters)"
11978 "\n -pixTol value : sets up pixel tolerance"
11979 "\n -dispMode dispMode : sets display mode for highlighting"
11980 "\n -layer ZLayer : sets ZLayer for highlighting"
11981 "\n -color {name|r g b} : sets highlight color"
11982 "\n -transp value : sets transparency coefficient for highlight"
11983 "\n -material material : sets highlight material"
11984 "\n -print : prints current state of all mentioned parameters",
11985 __FILE__, VSelectionProperties, group);
11987 theCommands.Add ("vseldump",
11988 "vseldump file -type {depth|unnormDepth|object|owner|selMode|entity}=depth -pickedIndex Index=1"
11989 "\n\t\t: Generate an image based on detection results:"
11990 "\n\t\t: depth normalized depth values"
11991 "\n\t\t: unnormDepth unnormalized depth values"
11992 "\n\t\t: object color of detected object"
11993 "\n\t\t: owner color of detected owner"
11994 "\n\t\t: selMode color of selection mode"
11995 "\n\t\t: entity color of etected entity",
11996 __FILE__, VDumpSelectionImage, group);
11998 #if defined(_WIN32)
11999 theCommands.Add("vprogressive",
12001 __FILE__, VProgressiveMode, group);