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 <TopLoc_Location.hxx>
29 #include <TopTools_HArray1OfShape.hxx>
30 #include <TColStd_HArray1OfTransient.hxx>
31 #include <TColStd_HSequenceOfAsciiString.hxx>
32 #include <OSD_Timer.hxx>
33 #include <Geom_Axis2Placement.hxx>
34 #include <Geom_Axis1Placement.hxx>
35 #include <gp_Trsf.hxx>
36 #include <TopExp_Explorer.hxx>
37 #include <BRepAdaptor_Curve.hxx>
38 #include <StdSelect_ShapeTypeFilter.hxx>
40 #include <AIS_Drawer.hxx>
41 #include <AIS_ColoredShape.hxx>
42 #include <AIS_InteractiveObject.hxx>
43 #include <AIS_Trihedron.hxx>
44 #include <AIS_Axis.hxx>
45 #include <AIS_Relation.hxx>
46 #include <AIS_TypeFilter.hxx>
47 #include <AIS_SignatureFilter.hxx>
48 #include <AIS_LocalContext.hxx>
49 #include <AIS_ListOfInteractive.hxx>
50 #include <AIS_ListIteratorOfListOfInteractive.hxx>
51 #include <Aspect_InteriorStyle.hxx>
52 #include <Aspect_Window.hxx>
53 #include <Graphic3d_AspectFillArea3d.hxx>
54 #include <Graphic3d_AspectLine3d.hxx>
55 #include <Graphic3d_TextureRoot.hxx>
56 #include <Image_AlienPixMap.hxx>
57 #include <Prs3d_ShadingAspect.hxx>
58 #include <Prs3d_IsoAspect.hxx>
59 #include <TopTools_MapOfShape.hxx>
69 #include <Draw_Interpretor.hxx>
70 #include <TCollection_AsciiString.hxx>
71 #include <Draw_PluginMacro.hxx>
72 #include <ViewerTest.hxx>
74 // avoid warnings on 'extern "C"' functions returning C++ classes
76 #define _CRT_SECURE_NO_DEPRECATE
77 #pragma warning(4:4190)
78 #pragma warning (disable:4996)
81 #include <NIS_InteractiveContext.hxx>
82 #include <NIS_Triangulated.hxx>
83 extern int ViewerMainLoop(Standard_Integer argc, const char** argv);
85 #include <Quantity_Color.hxx>
86 #include <Quantity_NameOfColor.hxx>
88 #include <Graphic3d_NameOfMaterial.hxx>
90 #define DEFAULT_COLOR Quantity_NOC_GOLDENROD
91 #define DEFAULT_MATERIAL Graphic3d_NOM_BRASS
93 enum ViewerTest_RedrawMode
95 ViewerTest_RM_Auto = -1,
96 ViewerTest_RM_RedrawForce,
97 ViewerTest_RM_RedrawSuppress
100 //! Auxiliary method to parse redraw mode argument
101 static Standard_Boolean parseRedrawMode (const TCollection_AsciiString& theArg,
102 ViewerTest_RedrawMode& theMode)
104 TCollection_AsciiString anArgCase (theArg);
105 anArgCase.LowerCase();
106 if (anArgCase == "-update"
107 || anArgCase == "-redraw")
109 theMode = ViewerTest_RM_RedrawForce;
110 return Standard_True;
112 else if (anArgCase == "-noupdate"
113 || anArgCase == "-noredraw")
115 theMode = ViewerTest_RM_RedrawSuppress;
116 return Standard_True;
118 return Standard_False;
121 //=======================================================================
122 //function : GetColorFromName
123 //purpose : get the Quantity_NameOfColor from a string
124 //=======================================================================
126 Quantity_NameOfColor ViewerTest::GetColorFromName (const Standard_CString theName)
128 for (Standard_Integer anIter = Quantity_NOC_BLACK; anIter <= Quantity_NOC_WHITE; ++anIter)
130 Standard_CString aColorName = Quantity_Color::StringName (Quantity_NameOfColor (anIter));
131 if (strcasecmp (theName, aColorName) == 0)
133 return Quantity_NameOfColor (anIter);
137 return DEFAULT_COLOR;
140 //=======================================================================
141 //function : GetTypeNames
143 //=======================================================================
144 static const char** GetTypeNames()
146 static const char* names[14] = {"Point","Axis","Trihedron","PlaneTrihedron", "Line","Circle","Plane",
147 "Shape","ConnectedShape","MultiConn.Shape",
148 "ConnectedInter.","MultiConn.",
149 "Constraint","Dimension"};
150 static const char** ThePointer = names;
154 //=======================================================================
155 //function : GetTypeAndSignfromString
157 //=======================================================================
158 void GetTypeAndSignfromString (const char* name,AIS_KindOfInteractive& TheType,Standard_Integer& TheSign)
160 const char ** thefullnames = GetTypeNames();
161 Standard_Integer index(-1);
163 for(Standard_Integer i=0;i<=13 && index==-1;i++)
164 if(!strcasecmp(name,thefullnames[i]))
168 TheType = AIS_KOI_None;
174 TheType = AIS_KOI_Datum;
178 TheType = AIS_KOI_Shape;
182 TheType = AIS_KOI_Object;
186 TheType = AIS_KOI_Relation;
195 #include <Draw_Interpretor.hxx>
197 #include <Draw_Appli.hxx>
201 #include <TCollection_AsciiString.hxx>
202 #include <V3d_Viewer.hxx>
203 #include <V3d_View.hxx>
206 #include <AIS_InteractiveContext.hxx>
207 #include <AIS_Shape.hxx>
208 #include <AIS_TexturedShape.hxx>
209 #include <AIS_DisplayMode.hxx>
210 #include <TColStd_MapOfInteger.hxx>
211 #include <AIS_MapOfInteractive.hxx>
212 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
213 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
214 #include <ViewerTest_EventManager.hxx>
216 #include <TopoDS_Solid.hxx>
217 #include <BRepTools.hxx>
218 #include <BRep_Builder.hxx>
219 #include <TopAbs_ShapeEnum.hxx>
221 #include <TopoDS.hxx>
222 #include <BRep_Tool.hxx>
225 #include <Draw_Window.hxx>
226 #include <AIS_ListIteratorOfListOfInteractive.hxx>
227 #include <AIS_ListOfInteractive.hxx>
228 #include <AIS_DisplayMode.hxx>
229 #include <TopTools_ListOfShape.hxx>
230 #include <BRepOffsetAPI_MakeThickSolid.hxx>
231 #include <BRepOffset.hxx>
233 //==============================================================================
234 // VIEWER OBJECT MANAGEMENT GLOBAL VARIABLES
235 //==============================================================================
236 Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS(){
237 static ViewerTest_DoubleMapOfInteractiveAndName TheMap;
242 //==============================================================================
243 //function : VDisplayAISObject
244 //purpose : register interactive object in the map of AIS objects;
245 // if other object with such name already registered, it will be kept
246 // or replaced depending on value of <theReplaceIfExists>,
247 // if "true" - the old object will be cleared from AIS context;
248 // returns Standard_True if <theAISObj> registered in map;
249 //==============================================================================
250 Standard_EXPORT Standard_Boolean VDisplayAISObject (const TCollection_AsciiString& theName,
251 const Handle(AIS_InteractiveObject)& theAISObj,
252 Standard_Boolean theReplaceIfExists = Standard_True)
254 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
255 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
256 if (aContextAIS.IsNull())
258 std::cout << "AIS context is not available.\n";
259 return Standard_False;
262 if (aMap.IsBound2 (theName))
264 if (!theReplaceIfExists)
266 std::cout << "Other interactive object has been already "
267 << "registered with name: " << theName << ".\n"
268 << "Please use another name.\n";
269 return Standard_False;
272 // stop displaying object
273 Handle(AIS_InteractiveObject) anOldObj =
274 Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (theName));
276 if (!anOldObj.IsNull())
277 aContextAIS->Clear (anOldObj, Standard_True);
279 // remove name and old object from map
280 aMap.UnBind2 (theName);
283 if (theAISObj.IsNull())
285 // object with specified name already unbound
286 return Standard_True;
289 // unbind AIS object if was bound with another name
290 aMap.UnBind1 (theAISObj);
292 // can be registered without rebinding
293 aMap.Bind (theAISObj, theName);
294 aContextAIS->Display (theAISObj, Standard_True);
295 return Standard_True;
298 static TColStd_MapOfInteger theactivatedmodes(8);
299 static TColStd_ListOfTransient theEventMgrs;
301 static void VwrTst_InitEventMgr(const Handle(NIS_View)& aView,
302 const Handle(AIS_InteractiveContext)& Ctx)
304 theEventMgrs.Clear();
305 theEventMgrs.Prepend(new ViewerTest_EventManager(aView, Ctx));
308 static Handle(V3d_View)& a3DView()
310 static Handle(V3d_View) Viou;
315 Standard_EXPORT Handle(AIS_InteractiveContext)& TheAISContext(){
316 static Handle(AIS_InteractiveContext) aContext;
320 const Handle(V3d_View)& ViewerTest::CurrentView()
324 void ViewerTest::CurrentView(const Handle(V3d_View)& V)
329 Standard_EXPORT const Handle(NIS_InteractiveContext)& TheNISContext()
331 static Handle(NIS_InteractiveContext) aContext;
332 if (aContext.IsNull()) {
333 aContext = new NIS_InteractiveContext;
334 aContext->SetSelectionMode (NIS_InteractiveContext::Mode_Normal);
339 const Handle(AIS_InteractiveContext)& ViewerTest::GetAISContext()
341 return TheAISContext();
344 void ViewerTest::SetAISContext (const Handle(AIS_InteractiveContext)& aCtx)
346 TheAISContext() = aCtx;
347 ViewerTest::ResetEventManager();
350 Handle(V3d_Viewer) ViewerTest::GetViewerFromContext()
352 return !TheAISContext().IsNull() ? TheAISContext()->CurrentViewer() : Handle(V3d_Viewer)();
355 Handle(V3d_Viewer) ViewerTest::GetCollectorFromContext()
357 return !TheAISContext().IsNull() ? TheAISContext()->CurrentViewer() : Handle(V3d_Viewer)();
361 void ViewerTest::SetEventManager(const Handle(ViewerTest_EventManager)& EM){
362 theEventMgrs.Prepend(EM);
365 void ViewerTest::UnsetEventManager()
367 theEventMgrs.RemoveFirst();
371 void ViewerTest::ResetEventManager()
373 const Handle(NIS_View) aView =
374 Handle(NIS_View)::DownCast(ViewerTest::CurrentView());
375 VwrTst_InitEventMgr(aView, ViewerTest::GetAISContext());
378 Handle(ViewerTest_EventManager) ViewerTest::CurrentEventManager()
380 Handle(ViewerTest_EventManager) EM;
381 if(theEventMgrs.IsEmpty()) return EM;
382 Handle(Standard_Transient) Tr = theEventMgrs.First();
383 EM = *((Handle(ViewerTest_EventManager)*)&Tr);
387 //=======================================================================
388 //function : Get Context and active view
390 //=======================================================================
391 static Standard_Boolean getCtxAndView (Handle(AIS_InteractiveContext)& theCtx,
392 Handle(V3d_View)& theView)
394 theCtx = ViewerTest::GetAISContext();
395 theView = ViewerTest::CurrentView();
399 std::cout << "Error: cannot find an active view!\n";
400 return Standard_False;
402 return Standard_True;
405 //==============================================================================
406 //function : GetShapeFromName
407 //purpose : Compute an Shape from a draw variable or a file name
408 //==============================================================================
410 static TopoDS_Shape GetShapeFromName(const char* name)
412 TopoDS_Shape S = DBRep::Get(name);
415 BRep_Builder aBuilder;
416 BRepTools::Read( S, name, aBuilder);
422 //==============================================================================
423 //function : GetAISShapeFromName
424 //purpose : Compute an AIS_Shape from a draw variable or a file name
425 //==============================================================================
426 Handle(AIS_Shape) GetAISShapeFromName(const char* name)
428 Handle(AIS_Shape) retsh;
430 if(GetMapOfAIS().IsBound2(name)){
431 const Handle(AIS_InteractiveObject) IO =
432 Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
434 if(IO->Type()==AIS_KOI_Shape) {
435 if(IO->Signature()==0){
436 retsh = *((Handle(AIS_Shape)*)&IO);
439 cout << "an Object which is not an AIS_Shape "
440 "already has this name!!!"<<endl;
447 TopoDS_Shape S = GetShapeFromName(name);
449 retsh = new AIS_Shape(S);
455 //==============================================================================
457 //purpose : Remove all the object from the viewer
458 //==============================================================================
459 void ViewerTest::Clear()
461 if ( !a3DView().IsNull() ) {
462 if (TheAISContext()->HasOpenedContext())
463 TheAISContext()->CloseLocalContext();
464 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it(GetMapOfAIS());
465 while ( it.More() ) {
466 cout << "Remove " << it.Key2() << endl;
467 if (it.Key1()->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
468 const Handle(AIS_InteractiveObject) anObj =
469 Handle(AIS_InteractiveObject)::DownCast (it.Key1());
470 TheAISContext()->Remove(anObj,Standard_False);
471 } else if (it.Key1()->IsKind(STANDARD_TYPE(NIS_InteractiveObject))) {
472 const Handle(NIS_InteractiveObject) anObj =
473 Handle(NIS_InteractiveObject)::DownCast (it.Key1());
474 TheNISContext()->Remove(anObj);
478 TheAISContext()->UpdateCurrentViewer();
479 // TheNISContext()->UpdateViews();
480 GetMapOfAIS().Clear();
484 //==============================================================================
485 //function : StandardModesActivation
486 //purpose : Activate a selection mode, vertex, edge, wire ..., in a local
488 //==============================================================================
489 void ViewerTest::StandardModeActivation(const Standard_Integer mode )
491 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
493 if (TheAISContext()->HasOpenedContext())
494 aContext->CloseLocalContext();
497 if(!aContext->HasOpenedContext()) {
498 // To unhilight the preselected object
499 aContext->UnhilightCurrents(Standard_False);
500 // Open a local Context in order to be able to select subshape from
501 // the selected shape if any or for all if there is no selection
502 if (!aContext->FirstCurrentObject().IsNull()){
503 aContext->OpenLocalContext(Standard_False);
505 for(aContext->InitCurrent();aContext->MoreCurrent();aContext->NextCurrent()){
506 aContext->Load( aContext->Current(),-1,Standard_True);
510 aContext->OpenLocalContext();
513 const char *cmode="???";
516 case 0: cmode = "Shape"; break;
517 case 1: cmode = "Vertex"; break;
518 case 2: cmode = "Edge"; break;
519 case 3: cmode = "Wire"; break;
520 case 4: cmode = "Face"; break;
521 case 5: cmode = "Shell"; break;
522 case 6: cmode = "Solid"; break;
523 case 7: cmode = "Compsolid"; break;
524 case 8: cmode = "Compound"; break;
527 if(theactivatedmodes.Contains(mode))
529 aContext->DeactivateStandardMode(AIS_Shape::SelectionType(mode));
530 theactivatedmodes.Remove(mode);
531 cout<<"Mode "<< cmode <<" OFF"<<endl;
535 aContext->ActivateStandardMode(AIS_Shape::SelectionType(mode));
536 theactivatedmodes.Add(mode);
537 cout<<"Mode "<< cmode << " ON" << endl;
542 //==============================================================================
543 //function : CopyIsoAspect
544 //purpose : Returns copy Prs3d_IsoAspect with new number of isolines.
545 //==============================================================================
546 static Handle(Prs3d_IsoAspect) CopyIsoAspect
547 (const Handle(Prs3d_IsoAspect) &theIsoAspect,
548 const Standard_Integer theNbIsos)
550 Quantity_Color aColor;
551 Aspect_TypeOfLine aType;
552 Standard_Real aWidth;
554 theIsoAspect->Aspect()->Values(aColor, aType, aWidth);
556 Handle(Prs3d_IsoAspect) aResult =
557 new Prs3d_IsoAspect(aColor, aType, aWidth, theNbIsos);
562 //==============================================================================
564 //purpose : Returns or sets the number of U- and V- isos and isIsoOnPlane flag
565 //Draw arg : [name1 ...] [nbUIsos nbVIsos IsoOnPlane(0|1)]
566 //==============================================================================
567 static int visos (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
569 if (TheAISContext().IsNull()) {
570 di << argv[0] << " Call 'vinit' before!\n";
575 di << "Current number of isos : " <<
576 TheAISContext()->IsoNumber(AIS_TOI_IsoU) << " " <<
577 TheAISContext()->IsoNumber(AIS_TOI_IsoV) << "\n";
578 di << "IsoOnPlane mode is " <<
579 (TheAISContext()->IsoOnPlane() ? "ON" : "OFF") << "\n";
584 Standard_Integer aLastInd = argc - 1;
585 Standard_Boolean isChanged = Standard_False;
586 Standard_Integer aNbUIsos = 0;
587 Standard_Integer aNbVIsos = 0;
590 Standard_Boolean isIsoOnPlane = Standard_False;
592 if (strcmp(argv[aLastInd], "1") == 0) {
593 isIsoOnPlane = Standard_True;
594 isChanged = Standard_True;
595 } else if (strcmp(argv[aLastInd], "0") == 0) {
596 isIsoOnPlane = Standard_False;
597 isChanged = Standard_True;
601 aNbVIsos = Draw::Atoi(argv[aLastInd - 1]);
602 aNbUIsos = Draw::Atoi(argv[aLastInd - 2]);
605 di << "New number of isos : " << aNbUIsos << " " << aNbVIsos << "\n";
606 di << "New IsoOnPlane mode is " << (isIsoOnPlane ? "ON" : "OFF") << "\n";
608 TheAISContext()->IsoOnPlane(isIsoOnPlane);
611 // If there are no shapes provided set the default numbers.
612 TheAISContext()->SetIsoNumber(aNbUIsos, AIS_TOI_IsoU);
613 TheAISContext()->SetIsoNumber(aNbVIsos, AIS_TOI_IsoV);
620 for (i = 1; i <= aLastInd; i++) {
621 TCollection_AsciiString name(argv[i]);
622 Standard_Boolean IsBound = GetMapOfAIS().IsBound2(name);
625 const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2(name);
626 if (anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
627 const Handle(AIS_InteractiveObject) aShape =
628 Handle(AIS_InteractiveObject)::DownCast (anObj);
629 Handle(AIS_Drawer) CurDrawer = aShape->Attributes();
630 Handle(Prs3d_IsoAspect) aUIso = CurDrawer->UIsoAspect();
631 Handle(Prs3d_IsoAspect) aVIso = CurDrawer->VIsoAspect();
634 CurDrawer->SetUIsoAspect(CopyIsoAspect(aUIso, aNbUIsos));
635 CurDrawer->SetVIsoAspect(CopyIsoAspect(aVIso, aNbVIsos));
636 TheAISContext()->SetLocalAttributes
637 (aShape, CurDrawer, Standard_False);
638 TheAISContext()->Redisplay(aShape);
640 di << "Number of isos for " << argv[i] << " : "
641 << aUIso->Number() << " " << aVIso->Number() << "\n";
644 di << argv[i] << ": Not an AIS interactive object!\n";
647 di << argv[i] << ": Use 'vdisplay' before\n";
652 TheAISContext()->UpdateCurrentViewer();
658 //==============================================================================
659 //function : VDispAreas,VDispSensitive,...
661 //==============================================================================
662 static Standard_Integer VDispAreas (Draw_Interpretor& ,
663 Standard_Integer theArgNb,
668 std::cout << "Error: wrong syntax!\n";
672 Handle(AIS_InteractiveContext) aCtx;
673 Handle(V3d_View) aView;
674 if (!getCtxAndView (aCtx, aView))
679 aCtx->DisplayActiveAreas (aView);
682 static Standard_Integer VClearAreas (Draw_Interpretor& ,
683 Standard_Integer theArgNb,
688 std::cout << "Error: wrong syntax!\n";
692 Handle(AIS_InteractiveContext) aCtx;
693 Handle(V3d_View) aView;
694 if (!getCtxAndView (aCtx, aView))
699 aCtx->ClearActiveAreas (aView);
703 static Standard_Integer VDispSensi (Draw_Interpretor& ,
704 Standard_Integer theArgNb,
709 std::cout << "Error: wrong syntax!\n";
713 Handle(AIS_InteractiveContext) aCtx;
714 Handle(V3d_View) aView;
715 if (!getCtxAndView (aCtx, aView))
720 aCtx->DisplayActiveSensitive (aView);
725 static Standard_Integer VClearSensi (Draw_Interpretor& ,
726 Standard_Integer theArgNb,
731 std::cout << "Error: wrong syntax!\n";
735 Handle(AIS_InteractiveContext) aCtx;
736 Handle(V3d_View) aView;
737 if (!getCtxAndView (aCtx, aView))
741 aCtx->ClearActiveSensitive (aView);
745 //==============================================================================
747 //purpose : To list the displayed object with their attributes
748 //==============================================================================
749 static int VDir (Draw_Interpretor& theDI,
753 if (!a3DView().IsNull())
758 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
759 anIter.More(); anIter.Next())
761 theDI << "\t" << anIter.Key2().ToCString() << "\n";
766 //==============================================================================
767 //function : VSelPrecision
768 //purpose : To set the selection precision mode and tolerance value
769 //Draw arg : Selection precision mode (0 for window, 1 for view) and tolerance
770 // value (integer number of pixel for window mode, double value of
771 // sensitivity for view mode). Without arguments the function just
772 // prints the current precision mode and the corresponding tolerance.
773 //==============================================================================
774 static int VSelPrecision(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
778 di << "Use: " << argv[0] << " [precision_mode [tolerance_value]]\n";
782 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
783 if( aContext.IsNull() )
788 StdSelect_SensitivityMode aMode = aContext->SensitivityMode();
789 if( aMode == StdSelect_SM_WINDOW )
791 Standard_Integer aPixelTolerance = aContext->PixelTolerance();
792 di << "Precision mode : 0 (window)\n";
793 di << "Pixel tolerance : " << aPixelTolerance << "\n";
795 else if( aMode == StdSelect_SM_VIEW )
797 Standard_Real aSensitivity = aContext->Sensitivity();
798 di << "Precision mode : 1 (view)\n";
799 di << "Sensitivity : " << aSensitivity << "\n";
804 StdSelect_SensitivityMode aMode = ( StdSelect_SensitivityMode )Draw::Atoi( argv[1] );
805 aContext->SetSensitivityMode( aMode );
808 if( aMode == StdSelect_SM_WINDOW )
810 Standard_Integer aPixelTolerance = Draw::Atoi( argv[2] );
811 aContext->SetPixelTolerance( aPixelTolerance );
813 else if( aMode == StdSelect_SM_VIEW )
815 Standard_Real aSensitivity = Draw::Atof( argv[2] );
816 aContext->SetSensitivity( aSensitivity );
823 //==============================================================================
825 //purpose : To dump the active view snapshot to image file
826 //==============================================================================
827 static Standard_Integer VDump (Draw_Interpretor& theDI,
828 Standard_Integer theArgNb,
829 Standard_CString* theArgVec)
833 std::cout << "Error: wrong number of arguments! Image file name should be specified at least.\n";
837 Standard_Integer anArgIter = 1;
838 Standard_CString aFilePath = theArgVec[anArgIter++];
839 Graphic3d_BufferType aBufferType = Graphic3d_BT_RGB;
840 V3d_StereoDumpOptions aStereoOpts = V3d_SDO_MONO;
841 Standard_Integer aWidth = 0;
842 Standard_Integer aHeight = 0;
843 for (; anArgIter < theArgNb; ++anArgIter)
845 TCollection_AsciiString anArg (theArgVec[anArgIter]);
849 aBufferType = Graphic3d_BT_RGBA;
851 else if (anArg == "rgb")
853 aBufferType = Graphic3d_BT_RGB;
855 else if (anArg == "depth")
857 aBufferType = Graphic3d_BT_Depth;
859 else if (anArg == "l"
862 aStereoOpts = V3d_SDO_LEFT_EYE;
864 else if (anArg == "r"
867 aStereoOpts = V3d_SDO_RIGHT_EYE;
869 else if (anArg == "mono")
871 aStereoOpts = V3d_SDO_MONO;
873 else if (anArg == "w"
878 std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
881 else if (++anArgIter >= theArgNb)
883 std::cout << "Error: integer value is expected right after 'width'\n";
886 aWidth = Draw::Atoi (theArgVec[anArgIter]);
888 else if (anArg == "h"
889 || anArg == "height")
893 std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
896 if (++anArgIter >= theArgNb)
898 std::cout << "Error: integer value is expected right after 'height'\n";
901 aHeight = Draw::Atoi (theArgVec[anArgIter]);
903 else if (anArg.IsIntegerValue())
905 // compatibility with old syntax
909 std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
912 else if (++anArgIter >= theArgNb)
914 std::cout << "Error: height value is expected right after width\n";
917 aWidth = Draw::Atoi (theArgVec[anArgIter - 1]);
918 aHeight = Draw::Atoi (theArgVec[anArgIter]);
922 std::cout << "Error: unknown argument '" << theArgVec[anArgIter] << "'\n";
926 if ((aWidth <= 0 && aHeight > 0)
927 || (aWidth > 0 && aHeight <= 0))
929 std::cout << "Error: dimensions " << aWidth << "x" << aHeight << " are incorrect\n";
933 Handle(V3d_View) aView = ViewerTest::CurrentView();
936 std::cout << "Error: cannot find an active view!\n";
940 if (aWidth <= 0 || aHeight <= 0)
942 if (aStereoOpts != V3d_SDO_MONO)
944 aView->Window()->Size (aWidth, aHeight);
948 if (!aView->Dump (aFilePath, aBufferType))
950 theDI << "Fail: view dump failed!\n";
956 Image_AlienPixMap aPixMap;
957 if (!aView->ToPixMap (aPixMap, aWidth, aHeight, aBufferType, Standard_True, aStereoOpts))
959 theDI << "Fail: view dump failed!\n";
963 if (aPixMap.SizeX() != Standard_Size(aWidth)
964 || aPixMap.SizeY() != Standard_Size(aHeight))
966 theDI << "Fail: dumped dimensions " << (Standard_Integer )aPixMap.SizeX() << "x" << (Standard_Integer )aPixMap.SizeY()
967 << " are lesser than requested " << aWidth << "x" << aHeight << "\n";
969 if (!aPixMap.Save (aFilePath))
971 theDI << "Fail: image can not be saved!\n";
977 //==============================================================================
978 //function : Displays,Erase...
981 //==============================================================================
982 static int VwrTst_DispErase(const Handle(AIS_InteractiveObject)& IO,
983 const Standard_Integer Mode,
984 const Standard_Integer TypeOfOperation,
985 const Standard_Boolean Upd)
987 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
989 switch(TypeOfOperation){
991 Ctx->Display(IO,Mode,Upd);
999 Ctx->SetDisplayMode((AIS_DisplayMode)Mode,Upd);
1001 Ctx->SetDisplayMode(IO,Mode,Upd);
1006 Ctx->SetDisplayMode(0,Upd);
1008 Ctx->UnsetDisplayMode(IO,Upd);
1015 //=======================================================================
1018 //=======================================================================
1019 static int VDispMode (Draw_Interpretor& , Standard_Integer argc, const char** argv)
1022 TCollection_AsciiString name;
1025 // display others presentations
1026 Standard_Integer TypeOfOperation = (strcasecmp(argv[0],"vdispmode")==0)? 1:
1027 (strcasecmp(argv[0],"verasemode")==0) ? 2 :
1028 (strcasecmp(argv[0],"vsetdispmode")==0) ? 3 :
1029 (strcasecmp(argv[0],"vunsetdispmode")==0) ? 4 : -1;
1031 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1033 //unset displaymode.. comportement particulier...
1034 if(TypeOfOperation==4){
1036 if(Ctx->NbCurrents()==0 ||
1037 Ctx->NbSelected()==0){
1038 Handle(AIS_InteractiveObject) IO;
1039 VwrTst_DispErase(IO,-1,4,Standard_False);
1041 else if(!Ctx->HasOpenedContext()){
1042 for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
1043 VwrTst_DispErase(Ctx->Current(),-1,4,Standard_False);
1046 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1047 VwrTst_DispErase(Ctx->Interactive(),-1,4,Standard_False);}
1048 Ctx->UpdateCurrentViewer();
1051 Handle(AIS_InteractiveObject) IO;
1053 if(GetMapOfAIS().IsBound2(name)){
1054 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1056 VwrTst_DispErase(IO,-1,4,Standard_True);
1061 Standard_Integer Dmode = Draw::Atoi(argv[1]);
1062 if(Ctx->NbCurrents()==0 && TypeOfOperation==3){
1063 Handle(AIS_InteractiveObject) IO;
1064 VwrTst_DispErase(IO,Dmode,TypeOfOperation,Standard_True);
1066 if(!Ctx->HasOpenedContext()){
1067 // set/unset display mode sur le Contexte...
1068 for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
1069 VwrTst_DispErase(Ctx->Current(),Dmode,TypeOfOperation,Standard_False);
1071 Ctx->UpdateCurrentViewer();
1074 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1075 Ctx->Display(Ctx->Interactive(),Dmode);
1079 Handle(AIS_InteractiveObject) IO;
1081 if(GetMapOfAIS().IsBound2(name))
1082 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1084 VwrTst_DispErase(IO,Draw::Atoi(argv[2]),TypeOfOperation,Standard_True);
1090 //=======================================================================
1093 //=======================================================================
1094 static int VSubInt(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1096 if(argc==1) return 1;
1097 Standard_Integer On = Draw::Atoi(argv[1]);
1098 const Handle(AIS_InteractiveContext)& Ctx = ViewerTest::GetAISContext();
1102 if(!Ctx->HasOpenedContext()){
1103 di<<"sub intensite ";
1106 di<<" pour "<<Ctx->NbCurrents()<<" objets"<<"\n";
1107 for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
1109 Ctx->SubIntensityOn(Ctx->Current(),Standard_False);}
1111 di <<"passage dans off"<<"\n";
1112 Ctx->SubIntensityOff(Ctx->Current(),Standard_False);
1117 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()){
1119 Ctx->SubIntensityOn(Ctx->Interactive(),Standard_False);}
1121 Ctx->SubIntensityOff(Ctx->Interactive(),Standard_False);}
1124 Ctx->UpdateCurrentViewer();
1127 Handle(AIS_InteractiveObject) IO;
1128 TCollection_AsciiString name = argv[2];
1129 if(GetMapOfAIS().IsBound2(name)){
1130 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1133 Ctx->SubIntensityOn(IO);
1135 Ctx->SubIntensityOff(IO);
1143 //! Auxiliary class to iterate presentations from different collections.
1144 class ViewTest_PrsIter
1148 //! Create and initialize iterator object.
1149 ViewTest_PrsIter (const TCollection_AsciiString& theName)
1150 : mySource (IterSource_All)
1152 NCollection_Sequence<TCollection_AsciiString> aNames;
1153 if (!theName.IsEmpty())
1154 aNames.Append (theName);
1158 //! Create and initialize iterator object.
1159 ViewTest_PrsIter (const NCollection_Sequence<TCollection_AsciiString>& theNames)
1160 : mySource (IterSource_All)
1165 //! Initialize the iterator.
1166 void Init (const NCollection_Sequence<TCollection_AsciiString>& theNames)
1168 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
1170 mySelIter.Nullify();
1171 myCurrent.Nullify();
1172 myCurrentTrs.Nullify();
1173 if (!mySeq.IsEmpty())
1175 mySource = IterSource_List;
1176 mySeqIter = NCollection_Sequence<TCollection_AsciiString>::Iterator (mySeq);
1178 else if (aCtx->NbCurrents() > 0)
1180 mySource = IterSource_Selected;
1182 mySelIter->InitCurrent();
1186 mySource = IterSource_All;
1187 myMapIter.Initialize (GetMapOfAIS());
1192 const TCollection_AsciiString& CurrentName() const
1194 return myCurrentName;
1197 const Handle(AIS_InteractiveObject)& Current() const
1202 const Handle(Standard_Transient)& CurrentTrs() const
1204 return myCurrentTrs;
1207 //! @return true if iterator points to valid object within collection
1208 Standard_Boolean More() const
1212 case IterSource_All: return myMapIter.More();
1213 case IterSource_List: return mySeqIter.More();
1214 case IterSource_Selected: return mySelIter->MoreCurrent();
1216 return Standard_False;
1219 //! Go to the next item.
1222 myCurrentName.Clear();
1223 myCurrentTrs.Nullify();
1224 myCurrent.Nullify();
1227 case IterSource_All:
1232 case IterSource_List:
1237 case IterSource_Selected:
1239 mySelIter->NextCurrent();
1252 case IterSource_All:
1254 if (myMapIter.More())
1256 myCurrentName = myMapIter.Key2();
1257 myCurrentTrs = myMapIter.Key1();
1258 myCurrent = Handle(AIS_InteractiveObject)::DownCast (myCurrentTrs);
1262 case IterSource_List:
1264 if (mySeqIter.More())
1266 if (!GetMapOfAIS().IsBound2 (mySeqIter.Value()))
1268 std::cout << "Error: object " << mySeqIter.Value() << " is not displayed!\n";
1271 myCurrentName = mySeqIter.Value();
1272 myCurrentTrs = GetMapOfAIS().Find2 (mySeqIter.Value());
1273 myCurrent = Handle(AIS_InteractiveObject)::DownCast (myCurrentTrs);
1277 case IterSource_Selected:
1279 if (mySelIter->MoreCurrent())
1281 myCurrentName = GetMapOfAIS().Find1 (mySelIter->Current());
1282 myCurrent = mySelIter->Current();
1300 Handle(AIS_InteractiveContext) mySelIter; //!< iterator for current (selected) objects (IterSource_Selected)
1301 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName myMapIter; //!< iterator for map of all objects (IterSource_All)
1302 NCollection_Sequence<TCollection_AsciiString> mySeq;
1303 NCollection_Sequence<TCollection_AsciiString>::Iterator mySeqIter;
1305 TCollection_AsciiString myCurrentName;//!< current item name
1306 Handle(Standard_Transient) myCurrentTrs; //!< current item (as transient object)
1307 Handle(AIS_InteractiveObject) myCurrent; //!< current item
1309 IterSource mySource; //!< iterated collection
1313 //==============================================================================
1314 //function : VInteriorStyle
1315 //purpose : sets interior style of the a selected or named or displayed shape
1316 //==============================================================================
1317 static int VSetInteriorStyle (Draw_Interpretor& theDI,
1318 Standard_Integer theArgNb,
1319 const char** theArgVec)
1321 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1324 std::cerr << "Error: no active view!\n";
1328 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
1329 Standard_Integer anArgIter = 1;
1330 for (; anArgIter < theArgNb; ++anArgIter)
1332 if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
1337 TCollection_AsciiString aName;
1338 if (theArgNb - anArgIter == 2)
1340 aName = theArgVec[anArgIter++];
1342 else if (theArgNb - anArgIter != 1)
1344 std::cout << "Error: wrong number of arguments! See usage:\n";
1345 theDI.PrintHelp (theArgVec[0]);
1348 Standard_Integer anInterStyle = Aspect_IS_SOLID;
1349 TCollection_AsciiString aStyleArg (theArgVec[anArgIter++]);
1350 aStyleArg.LowerCase();
1351 if (aStyleArg == "empty")
1355 else if (aStyleArg == "hollow")
1359 else if (aStyleArg == "hatch")
1363 else if (aStyleArg == "solid")
1367 else if (aStyleArg == "hiddenline")
1373 anInterStyle = aStyleArg.IntegerValue();
1375 if (anInterStyle < Aspect_IS_EMPTY
1376 || anInterStyle > Aspect_IS_HIDDENLINE)
1378 std::cout << "Error: style must be within a range [0 (Aspect_IS_EMPTY), "
1379 << Aspect_IS_HIDDENLINE << " (Aspect_IS_HIDDENLINE)]\n";
1383 if (!aName.IsEmpty()
1384 && !GetMapOfAIS().IsBound2 (aName))
1386 std::cout << "Error: object " << aName << " is not displayed!\n";
1390 if (aCtx->HasOpenedContext())
1392 aCtx->CloseLocalContext();
1394 for (ViewTest_PrsIter anIter (aName); anIter.More(); anIter.Next())
1396 const Handle(AIS_InteractiveObject)& anIO = anIter.Current();
1399 const Handle(Prs3d_Drawer)& aDrawer = anIO->Attributes();
1400 Handle(Prs3d_ShadingAspect) aShadingAspect = aDrawer->ShadingAspect();
1401 Handle(Graphic3d_AspectFillArea3d) aFillAspect = aShadingAspect->Aspect();
1402 aFillAspect->SetInteriorStyle ((Aspect_InteriorStyle )anInterStyle);
1403 aCtx->RecomputePrsOnly (anIO, Standard_False, Standard_True);
1407 // update the screen and redraw the view
1408 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
1409 a3DView()->SetImmediateUpdate (isAutoUpdate);
1410 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
1411 || aToUpdate == ViewerTest_RM_RedrawForce)
1413 TheAISContext()->UpdateCurrentViewer();
1418 //! Auxiliary structure for VAspects
1419 struct ViewerTest_AspectsChangeSet
1421 Standard_Integer ToSetColor;
1422 Quantity_Color Color;
1424 Standard_Integer ToSetLineWidth;
1425 Standard_Real LineWidth;
1427 Standard_Integer ToSetTransparency;
1428 Standard_Real Transparency;
1430 Standard_Integer ToSetMaterial;
1431 Graphic3d_NameOfMaterial Material;
1432 TCollection_AsciiString MatName;
1434 NCollection_Sequence<TopoDS_Shape> SubShapes;
1436 //! Empty constructor
1437 ViewerTest_AspectsChangeSet()
1439 Color (DEFAULT_COLOR),
1442 ToSetTransparency (0),
1445 Material (Graphic3d_NOM_DEFAULT) {}
1447 //! @return true if no changes have been requested
1448 Standard_Boolean IsEmpty() const
1450 return ToSetLineWidth == 0
1451 && ToSetTransparency == 0
1453 && ToSetMaterial == 0;
1456 //! @return true if properties are valid
1457 Standard_Boolean Validate (const Standard_Boolean theIsSubPart) const
1459 Standard_Boolean isOk = Standard_True;
1460 if (LineWidth <= 0.0
1461 || LineWidth > 10.0)
1463 std::cout << "Error: the width should be within [1; 10] range (specified " << LineWidth << ")\n";
1464 isOk = Standard_False;
1466 if (Transparency < 0.0
1467 || Transparency > 1.0)
1469 std::cout << "Error: the transparency should be within [0; 1] range (specified " << Transparency << ")\n";
1470 isOk = Standard_False;
1473 && ToSetTransparency)
1475 std::cout << "Error: the transparency can not be defined for sub-part of object!\n";
1476 isOk = Standard_False;
1478 if (ToSetMaterial == 1
1479 && Material == Graphic3d_NOM_DEFAULT)
1481 std::cout << "Error: unknown material " << MatName << ".\n";
1482 isOk = Standard_False;
1489 //==============================================================================
1490 //function : VAspects
1492 //==============================================================================
1493 static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
1494 Standard_Integer theArgNb,
1495 const char** theArgVec)
1497 TCollection_AsciiString aCmdName (theArgVec[0]);
1498 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1501 std::cerr << "Error: no active view!\n";
1505 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
1506 Standard_Integer anArgIter = 1;
1507 NCollection_Sequence<TCollection_AsciiString> aNames;
1508 for (; anArgIter < theArgNb; ++anArgIter)
1510 TCollection_AsciiString anArg = theArgVec[anArgIter];
1511 if (parseRedrawMode (anArg, aToUpdate))
1515 else if (!anArg.IsEmpty()
1516 && anArg.Value (1) != '-')
1518 aNames.Append (anArg);
1526 NCollection_Sequence<ViewerTest_AspectsChangeSet> aChanges;
1527 aChanges.Append (ViewerTest_AspectsChangeSet());
1528 ViewerTest_AspectsChangeSet* aChangeSet = &aChanges.ChangeLast();
1530 // parse syntax of legacy commands
1531 if (aCmdName == "vsetwidth")
1533 if (aNames.IsEmpty()
1534 || !aNames.Last().IsRealValue())
1536 std::cout << "Error: not enough arguments!\n";
1539 aChangeSet->ToSetLineWidth = 1;
1540 aChangeSet->LineWidth = aNames.Last().RealValue();
1541 aNames.Remove (aNames.Length());
1543 else if (aCmdName == "vunsetwidth")
1545 aChangeSet->ToSetLineWidth = -1;
1547 else if (aCmdName == "vsetcolor")
1549 if (aNames.IsEmpty())
1551 std::cout << "Error: not enough arguments!\n";
1554 aChangeSet->ToSetColor = 1;
1555 aChangeSet->Color = ViewerTest::GetColorFromName (aNames.Last().ToCString());
1556 aNames.Remove (aNames.Length());
1558 else if (aCmdName == "vunsetcolor")
1560 aChangeSet->ToSetColor = -1;
1562 else if (aCmdName == "vsettransparency")
1564 if (aNames.IsEmpty()
1565 || !aNames.Last().IsRealValue())
1567 std::cout << "Error: not enough arguments!\n";
1570 aChangeSet->ToSetTransparency = 1;
1571 aChangeSet->Transparency = aNames.Last().RealValue();
1572 aNames.Remove (aNames.Length());
1574 else if (aCmdName == "vunsettransparency")
1576 aChangeSet->ToSetTransparency = -1;
1578 else if (aCmdName == "vsetmaterial")
1580 if (aNames.IsEmpty())
1582 std::cout << "Error: not enough arguments!\n";
1585 aChangeSet->ToSetMaterial = 1;
1586 aChangeSet->MatName = aNames.Last();
1587 aChangeSet->Material = Graphic3d_MaterialAspect::MaterialFromName (aChangeSet->MatName.ToCString());
1588 aNames.Remove (aNames.Length());
1590 else if (aCmdName == "vunsetmaterial")
1592 aChangeSet->ToSetMaterial = -1;
1594 else if (anArgIter >= theArgNb)
1596 std::cout << "Error: not enough arguments!\n";
1600 if (!aChangeSet->IsEmpty())
1602 anArgIter = theArgNb;
1604 for (; anArgIter < theArgNb; ++anArgIter)
1606 TCollection_AsciiString anArg = theArgVec[anArgIter];
1608 if (anArg == "-setwidth"
1609 || anArg == "-setlinewidth")
1611 if (++anArgIter >= theArgNb)
1613 std::cout << "Error: wrong syntax at " << anArg << "\n";
1616 aChangeSet->ToSetLineWidth = 1;
1617 aChangeSet->LineWidth = Draw::Atof (theArgVec[anArgIter]);
1619 else if (anArg == "-unsetwidth"
1620 || anArg == "-unsetlinewidth")
1622 aChangeSet->ToSetLineWidth = -1;
1623 aChangeSet->LineWidth = 1.0;
1625 else if (anArg == "-settransp"
1626 || anArg == "-settransparancy")
1628 if (++anArgIter >= theArgNb)
1630 std::cout << "Error: wrong syntax at " << anArg << "\n";
1633 aChangeSet->ToSetTransparency = 1;
1634 aChangeSet->Transparency = Draw::Atof (theArgVec[anArgIter]);
1635 if (aChangeSet->Transparency >= 0.0
1636 && aChangeSet->Transparency <= Precision::Confusion())
1638 aChangeSet->ToSetTransparency = -1;
1639 aChangeSet->Transparency = 0.0;
1642 else if (anArg == "-setalpha")
1644 if (++anArgIter >= theArgNb)
1646 std::cout << "Error: wrong syntax at " << anArg << "\n";
1649 aChangeSet->ToSetTransparency = 1;
1650 aChangeSet->Transparency = Draw::Atof (theArgVec[anArgIter]);
1651 if (aChangeSet->Transparency < 0.0
1652 || aChangeSet->Transparency > 1.0)
1654 std::cout << "Error: the transparency should be within [0; 1] range (specified " << aChangeSet->Transparency << ")\n";
1657 aChangeSet->Transparency = 1.0 - aChangeSet->Transparency;
1658 if (aChangeSet->Transparency >= 0.0
1659 && aChangeSet->Transparency <= Precision::Confusion())
1661 aChangeSet->ToSetTransparency = -1;
1662 aChangeSet->Transparency = 0.0;
1665 else if (anArg == "-unsettransp"
1666 || anArg == "-unsettransparancy"
1667 || anArg == "-unsetalpha"
1668 || anArg == "-opaque")
1670 aChangeSet->ToSetTransparency = -1;
1671 aChangeSet->Transparency = 0.0;
1673 else if (anArg == "-setcolor")
1675 if (++anArgIter >= theArgNb)
1677 std::cout << "Error: wrong syntax at " << anArg << "\n";
1680 aChangeSet->ToSetColor = 1;
1681 aChangeSet->Color = ViewerTest::GetColorFromName (theArgVec[anArgIter]);
1683 else if (anArg == "-unsetcolor")
1685 aChangeSet->ToSetColor = -1;
1686 aChangeSet->Color = DEFAULT_COLOR;
1688 else if (anArg == "-setmat"
1689 || anArg == "-setmaterial")
1691 if (++anArgIter >= theArgNb)
1693 std::cout << "Error: wrong syntax at " << anArg << "\n";
1696 aChangeSet->ToSetMaterial = 1;
1697 aChangeSet->MatName = theArgVec[anArgIter];
1698 aChangeSet->Material = Graphic3d_MaterialAspect::MaterialFromName (aChangeSet->MatName.ToCString());
1700 else if (anArg == "-unsetmat"
1701 || anArg == "-unsetmaterial")
1703 aChangeSet->ToSetMaterial = -1;
1704 aChangeSet->Material = Graphic3d_NOM_DEFAULT;
1706 else if (anArg == "-subshape"
1707 || anArg == "-subshapes")
1709 if (aNames.IsEmpty())
1711 std::cout << "Error: main objects should specified explicitly when -subshapes is used!\n";
1715 aChanges.Append (ViewerTest_AspectsChangeSet());
1716 aChangeSet = &aChanges.ChangeLast();
1718 for (++anArgIter; anArgIter < theArgNb; ++anArgIter)
1720 Standard_CString aSubShapeName = theArgVec[anArgIter];
1721 if (*aSubShapeName == '-')
1727 TopoDS_Shape aSubShape = DBRep::Get (aSubShapeName);
1728 if (aSubShape.IsNull())
1730 std::cerr << "Error: shape " << aSubShapeName << " doesn't found!\n";
1733 aChangeSet->SubShapes.Append (aSubShape);
1736 if (aChangeSet->SubShapes.IsEmpty())
1738 std::cerr << "Error: empty list is specified after -subshapes!\n";
1742 else if (anArg == "-unset")
1744 aChangeSet->ToSetLineWidth = -1;
1745 aChangeSet->LineWidth = 1.0;
1746 aChangeSet->ToSetTransparency = -1;
1747 aChangeSet->Transparency = 0.0;
1748 aChangeSet->ToSetColor = -1;
1749 aChangeSet->Color = DEFAULT_COLOR;
1750 aChangeSet->ToSetMaterial = -1;
1751 aChangeSet->Material = Graphic3d_NOM_DEFAULT;
1755 std::cout << "Error: wrong syntax at " << anArg << "\n";
1760 Standard_Boolean isFirst = Standard_True;
1761 for (NCollection_Sequence<ViewerTest_AspectsChangeSet>::Iterator aChangesIter (aChanges);
1762 aChangesIter.More(); aChangesIter.Next())
1764 if (!aChangesIter.Value().Validate (!isFirst))
1768 isFirst = Standard_False;
1771 if (aCtx->HasOpenedContext())
1773 aCtx->CloseLocalContext();
1775 for (ViewTest_PrsIter aPrsIter (aNames); aPrsIter.More(); aPrsIter.Next())
1777 const TCollection_AsciiString& aName = aPrsIter.CurrentName();
1778 Handle(AIS_InteractiveObject) aPrs = aPrsIter.Current();
1779 Handle(AIS_ColoredShape) aColoredPrs;
1780 Standard_Boolean toDisplay = Standard_False;
1781 if (aChanges.Length() > 1)
1783 Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast (aPrs);
1784 if (aShapePrs.IsNull())
1786 std::cout << "Error: an object " << aName << " is not an AIS_Shape presentation!\n";
1789 aColoredPrs = Handle(AIS_ColoredShape)::DownCast (aShapePrs);
1790 if (aColoredPrs.IsNull())
1792 aColoredPrs = new AIS_ColoredShape (aShapePrs);
1793 aCtx->Remove (aShapePrs, Standard_False);
1794 GetMapOfAIS().UnBind2 (aName);
1795 GetMapOfAIS().Bind (aColoredPrs, aName);
1796 toDisplay = Standard_True;
1797 aShapePrs = aColoredPrs;
1804 NCollection_Sequence<ViewerTest_AspectsChangeSet>::Iterator aChangesIter (aChanges);
1805 aChangeSet = &aChangesIter.ChangeValue();
1806 if (aChangeSet->ToSetMaterial == 1)
1808 aCtx->SetMaterial (aPrs, aChangeSet->Material, Standard_False);
1810 else if (aChangeSet->ToSetMaterial == -1)
1812 aCtx->UnsetMaterial (aPrs, Standard_False);
1814 if (aChangeSet->ToSetColor == 1)
1816 aCtx->SetColor (aPrs, aChangeSet->Color, Standard_False);
1818 else if (aChangeSet->ToSetColor == -1)
1820 aCtx->UnsetColor (aPrs, Standard_False);
1822 if (aChangeSet->ToSetTransparency == 1)
1824 aCtx->SetTransparency (aPrs, aChangeSet->Transparency, Standard_False);
1826 else if (aChangeSet->ToSetTransparency == -1)
1828 aCtx->UnsetTransparency (aPrs, Standard_False);
1830 if (aChangeSet->ToSetLineWidth == 1)
1832 aCtx->SetWidth (aPrs, aChangeSet->LineWidth, Standard_False);
1834 else if (aChangeSet->ToSetLineWidth == -1)
1836 aCtx->UnsetWidth (aPrs, Standard_False);
1839 for (aChangesIter.Next(); aChangesIter.More(); aChangesIter.Next())
1841 aChangeSet = &aChangesIter.ChangeValue();
1842 for (NCollection_Sequence<TopoDS_Shape>::Iterator aSubShapeIter (aChangeSet->SubShapes);
1843 aSubShapeIter.More(); aSubShapeIter.Next())
1845 const TopoDS_Shape& aSubShape = aSubShapeIter.Value();
1846 if (aChangeSet->ToSetColor == 1)
1848 aColoredPrs->SetCustomColor (aSubShape, aChangeSet->Color);
1850 if (aChangeSet->ToSetLineWidth == 1)
1852 aColoredPrs->SetCustomWidth (aSubShape, aChangeSet->LineWidth);
1854 if (aChangeSet->ToSetColor == -1
1855 || aChangeSet->ToSetLineWidth == -1)
1857 aColoredPrs->UnsetCustomAspects (aSubShape, Standard_True);
1863 aCtx->Display (aPrs, Standard_False);
1865 else if (!aColoredPrs.IsNull())
1867 aColoredPrs->Redisplay();
1872 Handle(NIS_InteractiveObject) aNisObj = Handle(NIS_InteractiveObject)::DownCast (aPrsIter.CurrentTrs());
1873 Handle(NIS_Triangulated) aNisTri = Handle(NIS_Triangulated)::DownCast (aNisObj);
1874 if (!aNisObj.IsNull())
1876 if (aChangeSet->ToSetTransparency != 0)
1878 aNisObj->SetTransparency (aChangeSet->Transparency);
1881 if (!aNisTri.IsNull())
1883 if (aChangeSet->ToSetColor != 0)
1885 aNisTri->SetColor (aChangeSet->Color);
1887 if (aChangeSet->ToSetLineWidth != 0)
1889 aNisTri->SetLineWidth (aChangeSet->LineWidth);
1895 // update the screen and redraw the view
1896 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
1897 a3DView()->SetImmediateUpdate (isAutoUpdate);
1898 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
1899 || aToUpdate == ViewerTest_RM_RedrawForce)
1901 TheAISContext()->UpdateCurrentViewer();
1906 //==============================================================================
1907 //function : VDonly2
1909 //purpose : Display only a selected or named object
1910 // if there is no selected or named object s, nothing is done
1911 //==============================================================================
1912 static int VDonly2 (Draw_Interpretor& ,
1913 Standard_Integer theArgNb,
1914 const char** theArgVec)
1916 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1919 std::cerr << "Error: no active view!\n";
1923 if (aCtx->HasOpenedContext())
1925 aCtx->CloseLocalContext();
1927 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
1929 Standard_Integer anArgIter = 1;
1930 for (; anArgIter < theArgNb; ++anArgIter)
1932 if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
1938 NCollection_Map<Handle(Standard_Transient)> aDispSet;
1939 if (anArgIter >= theArgNb)
1941 // display only selected objects
1942 if (aCtx->NbCurrents() < 1)
1947 for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
1949 aDispSet.Add (aCtx->Current());
1954 // display only specified objects
1955 for (; anArgIter < theArgNb; ++anArgIter)
1957 TCollection_AsciiString aName = theArgVec[anArgIter];
1958 if (GetMapOfAIS().IsBound2 (aName))
1960 const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
1961 if (anObj->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
1963 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anObj);
1964 aCtx->Display (aShape, Standard_False);
1966 else if (anObj->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
1968 Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anObj);
1969 TheNISContext()->Display (aShape);
1971 aDispSet.Add (anObj);
1976 // weed out other objects
1977 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS()); anIter.More(); anIter.Next())
1979 if (aDispSet.Contains (anIter.Key1()))
1984 if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
1986 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
1987 aCtx->Erase (aShape, Standard_False);
1989 else if (anIter.Key1()->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
1991 const Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
1992 TheNISContext()->Erase (aShape);
1996 // update the screen and redraw the view
1997 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
1998 a3DView()->SetImmediateUpdate (isAutoUpdate);
1999 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2000 || aToUpdate == ViewerTest_RM_RedrawForce)
2002 TheAISContext()->UpdateCurrentViewer();
2008 //==============================================================================
2009 //function : VRemove
2010 //purpose : Removes selected or named objects.
2011 // If there is no selected or named objects,
2012 // all objects in the viewer can be removed with argument -all.
2013 // If -context is in arguments, the object is not deleted from the map of
2014 // objects (deleted only from the current context).
2015 //==============================================================================
2016 int VRemove (Draw_Interpretor& theDI,
2017 Standard_Integer theArgNb,
2018 const char** theArgVec)
2020 if (a3DView().IsNull())
2022 std::cout << "Error: wrong syntax!\n";
2026 TheAISContext()->CloseAllContexts (Standard_False);
2028 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2029 Standard_Boolean isContextOnly = Standard_False;
2030 Standard_Boolean toRemoveAll = Standard_False;
2032 Standard_Integer anArgIter = 1;
2033 for (; anArgIter < theArgNb; ++anArgIter)
2035 TCollection_AsciiString anArg = theArgVec[anArgIter];
2037 if (anArg == "-context")
2039 isContextOnly = Standard_True;
2041 else if (anArg == "-all")
2043 toRemoveAll = Standard_True;
2045 else if (!parseRedrawMode (anArg, aToUpdate))
2051 && anArgIter < theArgNb)
2053 std::cout << "Error: wrong syntax!\n";
2057 NCollection_List<TCollection_AsciiString> anIONameList;
2060 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2061 anIter.More(); anIter.Next())
2063 anIONameList.Append (anIter.Key2());
2066 else if (anArgIter < theArgNb) // removed objects names are in argument list
2068 for (; anArgIter < theArgNb; ++anArgIter)
2070 TCollection_AsciiString aName = theArgVec[anArgIter];
2071 if (!GetMapOfAIS().IsBound2 (aName))
2073 theDI << aName.ToCString() << " was not bound to some object.\n";
2077 const Handle(Standard_Transient)& aTransientObj = GetMapOfAIS().Find2 (aName);
2079 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (aTransientObj);
2082 if (anIO->GetContext() != TheAISContext())
2084 theDI << aName.ToCString() << " was not displayed in current context.\n";
2085 theDI << "Please activate view with this object displayed and try again.\n";
2089 anIONameList.Append (aName);
2093 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (aTransientObj);
2094 if (!aNisIO.IsNull())
2096 anIONameList.Append (aName);
2100 else if (TheAISContext()->NbCurrents() > 0
2101 || TheNISContext()->GetSelected().Extent() > 0)
2103 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2104 anIter.More(); anIter.Next())
2106 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2109 if (!TheAISContext()->IsCurrent (anIO))
2114 anIONameList.Append (anIter.Key2());
2118 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2119 if (!aNisIO.IsNull())
2121 if (!TheNISContext()->IsSelected (aNisIO))
2126 anIONameList.Append (anIter.Key2());
2131 // Unbind all removed objects from the map of displayed IO.
2132 for (NCollection_List<TCollection_AsciiString>::Iterator anIter (anIONameList);
2133 anIter.More(); anIter.Next())
2135 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anIter.Value()));
2139 TheAISContext()->Remove (anIO, Standard_False);
2140 theDI << anIter.Value().ToCString() << " was removed\n";
2144 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anIter.Value()));
2145 if (!aNisIO.IsNull())
2147 TheNISContext()->Remove (aNisIO);
2148 theDI << anIter.Value().ToCString() << " was removed\n";
2154 GetMapOfAIS().UnBind2 (anIter.Value());
2158 // update the screen and redraw the view
2159 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2160 a3DView()->SetImmediateUpdate (isAutoUpdate);
2161 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2162 || aToUpdate == ViewerTest_RM_RedrawForce)
2164 TheAISContext()->UpdateCurrentViewer();
2170 //==============================================================================
2172 //purpose : Erase some selected or named objects
2173 // if there is no selected or named objects, the whole viewer is erased
2174 //==============================================================================
2175 int VErase (Draw_Interpretor& theDI,
2176 Standard_Integer theArgNb,
2177 const char** theArgVec)
2179 if (a3DView().IsNull())
2181 std::cout << "Error: no active view!\n";
2184 TheAISContext()->CloseAllContexts (Standard_False);
2186 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2187 const Standard_Boolean toEraseAll = TCollection_AsciiString (theArgNb > 0 ? theArgVec[0] : "") == "veraseall";
2189 Standard_Integer anArgIter = 1;
2190 for (; anArgIter < theArgNb; ++anArgIter)
2192 if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
2198 if (anArgIter < theArgNb)
2202 std::cerr << "Error: wrong syntax, " << theArgVec[0] << " too much arguments.\n";
2206 // has a list of names
2207 for (; anArgIter < theArgNb; ++anArgIter)
2209 TCollection_AsciiString aName = theArgVec[anArgIter];
2210 if (!GetMapOfAIS().IsBound2 (aName))
2215 const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
2216 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anObj);
2217 theDI << aName.ToCString() << " ";
2220 TheAISContext()->Erase (anIO, Standard_False);
2224 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anObj);
2225 if (!aNisIO.IsNull())
2227 TheNISContext()->Erase (aNisIO);
2232 else if (!toEraseAll
2233 && TheAISContext()->NbCurrents() > 0)
2235 // remove all currently selected objects
2236 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2237 anIter.More(); anIter.Next())
2239 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2241 && TheAISContext()->IsCurrent (anIO))
2243 theDI << anIter.Key2().ToCString() << " ";
2244 TheAISContext()->Erase (anIO, Standard_False);
2250 // erase entire viewer
2251 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2252 anIter.More(); anIter.Next())
2254 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2257 TheAISContext()->Erase (anIO, Standard_False);
2261 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2262 if (!aNisIO.IsNull())
2264 TheNISContext()->Erase (aNisIO);
2270 // update the screen and redraw the view
2271 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2272 a3DView()->SetImmediateUpdate (isAutoUpdate);
2273 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2274 || aToUpdate == ViewerTest_RM_RedrawForce)
2276 TheAISContext()->UpdateCurrentViewer();
2282 //==============================================================================
2283 //function : VDisplayAll
2285 //purpose : Display all the objects of the Map
2286 //==============================================================================
2287 static int VDisplayAll (Draw_Interpretor& ,
2288 Standard_Integer theArgNb,
2289 const char** theArgVec)
2292 if (a3DView().IsNull())
2294 std::cout << "Error: no active view!\n";
2298 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2300 Standard_Integer anArgIter = 1;
2301 for (; anArgIter < theArgNb; ++anArgIter)
2303 if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
2308 if (anArgIter < theArgNb)
2310 std::cout << theArgVec[0] << "Error: wrong syntax\n";
2314 if (TheAISContext()->HasOpenedContext())
2316 TheAISContext()->CloseLocalContext();
2319 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2320 anIter.More(); anIter.Next())
2322 if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
2324 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2325 TheAISContext()->Erase (aShape, Standard_False);
2327 else if (anIter.Key1()->IsKind(STANDARD_TYPE(NIS_InteractiveObject)))
2329 const Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2330 TheNISContext()->Erase (aShape);
2334 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2335 anIter.More(); anIter.Next())
2337 if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
2339 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2340 TheAISContext()->Display (aShape, Standard_False);
2342 else if (anIter.Key1()->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
2344 Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2345 TheNISContext()->Display (aShape);
2349 // update the screen and redraw the view
2350 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2351 a3DView()->SetImmediateUpdate (isAutoUpdate);
2352 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2353 || aToUpdate == ViewerTest_RM_RedrawForce)
2355 TheAISContext()->UpdateCurrentViewer();
2361 //! Auxiliary method to find presentation
2362 inline Handle(PrsMgr_Presentation) findPresentation (const Handle(AIS_InteractiveContext)& theCtx,
2363 const Handle(AIS_InteractiveObject)& theIO,
2364 const Standard_Integer theMode)
2368 return Handle(PrsMgr_Presentation)();
2373 if (theCtx->MainPrsMgr()->HasPresentation (theIO, theMode))
2375 return theCtx->MainPrsMgr()->Presentation (theIO, theMode);
2378 else if (theCtx->MainPrsMgr()->HasPresentation (theIO, theIO->DisplayMode()))
2380 return theCtx->MainPrsMgr()->Presentation (theIO, theIO->DisplayMode());
2382 else if (theCtx->MainPrsMgr()->HasPresentation (theIO, theCtx->DisplayMode()))
2384 return theCtx->MainPrsMgr()->Presentation (theIO, theCtx->DisplayMode());
2386 return Handle(PrsMgr_Presentation)();
2389 enum ViewerTest_BndAction
2396 //! Auxiliary method to print bounding box of presentation
2397 inline void bndPresentation (Draw_Interpretor& theDI,
2398 const Handle(PrsMgr_Presentation)& thePrs,
2399 const TCollection_AsciiString& theName,
2400 const ViewerTest_BndAction theAction)
2404 case BndAction_Hide:
2406 thePrs->Presentation()->GraphicUnHighlight();
2409 case BndAction_Show:
2411 thePrs->Presentation()->BoundBox();
2414 case BndAction_Print:
2416 Graphic3d_Vec3d aMin, aMax;
2417 thePrs->Presentation()->MinMaxValues (aMin.x(), aMin.y(), aMin.z(),
2418 aMax.x(), aMax.y(), aMax.z());
2419 theDI << theName << "\n"
2420 << aMin.x() << " " << aMin.y() << " " << aMin.z() << " "
2421 << aMax.x() << " " << aMax.y() << " " << aMax.z() << "\n";
2427 //==============================================================================
2428 //function : VBounding
2430 //==============================================================================
2431 int VBounding (Draw_Interpretor& theDI,
2432 Standard_Integer theArgNb,
2433 const char** theArgVec)
2435 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
2438 std::cout << "Error: no active view!\n";
2442 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2443 ViewerTest_BndAction anAction = BndAction_Show;
2444 Standard_Integer aMode = -1;
2446 Standard_Integer anArgIter = 1;
2447 for (; anArgIter < theArgNb; ++anArgIter)
2449 TCollection_AsciiString anArg (theArgVec[anArgIter]);
2451 if (anArg == "-print")
2453 anAction = BndAction_Print;
2455 else if (anArg == "-show")
2457 anAction = BndAction_Show;
2459 else if (anArg == "-hide")
2461 anAction = BndAction_Hide;
2463 else if (anArg == "-mode")
2465 if (++anArgIter >= theArgNb)
2467 std::cout << "Error: wrong syntax at " << anArg << "\n";
2470 aMode = Draw::Atoi (theArgVec[anArgIter]);
2472 else if (!parseRedrawMode (anArg, aToUpdate))
2478 if (anArgIter < theArgNb)
2480 // has a list of names
2481 for (; anArgIter < theArgNb; ++anArgIter)
2483 TCollection_AsciiString aName = theArgVec[anArgIter];
2484 if (!GetMapOfAIS().IsBound2 (aName))
2486 std::cout << "Error: presentation " << aName << " does not exist\n";
2490 Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName));
2491 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
2494 std::cout << "Error: presentation " << aName << " does not exist\n";
2497 bndPresentation (theDI, aPrs, aName, anAction);
2500 else if (TheAISContext()->NbCurrents() > 0)
2502 // remove all currently selected objects
2503 for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
2505 Handle(AIS_InteractiveObject) anIO = aCtx->Current();
2506 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
2509 bndPresentation (theDI, aPrs, GetMapOfAIS().IsBound1 (anIO) ? GetMapOfAIS().Find1 (anIO) : "", anAction);
2516 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2517 anIter.More(); anIter.Next())
2519 Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2520 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
2523 bndPresentation (theDI, aPrs, anIter.Key2(), anAction);
2528 // update the screen and redraw the view
2529 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2530 a3DView()->SetImmediateUpdate (isAutoUpdate);
2531 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2532 || aToUpdate == ViewerTest_RM_RedrawForce)
2534 TheAISContext()->UpdateCurrentViewer();
2540 //==============================================================================
2541 //function : VTexture
2543 //==============================================================================
2544 Standard_Integer VTexture (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgv)
2546 TCollection_AsciiString aCommandName (theArgv[0]);
2548 NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)> aMapOfArgs;
2549 if (aCommandName == "vtexture")
2553 std::cout << theArgv[0] << ": " << " invalid arguments.\n";
2554 std::cout << "Type help for more information.\n";
2558 // look for options of vtexture command
2559 TCollection_AsciiString aParseKey;
2560 for (Standard_Integer anArgIt = 2; anArgIt < theArgsNb; ++anArgIt)
2562 TCollection_AsciiString anArg (theArgv [anArgIt]);
2565 if (anArg.Value (1) == '-' && !anArg.IsRealValue())
2568 aParseKey.Remove (1);
2569 aParseKey.UpperCase();
2570 aMapOfArgs.Bind (aParseKey, new TColStd_HSequenceOfAsciiString);
2574 if (aParseKey.IsEmpty())
2579 aMapOfArgs(aParseKey)->Append (anArg);
2582 else if (aCommandName == "vtexscale"
2583 || aCommandName == "vtexorigin"
2584 || aCommandName == "vtexrepeat")
2586 // scan for parameters of vtexscale, vtexorigin, vtexrepeat commands
2587 // equal to -scale, -origin, -repeat options of vtexture command
2588 if (theArgsNb < 2 || theArgsNb > 4)
2590 std::cout << theArgv[0] << ": " << " invalid arguments.\n";
2591 std::cout << "Type help for more information.\n";
2595 Handle(TColStd_HSequenceOfAsciiString) anArgs = new TColStd_HSequenceOfAsciiString;
2598 anArgs->Append ("OFF");
2600 else if (theArgsNb == 4)
2602 anArgs->Append (TCollection_AsciiString (theArgv[2]));
2603 anArgs->Append (TCollection_AsciiString (theArgv[3]));
2606 TCollection_AsciiString anArgKey;
2607 if (aCommandName == "vtexscale")
2611 else if (aCommandName == "vtexorigin")
2613 anArgKey = "ORIGIN";
2617 anArgKey = "REPEAT";
2620 aMapOfArgs.Bind (anArgKey, anArgs);
2622 else if (aCommandName == "vtexdefault")
2624 // scan for parameters of vtexdefault command
2625 // equal to -default option of vtexture command
2626 aMapOfArgs.Bind ("DEFAULT", new TColStd_HSequenceOfAsciiString);
2629 // Check arguments for validity
2630 NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)>::Iterator aMapIt (aMapOfArgs);
2631 for (; aMapIt.More(); aMapIt.Next())
2633 const TCollection_AsciiString& aKey = aMapIt.Key();
2634 const Handle(TColStd_HSequenceOfAsciiString)& anArgs = aMapIt.Value();
2636 // -scale, -origin, -repeat: one argument "off", or two real values
2637 if ((aKey.IsEqual ("SCALE") || aKey.IsEqual ("ORIGIN") || aKey.IsEqual ("REPEAT"))
2638 && ((anArgs->Length() == 1 && anArgs->Value(1) == "OFF")
2639 || (anArgs->Length() == 2 && anArgs->Value(1).IsRealValue() && anArgs->Value(2).IsRealValue())))
2644 // -modulate: single argument "on" / "off"
2645 if (aKey.IsEqual ("MODULATE") && anArgs->Length() == 1 && (anArgs->Value(1) == "OFF" || anArgs->Value(1) == "ON"))
2650 // -default: no arguments
2651 if (aKey.IsEqual ("DEFAULT") && anArgs->IsEmpty())
2656 TCollection_AsciiString aLowerKey;
2659 aLowerKey.LowerCase();
2660 std::cout << theArgv[0] << ": " << aLowerKey << " is unknown option, or the arguments are unacceptable.\n";
2661 std::cout << "Type help for more information.\n";
2665 Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
2666 if (anAISContext.IsNull())
2668 std::cout << aCommandName << ": " << " please use 'vinit' command to initialize view.\n";
2672 Standard_Integer aPreviousMode = 0;
2674 ViewerTest::CurrentView()->SetSurfaceDetail (V3d_TEX_ALL);
2676 TCollection_AsciiString aShapeName (theArgv[1]);
2677 Handle(AIS_InteractiveObject) anIO;
2679 const ViewerTest_DoubleMapOfInteractiveAndName& aMapOfIO = GetMapOfAIS();
2680 if (aMapOfIO.IsBound2 (aShapeName))
2682 anIO = Handle(AIS_InteractiveObject)::DownCast (aMapOfIO.Find2 (aShapeName));
2687 std::cout << aCommandName << ": shape " << aShapeName << " does not exists.\n";
2691 Handle(AIS_TexturedShape) aTexturedIO;
2692 if (anIO->IsKind (STANDARD_TYPE (AIS_TexturedShape)))
2694 aTexturedIO = Handle(AIS_TexturedShape)::DownCast (anIO);
2695 aPreviousMode = aTexturedIO->DisplayMode();
2699 anAISContext->Clear (anIO, Standard_False);
2700 aTexturedIO = new AIS_TexturedShape (DBRep::Get (theArgv[1]));
2701 GetMapOfAIS().UnBind1 (anIO);
2702 GetMapOfAIS().UnBind2 (aShapeName);
2703 GetMapOfAIS().Bind (aTexturedIO, aShapeName);
2706 // -------------------------------------------
2707 // Turn texturing on/off - only for vtexture
2708 // -------------------------------------------
2710 if (aCommandName == "vtexture")
2712 TCollection_AsciiString aTextureArg (theArgsNb > 2 ? theArgv[2] : "");
2714 if (aTextureArg.IsEmpty())
2716 std::cout << aCommandName << ": " << " Texture mapping disabled.\n";
2717 std::cout << "To enable it, use 'vtexture NameOfShape NameOfTexture'\n" << "\n";
2719 anAISContext->SetDisplayMode (aTexturedIO, AIS_Shaded, Standard_False);
2720 if (aPreviousMode == 3)
2722 anAISContext->RecomputePrsOnly (aTexturedIO);
2725 anAISContext->Display (aTexturedIO, Standard_True);
2728 else if (aTextureArg.Value(1) != '-') // "-option" on place of texture argument
2730 if (aTextureArg == "?")
2732 TCollection_AsciiString aTextureFolder = Graphic3d_TextureRoot::TexturesFolder();
2734 theDi << "\n Files in current directory : \n" << "\n";
2735 theDi.Eval ("glob -nocomplain *");
2737 TCollection_AsciiString aCmnd ("glob -nocomplain ");
2738 aCmnd += aTextureFolder;
2741 theDi << "Files in " << aTextureFolder.ToCString() << " : \n" << "\n";
2742 theDi.Eval (aCmnd.ToCString());
2747 aTexturedIO->SetTextureFileName (aTextureArg);
2752 // ------------------------------------
2753 // Process other options and commands
2754 // ------------------------------------
2756 Handle(TColStd_HSequenceOfAsciiString) aValues;
2757 if (aMapOfArgs.Find ("DEFAULT", aValues))
2759 aTexturedIO->SetTextureRepeat (Standard_False);
2760 aTexturedIO->SetTextureOrigin (Standard_False);
2761 aTexturedIO->SetTextureScale (Standard_False);
2762 aTexturedIO->EnableTextureModulate();
2766 if (aMapOfArgs.Find ("SCALE", aValues))
2768 if (aValues->Value(1) != "OFF")
2770 aTexturedIO->SetTextureScale (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
2774 aTexturedIO->SetTextureScale (Standard_False);
2778 if (aMapOfArgs.Find ("ORIGIN", aValues))
2780 if (aValues->Value(1) != "OFF")
2782 aTexturedIO->SetTextureOrigin (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
2786 aTexturedIO->SetTextureOrigin (Standard_False);
2790 if (aMapOfArgs.Find ("REPEAT", aValues))
2792 if (aValues->Value(1) != "OFF")
2794 aTexturedIO->SetTextureRepeat (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
2798 aTexturedIO->SetTextureRepeat (Standard_False);
2802 if (aMapOfArgs.Find ("MODULATE", aValues))
2804 if (aValues->Value(1) == "ON")
2806 aTexturedIO->EnableTextureModulate();
2810 aTexturedIO->DisableTextureModulate();
2815 if (aTexturedIO->DisplayMode() == 3 || aPreviousMode == 3)
2817 anAISContext->RecomputePrsOnly (aTexturedIO);
2821 anAISContext->SetDisplayMode (aTexturedIO, 3, Standard_False);
2822 anAISContext->Display (aTexturedIO, Standard_True);
2823 anAISContext->Update (aTexturedIO,Standard_True);
2829 //==============================================================================
2830 //function : VDisplay2
2832 //purpose : Display an object from its name
2833 //==============================================================================
2834 static int VDisplay2 (Draw_Interpretor& theDI,
2835 Standard_Integer theArgNb,
2836 const char** theArgVec)
2840 std::cout << theArgVec[0] << "Error: wrong syntax!\n";
2843 else if (a3DView().IsNull())
2845 ViewerTest::ViewerInit();
2846 std::cout << "Command vinit should be called before!\n";
2850 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
2851 if (aCtx->HasOpenedContext())
2853 aCtx->CloseLocalContext();
2856 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2857 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
2859 const TCollection_AsciiString aName = theArgVec[anArgIter];
2860 if (parseRedrawMode (aName, aToUpdate))
2864 else if (!GetMapOfAIS().IsBound2 (aName))
2866 // create the AIS_Shape from a name
2867 const Handle(AIS_InteractiveObject) aShape = GetAISShapeFromName (aName.ToCString());
2868 if (!aShape.IsNull())
2870 GetMapOfAIS().Bind (aShape, aName);
2871 aCtx->Display (aShape, Standard_False);
2876 Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
2877 if (anObj->IsKind (STANDARD_TYPE (AIS_InteractiveObject)))
2879 Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anObj);
2880 if (aShape->Type() == AIS_KOI_Datum)
2882 aCtx->Display (aShape, Standard_False);
2886 theDI << "Display " << aName.ToCString() << "\n";
2887 // get the Shape from a name
2888 TopoDS_Shape aNewShape = GetShapeFromName (aName.ToCString());
2890 // update the Shape in the AIS_Shape
2891 Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aShape);
2892 if (!aShapePrs.IsNull())
2894 aShapePrs->Set (aNewShape);
2896 aCtx->Redisplay (aShape, Standard_False);
2897 aCtx->Display (aShape, Standard_False);
2901 else if (anObj->IsKind (STANDARD_TYPE (NIS_InteractiveObject)))
2903 Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anObj);
2904 TheNISContext()->Display (aShape);
2908 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2909 a3DView()->SetImmediateUpdate (isAutoUpdate);
2910 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2911 || aToUpdate == ViewerTest_RM_RedrawForce)
2913 // update the screen and redraw the view
2914 aCtx->UpdateCurrentViewer();
2919 //===============================================================================================
2920 //function : VUpdate
2922 //===============================================================================================
2923 static int VUpdate (Draw_Interpretor& /*theDi*/, Standard_Integer theArgsNb, const char** theArgVec)
2925 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
2926 if (aContextAIS.IsNull())
2928 std::cout << theArgVec[0] << "AIS context is not available.\n";
2934 std::cout << theArgVec[0] << ": insufficient arguments. Type help for more information.\n";
2938 const ViewerTest_DoubleMapOfInteractiveAndName& anAISMap = GetMapOfAIS();
2940 AIS_ListOfInteractive aListOfIO;
2942 for (int anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
2944 TCollection_AsciiString aName = TCollection_AsciiString (theArgVec[anArgIt]);
2946 Handle(AIS_InteractiveObject) anAISObj;
2947 if (anAISMap.IsBound2 (aName))
2949 anAISObj = Handle(AIS_InteractiveObject)::DownCast (anAISMap.Find2 (aName));
2952 if (anAISObj.IsNull())
2954 std::cout << theArgVec[0] << ": no AIS interactive object named \"" << aName << "\".\n";
2958 aListOfIO.Append (anAISObj);
2961 AIS_ListIteratorOfListOfInteractive anIOIt (aListOfIO);
2962 for (; anIOIt.More(); anIOIt.Next())
2964 aContextAIS->Update (anIOIt.Value(), Standard_False);
2967 aContextAIS->UpdateCurrentViewer();
2972 //==============================================================================
2974 //purpose : Test the annimation of an object along a
2975 // predifined trajectory
2976 //Draw arg : vperf ShapeName 1/0(Transfo/Location) 1/0(Primitives sensibles ON/OFF)
2977 //==============================================================================
2979 static int VPerf(Draw_Interpretor& di, Standard_Integer , const char** argv) {
2982 if (TheAISContext()->HasOpenedContext())
2983 TheAISContext()->CloseLocalContext();
2985 Standard_Real Step=4*M_PI/180;
2986 Standard_Real Angle=0;
2988 Handle(AIS_InteractiveObject) aIO;
2989 if (GetMapOfAIS().IsBound2(argv[1]))
2990 aIO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(argv[1]));
2994 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aIO);
2998 if (Draw::Atoi(argv[3])==1 ) {
2999 di<<" Primitives sensibles OFF"<<"\n";
3000 TheAISContext()->Deactivate(aIO);
3003 di<<" Primitives sensibles ON"<<"\n";
3005 // Movement par transformation
3006 if(Draw::Atoi(argv[2]) ==1) {
3007 di<<" Calcul par Transformation"<<"\n";
3008 for (Standard_Real myAngle=0;Angle<10*2*M_PI; myAngle++) {
3012 myTransfo.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1) ) ,Angle );
3013 TheAISContext()->SetLocation(aShape,myTransfo);
3014 TheAISContext() ->UpdateCurrentViewer();
3019 di<<" Calcul par Locations"<<"\n";
3020 gp_Trsf myAngleTrsf;
3021 myAngleTrsf.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1) ), Step );
3022 TopLoc_Location myDeltaAngle (myAngleTrsf);
3023 TopLoc_Location myTrueLoc;
3025 for (Standard_Real myAngle=0;Angle<10*2*M_PI; myAngle++) {
3028 myTrueLoc=myTrueLoc*myDeltaAngle;
3029 TheAISContext()->SetLocation(aShape,myTrueLoc );
3030 TheAISContext() ->UpdateCurrentViewer();
3033 if (Draw::Atoi(argv[3])==1 ){
3034 // On reactive la selection des primitives sensibles
3035 TheAISContext()->Activate(aIO,0);
3037 a3DView() -> Redraw();
3039 di<<" Temps ecoule "<<"\n";
3045 //==================================================================================
3046 // Function : VAnimation
3047 //==================================================================================
3048 static int VAnimation (Draw_Interpretor& di, Standard_Integer argc, const char** argv) {
3050 di<<"Use: "<<argv[0]<<" CrankArmFile CylinderHeadFile PropellerFile EngineBlockFile"<<"\n";
3054 Standard_Real thread = 4;
3055 Standard_Real angleA=0;
3056 Standard_Real angleB;
3058 gp_Ax1 Ax1(gp_Pnt(0,0,0),gp_Vec(0,0,1));
3061 TopoDS_Shape CrankArm;
3062 TopoDS_Shape CylinderHead;
3063 TopoDS_Shape Propeller;
3064 TopoDS_Shape EngineBlock;
3066 //BRepTools::Read(CrankArm,"/dp_26/Indus/ege/assemblage/CrankArm.rle",B);
3067 //BRepTools::Read(CylinderHead,"/dp_26/Indus/ege/assemblage/CylinderHead.rle",B);
3068 //BRepTools::Read(Propeller,"/dp_26/Indus/ege/assemblage/Propeller.rle",B);
3069 //BRepTools::Read(EngineBlock,"/dp_26/Indus/ege/assemblage/EngineBlock.rle",B);
3070 BRepTools::Read(CrankArm,argv[1],B);
3071 BRepTools::Read(CylinderHead,argv[2],B);
3072 BRepTools::Read(Propeller,argv[3],B);
3073 BRepTools::Read(EngineBlock,argv[4],B);
3075 if (CrankArm.IsNull() || CylinderHead.IsNull() || Propeller.IsNull() || EngineBlock.IsNull()) {di<<" Syntaxe error:loading failure."<<"\n";}
3081 Handle(AIS_Shape) myAisCylinderHead = new AIS_Shape (CylinderHead);
3082 Handle(AIS_Shape) myAisEngineBlock = new AIS_Shape (EngineBlock);
3083 Handle(AIS_Shape) myAisCrankArm = new AIS_Shape (CrankArm);
3084 Handle(AIS_Shape) myAisPropeller = new AIS_Shape (Propeller);
3086 GetMapOfAIS().Bind(myAisCylinderHead,"a");
3087 GetMapOfAIS().Bind(myAisEngineBlock,"b");
3088 GetMapOfAIS().Bind(myAisCrankArm,"c");
3089 GetMapOfAIS().Bind(myAisPropeller,"d");
3091 TheAISContext()->SetColor(myAisCylinderHead, Quantity_NOC_INDIANRED);
3092 TheAISContext()->SetColor(myAisEngineBlock , Quantity_NOC_RED);
3093 TheAISContext()->SetColor(myAisPropeller , Quantity_NOC_GREEN);
3095 TheAISContext()->Display(myAisCylinderHead,Standard_False);
3096 TheAISContext()->Display(myAisEngineBlock,Standard_False );
3097 TheAISContext()->Display(myAisCrankArm,Standard_False );
3098 TheAISContext()->Display(myAisPropeller,Standard_False);
3100 TheAISContext()->Deactivate(myAisCylinderHead);
3101 TheAISContext()->Deactivate(myAisEngineBlock );
3102 TheAISContext()->Deactivate(myAisCrankArm );
3103 TheAISContext()->Deactivate(myAisPropeller );
3105 // Boucle de mouvement
3106 for (Standard_Real myAngle = 0;angleA<2*M_PI*10.175 ;myAngle++) {
3108 angleA = thread*myAngle*M_PI/180;
3109 X = Sin(angleA)*3/8;
3110 angleB = atan(X / Sqrt(-X * X + 1));
3111 Standard_Real decal(25*0.6);
3114 //Build a transformation on the display
3115 gp_Trsf aPropellerTrsf;
3116 aPropellerTrsf.SetRotation(Ax1,angleA);
3117 TheAISContext()->SetLocation(myAisPropeller,aPropellerTrsf);
3119 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));
3120 gp_Trsf aCrankArmTrsf;
3121 aCrankArmTrsf.SetTransformation( base.Rotated(gp_Ax1(gp_Pnt(3*decal,0,0),gp_Dir(0,0,1)),angleB));
3122 TheAISContext()->SetLocation(myAisCrankArm,aCrankArmTrsf);
3124 TheAISContext()->UpdateCurrentViewer();
3127 TopoDS_Shape myNewCrankArm =myAisCrankArm ->Shape().Located( myAisCrankArm ->Location() );
3128 TopoDS_Shape myNewPropeller =myAisPropeller->Shape().Located( myAisPropeller->Location() );
3130 myAisCrankArm ->ResetLocation();
3131 myAisPropeller->ResetLocation();
3133 myAisCrankArm -> Set(myNewCrankArm );
3134 myAisPropeller -> Set(myNewPropeller);
3136 TheAISContext()->Activate(myAisCylinderHead,0);
3137 TheAISContext()->Activate(myAisEngineBlock,0 );
3138 TheAISContext()->Activate(myAisCrankArm ,0 );
3139 TheAISContext()->Activate(myAisPropeller ,0 );
3145 TheAISContext()->Redisplay(myAisCrankArm ,Standard_False);
3146 TheAISContext()->Redisplay(myAisPropeller,Standard_False);
3148 TheAISContext()->UpdateCurrentViewer();
3149 a3DView()->Redraw();
3158 //==============================================================================
3159 //function : VShading
3160 //purpose : Sharpen or roughten the quality of the shading
3161 //Draw arg : vshading ShapeName 0.1->0.00001 1 deg-> 30 deg
3162 //==============================================================================
3163 static int VShading(Draw_Interpretor& ,Standard_Integer argc, const char** argv)
3165 Standard_Real myDevCoef;
3166 Handle(AIS_InteractiveObject) TheAisIO;
3169 const Standard_Boolean HaveToSet = (strcasecmp(argv[0],"vsetshading") == 0);
3171 if (TheAISContext()->HasOpenedContext())
3172 TheAISContext()->CloseLocalContext();
3177 myDevCoef =Draw::Atof(argv[2]);
3180 TCollection_AsciiString name=argv[1];
3181 if (GetMapOfAIS().IsBound2(name ))
3182 TheAisIO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
3183 if (TheAisIO.IsNull())
3184 TheAisIO=GetAISShapeFromName((const char *)name.ToCString());
3187 TheAISContext()->SetDeviationCoefficient(TheAisIO,myDevCoef,Standard_True);
3189 TheAISContext()->SetDeviationCoefficient(TheAisIO,0.0008,Standard_True);
3191 TheAISContext()->Redisplay(TheAisIO);
3194 //==============================================================================
3195 //function : HaveMode
3196 //use : VActivatedModes
3197 //==============================================================================
3198 #include <TColStd_ListIteratorOfListOfInteger.hxx>
3200 Standard_Boolean HaveMode(const Handle(AIS_InteractiveObject)& TheAisIO,const Standard_Integer mode )
3202 TColStd_ListOfInteger List;
3203 TheAISContext()->ActivatedModes (TheAisIO,List);
3204 TColStd_ListIteratorOfListOfInteger it;
3205 Standard_Boolean Found=Standard_False;
3206 for (it.Initialize(List); it.More()&&!Found; it.Next() ){
3207 if (it.Value()==mode ) Found=Standard_True;
3214 //==============================================================================
3215 //function : VActivatedMode
3217 //purpose : permet d'attribuer a chacune des shapes un mode d'activation
3218 // (edges,vertex...)qui lui est propre et le mode de selection standard.
3219 // La fonction s'applique aux shapes selectionnees(current ou selected dans le viewer)
3220 // Dans le cas ou on veut psser la shape en argument, la fonction n'autorise
3221 // qu'un nom et qu'un mode.
3222 //Draw arg : vsetam [ShapeName] mode(0,1,2,3,4,5,6,7)
3223 //==============================================================================
3224 #include <AIS_ListIteratorOfListOfInteractive.hxx>
3226 static int VActivatedMode (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3229 Standard_Boolean ThereIsName = Standard_False ;
3231 if(!a3DView().IsNull()){
3233 const Standard_Boolean HaveToSet = (strcasecmp(argv[0],"vsetam") == 0);
3234 // verification des arguments
3236 if (argc<2||argc>3) { di<<" Syntaxe error"<<"\n";return 1;}
3237 ThereIsName = (argc == 3);
3241 if (argc>1) {di<<" Syntaxe error"<<"\n";return 1;}
3243 di<<" R.A.Z de tous les modes de selecion"<<"\n";
3244 di<<" Fermeture du Context local"<<"\n";
3245 if (TheAISContext()->HasOpenedContext())
3246 TheAISContext()->CloseLocalContext();
3250 // IL n'y a aps de nom de shape passe en argument
3251 if (HaveToSet && !ThereIsName){
3252 Standard_Integer aMode=Draw::Atoi(argv [1]);
3254 const char *cmode="???";
3256 case 0: cmode = "Shape"; break;
3257 case 1: cmode = "Vertex"; break;
3258 case 2: cmode = "Edge"; break;
3259 case 3: cmode = "Wire"; break;
3260 case 4: cmode = "Face"; break;
3261 case 5: cmode = "Shell"; break;
3262 case 6: cmode = "Solid"; break;
3263 case 7: cmode = "Compound"; break;
3266 if( !TheAISContext()->HasOpenedContext() ) {
3267 // il n'y a pas de Context local d'ouvert
3268 // on en ouvre un et on charge toutes les shapes displayees
3269 // on load tous les objets displayees et on Activate les objets de la liste
3270 AIS_ListOfInteractive ListOfIO;
3271 // on sauve dans une AISListOfInteractive tous les objets currents
3272 if (TheAISContext()->NbCurrents()>0 ){
3273 TheAISContext()->UnhilightCurrents(Standard_False);
3275 for (TheAISContext()->InitCurrent(); TheAISContext()->MoreCurrent(); TheAISContext()->NextCurrent() ){
3276 ListOfIO.Append(TheAISContext()->Current() );
3280 TheAISContext()->OpenLocalContext(Standard_False);
3281 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
3284 Handle(AIS_InteractiveObject) aIO =
3285 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
3287 TheAISContext()->Load(aIO,0,Standard_False);
3290 // traitement des objets qui etaient currents dans le Contexte global
3291 if (!ListOfIO.IsEmpty() ) {
3292 // il y avait des objets currents
3293 AIS_ListIteratorOfListOfInteractive iter;
3294 for (iter.Initialize(ListOfIO); iter.More() ; iter.Next() ) {
3295 Handle(AIS_InteractiveObject) aIO=iter.Value();
3296 TheAISContext()->Activate(aIO,aMode);
3297 di<<" Mode: "<<cmode<<" ON pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3301 // On applique le mode a tous les objets displayes
3302 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
3303 it2 (GetMapOfAIS());
3305 Handle(AIS_InteractiveObject) aIO =
3306 Handle(AIS_InteractiveObject)::DownCast(it2.Key1());
3307 if (!aIO.IsNull()) {
3308 di<<" Mode: "<<cmode<<" ON pour "<<it2.Key2().ToCString() <<"\n";
3309 TheAISContext()->Activate(aIO,aMode);
3318 // un Context local est deja ouvert
3319 // Traitement des objets du Context local
3320 if (TheAISContext()->NbSelected()>0 ){
3321 TheAISContext()->UnhilightSelected(Standard_False);
3322 // il y a des objets selected,on les parcourt
3323 for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
3324 Handle(AIS_InteractiveObject) aIO=TheAISContext()->Interactive();
3327 if (HaveMode(aIO,aMode) ) {
3328 di<<" Mode: "<<cmode<<" OFF pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3329 TheAISContext()->Deactivate(aIO,aMode);
3332 di<<" Mode: "<<cmode<<" ON pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3333 TheAISContext()->Activate(aIO,aMode);
3339 // il n'y a pas d'objets selected
3340 // tous les objets diplayes sont traites
3341 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
3344 Handle(AIS_InteractiveObject) aIO =
3345 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
3346 if (!aIO.IsNull()) {
3347 if (HaveMode(aIO,aMode) ) {
3348 di<<" Mode: "<<cmode<<" OFF pour "
3349 <<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3350 TheAISContext()->Deactivate(aIO,aMode);
3353 di<<" Mode: "<<cmode<<" ON pour"
3354 <<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3355 TheAISContext()->Activate(aIO,aMode);
3363 else if (HaveToSet && ThereIsName){
3364 Standard_Integer aMode=Draw::Atoi(argv [2]);
3365 Handle(AIS_InteractiveObject) aIO =
3366 Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(argv[1]));
3368 if (!aIO.IsNull()) {
3369 const char *cmode="???";
3372 case 0: cmode = "Shape"; break;
3373 case 1: cmode = "Vertex"; break;
3374 case 2: cmode = "Edge"; break;
3375 case 3: cmode = "Wire"; break;
3376 case 4: cmode = "Face"; break;
3377 case 5: cmode = "Shell"; break;
3378 case 6: cmode = "Solid"; break;
3379 case 7: cmode = "Compound"; break;
3382 if( !TheAISContext()->HasOpenedContext() ) {
3383 TheAISContext()->OpenLocalContext(Standard_False);
3384 // On charge tous les objets de la map
3385 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it (GetMapOfAIS());
3387 Handle(AIS_InteractiveObject) aShape=
3388 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
3389 if (!aShape.IsNull())
3390 TheAISContext()->Load(aShape,0,Standard_False);
3393 TheAISContext()->Activate(aIO,aMode);
3394 di<<" Mode: "<<cmode<<" ON pour "<<argv[1]<<"\n";
3398 // un Context local est deja ouvert
3399 if (HaveMode(aIO,aMode) ) {
3400 di<<" Mode: "<<cmode<<" OFF pour "<<argv[1]<<"\n";
3401 TheAISContext()->Deactivate(aIO,aMode);
3404 di<<" Mode: "<<cmode<<" ON pour "<<argv[1]<<"\n";
3405 TheAISContext()->Activate(aIO,aMode);
3414 //! Auxiliary method to print Interactive Object information
3415 static void objInfo (const NCollection_Map<Handle(AIS_InteractiveObject)>& theDetected,
3416 const Handle(Standard_Transient)& theObject,
3417 Draw_Interpretor& theDI)
3419 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theObject);
3422 theDI << theObject->DynamicType()->Name() << " is not AIS presentation\n";
3426 theDI << (TheAISContext()->IsDisplayed (anObj) ? "Displayed" : "Hidden ")
3427 << (TheAISContext()->IsSelected (anObj) ? " Selected" : " ")
3428 << (theDetected.Contains (anObj) ? " Detected" : " ")
3430 if (anObj->Type() == AIS_KOI_Datum)
3433 if (anObj->Signature() == 3) { theDI << " AIS_Trihedron"; }
3434 else if (anObj->Signature() == 2) { theDI << " AIS_Axis"; }
3435 else if (anObj->Signature() == 6) { theDI << " AIS_Circle"; }
3436 else if (anObj->Signature() == 5) { theDI << " AIS_Line"; }
3437 else if (anObj->Signature() == 7) { theDI << " AIS_Plane"; }
3438 else if (anObj->Signature() == 1) { theDI << " AIS_Point"; }
3439 else if (anObj->Signature() == 4) { theDI << " AIS_PlaneTrihedron"; }
3442 else if (anObj->Type() == AIS_KOI_Shape
3443 && anObj->Signature() == 0)
3445 theDI << " AIS_Shape";
3447 else if (anObj->Type() == AIS_KOI_Relation)
3449 // AIS_Dimention and AIS_Relation
3450 Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (anObj);
3451 switch (aRelation->KindOfDimension())
3453 case AIS_KOD_PLANEANGLE: theDI << " AIS_AngleDimension"; break;
3454 case AIS_KOD_LENGTH: theDI << " AIS_Chamf2/3dDimension/AIS_LengthDimension"; break;
3455 case AIS_KOD_DIAMETER: theDI << " AIS_DiameterDimension"; break;
3456 case AIS_KOD_ELLIPSERADIUS: theDI << " AIS_EllipseRadiusDimension"; break;
3457 //case AIS_KOD_FILLETRADIUS: theDI << " AIS_FilletRadiusDimension "; break;
3458 case AIS_KOD_OFFSET: theDI << " AIS_OffsetDimension"; break;
3459 case AIS_KOD_RADIUS: theDI << " AIS_RadiusDimension"; break;
3460 default: theDI << " UNKNOWN dimension"; break;
3465 theDI << " UserPrs";
3467 theDI << " (" << theObject->DynamicType()->Name() << ")";
3470 //! Print information about locally selected sub-shapes
3471 static void localCtxInfo (Draw_Interpretor& theDI)
3473 Handle(AIS_InteractiveContext) aCtx = TheAISContext();
3474 if (!aCtx->HasOpenedContext())
3479 TCollection_AsciiString aPrevName;
3480 Handle(AIS_LocalContext) aCtxLoc = aCtx->LocalContext();
3481 for (aCtxLoc->InitSelected(); aCtxLoc->MoreSelected(); aCtxLoc->NextSelected())
3483 const TopoDS_Shape aSubShape = aCtxLoc->SelectedShape();
3484 const Handle(AIS_Shape) aShapeIO = Handle(AIS_Shape)::DownCast (aCtxLoc->SelectedInteractive());
3485 if (aSubShape.IsNull()
3486 || aShapeIO.IsNull()
3487 || !GetMapOfAIS().IsBound1 (aShapeIO))
3492 const TCollection_AsciiString aParentName = GetMapOfAIS().Find1 (aShapeIO);
3493 TopTools_MapOfShape aFilter;
3494 Standard_Integer aNumber = 0;
3495 const TopoDS_Shape aShape = aShapeIO->Shape();
3496 for (TopExp_Explorer anIter (aShape, aSubShape.ShapeType());
3497 anIter.More(); anIter.Next())
3499 if (!aFilter.Add (anIter.Current()))
3501 continue; // filter duplicates
3505 if (!anIter.Current().IsSame (aSubShape))
3510 Standard_CString aShapeName = NULL;
3511 switch (aSubShape.ShapeType())
3513 case TopAbs_COMPOUND: aShapeName = " Compound"; break;
3514 case TopAbs_COMPSOLID: aShapeName = "CompSolid"; break;
3515 case TopAbs_SOLID: aShapeName = " Solid"; break;
3516 case TopAbs_SHELL: aShapeName = " Shell"; break;
3517 case TopAbs_FACE: aShapeName = " Face"; break;
3518 case TopAbs_WIRE: aShapeName = " Wire"; break;
3519 case TopAbs_EDGE: aShapeName = " Edge"; break;
3520 case TopAbs_VERTEX: aShapeName = " Vertex"; break;
3522 case TopAbs_SHAPE: aShapeName = " Shape"; break;
3525 if (aParentName != aPrevName)
3527 theDI << "Locally selected sub-shapes within " << aParentName << ":\n";
3528 aPrevName = aParentName;
3530 theDI << " " << aShapeName << " #" << aNumber << "\n";
3536 //==============================================================================
3539 //Draw arg : vstate [nameA] ... [nameN]
3540 //==============================================================================
3541 static Standard_Integer VState (Draw_Interpretor& theDI,
3542 Standard_Integer theArgNb,
3543 Standard_CString* theArgVec)
3545 Handle(AIS_InteractiveContext) aCtx = TheAISContext();
3548 std::cerr << "Error: No opened viewer!\n";
3552 NCollection_Map<Handle(AIS_InteractiveObject)> aDetected;
3553 for (aCtx->InitDetected(); aCtx->MoreDetected(); aCtx->NextDetected())
3555 aDetected.Add (aCtx->DetectedCurrentObject());
3558 const Standard_Boolean toShowAll = (theArgNb >= 2 && *theArgVec[1] == '*');
3562 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
3564 const TCollection_AsciiString anObjName = theArgVec[anArgIter];
3565 if (!GetMapOfAIS().IsBound2 (anObjName))
3567 theDI << anObjName << " doesn't exist!\n";
3571 const Handle(Standard_Transient) anObjTrans = GetMapOfAIS().Find2 (anObjName);
3572 TCollection_AsciiString aName = anObjName;
3573 aName.LeftJustify (20, ' ');
3574 theDI << " " << aName << " ";
3575 objInfo (aDetected, anObjTrans, theDI);
3581 if (aCtx->NbCurrents() > 0
3584 for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
3586 Handle(AIS_InteractiveObject) anObj = aCtx->Current();
3587 TCollection_AsciiString aName = GetMapOfAIS().Find1 (anObj);
3588 aName.LeftJustify (20, ' ');
3589 theDI << aName << " ";
3590 objInfo (aDetected, anObj, theDI);
3596 theDI << "Neutral-point state:\n";
3597 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anObjIter (GetMapOfAIS());
3598 anObjIter.More(); anObjIter.Next())
3600 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anObjIter.Key1());
3606 TCollection_AsciiString aName = anObjIter.Key2();
3607 aName.LeftJustify (20, ' ');
3608 theDI << " " << aName << " ";
3609 objInfo (aDetected, anObj, theDI);
3612 localCtxInfo (theDI);
3616 //=======================================================================
3617 //function : PickObjects
3619 //=======================================================================
3620 Standard_Boolean ViewerTest::PickObjects(Handle(TColStd_HArray1OfTransient)& arr,
3621 const AIS_KindOfInteractive TheType,
3622 const Standard_Integer TheSignature,
3623 const Standard_Integer MaxPick)
3625 Handle(AIS_InteractiveObject) IO;
3626 Standard_Integer curindex = (TheType == AIS_KOI_None) ? 0 : TheAISContext()->OpenLocalContext();
3628 // step 1: prepare the data
3630 Handle(AIS_SignatureFilter) F1 = new AIS_SignatureFilter(TheType,TheSignature);
3631 TheAISContext()->AddFilter(F1);
3634 // step 2 : wait for the selection...
3635 // Standard_Boolean IsGood (Standard_False);
3636 // Standard_Integer NbPick(0);
3637 Standard_Boolean NbPickGood (0),NbToReach(arr->Length());
3638 Standard_Integer NbPickFail(0);
3639 Standard_Integer argccc = 5;
3640 const char *bufff[] = { "A", "B", "C","D", "E" };
3641 const char **argvvv = (const char **) bufff;
3644 while(NbPickGood<NbToReach && NbPickFail <= MaxPick){
3645 while(ViewerMainLoop(argccc,argvvv)){}
3646 Standard_Integer NbStored = TheAISContext()->NbSelected();
3647 if((unsigned int ) NbStored != NbPickGood)
3648 NbPickGood= NbStored;
3651 cout<<"NbPicked = "<<NbPickGood<<" | Nb Pick Fail :"<<NbPickFail<<endl;
3654 // step3 get result.
3656 if((unsigned int ) NbPickFail >= NbToReach) return Standard_False;
3658 Standard_Integer i(0);
3659 for(TheAISContext()->InitSelected();
3660 TheAISContext()->MoreSelected();
3661 TheAISContext()->NextSelected()){
3663 Handle(AIS_InteractiveObject) IO2 = TheAISContext()->SelectedInteractive();
3664 arr->SetValue(i,IO2);
3669 TheAISContext()->CloseLocalContext(curindex);
3671 return Standard_True;
3675 //=======================================================================
3676 //function : PickObject
3678 //=======================================================================
3679 Handle(AIS_InteractiveObject) ViewerTest::PickObject(const AIS_KindOfInteractive TheType,
3680 const Standard_Integer TheSignature,
3681 const Standard_Integer MaxPick)
3683 Handle(AIS_InteractiveObject) IO;
3684 Standard_Integer curindex = (TheType == AIS_KOI_None) ? 0 : TheAISContext()->OpenLocalContext();
3686 // step 1: prepare the data