1 // Created on: 1997-07-23
2 // Created by: Henri JEANNIN
3 // Copyright (c) 1997-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 // Modified by Eric Gouthiere [sep-oct 98] -> add commands for display...
18 // Modified by Robert Coublanc [nov 16-17-18 1998]
19 // -split ViewerTest.cxx into 3 files : ViewerTest.cxx,
20 // ViewerTest_ObjectCommands.cxx
21 // ViewerTest_RelationCommands.cxx
22 // -add Functions and commands for interactive selection of shapes and objects
23 // in AIS Viewers. (PickShape(s), PickObject(s),
25 #include <Standard_Stream.hxx>
27 #include <ViewerTest.hxx>
28 #include <ViewerTest_CmdParser.hxx>
30 #include <TopLoc_Location.hxx>
31 #include <TopTools_HArray1OfShape.hxx>
32 #include <TColStd_HArray1OfTransient.hxx>
33 #include <TColStd_SequenceOfAsciiString.hxx>
34 #include <TColStd_HSequenceOfAsciiString.hxx>
35 #include <TColStd_MapOfTransient.hxx>
36 #include <OSD_Timer.hxx>
37 #include <Geom_Axis2Placement.hxx>
38 #include <Geom_Axis1Placement.hxx>
39 #include <gp_Trsf.hxx>
40 #include <TopExp_Explorer.hxx>
41 #include <BRepAdaptor_Curve.hxx>
42 #include <StdSelect_ShapeTypeFilter.hxx>
44 #include <AIS_ColoredShape.hxx>
45 #include <AIS_InteractiveObject.hxx>
46 #include <AIS_Trihedron.hxx>
47 #include <AIS_Axis.hxx>
48 #include <AIS_Relation.hxx>
49 #include <AIS_TypeFilter.hxx>
50 #include <AIS_SignatureFilter.hxx>
51 #include <AIS_LocalContext.hxx>
52 #include <AIS_ListOfInteractive.hxx>
53 #include <AIS_ListIteratorOfListOfInteractive.hxx>
54 #include <Aspect_InteriorStyle.hxx>
55 #include <Aspect_Window.hxx>
56 #include <Graphic3d_AspectFillArea3d.hxx>
57 #include <Graphic3d_AspectLine3d.hxx>
58 #include <Graphic3d_CStructure.hxx>
59 #include <Graphic3d_TextureRoot.hxx>
60 #include <Image_AlienPixMap.hxx>
61 #include <Prs3d_Drawer.hxx>
62 #include <Prs3d_ShadingAspect.hxx>
63 #include <Prs3d_IsoAspect.hxx>
64 #include <Prs3d_PointAspect.hxx>
65 #include <Select3D_SensitiveWire.hxx>
66 #include <SelectMgr_EntityOwner.hxx>
67 #include <StdSelect_BRepOwner.hxx>
68 #include <StdSelect_ViewerSelector3d.hxx>
69 #include <TopTools_MapOfShape.hxx>
70 #include <ViewerTest_AutoUpdater.hxx>
74 #include <Draw_Interpretor.hxx>
75 #include <TCollection_AsciiString.hxx>
76 #include <Draw_PluginMacro.hxx>
78 // avoid warnings on 'extern "C"' functions returning C++ classes
80 #define _CRT_SECURE_NO_DEPRECATE
81 #pragma warning(4:4190)
82 #pragma warning (disable:4996)
85 extern int ViewerMainLoop(Standard_Integer argc, const char** argv);
87 #include <Quantity_Color.hxx>
88 #include <Quantity_NameOfColor.hxx>
90 #include <Graphic3d_NameOfMaterial.hxx>
92 #define DEFAULT_COLOR Quantity_NOC_GOLDENROD
93 #define DEFAULT_FREEBOUNDARY_COLOR Quantity_NOC_GREEN
94 #define DEFAULT_MATERIAL Graphic3d_NOM_BRASS
96 //=======================================================================
97 //function : GetColorFromName
98 //purpose : get the Quantity_NameOfColor from a string
99 //=======================================================================
101 Quantity_NameOfColor ViewerTest::GetColorFromName (const Standard_CString theName)
103 Quantity_NameOfColor aColor = DEFAULT_COLOR;
104 Quantity_Color::ColorFromName (theName, aColor);
108 //=======================================================================
109 //function : ParseColor
111 //=======================================================================
113 Standard_Integer ViewerTest::ParseColor (Standard_Integer theArgNb,
114 const char** theArgVec,
115 Quantity_Color& theColor)
117 Quantity_NameOfColor aColor = Quantity_NOC_BLACK;
119 && Quantity_Color::ColorFromName (theArgVec[0], aColor))
124 else if (theArgNb >= 3)
126 const TCollection_AsciiString anRgbStr[3] =
132 if (!anRgbStr[0].IsRealValue()
133 || !anRgbStr[1].IsRealValue()
134 || !anRgbStr[2].IsRealValue())
139 Graphic3d_Vec4d anRgb;
140 anRgb.x() = anRgbStr[0].RealValue();
141 anRgb.y() = anRgbStr[1].RealValue();
142 anRgb.z() = anRgbStr[2].RealValue();
143 if (anRgb.x() < 0.0 || anRgb.x() > 1.0
144 || anRgb.y() < 0.0 || anRgb.y() > 1.0
145 || anRgb.z() < 0.0 || anRgb.z() > 1.0)
147 std::cout << "Error: RGB color values should be within range 0..1!\n";
151 theColor.SetValues (anRgb.x(), anRgb.y(), anRgb.z(), Quantity_TOC_RGB);
158 //=======================================================================
159 //function : ParseOnOff
161 //=======================================================================
162 Standard_Boolean ViewerTest::ParseOnOff (Standard_CString theArg,
163 Standard_Boolean& theIsOn)
165 TCollection_AsciiString aFlag(theArg);
170 theIsOn = Standard_True;
171 return Standard_True;
173 else if (aFlag == "off"
176 theIsOn = Standard_False;
177 return Standard_True;
179 return Standard_False;
182 //=======================================================================
183 //function : GetTypeNames
185 //=======================================================================
186 static const char** GetTypeNames()
188 static const char* names[14] = {"Point","Axis","Trihedron","PlaneTrihedron", "Line","Circle","Plane",
189 "Shape","ConnectedShape","MultiConn.Shape",
190 "ConnectedInter.","MultiConn.",
191 "Constraint","Dimension"};
192 static const char** ThePointer = names;
196 //=======================================================================
197 //function : GetTypeAndSignfromString
199 //=======================================================================
200 void GetTypeAndSignfromString (const char* name,AIS_KindOfInteractive& TheType,Standard_Integer& TheSign)
202 const char ** thefullnames = GetTypeNames();
203 Standard_Integer index(-1);
205 for(Standard_Integer i=0;i<=13 && index==-1;i++)
206 if(!strcasecmp(name,thefullnames[i]))
210 TheType = AIS_KOI_None;
216 TheType = AIS_KOI_Datum;
220 TheType = AIS_KOI_Shape;
224 TheType = AIS_KOI_Object;
228 TheType = AIS_KOI_Relation;
237 #include <Draw_Interpretor.hxx>
239 #include <Draw_Appli.hxx>
243 #include <TCollection_AsciiString.hxx>
244 #include <V3d_Viewer.hxx>
245 #include <V3d_View.hxx>
248 #include <AIS_InteractiveContext.hxx>
249 #include <AIS_Shape.hxx>
250 #include <AIS_TexturedShape.hxx>
251 #include <AIS_DisplayMode.hxx>
252 #include <TColStd_MapOfInteger.hxx>
253 #include <AIS_MapOfInteractive.hxx>
254 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
255 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
256 #include <ViewerTest_EventManager.hxx>
258 #include <TopoDS_Solid.hxx>
259 #include <BRepTools.hxx>
260 #include <BRep_Builder.hxx>
261 #include <TopAbs_ShapeEnum.hxx>
263 #include <TopoDS.hxx>
264 #include <BRep_Tool.hxx>
267 #include <Draw_Window.hxx>
268 #include <AIS_ListIteratorOfListOfInteractive.hxx>
269 #include <AIS_ListOfInteractive.hxx>
270 #include <AIS_DisplayMode.hxx>
271 #include <TopTools_ListOfShape.hxx>
272 #include <BRepOffsetAPI_MakeThickSolid.hxx>
273 #include <BRepOffset.hxx>
275 //==============================================================================
276 // VIEWER OBJECT MANAGEMENT GLOBAL VARIABLES
277 //==============================================================================
278 Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS(){
279 static ViewerTest_DoubleMapOfInteractiveAndName TheMap;
283 //=======================================================================
286 //=======================================================================
287 Standard_Boolean ViewerTest::Display (const TCollection_AsciiString& theName,
288 const Handle(AIS_InteractiveObject)& theObject,
289 const Standard_Boolean theToUpdate,
290 const Standard_Boolean theReplaceIfExists)
292 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
293 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
296 std::cout << "Error: AIS context is not available.\n";
297 return Standard_False;
300 if (aMap.IsBound2 (theName))
302 if (!theReplaceIfExists)
304 std::cout << "Error: other interactive object has been already registered with name: " << theName << ".\n"
305 << "Please use another name.\n";
306 return Standard_False;
309 Handle(AIS_InteractiveObject) anOldObj = Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (theName));
310 if (!anOldObj.IsNull())
312 aCtx->Remove (anOldObj, Standard_True);
314 aMap.UnBind2 (theName);
317 if (theObject.IsNull())
319 // object with specified name has been already unbound
320 return Standard_True;
323 // unbind AIS object if it was bound with another name
324 aMap.UnBind1 (theObject);
326 // can be registered without rebinding
327 aMap.Bind (theObject, theName);
328 aCtx->Display (theObject, theToUpdate);
329 return Standard_True;
332 //! Alias for ViewerTest::Display(), compatibility with old code.
333 Standard_EXPORT Standard_Boolean VDisplayAISObject (const TCollection_AsciiString& theName,
334 const Handle(AIS_InteractiveObject)& theObject,
335 Standard_Boolean theReplaceIfExists = Standard_True)
337 return ViewerTest::Display (theName, theObject, Standard_True, theReplaceIfExists);
340 static TColStd_MapOfInteger theactivatedmodes(8);
341 static TColStd_ListOfTransient theEventMgrs;
343 static void VwrTst_InitEventMgr(const Handle(V3d_View)& aView,
344 const Handle(AIS_InteractiveContext)& Ctx)
346 theEventMgrs.Clear();
347 theEventMgrs.Prepend(new ViewerTest_EventManager(aView, Ctx));
350 static Handle(V3d_View)& a3DView()
352 static Handle(V3d_View) Viou;
357 Standard_EXPORT Handle(AIS_InteractiveContext)& TheAISContext(){
358 static Handle(AIS_InteractiveContext) aContext;
362 const Handle(V3d_View)& ViewerTest::CurrentView()
366 void ViewerTest::CurrentView(const Handle(V3d_View)& V)
371 const Handle(AIS_InteractiveContext)& ViewerTest::GetAISContext()
373 return TheAISContext();
376 void ViewerTest::SetAISContext (const Handle(AIS_InteractiveContext)& aCtx)
378 TheAISContext() = aCtx;
379 ViewerTest::ResetEventManager();
382 Handle(V3d_Viewer) ViewerTest::GetViewerFromContext()
384 return !TheAISContext().IsNull() ? TheAISContext()->CurrentViewer() : Handle(V3d_Viewer)();
387 Handle(V3d_Viewer) ViewerTest::GetCollectorFromContext()
389 return !TheAISContext().IsNull() ? TheAISContext()->CurrentViewer() : Handle(V3d_Viewer)();
393 void ViewerTest::SetEventManager(const Handle(ViewerTest_EventManager)& EM){
394 theEventMgrs.Prepend(EM);
397 void ViewerTest::UnsetEventManager()
399 theEventMgrs.RemoveFirst();
403 void ViewerTest::ResetEventManager()
405 const Handle(V3d_View) aView = ViewerTest::CurrentView();
406 VwrTst_InitEventMgr(aView, ViewerTest::GetAISContext());
409 Handle(ViewerTest_EventManager) ViewerTest::CurrentEventManager()
411 Handle(ViewerTest_EventManager) EM;
412 if(theEventMgrs.IsEmpty()) return EM;
413 Handle(Standard_Transient) Tr = theEventMgrs.First();
414 EM = Handle(ViewerTest_EventManager)::DownCast (Tr);
418 //=======================================================================
419 //function : Get Context and active view
421 //=======================================================================
422 static Standard_Boolean getCtxAndView (Handle(AIS_InteractiveContext)& theCtx,
423 Handle(V3d_View)& theView)
425 theCtx = ViewerTest::GetAISContext();
426 theView = ViewerTest::CurrentView();
430 std::cout << "Error: cannot find an active view!\n";
431 return Standard_False;
433 return Standard_True;
436 //==============================================================================
437 //function : GetShapeFromName
438 //purpose : Compute an Shape from a draw variable or a file name
439 //==============================================================================
441 static TopoDS_Shape GetShapeFromName(const char* name)
443 TopoDS_Shape S = DBRep::Get(name);
446 BRep_Builder aBuilder;
447 BRepTools::Read( S, name, aBuilder);
453 //==============================================================================
454 //function : GetAISShapeFromName
455 //purpose : Compute an AIS_Shape from a draw variable or a file name
456 //==============================================================================
457 Handle(AIS_Shape) GetAISShapeFromName(const char* name)
459 Handle(AIS_Shape) retsh;
461 if(GetMapOfAIS().IsBound2(name)){
462 const Handle(AIS_InteractiveObject) IO =
463 Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
465 if(IO->Type()==AIS_KOI_Shape) {
466 if(IO->Signature()==0){
467 retsh = Handle(AIS_Shape)::DownCast (IO);
470 cout << "an Object which is not an AIS_Shape "
471 "already has this name!!!"<<endl;
478 TopoDS_Shape S = GetShapeFromName(name);
480 retsh = new AIS_Shape(S);
486 //==============================================================================
488 //purpose : Remove all the object from the viewer
489 //==============================================================================
490 void ViewerTest::Clear()
492 if ( !a3DView().IsNull() ) {
493 if (TheAISContext()->HasOpenedContext())
494 TheAISContext()->CloseLocalContext();
495 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it(GetMapOfAIS());
496 while ( it.More() ) {
497 cout << "Remove " << it.Key2() << endl;
498 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (it.Key1());
499 TheAISContext()->Remove(anObj,Standard_False);
502 TheAISContext()->RebuildSelectionStructs();
503 TheAISContext()->UpdateCurrentViewer();
504 GetMapOfAIS().Clear();
508 //==============================================================================
509 //function : StandardModesActivation
510 //purpose : Activate a selection mode, vertex, edge, wire ..., in a local
512 //==============================================================================
513 void ViewerTest::StandardModeActivation(const Standard_Integer mode )
515 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
517 if (TheAISContext()->HasOpenedContext())
518 aContext->CloseLocalContext();
521 if(!aContext->HasOpenedContext()) {
522 // To unhilight the preselected object
523 aContext->UnhilightSelected(Standard_False);
524 // Open a local Context in order to be able to select subshape from
525 // the selected shape if any or for all if there is no selection
526 if (!aContext->FirstSelectedObject().IsNull()){
527 aContext->OpenLocalContext(Standard_False);
529 for(aContext->InitSelected();aContext->MoreSelected();aContext->NextSelected()){
530 aContext->Load( aContext->SelectedInteractive(),-1,Standard_True);
534 aContext->OpenLocalContext();
537 const char *cmode="???";
540 case 0: cmode = "Shape"; break;
541 case 1: cmode = "Vertex"; break;
542 case 2: cmode = "Edge"; break;
543 case 3: cmode = "Wire"; break;
544 case 4: cmode = "Face"; break;
545 case 5: cmode = "Shell"; break;
546 case 6: cmode = "Solid"; break;
547 case 7: cmode = "Compsolid"; break;
548 case 8: cmode = "Compound"; break;
551 if(theactivatedmodes.Contains(mode))
553 aContext->DeactivateStandardMode(AIS_Shape::SelectionType(mode));
554 theactivatedmodes.Remove(mode);
555 cout<<"Mode "<< cmode <<" OFF"<<endl;
559 aContext->ActivateStandardMode(AIS_Shape::SelectionType(mode));
560 theactivatedmodes.Add(mode);
561 cout<<"Mode "<< cmode << " ON" << endl;
566 //==============================================================================
567 //function : CopyIsoAspect
568 //purpose : Returns copy Prs3d_IsoAspect with new number of isolines.
569 //==============================================================================
570 static Handle(Prs3d_IsoAspect) CopyIsoAspect
571 (const Handle(Prs3d_IsoAspect) &theIsoAspect,
572 const Standard_Integer theNbIsos)
574 Quantity_Color aColor;
575 Aspect_TypeOfLine aType;
576 Standard_Real aWidth;
578 theIsoAspect->Aspect()->Values(aColor, aType, aWidth);
580 Handle(Prs3d_IsoAspect) aResult =
581 new Prs3d_IsoAspect(aColor, aType, aWidth, theNbIsos);
586 //==============================================================================
588 //purpose : Returns or sets the number of U- and V- isos and isIsoOnPlane flag
589 //Draw arg : [name1 ...] [nbUIsos nbVIsos IsoOnPlane(0|1)]
590 //==============================================================================
591 static int visos (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
593 if (TheAISContext().IsNull()) {
594 di << argv[0] << " Call 'vinit' before!\n";
599 di << "Current number of isos : " <<
600 TheAISContext()->IsoNumber(AIS_TOI_IsoU) << " " <<
601 TheAISContext()->IsoNumber(AIS_TOI_IsoV) << "\n";
602 di << "IsoOnPlane mode is " <<
603 (TheAISContext()->IsoOnPlane() ? "ON" : "OFF") << "\n";
604 di << "IsoOnTriangulation mode is " <<
605 (TheAISContext()->IsoOnTriangulation() ? "ON" : "OFF") << "\n";
609 Standard_Integer aLastInd = argc - 1;
610 Standard_Boolean isChanged = Standard_False;
611 Standard_Integer aNbUIsos = 0;
612 Standard_Integer aNbVIsos = 0;
615 Standard_Boolean isIsoOnPlane = Standard_False;
617 if (strcmp(argv[aLastInd], "1") == 0) {
618 isIsoOnPlane = Standard_True;
619 isChanged = Standard_True;
620 } else if (strcmp(argv[aLastInd], "0") == 0) {
621 isIsoOnPlane = Standard_False;
622 isChanged = Standard_True;
626 aNbVIsos = Draw::Atoi(argv[aLastInd - 1]);
627 aNbUIsos = Draw::Atoi(argv[aLastInd - 2]);
630 di << "New number of isos : " << aNbUIsos << " " << aNbVIsos << "\n";
631 di << "New IsoOnPlane mode is " << (isIsoOnPlane ? "ON" : "OFF") << "\n";
633 TheAISContext()->IsoOnPlane(isIsoOnPlane);
636 // If there are no shapes provided set the default numbers.
637 TheAISContext()->SetIsoNumber(aNbUIsos, AIS_TOI_IsoU);
638 TheAISContext()->SetIsoNumber(aNbVIsos, AIS_TOI_IsoV);
645 for (i = 1; i <= aLastInd; i++) {
646 TCollection_AsciiString name(argv[i]);
647 Standard_Boolean IsBound = GetMapOfAIS().IsBound2(name);
650 const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2(name);
651 if (anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
652 const Handle(AIS_InteractiveObject) aShape =
653 Handle(AIS_InteractiveObject)::DownCast (anObj);
654 Handle(Prs3d_Drawer) CurDrawer = aShape->Attributes();
655 Handle(Prs3d_IsoAspect) aUIso = CurDrawer->UIsoAspect();
656 Handle(Prs3d_IsoAspect) aVIso = CurDrawer->VIsoAspect();
659 CurDrawer->SetUIsoAspect(CopyIsoAspect(aUIso, aNbUIsos));
660 CurDrawer->SetVIsoAspect(CopyIsoAspect(aVIso, aNbVIsos));
661 TheAISContext()->SetLocalAttributes
662 (aShape, CurDrawer, Standard_False);
663 TheAISContext()->Redisplay(aShape);
665 di << "Number of isos for " << argv[i] << " : "
666 << aUIso->Number() << " " << aVIso->Number() << "\n";
669 di << argv[i] << ": Not an AIS interactive object!\n";
672 di << argv[i] << ": Use 'vdisplay' before\n";
677 TheAISContext()->UpdateCurrentViewer();
683 static Standard_Integer VDispSensi (Draw_Interpretor& ,
684 Standard_Integer theArgNb,
689 std::cout << "Error: wrong syntax!\n";
693 Handle(AIS_InteractiveContext) aCtx;
694 Handle(V3d_View) aView;
695 if (!getCtxAndView (aCtx, aView))
700 aCtx->DisplayActiveSensitive (aView);
705 static Standard_Integer VClearSensi (Draw_Interpretor& ,
706 Standard_Integer theArgNb,
711 std::cout << "Error: wrong syntax!\n";
715 Handle(AIS_InteractiveContext) aCtx;
716 Handle(V3d_View) aView;
717 if (!getCtxAndView (aCtx, aView))
721 aCtx->ClearActiveSensitive (aView);
725 //==============================================================================
727 //purpose : To list the displayed object with their attributes
728 //==============================================================================
729 static int VDir (Draw_Interpretor& theDI,
733 if (!a3DView().IsNull())
738 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
739 anIter.More(); anIter.Next())
741 theDI << "\t" << anIter.Key2().ToCString() << "\n";
746 //==============================================================================
747 //function : VSelPrecision
748 //purpose : To set the selection tolerance value
749 //Draw arg : Selection tolerance value (real value determining the width and
750 // height of selecting frustum bases). Without arguments the function
751 // just prints current tolerance.
752 //==============================================================================
753 static int VSelPrecision(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
757 di << "Wrong parameters! Must be: " << argv[0] << " [-unset] [tolerance]\n";
761 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
762 if( aContext.IsNull() )
767 Standard_Real aPixelTolerance = aContext->PixelTolerance();
768 di << "Pixel tolerance : " << aPixelTolerance << "\n";
772 TCollection_AsciiString anArg = TCollection_AsciiString (argv[1]);
774 if (anArg == "-unset")
776 aContext->SetPixelTolerance (-1);
780 aContext->SetPixelTolerance (anArg.IntegerValue());
787 //! Auxiliary enumeration
788 enum ViewerTest_StereoPair
790 ViewerTest_SP_Single,
791 ViewerTest_SP_SideBySide,
792 ViewerTest_SP_OverUnder
795 //==============================================================================
797 //purpose : To dump the active view snapshot to image file
798 //==============================================================================
799 static Standard_Integer VDump (Draw_Interpretor& theDI,
800 Standard_Integer theArgNb,
801 Standard_CString* theArgVec)
805 std::cout << "Error: wrong number of arguments! Image file name should be specified at least.\n";
809 Standard_Integer anArgIter = 1;
810 Standard_CString aFilePath = theArgVec[anArgIter++];
811 Graphic3d_BufferType aBufferType = Graphic3d_BT_RGB;
812 V3d_StereoDumpOptions aStereoOpts = V3d_SDO_MONO;
813 ViewerTest_StereoPair aStereoPair = ViewerTest_SP_Single;
814 Standard_Integer aWidth = 0;
815 Standard_Integer aHeight = 0;
816 for (; anArgIter < theArgNb; ++anArgIter)
818 TCollection_AsciiString anArg (theArgVec[anArgIter]);
820 if (anArg == "-buffer")
822 if (++anArgIter >= theArgNb)
824 std::cout << "Error: wrong syntax at '" << anArg << "'\n";
828 TCollection_AsciiString aBufArg (theArgVec[anArgIter]);
830 if (aBufArg == "rgba")
832 aBufferType = Graphic3d_BT_RGBA;
834 else if (aBufArg == "rgb")
836 aBufferType = Graphic3d_BT_RGB;
838 else if (aBufArg == "depth")
840 aBufferType = Graphic3d_BT_Depth;
844 std::cout << "Error: unknown buffer '" << aBufArg << "'\n";
848 else if (anArg == "-stereo")
850 if (++anArgIter >= theArgNb)
852 std::cout << "Error: wrong syntax at '" << anArg << "'\n";
856 TCollection_AsciiString aStereoArg (theArgVec[anArgIter]);
857 aStereoArg.LowerCase();
858 if (aStereoArg == "l"
859 || aStereoArg == "left")
861 aStereoOpts = V3d_SDO_LEFT_EYE;
863 else if (aStereoArg == "r"
864 || aStereoArg == "right")
866 aStereoOpts = V3d_SDO_RIGHT_EYE;
868 else if (aStereoArg == "mono")
870 aStereoOpts = V3d_SDO_MONO;
872 else if (aStereoArg == "blended"
873 || aStereoArg == "blend"
874 || aStereoArg == "stereo")
876 aStereoOpts = V3d_SDO_BLENDED;
878 else if (aStereoArg == "sbs"
879 || aStereoArg == "sidebyside")
881 aStereoPair = ViewerTest_SP_SideBySide;
883 else if (aStereoArg == "ou"
884 || aStereoArg == "overunder")
886 aStereoPair = ViewerTest_SP_OverUnder;
890 std::cout << "Error: unknown stereo format '" << aStereoArg << "'\n";
894 else if (anArg == "-rgba"
897 aBufferType = Graphic3d_BT_RGBA;
899 else if (anArg == "-rgb"
902 aBufferType = Graphic3d_BT_RGB;
904 else if (anArg == "-depth"
907 aBufferType = Graphic3d_BT_Depth;
910 else if (anArg == "-width"
916 std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
919 else if (++anArgIter >= theArgNb)
921 std::cout << "Error: integer value is expected right after 'width'\n";
924 aWidth = Draw::Atoi (theArgVec[anArgIter]);
926 else if (anArg == "-height"
928 || anArg == "-sizey")
932 std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
935 else if (++anArgIter >= theArgNb)
937 std::cout << "Error: integer value is expected right after 'height'\n";
940 aHeight = Draw::Atoi (theArgVec[anArgIter]);
944 std::cout << "Error: unknown argument '" << theArgVec[anArgIter] << "'\n";
948 if ((aWidth <= 0 && aHeight > 0)
949 || (aWidth > 0 && aHeight <= 0))
951 std::cout << "Error: dimensions " << aWidth << "x" << aHeight << " are incorrect\n";
955 Handle(V3d_View) aView = ViewerTest::CurrentView();
958 std::cout << "Error: cannot find an active view!\n";
962 if (aWidth <= 0 || aHeight <= 0)
964 aView->Window()->Size (aWidth, aHeight);
967 Image_AlienPixMap aPixMap;
969 bool isBigEndian = Image_PixMap::IsBigEndianHost();
970 Image_PixMap::ImgFormat aFormat = Image_PixMap::ImgUNKNOWN;
973 case Graphic3d_BT_RGB: aFormat = isBigEndian ? Image_PixMap::ImgRGB : Image_PixMap::ImgBGR; break;
974 case Graphic3d_BT_RGBA: aFormat = isBigEndian ? Image_PixMap::ImgRGBA : Image_PixMap::ImgBGRA; break;
975 case Graphic3d_BT_Depth: aFormat = Image_PixMap::ImgGrayF; break;
980 case ViewerTest_SP_Single:
982 if (!aView->ToPixMap (aPixMap, aWidth, aHeight, aBufferType, Standard_True, aStereoOpts))
984 theDI << "Fail: view dump failed!\n";
987 else if (aPixMap.SizeX() != Standard_Size(aWidth)
988 || aPixMap.SizeY() != Standard_Size(aHeight))
990 theDI << "Fail: dumped dimensions " << (Standard_Integer )aPixMap.SizeX() << "x" << (Standard_Integer )aPixMap.SizeY()
991 << " are lesser than requested " << aWidth << "x" << aHeight << "\n";
995 case ViewerTest_SP_SideBySide:
997 if (!aPixMap.InitZero (aFormat, aWidth * 2, aHeight))
999 theDI << "Fail: not enough memory for image allocation!\n";
1003 Image_PixMap aPixMapL, aPixMapR;
1004 aPixMapL.InitWrapper (aPixMap.Format(), aPixMap.ChangeData(),
1005 aWidth, aHeight, aPixMap.SizeRowBytes());
1006 aPixMapR.InitWrapper (aPixMap.Format(), aPixMap.ChangeData() + aPixMap.SizePixelBytes() * aWidth,
1007 aWidth, aHeight, aPixMap.SizeRowBytes());
1008 if (!aView->ToPixMap (aPixMapL, aWidth, aHeight, aBufferType, Standard_True, V3d_SDO_LEFT_EYE)
1009 || !aView->ToPixMap (aPixMapR, aWidth, aHeight, aBufferType, Standard_True, V3d_SDO_RIGHT_EYE)
1012 theDI << "Fail: view dump failed!\n";
1017 case ViewerTest_SP_OverUnder:
1019 if (!aPixMap.InitZero (aFormat, aWidth, aHeight * 2))
1021 theDI << "Fail: not enough memory for image allocation!\n";
1025 Image_PixMap aPixMapL, aPixMapR;
1026 aPixMapL.InitWrapper (aFormat, aPixMap.ChangeData(),
1027 aWidth, aHeight, aPixMap.SizeRowBytes());
1028 aPixMapR.InitWrapper (aFormat, aPixMap.ChangeData() + aPixMap.SizeRowBytes() * aHeight,
1029 aWidth, aHeight, aPixMap.SizeRowBytes());
1030 if (!aView->ToPixMap (aPixMapL, aWidth, aHeight, aBufferType, Standard_True, V3d_SDO_LEFT_EYE)
1031 || !aView->ToPixMap (aPixMapR, aWidth, aHeight, aBufferType, Standard_True, V3d_SDO_RIGHT_EYE))
1033 theDI << "Fail: view dump failed!\n";
1040 if (!aPixMap.Save (aFilePath))
1042 theDI << "Fail: image can not be saved!\n";
1047 //==============================================================================
1048 //function : Displays,Erase...
1051 //==============================================================================
1052 static int VwrTst_DispErase(const Handle(AIS_InteractiveObject)& IO,
1053 const Standard_Integer Mode,
1054 const Standard_Integer TypeOfOperation,
1055 const Standard_Boolean Upd)
1057 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1059 switch(TypeOfOperation){
1061 Ctx->Display(IO,Mode,Upd);
1069 Ctx->SetDisplayMode((AIS_DisplayMode)Mode,Upd);
1071 Ctx->SetDisplayMode(IO,Mode,Upd);
1076 Ctx->SetDisplayMode(0,Upd);
1078 Ctx->UnsetDisplayMode(IO,Upd);
1085 //=======================================================================
1088 //=======================================================================
1089 static int VDispMode (Draw_Interpretor& , Standard_Integer argc, const char** argv)
1092 TCollection_AsciiString name;
1095 // display others presentations
1096 Standard_Integer TypeOfOperation = (strcasecmp(argv[0],"vdispmode")==0)? 1:
1097 (strcasecmp(argv[0],"verasemode")==0) ? 2 :
1098 (strcasecmp(argv[0],"vsetdispmode")==0) ? 3 :
1099 (strcasecmp(argv[0],"vunsetdispmode")==0) ? 4 : -1;
1101 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1103 //unset displaymode.. comportement particulier...
1104 if(TypeOfOperation==4){
1106 if(Ctx->NbSelected()==0){
1107 Handle(AIS_InteractiveObject) IO;
1108 VwrTst_DispErase(IO,-1,4,Standard_False);
1111 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1112 VwrTst_DispErase(Ctx->SelectedInteractive(),-1,4,Standard_False);}
1113 Ctx->UpdateCurrentViewer();
1116 Handle(AIS_InteractiveObject) IO;
1118 if(GetMapOfAIS().IsBound2(name)){
1119 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1121 VwrTst_DispErase(IO,-1,4,Standard_True);
1126 Standard_Integer Dmode = Draw::Atoi(argv[1]);
1127 if(Ctx->NbSelected()==0 && TypeOfOperation==3){
1128 Handle(AIS_InteractiveObject) IO;
1129 VwrTst_DispErase(IO,Dmode,TypeOfOperation,Standard_True);
1131 if(!Ctx->HasOpenedContext()){
1132 // set/unset display mode sur le Contexte...
1133 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()){
1134 VwrTst_DispErase(Ctx->SelectedInteractive(),Dmode,TypeOfOperation,Standard_False);
1136 Ctx->UpdateCurrentViewer();
1139 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1140 Ctx->Display(Ctx->SelectedInteractive(),Dmode);
1144 Handle(AIS_InteractiveObject) IO;
1146 if(GetMapOfAIS().IsBound2(name))
1147 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1149 VwrTst_DispErase(IO,Draw::Atoi(argv[2]),TypeOfOperation,Standard_True);
1155 //=======================================================================
1158 //=======================================================================
1159 static int VSubInt(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1161 if(argc==1) return 1;
1162 Standard_Integer On = Draw::Atoi(argv[1]);
1163 const Handle(AIS_InteractiveContext)& Ctx = ViewerTest::GetAISContext();
1167 TCollection_AsciiString isOnOff = On == 1 ? "on" : "off";
1168 di << "Sub intensite is turned " << isOnOff << " for " << Ctx->NbSelected() << "objects\n";
1169 for (Ctx->InitSelected(); Ctx->MoreSelected(); Ctx->NextSelected())
1173 Ctx->SubIntensityOn (Ctx->SelectedInteractive(), Standard_False);
1177 Ctx->SubIntensityOff (Ctx->SelectedInteractive(), Standard_False);
1181 Ctx->UpdateCurrentViewer();
1184 Handle(AIS_InteractiveObject) IO;
1185 TCollection_AsciiString name = argv[2];
1186 if(GetMapOfAIS().IsBound2(name)){
1187 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1190 Ctx->SubIntensityOn(IO);
1192 Ctx->SubIntensityOff(IO);
1200 //! Auxiliary class to iterate presentations from different collections.
1201 class ViewTest_PrsIter
1205 //! Create and initialize iterator object.
1206 ViewTest_PrsIter (const TCollection_AsciiString& theName)
1207 : mySource (IterSource_All)
1209 NCollection_Sequence<TCollection_AsciiString> aNames;
1210 if (!theName.IsEmpty())
1211 aNames.Append (theName);
1215 //! Create and initialize iterator object.
1216 ViewTest_PrsIter (const NCollection_Sequence<TCollection_AsciiString>& theNames)
1217 : mySource (IterSource_All)
1222 //! Initialize the iterator.
1223 void Init (const NCollection_Sequence<TCollection_AsciiString>& theNames)
1225 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
1227 mySelIter.Nullify();
1228 myCurrent.Nullify();
1229 myCurrentTrs.Nullify();
1230 if (!mySeq.IsEmpty())
1232 mySource = IterSource_List;
1233 mySeqIter = NCollection_Sequence<TCollection_AsciiString>::Iterator (mySeq);
1235 else if (aCtx->NbSelected() > 0)
1237 mySource = IterSource_Selected;
1239 mySelIter->InitSelected();
1243 mySource = IterSource_All;
1244 myMapIter.Initialize (GetMapOfAIS());
1249 const TCollection_AsciiString& CurrentName() const
1251 return myCurrentName;
1254 const Handle(AIS_InteractiveObject)& Current() const
1259 const Handle(Standard_Transient)& CurrentTrs() const
1261 return myCurrentTrs;
1264 //! @return true if iterator points to valid object within collection
1265 Standard_Boolean More() const
1269 case IterSource_All: return myMapIter.More();
1270 case IterSource_List: return mySeqIter.More();
1271 case IterSource_Selected: return mySelIter->MoreSelected();
1273 return Standard_False;
1276 //! Go to the next item.
1279 myCurrentName.Clear();
1280 myCurrentTrs.Nullify();
1281 myCurrent.Nullify();
1284 case IterSource_All:
1289 case IterSource_List:
1294 case IterSource_Selected:
1296 mySelIter->NextSelected();
1309 case IterSource_All:
1311 if (myMapIter.More())
1313 myCurrentName = myMapIter.Key2();
1314 myCurrentTrs = myMapIter.Key1();
1315 myCurrent = Handle(AIS_InteractiveObject)::DownCast (myCurrentTrs);
1319 case IterSource_List:
1321 if (mySeqIter.More())
1323 if (!GetMapOfAIS().IsBound2 (mySeqIter.Value()))
1325 std::cout << "Error: object " << mySeqIter.Value() << " is not displayed!\n";
1328 myCurrentName = mySeqIter.Value();
1329 myCurrentTrs = GetMapOfAIS().Find2 (mySeqIter.Value());
1330 myCurrent = Handle(AIS_InteractiveObject)::DownCast (myCurrentTrs);
1334 case IterSource_Selected:
1336 if (mySelIter->MoreSelected())
1338 myCurrentName = GetMapOfAIS().Find1 (mySelIter->SelectedInteractive());
1339 myCurrent = mySelIter->SelectedInteractive();
1357 Handle(AIS_InteractiveContext) mySelIter; //!< iterator for current (selected) objects (IterSource_Selected)
1358 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName myMapIter; //!< iterator for map of all objects (IterSource_All)
1359 NCollection_Sequence<TCollection_AsciiString> mySeq;
1360 NCollection_Sequence<TCollection_AsciiString>::Iterator mySeqIter;
1362 TCollection_AsciiString myCurrentName;//!< current item name
1363 Handle(Standard_Transient) myCurrentTrs; //!< current item (as transient object)
1364 Handle(AIS_InteractiveObject) myCurrent; //!< current item
1366 IterSource mySource; //!< iterated collection
1370 //==============================================================================
1371 //function : VInteriorStyle
1372 //purpose : sets interior style of the a selected or named or displayed shape
1373 //==============================================================================
1374 static int VSetInteriorStyle (Draw_Interpretor& theDI,
1375 Standard_Integer theArgNb,
1376 const char** theArgVec)
1378 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1379 ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
1382 std::cerr << "Error: no active view!\n";
1386 Standard_Integer anArgIter = 1;
1387 for (; anArgIter < theArgNb; ++anArgIter)
1389 if (!anUpdateTool.parseRedrawMode (theArgVec[anArgIter]))
1394 TCollection_AsciiString aName;
1395 if (theArgNb - anArgIter == 2)
1397 aName = theArgVec[anArgIter++];
1399 else if (theArgNb - anArgIter != 1)
1401 std::cout << "Error: wrong number of arguments! See usage:\n";
1402 theDI.PrintHelp (theArgVec[0]);
1405 Standard_Integer anInterStyle = Aspect_IS_SOLID;
1406 TCollection_AsciiString aStyleArg (theArgVec[anArgIter++]);
1407 aStyleArg.LowerCase();
1408 if (aStyleArg == "empty")
1412 else if (aStyleArg == "hollow")
1416 else if (aStyleArg == "hatch")
1420 else if (aStyleArg == "solid")
1424 else if (aStyleArg == "hiddenline")
1430 anInterStyle = aStyleArg.IntegerValue();
1432 if (anInterStyle < Aspect_IS_EMPTY
1433 || anInterStyle > Aspect_IS_HIDDENLINE)
1435 std::cout << "Error: style must be within a range [0 (Aspect_IS_EMPTY), "
1436 << Aspect_IS_HIDDENLINE << " (Aspect_IS_HIDDENLINE)]\n";
1440 if (!aName.IsEmpty()
1441 && !GetMapOfAIS().IsBound2 (aName))
1443 std::cout << "Error: object " << aName << " is not displayed!\n";
1447 if (aCtx->HasOpenedContext())
1449 aCtx->CloseLocalContext();
1451 for (ViewTest_PrsIter anIter (aName); anIter.More(); anIter.Next())
1453 const Handle(AIS_InteractiveObject)& anIO = anIter.Current();
1456 const Handle(Prs3d_Drawer)& aDrawer = anIO->Attributes();
1457 Handle(Prs3d_ShadingAspect) aShadingAspect = aDrawer->ShadingAspect();
1458 Handle(Graphic3d_AspectFillArea3d) aFillAspect = aShadingAspect->Aspect();
1459 aFillAspect->SetInteriorStyle ((Aspect_InteriorStyle )anInterStyle);
1460 aCtx->RecomputePrsOnly (anIO, Standard_False, Standard_True);
1466 //! Auxiliary structure for VAspects
1467 struct ViewerTest_AspectsChangeSet
1469 Standard_Integer ToSetVisibility;
1470 Standard_Integer Visibility;
1472 Standard_Integer ToSetColor;
1473 Quantity_Color Color;
1475 Standard_Integer ToSetLineWidth;
1476 Standard_Real LineWidth;
1478 Standard_Integer ToSetTypeOfLine;
1479 Aspect_TypeOfLine TypeOfLine;
1481 Standard_Integer ToSetTransparency;
1482 Standard_Real Transparency;
1484 Standard_Integer ToSetMaterial;
1485 Graphic3d_NameOfMaterial Material;
1486 TCollection_AsciiString MatName;
1488 NCollection_Sequence<TopoDS_Shape> SubShapes;
1490 Standard_Integer ToSetShowFreeBoundary;
1491 Standard_Integer ToSetFreeBoundaryWidth;
1492 Standard_Real FreeBoundaryWidth;
1493 Standard_Integer ToSetFreeBoundaryColor;
1494 Quantity_Color FreeBoundaryColor;
1496 Standard_Integer ToEnableIsoOnTriangulation;
1498 Standard_Integer ToSetMaxParamValue;
1499 Standard_Real MaxParamValue;
1501 Standard_Integer ToSetSensitivity;
1502 Standard_Integer SelectionMode;
1503 Standard_Integer Sensitivity;
1505 //! Empty constructor
1506 ViewerTest_AspectsChangeSet()
1507 : ToSetVisibility (0),
1510 Color (DEFAULT_COLOR),
1513 ToSetTypeOfLine (0),
1514 TypeOfLine (Aspect_TOL_SOLID),
1515 ToSetTransparency (0),
1518 Material (Graphic3d_NOM_DEFAULT),
1519 ToSetShowFreeBoundary (0),
1520 ToSetFreeBoundaryWidth (0),
1521 FreeBoundaryWidth (1.0),
1522 ToSetFreeBoundaryColor (0),
1523 FreeBoundaryColor (DEFAULT_FREEBOUNDARY_COLOR),
1524 ToEnableIsoOnTriangulation (-1),
1525 ToSetMaxParamValue (0),
1526 MaxParamValue (500000),
1527 ToSetSensitivity (0),
1531 //! @return true if no changes have been requested
1532 Standard_Boolean IsEmpty() const
1534 return ToSetVisibility == 0
1535 && ToSetLineWidth == 0
1536 && ToSetTransparency == 0
1538 && ToSetMaterial == 0
1539 && ToSetShowFreeBoundary == 0
1540 && ToSetFreeBoundaryColor == 0
1541 && ToSetFreeBoundaryWidth == 0
1542 && ToSetMaxParamValue == 0
1543 && ToSetSensitivity == 0;
1546 //! @return true if properties are valid
1547 Standard_Boolean Validate (const Standard_Boolean theIsSubPart) const
1549 Standard_Boolean isOk = Standard_True;
1550 if (Visibility != 0 && Visibility != 1)
1552 std::cout << "Error: the visibility should be equal to 0 or 1 (0 - invisible; 1 - visible) (specified " << Visibility << ")\n";
1553 isOk = Standard_False;
1555 if (LineWidth <= 0.0
1556 || LineWidth > 10.0)
1558 std::cout << "Error: the width should be within [1; 10] range (specified " << LineWidth << ")\n";
1559 isOk = Standard_False;
1561 if (Transparency < 0.0
1562 || Transparency > 1.0)
1564 std::cout << "Error: the transparency should be within [0; 1] range (specified " << Transparency << ")\n";
1565 isOk = Standard_False;
1568 && ToSetTransparency)
1570 std::cout << "Error: the transparency can not be defined for sub-part of object!\n";
1571 isOk = Standard_False;
1573 if (ToSetMaterial == 1
1574 && Material == Graphic3d_NOM_DEFAULT)
1576 std::cout << "Error: unknown material " << MatName << ".\n";
1577 isOk = Standard_False;
1579 if (FreeBoundaryWidth <= 0.0
1580 || FreeBoundaryWidth > 10.0)
1582 std::cout << "Error: the free boundary width should be within [1; 10] range (specified " << FreeBoundaryWidth << ")\n";
1583 isOk = Standard_False;
1585 if (MaxParamValue < 0.0)
1587 std::cout << "Error: the max parameter value should be greater than zero (specified " << MaxParamValue << ")\n";
1588 isOk = Standard_False;
1590 if (Sensitivity <= 0 && ToSetSensitivity)
1592 std::cout << "Error: sensitivity parameter value should be positive (specified " << Sensitivity << ")\n";
1593 isOk = Standard_False;
1600 //==============================================================================
1601 //function : VAspects
1603 //==============================================================================
1604 static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
1605 Standard_Integer theArgNb,
1606 const char** theArgVec)
1608 TCollection_AsciiString aCmdName (theArgVec[0]);
1609 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1610 ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
1613 std::cerr << "Error: no active view!\n";
1617 Standard_Integer anArgIter = 1;
1618 Standard_Boolean isDefaults = Standard_False;
1619 NCollection_Sequence<TCollection_AsciiString> aNames;
1620 for (; anArgIter < theArgNb; ++anArgIter)
1622 TCollection_AsciiString anArg = theArgVec[anArgIter];
1623 if (anUpdateTool.parseRedrawMode (anArg))
1627 else if (!anArg.IsEmpty()
1628 && anArg.Value (1) != '-')
1630 aNames.Append (anArg);
1634 if (anArg == "-defaults")
1636 isDefaults = Standard_True;
1643 if (!aNames.IsEmpty() && isDefaults)
1645 std::cout << "Error: wrong syntax. If -defaults is used there should not be any objects' names!\n";
1649 NCollection_Sequence<ViewerTest_AspectsChangeSet> aChanges;
1650 aChanges.Append (ViewerTest_AspectsChangeSet());
1651 ViewerTest_AspectsChangeSet* aChangeSet = &aChanges.ChangeLast();
1653 // parse syntax of legacy commands
1654 if (aCmdName == "vsetwidth")
1656 if (aNames.IsEmpty()
1657 || !aNames.Last().IsRealValue())
1659 std::cout << "Error: not enough arguments!\n";
1662 aChangeSet->ToSetLineWidth = 1;
1663 aChangeSet->LineWidth = aNames.Last().RealValue();
1664 aNames.Remove (aNames.Length());
1666 else if (aCmdName == "vunsetwidth")
1668 aChangeSet->ToSetLineWidth = -1;
1670 else if (aCmdName == "vsetcolor")
1672 if (aNames.IsEmpty())
1674 std::cout << "Error: not enough arguments!\n";
1677 aChangeSet->ToSetColor = 1;
1679 Quantity_NameOfColor aColor = Quantity_NOC_BLACK;
1680 Standard_Boolean isOk = Standard_False;
1681 if (Quantity_Color::ColorFromName (aNames.Last().ToCString(), aColor))
1683 aChangeSet->Color = aColor;
1684 aNames.Remove (aNames.Length());
1685 isOk = Standard_True;
1687 else if (aNames.Length() >= 3)
1689 const TCollection_AsciiString anRgbStr[3] =
1691 aNames.Value (aNames.Upper() - 2),
1692 aNames.Value (aNames.Upper() - 1),
1693 aNames.Value (aNames.Upper() - 0)
1695 isOk = anRgbStr[0].IsRealValue()
1696 && anRgbStr[1].IsRealValue()
1697 && anRgbStr[2].IsRealValue();
1700 Graphic3d_Vec4d anRgb;
1701 anRgb.x() = anRgbStr[0].RealValue();
1702 anRgb.y() = anRgbStr[1].RealValue();
1703 anRgb.z() = anRgbStr[2].RealValue();
1704 if (anRgb.x() < 0.0 || anRgb.x() > 1.0
1705 || anRgb.y() < 0.0 || anRgb.y() > 1.0
1706 || anRgb.z() < 0.0 || anRgb.z() > 1.0)
1708 std::cout << "Error: RGB color values should be within range 0..1!\n";
1711 aChangeSet->Color.SetValues (anRgb.x(), anRgb.y(), anRgb.z(), Quantity_TOC_RGB);
1712 aNames.Remove (aNames.Length());
1713 aNames.Remove (aNames.Length());
1714 aNames.Remove (aNames.Length());
1719 std::cout << "Error: not enough arguments!\n";
1723 else if (aCmdName == "vunsetcolor")
1725 aChangeSet->ToSetColor = -1;
1727 else if (aCmdName == "vsettransparency")
1729 if (aNames.IsEmpty()
1730 || !aNames.Last().IsRealValue())
1732 std::cout << "Error: not enough arguments!\n";
1735 aChangeSet->ToSetTransparency = 1;
1736 aChangeSet->Transparency = aNames.Last().RealValue();
1737 aNames.Remove (aNames.Length());
1739 else if (aCmdName == "vunsettransparency")
1741 aChangeSet->ToSetTransparency = -1;
1743 else if (aCmdName == "vsetmaterial")
1745 if (aNames.IsEmpty())
1747 std::cout << "Error: not enough arguments!\n";
1750 aChangeSet->ToSetMaterial = 1;
1751 aChangeSet->MatName = aNames.Last();
1752 aChangeSet->Material = Graphic3d_MaterialAspect::MaterialFromName (aChangeSet->MatName.ToCString());
1753 aNames.Remove (aNames.Length());
1755 else if (aCmdName == "vunsetmaterial")
1757 aChangeSet->ToSetMaterial = -1;
1759 else if (anArgIter >= theArgNb)
1761 std::cout << "Error: not enough arguments!\n";
1765 if (!aChangeSet->IsEmpty())
1767 anArgIter = theArgNb;
1769 for (; anArgIter < theArgNb; ++anArgIter)
1771 TCollection_AsciiString anArg = theArgVec[anArgIter];
1773 if (anArg == "-setwidth"
1774 || anArg == "-setlinewidth")
1776 if (++anArgIter >= theArgNb)
1778 std::cout << "Error: wrong syntax at " << anArg << "\n";
1781 aChangeSet->ToSetLineWidth = 1;
1782 aChangeSet->LineWidth = Draw::Atof (theArgVec[anArgIter]);
1784 else if (anArg == "-unsetwidth"
1785 || anArg == "-unsetlinewidth")
1787 aChangeSet->ToSetLineWidth = -1;
1788 aChangeSet->LineWidth = 1.0;
1790 else if (anArg == "-settransp"
1791 || anArg == "-settransparency")
1793 if (++anArgIter >= theArgNb)
1795 std::cout << "Error: wrong syntax at " << anArg << "\n";
1798 aChangeSet->ToSetTransparency = 1;
1799 aChangeSet->Transparency = Draw::Atof (theArgVec[anArgIter]);
1800 if (aChangeSet->Transparency >= 0.0
1801 && aChangeSet->Transparency <= Precision::Confusion())
1803 aChangeSet->ToSetTransparency = -1;
1804 aChangeSet->Transparency = 0.0;
1807 else if (anArg == "-setvis"
1808 || anArg == "-setvisibility")
1810 if (++anArgIter >= theArgNb)
1812 std::cout << "Error: wrong syntax at " << anArg << "\n";
1816 aChangeSet->ToSetVisibility = 1;
1817 aChangeSet->Visibility = Draw::Atoi (theArgVec[anArgIter]);
1819 else if (anArg == "-setalpha")
1821 if (++anArgIter >= theArgNb)
1823 std::cout << "Error: wrong syntax at " << anArg << "\n";
1826 aChangeSet->ToSetTransparency = 1;
1827 aChangeSet->Transparency = Draw::Atof (theArgVec[anArgIter]);
1828 if (aChangeSet->Transparency < 0.0
1829 || aChangeSet->Transparency > 1.0)
1831 std::cout << "Error: the transparency should be within [0; 1] range (specified " << aChangeSet->Transparency << ")\n";
1834 aChangeSet->Transparency = 1.0 - aChangeSet->Transparency;
1835 if (aChangeSet->Transparency >= 0.0
1836 && aChangeSet->Transparency <= Precision::Confusion())
1838 aChangeSet->ToSetTransparency = -1;
1839 aChangeSet->Transparency = 0.0;
1842 else if (anArg == "-unsettransp"
1843 || anArg == "-unsettransparency"
1844 || anArg == "-unsetalpha"
1845 || anArg == "-opaque")
1847 aChangeSet->ToSetTransparency = -1;
1848 aChangeSet->Transparency = 0.0;
1850 else if (anArg == "-setcolor")
1852 Standard_Integer aNbComps = 0;
1853 Standard_Integer aCompIter = anArgIter + 1;
1854 for (; aCompIter < theArgNb; ++aCompIter, ++aNbComps)
1856 if (theArgVec[aCompIter][0] == '-')
1865 Quantity_NameOfColor aColor = Quantity_NOC_BLACK;
1866 Standard_CString aName = theArgVec[anArgIter + 1];
1867 if (!Quantity_Color::ColorFromName (aName, aColor))
1869 std::cout << "Error: unknown color name '" << aName << "'\n";
1872 aChangeSet->Color = aColor;
1877 Graphic3d_Vec3d anRgb;
1878 anRgb.x() = Draw::Atof (theArgVec[anArgIter + 1]);
1879 anRgb.y() = Draw::Atof (theArgVec[anArgIter + 2]);
1880 anRgb.z() = Draw::Atof (theArgVec[anArgIter + 3]);
1881 if (anRgb.x() < 0.0 || anRgb.x() > 1.0
1882 || anRgb.y() < 0.0 || anRgb.y() > 1.0
1883 || anRgb.z() < 0.0 || anRgb.z() > 1.0)
1885 std::cout << "Error: RGB color values should be within range 0..1!\n";
1888 aChangeSet->Color.SetValues (anRgb.x(), anRgb.y(), anRgb.z(), Quantity_TOC_RGB);
1893 std::cout << "Error: wrong syntax at " << anArg << "\n";
1897 aChangeSet->ToSetColor = 1;
1898 anArgIter += aNbComps;
1900 else if (anArg == "-setlinetype")
1902 if (++anArgIter >= theArgNb)
1904 std::cout << "Error: wrong syntax at " << anArg << "\n";
1908 TCollection_AsciiString aValue (theArgVec[anArgIter]);
1911 if (aValue.IsEqual ("solid"))
1913 aChangeSet->TypeOfLine = Aspect_TOL_SOLID;
1915 else if (aValue.IsEqual ("dot"))
1917 aChangeSet->TypeOfLine = Aspect_TOL_DOT;
1919 else if (aValue.IsEqual ("dash"))
1921 aChangeSet->TypeOfLine = Aspect_TOL_DASH;
1923 else if (aValue.IsEqual ("dotdash"))
1925 aChangeSet->TypeOfLine = Aspect_TOL_DOTDASH;
1929 std::cout << "Error: wrong syntax at " << anArg << "\n";
1933 aChangeSet->ToSetTypeOfLine = 1;
1935 else if (anArg == "-unsetlinetype")
1937 aChangeSet->ToSetTypeOfLine = -1;
1939 else if (anArg == "-unsetcolor")
1941 aChangeSet->ToSetColor = -1;
1942 aChangeSet->Color = DEFAULT_COLOR;
1944 else if (anArg == "-setmat"
1945 || anArg == "-setmaterial")
1947 if (++anArgIter >= theArgNb)
1949 std::cout << "Error: wrong syntax at " << anArg << "\n";
1952 aChangeSet->ToSetMaterial = 1;
1953 aChangeSet->MatName = theArgVec[anArgIter];
1954 aChangeSet->Material = Graphic3d_MaterialAspect::MaterialFromName (aChangeSet->MatName.ToCString());
1956 else if (anArg == "-unsetmat"
1957 || anArg == "-unsetmaterial")
1959 aChangeSet->ToSetMaterial = -1;
1960 aChangeSet->Material = Graphic3d_NOM_DEFAULT;
1962 else if (anArg == "-subshape"
1963 || anArg == "-subshapes")
1967 std::cout << "Error: wrong syntax. -subshapes can not be used together with -defaults call!\n";
1971 if (aNames.IsEmpty())
1973 std::cout << "Error: main objects should specified explicitly when -subshapes is used!\n";
1977 aChanges.Append (ViewerTest_AspectsChangeSet());
1978 aChangeSet = &aChanges.ChangeLast();
1980 for (++anArgIter; anArgIter < theArgNb; ++anArgIter)
1982 Standard_CString aSubShapeName = theArgVec[anArgIter];
1983 if (*aSubShapeName == '-')
1989 TopoDS_Shape aSubShape = DBRep::Get (aSubShapeName);
1990 if (aSubShape.IsNull())
1992 std::cerr << "Error: shape " << aSubShapeName << " doesn't found!\n";
1995 aChangeSet->SubShapes.Append (aSubShape);
1998 if (aChangeSet->SubShapes.IsEmpty())
2000 std::cerr << "Error: empty list is specified after -subshapes!\n";
2004 else if (anArg == "-freeboundary"
2007 if (++anArgIter >= theArgNb)
2009 std::cout << "Error: wrong syntax at " << anArg << "\n";
2012 TCollection_AsciiString aValue (theArgVec[anArgIter]);
2017 aChangeSet->ToSetShowFreeBoundary = 1;
2019 else if (aValue == "off"
2022 aChangeSet->ToSetShowFreeBoundary = -1;
2026 std::cout << "Error: wrong syntax at " << anArg << "\n";
2030 else if (anArg == "-setfreeboundarywidth"
2031 || anArg == "-setfbwidth")
2033 if (++anArgIter >= theArgNb)
2035 std::cout << "Error: wrong syntax at " << anArg << "\n";
2038 aChangeSet->ToSetFreeBoundaryWidth = 1;
2039 aChangeSet->FreeBoundaryWidth = Draw::Atof (theArgVec[anArgIter]);
2041 else if (anArg == "-unsetfreeboundarywidth"
2042 || anArg == "-unsetfbwidth")
2044 aChangeSet->ToSetFreeBoundaryWidth = -1;
2045 aChangeSet->FreeBoundaryWidth = 1.0;
2047 else if (anArg == "-setfreeboundarycolor"
2048 || anArg == "-setfbcolor")
2050 Standard_Integer aNbComps = 0;
2051 Standard_Integer aCompIter = anArgIter + 1;
2052 for (; aCompIter < theArgNb; ++aCompIter, ++aNbComps)
2054 if (theArgVec[aCompIter][0] == '-')
2063 Quantity_NameOfColor aColor = Quantity_NOC_BLACK;
2064 Standard_CString aName = theArgVec[anArgIter + 1];
2065 if (!Quantity_Color::ColorFromName (aName, aColor))
2067 std::cout << "Error: unknown free boundary color name '" << aName << "'\n";
2070 aChangeSet->FreeBoundaryColor = aColor;
2075 Graphic3d_Vec3d anRgb;
2076 anRgb.x() = Draw::Atof (theArgVec[anArgIter + 1]);
2077 anRgb.y() = Draw::Atof (theArgVec[anArgIter + 2]);
2078 anRgb.z() = Draw::Atof (theArgVec[anArgIter + 3]);
2079 if (anRgb.x() < 0.0 || anRgb.x() > 1.0
2080 || anRgb.y() < 0.0 || anRgb.y() > 1.0
2081 || anRgb.z() < 0.0 || anRgb.z() > 1.0)
2083 std::cout << "Error: free boundary RGB color values should be within range 0..1!\n";
2086 aChangeSet->FreeBoundaryColor.SetValues (anRgb.x(), anRgb.y(), anRgb.z(), Quantity_TOC_RGB);
2091 std::cout << "Error: wrong syntax at " << anArg << "\n";
2095 aChangeSet->ToSetFreeBoundaryColor = 1;
2096 anArgIter += aNbComps;
2098 else if (anArg == "-unsetfreeboundarycolor"
2099 || anArg == "-unsetfbcolor")
2101 aChangeSet->ToSetFreeBoundaryColor = -1;
2102 aChangeSet->FreeBoundaryColor = DEFAULT_FREEBOUNDARY_COLOR;
2104 else if (anArg == "-unset")
2106 aChangeSet->ToSetVisibility = 1;
2107 aChangeSet->Visibility = 1;
2108 aChangeSet->ToSetLineWidth = -1;
2109 aChangeSet->LineWidth = 1.0;
2110 aChangeSet->ToSetTypeOfLine = -1;
2111 aChangeSet->TypeOfLine = Aspect_TOL_SOLID;
2112 aChangeSet->ToSetTransparency = -1;
2113 aChangeSet->Transparency = 0.0;
2114 aChangeSet->ToSetColor = -1;
2115 aChangeSet->Color = DEFAULT_COLOR;
2116 aChangeSet->ToSetMaterial = -1;
2117 aChangeSet->Material = Graphic3d_NOM_DEFAULT;
2118 aChangeSet->ToSetShowFreeBoundary = -1;
2119 aChangeSet->ToSetFreeBoundaryColor = -1;
2120 aChangeSet->FreeBoundaryColor = DEFAULT_FREEBOUNDARY_COLOR;
2121 aChangeSet->ToSetFreeBoundaryWidth = -1;
2122 aChangeSet->FreeBoundaryWidth = 1.0;
2124 else if (anArg == "-isoontriangulation"
2125 || anArg == "-isoontriang")
2127 if (++anArgIter >= theArgNb)
2129 std::cout << "Error: wrong syntax at " << anArg << "\n";
2132 TCollection_AsciiString aValue (theArgVec[anArgIter]);
2137 aChangeSet->ToEnableIsoOnTriangulation = 1;
2139 else if (aValue == "off"
2142 aChangeSet->ToEnableIsoOnTriangulation = 0;
2146 std::cout << "Error: wrong syntax at " << anArg << "\n";
2150 else if (anArg == "-setmaxparamvalue")
2152 if (++anArgIter >= theArgNb)
2154 std::cout << "Error: wrong syntax at " << anArg << "\n";
2157 aChangeSet->ToSetMaxParamValue = 1;
2158 aChangeSet->MaxParamValue = Draw::Atof (theArgVec[anArgIter]);
2160 else if (anArg == "-setsensitivity")
2164 std::cout << "Error: wrong syntax. -setSensitivity can not be used together with -defaults call!\n";
2168 if (aNames.IsEmpty())
2170 std::cout << "Error: object and selection mode should specified explicitly when -setSensitivity is used!\n";
2174 if (anArgIter + 2 >= theArgNb)
2176 std::cout << "Error: wrong syntax at " << anArg << "\n";
2179 aChangeSet->ToSetSensitivity = 1;
2180 aChangeSet->SelectionMode = Draw::Atoi (theArgVec[++anArgIter]);
2181 aChangeSet->Sensitivity = Draw::Atoi (theArgVec[++anArgIter]);
2185 std::cout << "Error: wrong syntax at " << anArg << "\n";
2190 Standard_Boolean isFirst = Standard_True;
2191 for (NCollection_Sequence<ViewerTest_AspectsChangeSet>::Iterator aChangesIter (aChanges);
2192 aChangesIter.More(); aChangesIter.Next())
2194 if (!aChangesIter.Value().Validate (!isFirst))
2198 isFirst = Standard_False;
2201 if (aCtx->HasOpenedContext())
2203 aCtx->CloseLocalContext();
2206 // special case for -defaults parameter.
2207 // all changed values will be set to DefaultDrawer.
2210 const Handle(Prs3d_Drawer)& aDrawer = aCtx->DefaultDrawer();
2212 if (aChangeSet->ToSetLineWidth != 0)
2214 aDrawer->LineAspect()->SetWidth (aChangeSet->LineWidth);
2215 aDrawer->WireAspect()->SetWidth (aChangeSet->LineWidth);
2216 aDrawer->UnFreeBoundaryAspect()->SetWidth (aChangeSet->LineWidth);
2217 aDrawer->SeenLineAspect()->SetWidth (aChangeSet->LineWidth);
2219 if (aChangeSet->ToSetColor != 0)
2221 aDrawer->ShadingAspect()->SetColor (aChangeSet->Color);
2222 aDrawer->LineAspect()->SetColor (aChangeSet->Color);
2223 aDrawer->UnFreeBoundaryAspect()->SetColor (aChangeSet->Color);
2224 aDrawer->SeenLineAspect()->SetColor (aChangeSet->Color);
2225 aDrawer->WireAspect()->SetColor (aChangeSet->Color);
2226 aDrawer->PointAspect()->SetColor (aChangeSet->Color);
2228 if (aChangeSet->ToSetTypeOfLine != 0)
2230 aDrawer->LineAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2231 aDrawer->WireAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2232 aDrawer->FreeBoundaryAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2233 aDrawer->UnFreeBoundaryAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2234 aDrawer->SeenLineAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2236 if (aChangeSet->ToSetTransparency != 0)
2238 aDrawer->ShadingAspect()->SetTransparency (aChangeSet->Transparency);
2240 if (aChangeSet->ToSetMaterial != 0)
2242 aDrawer->ShadingAspect()->SetMaterial (aChangeSet->Material);
2244 if (aChangeSet->ToSetShowFreeBoundary == 1)
2246 aDrawer->SetFreeBoundaryDraw (Standard_True);
2248 else if (aChangeSet->ToSetShowFreeBoundary == -1)
2250 aDrawer->SetFreeBoundaryDraw (Standard_False);
2252 if (aChangeSet->ToSetFreeBoundaryWidth != 0)
2254 aDrawer->FreeBoundaryAspect()->SetWidth (aChangeSet->FreeBoundaryWidth);
2256 if (aChangeSet->ToSetFreeBoundaryColor != 0)
2258 aDrawer->FreeBoundaryAspect()->SetColor (aChangeSet->FreeBoundaryColor);
2260 if (aChangeSet->ToEnableIsoOnTriangulation != -1)
2262 aDrawer->SetIsoOnTriangulation (aChangeSet->ToEnableIsoOnTriangulation == 1);
2264 if (aChangeSet->ToSetMaxParamValue != 0)
2266 aDrawer->SetMaximalParameterValue (aChangeSet->MaxParamValue);
2269 // redisplay all objects in context
2270 for (ViewTest_PrsIter aPrsIter (aNames); aPrsIter.More(); aPrsIter.Next())
2272 Handle(AIS_InteractiveObject) aPrs = aPrsIter.Current();
2275 aCtx->Redisplay (aPrs, Standard_False);
2281 for (ViewTest_PrsIter aPrsIter (aNames); aPrsIter.More(); aPrsIter.Next())
2283 const TCollection_AsciiString& aName = aPrsIter.CurrentName();
2284 Handle(AIS_InteractiveObject) aPrs = aPrsIter.Current();
2285 Handle(Prs3d_Drawer) aDrawer = aPrs->Attributes();
2286 Handle(AIS_ColoredShape) aColoredPrs;
2287 Standard_Boolean toDisplay = Standard_False;
2288 Standard_Boolean toRedisplay = Standard_False;
2289 if (aChanges.Length() > 1 || aChangeSet->ToSetVisibility == 1)
2291 Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast (aPrs);
2292 if (aShapePrs.IsNull())
2294 std::cout << "Error: an object " << aName << " is not an AIS_Shape presentation!\n";
2297 aColoredPrs = Handle(AIS_ColoredShape)::DownCast (aShapePrs);
2298 if (aColoredPrs.IsNull())
2300 aColoredPrs = new AIS_ColoredShape (aShapePrs);
2301 aCtx->Remove (aShapePrs, Standard_False);
2302 GetMapOfAIS().UnBind2 (aName);
2303 GetMapOfAIS().Bind (aColoredPrs, aName);
2304 toDisplay = Standard_True;
2305 aShapePrs = aColoredPrs;
2312 NCollection_Sequence<ViewerTest_AspectsChangeSet>::Iterator aChangesIter (aChanges);
2313 aChangeSet = &aChangesIter.ChangeValue();
2314 if (aChangeSet->ToSetVisibility == 1)
2316 Handle(AIS_ColoredDrawer) aColDrawer = aColoredPrs->CustomAspects (aColoredPrs->Shape());
2317 aColDrawer->SetHidden (aChangeSet->Visibility == 0);
2319 else if (aChangeSet->ToSetMaterial == 1)
2321 aCtx->SetMaterial (aPrs, aChangeSet->Material, Standard_False);
2323 else if (aChangeSet->ToSetMaterial == -1)
2325 aCtx->UnsetMaterial (aPrs, Standard_False);
2327 if (aChangeSet->ToSetColor == 1)
2329 aCtx->SetColor (aPrs, aChangeSet->Color, Standard_False);
2331 else if (aChangeSet->ToSetColor == -1)
2333 aCtx->UnsetColor (aPrs, Standard_False);
2335 if (aChangeSet->ToSetTransparency == 1)
2337 aCtx->SetTransparency (aPrs, aChangeSet->Transparency, Standard_False);
2339 else if (aChangeSet->ToSetTransparency == -1)
2341 aCtx->UnsetTransparency (aPrs, Standard_False);
2343 if (aChangeSet->ToSetLineWidth == 1)
2345 aCtx->SetWidth (aPrs, aChangeSet->LineWidth, Standard_False);
2347 else if (aChangeSet->ToSetLineWidth == -1)
2349 aCtx->UnsetWidth (aPrs, Standard_False);
2351 else if (aChangeSet->ToEnableIsoOnTriangulation != -1)
2353 aCtx->IsoOnTriangulation (aChangeSet->ToEnableIsoOnTriangulation == 1, aPrs);
2354 toRedisplay = Standard_True;
2356 else if (aChangeSet->ToSetSensitivity != 0)
2358 aCtx->SetSelectionSensitivity (aPrs, aChangeSet->SelectionMode, aChangeSet->Sensitivity);
2360 if (!aDrawer.IsNull())
2362 if (aChangeSet->ToSetShowFreeBoundary == 1)
2364 aDrawer->SetFreeBoundaryDraw (Standard_True);
2365 toRedisplay = Standard_True;
2367 else if (aChangeSet->ToSetShowFreeBoundary == -1)
2369 aDrawer->SetFreeBoundaryDraw (Standard_False);
2370 toRedisplay = Standard_True;
2372 if (aChangeSet->ToSetFreeBoundaryWidth != 0)
2374 Handle(Prs3d_LineAspect) aBoundaryAspect =
2375 new Prs3d_LineAspect (Quantity_NOC_RED, Aspect_TOL_SOLID, 1.0);
2376 *aBoundaryAspect->Aspect() = *aDrawer->FreeBoundaryAspect()->Aspect();
2377 aBoundaryAspect->SetWidth (aChangeSet->FreeBoundaryWidth);
2378 aDrawer->SetFreeBoundaryAspect (aBoundaryAspect);
2379 toRedisplay = Standard_True;
2381 if (aChangeSet->ToSetFreeBoundaryColor != 0)
2383 Handle(Prs3d_LineAspect) aBoundaryAspect =
2384 new Prs3d_LineAspect (Quantity_NOC_RED, Aspect_TOL_SOLID, 1.0);
2385 *aBoundaryAspect->Aspect() = *aDrawer->FreeBoundaryAspect()->Aspect();
2386 aBoundaryAspect->SetColor (aChangeSet->FreeBoundaryColor);
2387 aDrawer->SetFreeBoundaryAspect (aBoundaryAspect);
2388 toRedisplay = Standard_True;
2390 if (aChangeSet->ToSetTypeOfLine != 0)
2392 aDrawer->LineAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2393 aDrawer->WireAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2394 aDrawer->FreeBoundaryAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2395 aDrawer->UnFreeBoundaryAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2396 aDrawer->SeenLineAspect()->SetTypeOfLine (aChangeSet->TypeOfLine);
2397 toRedisplay = Standard_True;
2399 if (aChangeSet->ToSetMaxParamValue != 0)
2401 aDrawer->SetMaximalParameterValue (aChangeSet->MaxParamValue);
2405 for (aChangesIter.Next(); aChangesIter.More(); aChangesIter.Next())
2407 aChangeSet = &aChangesIter.ChangeValue();
2408 for (NCollection_Sequence<TopoDS_Shape>::Iterator aSubShapeIter (aChangeSet->SubShapes);
2409 aSubShapeIter.More(); aSubShapeIter.Next())
2411 const TopoDS_Shape& aSubShape = aSubShapeIter.Value();
2412 if (aChangeSet->ToSetVisibility == 1)
2414 Handle(AIS_ColoredDrawer) aCurColDrawer = aColoredPrs->CustomAspects (aSubShape);
2415 aCurColDrawer->SetHidden (aChangeSet->Visibility == 0);
2417 if (aChangeSet->ToSetColor == 1)
2419 aColoredPrs->SetCustomColor (aSubShape, aChangeSet->Color);
2421 if (aChangeSet->ToSetLineWidth == 1)
2423 aColoredPrs->SetCustomWidth (aSubShape, aChangeSet->LineWidth);
2425 if (aChangeSet->ToSetColor == -1
2426 || aChangeSet->ToSetLineWidth == -1)
2428 aColoredPrs->UnsetCustomAspects (aSubShape, Standard_True);
2430 if (aChangeSet->ToSetMaxParamValue != 0)
2432 Handle(AIS_ColoredDrawer) aCurColDrawer = aColoredPrs->CustomAspects (aSubShape);
2433 aCurColDrawer->SetMaximalParameterValue (aChangeSet->MaxParamValue);
2435 if (aChangeSet->ToSetSensitivity != 0)
2437 aCtx->SetSelectionSensitivity (aPrs, aChangeSet->SelectionMode, aChangeSet->Sensitivity);
2443 aCtx->Display (aPrs, Standard_False);
2447 aCtx->Redisplay (aPrs, Standard_False);
2449 else if (!aColoredPrs.IsNull())
2451 aCtx->Redisplay (aColoredPrs, Standard_False);
2458 //==============================================================================
2459 //function : VDonly2
2461 //purpose : Display only a selected or named object
2462 // if there is no selected or named object s, nothing is done
2463 //==============================================================================
2464 static int VDonly2 (Draw_Interpretor& ,
2465 Standard_Integer theArgNb,
2466 const char** theArgVec)
2468 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
2469 ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
2472 std::cerr << "Error: no active view!\n";
2476 if (aCtx->HasOpenedContext())
2478 aCtx->CloseLocalContext();
2481 Standard_Integer anArgIter = 1;
2482 for (; anArgIter < theArgNb; ++anArgIter)
2484 if (!anUpdateTool.parseRedrawMode (theArgVec[anArgIter]))
2490 NCollection_Map<Handle(Standard_Transient)> aDispSet;
2491 if (anArgIter >= theArgNb)
2493 // display only selected objects
2494 if (aCtx->NbSelected() < 1)
2499 for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
2501 aDispSet.Add (aCtx->SelectedInteractive());
2506 // display only specified objects
2507 for (; anArgIter < theArgNb; ++anArgIter)
2509 TCollection_AsciiString aName = theArgVec[anArgIter];
2510 if (GetMapOfAIS().IsBound2 (aName))
2512 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName));
2513 if (!aShape.IsNull())
2515 aCtx->Display (aShape, Standard_False);
2516 aDispSet.Add (aShape);
2522 // weed out other objects
2523 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS()); anIter.More(); anIter.Next())
2525 if (aDispSet.Contains (anIter.Key1()))
2530 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2531 if (aShape.IsNull())
2533 aCtx->Erase (aShape, Standard_False);
2539 //==============================================================================
2540 //function : VRemove
2541 //purpose : Removes selected or named objects.
2542 // If there is no selected or named objects,
2543 // all objects in the viewer can be removed with argument -all.
2544 // If -context is in arguments, the object is not deleted from the map of
2545 // objects (deleted only from the current context).
2546 //==============================================================================
2547 int VRemove (Draw_Interpretor& theDI,
2548 Standard_Integer theArgNb,
2549 const char** theArgVec)
2551 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
2552 ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
2555 std::cerr << "Error: no active view!\n";
2559 Standard_Boolean isContextOnly = Standard_False;
2560 Standard_Boolean toRemoveAll = Standard_False;
2561 Standard_Boolean toPrintInfo = Standard_True;
2562 Standard_Boolean toRemoveLocal = Standard_False;
2564 Standard_Integer anArgIter = 1;
2565 for (; anArgIter < theArgNb; ++anArgIter)
2567 TCollection_AsciiString anArg = theArgVec[anArgIter];
2569 if (anArg == "-context")
2571 isContextOnly = Standard_True;
2573 else if (anArg == "-all")
2575 toRemoveAll = Standard_True;
2577 else if (anArg == "-noinfo")
2579 toPrintInfo = Standard_False;
2581 else if (anArg == "-local")
2583 toRemoveLocal = Standard_True;
2585 else if (anUpdateTool.parseRedrawMode (anArg))
2595 && anArgIter < theArgNb)
2597 std::cerr << "Error: wrong syntax!\n";
2601 if (toRemoveLocal && !aCtx->HasOpenedContext())
2603 std::cerr << "Error: local selection context is not open.\n";
2606 else if (!toRemoveLocal && aCtx->HasOpenedContext())
2608 aCtx->CloseAllContexts (Standard_False);
2611 NCollection_List<TCollection_AsciiString> anIONameList;
2614 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2615 anIter.More(); anIter.Next())
2617 anIONameList.Append (anIter.Key2());
2620 else if (anArgIter < theArgNb) // removed objects names are in argument list
2622 for (; anArgIter < theArgNb; ++anArgIter)
2624 TCollection_AsciiString aName = theArgVec[anArgIter];
2625 if (!GetMapOfAIS().IsBound2 (aName))
2627 theDI << aName.ToCString() << " was not bound to some object.\n";
2631 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName));
2632 if (anIO->GetContext() != aCtx)
2634 theDI << aName.ToCString() << " was not displayed in current context.\n";
2635 theDI << "Please activate view with this object displayed and try again.\n";
2639 anIONameList.Append (aName);
2643 else if (aCtx->NbSelected() > 0)
2645 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2646 anIter.More(); anIter.Next())
2648 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2649 if (!aCtx->IsSelected (anIO))
2654 anIONameList.Append (anIter.Key2());
2659 // Unbind all removed objects from the map of displayed IO.
2660 for (NCollection_List<TCollection_AsciiString>::Iterator anIter (anIONameList);
2661 anIter.More(); anIter.Next())
2663 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anIter.Value()));
2664 aCtx->Remove (anIO, Standard_False);
2667 theDI << anIter.Value().ToCString() << " was removed\n";
2671 GetMapOfAIS().UnBind2 (anIter.Value());
2675 // Close local context if it is empty
2676 TColStd_MapOfTransient aLocalIO;
2677 if (aCtx->HasOpenedContext()
2678 && !aCtx->LocalContext()->DisplayedObjects (aLocalIO))
2680 aCtx->CloseAllContexts (Standard_False);
2686 //==============================================================================
2688 //purpose : Erase some selected or named objects
2689 // if there is no selected or named objects, the whole viewer is erased
2690 //==============================================================================
2691 int VErase (Draw_Interpretor& theDI,
2692 Standard_Integer theArgNb,
2693 const char** theArgVec)
2695 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
2696 const Handle(V3d_View)& aView = ViewerTest::CurrentView();
2697 ViewerTest_AutoUpdater anUpdateTool (aCtx, aView);
2700 std::cerr << "Error: no active view!\n";
2704 const Standard_Boolean toEraseAll = TCollection_AsciiString (theArgNb > 0 ? theArgVec[0] : "") == "veraseall";
2706 Standard_Integer anArgIter = 1;
2707 Standard_Boolean toEraseLocal = Standard_False;
2708 Standard_Boolean toEraseInView = Standard_False;
2709 TColStd_SequenceOfAsciiString aNamesOfEraseIO;
2710 for (; anArgIter < theArgNb; ++anArgIter)
2712 TCollection_AsciiString anArgCase (theArgVec[anArgIter]);
2713 anArgCase.LowerCase();
2714 if (anUpdateTool.parseRedrawMode (anArgCase))
2718 else if (anArgCase == "-local")
2720 toEraseLocal = Standard_True;
2722 else if (anArgCase == "-view"
2723 || anArgCase == "-inview")
2725 toEraseInView = Standard_True;
2729 aNamesOfEraseIO.Append (theArgVec[anArgIter]);
2733 if (!aNamesOfEraseIO.IsEmpty() && toEraseAll)
2735 std::cerr << "Error: wrong syntax, " << theArgVec[0] << " too much arguments.\n";
2739 if (toEraseLocal && !aCtx->HasOpenedContext())
2741 std::cerr << "Error: local selection context is not open.\n";
2744 else if (!toEraseLocal && aCtx->HasOpenedContext())
2746 aCtx->CloseAllContexts (Standard_False);
2749 if (!aNamesOfEraseIO.IsEmpty())
2751 // Erase named objects
2752 for (Standard_Integer anIter = 1; anIter <= aNamesOfEraseIO.Length(); ++anIter)
2754 TCollection_AsciiString aName = aNamesOfEraseIO.Value (anIter);
2755 if (!GetMapOfAIS().IsBound2 (aName))
2760 const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
2761 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anObj);
2762 theDI << aName.ToCString() << " ";
2767 aCtx->SetViewAffinity (anIO, aView, Standard_False);
2771 aCtx->Erase (anIO, Standard_False);
2776 else if (!toEraseAll && aCtx->NbSelected() > 0)
2778 // Erase selected objects
2779 const Standard_Boolean aHasOpenedContext = aCtx->HasOpenedContext();
2780 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2781 anIter.More(); anIter.Next())
2783 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2785 && aCtx->IsSelected (anIO))
2787 theDI << anIter.Key2().ToCString() << " ";
2790 aCtx->SetViewAffinity (anIO, aView, Standard_False);
2792 else if (aHasOpenedContext)
2794 aCtx->Erase (anIO, Standard_False);
2801 aCtx->EraseSelected (Standard_False);
2806 // Erase all objects
2807 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2808 anIter.More(); anIter.Next())
2810 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2815 aCtx->SetViewAffinity (anIO, aView, Standard_False);
2819 aCtx->Erase (anIO, Standard_False);
2828 //==============================================================================
2829 //function : VDisplayAll
2831 //purpose : Display all the objects of the Map
2832 //==============================================================================
2833 static int VDisplayAll (Draw_Interpretor& ,
2834 Standard_Integer theArgNb,
2835 const char** theArgVec)
2838 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
2839 ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
2842 std::cerr << "Error: no active view!\n";
2846 Standard_Integer anArgIter = 1;
2847 Standard_Boolean toDisplayLocal = Standard_False;
2848 for (; anArgIter < theArgNb; ++anArgIter)
2850 TCollection_AsciiString anArgCase (theArgVec[anArgIter]);
2851 anArgCase.LowerCase();
2852 if (anArgCase == "-local")
2854 toDisplayLocal = Standard_True;
2856 else if (anUpdateTool.parseRedrawMode (anArgCase))
2865 if (anArgIter < theArgNb)
2867 std::cout << theArgVec[0] << "Error: wrong syntax\n";
2871 if (toDisplayLocal && !aCtx->HasOpenedContext())
2873 std::cerr << "Error: local selection context is not open.\n";
2876 else if (!toDisplayLocal && aCtx->HasOpenedContext())
2878 aCtx->CloseLocalContext (Standard_False);
2881 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2882 anIter.More(); anIter.Next())
2884 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2885 aCtx->Erase (aShape, Standard_False);
2888 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2889 anIter.More(); anIter.Next())
2891 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2892 aCtx->Display (aShape, Standard_False);
2897 //! Auxiliary method to find presentation
2898 inline Handle(PrsMgr_Presentation) findPresentation (const Handle(AIS_InteractiveContext)& theCtx,
2899 const Handle(AIS_InteractiveObject)& theIO,
2900 const Standard_Integer theMode)
2904 return Handle(PrsMgr_Presentation)();
2909 if (theCtx->MainPrsMgr()->HasPresentation (theIO, theMode))
2911 return theCtx->MainPrsMgr()->Presentation (theIO, theMode);
2914 else if (theCtx->MainPrsMgr()->HasPresentation (theIO, theIO->DisplayMode()))
2916 return theCtx->MainPrsMgr()->Presentation (theIO, theIO->DisplayMode());
2918 else if (theCtx->MainPrsMgr()->HasPresentation (theIO, theCtx->DisplayMode()))
2920 return theCtx->MainPrsMgr()->Presentation (theIO, theCtx->DisplayMode());
2922 return Handle(PrsMgr_Presentation)();
2925 enum ViewerTest_BndAction
2932 //! Auxiliary method to print bounding box of presentation
2933 inline void bndPresentation (Draw_Interpretor& theDI,
2934 const Handle(PrsMgr_Presentation)& thePrs,
2935 const TCollection_AsciiString& theName,
2936 const ViewerTest_BndAction theAction)
2940 case BndAction_Hide:
2942 thePrs->Presentation()->GraphicUnHighlight();
2945 case BndAction_Show:
2947 Handle(Graphic3d_Structure) aPrs (thePrs->Presentation());
2948 aPrs->CStructure()->HighlightColor.r = 0.988235f;
2949 aPrs->CStructure()->HighlightColor.g = 0.988235f;
2950 aPrs->CStructure()->HighlightColor.b = 0.988235f;
2951 aPrs->CStructure()->HighlightWithBndBox (aPrs, Standard_True);
2954 case BndAction_Print:
2956 Bnd_Box aBox = thePrs->Presentation()->MinMaxValues();
2957 gp_Pnt aMin = aBox.CornerMin();
2958 gp_Pnt aMax = aBox.CornerMax();
2959 theDI << theName << "\n"
2960 << aMin.X() << " " << aMin.Y() << " " << aMin.Z() << " "
2961 << aMax.X() << " " << aMax.Y() << " " << aMax.Z() << "\n";
2967 //==============================================================================
2968 //function : VBounding
2970 //==============================================================================
2971 int VBounding (Draw_Interpretor& theDI,
2972 Standard_Integer theArgNb,
2973 const char** theArgVec)
2975 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
2976 ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
2979 std::cout << "Error: no active view!\n";
2983 ViewerTest_BndAction anAction = BndAction_Show;
2984 Standard_Integer aMode = -1;
2986 Standard_Integer anArgIter = 1;
2987 for (; anArgIter < theArgNb; ++anArgIter)
2989 TCollection_AsciiString anArg (theArgVec[anArgIter]);
2991 if (anArg == "-print")
2993 anAction = BndAction_Print;
2995 else if (anArg == "-show")
2997 anAction = BndAction_Show;
2999 else if (anArg == "-hide")
3001 anAction = BndAction_Hide;
3003 else if (anArg == "-mode")
3005 if (++anArgIter >= theArgNb)
3007 std::cout << "Error: wrong syntax at " << anArg << "\n";
3010 aMode = Draw::Atoi (theArgVec[anArgIter]);
3012 else if (!anUpdateTool.parseRedrawMode (anArg))
3018 if (anArgIter < theArgNb)
3020 // has a list of names
3021 for (; anArgIter < theArgNb; ++anArgIter)
3023 TCollection_AsciiString aName = theArgVec[anArgIter];
3024 if (!GetMapOfAIS().IsBound2 (aName))
3026 std::cout << "Error: presentation " << aName << " does not exist\n";
3030 Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName));
3031 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
3034 std::cout << "Error: presentation " << aName << " does not exist\n";
3037 bndPresentation (theDI, aPrs, aName, anAction);
3040 else if (aCtx->NbSelected() > 0)
3042 // remove all currently selected objects
3043 for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
3045 Handle(AIS_InteractiveObject) anIO = aCtx->SelectedInteractive();
3046 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
3049 bndPresentation (theDI, aPrs, GetMapOfAIS().IsBound1 (anIO) ? GetMapOfAIS().Find1 (anIO) : "", anAction);
3056 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
3057 anIter.More(); anIter.Next())
3059 Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
3060 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
3063 bndPresentation (theDI, aPrs, anIter.Key2(), anAction);
3070 //==============================================================================
3071 //function : VTexture
3073 //==============================================================================
3074 Standard_Integer VTexture (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgv)
3076 TCollection_AsciiString aCommandName (theArgv[0]);
3078 NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)> aMapOfArgs;
3079 if (aCommandName == "vtexture")
3083 std::cout << theArgv[0] << ": invalid arguments.\n";
3084 std::cout << "Type help for more information.\n";
3088 // look for options of vtexture command
3089 TCollection_AsciiString aParseKey;
3090 for (Standard_Integer anArgIt = 2; anArgIt < theArgsNb; ++anArgIt)
3092 TCollection_AsciiString anArg (theArgv [anArgIt]);
3095 if (anArg.Value (1) == '-' && !anArg.IsRealValue())
3098 aParseKey.Remove (1);
3099 aParseKey.UpperCase();
3100 aMapOfArgs.Bind (aParseKey, new TColStd_HSequenceOfAsciiString);
3104 if (aParseKey.IsEmpty())
3109 aMapOfArgs(aParseKey)->Append (anArg);
3112 else if (aCommandName == "vtexscale"
3113 || aCommandName == "vtexorigin"
3114 || aCommandName == "vtexrepeat")
3116 // scan for parameters of vtexscale, vtexorigin, vtexrepeat commands
3117 // equal to -scale, -origin, -repeat options of vtexture command
3118 if (theArgsNb < 2 || theArgsNb > 4)
3120 std::cout << theArgv[0] << ": invalid arguments.\n";
3121 std::cout << "Type help for more information.\n";
3125 Handle(TColStd_HSequenceOfAsciiString) anArgs = new TColStd_HSequenceOfAsciiString;
3128 anArgs->Append ("OFF");
3130 else if (theArgsNb == 4)
3132 anArgs->Append (TCollection_AsciiString (theArgv[2]));
3133 anArgs->Append (TCollection_AsciiString (theArgv[3]));
3136 TCollection_AsciiString anArgKey;
3137 if (aCommandName == "vtexscale")
3141 else if (aCommandName == "vtexorigin")
3143 anArgKey = "ORIGIN";
3147 anArgKey = "REPEAT";
3150 aMapOfArgs.Bind (anArgKey, anArgs);
3152 else if (aCommandName == "vtexdefault")
3154 // scan for parameters of vtexdefault command
3155 // equal to -default option of vtexture command
3156 aMapOfArgs.Bind ("DEFAULT", new TColStd_HSequenceOfAsciiString);
3159 // Check arguments for validity
3160 NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)>::Iterator aMapIt (aMapOfArgs);
3161 for (; aMapIt.More(); aMapIt.Next())
3163 const TCollection_AsciiString& aKey = aMapIt.Key();
3164 const Handle(TColStd_HSequenceOfAsciiString)& anArgs = aMapIt.Value();
3166 // -scale, -origin, -repeat: one argument "off", or two real values
3167 if ((aKey.IsEqual ("SCALE") || aKey.IsEqual ("ORIGIN") || aKey.IsEqual ("REPEAT"))
3168 && ((anArgs->Length() == 1 && anArgs->Value(1) == "OFF")
3169 || (anArgs->Length() == 2 && anArgs->Value(1).IsRealValue() && anArgs->Value(2).IsRealValue())))
3174 // -modulate: single argument "on" / "off"
3175 if (aKey.IsEqual ("MODULATE") && anArgs->Length() == 1 && (anArgs->Value(1) == "OFF" || anArgs->Value(1) == "ON"))
3180 // -default: no arguments
3181 if (aKey.IsEqual ("DEFAULT") && anArgs->IsEmpty())
3186 TCollection_AsciiString aLowerKey;
3189 aLowerKey.LowerCase();
3190 std::cout << theArgv[0] << ": " << aLowerKey << " is unknown option, or the arguments are unacceptable.\n";
3191 std::cout << "Type help for more information.\n";
3195 Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
3196 if (anAISContext.IsNull())
3198 std::cout << aCommandName << ": please use 'vinit' command to initialize view.\n";
3202 Standard_Integer aPreviousMode = 0;
3204 TCollection_AsciiString aShapeName (theArgv[1]);
3205 Handle(AIS_InteractiveObject) anIO;
3207 const ViewerTest_DoubleMapOfInteractiveAndName& aMapOfIO = GetMapOfAIS();
3208 if (aMapOfIO.IsBound2 (aShapeName))
3210 anIO = Handle(AIS_InteractiveObject)::DownCast (aMapOfIO.Find2 (aShapeName));
3215 std::cout << aCommandName << ": shape " << aShapeName << " does not exists.\n";
3219 Handle(AIS_TexturedShape) aTexturedIO;
3220 if (anIO->IsKind (STANDARD_TYPE (AIS_TexturedShape)))
3222 aTexturedIO = Handle(AIS_TexturedShape)::DownCast (anIO);
3223 aPreviousMode = aTexturedIO->DisplayMode();
3227 aTexturedIO = new AIS_TexturedShape (DBRep::Get (theArgv[1]));
3229 if (anIO->HasTransformation())
3231 const gp_Trsf& aLocalTrsf = anIO->LocalTransformation();
3232 aTexturedIO->SetLocalTransformation (aLocalTrsf);
3235 anAISContext->Remove (anIO, Standard_False);
3236 GetMapOfAIS().UnBind1 (anIO);
3237 GetMapOfAIS().UnBind2 (aShapeName);
3238 GetMapOfAIS().Bind (aTexturedIO, aShapeName);
3241 // -------------------------------------------
3242 // Turn texturing on/off - only for vtexture
3243 // -------------------------------------------
3245 if (aCommandName == "vtexture")
3247 TCollection_AsciiString aTextureArg (theArgsNb > 2 ? theArgv[2] : "");
3249 if (aTextureArg.IsEmpty())
3251 std::cout << aCommandName << ": Texture mapping disabled.\n";
3252 std::cout << "To enable it, use 'vtexture NameOfShape NameOfTexture'\n\n";
3254 anAISContext->SetDisplayMode (aTexturedIO, AIS_Shaded, Standard_False);
3255 if (aPreviousMode == 3)
3257 anAISContext->RecomputePrsOnly (aTexturedIO);
3260 anAISContext->Display (aTexturedIO, Standard_True);
3263 else if (aTextureArg.Value(1) != '-') // "-option" on place of texture argument
3265 if (aTextureArg == "?")
3267 TCollection_AsciiString aTextureFolder = Graphic3d_TextureRoot::TexturesFolder();
3269 theDi << "\n Files in current directory : \n\n";
3270 theDi.Eval ("glob -nocomplain *");
3272 TCollection_AsciiString aCmnd ("glob -nocomplain ");
3273 aCmnd += aTextureFolder;
3276 theDi << "Files in " << aTextureFolder.ToCString() << " : \n\n";
3277 theDi.Eval (aCmnd.ToCString());
3282 aTexturedIO->SetTextureFileName (aTextureArg);
3287 // ------------------------------------
3288 // Process other options and commands
3289 // ------------------------------------
3291 Handle(TColStd_HSequenceOfAsciiString) aValues;
3292 if (aMapOfArgs.Find ("DEFAULT", aValues))
3294 aTexturedIO->SetTextureRepeat (Standard_False);
3295 aTexturedIO->SetTextureOrigin (Standard_False);
3296 aTexturedIO->SetTextureScale (Standard_False);
3297 aTexturedIO->EnableTextureModulate();
3301 if (aMapOfArgs.Find ("SCALE", aValues))
3303 if (aValues->Value(1) != "OFF")
3305 aTexturedIO->SetTextureScale (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
3309 aTexturedIO->SetTextureScale (Standard_False);
3313 if (aMapOfArgs.Find ("ORIGIN", aValues))
3315 if (aValues->Value(1) != "OFF")
3317 aTexturedIO->SetTextureOrigin (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
3321 aTexturedIO->SetTextureOrigin (Standard_False);
3325 if (aMapOfArgs.Find ("REPEAT", aValues))
3327 if (aValues->Value(1) != "OFF")
3329 aTexturedIO->SetTextureRepeat (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
3333 aTexturedIO->SetTextureRepeat (Standard_False);
3337 if (aMapOfArgs.Find ("MODULATE", aValues))
3339 if (aValues->Value(1) == "ON")
3341 aTexturedIO->EnableTextureModulate();
3345 aTexturedIO->DisableTextureModulate();
3350 if (aTexturedIO->DisplayMode() == 3 || aPreviousMode == 3)
3352 anAISContext->RecomputePrsOnly (aTexturedIO);
3356 anAISContext->SetDisplayMode (aTexturedIO, 3, Standard_False);
3357 anAISContext->Display (aTexturedIO, Standard_True);
3358 anAISContext->Update (aTexturedIO,Standard_True);
3364 //! Auxiliary method to parse transformation persistence flags
3365 inline Standard_Boolean parseTrsfPersFlag (const TCollection_AsciiString& theFlagString,
3366 Standard_Integer& theFlags)
3368 if (theFlagString == "pan")
3370 theFlags |= Graphic3d_TMF_PanPers;
3372 else if (theFlagString == "zoom")
3374 theFlags |= Graphic3d_TMF_ZoomPers;
3376 else if (theFlagString == "rotate")
3378 theFlags |= Graphic3d_TMF_RotatePers;
3380 else if (theFlagString == "trihedron")
3382 theFlags = Graphic3d_TMF_TriedronPers;
3384 else if (theFlagString == "full")
3386 theFlags = Graphic3d_TMF_FullPers;
3388 else if (theFlagString == "none")
3390 theFlags = Graphic3d_TMF_None;
3394 return Standard_False;
3397 return Standard_True;
3400 //==============================================================================
3401 //function : VDisplay2
3403 //purpose : Display an object from its name
3404 //==============================================================================
3405 static int VDisplay2 (Draw_Interpretor& theDI,
3406 Standard_Integer theArgNb,
3407 const char** theArgVec)
3411 std::cerr << theArgVec[0] << "Error: wrong number of arguments.\n";
3415 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
3418 ViewerTest::ViewerInit();
3419 aCtx = ViewerTest::GetAISContext();
3422 // Parse input arguments
3423 ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
3424 Standard_Integer isMutable = -1;
3425 Graphic3d_ZLayerId aZLayer = Graphic3d_ZLayerId_UNKNOWN;
3426 Standard_Boolean toDisplayLocal = Standard_False;
3427 Standard_Boolean toReDisplay = Standard_False;
3428 Standard_Integer isSelectable = -1;
3429 Standard_Integer anObjDispMode = -2;
3430 Standard_Integer anObjHighMode = -2;
3431 Standard_Boolean toSetTrsfPers = Standard_False;
3432 Graphic3d_TransModeFlags aTrsfPersFlags = Graphic3d_TMF_None;
3434 TColStd_SequenceOfAsciiString aNamesOfDisplayIO;
3435 AIS_DisplayStatus aDispStatus = AIS_DS_None;
3436 Standard_Integer toDisplayInView = Standard_False;
3437 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
3439 const TCollection_AsciiString aName = theArgVec[anArgIter];
3440 TCollection_AsciiString aNameCase = aName;
3441 aNameCase.LowerCase();
3442 if (anUpdateTool.parseRedrawMode (aName))
3446 else if (aNameCase == "-mutable")
3450 else if (aNameCase == "-neutral")
3452 aDispStatus = AIS_DS_Displayed;
3454 else if (aNameCase == "-immediate"
3455 || aNameCase == "-top")
3457 aZLayer = Graphic3d_ZLayerId_Top;
3459 else if (aNameCase == "-topmost")
3461 aZLayer = Graphic3d_ZLayerId_Topmost;
3463 else if (aNameCase == "-osd"
3464 || aNameCase == "-toposd"
3465 || aNameCase == "-overlay")
3467 aZLayer = Graphic3d_ZLayerId_TopOSD;
3469 else if (aNameCase == "-botosd"
3470 || aNameCase == "-underlay")
3472 aZLayer = Graphic3d_ZLayerId_BotOSD;
3474 else if (aNameCase == "-select"
3475 || aNameCase == "-selectable")
3479 else if (aNameCase == "-noselect"
3480 || aNameCase == "-noselection")
3484 else if (aNameCase == "-dispmode"
3485 || aNameCase == "-displaymode")
3487 if (++anArgIter >= theArgNb)
3489 std::cerr << "Error: wrong syntax at " << aName << ".\n";
3493 anObjDispMode = Draw::Atoi (theArgVec [anArgIter]);
3495 else if (aNameCase == "-highmode"
3496 || aNameCase == "-highlightmode")
3498 if (++anArgIter >= theArgNb)
3500 std::cerr << "Error: wrong syntax at " << aName << ".\n";
3504 anObjHighMode = Draw::Atoi (theArgVec [anArgIter]);
3506 else if (aNameCase == "-3d")
3508 toSetTrsfPers = Standard_True;
3509 aTrsfPersFlags = Graphic3d_TMF_None;
3511 else if (aNameCase == "-2d")
3513 toSetTrsfPers = Standard_True;
3514 aTrsfPersFlags = Graphic3d_TMF_2d;
3516 else if (aNameCase == "-2dtopdown")
3518 toSetTrsfPers = Standard_True;
3519 aTrsfPersFlags = Graphic3d_TMF_2d | Graphic3d_TMF_2d_IsTopDown;
3521 else if (aNameCase == "-trsfpers"
3522 || aNameCase == "-pers")
3524 if (++anArgIter >= theArgNb)
3526 std::cerr << "Error: wrong syntax at " << aName << ".\n";
3530 toSetTrsfPers = Standard_True;
3531 aTrsfPersFlags = Graphic3d_TMF_None;
3532 TCollection_AsciiString aPersFlags (theArgVec [anArgIter]);
3533 aPersFlags.LowerCase();
3534 for (Standard_Integer aParserPos = aPersFlags.Search ("|");; aParserPos = aPersFlags.Search ("|"))
3536 if (aParserPos == -1)
3538 if (!parseTrsfPersFlag (aPersFlags, aTrsfPersFlags))
3540 std::cerr << "Error: wrong transform persistence flags " << theArgVec [anArgIter] << ".\n";
3546 TCollection_AsciiString anOtherFlags = aPersFlags.Split (aParserPos - 1);
3547 if (!parseTrsfPersFlag (aPersFlags, aTrsfPersFlags))
3549 std::cerr << "Error: wrong transform persistence flags " << theArgVec [anArgIter] << ".\n";
3552 aPersFlags = anOtherFlags;
3555 else if (aNameCase == "-trsfperspos"
3556 || aNameCase == "-perspos")
3558 if (anArgIter + 2 >= theArgNb)
3560 std::cerr << "Error: wrong syntax at " << aName << ".\n";
3564 TCollection_AsciiString aX (theArgVec[++anArgIter]);
3565 TCollection_AsciiString aY (theArgVec[++anArgIter]);
3566 TCollection_AsciiString aZ = "0";
3567 if (!aX.IsIntegerValue()
3568 || !aY.IsIntegerValue())
3570 std::cerr << "Error: wrong syntax at " << aName << ".\n";
3573 if (anArgIter + 1 < theArgNb)
3575 TCollection_AsciiString aTemp = theArgVec[anArgIter + 1];
3576 if (aTemp.IsIntegerValue())
3582 aTPPosition.SetCoord (aX.IntegerValue(), aY.IntegerValue(), aZ.IntegerValue());
3584 else if (aNameCase == "-layer")
3586 if (++anArgIter >= theArgNb)
3588 std::cerr << "Error: wrong syntax at " << aName << ".\n";
3592 TCollection_AsciiString aValue (theArgVec[anArgIter]);
3593 if (!aValue.IsIntegerValue())
3595 std::cerr << "Error: wrong syntax at " << aName << ".\n";
3599 aZLayer = aValue.IntegerValue();
3601 else if (aNameCase == "-view"
3602 || aNameCase == "-inview")
3604 toDisplayInView = Standard_True;
3606 else if (aNameCase == "-local")
3608 aDispStatus = AIS_DS_Temporary;
3609 toDisplayLocal = Standard_True;
3611 else if (aNameCase == "-redisplay")
3613 toReDisplay = Standard_True;
3617 aNamesOfDisplayIO.Append (aName);
3621 if (aNamesOfDisplayIO.IsEmpty())
3623 std::cerr << theArgVec[0] << "Error: wrong number of arguments.\n";
3627 // Prepare context for display
3628 if (toDisplayLocal && !aCtx->HasOpenedContext())
3630 aCtx->OpenLocalContext (Standard_False);
3632 else if (!toDisplayLocal && aCtx->HasOpenedContext())
3634 aCtx->CloseAllContexts (Standard_False);
3637 // Display interactive objects
3638 for (Standard_Integer anIter = 1; anIter <= aNamesOfDisplayIO.Length(); ++anIter)
3640 const TCollection_AsciiString& aName = aNamesOfDisplayIO.Value(anIter);
3642 if (!GetMapOfAIS().IsBound2 (aName))
3644 // create the AIS_Shape from a name
3645 const Handle(AIS_InteractiveObject) aShape = GetAISShapeFromName (aName.ToCString());
3646 if (!aShape.IsNull())
3648 if (isMutable != -1)
3650 aShape->SetMutable (isMutable == 1);
3652 if (aZLayer != Graphic3d_ZLayerId_UNKNOWN)
3654 aShape->SetZLayer (aZLayer);
3658 aShape->SetTransformPersistence (aTrsfPersFlags, aTPPosition);
3660 if (anObjDispMode != -2)
3662 aShape->SetDisplayMode (anObjDispMode);
3664 if (anObjHighMode != -2)
3666 aShape->SetHilightMode (anObjHighMode);
3668 if (!toDisplayLocal)
3669 GetMapOfAIS().Bind (aShape, aName);
3671 Standard_Integer aDispMode = aShape->HasDisplayMode()
3672 ? aShape->DisplayMode()
3673 : (aShape->AcceptDisplayMode (aCtx->DisplayMode())
3674 ? aCtx->DisplayMode()
3676 Standard_Integer aSelMode = -1;
3677 if (isSelectable == 1 || (isSelectable == -1 && aCtx->GetAutoActivateSelection()))
3679 aSelMode = aShape->GlobalSelectionMode();
3682 aCtx->Display (aShape, aDispMode, aSelMode,
3683 Standard_False, aShape->AcceptShapeDecomposition(),
3685 if (toDisplayInView)
3687 for (aCtx->CurrentViewer()->InitDefinedViews(); aCtx->CurrentViewer()->MoreDefinedViews(); aCtx->CurrentViewer()->NextDefinedViews())
3689 aCtx->SetViewAffinity (aShape, aCtx->CurrentViewer()->DefinedView(), Standard_False);
3691 aCtx->SetViewAffinity (aShape, ViewerTest::CurrentView(), Standard_True);
3696 std::cerr << "Error: object with name '" << aName << "' does not exist!\n";
3701 Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName));
3702 if (isMutable != -1)
3704 aShape->SetMutable (isMutable == 1);
3706 if (aZLayer != Graphic3d_ZLayerId_UNKNOWN)
3708 aShape->SetZLayer (aZLayer);
3712 aShape->SetTransformPersistence (aTrsfPersFlags, aTPPosition);
3714 if (anObjDispMode != -2)
3716 aShape->SetDisplayMode (anObjDispMode);
3718 if (anObjHighMode != -2)
3720 aShape->SetHilightMode (anObjHighMode);
3722 Standard_Integer aDispMode = aShape->HasDisplayMode()
3723 ? aShape->DisplayMode()
3724 : (aShape->AcceptDisplayMode (aCtx->DisplayMode())
3725 ? aCtx->DisplayMode()
3727 Standard_Integer aSelMode = -1;
3728 if (isSelectable == 1 || (isSelectable == -1 && aCtx->GetAutoActivateSelection()))
3730 aSelMode = aShape->GlobalSelectionMode();
3733 if (aShape->Type() == AIS_KOI_Datum)
3735 aCtx->Display (aShape, Standard_False);
3739 theDI << "Display " << aName.ToCString() << "\n";
3741 // update the Shape in the AIS_Shape
3742 TopoDS_Shape aNewShape = GetShapeFromName (aName.ToCString());
3743 Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aShape);
3744 if (!aShapePrs.IsNull())
3746 if (!aShapePrs->Shape().IsEqual (aNewShape))
3748 toReDisplay = Standard_True;
3750 aShapePrs->Set (aNewShape);
3754 aCtx->Redisplay (aShape, Standard_False);
3759 aCtx->Erase (aShape);
3761 aCtx->Display (aShape, aDispMode, aSelMode,
3762 Standard_False, aShape->AcceptShapeDecomposition(),
3764 if (toDisplayInView)
3766 aCtx->SetViewAffinity (aShape, ViewerTest::CurrentView(), Standard_True);
3774 //===============================================================================================
3775 //function : VUpdate
3777 //===============================================================================================
3778 static int VUpdate (Draw_Interpretor& /*theDi*/, Standard_Integer theArgsNb, const char** theArgVec)
3780 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
3781 if (aContextAIS.IsNull())
3783 std::cout << theArgVec[0] << "AIS context is not available.\n";
3789 std::cout << theArgVec[0] << ": insufficient arguments. Type help for more information.\n";
3793 const ViewerTest_DoubleMapOfInteractiveAndName& anAISMap = GetMapOfAIS();
3795 AIS_ListOfInteractive aListOfIO;
3797 for (int anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
3799 TCollection_AsciiString aName = TCollection_AsciiString (theArgVec[anArgIt]);
3801 Handle(AIS_InteractiveObject) anAISObj;
3802 if (anAISMap.IsBound2 (aName))
3804 anAISObj = Handle(AIS_InteractiveObject)::DownCast (anAISMap.Find2 (aName));
3807 if (anAISObj.IsNull())
3809 std::cout << theArgVec[0] << ": no AIS interactive object named \"" << aName << "\".\n";
3813 aListOfIO.Append (anAISObj);
3816 AIS_ListIteratorOfListOfInteractive anIOIt (aListOfIO);
3817 for (; anIOIt.More(); anIOIt.Next())
3819 aContextAIS->Update (anIOIt.Value(), Standard_False);
3822 aContextAIS->UpdateCurrentViewer();
3827 //==============================================================================
3829 //purpose : Test the annimation of an object along a
3830 // predifined trajectory
3831 //Draw arg : vperf ShapeName 1/0(Transfo/Location) 1/0(Primitives sensibles ON/OFF)
3832 //==============================================================================
3834 static int VPerf(Draw_Interpretor& di, Standard_Integer , const char** argv) {
3837 if (TheAISContext()->HasOpenedContext())
3838 TheAISContext()->CloseLocalContext();
3840 Standard_Real Step=4*M_PI/180;
3841 Standard_Real Angle=0;
3843 Handle(AIS_InteractiveObject) aIO;
3844 if (GetMapOfAIS().IsBound2(argv[1]))
3845 aIO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(argv[1]));
3849 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aIO);
3853 if (Draw::Atoi(argv[3])==1 ) {
3854 di<<" Primitives sensibles OFF\n";
3855 TheAISContext()->Deactivate(aIO);
3858 di<<" Primitives sensibles ON\n";
3860 // Movement par transformation
3861 if(Draw::Atoi(argv[2]) ==1) {
3862 di<<" Calcul par Transformation\n";
3863 for (Standard_Real myAngle=0;Angle<10*2*M_PI; myAngle++) {
3867 myTransfo.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1) ) ,Angle );
3868 TheAISContext()->SetLocation(aShape,myTransfo);
3869 TheAISContext() ->UpdateCurrentViewer();
3874 di<<" Calcul par Locations\n";
3875 gp_Trsf myAngleTrsf;
3876 myAngleTrsf.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1) ), Step );
3877 TopLoc_Location myDeltaAngle (myAngleTrsf);
3878 TopLoc_Location myTrueLoc;
3880 for (Standard_Real myAngle=0;Angle<10*2*M_PI; myAngle++) {
3883 myTrueLoc=myTrueLoc*myDeltaAngle;
3884 TheAISContext()->SetLocation(aShape,myTrueLoc );
3885 TheAISContext() ->UpdateCurrentViewer();
3888 if (Draw::Atoi(argv[3])==1 ){
3889 // On reactive la selection des primitives sensibles
3890 TheAISContext()->Activate(aIO,0);
3892 a3DView() -> Redraw();
3894 di<<" Temps ecoule \n";
3900 //==================================================================================
3901 // Function : VAnimation
3902 //==================================================================================
3903 static int VAnimation (Draw_Interpretor& di, Standard_Integer argc, const char** argv) {
3905 di<<"Use: "<<argv[0]<<" CrankArmFile CylinderHeadFile PropellerFile EngineBlockFile\n";
3909 Standard_Real thread = 4;
3910 Standard_Real angleA=0;
3911 Standard_Real angleB;
3913 gp_Ax1 Ax1(gp_Pnt(0,0,0),gp_Vec(0,0,1));
3916 TopoDS_Shape CrankArm;
3917 TopoDS_Shape CylinderHead;
3918 TopoDS_Shape Propeller;
3919 TopoDS_Shape EngineBlock;
3921 //BRepTools::Read(CrankArm,"/dp_26/Indus/ege/assemblage/CrankArm.rle",B);
3922 //BRepTools::Read(CylinderHead,"/dp_26/Indus/ege/assemblage/CylinderHead.rle",B);
3923 //BRepTools::Read(Propeller,"/dp_26/Indus/ege/assemblage/Propeller.rle",B);
3924 //BRepTools::Read(EngineBlock,"/dp_26/Indus/ege/assemblage/EngineBlock.rle",B);
3925 BRepTools::Read(CrankArm,argv[1],B);
3926 BRepTools::Read(CylinderHead,argv[2],B);
3927 BRepTools::Read(Propeller,argv[3],B);
3928 BRepTools::Read(EngineBlock,argv[4],B);
3930 if (CrankArm.IsNull() || CylinderHead.IsNull() || Propeller.IsNull() || EngineBlock.IsNull()) {di<<" Syntaxe error:loading failure.\n";}
3936 Handle(AIS_Shape) myAisCylinderHead = new AIS_Shape (CylinderHead);
3937 Handle(AIS_Shape) myAisEngineBlock = new AIS_Shape (EngineBlock);
3938 Handle(AIS_Shape) myAisCrankArm = new AIS_Shape (CrankArm);
3939 Handle(AIS_Shape) myAisPropeller = new AIS_Shape (Propeller);
3941 GetMapOfAIS().Bind(myAisCylinderHead,"a");
3942 GetMapOfAIS().Bind(myAisEngineBlock,"b");
3943 GetMapOfAIS().Bind(myAisCrankArm,"c");
3944 GetMapOfAIS().Bind(myAisPropeller,"d");
3946 myAisCylinderHead->SetMutable (Standard_True);
3947 myAisEngineBlock ->SetMutable (Standard_True);
3948 myAisCrankArm ->SetMutable (Standard_True);
3949 myAisPropeller ->SetMutable (Standard_True);
3951 TheAISContext()->SetColor (myAisCylinderHead, Quantity_NOC_INDIANRED);
3952 TheAISContext()->SetColor (myAisEngineBlock, Quantity_NOC_RED);
3953 TheAISContext()->SetColor (myAisPropeller, Quantity_NOC_GREEN);
3955 TheAISContext()->Display (myAisCylinderHead, Standard_False);
3956 TheAISContext()->Display (myAisEngineBlock, Standard_False);
3957 TheAISContext()->Display (myAisCrankArm, Standard_False);
3958 TheAISContext()->Display (myAisPropeller, Standard_False);
3960 TheAISContext()->Deactivate(myAisCylinderHead);
3961 TheAISContext()->Deactivate(myAisEngineBlock );
3962 TheAISContext()->Deactivate(myAisCrankArm );
3963 TheAISContext()->Deactivate(myAisPropeller );
3965 // Boucle de mouvement
3966 for (Standard_Real myAngle = 0;angleA<2*M_PI*10.175 ;myAngle++) {
3968 angleA = thread*myAngle*M_PI/180;
3969 X = Sin(angleA)*3/8;
3970 angleB = atan(X / Sqrt(-X * X + 1));
3971 Standard_Real decal(25*0.6);
3974 //Build a transformation on the display
3975 gp_Trsf aPropellerTrsf;
3976 aPropellerTrsf.SetRotation(Ax1,angleA);
3977 TheAISContext()->SetLocation(myAisPropeller,aPropellerTrsf);
3979 gp_Ax3 base(gp_Pnt(3*decal*(1-Cos(angleA)),-3*decal*Sin(angleA),0),gp_Vec(0,0,1),gp_Vec(1,0,0));
3980 gp_Trsf aCrankArmTrsf;
3981 aCrankArmTrsf.SetTransformation( base.Rotated(gp_Ax1(gp_Pnt(3*decal,0,0),gp_Dir(0,0,1)),angleB));
3982 TheAISContext()->SetLocation(myAisCrankArm,aCrankArmTrsf);
3984 TheAISContext()->UpdateCurrentViewer();
3987 TopoDS_Shape myNewCrankArm =myAisCrankArm ->Shape().Located( myAisCrankArm ->Transformation() );
3988 TopoDS_Shape myNewPropeller =myAisPropeller->Shape().Located( myAisPropeller->Transformation() );
3990 myAisCrankArm ->ResetTransformation();
3991 myAisPropeller->ResetTransformation();
3993 myAisCrankArm -> Set(myNewCrankArm );
3994 myAisPropeller -> Set(myNewPropeller);
3996 TheAISContext()->Activate(myAisCylinderHead,0);
3997 TheAISContext()->Activate(myAisEngineBlock,0 );
3998 TheAISContext()->Activate(myAisCrankArm ,0 );
3999 TheAISContext()->Activate(myAisPropeller ,0 );
4005 TheAISContext()->Redisplay(myAisCrankArm ,Standard_False);
4006 TheAISContext()->Redisplay(myAisPropeller,Standard_False);
4008 TheAISContext()->UpdateCurrentViewer();
4009 a3DView()->Redraw();
4018 //==============================================================================
4019 //function : VShading
4020 //purpose : Sharpen or roughten the quality of the shading
4021 //Draw arg : vshading ShapeName 0.1->0.00001 1 deg-> 30 deg
4022 //==============================================================================
4023 static int VShading(Draw_Interpretor& ,Standard_Integer argc, const char** argv)
4025 Standard_Real myDevCoef;
4026 Handle(AIS_InteractiveObject) TheAisIO;
4029 const Standard_Boolean HaveToSet = (strcasecmp(argv[0],"vsetshading") == 0);
4031 if (TheAISContext()->HasOpenedContext())
4032 TheAISContext()->CloseLocalContext();
4037 myDevCoef =Draw::Atof(argv[2]);
4040 TCollection_AsciiString name=argv[1];
4041 if (GetMapOfAIS().IsBound2(name ))
4042 TheAisIO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
4043 if (TheAisIO.IsNull())
4044 TheAisIO=GetAISShapeFromName((const char *)name.ToCString());
4047 TheAISContext()->SetDeviationCoefficient(TheAisIO,myDevCoef,Standard_True);
4049 TheAISContext()->SetDeviationCoefficient(TheAisIO,0.0008,Standard_True);
4051 TheAISContext()->Redisplay(TheAisIO);
4054 //==============================================================================
4055 //function : HaveMode
4056 //use : VActivatedModes
4057 //==============================================================================
4058 #include <TColStd_ListIteratorOfListOfInteger.hxx>
4060 Standard_Boolean HaveMode(const Handle(AIS_InteractiveObject)& TheAisIO,const Standard_Integer mode )
4062 TColStd_ListOfInteger List;
4063 TheAISContext()->ActivatedModes (TheAisIO,List);
4064 TColStd_ListIteratorOfListOfInteger it;
4065 Standard_Boolean Found=Standard_False;
4066 for (it.Initialize(List); it.More()&&!Found; it.Next() ){
4067 if (it.Value()==mode ) Found=Standard_True;
4074 //==============================================================================
4075 //function : VActivatedMode
4077 //purpose : permet d'attribuer a chacune des shapes un mode d'activation
4078 // (edges,vertex...)qui lui est propre et le mode de selection standard.
4079 // La fonction s'applique aux shapes selectionnees(current ou selected dans le viewer)
4080 // Dans le cas ou on veut psser la shape en argument, la fonction n'autorise
4081 // qu'un nom et qu'un mode.
4082 //Draw arg : vsetam [ShapeName] mode(0,1,2,3,4,5,6,7)
4083 //==============================================================================
4084 #include <AIS_ListIteratorOfListOfInteractive.hxx>
4086 static int VActivatedMode (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
4089 Standard_Boolean ThereIsName = Standard_False ;
4091 if(!a3DView().IsNull()){
4093 const Standard_Boolean HaveToSet = (strcasecmp(argv[0],"vsetam") == 0);
4094 // verification des arguments
4096 if (argc<2||argc>3) { di<<" Syntaxe error\n";return 1;}
4097 ThereIsName = (argc == 3);
4101 if (argc>1) {di<<" Syntaxe error\n";return 1;}
4103 di<<" R.A.Z de tous les modes de selecion\n";
4104 di<<" Fermeture du Context local\n";
4105 if (TheAISContext()->HasOpenedContext())
4106 TheAISContext()->CloseLocalContext();
4110 // IL n'y a aps de nom de shape passe en argument
4111 if (HaveToSet && !ThereIsName){
4112 Standard_Integer aMode=Draw::Atoi(argv [1]);
4114 const char *cmode="???";
4116 case 0: cmode = "Shape"; break;
4117 case 1: cmode = "Vertex"; break;
4118 case 2: cmode = "Edge"; break;
4119 case 3: cmode = "Wire"; break;
4120 case 4: cmode = "Face"; break;
4121 case 5: cmode = "Shell"; break;
4122 case 6: cmode = "Solid"; break;
4123 case 7: cmode = "Compound"; break;
4126 if( !TheAISContext()->HasOpenedContext() ) {
4127 // il n'y a pas de Context local d'ouvert
4128 // on en ouvre un et on charge toutes les shapes displayees
4129 // on load tous les objets displayees et on Activate les objets de la liste
4130 AIS_ListOfInteractive ListOfIO;
4131 // on sauve dans une AISListOfInteractive tous les objets currents
4132 if (TheAISContext()->NbSelected()>0 ){
4133 TheAISContext()->UnhilightSelected(Standard_False);
4135 for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
4136 ListOfIO.Append(TheAISContext()->SelectedInteractive() );
4140 TheAISContext()->OpenLocalContext(Standard_False);
4141 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
4144 Handle(AIS_InteractiveObject) aIO =
4145 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
4147 TheAISContext()->Load(aIO,0,Standard_False);
4150 // traitement des objets qui etaient currents dans le Contexte global
4151 if (!ListOfIO.IsEmpty() ) {
4152 // il y avait des objets currents
4153 AIS_ListIteratorOfListOfInteractive iter;
4154 for (iter.Initialize(ListOfIO); iter.More() ; iter.Next() ) {
4155 Handle(AIS_InteractiveObject) aIO=iter.Value();
4156 TheAISContext()->Activate(aIO,aMode);
4157 di<<" Mode: "<<cmode<<" ON pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
4161 // On applique le mode a tous les objets displayes
4162 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
4163 it2 (GetMapOfAIS());
4165 Handle(AIS_InteractiveObject) aIO =
4166 Handle(AIS_InteractiveObject)::DownCast(it2.Key1());
4167 if (!aIO.IsNull()) {
4168 di<<" Mode: "<<cmode<<" ON pour "<<it2.Key2().ToCString() <<"\n";
4169 TheAISContext()->Activate(aIO,aMode);
4178 // un Context local est deja ouvert
4179 // Traitement des objets du Context local
4180 if (TheAISContext()->NbSelected()>0 ){
4181 TheAISContext()->UnhilightSelected(Standard_False);
4182 // il y a des objets selected,on les parcourt
4183 for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
4184 Handle(AIS_InteractiveObject) aIO=TheAISContext()->SelectedInteractive();
4187 if (HaveMode(aIO,aMode) ) {
4188 di<<" Mode: "<<cmode<<" OFF pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
4189 TheAISContext()->Deactivate(aIO,aMode);
4192 di<<" Mode: "<<cmode<<" ON pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
4193 TheAISContext()->Activate(aIO,aMode);
4199 // il n'y a pas d'objets selected
4200 // tous les objets diplayes sont traites
4201 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
4204 Handle(AIS_InteractiveObject) aIO =
4205 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
4206 if (!aIO.IsNull()) {
4207 if (HaveMode(aIO,aMode) ) {
4208 di<<" Mode: "<<cmode<<" OFF pour "
4209 <<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
4210 TheAISContext()->Deactivate(aIO,aMode);
4213 di<<" Mode: "<<cmode<<" ON pour"
4214 <<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
4215 TheAISContext()->Activate(aIO,aMode);
4223 else if (HaveToSet && ThereIsName){
4224 Standard_Integer aMode=Draw::Atoi(argv [2]);
4225 Handle(AIS_InteractiveObject) aIO =
4226 Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(argv[1]));
4228 if (!aIO.IsNull()) {
4229 const char *cmode="???";
4232 case 0: cmode = "Shape"; break;
4233 case 1: cmode = "Vertex"; break;
4234 case 2: cmode = "Edge"; break;
4235 case 3: cmode = "Wire"; break;
4236 case 4: cmode = "Face"; break;
4237 case 5: cmode = "Shell"; break;
4238 case 6: cmode = "Solid"; break;
4239 case 7: cmode = "Compound"; break;
4242 if( !TheAISContext()->HasOpenedContext() ) {
4243 TheAISContext()->OpenLocalContext(Standard_False);
4244 // On charge tous les objets de la map
4245 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it (GetMapOfAIS());
4247 Handle(AIS_InteractiveObject) aShape=
4248 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
4249 if (!aShape.IsNull())
4250 TheAISContext()->Load(aShape,0,Standard_False);
4253 TheAISContext()->Activate(aIO,aMode);
4254 di<<" Mode: "<<cmode<<" ON pour "<<argv[1]<<"\n";
4258 // un Context local est deja ouvert
4259 if (HaveMode(aIO,aMode) ) {
4260 di<<" Mode: "<<cmode<<" OFF pour "<<argv[1]<<"\n";
4261 TheAISContext()->Deactivate(aIO,aMode);
4264 di<<" Mode: "<<cmode<<" ON pour "<<argv[1]<<"\n";
4265 TheAISContext()->Activate(aIO,aMode);
4274 //! Auxiliary method to print Interactive Object information
4275 static void objInfo (const NCollection_Map<Handle(AIS_InteractiveObject)>& theDetected,
4276 const Handle(Standard_Transient)& theObject,
4277 Draw_Interpretor& theDI)
4279 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theObject);
4282 theDI << theObject->DynamicType()->Name() << " is not AIS presentation\n";
4286 theDI << (TheAISContext()->IsDisplayed (anObj) ? "Displayed" : "Hidden ")
4287 << (TheAISContext()->IsSelected (anObj) ? " Selected" : " ")
4288 << (theDetected.Contains (anObj) ? " Detected" : " ")
4290 if (anObj->Type() == AIS_KOI_Datum)
4293 if (anObj->Signature() == 3) { theDI << " AIS_Trihedron"; }
4294 else if (anObj->Signature() == 2) { theDI << " AIS_Axis"; }
4295 else if (anObj->Signature() == 6) { theDI << " AIS_Circle"; }
4296 else if (anObj->Signature() == 5) { theDI << " AIS_Line"; }
4297 else if (anObj->Signature() == 7) { theDI << " AIS_Plane"; }
4298 else if (anObj->Signature() == 1) { theDI << " AIS_Point"; }
4299 else if (anObj->Signature() == 4) { theDI << " AIS_PlaneTrihedron"; }
4302 else if (anObj->Type() == AIS_KOI_Shape
4303 && anObj->Signature() == 0)
4305 theDI << " AIS_Shape";
4307 else if (anObj->Type() == AIS_KOI_Relation)
4309 // AIS_Dimention and AIS_Relation
4310 Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (anObj);
4311 switch (aRelation->KindOfDimension())
4313 case AIS_KOD_PLANEANGLE: theDI << " AIS_AngleDimension"; break;
4314 case AIS_KOD_LENGTH: theDI << " AIS_Chamf2/3dDimension/AIS_LengthDimension"; break;
4315 case AIS_KOD_DIAMETER: theDI << " AIS_DiameterDimension"; break;
4316 case AIS_KOD_ELLIPSERADIUS: theDI << " AIS_EllipseRadiusDimension"; break;
4317 //case AIS_KOD_FILLETRADIUS: theDI << " AIS_FilletRadiusDimension "; break;
4318 case AIS_KOD_OFFSET: theDI << " AIS_OffsetDimension"; break;
4319 case AIS_KOD_RADIUS: theDI << " AIS_RadiusDimension"; break;
4320 default: theDI << " UNKNOWN dimension"; break;
4325 theDI << " UserPrs";
4327 theDI << " (" << theObject->DynamicType()->Name() << ")";
4330 //! Print information about locally selected sub-shapes
4331 template <typename T>
4332 static void printLocalSelectionInfo (const T& theContext, Draw_Interpretor& theDI)
4334 const Standard_Boolean isGlobalCtx = (theContext->DynamicType() == STANDARD_TYPE(AIS_InteractiveContext));
4335 TCollection_AsciiString aPrevName;
4336 for (theContext->InitSelected(); theContext->MoreSelected(); theContext->NextSelected())
4338 const Handle(AIS_Shape) aShapeIO = Handle(AIS_Shape)::DownCast (theContext->SelectedInteractive());
4339 const Handle(SelectMgr_EntityOwner) anOwner = theContext->SelectedOwner();
4340 if (aShapeIO.IsNull() || anOwner.IsNull())
4344 if (anOwner == aShapeIO->GlobalSelOwner())
4347 const TopoDS_Shape aSubShape = theContext->SelectedShape();
4348 if (aSubShape.IsNull()
4349 || aShapeIO.IsNull()
4350 || !GetMapOfAIS().IsBound1 (aShapeIO))
4355 const TCollection_AsciiString aParentName = GetMapOfAIS().Find1 (aShapeIO);
4356 TopTools_MapOfShape aFilter;
4357 Standard_Integer aNumber = 0;
4358 const TopoDS_Shape aShape = aShapeIO->Shape();
4359 for (TopExp_Explorer anIter (aShape, aSubShape.ShapeType());
4360 anIter.More(); anIter.Next())
4362 if (!aFilter.Add (anIter.Current()))
4364 continue; // filter duplicates
4368 if (!anIter.Current().IsSame (aSubShape))
4373 Standard_CString aShapeName = NULL;
4374 switch (aSubShape.ShapeType())
4376 case TopAbs_COMPOUND: aShapeName = " Compound"; break;
4377 case TopAbs_COMPSOLID: aShapeName = "CompSolid"; break;
4378 case TopAbs_SOLID: aShapeName = " Solid"; break;
4379 case TopAbs_SHELL: aShapeName = " Shell"; break;
4380 case TopAbs_FACE: aShapeName = " Face"; break;
4381 case TopAbs_WIRE: aShapeName = " Wire"; break;
4382 case TopAbs_EDGE: aShapeName = " Edge"; break;
4383 case TopAbs_VERTEX: aShapeName = " Vertex"; break;
4385 case TopAbs_SHAPE: aShapeName = " Shape"; break;
4388 if (aParentName != aPrevName)
4390 theDI << "Locally selected sub-shapes within " << aParentName << ":\n";
4391 aPrevName = aParentName;
4393 theDI << " " << aShapeName << " #" << aNumber << "\n";
4399 //==============================================================================
4402 //==============================================================================
4403 static Standard_Integer VState (Draw_Interpretor& theDI,
4404 Standard_Integer theArgNb,
4405 Standard_CString* theArgVec)
4407 Handle(AIS_InteractiveContext) aCtx = TheAISContext();
4410 std::cerr << "Error: No opened viewer!\n";
4414 Standard_Boolean toPrintEntities = Standard_False;
4415 Standard_Boolean toCheckSelected = Standard_False;
4417 for (Standard_Integer anArgIdx = 1; anArgIdx < theArgNb; ++anArgIdx)
4419 TCollection_AsciiString anOption (theArgVec[anArgIdx]);
4420 anOption.LowerCase();
4421 if (anOption == "-detectedentities"
4422 || anOption == "-entities")
4424 toPrintEntities = Standard_True;
4426 else if (anOption == "-hasselected")
4428 toCheckSelected = Standard_True;
4432 if (toCheckSelected)
4434 aCtx->InitSelected();
4435 TCollection_AsciiString hasSelected (static_cast<Standard_Integer> (aCtx->HasSelectedShape()));
4436 theDI << "Check if context has selected shape: " << hasSelected << "\n";
4441 if (toPrintEntities)
4443 theDI << "Detected entities:\n";
4444 Handle(StdSelect_ViewerSelector3d) aSelector = aCtx->HasOpenedContext() ? aCtx->LocalSelector() : aCtx->MainSelector();
4445 SelectMgr_SelectingVolumeManager aMgr = aSelector->GetManager();
4446 for (aSelector->InitDetected(); aSelector->MoreDetected(); aSelector->NextDetected())
4448 const Handle(SelectBasics_SensitiveEntity)& anEntity = aSelector->DetectedEntity();
4449 Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anEntity->OwnerId());
4450 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
4452 if (anObj->TransformPersistence().Flags)
4454 const Graphic3d_Mat4d& aProjection = aMgr.ProjectionMatrix();
4455 const Graphic3d_Mat4d& aWorldView = aMgr.WorldViewMatrix();
4457 Graphic3d_Mat4d aMat = anObj->TransformPersistence().Compute (aProjection, aWorldView, 0, 0);
4458 anInvTrsf.SetValues (aMat.GetValue (0, 0), aMat.GetValue (0, 1), aMat.GetValue (0, 2), aMat.GetValue (0, 3),
4459 aMat.GetValue (1, 0), aMat.GetValue (1, 1), aMat.GetValue (1, 2), aMat.GetValue (1, 3),
4460 aMat.GetValue (2, 0), aMat.GetValue (2, 1), aMat.GetValue (2, 2), aMat.GetValue (2, 3));
4463 if (anObj->HasTransformation())
4465 anInvTrsf = anObj->InversedTransformation() * anInvTrsf;
4467 if (anEntity->HasInitLocation())
4469 anInvTrsf = anEntity->InvInitLocation() * anInvTrsf;
4471 const Standard_Integer aScale = anEntity->SensitivityFactor() < aSelector->PixelTolerance()
4472 ? anEntity->SensitivityFactor() : 1;
4473 const Standard_Boolean isToScaleAndTransform = anInvTrsf.Form() != gp_Identity || aScale != 1;
4474 SelectMgr_SelectingVolumeManager anEntMgr =
4475 isToScaleAndTransform ? aMgr.ScaleAndTransform (aScale, anInvTrsf)
4477 SelectBasics_PickResult aResult;
4478 anEntity->Matches (anEntMgr, aResult);
4479 gp_Pnt aDetectedPnt = anInvTrsf.Form() == gp_Identity ?
4480 anEntMgr.DetectedPoint (aResult.Depth()) : anEntMgr.DetectedPoint (aResult.Depth()).Transformed (anInvTrsf.Inverted());
4482 TCollection_AsciiString aName = GetMapOfAIS().Find1 (anObj);
4483 aName.LeftJustify (20, ' ');
4484 char anInfoStr[512];
4486 " Depth: %+.3f Distance: %+.3f Point: %+.3f %+.3f %+.3f",
4488 aResult.DistToGeomCenter(),
4489 aDetectedPnt.X(), aDetectedPnt.Y(), aDetectedPnt.Z());
4490 theDI << " " << aName
4492 << " (" << anEntity->DynamicType()->Name() << ")"
4495 Handle(StdSelect_BRepOwner) aBRepOwner = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
4496 if (!aBRepOwner.IsNull())
4498 theDI << " Detected Shape: "
4499 << aBRepOwner->Shape().TShape()->DynamicType()->Name()
4503 Handle(Select3D_SensitiveWire) aWire = Handle(Select3D_SensitiveWire)::DownCast (anEntity);
4504 if (!aWire.IsNull())
4506 Handle(Select3D_SensitiveEntity) aSen = aWire->GetLastDetected();
4507 theDI << " Detected Child: "
4508 << aSen->DynamicType()->Name()
4515 NCollection_Map<Handle(AIS_InteractiveObject)> aDetected;
4516 for (aCtx->InitDetected(); aCtx->MoreDetected(); aCtx->NextDetected())
4518 aDetected.Add (aCtx->DetectedCurrentObject());
4521 const Standard_Boolean toShowAll = (theArgNb >= 2 && *theArgVec[1] == '*');
4525 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
4527 const TCollection_AsciiString anObjName = theArgVec[anArgIter];
4528 if (!GetMapOfAIS().IsBound2 (anObjName))
4530 theDI << anObjName << " doesn't exist!\n";
4534 const Handle(Standard_Transient) anObjTrans = GetMapOfAIS().Find2 (anObjName);
4535 TCollection_AsciiString aName = anObjName;
4536 aName.LeftJustify (20, ' ');
4537 theDI << " " << aName << " ";
4538 objInfo (aDetected, anObjTrans, theDI);
4544 if (!aCtx->HasOpenedContext() && aCtx->NbSelected() > 0 && !toShowAll)
4546 NCollection_DataMap<Handle(SelectMgr_EntityOwner), TopoDS_Shape> anOwnerShapeMap;
4547 for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
4549 const Handle(SelectMgr_EntityOwner) anOwner = aCtx->SelectedOwner();
4550 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
4551 // handle whole object selection
4552 if (anOwner == anObj->GlobalSelOwner())
4554 TCollection_AsciiString aName = GetMapOfAIS().Find1 (anObj);
4555 aName.LeftJustify (20, ' ');
4556 theDI << aName << " ";
4557 objInfo (aDetected, anObj, theDI);
4562 // process selected sub-shapes
4563 printLocalSelectionInfo (aCtx, theDI);
4568 theDI << "Neutral-point state:\n";
4569 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anObjIter (GetMapOfAIS());
4570 anObjIter.More(); anObjIter.Next())
4572 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anObjIter.Key1());
4578 TCollection_AsciiString aName = anObjIter.Key2();
4579 aName.LeftJustify (20, ' ');
4580 theDI << " " << aName << " ";
4581 objInfo (aDetected, anObj, theDI);
4584 printLocalSelectionInfo (aCtx, theDI);
4585 if (aCtx->HasOpenedContext())
4586 printLocalSelectionInfo (aCtx->LocalContext(), theDI);
4590 //=======================================================================
4591 //function : PickObjects
4593 //=======================================================================
4594 Standard_Boolean ViewerTest::PickObjects(Handle(TColStd_HArray1OfTransient)& arr,
4595 const AIS_KindOfInteractive TheType,
4596 const Standard_Integer TheSignature,
4597 const Standard_Integer MaxPick)
4599 Handle(AIS_InteractiveObject) IO;
4600 Standard_Integer curindex = (TheType == AIS_KOI_None) ? 0 : TheAISContext()->OpenLocalContext();
4602 // step 1: prepare the data
4604 Handle(AIS_SignatureFilter) F1 = new AIS_SignatureFilter(TheType,TheSignature);
4605 TheAISContext()->AddFilter(F1);
4608 // step 2 : wait for the selection...
4609 Standard_Integer NbPickGood (0),NbToReach(arr->Length());
4610 Standard_Integer NbPickFail(0);
4611 Standard_Integer argccc = 5;
4612 const char *bufff[] = { "A", "B", "C","D", "E" };
4613 const char **argvvv = (const char **) bufff;
4616 while(NbPickGood<NbToReach && NbPickFail <= MaxPick){
4617 while(ViewerMainLoop(argccc,argvvv)){}
4618 Standard_Integer NbStored = TheAISContext()->NbSelected();
4619 if(NbStored != NbPickGood)
4620 NbPickGood= NbStored;
4623 cout<<"NbPicked = "<<NbPickGood<<" | Nb Pick Fail :"<<NbPickFail<<endl;
4626 // step3 get result.
4628 if (NbPickFail >= NbToReach)
4629 return Standard_False;
4631 Standard_Integer i(0);
4632 for(TheAISContext()->InitSelected();
4633 TheAISContext()->MoreSelected();
4634 TheAISContext()->NextSelected()){
4636 Handle(AIS_InteractiveObject) IO2 = TheAISContext()->SelectedInteractive();
4637 arr->SetValue(i,IO2);
4642 TheAISContext()->CloseLocalContext(curindex);
4644 return Standard_True;
4648 //=======================================================================
4649 //function : PickObject
4651 //=======================================================================
4652 Handle(AIS_InteractiveObject) ViewerTest::PickObject(const AIS_KindOfInteractive TheType,
4653 const Standard_Integer TheSignature,
4654 const Standard_Integer MaxPick)
4656 Handle(AIS_InteractiveObject) IO;
4657 Standard_Integer curindex = (TheType == AIS_KOI_None) ? 0 : TheAISContext()->OpenLocalContext();
4659 // step 1: prepare the data
4662 Handle(AIS_SignatureFilter) F1 = new AIS_SignatureFilter(TheType,TheSignature);
4663 TheAISContext()->AddFilter(F1);
4666 // step 2 : wait for the selection...
4667 Standard_Boolean IsGood (Standard_False);
4668 Standard_Integer NbPick(0);
4669 Standard_Integer argccc = 5;
4670 const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
4671 const char **argvvv = (const char **) bufff;
4674 while(!IsGood && NbPick<= MaxPick){
4675 while(ViewerMainLoop(argccc,argvvv)){}
4676 IsGood = (TheAISContext()->NbSelected()>0) ;
4678 cout<<"Nb Pick :"<<NbPick<<endl;
4682 // step3 get result.
4684 TheAISContext()->InitSelected();
4685 IO = TheAISContext()->SelectedInteractive();
4689 TheAISContext()->CloseLocalContext(curindex);
4693 //=======================================================================
4694 //function : PickShape
4695 //purpose : First Activate the rightmode + Put Filters to be able to
4696 // pick objets that are of type <TheType>...
4697 //=======================================================================
4699 TopoDS_Shape ViewerTest::PickShape(const TopAbs_ShapeEnum TheType,
4700 const Standard_Integer MaxPick)
4703 // step 1: prepare the data
4705 Standard_Integer curindex = TheAISContext()->OpenLocalContext();
4706 TopoDS_Shape result;
4708 if(TheType==TopAbs_SHAPE){
4709 Handle(AIS_TypeFilter) F1 = new AIS_TypeFilter(AIS_KOI_Shape);
4710 TheAISContext()->AddFilter(F1);
4713 Handle(StdSelect_ShapeTypeFilter) TF = new StdSelect_ShapeTypeFilter(TheType);
4714 TheAISContext()->AddFilter(TF);
4715 TheAISContext()->ActivateStandardMode(TheType);
4720 // step 2 : wait for the selection...
4721 Standard_Boolean NoShape (Standard_True);
4722 Standard_Integer NbPick(0);
4723 Standard_Integer argccc = 5;
4724 const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
4725 const char **argvvv = (const char **) bufff;
4728 while(NoShape && NbPick<= MaxPick){
4729 while(ViewerMainLoop(argccc,argvvv)){}
4730 NoShape = (TheAISContext()->NbSelected()==0) ;
4732 cout<<"Nb Pick :"<<NbPick<<endl;
4735 // step3 get result.
4739 TheAISContext()->InitSelected();
4740 if(TheAISContext()->HasSelectedShape())
4741 result = TheAISContext()->SelectedShape();
4743 Handle(AIS_InteractiveObject) IO = TheAISContext()->SelectedInteractive();
4744 result = Handle(AIS_Shape)::DownCast (IO)->Shape();
4749 TheAISContext()->CloseLocalContext(curindex);
4755 //=======================================================================
4756 //function : PickShapes
4758 //=======================================================================
4759 Standard_Boolean ViewerTest::PickShapes (const TopAbs_ShapeEnum TheType,
4760 Handle(TopTools_HArray1OfShape)& thearr,
4761 const Standard_Integer MaxPick)
4764 Standard_Integer Taille = thearr->Length();
4766 cout<<" WARNING : Pick with Shift+ MB1 for Selection of more than 1 object\n";
4768 // step 1: prepare the data
4769 Standard_Integer curindex = TheAISContext()->OpenLocalContext();
4770 if(TheType==TopAbs_SHAPE){
4771 Handle(AIS_TypeFilter) F1 = new AIS_TypeFilter(AIS_KOI_Shape);
4772 TheAISContext()->AddFilter(F1);
4775 Handle(StdSelect_ShapeTypeFilter) TF = new StdSelect_ShapeTypeFilter(TheType);
4776 TheAISContext()->AddFilter(TF);
4777 TheAISContext()->ActivateStandardMode(TheType);
4781 // step 2 : wait for the selection...
4782 Standard_Integer NbPickGood (0),NbToReach(thearr->Length());
4783 Standard_Integer NbPickFail(0);
4784 Standard_Integer argccc = 5;
4785 const char *bufff[] = { "A", "B", "C","D", "E" };
4786 const char **argvvv = (const char **) bufff;
4789 while(NbPickGood<NbToReach && NbPickFail <= MaxPick){
4790 while(ViewerMainLoop(argccc,argvvv)){}
4791 Standard_Integer NbStored = TheAISContext()->NbSelected();
4792 if (NbStored != NbPickGood)
4793 NbPickGood= NbStored;
4796 cout<<"NbPicked = "<<NbPickGood<<" | Nb Pick Fail :"<<NbPickFail<<"\n";
4799 // step3 get result.
4801 if (NbPickFail >= NbToReach)
4802 return Standard_False;
4804 Standard_Integer i(0);
4805 for(TheAISContext()->InitSelected();TheAISContext()->MoreSelected();TheAISContext()->NextSelected()){
4807 if(TheAISContext()->HasSelectedShape())
4808 thearr->SetValue(i,TheAISContext()->SelectedShape());
4810 Handle(AIS_InteractiveObject) IO = TheAISContext()->SelectedInteractive();
4811 thearr->SetValue(i,Handle(AIS_Shape)::DownCast (IO)->Shape());
4815 TheAISContext()->CloseLocalContext(curindex);
4816 return Standard_True;
4820 //=======================================================================
4821 //function : VPickShape
4823 //=======================================================================
4824 static int VPickShape( Draw_Interpretor& di, Standard_Integer argc, const char** argv)
4826 TopoDS_Shape PickSh;
4827 TopAbs_ShapeEnum theType = TopAbs_COMPOUND;
4830 theType = TopAbs_SHAPE;
4832 if(!strcasecmp(argv[1],"V" )) theType = TopAbs_VERTEX;
4833 else if (!strcasecmp(argv[1],"E" )) theType = TopAbs_EDGE;
4834 else if (!strcasecmp(argv[1],"W" )) theType = TopAbs_WIRE;
4835 else if (!strcasecmp(argv[1],"F" )) theType = TopAbs_FACE;
4836 else if(!strcasecmp(argv[1],"SHAPE" )) theType = TopAbs_SHAPE;
4837 else if (!strcasecmp(argv[1],"SHELL" )) theType = TopAbs_SHELL;
4838 else if (!strcasecmp(argv[1],"SOLID" )) theType = TopAbs_SOLID;
4841 static Standard_Integer nbOfSub[8]={0,0,0,0,0,0,0,0};
4842 static TCollection_AsciiString nameType[8] = {"COMPS","SOL","SHE","F","W","E","V","SHAP"};
4844 TCollection_AsciiString name;
4847 Standard_Integer NbToPick = argc>2 ? argc-2 : 1;
4849 PickSh = ViewerTest::PickShape(theType);
4858 if(!PickSh.IsNull()){
4859 nbOfSub[Standard_Integer(theType)]++;
4861 name += nameType[Standard_Integer(theType)];
4862 TCollection_AsciiString indxstring(nbOfSub[Standard_Integer(theType)]);
4867 // si on avait une petite methode pour voir si la shape
4868 // est deja dans la Double map, ca eviterait de creer....
4869 DBRep::Set(name.ToCString(),PickSh);
4871 Handle(AIS_Shape) newsh = new AIS_Shape(PickSh);
4872 GetMapOfAIS().Bind(newsh, name);
4873 TheAISContext()->Display(newsh);
4874 di<<"Nom de la shape pickee : "<<name.ToCString()<<"\n";
4877 // Plusieurs objets a picker, vite vite vite....
4880 Standard_Boolean autonaming = !strcasecmp(argv[2],".");
4881 Handle(TopTools_HArray1OfShape) arr = new TopTools_HArray1OfShape(1,NbToPick);
4882 if(ViewerTest::PickShapes(theType,arr)){
4883 for(Standard_Integer i=1;i<=NbToPick;i++){
4884 PickSh = arr->Value(i);
4885 if(!PickSh.IsNull()){
4887 nbOfSub[Standard_Integer(theType)]++;
4890 name += nameType[Standard_Integer(theType)];
4891 TCollection_AsciiString indxstring(nbOfSub[Standard_Integer(theType)]);
4899 DBRep::Set(name.ToCString(),PickSh);
4900 Handle(AIS_Shape) newsh = new AIS_Shape(PickSh);
4901 GetMapOfAIS().Bind(newsh, name);
4902 di<<"display of picke shape #"<<i<<" - nom : "<<name.ToCString()<<"\n";
4903 TheAISContext()->Display(newsh);
4911 //=======================================================================
4912 //function : VPickSelected
4914 //=======================================================================
4915 static int VPickSelected (Draw_Interpretor& , Standard_Integer theArgNb, const char** theArgs)
4917 static Standard_Integer aCount = 0;
4918 TCollection_AsciiString aName = "PickedShape_";
4926 aName = aName + aCount++ + "_";
4929 Standard_Integer anIdx = 0;
4930 for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected(), ++anIdx)
4932 TopoDS_Shape aShape;
4933 if (TheAISContext()->HasSelectedShape())
4935 aShape = TheAISContext()->SelectedShape();
4939 Handle(AIS_InteractiveObject) IO = TheAISContext()->SelectedInteractive();
4940 aShape = Handle(AIS_Shape)::DownCast (IO)->Shape();
4943 TCollection_AsciiString aCurrentName = aName;
4946 aCurrentName += anIdx;
4949 DBRep::Set ((aCurrentName).ToCString(), aShape);
4951 Handle(AIS_Shape) aNewShape = new AIS_Shape (aShape);
4952 GetMapOfAIS().Bind (aNewShape, aCurrentName);
4953 TheAISContext()->Display (aNewShape);
4959 //=======================================================================
4960 //function : list of known objects
4962 //=======================================================================
4963 static int VIOTypes( Draw_Interpretor& di, Standard_Integer , const char** )
4965 // 1234567890 12345678901234567 123456789
4966 TCollection_AsciiString Colum [3]={"Standard Types","Type Of Object","Signature"};
4967 TCollection_AsciiString BlankLine(64,'_');
4968 Standard_Integer i ;
4970 di<<"/n"<<BlankLine.ToCString()<<"\n";
4973 Colum[i].Center(20,' ');
4975 di<<"|"<<Colum[i].ToCString();
4978 di<<BlankLine.ToCString()<<"\n";
4980 // TCollection_AsciiString thetypes[5]={"Datum","Shape","Object","Relation","None"};
4981 const char ** names = GetTypeNames();
4983 TCollection_AsciiString curstring;
4984 TCollection_AsciiString curcolum[3];
4987 // les objets de type Datum..
4988 curcolum[1]+="Datum";
4990 curcolum[0].Clear();
4991 curcolum[0] += names[i];
4993 curcolum[2].Clear();
4994 curcolum[2]+=TCollection_AsciiString(i+1);
4996 for(Standard_Integer j =0;j<=2;j++){
4997 curcolum[j].Center(20,' ');
4998 di<<"|"<<curcolum[j].ToCString();
5002 di<<BlankLine.ToCString()<<"\n";
5004 // les objets de type shape
5005 curcolum[1].Clear();
5006 curcolum[1]+="Shape";
5007 curcolum[1].Center(20,' ');
5010 curcolum[0].Clear();
5011 curcolum[0] += names[7+i];
5012 curcolum[2].Clear();
5013 curcolum[2]+=TCollection_AsciiString(i);
5015 for(Standard_Integer j =0;j<=2;j++){
5016 curcolum[j].Center(20,' ');
5017 di<<"|"<<curcolum[j].ToCString();
5021 di<<BlankLine.ToCString()<<"\n";
5022 // les IO de type objet...
5023 curcolum[1].Clear();
5024 curcolum[1]+="Object";
5025 curcolum[1].Center(20,' ');
5027 curcolum[0].Clear();
5028 curcolum[0] += names[10+i];
5029 curcolum[2].Clear();
5030 curcolum[2]+=TCollection_AsciiString(i);
5032 for(Standard_Integer j =0;j<=2;j++){
5033 curcolum[j].Center(20,' ');
5034 di<<"|"<<curcolum[j].ToCString();
5038 di<<BlankLine.ToCString()<<"\n";
5039 // les contraintes et dimensions.
5040 // pour l'instant on separe juste contraintes et dimensions...
5041 // plus tard, on detaillera toutes les sortes...
5042 curcolum[1].Clear();
5043 curcolum[1]+="Relation";
5044 curcolum[1].Center(20,' ');
5046 curcolum[0].Clear();
5047 curcolum[0] += names[12+i];
5048 curcolum[2].Clear();
5049 curcolum[2]+=TCollection_AsciiString(i);
5051 for(Standard_Integer j =0;j<=2;j++){
5052 curcolum[j].Center(20,' ');
5053 di<<"|"<<curcolum[j].ToCString();
5057 di<<BlankLine.ToCString()<<"\n";
5064 static int VEraseType( Draw_Interpretor& , Standard_Integer argc, const char** argv)
5066 if(argc!=2) return 1;
5068 AIS_KindOfInteractive TheType;
5069 Standard_Integer TheSign(-1);
5070 GetTypeAndSignfromString(argv[1],TheType,TheSign);
5073 AIS_ListOfInteractive LIO;
5075 // en attendant l'amelioration ais pour les dimensions...
5077 Standard_Integer dimension_status(-1);
5078 if(TheType==AIS_KOI_Relation){
5079 dimension_status = TheSign ==1 ? 1 : 0;
5083 TheAISContext()->DisplayedObjects(TheType,TheSign,LIO);
5084 Handle(AIS_InteractiveObject) curio;
5085 for(AIS_ListIteratorOfListOfInteractive it(LIO);it.More();it.Next()){
5088 if(dimension_status == -1)
5089 TheAISContext()->Erase(curio,Standard_False);
5091 AIS_KindOfDimension KOD = Handle(AIS_Relation)::DownCast (curio)->KindOfDimension();
5092 if ((dimension_status==0 && KOD == AIS_KOD_NONE)||
5093 (dimension_status==1 && KOD != AIS_KOD_NONE))
5094 TheAISContext()->Erase(curio,Standard_False);
5097 TheAISContext()->UpdateCurrentViewer();
5100 static int VDisplayType(Draw_Interpretor& , Standard_Integer argc, const char** argv)
5102 if(argc!=2) return 1;
5104 AIS_KindOfInteractive TheType;
5105 Standard_Integer TheSign(-1);
5106 GetTypeAndSignfromString(argv[1],TheType,TheSign);
5108 // en attendant l'amelioration ais pour les dimensions...
5110 Standard_Integer dimension_status(-1);
5111 if(TheType==AIS_KOI_Relation){
5112 dimension_status = TheSign ==1 ? 1 : 0;
5116 AIS_ListOfInteractive LIO;
5117 TheAISContext()->ObjectsInside(LIO,TheType,TheSign);
5118 Handle(AIS_InteractiveObject) curio;
5119 for(AIS_ListIteratorOfListOfInteractive it(LIO);it.More();it.Next()){
5121 if(dimension_status == -1)
5122 TheAISContext()->Display(curio,Standard_False);
5124 AIS_KindOfDimension KOD = Handle(AIS_Relation)::DownCast (curio)->KindOfDimension();
5125 if ((dimension_status==0 && KOD == AIS_KOD_NONE)||
5126 (dimension_status==1 && KOD != AIS_KOD_NONE))
5127 TheAISContext()->Display(curio,Standard_False);
5132 TheAISContext()->UpdateCurrentViewer();
5136 static Standard_Integer vr(Draw_Interpretor& , Standard_Integer , const char** a)
5139 BRep_Builder builder;
5141 BRepTools::Read(shape, s, builder);
5142 DBRep::Set(a[1], shape);
5143 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
5144 Handle(AIS_Shape) ais = new AIS_Shape(shape);
5149 //===============================================================================================
5152 //===============================================================================================
5153 static int VBsdf (Draw_Interpretor& theDi,
5154 Standard_Integer theArgsNb,
5155 const char** theArgVec)
5157 Handle(V3d_View) aView = ViewerTest::CurrentView();
5158 Handle(V3d_Viewer) aViewer = ViewerTest::GetViewerFromContext();
5160 || aViewer.IsNull())
5162 std::cerr << "No active viewer!\n";
5166 ViewerTest_CmdParser aCmd;
5168 aCmd.AddDescription ("Adjusts parameters of material BSDF:");
5169 aCmd.AddOption ("print|echo|p", "Print BSDF");
5171 aCmd.AddOption ("kd", "Weight of the Lambertian BRDF");
5172 aCmd.AddOption ("kr", "Weight of the reflection BRDF");
5173 aCmd.AddOption ("kt", "Weight of the transmission BTDF");
5174 aCmd.AddOption ("ks", "Weight of the glossy Blinn BRDF");
5175 aCmd.AddOption ("le", "Self-emitted radiance");
5177 aCmd.AddOption ("fresnel|f", "Fresnel coefficients; Allowed fresnel formats are: Constant x, Schlick x y z, Dielectric x, Conductor x y");
5179 aCmd.AddOption ("roughness|r", "Roughness of material (Blinn's exponent)");
5180 aCmd.AddOption ("absorpCoeff|af", "Absorption coeff (only for transparent material)");
5181 aCmd.AddOption ("absorpColor|ac", "Absorption color (only for transparent material)");
5183 aCmd.AddOption ("normalize|n", "Normalize BSDF coefficients");
5185 aCmd.Parse (theArgsNb, theArgVec);
5187 if (aCmd.HasOption ("help"))
5189 theDi.PrintHelp (theArgVec[0]);
5193 TCollection_AsciiString aName (aCmd.Arg ("", 0).c_str());
5196 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
5197 if (!aMap.IsBound2 (aName) )
5199 std::cerr << "Use 'vdisplay' before\n";
5203 Handle(AIS_InteractiveObject) anIObj = Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (aName));
5204 Graphic3d_MaterialAspect aMaterial = anIObj->Attributes()->ShadingAspect()->Material();
5205 Graphic3d_BSDF aBSDF = aMaterial.BSDF();
5207 if (aCmd.HasOption ("print"))
5209 Graphic3d_Vec4 aFresnel = aBSDF.Fresnel.Serialize();
5212 << "Kd: " << aBSDF.Kd.r() << ", " << aBSDF.Kd.g() << ", " << aBSDF.Kd.b() << "\n"
5213 << "Kr: " << aBSDF.Kr.r() << ", " << aBSDF.Kr.g() << ", " << aBSDF.Kr.b() << "\n"
5214 << "Kt: " << aBSDF.Kt.r() << ", " << aBSDF.Kt.g() << ", " << aBSDF.Kt.b() << "\n"
5215 << "Ks: " << aBSDF.Ks.r() << ", " << aBSDF.Ks.g() << ", " << aBSDF.Ks.b() << "\n"
5216 << "Le: " << aBSDF.Le.r() << ", " << aBSDF.Le.g() << ", " << aBSDF.Le.b() << "\n"
5219 if (aFresnel.x() >= 0.f)
5222 << "|Schlick| " << aFresnel.x() << ", " << aFresnel.y() << ", " << aFresnel.z() << "\n";
5224 else if (aFresnel.x() >= -1.5f)
5227 << "|Constant| " << aFresnel.z() << "\n";
5229 else if (aFresnel.x() >= -2.5f)
5232 << "|Conductor| " << aFresnel.y() << ", " << aFresnel.z() << "\n";
5237 << "|Dielectric| " << aFresnel.y() << "\n";
5242 << "Roughness: " << aBSDF.Roughness << "\n"
5243 << "Absorption coeff: " << aBSDF.AbsorptionCoeff << "\n"
5244 << "Absorption color: " << aBSDF.AbsorptionColor.r() << ", "
5245 << aBSDF.AbsorptionColor.g() << ", "
5246 << aBSDF.AbsorptionColor.b() << "\n";
5251 if (aCmd.HasOption ("roughness", 1, Standard_True))
5253 aCmd.Arg ("roughness", 0);
5254 aBSDF.Roughness = aCmd.ArgFloat ("roughness");
5257 if (aCmd.HasOption ("absorpCoeff", 1, Standard_True))
5259 aBSDF.AbsorptionCoeff = aCmd.ArgFloat ("absorpCoeff");
5262 if (aCmd.HasOption ("absorpColor", 3, Standard_True))
5264 aBSDF.AbsorptionColor = aCmd.ArgVec3f ("absorpColor");
5267 if (aCmd.HasOption ("kd", 3))
5269 aBSDF.Kd = aCmd.ArgVec3f ("kd");
5271 else if (aCmd.HasOption ("kd", 1, Standard_True))
5273 aBSDF.Kd = Graphic3d_Vec3 (aCmd.ArgFloat ("kd"));
5276 if (aCmd.HasOption ("kr", 3))
5278 aBSDF.Kr = aCmd.ArgVec3f ("kr");
5280 else if (aCmd.HasOption ("kr", 1, Standard_True))
5282 aBSDF.Kr = Graphic3d_Vec3 (aCmd.ArgFloat ("kr"));
5285 if (aCmd.HasOption ("kt", 3))
5287 aBSDF.Kt = aCmd.ArgVec3f ("kt");
5289 else if (aCmd.HasOption ("kt", 1, Standard_True))
5291 aBSDF.Kt = Graphic3d_Vec3 (aCmd.ArgFloat ("kt"));
5294 if (aCmd.HasOption ("ks", 3))
5296 aBSDF.Ks = aCmd.ArgVec3f ("ks");
5298 else if (aCmd.HasOption ("ks", 1, Standard_True))
5300 aBSDF.Ks = Graphic3d_Vec3 (aCmd.ArgFloat ("ks"));
5303 if (aCmd.HasOption ("le", 3))
5305 aBSDF.Le = aCmd.ArgVec3f ("le");
5307 else if (aCmd.HasOption ("le", 1, Standard_True))
5309 aBSDF.Le = Graphic3d_Vec3 (aCmd.ArgFloat ("le"));
5312 const std::string aFresnelErrorMessage =
5313 "Error! Wrong Fresnel type. Allowed types are: Constant x, Schlick x y z, Dielectric x, Conductor x y.\n";
5315 if (aCmd.HasOption ("fresnel", 4)) // Schlick: type, x, y ,z
5317 std::string aFresnelType = aCmd.Arg ("fresnel", 0);
5318 std::transform (aFresnelType.begin(), aFresnelType.end(), aFresnelType.begin(), ::tolower);
5320 if (aFresnelType == "schlick")
5322 aBSDF.Fresnel = Graphic3d_Fresnel::CreateSchlick (
5323 Graphic3d_Vec3 (static_cast<Standard_ShortReal> (Draw::Atof (aCmd.Arg ("fresnel", 1).c_str())),
5324 static_cast<Standard_ShortReal> (Draw::Atof (aCmd.Arg ("fresnel", 2).c_str())),
5325 static_cast<Standard_ShortReal> (Draw::Atof (aCmd.Arg ("fresnel", 3).c_str()))));
5329 std::cout << aFresnelErrorMessage;
5332 else if (aCmd.HasOption ("fresnel", 3)) // Conductor: type, x, y
5334 std::string aFresnelType = aCmd.Arg ("fresnel", 0);
5335 std::transform (aFresnelType.begin(), aFresnelType.end(), aFresnelType.begin(), ::tolower);
5337 if (aFresnelType == "conductor")
5339 aBSDF.Fresnel = Graphic3d_Fresnel::CreateConductor (
5340 static_cast<Standard_ShortReal> (Draw::Atof (aCmd.Arg ("fresnel", 1).c_str())),
5341 static_cast<Standard_ShortReal> (Draw::Atof (aCmd.Arg ("fresnel", 2).c_str())));
5345 std::cout << aFresnelErrorMessage;
5348 else if (aCmd.HasOption ("fresnel", 2)) // Dielectric, Constant: type, x
5350 std::string aFresnelType = aCmd.Arg ("fresnel", 0);
5351 std::transform (aFresnelType.begin(), aFresnelType.end(), aFresnelType.begin(), ::tolower);
5353 if (aFresnelType == "dielectric")
5355 aBSDF.Fresnel = Graphic3d_Fresnel::CreateDielectric (
5356 static_cast<Standard_ShortReal> (Draw::Atof (aCmd.Arg ("fresnel", 1).c_str())));
5358 else if (aFresnelType == "constant")
5360 aBSDF.Fresnel = Graphic3d_Fresnel::CreateConstant (
5361 static_cast<Standard_ShortReal> (Draw::Atof (aCmd.Arg ("fresnel", 1).c_str())));
5365 std::cout << aFresnelErrorMessage;
5369 if (aCmd.HasOption ("normalize"))
5374 aMaterial.SetBSDF (aBSDF);
5375 anIObj->SetMaterial (aMaterial);
5382 //==============================================================================
5383 //function : VLoadSelection
5384 //purpose : Adds given objects to map of AIS and loads selection primitives for them
5385 //==============================================================================
5386 static Standard_Integer VLoadSelection (Draw_Interpretor& /*theDi*/,
5387 Standard_Integer theArgNb,
5388 const char** theArgVec)
5392 std::cerr << theArgVec[0] << "Error: wrong number of arguments.\n";
5396 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
5399 ViewerTest::ViewerInit();
5400 aCtx = ViewerTest::GetAISContext();
5403 // Parse input arguments
5404 TColStd_SequenceOfAsciiString aNamesOfIO;
5405 Standard_Boolean isLocal = Standard_False;
5406 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
5408 const TCollection_AsciiString aName = theArgVec[anArgIter];
5409 TCollection_AsciiString aNameCase = aName;
5410 aNameCase.LowerCase();
5411 if (aNameCase == "-local")
5413 isLocal = Standard_True;
5417 aNamesOfIO.Append (aName);
5421 if (aNamesOfIO.IsEmpty())
5423 std::cerr << theArgVec[0] << "Error: wrong number of arguments.\n";
5428 if (isLocal && !aCtx->HasOpenedContext())
5430 aCtx->OpenLocalContext (Standard_False);
5432 else if (!isLocal && aCtx->HasOpenedContext())
5434 aCtx->CloseAllContexts (Standard_False);
5437 // Load selection of interactive objects
5438 for (Standard_Integer anIter = 1; anIter <= aNamesOfIO.Length(); ++anIter)
5440 const TCollection_AsciiString& aName = aNamesOfIO.Value (anIter);
5442 Handle(AIS_InteractiveObject) aShape;
5443 if (GetMapOfAIS().IsBound2 (aName))
5444 aShape = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName));
5446 aShape = GetAISShapeFromName (aName.ToCString());
5448 if (!aShape.IsNull())
5450 if (!GetMapOfAIS().IsBound2 (aName))
5452 GetMapOfAIS().Bind (aShape, aName);
5455 aCtx->Load (aShape, -1, Standard_False);
5456 aCtx->Activate (aShape, aShape->GlobalSelectionMode(), Standard_True);
5463 //==============================================================================
5464 //function : VAutoActivateSelection
5465 //purpose : Activates or deactivates auto computation of selection
5466 //==============================================================================
5467 static int VAutoActivateSelection (Draw_Interpretor& theDi,
5468 Standard_Integer theArgNb,
5469 const char** theArgVec)
5474 std::cerr << theArgVec[0] << "Error: wrong number of arguments.\n";
5478 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
5481 ViewerTest::ViewerInit();
5482 aCtx = ViewerTest::GetAISContext();
5487 TCollection_AsciiString aSelActivationString;
5488 if (aCtx->GetAutoActivateSelection())
5490 aSelActivationString.Copy ("ON");
5494 aSelActivationString.Copy ("OFF");
5497 theDi << "Auto activation of selection is: " << aSelActivationString << "\n";
5501 Standard_Boolean toActivate = Draw::Atoi (theArgVec[1]);
5502 aCtx->SetAutoActivateSelection (toActivate);
5508 //==============================================================================
5509 //function : ViewerTest::Commands
5510 //purpose : Add all the viewer command in the Draw_Interpretor
5511 //==============================================================================
5513 void ViewerTest::Commands(Draw_Interpretor& theCommands)
5515 ViewerTest::ViewerCommands(theCommands);
5516 ViewerTest::RelationCommands(theCommands);
5517 ViewerTest::ObjectCommands(theCommands);
5518 ViewerTest::FilletCommands(theCommands);
5519 ViewerTest::OpenGlCommands(theCommands);
5521 const char *group = "AIS_Display";
5524 theCommands.Add("visos",
5525 "visos [name1 ...] [nbUIsos nbVIsos IsoOnPlane(0|1)]\n"
5526 "\tIf last 3 optional parameters are not set prints numbers of U-, V- isolines and IsoOnPlane.\n",
5527 __FILE__, visos, group);
5529 theCommands.Add("vdisplay",
5530 "vdisplay [-noupdate|-update] [-local] [-mutable] [-neutral]"
5531 "\n\t\t: [-trsfPers {pan|zoom|rotate|trihedron|full|none}=none] [-trsfPersPos X Y [Z]] [-3d|-2d|-2dTopDown]"
5532 "\n\t\t: [-dispMode mode] [-highMode mode]"
5533 "\n\t\t: [-layer index] [-top|-topmost|-overlay|-underlay]"
5534 "\n\t\t: [-redisplay]"
5535 "\n\t\t: name1 [name2] ... [name n]"
5536 "\n\t\t: Displays named objects."
5537 "\n\t\t: Option -local enables displaying of objects in local"
5538 "\n\t\t: selection context. Local selection context will be opened"
5539 "\n\t\t: if there is not any."
5540 "\n\t\t: -noupdate suppresses viewer redraw call."
5541 "\n\t\t: -mutable enables optimizations for mutable objects."
5542 "\n\t\t: -neutral draws objects in main viewer."
5543 "\n\t\t: -layer sets z-layer for objects. It can use -overlay|-underlay|-top|-topmost instead of -layer index for the default z-layers."
5544 "\n\t\t: -top draws objects on top of main presentations but below topmost."
5545 "\n\t\t: -topmost draws in overlay for 3D presentations with independent Depth."
5546 "\n\t\t: -overlay draws objects in overlay for 2D presentations (On-Screen-Display)."
5547 "\n\t\t: -underlay draws objects in underlay for 2D presentations (On-Screen-Display)."
5548 "\n\t\t: -selectable|-noselect controls selection of objects."
5549 "\n\t\t: -trsfPers sets a transform persistence flags. Flag 'full' is pan, zoom and rotate."
5550 "\n\t\t: -trsfPersPos sets an anchor point for transform persistence."
5551 "\n\t\t: -2d|-2dTopDown displays object in screen coordinates."
5552 "\n\t\t: -dispmode sets display mode for objects."
5553 "\n\t\t: -highmode sets hilight mode for objects."
5554 "\n\t\t: -redisplay recomputes presentation of objects.",
5555 __FILE__, VDisplay2, group);
5557 theCommands.Add ("vupdate",
5558 "vupdate name1 [name2] ... [name n]"
5559 "\n\t\t: Updates named objects in interactive context",
5560 __FILE__, VUpdate, group);
5562 theCommands.Add("verase",
5563 "verase [-noupdate|-update] [-local] [name1] ... [name n]"
5564 "\n\t\t: Erases selected or named objects."
5565 "\n\t\t: If there are no selected or named objects the whole viewer is erased."
5566 "\n\t\t: Option -local enables erasing of selected or named objects without"
5567 "\n\t\t: closing local selection context.",
5568 __FILE__, VErase, group);
5570 theCommands.Add("vremove",
5571 "vremove [-noupdate|-update] [-context] [-all] [-noinfo] [name1] ... [name n]"
5572 "or vremove [-context] -all to remove all objects"
5573 "\n\t\t: Removes selected or named objects."
5574 "\n\t\t If -context is in arguments, the objects are not deleted"
5575 "\n\t\t from the map of objects and names."
5576 "\n\t\t: Option -local enables removing of selected or named objects without"
5577 "\n\t\t: closing local selection context. Empty local selection context will be"
5579 "\n\t\t: Option -noupdate suppresses viewer redraw call."
5580 "\n\t\t: Option -noinfo suppresses displaying the list of removed objects.",
5581 __FILE__, VRemove, group);
5583 theCommands.Add("vdonly",
5584 "vdonly [-noupdate|-update] [name1] ... [name n]"
5585 "\n\t\t: Displays only selected or named objects",
5586 __FILE__,VDonly2,group);
5588 theCommands.Add("vdisplayall",
5589 "vidsplayall [-local]"
5590 "\n\t\t: Displays all erased interactive objects (see vdir and vstate)."
5591 "\n\t\t: Option -local enables displaying of the objects in local"
5592 "\n\t\t: selection context.",
5593 __FILE__, VDisplayAll, group);
5595 theCommands.Add("veraseall",
5596 "veraseall [-local]"
5597 "\n\t\t: Erases all objects displayed in the viewer."
5598 "\n\t\t: Option -local enables erasing of the objects in local"
5599 "\n\t\t: selection context.",
5600 __FILE__, VErase, group);
5602 theCommands.Add("verasetype",
5604 "\n\t\t: Erase all the displayed objects of one given kind (see vtypes)",
5605 __FILE__, VEraseType, group);
5606 theCommands.Add("vbounding",
5607 "vbounding [-noupdate|-update] [-mode] name1 [name2 [...]]"
5608 "\n\t\t: [-print] [-hide]"
5609 "\n\t\t: Temporarily display bounding box of specified Interactive"
5610 "\n\t\t: Objects, or print it to console if -print is specified."
5611 "\n\t\t: Already displayed box might be hidden by -hide option.",
5612 __FILE__,VBounding,group);
5614 theCommands.Add("vdisplaytype",
5615 "vdisplaytype : vdisplaytype <Type> <Signature> \n\t display all the objects of one given kind (see vtypes) which are stored the AISContext ",
5616 __FILE__,VDisplayType,group);
5618 theCommands.Add("vdisplaymode",
5619 "vdispmode : vdispmode [name] mode(1,2,..) : no name -> on selected objects ",
5620 __FILE__,VDispMode,group);
5622 theCommands.Add("verasemode",
5623 "verasemode : verasemode [name] mode(1,2,..) : no name -> on selected objects",
5624 __FILE__,VDispMode,group);
5626 theCommands.Add("vsetdispmode",
5627 "vsetdispmode [name] mode(1,2,..)"
5628 "\n\t\t: Sets display mode for all, selected or named objects.",
5629 __FILE__,VDispMode,group);
5631 theCommands.Add("vunsetdispmode",
5632 "vunsetdispmode [name]"
5633 "\n\t\t: Unsets custom display mode for selected or named objects.",
5634 __FILE__,VDispMode,group);
5636 theCommands.Add("vdir",
5637 "Lists all objects displayed in 3D viewer",
5638 __FILE__,VDir,group);
5640 #ifdef HAVE_FREEIMAGE
5641 #define DUMP_FORMATS "{png|bmp|jpg|gif}"
5643 #define DUMP_FORMATS "{ppm}"
5645 theCommands.Add("vdump",
5646 "vdump <filename>." DUMP_FORMATS " [-width Width -height Height]"
5647 "\n\t\t: [-buffer rgb|rgba|depth=rgb]"
5648 "\n\t\t: [-stereo mono|left|right|blend|sideBySide|overUnder=mono]"
5649 "\n\t\t: Dumps content of the active view into image file",
5650 __FILE__,VDump,group);
5652 theCommands.Add("vsub", "vsub 0/1 (off/on) [obj] : Subintensity(on/off) of selected objects",
5653 __FILE__,VSubInt,group);
5655 theCommands.Add("vaspects",
5656 "vaspects [-noupdate|-update] [name1 [name2 [...]] | -defaults]"
5657 "\n\t\t: [-setVisibility 0|1]"
5658 "\n\t\t: [-setColor ColorName] [-setcolor R G B] [-unsetColor]"
5659 "\n\t\t: [-setMaterial MatName] [-unsetMaterial]"
5660 "\n\t\t: [-setTransparency Transp] [-unsetTransparency]"
5661 "\n\t\t: [-setWidth LineWidth] [-unsetWidth]"
5662 "\n\t\t: [-setLineType {solid|dash|dot|dotDash}] [-unsetLineType]"
5663 "\n\t\t: [-freeBoundary {off/on | 0/1}]"
5664 "\n\t\t: [-setFreeBoundaryWidth Width] [-unsetFreeBoundaryWidth]"
5665 "\n\t\t: [-setFreeBoundaryColor {ColorName | R G B}] [-unsetFreeBoundaryColor]"
5666 "\n\t\t: [-subshapes subname1 [subname2 [...]]]"
5667 "\n\t\t: [-isoontriangulation 0|1]"
5668 "\n\t\t: [-setMaxParamValue {value}]"
5669 "\n\t\t: [-setSensitivity {selection_mode} {value}]"
5670 "\n\t\t: Manage presentation properties of all, selected or named objects."
5671 "\n\t\t: When -subshapes is specified than following properties will be"
5672 "\n\t\t: assigned to specified sub-shapes."
5673 "\n\t\t: When -defaults is specified than presentation properties will be"
5674 "\n\t\t: assigned to all objects that have not their own specified properties"
5675 "\n\t\t: and to all objects to be displayed in the future."
5676 "\n\t\t: If -defaults is used there should not be any objects' names and -subshapes specifier.",
5677 __FILE__,VAspects,group);
5679 theCommands.Add("vsetcolor",
5680 "vsetcolor [-noupdate|-update] [name] ColorName"
5681 "\n\t\t: Sets color for all, selected or named objects."
5682 "\n\t\t: Alias for vaspects -setcolor [name] ColorName.",
5683 __FILE__,VAspects,group);
5685 theCommands.Add("vunsetcolor",
5686 "vunsetcolor [-noupdate|-update] [name]"
5687 "\n\t\t: Resets color for all, selected or named objects."
5688 "\n\t\t: Alias for vaspects -unsetcolor [name].",
5689 __FILE__,VAspects,group);
5691 theCommands.Add("vsettransparency",
5692 "vsettransparency [-noupdate|-update] [name] Coefficient"
5693 "\n\t\t: Sets transparency for all, selected or named objects."
5694 "\n\t\t: The Coefficient may be between 0.0 (opaque) and 1.0 (fully transparent)."
5695 "\n\t\t: Alias for vaspects -settransp [name] Coefficient.",
5696 __FILE__,VAspects,group);
5698 theCommands.Add("vunsettransparency",
5699 "vunsettransparency [-noupdate|-update] [name]"
5700 "\n\t\t: Resets transparency for all, selected or named objects."
5701 "\n\t\t: Alias for vaspects -unsettransp [name].",
5702 __FILE__,VAspects,group);
5704 theCommands.Add("vsetmaterial",
5705 "vsetmaterial [-noupdate|-update] [name] MaterialName"
5706 "\n\t\t: Alias for vaspects -setmaterial [name] MaterialName.",
5707 __FILE__,VAspects,group);
5709 theCommands.Add("vunsetmaterial",
5710 "vunsetmaterial [-noupdate|-update] [name]"
5711 "\n\t\t: Alias for vaspects -unsetmaterial [name].",
5712 __FILE__,VAspects,group);
5714 theCommands.Add("vsetwidth",
5715 "vsetwidth [-noupdate|-update] [name] width(0->10)"
5716 "\n\t\t: Alias for vaspects -setwidth [name] width.",
5717 __FILE__,VAspects,group);
5719 theCommands.Add("vunsetwidth",
5720 "vunsetwidth [-noupdate|-update] [name]"
5721 "\n\t\t: Alias for vaspects -unsetwidth [name] width.",
5722 __FILE__,VAspects,group);
5724 theCommands.Add("vsetinteriorstyle",
5725 "vsetinteriorstyle [-noupdate|-update] [name] style"
5726 "\n\t\t: Where style is: 0 = EMPTY, 1 = HOLLOW, 2 = HATCH, 3 = SOLID, 4 = HIDDENLINE.",
5727 __FILE__,VSetInteriorStyle,group);
5729 theCommands.Add("vsensdis",
5730 "vsensdis : Display active entities (sensitive entities of one of the standard types corresponding to active selection modes)."
5731 "\n\t\t: Standard entity types are those defined in Select3D package:"
5732 "\n\t\t: - sensitive box"
5733 "\n\t\t: - sensitive face"
5734 "\n\t\t: - sensitive curve"
5735 "\n\t\t: - sensitive segment"
5736 "\n\t\t: - sensitive circle"
5737 "\n\t\t: - sensitive point"
5738 "\n\t\t: - sensitive triangulation"
5739 "\n\t\t: - sensitive triangle"
5740 "\n\t\t: Custom(application - defined) sensitive entity types are not processed by this command.",
5741 __FILE__,VDispSensi,group);
5743 theCommands.Add("vsensera",
5744 "vsensera : erase active entities",
5745 __FILE__,VClearSensi,group);
5747 theCommands.Add("vselprecision",
5748 "vselprecision [-unset] [tolerance_value]"
5749 "\n\t\t Manages selection precision or prints current value if no parameter is passed."
5750 "\n\t\t -unset - restores default selection tolerance behavior, based on individual entity tolerance",
5751 __FILE__,VSelPrecision,group);
5753 theCommands.Add("vperf",
5754 "vperf: vperf ShapeName 1/0(Transfo/Location) 1/0(Primitives sensibles ON/OFF)"
5755 "\n\t\t: Tests the animation of an object along a predefined trajectory.",
5756 __FILE__,VPerf,group);
5758 theCommands.Add("vanimation",
5759 "vanimation CrankArmFile CylinderHeadFile PropellerFile EngineBlockFile",
5760 __FILE__,VAnimation,group);
5762 theCommands.Add("vsetshading",
5763 "vsetshading : vsetshading name Quality(default=0.0008) "
5764 "\n\t\t: Sets deflection coefficient that defines the quality of the shape representation in the shading mode.",
5765 __FILE__,VShading,group);
5767 theCommands.Add("vunsetshading",
5768 "vunsetshading :vunsetshading name "
5769 "\n\t\t: Sets default deflection coefficient (0.0008) that defines the quality of the shape representation in the shading mode.",
5770 __FILE__,VShading,group);
5772 theCommands.Add ("vtexture",
5773 "\n'vtexture NameOfShape [TextureFile | IdOfTexture]\n"
5774 " [-scale u v] [-scale off]\n"
5775 " [-origin u v] [-origin off]\n"
5776 " [-repeat u v] [-repeat off]\n"
5777 " [-modulate {on | off}]"
5779 " The texture can be specified by filepath or as ID (0<=IdOfTexture<=20)\n"
5780 " specifying one of the predefined textures.\n"
5781 " The options are: \n"
5782 " -scale u v : enable texture scaling and set scale factors\n"
5783 " -scale off : disable texture scaling\n"
5784 " -origin u v : enable texture origin positioning and set the origin\n"
5785 " -origin off : disable texture origin positioning\n"
5786 " -repeat u v : enable texture repeat and set texture coordinate scaling\n"
5787 " -repeat off : disable texture repeat\n"
5788 " -modulate {on | off} : enable or disable texture modulation\n"
5789 " -default : sets texture mapping default parameters\n"
5790 "or 'vtexture NameOfShape' if you want to disable texture mapping\n"
5791 "or 'vtexture NameOfShape ?' to list available textures\n",
5792 __FILE__, VTexture, group);
5794 theCommands.Add("vtexscale",
5795 "'vtexscale NameOfShape ScaleU ScaleV' \n \
5796 or 'vtexscale NameOfShape ScaleUV' \n \
5797 or 'vtexscale NameOfShape' to disable scaling\n ",
5798 __FILE__,VTexture,group);
5800 theCommands.Add("vtexorigin",
5801 "'vtexorigin NameOfShape UOrigin VOrigin' \n \
5802 or 'vtexorigin NameOfShape UVOrigin' \n \
5803 or 'vtexorigin NameOfShape' to disable origin positioning\n ",
5804 __FILE__,VTexture,group);
5806 theCommands.Add("vtexrepeat",
5807 "'vtexrepeat NameOfShape URepeat VRepeat' \n \
5808 or 'vtexrepeat NameOfShape UVRepeat \n \
5809 or 'vtexrepeat NameOfShape' to disable texture repeat \n ",
5812 theCommands.Add("vtexdefault",
5813 "'vtexdefault NameOfShape' to set texture mapping default parameters \n",
5816 theCommands.Add("vsetam",
5817 "vsetam [shapename] mode"
5818 "\n\t\t: Activates selection mode for all selected or named shapes."
5819 "\n\t\t: Mod can be:"
5820 "\n\t\t: 0 - for shape itself"
5821 "\n\t\t: 1 - vertices"
5825 "\n\t\t: 5 - shells"
5826 "\n\t\t: 6 - solids"
5827 "\n\t\t: 7 - compounds"
5828 __FILE__,VActivatedMode,group);
5830 theCommands.Add("vunsetam",
5831 "vunsetam : Deactivates all selection modes for all shapes.",
5832 __FILE__,VActivatedMode,group);
5834 theCommands.Add("vstate",
5835 "vstate [-entities] [-hasSelected] [name1] ... [nameN]"
5836 "\n\t\t: Reports show/hidden state for selected or named objects"
5837 "\n\t\t: -entities - print low-level information about detected entities"
5838 "\n\t\t: -hasSelected - prints 1 if context has selected shape and 0 otherwise",
5839 __FILE__,VState,group);
5841 theCommands.Add("vpickshapes",
5842 "vpickshape subtype(VERTEX,EDGE,WIRE,FACE,SHELL,SOLID) [name1 or .] [name2 or .] [name n or .]",
5843 __FILE__,VPickShape,group);
5845 theCommands.Add("vtypes",
5846 "vtypes : list of known types and signatures in AIS - To be Used in vpickobject command for selection with filters",
5849 theCommands.Add("vr",
5851 "\n\t\t: Reads shape from BREP-format file and displays it in the viewer. ",
5852 __FILE__,vr, group);
5854 theCommands.Add("vpickselected", "vpickselected [name]: extract selected shape.",
5855 __FILE__, VPickSelected, group);
5857 theCommands.Add ("vloadselection",
5858 "vloadselection [-context] [name1] ... [nameN] : allows to load selection"
5859 "\n\t\t: primitives for the shapes with names given without displaying them."
5860 "\n\t\t: -local - open local context before selection computation",
5861 __FILE__, VLoadSelection, group);
5863 theCommands.Add ("vautoactivatesel",
5864 "vautoactivatesel [0|1] : manage or display the option to automatically"
5865 "\n\t\t: activate selection for newly displayed objects"
5866 "\n\t\t: [0|1] - turn off | on auto activation of selection",
5867 __FILE__, VAutoActivateSelection, group);
5869 theCommands.Add("vbsdf", "vbsdf [name] [options]"
5870 "\nAdjusts parameters of material BSDF:"
5871 "\n -help : Shows this message"
5872 "\n -print : Print BSDF"
5873 "\n -kd : Weight of the Lambertian BRDF"
5874 "\n -kr : Weight of the reflection BRDF"
5875 "\n -kt : Weight of the transmission BTDF"
5876 "\n -ks : Weight of the glossy Blinn BRDF"
5877 "\n -le : Self-emitted radiance"
5878 "\n -fresnel : Fresnel coefficients; Allowed fresnel formats are: Constant x,"
5879 "\n Schlick x y z, Dielectric x, Conductor x y"
5880 "\n -roughness : Roughness of material (Blinn's exponent)"
5881 "\n -absorpcoeff : Absorption coefficient (only for transparent material)"
5882 "\n -absorpcolor : Absorption color (only for transparent material)"
5883 "\n -normalize : Normalize BSDF coefficients",
5884 __FILE__, VBsdf, group);
5888 //=====================================================================
5889 //========================= for testing Draft and Rib =================
5890 //=====================================================================
5891 #include <BRepOffsetAPI_MakeThickSolid.hxx>
5892 #include <DBRep.hxx>
5893 #include <TopoDS_Face.hxx>
5894 #include <gp_Pln.hxx>
5895 #include <AIS_KindOfSurface.hxx>
5896 #include <BRepOffsetAPI_DraftAngle.hxx>
5897 #include <Precision.hxx>
5898 #include <BRepAlgo.hxx>
5899 #include <OSD_Environment.hxx>
5900 #include <DrawTrSurf.hxx>
5901 //#include <DbgTools.hxx>
5902 //#include <FeatAlgo_MakeLinearForm.hxx>
5907 //=======================================================================
5908 //function : IsValid
5910 //=======================================================================
5911 static Standard_Boolean IsValid(const TopTools_ListOfShape& theArgs,
5912 const TopoDS_Shape& theResult,
5913 const Standard_Boolean closedSolid,
5914 const Standard_Boolean GeomCtrl)
5916 OSD_Environment check ("DONT_SWITCH_IS_VALID") ;
5917 TCollection_AsciiString checkValid = check.Value();
5918 Standard_Boolean ToCheck = Standard_True;
5919 if (!checkValid.IsEmpty()) {
5921 cout <<"DONT_SWITCH_IS_VALID positionnee a :"<<checkValid.ToCString()<<"\n";
5923 if ( checkValid=="true" || checkValid=="TRUE" ) {
5924 ToCheck= Standard_False;
5928 cout <<"DONT_SWITCH_IS_VALID non positionne\n";
5931 Standard_Boolean IsValid = Standard_True;
5933 IsValid = BRepAlgo::IsValid(theArgs,theResult,closedSolid,GeomCtrl) ;
5938 //===============================================================================
5939 // TDraft : test draft, uses AIS Viewer
5940 // Solid Face Plane Angle Reverse
5941 //===============================================================================
5942 static Standard_Integer TDraft(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
5944 if (argc < 5) return 1;
5945 // argv[1] - TopoDS_Shape Solid
5946 // argv[2] - TopoDS_Shape Face
5947 // argv[3] - TopoDS_Shape Plane
5948 // argv[4] - Standard_Real Angle
5949 // argv[5] - Standard_Integer Reverse
5951 // Sprintf(prefix, argv[1]);
5952 Standard_Real anAngle = 0;
5953 Standard_Boolean Rev = Standard_False;
5954 Standard_Integer rev = 0;
5955 TopoDS_Shape Solid = GetShapeFromName(argv[1]);
5956 TopoDS_Shape face = GetShapeFromName(argv[2]);
5957 TopoDS_Face Face = TopoDS::Face(face);
5958 TopoDS_Shape Plane = GetShapeFromName(argv[3]);
5959 if (Plane.IsNull ()) {
5960 di << "TEST : Plane is NULL\n";
5963 anAngle = Draw::Atof(argv[4]);
5964 anAngle = 2*M_PI * anAngle / 360.0;
5966 Handle( Geom_Surface )aSurf;
5967 AIS_KindOfSurface aSurfType;
5968 Standard_Real Offset;
5970 if(argc > 4) { // == 5
5971 rev = Draw::Atoi(argv[5]);
5972 Rev = (rev)? Standard_True : Standard_False;
5975 TopoDS_Face face2 = TopoDS::Face(Plane);
5976 if(!AIS::GetPlaneFromFace(face2, aPln, aSurf, aSurfType, Offset))
5978 di << "TEST : Can't find plane\n";
5982 aDir = aPln.Axis().Direction();
5985 if (Plane.Orientation() == TopAbs_REVERSED)
5987 di << "TEST : gp::Resolution() = " << gp::Resolution() << "\n";
5989 BRepOffsetAPI_DraftAngle Draft (Solid);
5991 if(Abs(anAngle)< Precision::Angular()) {
5992 di << "TEST : NULL angle\n";
5995 if(Rev) anAngle = - anAngle;
5996 Draft.Add (Face, aDir, anAngle, aPln);
5998 if (!Draft.IsDone()) {
5999 di << "TEST : Draft Not DONE \n";
6002 TopTools_ListOfShape Larg;
6004 if (!IsValid(Larg,Draft.Shape(),Standard_True,Standard_False)) {
6005 di << "TEST : DesignAlgo returns Not valid\n";
6009 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
6010 Handle(AIS_Shape) ais = new AIS_Shape(Draft.Shape());
6012 if ( !ais.IsNull() ) {
6013 ais->SetColor(DEFAULT_COLOR);
6014 ais->SetMaterial(DEFAULT_MATERIAL);
6015 // Display the AIS_Shape without redraw
6016 Ctx->Display(ais, Standard_False);
6018 const char *Name = "draft1";
6019 Standard_Boolean IsBound = GetMapOfAIS().IsBound2(Name);
6021 Handle(AIS_InteractiveObject) an_object =
6022 Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(Name));
6023 if (!an_object.IsNull()) {
6024 Ctx->Remove(an_object,
6026 GetMapOfAIS().UnBind2(Name) ;
6029 GetMapOfAIS().Bind(ais, Name);
6030 // DBRep::Set("draft", ais->Shape());
6032 Ctx->Display(ais, Standard_True);
6036 //==============================================================================
6037 //function : splitParameter
6038 //purpose : Split parameter string to parameter name and parameter value
6039 //==============================================================================
6040 Standard_Boolean ViewerTest::SplitParameter (const TCollection_AsciiString& theString,
6041 TCollection_AsciiString& theName,
6042 TCollection_AsciiString& theValue)
6044 Standard_Integer aParamNameEnd = theString.FirstLocationInSet ("=", 1, theString.Length());
6046 if (aParamNameEnd == 0)
6048 return Standard_False;
6051 TCollection_AsciiString aString (theString);
6052 if (aParamNameEnd != 0)
6054 theValue = aString.Split (aParamNameEnd);
6055 aString.Split (aString.Length() - 1);
6059 return Standard_True;
6062 //============================================================================
6064 //============================================================================
6065 void ViewerTest::MyCommands( Draw_Interpretor& theCommands)
6068 DrawTrSurf::BasicCommands(theCommands);
6069 const char* group = "Check Features Operations commands";
6071 theCommands.Add("Draft","Draft Solid Face Plane Angle Reverse",
6073 &TDraft,group); //Draft_Modification
6076 //==============================================================================
6077 // ViewerTest::Factory
6078 //==============================================================================
6079 void ViewerTest::Factory(Draw_Interpretor& theDI)
6081 // definition of Viewer Command
6082 ViewerTest::Commands(theDI);
6083 ViewerTest::AviCommands(theDI);
6086 theDI << "Draw Plugin : OCC V2d & V3d commands are loaded\n";
6090 // Declare entry point PLUGINFACTORY