0024688: Draw Harness - vdump command makes snapshot only for the first view
[occt.git] / src / ViewerTest / ViewerTest.cxx
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
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
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),
24
25 #include <Standard_Stream.hxx>
26
27 #include <ViewerTest.hxx>
28 #include <TopLoc_Location.hxx>
29 #include <TopTools_HArray1OfShape.hxx>
30 #include <TColStd_HArray1OfTransient.hxx>
31 #include <TColStd_SequenceOfAsciiString.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>
39 #include <AIS.hxx>
40 #include <AIS_Drawer.hxx>
41 #include <AIS_InteractiveObject.hxx>
42 #include <AIS_Trihedron.hxx>
43 #include <AIS_Axis.hxx>
44 #include <AIS_Relation.hxx>
45 #include <AIS_TypeFilter.hxx>
46 #include <AIS_SignatureFilter.hxx>
47 #include <AIS_LocalContext.hxx>
48 #include <AIS_ListOfInteractive.hxx>
49 #include <AIS_ListIteratorOfListOfInteractive.hxx>
50 #include <Aspect_InteriorStyle.hxx>
51 #include <Aspect_Window.hxx>
52 #include <Graphic3d_AspectFillArea3d.hxx>
53 #include <Graphic3d_AspectLine3d.hxx>
54 #include <Graphic3d_TextureRoot.hxx>
55 #include <Image_AlienPixMap.hxx>
56 #include <Prs3d_ShadingAspect.hxx>
57 #include <Prs3d_IsoAspect.hxx>
58 #include <TopTools_MapOfShape.hxx>
59
60 #ifdef HAVE_CONFIG_H
61 # include <config.h>
62 #endif
63 #include <stdio.h>
64 #ifdef HAVE_STRINGS_H
65 # include <strings.h>
66 #endif
67
68 #include <Draw_Interpretor.hxx>
69 #include <TCollection_AsciiString.hxx>
70 #include <Draw_PluginMacro.hxx>
71 #include <ViewerTest.hxx>
72
73 // avoid warnings on 'extern "C"' functions returning C++ classes
74 #ifdef WNT
75 #define _CRT_SECURE_NO_DEPRECATE
76 #pragma warning(4:4190)
77 #pragma warning (disable:4996)
78 #endif
79
80 #include <NIS_InteractiveContext.hxx>
81 #include <NIS_Triangulated.hxx>
82 extern int ViewerMainLoop(Standard_Integer argc, const char** argv);
83
84 #include <Quantity_Color.hxx>
85 #include <Quantity_NameOfColor.hxx>
86
87 #include <Graphic3d_NameOfMaterial.hxx>
88
89 #define DEFAULT_COLOR    Quantity_NOC_GOLDENROD
90 #define DEFAULT_MATERIAL Graphic3d_NOM_BRASS
91
92 enum ViewerTest_RedrawMode
93 {
94   ViewerTest_RM_Auto = -1,
95   ViewerTest_RM_RedrawForce,
96   ViewerTest_RM_RedrawSuppress
97 };
98
99 //! Auxiliary method to parse redraw mode argument
100 static Standard_Boolean parseRedrawMode (const TCollection_AsciiString& theArg,
101                                          ViewerTest_RedrawMode&         theMode)
102 {
103   TCollection_AsciiString anArgCase (theArg);
104   anArgCase.LowerCase();
105   if (anArgCase == "-update"
106    || anArgCase == "-redraw")
107   {
108     theMode = ViewerTest_RM_RedrawForce;
109     return Standard_True;
110   }
111   else if (anArgCase == "-noupdate"
112         || anArgCase == "-noredraw")
113   {
114     theMode = ViewerTest_RM_RedrawSuppress;
115     return Standard_True;
116   }
117   return Standard_False;
118 }
119
120 //=======================================================================
121 //function : GetColorFromName
122 //purpose  : get the Quantity_NameOfColor from a string
123 //=======================================================================
124
125 Quantity_NameOfColor ViewerTest::GetColorFromName (const Standard_CString theName)
126 {
127   for (Standard_Integer anIter = Quantity_NOC_BLACK; anIter <= Quantity_NOC_WHITE; ++anIter)
128   {
129     Standard_CString aColorName = Quantity_Color::StringName (Quantity_NameOfColor (anIter));
130     if (strcasecmp (theName, aColorName) == 0)
131     {
132       return Quantity_NameOfColor (anIter);
133     }
134   }
135
136   return DEFAULT_COLOR;
137 }
138
139 //=======================================================================
140 //function : GetMaterialFromName
141 //purpose  : get the Graphic3d_NameOfMaterial from a string
142 //=======================================================================
143
144 static Graphic3d_NameOfMaterial GetMaterialFromName( const char *name )
145 {
146   Graphic3d_NameOfMaterial mat = DEFAULT_MATERIAL;
147
148   if      ( !strcasecmp(name,"BRASS" ) )         mat = Graphic3d_NOM_BRASS;
149   else if ( !strcasecmp(name,"BRONZE" ) )        mat = Graphic3d_NOM_BRONZE;
150   else if ( !strcasecmp(name,"COPPER" ) )        mat = Graphic3d_NOM_COPPER;
151   else if ( !strcasecmp(name,"GOLD" ) )          mat = Graphic3d_NOM_GOLD;
152   else if ( !strcasecmp(name,"PEWTER" ) )        mat = Graphic3d_NOM_PEWTER;
153   else if ( !strcasecmp(name,"SILVER" ) )        mat = Graphic3d_NOM_SILVER;
154   else if ( !strcasecmp(name,"STEEL" ) )         mat = Graphic3d_NOM_STEEL;
155   else if ( !strcasecmp(name,"METALIZED" ) )     mat = Graphic3d_NOM_METALIZED;
156   else if ( !strcasecmp(name,"STONE" ) )         mat = Graphic3d_NOM_STONE;
157   else if ( !strcasecmp(name,"CHROME" ) )        mat = Graphic3d_NOM_CHROME;
158   else if ( !strcasecmp(name,"ALUMINIUM" ) )     mat = Graphic3d_NOM_ALUMINIUM;
159   else if ( !strcasecmp(name,"NEON_PHC" ) )      mat = Graphic3d_NOM_NEON_PHC;
160   else if ( !strcasecmp(name,"NEON_GNC" ) )      mat = Graphic3d_NOM_NEON_GNC;
161   else if ( !strcasecmp(name,"PLASTER" ) )       mat = Graphic3d_NOM_PLASTER;
162   else if ( !strcasecmp(name,"SHINY_PLASTIC" ) ) mat = Graphic3d_NOM_SHINY_PLASTIC;
163   else if ( !strcasecmp(name,"SATIN" ) )         mat = Graphic3d_NOM_SATIN;
164   else if ( !strcasecmp(name,"PLASTIC" ) )       mat = Graphic3d_NOM_PLASTIC;
165   else if ( !strcasecmp(name,"OBSIDIAN" ) )      mat = Graphic3d_NOM_OBSIDIAN;
166   else if ( !strcasecmp(name,"JADE" ) )          mat = Graphic3d_NOM_JADE;
167
168   return mat;
169 }
170
171 //=======================================================================
172 //function : GetTypeNames
173 //purpose  :
174 //=======================================================================
175 static const char** GetTypeNames()
176 {
177   static const char* names[14] = {"Point","Axis","Trihedron","PlaneTrihedron", "Line","Circle","Plane",
178                           "Shape","ConnectedShape","MultiConn.Shape",
179                           "ConnectedInter.","MultiConn.",
180                           "Constraint","Dimension"};
181   static const char** ThePointer = names;
182   return ThePointer;
183 }
184
185 //=======================================================================
186 //function : GetTypeAndSignfromString
187 //purpose  :
188 //=======================================================================
189 void GetTypeAndSignfromString (const char* name,AIS_KindOfInteractive& TheType,Standard_Integer& TheSign)
190 {
191   const char ** thefullnames = GetTypeNames();
192   Standard_Integer index(-1);
193
194   for(Standard_Integer i=0;i<=13 && index==-1;i++)
195     if(!strcasecmp(name,thefullnames[i]))
196       index = i;
197
198   if(index ==-1){
199     TheType = AIS_KOI_None;
200     TheSign = -1;
201     return;
202   }
203
204   if(index<=6){
205     TheType = AIS_KOI_Datum;
206     TheSign = index+1;
207   }
208   else if (index <=9){
209     TheType = AIS_KOI_Shape;
210     TheSign = index-7;
211   }
212   else if(index<=11){
213     TheType = AIS_KOI_Object;
214     TheSign = index-10;
215   }
216   else{
217     TheType = AIS_KOI_Relation;
218     TheSign = index-12;
219   }
220
221 }
222
223
224
225 #include <string.h>
226 #include <Draw_Interpretor.hxx>
227 #include <Draw.hxx>
228 #include <Draw_Appli.hxx>
229 #include <DBRep.hxx>
230
231
232 #include <TCollection_AsciiString.hxx>
233 #include <V3d_Viewer.hxx>
234 #include <V3d_View.hxx>
235 #include <V3d.hxx>
236
237 #include <AIS_InteractiveContext.hxx>
238 #include <AIS_Shape.hxx>
239 #include <AIS_TexturedShape.hxx>
240 #include <AIS_DisplayMode.hxx>
241 #include <TColStd_MapOfInteger.hxx>
242 #include <AIS_MapOfInteractive.hxx>
243 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
244 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
245 #include <ViewerTest_EventManager.hxx>
246
247 #include <TopoDS_Solid.hxx>
248 #include <BRepTools.hxx>
249 #include <BRep_Builder.hxx>
250 #include <TopAbs_ShapeEnum.hxx>
251
252 #include <TopoDS.hxx>
253 #include <BRep_Tool.hxx>
254
255
256 #include <Draw_Window.hxx>
257 #include <AIS_ListIteratorOfListOfInteractive.hxx>
258 #include <AIS_ListOfInteractive.hxx>
259 #include <AIS_DisplayMode.hxx>
260 #include <TopTools_ListOfShape.hxx>
261 #include <BRepOffsetAPI_MakeThickSolid.hxx>
262 #include <BRepOffset.hxx>
263
264 //==============================================================================
265 //  VIEWER OBJECT MANAGEMENT GLOBAL VARIABLES
266 //==============================================================================
267 Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS(){
268   static ViewerTest_DoubleMapOfInteractiveAndName TheMap;
269   return TheMap;
270 }
271
272
273 //==============================================================================
274 //function : VDisplayAISObject
275 //purpose  : register interactive object in the map of AIS objects;
276 //           if other object with such name already registered, it will be kept
277 //           or replaced depending on value of <theReplaceIfExists>,
278 //           if "true" - the old object will be cleared from AIS context;
279 //           returns Standard_True if <theAISObj> registered in map;
280 //==============================================================================
281 Standard_EXPORT Standard_Boolean VDisplayAISObject (const TCollection_AsciiString& theName,
282                                                     const Handle(AIS_InteractiveObject)& theAISObj,
283                                                     Standard_Boolean theReplaceIfExists = Standard_True)
284 {
285   ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
286   Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
287   if (aContextAIS.IsNull())
288   {
289     std::cout << "AIS context is not available.\n";
290     return Standard_False;
291   }
292
293   if (aMap.IsBound2 (theName))
294   {
295     if (!theReplaceIfExists)
296     {
297       std::cout << "Other interactive object has been already "
298                 << "registered with name: " << theName << ".\n"
299                 << "Please use another name.\n";
300       return Standard_False;
301     }
302
303     // stop displaying object
304     Handle(AIS_InteractiveObject) anOldObj =
305        Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (theName));
306
307     if (!anOldObj.IsNull())
308       aContextAIS->Clear (anOldObj, Standard_True);
309
310     // remove name and old object from map
311     aMap.UnBind2 (theName);
312   }
313
314   if (theAISObj.IsNull())
315   {
316     // object with specified name already unbound
317     return Standard_True;
318   }
319
320   // unbind AIS object if was bound with another name
321   aMap.UnBind1 (theAISObj);
322
323   // can be registered without rebinding
324   aMap.Bind (theAISObj, theName);
325   aContextAIS->Display (theAISObj, Standard_True);
326   return Standard_True;
327 }
328
329 static TColStd_MapOfInteger theactivatedmodes(8);
330 static TColStd_ListOfTransient theEventMgrs;
331
332 static void VwrTst_InitEventMgr(const Handle(NIS_View)& aView,
333                                 const Handle(AIS_InteractiveContext)& Ctx)
334 {
335   theEventMgrs.Clear();
336   theEventMgrs.Prepend(new ViewerTest_EventManager(aView, Ctx));
337 }
338
339 static Handle(V3d_View)&  a3DView()
340 {
341   static Handle(V3d_View) Viou;
342   return Viou;
343 }
344
345
346 Standard_EXPORT Handle(AIS_InteractiveContext)& TheAISContext(){
347   static Handle(AIS_InteractiveContext) aContext;
348   return aContext;
349 }
350
351 const Handle(V3d_View)& ViewerTest::CurrentView()
352 {
353   return a3DView();
354 }
355 void ViewerTest::CurrentView(const Handle(V3d_View)& V)
356 {
357   a3DView() = V;
358 }
359
360 Standard_EXPORT const Handle(NIS_InteractiveContext)& TheNISContext()
361 {
362   static Handle(NIS_InteractiveContext) aContext;
363   if (aContext.IsNull()) {
364     aContext = new NIS_InteractiveContext;
365     aContext->SetSelectionMode (NIS_InteractiveContext::Mode_Normal);
366   }
367   return aContext;
368 }
369
370 const Handle(AIS_InteractiveContext)& ViewerTest::GetAISContext()
371 {
372   return TheAISContext();
373 }
374
375 void ViewerTest::SetAISContext (const Handle(AIS_InteractiveContext)& aCtx)
376 {
377   TheAISContext() = aCtx;
378   ViewerTest::ResetEventManager();
379 }
380
381 Handle(V3d_Viewer) ViewerTest::GetViewerFromContext()
382 {
383   return !TheAISContext().IsNull() ? TheAISContext()->CurrentViewer() : Handle(V3d_Viewer)();
384 }
385
386 Handle(V3d_Viewer) ViewerTest::GetCollectorFromContext()
387 {
388   return !TheAISContext().IsNull() ? TheAISContext()->CurrentViewer() : Handle(V3d_Viewer)();
389 }
390
391
392 void ViewerTest::SetEventManager(const Handle(ViewerTest_EventManager)& EM){
393   theEventMgrs.Prepend(EM);
394 }
395
396 void ViewerTest::UnsetEventManager()
397 {
398   theEventMgrs.RemoveFirst();
399 }
400
401
402 void ViewerTest::ResetEventManager()
403 {
404   const Handle(NIS_View) aView =
405     Handle(NIS_View)::DownCast(ViewerTest::CurrentView());
406   VwrTst_InitEventMgr(aView, ViewerTest::GetAISContext());
407 }
408
409 Handle(ViewerTest_EventManager) ViewerTest::CurrentEventManager()
410 {
411   Handle(ViewerTest_EventManager) EM;
412   if(theEventMgrs.IsEmpty()) return EM;
413   Handle(Standard_Transient) Tr =  theEventMgrs.First();
414   EM = *((Handle(ViewerTest_EventManager)*)&Tr);
415   return EM;
416 }
417
418 //=======================================================================
419 //function : Get Context and active view
420 //purpose  :
421 //=======================================================================
422 static Standard_Boolean getCtxAndView (Handle(AIS_InteractiveContext)& theCtx,
423                                        Handle(V3d_View)&               theView)
424 {
425   theCtx  = ViewerTest::GetAISContext();
426   theView = ViewerTest::CurrentView();
427   if (theCtx.IsNull()
428    || theView.IsNull())
429   {
430     std::cout << "Error: cannot find an active view!\n";
431     return Standard_False;
432   }
433   return Standard_True;
434 }
435
436 //==============================================================================
437 //function : GetShapeFromName
438 //purpose  : Compute an Shape from a draw variable or a file name
439 //==============================================================================
440
441 static TopoDS_Shape GetShapeFromName(const char* name)
442 {
443   TopoDS_Shape S = DBRep::Get(name);
444
445   if ( S.IsNull() ) {
446         BRep_Builder aBuilder;
447         BRepTools::Read( S, name, aBuilder);
448   }
449
450   return S;
451 }
452
453 //==============================================================================
454 //function : GetAISShapeFromName
455 //purpose  : Compute an AIS_Shape from a draw variable or a file name
456 //==============================================================================
457 Handle(AIS_Shape) GetAISShapeFromName(const char* name)
458 {
459   Handle(AIS_Shape) retsh;
460
461   if(GetMapOfAIS().IsBound2(name)){
462     const Handle(AIS_InteractiveObject) IO =
463       Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
464     if (!IO.IsNull()) {
465       if(IO->Type()==AIS_KOI_Shape) {
466         if(IO->Signature()==0){
467           retsh = *((Handle(AIS_Shape)*)&IO);
468         }
469         else
470           cout << "an Object which is not an AIS_Shape "
471             "already has this name!!!"<<endl;
472       }
473     }
474     return retsh;
475   }
476
477
478   TopoDS_Shape S = GetShapeFromName(name);
479   if ( !S.IsNull() ) {
480     retsh = new AIS_Shape(S);
481   }
482   return retsh;
483 }
484
485
486 //==============================================================================
487 //function : Clear
488 //purpose  : Remove all the object from the viewer
489 //==============================================================================
490 void ViewerTest::Clear()
491 {
492   if ( !a3DView().IsNull() ) {
493     if (TheAISContext()->HasOpenedContext())
494       TheAISContext()->CloseLocalContext();
495     ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it(GetMapOfAIS());
496     while ( it.More() ) {
497       cout << "Remove " << it.Key2() << endl;
498       if (it.Key1()->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
499         const Handle(AIS_InteractiveObject) anObj =
500           Handle(AIS_InteractiveObject)::DownCast (it.Key1());
501         TheAISContext()->Remove(anObj,Standard_False);
502       } else if (it.Key1()->IsKind(STANDARD_TYPE(NIS_InteractiveObject))) {
503         const Handle(NIS_InteractiveObject) anObj =
504           Handle(NIS_InteractiveObject)::DownCast (it.Key1());
505         TheNISContext()->Remove(anObj);
506       }
507       it.Next();
508     }
509     TheAISContext()->UpdateCurrentViewer();
510 //    TheNISContext()->UpdateViews();
511     GetMapOfAIS().Clear();
512   }
513 }
514
515 //==============================================================================
516 //function : StandardModesActivation
517 //purpose  : Activate a selection mode, vertex, edge, wire ..., in a local
518 //           Context
519 //==============================================================================
520 void ViewerTest::StandardModeActivation(const Standard_Integer mode )
521 {
522   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
523   if(mode==0) {
524     if (TheAISContext()->HasOpenedContext())
525       aContext->CloseLocalContext();
526   } else {
527
528     if(!aContext->HasOpenedContext()) {
529       // To unhilight the preselected object
530       aContext->UnhilightCurrents(Standard_False);
531       // Open a local Context in order to be able to select subshape from
532       // the selected shape if any or for all if there is no selection
533       if (!aContext->FirstCurrentObject().IsNull()){
534         aContext->OpenLocalContext(Standard_False);
535
536         for(aContext->InitCurrent();aContext->MoreCurrent();aContext->NextCurrent()){
537           aContext->Load(       aContext->Current(),-1,Standard_True);
538         }
539       }
540       else
541         aContext->OpenLocalContext();
542     }
543
544     const char *cmode="???";
545
546     switch (mode) {
547     case 0: cmode = "Shape"; break;
548     case 1: cmode = "Vertex"; break;
549     case 2: cmode = "Edge"; break;
550     case 3: cmode = "Wire"; break;
551     case 4: cmode = "Face"; break;
552     case 5: cmode = "Shell"; break;
553     case 6: cmode = "Solid"; break;
554     case 7: cmode = "Compsolid"; break;
555     case 8: cmode = "Compound"; break;
556     }
557
558     if(theactivatedmodes.Contains(mode))
559       { // Desactivate
560         aContext->DeactivateStandardMode(AIS_Shape::SelectionType(mode));
561         theactivatedmodes.Remove(mode);
562         cout<<"Mode "<< cmode <<" OFF"<<endl;
563       }
564     else
565       { // Activate
566         aContext->ActivateStandardMode(AIS_Shape::SelectionType(mode));
567         theactivatedmodes.Add(mode);
568         cout<<"Mode "<< cmode << " ON" << endl;
569       }
570   }
571 }
572
573 //==============================================================================
574 //function : CopyIsoAspect
575 //purpose  : Returns copy Prs3d_IsoAspect with new number of isolines.
576 //==============================================================================
577 static Handle(Prs3d_IsoAspect) CopyIsoAspect
578       (const Handle(Prs3d_IsoAspect) &theIsoAspect,
579        const Standard_Integer theNbIsos)
580 {
581   Quantity_Color    aColor;
582   Aspect_TypeOfLine aType;
583   Standard_Real     aWidth;
584
585   theIsoAspect->Aspect()->Values(aColor, aType, aWidth);
586
587   Handle(Prs3d_IsoAspect) aResult =
588     new Prs3d_IsoAspect(aColor, aType, aWidth, theNbIsos);
589
590   return aResult;
591 }
592
593 //==============================================================================
594 //function : visos
595 //purpose  : Returns or sets the number of U- and V- isos and isIsoOnPlane flag
596 //Draw arg : [name1 ...] [nbUIsos nbVIsos IsoOnPlane(0|1)]
597 //==============================================================================
598 static int visos (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
599 {
600   if (TheAISContext().IsNull()) {
601     di << argv[0] << " Call 'vinit' before!\n";
602     return 1;
603   }
604
605   if (argc <= 1) {
606     di << "Current number of isos : " <<
607       TheAISContext()->IsoNumber(AIS_TOI_IsoU) << " " <<
608       TheAISContext()->IsoNumber(AIS_TOI_IsoV) << "\n";
609     di << "IsoOnPlane mode is " <<
610       (TheAISContext()->IsoOnPlane() ? "ON" : "OFF") << "\n";
611
612     return 0;
613   }
614
615   Standard_Integer aLastInd = argc - 1;
616   Standard_Boolean isChanged = Standard_False;
617   Standard_Integer aNbUIsos = 0;
618   Standard_Integer aNbVIsos = 0;
619
620   if (aLastInd >= 3) {
621     Standard_Boolean isIsoOnPlane = Standard_False;
622
623     if (strcmp(argv[aLastInd], "1") == 0) {
624       isIsoOnPlane = Standard_True;
625       isChanged    = Standard_True;
626     } else if (strcmp(argv[aLastInd], "0") == 0) {
627       isIsoOnPlane = Standard_False;
628       isChanged    = Standard_True;
629     }
630
631     if (isChanged) {
632       aNbVIsos = Draw::Atoi(argv[aLastInd - 1]);
633       aNbUIsos = Draw::Atoi(argv[aLastInd - 2]);
634       aLastInd -= 3;
635
636       di << "New number of isos : " << aNbUIsos << " " << aNbVIsos << "\n";
637       di << "New IsoOnPlane mode is " << (isIsoOnPlane ? "ON" : "OFF") << "\n";
638
639       TheAISContext()->IsoOnPlane(isIsoOnPlane);
640
641       if (aLastInd == 0) {
642         // If there are no shapes provided set the default numbers.
643         TheAISContext()->SetIsoNumber(aNbUIsos, AIS_TOI_IsoU);
644         TheAISContext()->SetIsoNumber(aNbVIsos, AIS_TOI_IsoV);
645       }
646     }
647   }
648
649   Standard_Integer i;
650
651   for (i = 1; i <= aLastInd; i++) {
652     TCollection_AsciiString name(argv[i]);
653     Standard_Boolean IsBound = GetMapOfAIS().IsBound2(name);
654
655     if (IsBound) {
656       const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2(name);
657       if (anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
658         const Handle(AIS_InteractiveObject) aShape =
659         Handle(AIS_InteractiveObject)::DownCast (anObj);
660         Handle(AIS_Drawer) CurDrawer = aShape->Attributes();
661         Handle(Prs3d_IsoAspect) aUIso = CurDrawer->UIsoAspect();
662         Handle(Prs3d_IsoAspect) aVIso = CurDrawer->VIsoAspect();
663
664         if (isChanged) {
665           CurDrawer->SetUIsoAspect(CopyIsoAspect(aUIso, aNbUIsos));
666           CurDrawer->SetVIsoAspect(CopyIsoAspect(aVIso, aNbVIsos));
667           TheAISContext()->SetLocalAttributes
668                   (aShape, CurDrawer, Standard_False);
669           TheAISContext()->Redisplay(aShape);
670         } else {
671           di << "Number of isos for " << argv[i] << " : "
672              << aUIso->Number() << " " << aVIso->Number() << "\n";
673         }
674       } else {
675         di << argv[i] << ": Not an AIS interactive object!\n";
676       }
677     } else {
678       di << argv[i] << ": Use 'vdisplay' before\n";
679     }
680   }
681
682   if (isChanged) {
683     TheAISContext()->UpdateCurrentViewer();
684   }
685
686   return 0;
687 }
688
689 //==============================================================================
690 //function : VDispAreas,VDispSensitive,...
691 //purpose  :
692 //==============================================================================
693 static Standard_Integer VDispAreas (Draw_Interpretor& ,
694                                     Standard_Integer  theArgNb,
695                                     Standard_CString* )
696 {
697   if (theArgNb > 1)
698   {
699     std::cout << "Error: wrong syntax!\n";
700     return 1;
701   }
702
703   Handle(AIS_InteractiveContext) aCtx;
704   Handle(V3d_View)               aView;
705   if (!getCtxAndView (aCtx, aView))
706   {
707     return 1;
708   }
709
710   aCtx->DisplayActiveAreas (aView);
711   return 0;
712 }
713 static Standard_Integer VClearAreas (Draw_Interpretor& ,
714                                      Standard_Integer  theArgNb,
715                                      Standard_CString* )
716 {
717   if (theArgNb > 1)
718   {
719     std::cout << "Error: wrong syntax!\n";
720     return 1;
721   }
722
723   Handle(AIS_InteractiveContext) aCtx;
724   Handle(V3d_View)               aView;
725   if (!getCtxAndView (aCtx, aView))
726   {
727     return 1;
728   }
729
730   aCtx->ClearActiveAreas (aView);
731   return 0;
732
733 }
734 static Standard_Integer VDispSensi (Draw_Interpretor& ,
735                                     Standard_Integer  theArgNb,
736                                     Standard_CString* )
737 {
738   if (theArgNb > 1)
739   {
740     std::cout << "Error: wrong syntax!\n";
741     return 1;
742   }
743
744   Handle(AIS_InteractiveContext) aCtx;
745   Handle(V3d_View)               aView;
746   if (!getCtxAndView (aCtx, aView))
747   {
748     return 1;
749   }
750
751   aCtx->DisplayActiveSensitive (aView);
752   return 0;
753
754 }
755
756 static Standard_Integer VClearSensi (Draw_Interpretor& ,
757                                      Standard_Integer  theArgNb,
758                                      Standard_CString* )
759 {
760   if (theArgNb > 1)
761   {
762     std::cout << "Error: wrong syntax!\n";
763     return 1;
764   }
765
766   Handle(AIS_InteractiveContext) aCtx;
767   Handle(V3d_View)               aView;
768   if (!getCtxAndView (aCtx, aView))
769   {
770     return 1;
771   }
772   aCtx->ClearActiveSensitive (aView);
773   return 0;
774 }
775
776 //==============================================================================
777 //function : VDir
778 //purpose  : To list the displayed object with their attributes
779 //==============================================================================
780 static int VDir (Draw_Interpretor& theDI,
781                  Standard_Integer ,
782                  const char** )
783 {
784   if (!a3DView().IsNull())
785   {
786     return 0;
787   }
788
789   for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
790        anIter.More(); anIter.Next())
791   {
792     theDI << "\t" << anIter.Key2().ToCString() << "\n";
793   }
794   return 0;
795 }
796
797 //==============================================================================
798 //function : VSelPrecision
799 //purpose  : To set the selection precision mode and tolerance value
800 //Draw arg : Selection precision mode (0 for window, 1 for view) and tolerance
801 //           value (integer number of pixel for window mode, double value of
802 //           sensitivity for view mode). Without arguments the function just
803 //           prints the current precision mode and the corresponding tolerance.
804 //==============================================================================
805 static int VSelPrecision(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
806 {
807   if( argc > 3 )
808   {
809     di << "Use: " << argv[0] << " [precision_mode [tolerance_value]]\n";
810     return 1;
811   }
812
813   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
814   if( aContext.IsNull() )
815     return 1;
816
817   if( argc == 1 )
818   {
819     StdSelect_SensitivityMode aMode = aContext->SensitivityMode();
820     if( aMode == StdSelect_SM_WINDOW )
821     {
822       Standard_Integer aPixelTolerance = aContext->PixelTolerance();
823       di << "Precision mode  : 0 (window)\n";
824       di << "Pixel tolerance : " << aPixelTolerance << "\n";
825     }
826     else if( aMode == StdSelect_SM_VIEW )
827     {
828       Standard_Real aSensitivity = aContext->Sensitivity();
829       di << "Precision mode : 1 (view)\n";
830       di << "Sensitivity    : " << aSensitivity << "\n";
831     }
832   }
833   else if( argc > 1 )
834   {
835     StdSelect_SensitivityMode aMode = ( StdSelect_SensitivityMode )Draw::Atoi( argv[1] );
836     aContext->SetSensitivityMode( aMode );
837     if( argc > 2 )
838     {
839       if( aMode == StdSelect_SM_WINDOW )
840       {
841         Standard_Integer aPixelTolerance = Draw::Atoi( argv[2] );
842         aContext->SetPixelTolerance( aPixelTolerance );
843       }
844       else if( aMode == StdSelect_SM_VIEW )
845       {
846         Standard_Real aSensitivity = Draw::Atof( argv[2] );
847         aContext->SetSensitivity( aSensitivity );
848       }
849     }
850   }
851   return 0;
852 }
853
854 //==============================================================================
855 //function : VDump
856 //purpose  : To dump the active view snapshot to image file
857 //==============================================================================
858 static Standard_Integer VDump (Draw_Interpretor& theDI,
859                                Standard_Integer  theArgNb,
860                                Standard_CString* theArgVec)
861 {
862   if (theArgNb < 2)
863   {
864     std::cout << "Error: wrong number of arguments! Image file name should be specified at least.\n";
865     return 1;
866   }
867
868   Standard_Integer      anArgIter   = 1;
869   Standard_CString      aFilePath   = theArgVec[anArgIter++];
870   Graphic3d_BufferType  aBufferType = Graphic3d_BT_RGB;
871   V3d_StereoDumpOptions aStereoOpts = V3d_SDO_MONO;
872   Standard_Integer      aWidth      = 0;
873   Standard_Integer      aHeight     = 0;
874   for (; anArgIter < theArgNb; ++anArgIter)
875   {
876     TCollection_AsciiString anArg (theArgVec[anArgIter]);
877     anArg.LowerCase();
878     if (anArg == "rgba")
879     {
880       aBufferType = Graphic3d_BT_RGBA;
881     }
882     else if (anArg == "rgb")
883     {
884       aBufferType = Graphic3d_BT_RGB;
885     }
886     else if (anArg == "depth")
887     {
888       aBufferType = Graphic3d_BT_Depth;
889     }
890     else if (anArg == "l"
891           || anArg == "left")
892     {
893       aStereoOpts = V3d_SDO_LEFT_EYE;
894     }
895     else if (anArg == "r"
896           || anArg == "right")
897     {
898       aStereoOpts = V3d_SDO_RIGHT_EYE;
899     }
900     else if (anArg == "mono")
901     {
902       aStereoOpts = V3d_SDO_MONO;
903     }
904     else if (anArg == "w"
905           || anArg == "width")
906     {
907       if (aWidth  != 0)
908       {
909         std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
910         return 1;
911       }
912       else if (++anArgIter >= theArgNb)
913       {
914         std::cout << "Error: integer value is expected right after 'width'\n";
915         return 1;
916       }
917       aWidth = Draw::Atoi (theArgVec[anArgIter]);
918     }
919     else if (anArg == "h"
920           || anArg == "height")
921     {
922       if (aHeight != 0)
923       {
924         std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
925         return 1;
926       }
927       if (++anArgIter >= theArgNb)
928       {
929         std::cout << "Error: integer value is expected right after 'height'\n";
930         return 1;
931       }
932       aHeight = Draw::Atoi (theArgVec[anArgIter]);
933     }
934     else if (anArg.IsIntegerValue())
935     {
936       // compatibility with old syntax
937       if (aWidth  != 0
938        || aHeight != 0)
939       {
940         std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
941         return 1;
942       }
943       else if (++anArgIter >= theArgNb)
944       {
945         std::cout << "Error: height value is expected right after width\n";
946         return 1;
947       }
948       aWidth  = Draw::Atoi (theArgVec[anArgIter - 1]);
949       aHeight = Draw::Atoi (theArgVec[anArgIter]);
950     }
951     else
952     {
953       std::cout << "Error: unknown argument '" << theArgVec[anArgIter] << "'\n";
954       return 1;
955     }
956   }
957   if ((aWidth <= 0 && aHeight >  0)
958    || (aWidth >  0 && aHeight <= 0))
959   {
960     std::cout << "Error: dimensions " << aWidth << "x" << aHeight << " are incorrect\n";
961     return 1;
962   }
963
964   Handle(V3d_View) aView = ViewerTest::CurrentView();
965   if (aView.IsNull())
966   {
967     std::cout << "Error: cannot find an active view!\n";
968     return 1;
969   }
970
971   if (aWidth <= 0 || aHeight <= 0)
972   {
973     if (aStereoOpts != V3d_SDO_MONO)
974     {
975       aView->Window()->Size (aWidth, aHeight);
976     }
977     else
978     {
979       if (!aView->Dump (aFilePath, aBufferType))
980       {
981         theDI << "Fail: view dump failed!\n";
982       }
983       return 0;
984     }
985   }
986
987   Image_AlienPixMap aPixMap;
988   if (!aView->ToPixMap (aPixMap, aWidth, aHeight, aBufferType, Standard_True, aStereoOpts))
989   {
990     theDI << "Fail: view dump failed!\n";
991     return 0;
992   }
993
994   if (aPixMap.SizeX() != Standard_Size(aWidth)
995    || aPixMap.SizeY() != Standard_Size(aHeight))
996   {
997     theDI << "Fail: dumped dimensions "    << (Standard_Integer )aPixMap.SizeX() << "x" << (Standard_Integer )aPixMap.SizeY()
998           << " are lesser than requested " << aWidth << "x" << aHeight << "\n";
999   }
1000   if (!aPixMap.Save (aFilePath))
1001   {
1002     theDI << "Fail: image can not be saved!\n";
1003   }
1004   return 0;
1005 }
1006
1007
1008 //==============================================================================
1009 //function : Displays,Erase...
1010 //purpose  :
1011 //Draw arg :
1012 //==============================================================================
1013 static int VwrTst_DispErase(const Handle(AIS_InteractiveObject)& IO,
1014                             const Standard_Integer Mode,
1015                             const Standard_Integer TypeOfOperation,
1016                             const Standard_Boolean Upd)
1017 {
1018   Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1019
1020   switch(TypeOfOperation){
1021   case 1:
1022     Ctx->Display(IO,Mode,Upd);
1023     break;
1024   case 2:{
1025     Ctx->Erase(IO,Upd);
1026     break;
1027   }
1028   case 3:{
1029     if(IO.IsNull())
1030       Ctx->SetDisplayMode((AIS_DisplayMode)Mode,Upd);
1031     else
1032       Ctx->SetDisplayMode(IO,Mode,Upd);
1033     break;
1034   }
1035   case 4:{
1036     if(IO.IsNull())
1037       Ctx->SetDisplayMode(0,Upd);
1038     else
1039       Ctx->UnsetDisplayMode(IO,Upd);
1040     break;
1041   }
1042   }
1043   return 0;
1044 }
1045
1046 //=======================================================================
1047 //function :
1048 //purpose  :
1049 //=======================================================================
1050 static int VDispMode (Draw_Interpretor& , Standard_Integer argc, const char** argv)
1051 {
1052
1053   TCollection_AsciiString name;
1054   if(argc>3)
1055     return 1;
1056   // display others presentations
1057   Standard_Integer TypeOfOperation = (strcasecmp(argv[0],"vdispmode")==0)? 1:
1058     (strcasecmp(argv[0],"verasemode")==0) ? 2 :
1059       (strcasecmp(argv[0],"vsetdispmode")==0) ? 3 :
1060         (strcasecmp(argv[0],"vunsetdispmode")==0) ? 4 : -1;
1061
1062   Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1063
1064   //unset displaymode.. comportement particulier...
1065   if(TypeOfOperation==4){
1066     if(argc==1){
1067       if(Ctx->NbCurrents()==0 ||
1068          Ctx->NbSelected()==0){
1069         Handle(AIS_InteractiveObject) IO;
1070         VwrTst_DispErase(IO,-1,4,Standard_False);
1071       }
1072       else if(!Ctx->HasOpenedContext()){
1073         for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
1074           VwrTst_DispErase(Ctx->Current(),-1,4,Standard_False);
1075       }
1076       else{
1077         for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1078           VwrTst_DispErase(Ctx->Interactive(),-1,4,Standard_False);}
1079       Ctx->UpdateCurrentViewer();
1080     }
1081     else{
1082       Handle(AIS_InteractiveObject) IO;
1083       name = argv[1];
1084       if(GetMapOfAIS().IsBound2(name)){
1085         IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1086         if (!IO.IsNull())
1087           VwrTst_DispErase(IO,-1,4,Standard_True);
1088       }
1089     }
1090   }
1091   else if(argc==2){
1092     Standard_Integer Dmode = Draw::Atoi(argv[1]);
1093     if(Ctx->NbCurrents()==0 && TypeOfOperation==3){
1094       Handle(AIS_InteractiveObject) IO;
1095       VwrTst_DispErase(IO,Dmode,TypeOfOperation,Standard_True);
1096     }
1097     if(!Ctx->HasOpenedContext()){
1098       // set/unset display mode sur le Contexte...
1099       for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
1100         VwrTst_DispErase(Ctx->Current(),Dmode,TypeOfOperation,Standard_False);
1101       }
1102       Ctx->UpdateCurrentViewer();
1103     }
1104     else{
1105       for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1106         Ctx->Display(Ctx->Interactive(),Dmode);
1107     }
1108   }
1109   else{
1110     Handle(AIS_InteractiveObject) IO;
1111     name = argv[1];
1112     if(GetMapOfAIS().IsBound2(name))
1113       IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1114     if (!IO.IsNull())
1115       VwrTst_DispErase(IO,Draw::Atoi(argv[2]),TypeOfOperation,Standard_True);
1116   }
1117   return 0;
1118 }
1119
1120
1121 //=======================================================================
1122 //function :
1123 //purpose  :
1124 //=======================================================================
1125 static int VSubInt(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1126 {
1127   if(argc==1) return 1;
1128   Standard_Integer On = Draw::Atoi(argv[1]);
1129   const Handle(AIS_InteractiveContext)& Ctx = ViewerTest::GetAISContext();
1130
1131   if(argc==2){
1132
1133     if(!Ctx->HasOpenedContext()){
1134       di<<"sub intensite ";
1135       if(On==1) di<<"On";
1136       else di<<"Off";
1137       di<<" pour "<<Ctx->NbCurrents()<<"  objets"<<"\n";
1138       for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
1139         if(On==1){
1140           Ctx->SubIntensityOn(Ctx->Current(),Standard_False);}
1141         else{
1142           di <<"passage dans off"<<"\n";
1143           Ctx->SubIntensityOff(Ctx->Current(),Standard_False);
1144         }
1145       }
1146     }
1147     else{
1148       for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()){
1149         if(On==1){
1150           Ctx->SubIntensityOn(Ctx->Interactive(),Standard_False);}
1151         else{
1152           Ctx->SubIntensityOff(Ctx->Interactive(),Standard_False);}
1153       }
1154     }
1155     Ctx->UpdateCurrentViewer();
1156   }
1157   else {
1158     Handle(AIS_InteractiveObject) IO;
1159     TCollection_AsciiString name = argv[2];
1160     if(GetMapOfAIS().IsBound2(name)){
1161       IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1162       if (!IO.IsNull()) {
1163         if(On==1)
1164           Ctx->SubIntensityOn(IO);
1165         else
1166           Ctx->SubIntensityOff(IO);
1167       }
1168     }
1169     else return 1;
1170   }
1171   return 0;
1172
1173 }
1174 //==============================================================================
1175 //function : VColor2
1176 //Author   : ege
1177 //purpose  : change the color of a selected or named or displayed shape
1178 //Draw arg : vcolor2 [name] color
1179 //==============================================================================
1180 static int VColor2 (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1181 {
1182
1183   Standard_Boolean    ThereIsCurrent;
1184   Standard_Boolean    ThereIsArgument;
1185   Standard_Boolean    IsBound = Standard_False ;
1186
1187   const Standard_Boolean HaveToSet=(strcasecmp( argv[0],"vsetcolor") == 0);
1188   if (HaveToSet) {
1189     if ( argc < 2 || argc > 3 ) { di << argv[0] << " syntax error: Give 2 or 3 arguments" << "\n"; return 1; }
1190     ThereIsArgument = (argc != 2);
1191   }
1192   else {
1193     if ( argc > 2 ) { di << argv[0] << " syntax error: Given too many arguments" << "\n"; return 1; }
1194     ThereIsArgument = (argc == 2);
1195   }
1196
1197   if ( !a3DView().IsNull() ) {
1198     TCollection_AsciiString name;
1199     if (ThereIsArgument) {
1200       name = argv[1];
1201       IsBound= GetMapOfAIS().IsBound2(name);
1202     }
1203     if (TheAISContext()->HasOpenedContext())
1204       TheAISContext()->CloseLocalContext();
1205
1206     //  On set le Booleen There is current
1207     if (TheAISContext() -> NbCurrents() > 0  ) {ThereIsCurrent =Standard_True; }
1208     else ThereIsCurrent =Standard_False;
1209
1210     //=======================================================================
1211     // Il y a un  argument
1212     //=======================================================================
1213     if ( ThereIsArgument && IsBound ) {
1214       const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2(name);
1215       if (anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
1216         Handle(AIS_InteractiveObject) ashape =
1217           Handle(AIS_InteractiveObject)::DownCast (anObj);
1218 #ifdef DEB
1219           if (HaveToSet)
1220             di  << "HaveToSet "<< "1" <<" Color Given "<< argv[2] << " Color returned "<< ViewerTest::GetColorFromName(argv[2]) << "\n";
1221           else
1222             di  << "HaveToSet 0\n";
1223 #endif
1224
1225         if(HaveToSet)
1226           TheAISContext()->SetColor(ashape,ViewerTest::GetColorFromName(argv[2]) );
1227         else
1228           TheAISContext()->UnsetColor(ashape);
1229       } else if (anObj->IsKind(STANDARD_TYPE(NIS_InteractiveObject))) {
1230         Handle(NIS_Triangulated) ashape =
1231           Handle(NIS_Triangulated)::DownCast (anObj);
1232         if (!ashape.IsNull())
1233           ashape->SetColor (ViewerTest::GetColorFromName(argv[2]));
1234       }
1235     }
1236
1237
1238     //=======================================================================
1239     // Il n'y a pas d'arguments
1240     // Mais un ou plusieurs objets on des current representation
1241     //=======================================================================
1242     if (ThereIsCurrent && !ThereIsArgument) {
1243       for (TheAISContext() -> InitCurrent() ;
1244            TheAISContext() -> MoreCurrent() ;
1245            TheAISContext() ->NextCurrent() )
1246       {
1247         const Handle(AIS_InteractiveObject) ashape= TheAISContext()->Current();
1248         if (ashape.IsNull())
1249           continue;
1250 #ifdef DEB
1251         if (HaveToSet)
1252           di  << "HaveToSet "<< "1" <<" Color Given "<< argv[2] << " Color returned "<< ViewerTest::GetColorFromName(argv[2]) << "\n";
1253         else
1254           di  << "HaveToSet 0\n";
1255 #endif
1256         if(HaveToSet)
1257           TheAISContext()->SetColor(ashape,ViewerTest::GetColorFromName(argv[1]),Standard_False);
1258         else
1259           TheAISContext()->UnsetColor(ashape,Standard_False);
1260       }
1261
1262       TheAISContext()->UpdateCurrentViewer();
1263     }
1264
1265     //=======================================================================
1266     // Il n'y a pas d'arguments(nom de shape) ET aucun objet courrant
1267     // on impose a tous les objets du viewer la couleur passee
1268     //=======================================================================
1269     else if (!ThereIsCurrent && !ThereIsArgument){
1270       ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it(GetMapOfAIS());
1271       while ( it.More() ) {
1272         const Handle(AIS_InteractiveObject) ashape =
1273           Handle(AIS_InteractiveObject)::DownCast(it.Key1());
1274         if (!ashape.IsNull()) {
1275           if(HaveToSet)
1276             TheAISContext()->SetColor(ashape,ViewerTest::GetColorFromName(argv[1]),Standard_False);
1277           else
1278             TheAISContext()->UnsetColor(ashape,Standard_False);
1279         }
1280         it.Next();
1281       }
1282       TheAISContext()->UpdateCurrentViewer();
1283     }
1284   }
1285   return 0;
1286 }
1287
1288 //==============================================================================
1289 //function : VTransparency
1290 //Author   : ege
1291 //purpose  : change the transparency of a selected or named or displayed shape
1292 //Draw arg : vtransparency [name] TransparencyCoeficient
1293 //==============================================================================
1294
1295 static int VTransparency  (Draw_Interpretor& di, Standard_Integer argc,
1296                            const char** argv)
1297 {
1298   Standard_Boolean    ThereIsCurrent;
1299   Standard_Boolean    ThereIsArgument;
1300   Standard_Boolean    IsBound = Standard_False ;
1301
1302   const Standard_Boolean HaveToSet = (strcasecmp( argv[0],"vsettransparency") == 0);
1303   if (HaveToSet) {
1304     if ( argc < 2 || argc > 3 ) { di << argv[0] << " syntax error passez 1 ou 2 arguments" << "\n"; return 1; }
1305     ThereIsArgument = (argc != 2);
1306   }
1307   else{
1308     if ( argc > 2 ) { di << argv[0] << " syntax error: Passez au plus un argument" << "\n"; return 1; }
1309     ThereIsArgument = (argc == 2);
1310   }
1311
1312   if ( !a3DView().IsNull() ) {
1313     TCollection_AsciiString name;
1314     if (ThereIsArgument) {
1315       name = argv[1];
1316       IsBound= GetMapOfAIS().IsBound2(name);
1317     }
1318     if (TheAISContext()->HasOpenedContext())
1319       TheAISContext()->CloseLocalContext();
1320
1321     if (TheAISContext() -> NbCurrents() > 0  ) {ThereIsCurrent =Standard_True; }
1322     else ThereIsCurrent = Standard_False;
1323
1324     //=======================================================================
1325     // Il y a des arguments: un nom et une couleur
1326     //=======================================================================
1327     if ( ThereIsArgument && IsBound ) {
1328       const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2(name);
1329       if (anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
1330         const Handle(AIS_InteractiveObject) ashape =
1331           Handle(AIS_InteractiveObject)::DownCast(anObj);
1332         if(HaveToSet)
1333           TheAISContext()->SetTransparency(ashape,Draw::Atof(argv[2]) );
1334         else
1335           TheAISContext()->UnsetTransparency(ashape);
1336       } else if (anObj->IsKind(STANDARD_TYPE(NIS_InteractiveObject))) {
1337         const Handle(NIS_InteractiveObject) ashape =
1338           Handle(NIS_InteractiveObject)::DownCast(anObj);
1339         if(HaveToSet)
1340           ashape->SetTransparency(Draw::Atof(argv[2]) );
1341         else
1342           ashape->UnsetTransparency();
1343       }
1344     }
1345     //=======================================================================
1346     // Il n'y a pas d'arguments
1347     // Mais un ou plusieurs objets on des current representation
1348     //=======================================================================
1349     if (ThereIsCurrent && !ThereIsArgument) {
1350       for (TheAISContext() -> InitCurrent() ;
1351            TheAISContext() -> MoreCurrent() ;
1352            TheAISContext() ->NextCurrent() )
1353       {
1354         Handle(AIS_InteractiveObject) ashape =  TheAISContext() -> Current();
1355         if(HaveToSet)
1356           TheAISContext()->SetTransparency(ashape,Draw::Atof(argv[1]),Standard_False);
1357         else
1358           TheAISContext()->UnsetTransparency(ashape,Standard_False);
1359       }
1360
1361       TheAISContext()->UpdateCurrentViewer();
1362     }
1363     //=======================================================================
1364     // Il n'y a pas d'arguments ET aucun objet courrant
1365     //=======================================================================
1366     else if ( !ThereIsCurrent && !ThereIsArgument ) {
1367       ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
1368         it(GetMapOfAIS());
1369       while ( it.More() ) {
1370         Handle(AIS_InteractiveObject) ashape =
1371           Handle(AIS_InteractiveObject)::DownCast(it.Key1());
1372         if (!ashape.IsNull()) {
1373           if(HaveToSet)
1374             TheAISContext()->SetTransparency(ashape,Draw::Atof(argv[1]),Standard_False);
1375           else
1376             TheAISContext()->UnsetTransparency(ashape,Standard_False);
1377         }
1378         it.Next();
1379       }
1380       TheAISContext()->UpdateCurrentViewer();
1381     }
1382   }
1383   return 0;
1384 }
1385
1386
1387 //==============================================================================
1388 //function : VMaterial
1389 //Author   : ege
1390 //purpose  : change the Material of a selected or named or displayed shape
1391 //Draw arg : vmaterial  [Name] Material
1392 //==============================================================================
1393 static int VMaterial (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1394 {
1395
1396   Standard_Boolean    ThereIsCurrent;
1397   Standard_Boolean    ThereIsName;
1398   Standard_Boolean    IsBound = Standard_False ;
1399
1400   const Standard_Boolean HaveToSet = (strcasecmp( argv[0],"vsetmaterial") == 0);
1401   if (HaveToSet) {
1402     if ( argc < 2 || argc > 3 ) { di << argv[0] << " syntax error passez 1 ou 2 arguments" << "\n"; return 1; }
1403     ThereIsName = (argc != 2);
1404   }
1405   else {
1406     if ( argc>2 ) { di << argv[0] << " syntax error passez au plus un argument" << "\n"; return 1; }
1407     ThereIsName = (argc == 2);
1408   }
1409
1410   if ( !a3DView().IsNull() ) {
1411     TCollection_AsciiString name;
1412     if (ThereIsName) {
1413       name = argv[1];
1414       IsBound= GetMapOfAIS().IsBound2(name);
1415     }
1416     if (TheAISContext()->HasOpenedContext())
1417       TheAISContext()->CloseLocalContext();
1418     if (TheAISContext() -> NbCurrents() > 0  )
1419       ThereIsCurrent =Standard_True;
1420     else
1421       ThereIsCurrent =Standard_False;
1422
1423     //=======================================================================
1424     // Ther is a name of shape and a material name
1425     //=======================================================================
1426     if ( ThereIsName && IsBound ) {
1427       Handle(AIS_InteractiveObject) ashape =
1428         Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2(name));
1429       if (!ashape.IsNull()) {
1430         if (HaveToSet)
1431           TheAISContext()->SetMaterial(ashape,GetMaterialFromName(argv[2]));
1432         else
1433           TheAISContext()->UnsetMaterial(ashape);
1434       }
1435     }
1436     //=======================================================================
1437     // Il n'y a pas de nom de shape
1438     // Mais un ou plusieurs objets on des current representation
1439     //=======================================================================
1440     if (ThereIsCurrent && !ThereIsName) {
1441       for (TheAISContext() -> InitCurrent() ;
1442            TheAISContext() -> MoreCurrent() ;
1443            TheAISContext() ->NextCurrent() )
1444       {
1445         Handle(AIS_InteractiveObject) ashape = TheAISContext()->Current();
1446         if (HaveToSet)
1447           TheAISContext()->SetMaterial(ashape,GetMaterialFromName(argv[1]),Standard_False);
1448         else
1449           TheAISContext()->UnsetMaterial(ashape,Standard_False);
1450       }
1451       TheAISContext()->UpdateCurrentViewer();
1452     }
1453
1454     //=======================================================================
1455     // Il n'y a pas de noms de shape ET aucun objet courrant
1456     // On impose a tous les objets du viewer le material passe en argument
1457     //=======================================================================
1458     else if (!ThereIsCurrent && !ThereIsName){
1459       ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
1460         it(GetMapOfAIS());
1461       while ( it.More() ) {
1462         Handle(AIS_InteractiveObject) ashape =
1463           Handle(AIS_InteractiveObject)::DownCast (it.Key1());
1464         if (!ashape.IsNull()) {
1465           if (HaveToSet)
1466             TheAISContext()->SetMaterial(ashape,GetMaterialFromName(argv[1]),Standard_False);
1467           else
1468             TheAISContext()->UnsetMaterial(ashape,Standard_False);
1469         }
1470         it.Next();
1471       }
1472       TheAISContext()->UpdateCurrentViewer();
1473     }
1474   }
1475   return 0;
1476 }
1477
1478
1479
1480 //==============================================================================
1481 //function : VWidth
1482 //Author   : ege
1483 //purpose  : change the width of the edges of a selected or named or displayed shape
1484 //Draw arg : vwidth  [Name] WidthValue(1->10)
1485 //==============================================================================
1486 static int VWidth (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1487 {
1488
1489   Standard_Boolean    ThereIsCurrent;
1490   Standard_Boolean    ThereIsArgument;
1491   Standard_Boolean    IsBound = Standard_False ;
1492
1493   const Standard_Boolean HaveToSet = (strcasecmp( argv[0],"vsetwidth") == 0);
1494   if (HaveToSet) {
1495     if ( argc < 2 || argc > 3 ) { di << argv[0] << " syntax error passez 1 ou 2 arguments" << "\n"; return 1; }
1496     ThereIsArgument = (argc != 2);
1497   }
1498   else {
1499     if ( argc>2 ) { di << argv[0] << " syntax error passez au plus 1  argument" << "\n"; return 1; }
1500     ThereIsArgument = (argc == 2);
1501   }
1502   if ( !a3DView().IsNull() ) {
1503     TCollection_AsciiString name;
1504     if (ThereIsArgument) {
1505       name = argv[1];
1506       IsBound= GetMapOfAIS().IsBound2(name);
1507     }
1508     if (TheAISContext()->HasOpenedContext())
1509       TheAISContext()->CloseLocalContext();
1510
1511     if (TheAISContext() -> NbCurrents() > 0  )
1512       ThereIsCurrent =Standard_True;
1513     else
1514       ThereIsCurrent =Standard_False;
1515
1516     if ( ThereIsArgument && IsBound ) {
1517       const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2(name);
1518       if (anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
1519         const Handle(AIS_InteractiveObject) ashape =
1520           Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1521         if (HaveToSet)
1522           TheAISContext()->SetWidth ( ashape,Draw::Atof (argv[2]) );
1523         else
1524           TheAISContext()->UnsetWidth (ashape);
1525       } else if (anObj->IsKind(STANDARD_TYPE(NIS_InteractiveObject))) {
1526         const Handle(NIS_Triangulated) ashape =
1527           Handle(NIS_Triangulated)::DownCast(GetMapOfAIS().Find2(name));
1528         if (HaveToSet && !ashape.IsNull())
1529           ashape->SetLineWidth ( Draw::Atof (argv[2]) );
1530       }
1531     }
1532
1533     //=======================================================================
1534     // Il n'y a pas d'arguments
1535     // Mais un ou plusieurs objets on des current representation
1536     //=======================================================================
1537     if (ThereIsCurrent && !ThereIsArgument) {
1538       for (TheAISContext() -> InitCurrent() ;
1539            TheAISContext() -> MoreCurrent() ;
1540            TheAISContext() ->NextCurrent() )
1541       {
1542         Handle(AIS_InteractiveObject) ashape =  TheAISContext() -> Current();
1543         if (HaveToSet)
1544           TheAISContext()->SetWidth(ashape,Draw::Atof(argv[1]),Standard_False);
1545         else
1546           TheAISContext()->UnsetWidth(ashape,Standard_False);
1547       }
1548       TheAISContext()->UpdateCurrentViewer();
1549     }
1550     //=======================================================================
1551     // Il n'y a pas d'arguments ET aucun objet courrant
1552     //=======================================================================
1553     else if (!ThereIsCurrent && !ThereIsArgument){
1554      ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
1555        it(GetMapOfAIS());
1556       while ( it.More() ) {
1557         Handle(AIS_InteractiveObject) ashape =
1558           Handle(AIS_InteractiveObject)::DownCast (it.Key1());
1559         if (!ashape.IsNull()) {
1560           if (HaveToSet)
1561             TheAISContext()->SetWidth(ashape,Draw::Atof(argv[1]),Standard_False);
1562           else
1563             TheAISContext()->UnsetWidth(ashape,Standard_False);
1564         }
1565         it.Next();
1566      }
1567      TheAISContext()->UpdateCurrentViewer();
1568    }
1569   }
1570   return 0;
1571 }
1572
1573 //==============================================================================
1574 //function : VInteriorStyle
1575 //purpose  : sets interior style of the a selected or named or displayed shape
1576 //Draw arg : vsetinteriorstyle [shape] style
1577 //==============================================================================
1578 static void SetInteriorStyle (const Handle(AIS_InteractiveObject)& theIAO,
1579                               const Standard_Integer theStyle,
1580                               Draw_Interpretor& di)
1581 {
1582   if (theStyle < Aspect_IS_EMPTY || theStyle > Aspect_IS_HIDDENLINE) {
1583     di << "Style must be within a range [0 (Aspect_IS_EMPTY), " << Aspect_IS_HIDDENLINE <<
1584       " (Aspect_IS_HIDDENLINE)]\n";
1585     return;
1586   }
1587   const Handle(Prs3d_Drawer)& aDrawer = theIAO->Attributes();
1588   Handle(Prs3d_ShadingAspect) aShadingAspect = aDrawer->ShadingAspect();
1589   Handle(Graphic3d_AspectFillArea3d) aFillAspect = aShadingAspect->Aspect();
1590   Aspect_InteriorStyle aStyle = (Aspect_InteriorStyle) (theStyle);
1591   aFillAspect->SetInteriorStyle (aStyle);
1592   TheAISContext()->RecomputePrsOnly (theIAO, Standard_False /*update*/, Standard_True /*all modes*/);
1593 }
1594
1595 static int VInteriorStyle (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1596 {
1597   if (argc < 2 || argc > 3) {
1598     di << argv[0] << " requires 2 or 3 arguments\n";
1599     di << "Usage : " << argv[0] << " [shape] Style : Set interior style" << "\n";
1600     di << "Style must match Aspect_InteriorStyle and be one of:\n";
1601     di << "         0 = EMPTY, 1 = HOLLOW, 2 = HATCH, 3 = SOLID, 4 = HIDDENLINE\n";
1602     return 1;
1603   }
1604
1605   Standard_Boolean    ThereIsCurrent;
1606   Standard_Boolean    ThereIsArgument;
1607   Standard_Boolean    IsBound = Standard_False ;
1608
1609   ThereIsArgument = (argc > 2);
1610   if ( !a3DView().IsNull() ) {
1611     TCollection_AsciiString name;
1612     if (ThereIsArgument) {
1613       name = argv[1];
1614       IsBound= GetMapOfAIS().IsBound2(name);
1615     }
1616     if (TheAISContext()->HasOpenedContext())
1617       TheAISContext()->CloseLocalContext();
1618
1619     if (TheAISContext() -> NbCurrents() > 0  )
1620       ThereIsCurrent =Standard_True;
1621     else
1622       ThereIsCurrent =Standard_False;
1623
1624     if ( ThereIsArgument && IsBound ) {
1625       const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2(name);
1626       if (anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
1627         const Handle(AIS_InteractiveObject) ashape =
1628           Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1629         SetInteriorStyle (ashape, Draw::Atoi (argv[2]), di);
1630       }
1631     }
1632     //=======================================================================
1633     // No arguments specified
1634     // But there are one or more selected objects
1635     //=======================================================================
1636     if (ThereIsCurrent && !ThereIsArgument) {
1637       for (TheAISContext() -> InitCurrent() ;
1638            TheAISContext() -> MoreCurrent() ;
1639            TheAISContext() ->NextCurrent() )
1640       {
1641         Handle(AIS_InteractiveObject) ashape =  TheAISContext() -> Current();
1642         SetInteriorStyle (ashape, Draw::Atoi (argv[1]), di);
1643       }
1644     }
1645     //=======================================================================
1646     // No arguments specified and there are no selected objects
1647     //=======================================================================
1648     else if (!ThereIsCurrent && !ThereIsArgument){
1649       ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
1650        it(GetMapOfAIS());
1651       while ( it.More() ) {
1652         Handle(AIS_InteractiveObject) ashape =
1653           Handle(AIS_InteractiveObject)::DownCast (it.Key1());
1654         if (!ashape.IsNull())
1655           SetInteriorStyle (ashape, Draw::Atoi (argv[1]), di);
1656         it.Next();
1657       }
1658     }
1659     TheAISContext()->UpdateCurrentViewer();
1660   }
1661   return 0;
1662 }
1663
1664 //==============================================================================
1665 //function : VDonly2
1666 //author   : ege
1667 //purpose  : Display only a selected or named  object
1668 //           if there is no selected or named object s, nothing is done
1669 //==============================================================================
1670 static int VDonly2 (Draw_Interpretor& ,
1671                     Standard_Integer  theArgNb,
1672                     const char**      theArgVec)
1673 {
1674   const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1675   if (aCtx.IsNull())
1676   {
1677     std::cerr << "Error: no active view!\n";
1678     return 1;
1679   }
1680
1681   if (aCtx->HasOpenedContext())
1682   {
1683     aCtx->CloseLocalContext();
1684   }
1685   ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
1686
1687   Standard_Integer anArgIter = 1;
1688   for (; anArgIter < theArgNb; ++anArgIter)
1689   {
1690     if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
1691     {
1692       break;
1693     }
1694   }
1695
1696   NCollection_Map<Handle(Standard_Transient)> aDispSet;
1697   if (anArgIter >= theArgNb)
1698   {
1699     // display only selected objects
1700     if (aCtx->NbCurrents() < 1)
1701     {
1702       return 0;
1703     }
1704
1705     for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
1706     {
1707       aDispSet.Add (aCtx->Current());
1708     }
1709   }
1710   else
1711   {
1712     // display only specified objects
1713     for (; anArgIter < theArgNb; ++anArgIter)
1714     {
1715       TCollection_AsciiString aName = theArgVec[anArgIter];
1716       if (GetMapOfAIS().IsBound2 (aName))
1717       {
1718         const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
1719         if (anObj->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
1720         {
1721           const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anObj);
1722           aCtx->Display (aShape, Standard_False);
1723         }
1724         else if (anObj->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
1725         {
1726           Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anObj);
1727           TheNISContext()->Display (aShape);
1728         }
1729         aDispSet.Add (anObj);
1730       }
1731     }
1732   }
1733
1734   // weed out other objects
1735   for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS()); anIter.More(); anIter.Next())
1736   {
1737     if (aDispSet.Contains (anIter.Key1()))
1738     {
1739       continue;
1740     }
1741
1742     if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
1743     {
1744       const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
1745       aCtx->Erase (aShape, Standard_False);
1746     }
1747     else if (anIter.Key1()->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
1748     {
1749       const Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
1750       TheNISContext()->Erase (aShape);
1751     }
1752   }
1753
1754   // update the screen and redraw the view
1755   const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
1756   a3DView()->SetImmediateUpdate (isAutoUpdate);
1757   if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
1758    || aToUpdate == ViewerTest_RM_RedrawForce)
1759   {
1760     TheAISContext()->UpdateCurrentViewer();
1761   }
1762
1763   return 0;
1764 }
1765
1766 //==============================================================================
1767 //function : VRemove
1768 //purpose  : Removes selected or named objects.
1769 //           If there is no selected or named objects,
1770 //           all objects in the viewer can be removed with argument -all.
1771 //           If -context is in arguments, the object is not deleted from the map of
1772 //           objects (deleted only from the current context).
1773 //==============================================================================
1774 int VRemove (Draw_Interpretor& theDI,
1775              Standard_Integer  theArgNb,
1776              const char**      theArgVec)
1777 {
1778   if (a3DView().IsNull())
1779   {
1780     std::cout << "Error: wrong syntax!\n";
1781     return 1;
1782   }
1783
1784   TheAISContext()->CloseAllContexts (Standard_False);
1785
1786   ViewerTest_RedrawMode aToUpdate     = ViewerTest_RM_Auto;
1787   Standard_Boolean      isContextOnly = Standard_False;
1788   Standard_Boolean      toRemoveAll   = Standard_False;
1789
1790   Standard_Integer anArgIter = 1;
1791   for (; anArgIter < theArgNb; ++anArgIter)
1792   {
1793     TCollection_AsciiString anArg = theArgVec[anArgIter];
1794     anArg.LowerCase();
1795     if (anArg == "-context")
1796     {
1797       isContextOnly = Standard_True;
1798     }
1799     else if (anArg == "-all")
1800     {
1801       toRemoveAll = Standard_True;
1802     }
1803     else if (!parseRedrawMode (anArg, aToUpdate))
1804     {
1805       break;
1806     }
1807   }
1808   if (toRemoveAll
1809    && anArgIter < theArgNb)
1810   {
1811     std::cout << "Error: wrong syntax!\n";
1812     return 1;
1813   }
1814
1815   NCollection_List<TCollection_AsciiString> anIONameList;
1816   if (toRemoveAll)
1817   {
1818     for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
1819          anIter.More(); anIter.Next())
1820     {
1821       anIONameList.Append (anIter.Key2());
1822     }
1823   }
1824   else if (anArgIter < theArgNb) // removed objects names are in argument list
1825   {
1826     for (; anArgIter < theArgNb; ++anArgIter)
1827     {
1828       TCollection_AsciiString aName = theArgVec[anArgIter];
1829       if (!GetMapOfAIS().IsBound2 (aName))
1830       {
1831         theDI << aName.ToCString() << " was not bound to some object.\n";
1832         continue;
1833       }
1834
1835       const Handle(Standard_Transient)& aTransientObj = GetMapOfAIS().Find2 (aName);
1836
1837       const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (aTransientObj);
1838       if (!anIO.IsNull())
1839       {
1840         if (anIO->GetContext() != TheAISContext())
1841         {
1842           theDI << aName.ToCString() << " was not displayed in current context.\n";
1843           theDI << "Please activate view with this object displayed and try again.\n";
1844           continue;
1845         }
1846
1847         anIONameList.Append (aName);
1848         continue;
1849       }
1850
1851       const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (aTransientObj);
1852       if (!aNisIO.IsNull())
1853       {
1854         anIONameList.Append (aName);
1855       }
1856     }
1857   }
1858   else if (TheAISContext()->NbCurrents() > 0
1859         || TheNISContext()->GetSelected().Extent() > 0)
1860   {
1861     for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
1862          anIter.More(); anIter.Next())
1863     {
1864       const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
1865       if (!anIO.IsNull())
1866       {
1867         if (!TheAISContext()->IsCurrent (anIO))
1868         {
1869           continue;
1870         }
1871
1872         anIONameList.Append (anIter.Key2());
1873         continue;
1874       }
1875
1876       const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
1877       if (!aNisIO.IsNull())
1878       {
1879         if (!TheNISContext()->IsSelected (aNisIO))
1880         {
1881           continue;
1882         }
1883
1884         anIONameList.Append (anIter.Key2());
1885       }
1886     }
1887   }
1888
1889   // Unbind all removed objects from the map of displayed IO.
1890   for (NCollection_List<TCollection_AsciiString>::Iterator anIter (anIONameList);
1891        anIter.More(); anIter.Next())
1892   {
1893     const Handle(AIS_InteractiveObject) anIO  = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anIter.Value()));
1894
1895     if (!anIO.IsNull())
1896     {
1897       TheAISContext()->Remove (anIO, Standard_False);
1898       theDI << anIter.Value().ToCString() << " was removed\n";
1899     }
1900     else
1901     {
1902       const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anIter.Value()));
1903       if (!aNisIO.IsNull())
1904       {
1905         TheNISContext()->Remove (aNisIO);
1906         theDI << anIter.Value().ToCString() << " was removed\n";
1907       }
1908     }
1909       
1910     if (!isContextOnly)
1911     {
1912       GetMapOfAIS().UnBind2 (anIter.Value());
1913     }
1914   }
1915
1916   // update the screen and redraw the view
1917   const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
1918   a3DView()->SetImmediateUpdate (isAutoUpdate);
1919   if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
1920    || aToUpdate == ViewerTest_RM_RedrawForce)
1921   {
1922     TheAISContext()->UpdateCurrentViewer();
1923   }
1924
1925   return 0;
1926 }
1927
1928 //==============================================================================
1929 //function : VErase
1930 //purpose  : Erase some selected or named objects
1931 //           if there is no selected or named objects, the whole viewer is erased
1932 //==============================================================================
1933 int VErase (Draw_Interpretor& theDI,
1934             Standard_Integer  theArgNb,
1935             const char**      theArgVec)
1936 {
1937   if (a3DView().IsNull())
1938   {
1939     std::cout << "Error: no active view!\n";
1940     return 1;
1941   }
1942   TheAISContext()->CloseAllContexts (Standard_False);
1943
1944   ViewerTest_RedrawMode  aToUpdate  = ViewerTest_RM_Auto;
1945   const Standard_Boolean toEraseAll = TCollection_AsciiString (theArgNb > 0 ? theArgVec[0] : "") == "veraseall";
1946
1947   Standard_Integer anArgIter = 1;
1948   for (; anArgIter < theArgNb; ++anArgIter)
1949   {
1950     if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
1951     {
1952       break;
1953     }
1954   }
1955
1956   if (anArgIter < theArgNb)
1957   {
1958     if (toEraseAll)
1959     {
1960       std::cerr << "Error: wrong syntax, " << theArgVec[0] << " too much arguments.\n";
1961       return 1;
1962     }
1963
1964     // has a list of names
1965     for (; anArgIter < theArgNb; ++anArgIter)
1966     {
1967       TCollection_AsciiString aName = theArgVec[anArgIter];
1968       if (!GetMapOfAIS().IsBound2 (aName))
1969       {
1970         continue;
1971       }
1972
1973       const Handle(Standard_Transient)    anObj = GetMapOfAIS().Find2 (aName);
1974       const Handle(AIS_InteractiveObject) anIO  = Handle(AIS_InteractiveObject)::DownCast (anObj);
1975       theDI << aName.ToCString() << " ";
1976       if (!anIO.IsNull())
1977       {
1978         TheAISContext()->Erase (anIO, Standard_False);
1979       }
1980       else
1981       {
1982         const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anObj);
1983         if (!aNisIO.IsNull())
1984         {
1985           TheNISContext()->Erase (aNisIO);
1986         }
1987       }
1988     }
1989   }
1990   else if (!toEraseAll
1991         && TheAISContext()->NbCurrents() > 0)
1992   {
1993     // remove all currently selected objects
1994     for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
1995          anIter.More(); anIter.Next())
1996     {
1997       const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
1998       if (!anIO.IsNull()
1999        && TheAISContext()->IsCurrent (anIO))
2000       {
2001         theDI << anIter.Key2().ToCString() << " ";
2002         TheAISContext()->Erase (anIO, Standard_False);
2003       }
2004     }
2005   }
2006   else
2007   {
2008     // erase entire viewer
2009     for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2010          anIter.More(); anIter.Next())
2011     {
2012       const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2013       if (!anIO.IsNull())
2014       {
2015         TheAISContext()->Erase (anIO, Standard_False);
2016       }
2017       else
2018       {
2019         const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2020         if (!aNisIO.IsNull())
2021         {
2022           TheNISContext()->Erase (aNisIO);
2023         }
2024       }
2025     }
2026   }
2027
2028   // update the screen and redraw the view
2029   const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2030   a3DView()->SetImmediateUpdate (isAutoUpdate);
2031   if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2032    || aToUpdate == ViewerTest_RM_RedrawForce)
2033   {
2034     TheAISContext()->UpdateCurrentViewer();
2035   }
2036
2037   return 0;
2038 }
2039
2040 //==============================================================================
2041 //function : VDisplayAll
2042 //author   : ege
2043 //purpose  : Display all the objects of the Map
2044 //==============================================================================
2045 static int VDisplayAll (Draw_Interpretor& ,
2046                         Standard_Integer  theArgNb,
2047                         const char**      theArgVec)
2048
2049 {
2050   if (a3DView().IsNull())
2051   {
2052     std::cout << "Error: no active view!\n";
2053     return 1;
2054   }
2055
2056   ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2057
2058   Standard_Integer anArgIter = 1;
2059   for (; anArgIter < theArgNb; ++anArgIter)
2060   {
2061     if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
2062     {
2063       break;
2064     }
2065   }
2066   if (anArgIter < theArgNb)
2067   {
2068     std::cout << theArgVec[0] << "Error: wrong syntax\n";
2069     return 1;
2070   }
2071
2072   if (TheAISContext()->HasOpenedContext())
2073   {
2074     TheAISContext()->CloseLocalContext();
2075   }
2076
2077   for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2078        anIter.More(); anIter.Next())
2079   {
2080     if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
2081     {
2082       const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2083       TheAISContext()->Erase (aShape, Standard_False);
2084     }
2085     else if (anIter.Key1()->IsKind(STANDARD_TYPE(NIS_InteractiveObject)))
2086     {
2087       const Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2088       TheNISContext()->Erase (aShape);
2089     }
2090   }
2091
2092   for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2093        anIter.More(); anIter.Next())
2094   {
2095     if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
2096     {
2097       const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2098       TheAISContext()->Display (aShape, Standard_False);
2099     }
2100     else if (anIter.Key1()->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
2101     {
2102       Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2103       TheNISContext()->Display (aShape);
2104     }
2105   }
2106
2107   // update the screen and redraw the view
2108   const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2109   a3DView()->SetImmediateUpdate (isAutoUpdate);
2110   if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2111    || aToUpdate == ViewerTest_RM_RedrawForce)
2112   {
2113     TheAISContext()->UpdateCurrentViewer();
2114   }
2115
2116   return 0;
2117 }
2118
2119 //#######################################################################################################
2120
2121 //##     VTexture
2122
2123 //#######################################################################################################
2124
2125 Standard_Integer VTexture (Draw_Interpretor& di,Standard_Integer argc, const char** argv )
2126 {
2127   Standard_Integer command = (strcasecmp(argv[0],"vtexture")==0)? 1:
2128     (strcasecmp(argv[0],"vtexscale")==0) ? 2 :
2129       (strcasecmp(argv[0],"vtexorigin")==0) ? 3 :
2130         (strcasecmp(argv[0],"vtexrepeat")==0) ? 4 :
2131           (strcasecmp(argv[0],"vtexdefault")==0) ? 5 : -1;
2132
2133   Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
2134   if(myAISContext.IsNull())
2135     {
2136       di << "use 'vinit' command before " << argv[0] << "\n";
2137       return 1;
2138     }
2139
2140   Handle(AIS_InteractiveObject) TheAisIO;
2141   Handle(AIS_TexturedShape) myShape;
2142   Standard_Integer myPreviousMode = 0;
2143
2144   if (argc<2 || !argv[1])
2145     {
2146       di << argv[0] <<" syntax error - Type 'help vtex'"<<"\n";
2147       return 1;
2148     }
2149
2150   TCollection_AsciiString name = argv[1];
2151   ViewerTest::CurrentView()->SetSurfaceDetail(V3d_TEX_ALL);
2152
2153   if (GetMapOfAIS().IsBound2(name))
2154     TheAisIO = Handle(AIS_InteractiveObject)::DownCast
2155       (GetMapOfAIS().Find2(name));
2156   if (TheAisIO.IsNull())
2157   {
2158     di <<"shape "<<name.ToCString()<<" doesn\'t exist"<<"\n";
2159     return 1;
2160   }
2161
2162   if (TheAisIO->IsKind(STANDARD_TYPE(AIS_TexturedShape)) && !TheAisIO.IsNull())
2163     {
2164       myShape = Handle(AIS_TexturedShape)::DownCast(TheAisIO);
2165       myPreviousMode = myShape->DisplayMode() ;
2166     }
2167   else
2168     {
2169       myAISContext->Clear(TheAisIO,Standard_False);
2170       myShape = new AIS_TexturedShape (DBRep::Get(argv[1]));
2171       GetMapOfAIS().UnBind1(TheAisIO);
2172       GetMapOfAIS().UnBind2(name);
2173       GetMapOfAIS().Bind(myShape, name);
2174     }
2175   switch (command)
2176     {
2177     case 1: // vtexture : we only map a texture on the shape
2178       if(argc<=1)
2179         {
2180           di << argv[0] <<" syntax error - Type 'help vtex'" << "\n";
2181           return 1;
2182         }
2183       if (argc>2 && argv[2])
2184         {
2185           if(strcasecmp(argv[2],"?")==0)
2186             {
2187               TCollection_AsciiString monPath = Graphic3d_TextureRoot::TexturesFolder();
2188               di<<"\n Files in current directory : \n"<<"\n";
2189               TCollection_AsciiString Cmnd ("glob -nocomplain *");
2190               di.Eval(Cmnd.ToCString());
2191
2192               Cmnd = TCollection_AsciiString("glob -nocomplain ") ;
2193               Cmnd += monPath ;
2194               Cmnd += "/* " ;
2195               di<<"Files in "<<monPath.ToCString()<<" : \n"<<"\n";
2196               di.Eval(Cmnd.ToCString());
2197
2198               return 0;
2199             }
2200           else
2201             myShape->SetTextureFileName(argv[2]);
2202         }
2203       else
2204         {
2205           di <<"Texture mapping disabled \n \
2206                   To enable it, use 'vtexture NameOfShape NameOfTexture' \n"<<"\n";
2207
2208           myAISContext->SetDisplayMode(myShape,1,Standard_False);
2209           if (myPreviousMode == 3 )
2210             myAISContext->RecomputePrsOnly(myShape);
2211           myAISContext->Display(myShape, Standard_True);
2212           return 0;
2213         }
2214       break;
2215
2216     case 2: // vtexscale : we change the scaling factor of the texture
2217
2218       if(argc<2)
2219         {
2220           di << argv[0] <<" syntax error - Type 'help vtex'" << "\n";
2221           return 1;
2222         }
2223
2224       myShape->SetTextureScale (( argv[2] ? Standard_True    : Standard_False ),
2225                                 ( argv[2] ? Draw::Atof(argv[2])    : 1.0 ),
2226                                 ( argv[2] ? Draw::Atof(argv[argc-1]) : 1.0 ) );
2227       break;
2228
2229     case 3: // vtexorigin : we change the origin of the texture on the shape
2230       if(argc<2)
2231         {
2232           di << argv[0] <<" syntax error - Type 'help vtex'" << "\n";
2233           return 1;
2234         }
2235       myShape->SetTextureOrigin (( argv[2] ? Standard_True    : Standard_False ),
2236                                  ( argv[2] ? Draw::Atof(argv[2])    : 0.0 ),
2237                                  ( argv[2] ? Draw::Atof(argv[argc-1]) : 0.0 ));
2238       break;
2239
2240     case 4: // vtexrepeat : we change the number of occurences of the texture on the shape
2241       if(argc<2)
2242         {
2243           di << argv[0] <<" syntax error - Type 'help vtex'" << "\n";
2244           return 1;
2245         }
2246       if (argc>2 && argv[2])
2247         {
2248           di <<"Texture repeat enabled"<<"\n";
2249           myShape->SetTextureRepeat(Standard_True, Draw::Atof(argv[2]), Draw::Atof(argv[argc-1]) );
2250         }
2251       else
2252         {
2253           di <<"Texture repeat disabled"<<"\n";
2254           myShape->SetTextureRepeat(Standard_False);
2255         }
2256       break;
2257
2258     case 5: // vtexdefault : default texture mapping
2259       // ScaleU = ScaleV = 100.0
2260       // URepeat = VRepeat = 1.0
2261       // Uorigin = VOrigin = 0.0
2262
2263       if(argc<2)
2264         {
2265           di << argv[0] <<" syntax error - Type 'help vtex'" << "\n";
2266           return 1;
2267         }
2268       myShape->SetTextureRepeat(Standard_False);
2269       myShape->SetTextureOrigin(Standard_False);
2270       myShape->SetTextureScale (Standard_False);
2271       break;
2272     }
2273
2274   if ((myShape->DisplayMode() == 3) || (myPreviousMode == 3 ))
2275     myAISContext->RecomputePrsOnly(myShape);
2276   else
2277     {
2278       myAISContext->SetDisplayMode(myShape,3,Standard_False);
2279       myAISContext->Display(myShape, Standard_True);
2280       myAISContext->Update(myShape,Standard_True);
2281     }
2282   return 0;
2283 }
2284
2285 //==============================================================================
2286 //function : VDisplay2
2287 //author   : ege
2288 //purpose  : Display an object from its name
2289 //==============================================================================
2290 static int VDisplay2 (Draw_Interpretor& theDI,
2291                       Standard_Integer  theArgNb,
2292                       const char**      theArgVec)
2293 {
2294   if (theArgNb < 2)
2295   {
2296     std::cout << theArgVec[0] << "Error: wrong syntax!\n";
2297     return 1;
2298   }
2299   else if (a3DView().IsNull())
2300   {
2301     ViewerTest::ViewerInit();
2302     std::cout << "Command vinit should be called before!\n";
2303     // return 1;
2304   }
2305
2306   const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
2307   if (aCtx->HasOpenedContext())
2308   {
2309     aCtx->CloseLocalContext();
2310   }
2311
2312   ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2313   for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
2314   {
2315     const TCollection_AsciiString aName = theArgVec[anArgIter];
2316     if (parseRedrawMode (aName, aToUpdate))
2317     {
2318       continue;
2319     }
2320     else if (!GetMapOfAIS().IsBound2 (aName))
2321     {
2322       // create the AIS_Shape from a name
2323       const Handle(AIS_InteractiveObject) aShape = GetAISShapeFromName (aName.ToCString());
2324       if (!aShape.IsNull())
2325       {
2326         GetMapOfAIS().Bind (aShape, aName);
2327         aCtx->Display (aShape, Standard_False);
2328       }
2329       continue;
2330     }
2331
2332     Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
2333     if (anObj->IsKind (STANDARD_TYPE (AIS_InteractiveObject)))
2334     {
2335       Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anObj);
2336       if (aShape->Type() == AIS_KOI_Datum)
2337       {
2338         aCtx->Display (aShape, Standard_False);
2339       }
2340       else
2341       {
2342         theDI << "Display " << aName.ToCString() << "\n";
2343         // get the Shape from a name
2344         TopoDS_Shape aNewShape = GetShapeFromName (aName.ToCString());
2345
2346         // update the Shape in the AIS_Shape
2347         Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aShape);
2348         if (!aShapePrs.IsNull())
2349         {
2350           aShapePrs->Set (aNewShape);
2351         }
2352         aCtx->Redisplay (aShape, Standard_False);
2353         aCtx->Display   (aShape, Standard_False);
2354       }
2355       aShape.Nullify();
2356     }
2357     else if (anObj->IsKind (STANDARD_TYPE (NIS_InteractiveObject)))
2358     {
2359       Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anObj);
2360       TheNISContext()->Display (aShape);
2361     }
2362   }
2363
2364   const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2365   a3DView()->SetImmediateUpdate (isAutoUpdate);
2366   if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2367    || aToUpdate == ViewerTest_RM_RedrawForce)
2368   {
2369     // update the screen and redraw the view
2370     aCtx->UpdateCurrentViewer();
2371   }
2372   return 0;
2373 }
2374
2375 //===============================================================================================
2376 //function : VUpdate
2377 //purpose  :
2378 //===============================================================================================
2379 static int VUpdate (Draw_Interpretor& /*theDi*/, Standard_Integer theArgsNb, const char** theArgVec)
2380 {
2381   Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
2382   if (aContextAIS.IsNull())
2383   {
2384     std::cout << theArgVec[0] << "AIS context is not available.\n";
2385     return 1;
2386   }
2387
2388   if (theArgsNb < 2)
2389   {
2390     std::cout << theArgVec[0] << ": insufficient arguments. Type help for more information.\n";
2391     return 1;
2392   }
2393
2394   const ViewerTest_DoubleMapOfInteractiveAndName& anAISMap = GetMapOfAIS();
2395
2396   AIS_ListOfInteractive aListOfIO;
2397
2398   for (int anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
2399   {
2400     TCollection_AsciiString aName = TCollection_AsciiString (theArgVec[anArgIt]);
2401
2402     Handle(AIS_InteractiveObject) anAISObj;
2403     if (anAISMap.IsBound2 (aName))
2404     {
2405       anAISObj = Handle(AIS_InteractiveObject)::DownCast (anAISMap.Find2 (aName));
2406     }
2407
2408     if (anAISObj.IsNull())
2409     {
2410       std::cout << theArgVec[0] << ": no AIS interactive object named \"" << aName << "\".\n";
2411       return 1;
2412     }
2413
2414     aListOfIO.Append (anAISObj);
2415   }
2416
2417   AIS_ListIteratorOfListOfInteractive anIOIt (aListOfIO);
2418   for (; anIOIt.More(); anIOIt.Next())
2419   {
2420     aContextAIS->Update (anIOIt.Value(), Standard_False);
2421   }
2422
2423   aContextAIS->UpdateCurrentViewer();
2424
2425   return 0;
2426 }
2427
2428 //==============================================================================
2429 //function : VPerf
2430 //purpose  : Test the annimation of an object along a
2431 //           predifined trajectory
2432 //Draw arg : vperf ShapeName 1/0(Transfo/Location) 1/0(Primitives sensibles ON/OFF)
2433 //==============================================================================
2434
2435 static int VPerf(Draw_Interpretor& di, Standard_Integer , const char** argv) {
2436
2437   OSD_Timer myTimer;
2438   if (TheAISContext()->HasOpenedContext())
2439     TheAISContext()->CloseLocalContext();
2440
2441   Standard_Real Step=4*M_PI/180;
2442   Standard_Real Angle=0;
2443
2444   Handle(AIS_InteractiveObject) aIO;
2445   if (GetMapOfAIS().IsBound2(argv[1]))
2446     aIO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(argv[1]));
2447   if (aIO.IsNull())
2448     return 1;
2449
2450   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aIO);
2451
2452   myTimer.Start();
2453
2454   if (Draw::Atoi(argv[3])==1 ) {
2455     di<<" Primitives sensibles OFF"<<"\n";
2456     TheAISContext()->Deactivate(aIO);
2457   }
2458   else {
2459     di<<" Primitives sensibles ON"<<"\n";
2460   }
2461   // Movement par transformation
2462   if(Draw::Atoi(argv[2]) ==1) {
2463     di<<" Calcul par Transformation"<<"\n";
2464     for (Standard_Real myAngle=0;Angle<10*2*M_PI; myAngle++) {
2465
2466       Angle=Step*myAngle;
2467       gp_Trsf myTransfo;
2468       myTransfo.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1) ) ,Angle );
2469       TheAISContext()->SetLocation(aShape,myTransfo);
2470       TheAISContext() ->UpdateCurrentViewer();
2471
2472     }
2473   }
2474   else {
2475     di<<" Calcul par Locations"<<"\n";
2476     gp_Trsf myAngleTrsf;
2477     myAngleTrsf.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1) ), Step  );
2478     TopLoc_Location myDeltaAngle (myAngleTrsf);
2479     TopLoc_Location myTrueLoc;
2480
2481     for (Standard_Real myAngle=0;Angle<10*2*M_PI; myAngle++) {
2482
2483       Angle=Step*myAngle;
2484       myTrueLoc=myTrueLoc*myDeltaAngle;
2485       TheAISContext()->SetLocation(aShape,myTrueLoc );
2486       TheAISContext() ->UpdateCurrentViewer();
2487     }
2488   }
2489   if (Draw::Atoi(argv[3])==1 ){
2490     // On reactive la selection des primitives sensibles
2491     TheAISContext()->Activate(aIO,0);
2492   }
2493   a3DView() -> Redraw();
2494   myTimer.Stop();
2495   di<<" Temps ecoule "<<"\n";
2496   myTimer.Show();
2497   return 0;
2498 }
2499
2500
2501 //==================================================================================
2502 // Function : VAnimation
2503 //==================================================================================
2504 static int VAnimation (Draw_Interpretor& di, Standard_Integer argc, const char** argv) {
2505   if (argc != 5) {
2506     di<<"Use: "<<argv[0]<<" CrankArmFile CylinderHeadFile PropellerFile EngineBlockFile"<<"\n";
2507     return 1;
2508   }
2509
2510   Standard_Real thread = 4;
2511   Standard_Real angleA=0;
2512   Standard_Real angleB;
2513   Standard_Real X;
2514   gp_Ax1 Ax1(gp_Pnt(0,0,0),gp_Vec(0,0,1));
2515
2516   BRep_Builder B;
2517   TopoDS_Shape CrankArm;
2518   TopoDS_Shape CylinderHead;
2519   TopoDS_Shape Propeller;
2520   TopoDS_Shape EngineBlock;
2521
2522   //BRepTools::Read(CrankArm,"/dp_26/Indus/ege/assemblage/CrankArm.rle",B);
2523   //BRepTools::Read(CylinderHead,"/dp_26/Indus/ege/assemblage/CylinderHead.rle",B);
2524   //BRepTools::Read(Propeller,"/dp_26/Indus/ege/assemblage/Propeller.rle",B);
2525   //BRepTools::Read(EngineBlock,"/dp_26/Indus/ege/assemblage/EngineBlock.rle",B);
2526   BRepTools::Read(CrankArm,argv[1],B);
2527   BRepTools::Read(CylinderHead,argv[2],B);
2528   BRepTools::Read(Propeller,argv[3],B);
2529   BRepTools::Read(EngineBlock,argv[4],B);
2530
2531   if (CrankArm.IsNull() || CylinderHead.IsNull() || Propeller.IsNull() || EngineBlock.IsNull()) {di<<" Syntaxe error:loading failure."<<"\n";}
2532
2533
2534   OSD_Timer myTimer;
2535   myTimer.Start();
2536
2537   Handle(AIS_Shape) myAisCylinderHead = new AIS_Shape (CylinderHead);
2538   Handle(AIS_Shape) myAisEngineBlock  = new AIS_Shape (EngineBlock);
2539   Handle(AIS_Shape) myAisCrankArm     = new AIS_Shape (CrankArm);
2540   Handle(AIS_Shape) myAisPropeller    = new AIS_Shape (Propeller);
2541
2542   GetMapOfAIS().Bind(myAisCylinderHead,"a");
2543   GetMapOfAIS().Bind(myAisEngineBlock,"b");
2544   GetMapOfAIS().Bind(myAisCrankArm,"c");
2545   GetMapOfAIS().Bind(myAisPropeller,"d");
2546
2547   TheAISContext()->SetColor(myAisCylinderHead, Quantity_NOC_INDIANRED);
2548   TheAISContext()->SetColor(myAisEngineBlock , Quantity_NOC_RED);
2549   TheAISContext()->SetColor(myAisPropeller   , Quantity_NOC_GREEN);
2550
2551   TheAISContext()->Display(myAisCylinderHead,Standard_False);
2552   TheAISContext()->Display(myAisEngineBlock,Standard_False );
2553   TheAISContext()->Display(myAisCrankArm,Standard_False    );
2554   TheAISContext()->Display(myAisPropeller,Standard_False);
2555
2556   TheAISContext()->Deactivate(myAisCylinderHead);
2557   TheAISContext()->Deactivate(myAisEngineBlock );
2558   TheAISContext()->Deactivate(myAisCrankArm    );
2559   TheAISContext()->Deactivate(myAisPropeller   );
2560
2561   // Boucle de mouvement
2562   for (Standard_Real myAngle = 0;angleA<2*M_PI*10.175 ;myAngle++) {
2563
2564     angleA = thread*myAngle*M_PI/180;
2565     X = Sin(angleA)*3/8;
2566     angleB = atan(X / Sqrt(-X * X + 1));
2567     Standard_Real decal(25*0.6);
2568
2569
2570     //Build a transformation on the display
2571     gp_Trsf aPropellerTrsf;
2572     aPropellerTrsf.SetRotation(Ax1,angleA);
2573     TheAISContext()->SetLocation(myAisPropeller,aPropellerTrsf);
2574
2575     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));
2576     gp_Trsf aCrankArmTrsf;
2577     aCrankArmTrsf.SetTransformation(   base.Rotated(gp_Ax1(gp_Pnt(3*decal,0,0),gp_Dir(0,0,1)),angleB));
2578     TheAISContext()->SetLocation(myAisCrankArm,aCrankArmTrsf);
2579
2580     TheAISContext()->UpdateCurrentViewer();
2581   }
2582
2583   TopoDS_Shape myNewCrankArm  =myAisCrankArm ->Shape().Located( myAisCrankArm ->Location() );
2584   TopoDS_Shape myNewPropeller =myAisPropeller->Shape().Located( myAisPropeller->Location() );
2585
2586   myAisCrankArm ->ResetLocation();
2587   myAisPropeller->ResetLocation();
2588
2589   myAisCrankArm  -> Set(myNewCrankArm );
2590   myAisPropeller -> Set(myNewPropeller);
2591
2592   TheAISContext()->Activate(myAisCylinderHead,0);
2593   TheAISContext()->Activate(myAisEngineBlock,0 );
2594   TheAISContext()->Activate(myAisCrankArm ,0   );
2595   TheAISContext()->Activate(myAisPropeller ,0  );
2596
2597   myTimer.Stop();
2598   myTimer.Show();
2599   myTimer.Start();
2600
2601   TheAISContext()->Redisplay(myAisCrankArm ,Standard_False);
2602   TheAISContext()->Redisplay(myAisPropeller,Standard_False);
2603
2604   TheAISContext()->UpdateCurrentViewer();
2605   a3DView()->Redraw();
2606
2607   myTimer.Stop();
2608   myTimer.Show();
2609
2610   return 0;
2611
2612 }
2613
2614 //==============================================================================
2615 //function : VShading
2616 //purpose  : Sharpen or roughten the quality of the shading
2617 //Draw arg : vshading ShapeName 0.1->0.00001  1 deg-> 30 deg
2618 //==============================================================================
2619 static int VShading(Draw_Interpretor& ,Standard_Integer argc, const char** argv)
2620 {
2621   Standard_Real    myDevCoef;
2622   Handle(AIS_InteractiveObject) TheAisIO;
2623
2624   // Verifications
2625   const Standard_Boolean HaveToSet = (strcasecmp(argv[0],"vsetshading") == 0);
2626
2627   if (TheAISContext()->HasOpenedContext())
2628     TheAISContext()->CloseLocalContext();
2629
2630   if (argc < 3) {
2631     myDevCoef  = 0.0008;
2632   } else {
2633     myDevCoef  =Draw::Atof(argv[2]);
2634   }
2635
2636   TCollection_AsciiString name=argv[1];
2637   if (GetMapOfAIS().IsBound2(name ))
2638     TheAisIO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
2639   if (TheAisIO.IsNull())
2640     TheAisIO=GetAISShapeFromName((const char *)name.ToCString());
2641
2642   if (HaveToSet)
2643     TheAISContext()->SetDeviationCoefficient(TheAisIO,myDevCoef,Standard_True);
2644   else
2645     TheAISContext()->SetDeviationCoefficient(TheAisIO,0.0008,Standard_True);
2646
2647   TheAISContext()->Redisplay(TheAisIO);
2648   return 0;
2649 }
2650 //==============================================================================
2651 //function : HaveMode
2652 //use      : VActivatedModes
2653 //==============================================================================
2654 #include <TColStd_ListIteratorOfListOfInteger.hxx>
2655
2656 Standard_Boolean  HaveMode(const Handle(AIS_InteractiveObject)& TheAisIO,const Standard_Integer mode  )
2657 {
2658   TColStd_ListOfInteger List;
2659   TheAISContext()->ActivatedModes (TheAisIO,List);
2660   TColStd_ListIteratorOfListOfInteger it;
2661   Standard_Boolean Found=Standard_False;
2662   for (it.Initialize(List); it.More()&&!Found; it.Next() ){
2663     if (it.Value()==mode ) Found=Standard_True;
2664   }
2665   return Found;
2666 }
2667
2668
2669
2670 //==============================================================================
2671 //function : VActivatedMode
2672 //author   : ege
2673 //purpose  : permet d'attribuer a chacune des shapes un mode d'activation
2674 //           (edges,vertex...)qui lui est propre et le mode de selection standard.
2675 //           La fonction s'applique aux shapes selectionnees(current ou selected dans le viewer)
2676 //             Dans le cas ou on veut psser la shape en argument, la fonction n'autorise
2677 //           qu'un nom et qu'un mode.
2678 //Draw arg : vsetam  [ShapeName] mode(0,1,2,3,4,5,6,7)
2679 //==============================================================================
2680 #include <AIS_ListIteratorOfListOfInteractive.hxx>
2681
2682 static int VActivatedMode (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
2683
2684 {
2685   Standard_Boolean ThereIsName = Standard_False ;
2686
2687   if(!a3DView().IsNull()){
2688
2689     const Standard_Boolean HaveToSet = (strcasecmp(argv[0],"vsetam") == 0);
2690     // verification des arguments
2691     if (HaveToSet) {
2692       if (argc<2||argc>3) { di<<" Syntaxe error"<<"\n";return 1;}
2693       ThereIsName = (argc == 3);
2694     }
2695     else {
2696       // vunsetam
2697       if (argc>1) {di<<" Syntaxe error"<<"\n";return 1;}
2698       else {
2699         di<<" R.A.Z de tous les modes de selecion"<<"\n";
2700         di<<" Fermeture du Context local"<<"\n";
2701         if (TheAISContext()->HasOpenedContext())
2702           TheAISContext()->CloseLocalContext();
2703       }
2704     }
2705
2706     // IL n'y a aps de nom de shape passe en argument
2707     if (HaveToSet && !ThereIsName){
2708       Standard_Integer aMode=Draw::Atoi(argv [1]);
2709
2710       const char *cmode="???";
2711       switch (aMode) {
2712       case 0: cmode = "Shape"; break;
2713       case 1: cmode = "Vertex"; break;
2714       case 2: cmode = "Edge"; break;
2715       case 3: cmode = "Wire"; break;
2716       case 4: cmode = "Face"; break;
2717       case 5: cmode = "Shell"; break;
2718       case 6: cmode = "Solid"; break;
2719       case 7: cmode = "Compound"; break;
2720       }
2721
2722       if( !TheAISContext()->HasOpenedContext() ) {
2723         // il n'y a pas de Context local d'ouvert
2724         // on en ouvre un et on charge toutes les shapes displayees
2725         // on load tous les objets displayees et on Activate les objets de la liste
2726         AIS_ListOfInteractive ListOfIO;
2727         // on sauve dans une AISListOfInteractive tous les objets currents
2728         if (TheAISContext()->NbCurrents()>0 ){
2729           TheAISContext()->UnhilightCurrents(Standard_False);
2730
2731           for (TheAISContext()->InitCurrent(); TheAISContext()->MoreCurrent(); TheAISContext()->NextCurrent() ){
2732             ListOfIO.Append(TheAISContext()->Current() );
2733           }
2734         }
2735
2736         TheAISContext()->OpenLocalContext(Standard_False);
2737         ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
2738           it (GetMapOfAIS());
2739         while(it.More()){
2740           Handle(AIS_InteractiveObject) aIO =
2741             Handle(AIS_InteractiveObject)::DownCast(it.Key1());
2742           if (!aIO.IsNull())
2743             TheAISContext()->Load(aIO,0,Standard_False);
2744           it.Next();
2745         }
2746         // traitement des objets qui etaient currents dans le Contexte global
2747         if (!ListOfIO.IsEmpty() ) {
2748           // il y avait des objets currents
2749           AIS_ListIteratorOfListOfInteractive iter;
2750           for (iter.Initialize(ListOfIO); iter.More() ; iter.Next() ) {
2751             Handle(AIS_InteractiveObject) aIO=iter.Value();
2752             TheAISContext()->Activate(aIO,aMode);
2753             di<<" Mode: "<<cmode<<" ON pour "<<GetMapOfAIS().Find1(aIO).ToCString()  <<"\n";
2754           }
2755         }
2756         else {
2757           // On applique le mode a tous les objets displayes
2758           ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
2759             it2 (GetMapOfAIS());
2760           while(it2.More()){
2761             Handle(AIS_InteractiveObject) aIO =
2762               Handle(AIS_InteractiveObject)::DownCast(it2.Key1());
2763             if (!aIO.IsNull()) {
2764               di<<" Mode: "<<cmode<<" ON pour "<<it2.Key2().ToCString() <<"\n";
2765               TheAISContext()->Activate(aIO,aMode);
2766             }
2767             it2.Next();
2768           }
2769         }
2770
2771       }
2772
2773       else {
2774         // un Context local est deja ouvert
2775         // Traitement des objets du Context local
2776         if (TheAISContext()->NbSelected()>0 ){
2777           TheAISContext()->UnhilightSelected(Standard_False);
2778           // il y a des objets selected,on les parcourt
2779           for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
2780             Handle(AIS_InteractiveObject) aIO=TheAISContext()->Interactive();
2781
2782
2783             if (HaveMode(aIO,aMode) ) {
2784               di<<" Mode: "<<cmode<<" OFF pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
2785               TheAISContext()->Deactivate(aIO,aMode);
2786             }
2787             else{
2788               di<<" Mode: "<<cmode<<" ON pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
2789               TheAISContext()->Activate(aIO,aMode);
2790             }
2791
2792           }
2793         }
2794         else{
2795           // il n'y a pas d'objets selected
2796           // tous les objets diplayes sont traites
2797           ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
2798             it (GetMapOfAIS());
2799           while(it.More()){
2800             Handle(AIS_InteractiveObject) aIO =
2801               Handle(AIS_InteractiveObject)::DownCast(it.Key1());
2802             if (!aIO.IsNull()) {
2803               if (HaveMode(aIO,aMode) ) {
2804                 di<<" Mode: "<<cmode<<" OFF pour "
2805                   <<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
2806                 TheAISContext()->Deactivate(aIO,aMode);
2807               }
2808               else{
2809                 di<<" Mode: "<<cmode<<" ON pour"
2810                   <<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
2811                 TheAISContext()->Activate(aIO,aMode);
2812               }
2813             }
2814             it.Next();
2815           }
2816         }
2817       }
2818     }
2819     else if (HaveToSet && ThereIsName){
2820       Standard_Integer aMode=Draw::Atoi(argv [2]);
2821       Handle(AIS_InteractiveObject) aIO =
2822         Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(argv[1]));
2823
2824       if (!aIO.IsNull()) {
2825         const char *cmode="???";
2826
2827         switch (aMode) {
2828         case 0: cmode = "Shape"; break;
2829         case 1: cmode = "Vertex"; break;
2830         case 2: cmode = "Edge"; break;
2831         case 3: cmode = "Wire"; break;
2832         case 4: cmode = "Face"; break;
2833         case 5: cmode = "Shell"; break;
2834         case 6: cmode = "Solid"; break;
2835         case 7: cmode = "Compound"; break;
2836         }
2837
2838         if( !TheAISContext()->HasOpenedContext() ) {
2839           TheAISContext()->OpenLocalContext(Standard_False);
2840           // On charge tous les objets de la map
2841           ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it (GetMapOfAIS());
2842           while(it.More()){
2843             Handle(AIS_InteractiveObject) aShape=
2844               Handle(AIS_InteractiveObject)::DownCast(it.Key1());
2845             if (!aShape.IsNull())
2846               TheAISContext()->Load(aShape,0,Standard_False);
2847             it.Next();
2848           }
2849           TheAISContext()->Activate(aIO,aMode);
2850           di<<" Mode: "<<cmode<<" ON pour "<<argv[1]<<"\n";
2851         }
2852
2853         else {
2854           // un Context local est deja ouvert
2855           if (HaveMode(aIO,aMode) ) {
2856             di<<" Mode: "<<cmode<<" OFF pour "<<argv[1]<<"\n";
2857             TheAISContext()->Deactivate(aIO,aMode);
2858           }
2859           else{
2860             di<<" Mode: "<<cmode<<" ON pour "<<argv[1]<<"\n";
2861             TheAISContext()->Activate(aIO,aMode);
2862           }
2863         }
2864       }
2865     }
2866   }
2867   return 0;
2868 }
2869
2870 //! Auxiliary method to print Interactive Object information
2871 static void objInfo (const NCollection_Map<Handle(AIS_InteractiveObject)>& theDetected,
2872                      const Handle(Standard_Transient)&                     theObject,
2873                      Draw_Interpretor&                                     theDI)
2874 {
2875   const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theObject);
2876   if (anObj.IsNull())
2877   {
2878     theDI << theObject->DynamicType()->Name() << " is not AIS presentation\n";
2879     return;
2880   }
2881
2882   theDI << (TheAISContext()->IsDisplayed  (anObj) ? "Displayed"  : "Hidden   ")
2883         << (TheAISContext()->IsSelected   (anObj) ? " Selected" : "         ")
2884         << (theDetected.Contains (anObj)          ? " Detected" : "         ")
2885         << " Type: ";
2886   if (anObj->Type() == AIS_KOI_Datum)
2887   {
2888     // AIS_Datum
2889     if      (anObj->Signature() == 3) { theDI << " AIS_Trihedron"; }
2890     else if (anObj->Signature() == 2) { theDI << " AIS_Axis"; }
2891     else if (anObj->Signature() == 6) { theDI << " AIS_Circle"; }
2892     else if (anObj->Signature() == 5) { theDI << " AIS_Line"; }
2893     else if (anObj->Signature() == 7) { theDI << " AIS_Plane"; }
2894     else if (anObj->Signature() == 1) { theDI << " AIS_Point"; }
2895     else if (anObj->Signature() == 4) { theDI << " AIS_PlaneTrihedron"; }
2896   }
2897   // AIS_Shape
2898   else if (anObj->Type()      == AIS_KOI_Shape
2899         && anObj->Signature() == 0)
2900   {
2901     theDI << " AIS_Shape";
2902   }
2903   else if (anObj->Type() == AIS_KOI_Relation)
2904   {
2905     // AIS_Dimention and AIS_Relation
2906     Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (anObj);
2907     switch (aRelation->KindOfDimension())
2908     {
2909       case AIS_KOD_PLANEANGLE:     theDI << " AIS_AngleDimension"; break;
2910       case AIS_KOD_LENGTH:         theDI << " AIS_Chamf2/3dDimension/AIS_LengthDimension"; break;
2911       case AIS_KOD_DIAMETER:       theDI << " AIS_DiameterDimension"; break;
2912       case AIS_KOD_ELLIPSERADIUS:  theDI << " AIS_EllipseRadiusDimension"; break;
2913       //case AIS_KOD_FILLETRADIUS:   theDI << " AIS_FilletRadiusDimension "; break;
2914       case AIS_KOD_OFFSET:         theDI << " AIS_OffsetDimension"; break;
2915       case AIS_KOD_RADIUS:         theDI << " AIS_RadiusDimension"; break;
2916       default:                     theDI << " UNKNOWN dimension"; break;
2917     }
2918   }
2919   else
2920   {
2921     theDI << " UserPrs";
2922   }
2923   theDI << " (" << theObject->DynamicType()->Name() << ")";
2924 }
2925
2926 //! Print information about locally selected sub-shapes
2927 static void localCtxInfo (Draw_Interpretor& theDI)
2928 {
2929   Handle(AIS_InteractiveContext) aCtx = TheAISContext();
2930   if (!aCtx->HasOpenedContext())
2931   {
2932     return;
2933   }
2934
2935   TCollection_AsciiString aPrevName;
2936   Handle(AIS_LocalContext) aCtxLoc = aCtx->LocalContext();
2937   for (aCtxLoc->InitSelected(); aCtxLoc->MoreSelected(); aCtxLoc->NextSelected())
2938   {
2939     const TopoDS_Shape      aSubShape = aCtxLoc->SelectedShape();
2940     const Handle(AIS_Shape) aShapeIO  = Handle(AIS_Shape)::DownCast (aCtxLoc->SelectedInteractive());
2941     if (aSubShape.IsNull()
2942       || aShapeIO.IsNull()
2943       || !GetMapOfAIS().IsBound1 (aShapeIO))
2944     {
2945       continue;
2946     }
2947
2948     const TCollection_AsciiString aParentName = GetMapOfAIS().Find1 (aShapeIO);
2949     TopTools_MapOfShape aFilter;
2950     Standard_Integer    aNumber = 0;
2951     const TopoDS_Shape  aShape  = aShapeIO->Shape();
2952     for (TopExp_Explorer anIter (aShape, aSubShape.ShapeType());
2953          anIter.More(); anIter.Next())
2954     {
2955       if (!aFilter.Add (anIter.Current()))
2956       {
2957         continue; // filter duplicates
2958       }
2959
2960       ++aNumber;
2961       if (!anIter.Current().IsSame (aSubShape))
2962       {
2963         continue;
2964       }
2965
2966       Standard_CString aShapeName = NULL;
2967       switch (aSubShape.ShapeType())
2968       {
2969         case TopAbs_COMPOUND:  aShapeName = " Compound"; break;
2970         case TopAbs_COMPSOLID: aShapeName = "CompSolid"; break;
2971         case TopAbs_SOLID:     aShapeName = "    Solid"; break;
2972         case TopAbs_SHELL:     aShapeName = "    Shell"; break;
2973         case TopAbs_FACE:      aShapeName = "     Face"; break;
2974         case TopAbs_WIRE:      aShapeName = "     Wire"; break;
2975         case TopAbs_EDGE:      aShapeName = "     Edge"; break;
2976         case TopAbs_VERTEX:    aShapeName = "   Vertex"; break;
2977         default:
2978         case TopAbs_SHAPE:     aShapeName = "    Shape"; break;
2979       }
2980
2981       if (aParentName != aPrevName)
2982       {
2983         theDI << "Locally selected sub-shapes within " << aParentName << ":\n";
2984         aPrevName = aParentName;
2985       }
2986       theDI << "  " << aShapeName << " #" << aNumber << "\n";
2987       break;
2988     }
2989   }
2990 }
2991
2992 //==============================================================================
2993 //function : VState
2994 //purpose  :
2995 //Draw arg : vstate [nameA] ... [nameN]
2996 //==============================================================================
2997 static Standard_Integer VState (Draw_Interpretor& theDI,
2998                                 Standard_Integer  theArgNb,
2999                                 Standard_CString* theArgVec)
3000 {
3001   Handle(AIS_InteractiveContext) aCtx = TheAISContext();
3002   if (aCtx.IsNull())
3003   {
3004     std::cerr << "Error: No opened viewer!\n";
3005     return 1;
3006   }
3007
3008   NCollection_Map<Handle(AIS_InteractiveObject)> aDetected;
3009   for (aCtx->InitDetected(); aCtx->MoreDetected(); aCtx->NextDetected())
3010   {
3011     aDetected.Add (aCtx->DetectedCurrentObject());
3012   }
3013
3014   const Standard_Boolean toShowAll = (theArgNb >= 2 && *theArgVec[1] == '*');
3015   if (theArgNb >= 2
3016    && !toShowAll)
3017   {
3018     for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
3019     {
3020       const TCollection_AsciiString anObjName = theArgVec[anArgIter];
3021       if (!GetMapOfAIS().IsBound2 (anObjName))
3022       {
3023         theDI << anObjName << " doesn't exist!\n";
3024         continue;
3025       }
3026
3027       const Handle(Standard_Transient) anObjTrans = GetMapOfAIS().Find2 (anObjName);
3028       TCollection_AsciiString aName = anObjName;
3029       aName.LeftJustify (20, ' ');
3030       theDI << "  " << aName << " ";
3031       objInfo (aDetected, anObjTrans, theDI);
3032       theDI << "\n";
3033     }
3034     return 0;
3035   }
3036
3037   if (aCtx->NbCurrents() > 0
3038    && !toShowAll)
3039   {
3040     for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
3041     {
3042       Handle(AIS_InteractiveObject) anObj = aCtx->Current();
3043       TCollection_AsciiString aName = GetMapOfAIS().Find1 (anObj);
3044       aName.LeftJustify (20, ' ');
3045       theDI << aName << " ";
3046       objInfo (aDetected, anObj, theDI);
3047       theDI << "\n";
3048     }
3049     return 0;
3050   }
3051
3052   theDI << "Neutral-point state:\n";
3053   for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anObjIter (GetMapOfAIS());
3054        anObjIter.More(); anObjIter.Next())
3055   {
3056     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anObjIter.Key1());
3057     if (anObj.IsNull())
3058     {
3059       continue;
3060     }
3061
3062     TCollection_AsciiString aName = anObjIter.Key2();
3063     aName.LeftJustify (20, ' ');
3064     theDI << "  " << aName << " ";
3065     objInfo (aDetected, anObj, theDI);
3066     theDI << "\n";
3067   }
3068   localCtxInfo (theDI);
3069   return 0;
3070 }
3071
3072 //=======================================================================
3073 //function : PickObjects
3074 //purpose  :
3075 //=======================================================================
3076 Standard_Boolean  ViewerTest::PickObjects(Handle(TColStd_HArray1OfTransient)& arr,
3077                                           const AIS_KindOfInteractive TheType,
3078                                           const Standard_Integer TheSignature,
3079                                           const Standard_Integer MaxPick)
3080 {
3081   Handle(AIS_InteractiveObject) IO;
3082   Standard_Integer curindex = (TheType == AIS_KOI_None) ? 0 : TheAISContext()->OpenLocalContext();
3083
3084   // step 1: prepare the data
3085   if(curindex !=0){
3086     Handle(AIS_SignatureFilter) F1 = new AIS_SignatureFilter(TheType,TheSignature);
3087     TheAISContext()->AddFilter(F1);
3088   }
3089
3090   // step 2 : wait for the selection...
3091 //  Standard_Boolean IsGood (Standard_False);
3092 //  Standard_Integer NbPick(0);
3093   Standard_Boolean NbPickGood (0),NbToReach(arr->Length());
3094   Standard_Integer NbPickFail(0);
3095   Standard_Integer argccc = 5;
3096   const char *bufff[] = { "A", "B", "C","D", "E" };
3097   const char **argvvv = (const char **) bufff;
3098
3099
3100   while(NbPickGood<NbToReach && NbPickFail <= MaxPick){
3101     while(ViewerMainLoop(argccc,argvvv)){}
3102     Standard_Integer NbStored = TheAISContext()->NbSelected();
3103     if((unsigned int ) NbStored != NbPickGood)
3104       NbPickGood= NbStored;
3105     else
3106       NbPickFail++;
3107     cout<<"NbPicked =  "<<NbPickGood<<" |  Nb Pick Fail :"<<NbPickFail<<endl;
3108   }
3109
3110   // step3 get result.
3111
3112   if((unsigned int ) NbPickFail >= NbToReach) return Standard_False;
3113
3114   Standard_Integer i(0);
3115   for(TheAISContext()->InitSelected();
3116       TheAISContext()->MoreSelected();
3117       TheAISContext()->NextSelected()){
3118     i++;
3119     Handle(AIS_InteractiveObject) IO2 = TheAISContext()->SelectedInteractive();
3120     arr->SetValue(i,IO2);
3121   }
3122
3123
3124   if(curindex>0)
3125     TheAISContext()->CloseLocalContext(curindex);
3126
3127   return Standard_True;
3128 }
3129
3130
3131 //=======================================================================
3132 //function : PickObject
3133 //purpose  :
3134 //=======================================================================
3135 Handle(AIS_InteractiveObject) ViewerTest::PickObject(const AIS_KindOfInteractive TheType,
3136                                                      const Standard_Integer TheSignature,
3137                                                      const Standard_Integer MaxPick)
3138 {
3139   Handle(AIS_InteractiveObject) IO;
3140   Standard_Integer curindex = (TheType == AIS_KOI_None) ? 0 : TheAISContext()->OpenLocalContext();
3141
3142   // step 1: prepare the data
3143
3144   if(curindex !=0){
3145     Handle(AIS_SignatureFilter) F1 = new AIS_SignatureFilter(TheType,TheSignature);
3146     TheAISContext()->AddFilter(F1);
3147   }
3148
3149   // step 2 : wait for the selection...
3150   Standard_Boolean IsGood (Standard_False);
3151   Standard_Integer NbPick(0);
3152   Standard_Integer argccc = 5;
3153   const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
3154   const char **argvvv = (const char **) bufff;
3155
3156
3157   while(!IsGood && NbPick<= MaxPick){
3158     while(ViewerMainLoop(argccc,argvvv)){}
3159     IsGood = (TheAISContext()->NbSelected()>0) ;
3160     NbPick++;
3161     cout<<"Nb Pick :"<<NbPick<<endl;
3162   }
3163
3164
3165   // step3 get result.
3166   if(IsGood){
3167     TheAISContext()->InitSelected();
3168     IO = TheAISContext()->SelectedInteractive();
3169   }
3170
3171   if(curindex!=0)
3172     TheAISContext()->CloseLocalContext(curindex);
3173   return IO;
3174 }
3175
3176 //=======================================================================
3177 //function : PickShape
3178 //purpose  : First Activate the rightmode + Put Filters to be able to
3179 //           pick objets that are of type <TheType>...
3180 //=======================================================================
3181
3182 TopoDS_Shape ViewerTest::PickShape(const TopAbs_ShapeEnum TheType,
3183                                    const Standard_Integer MaxPick)
3184 {
3185
3186   // step 1: prepare the data
3187
3188   Standard_Integer curindex = TheAISContext()->OpenLocalContext();
3189   TopoDS_Shape result;
3190
3191   if(TheType==TopAbs_SHAPE){
3192     Handle(AIS_TypeFilter) F1 = new AIS_TypeFilter(AIS_KOI_Shape);
3193     TheAISContext()->AddFilter(F1);
3194   }
3195   else{
3196     Handle(StdSelect_ShapeTypeFilter) TF = new StdSelect_ShapeTypeFilter(TheType);
3197     TheAISContext()->AddFilter(TF);
3198     TheAISContext()->ActivateStandardMode(TheType);
3199
3200   }
3201
3202
3203   // step 2 : wait for the selection...
3204   Standard_Boolean NoShape (Standard_True);
3205   Standard_Integer NbPick(0);
3206   Standard_Integer argccc = 5;
3207   const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
3208   const char **argvvv = (const char **) bufff;
3209
3210
3211   while(NoShape && NbPick<= MaxPick){
3212     while(ViewerMainLoop(argccc,argvvv)){}
3213     NoShape = (TheAISContext()->NbSelected()==0) ;
3214     NbPick++;
3215     cout<<"Nb Pick :"<<NbPick<<endl;
3216   }
3217
3218   // step3 get result.
3219
3220   if(!NoShape){
3221
3222     TheAISContext()->InitSelected();
3223     if(TheAISContext()->HasSelectedShape())
3224       result = TheAISContext()->SelectedShape();
3225     else{
3226       Handle(AIS_InteractiveObject) IO = TheAISContext()->SelectedInteractive();
3227       result = (*((Handle(AIS_Shape)*) &IO))->Shape();
3228     }
3229   }
3230
3231   if(curindex>0)
3232     TheAISContext()->CloseLocalContext(curindex);
3233
3234   return result;
3235 }
3236
3237
3238 //=======================================================================
3239 //function : PickShapes
3240 //purpose  :
3241 //=======================================================================
3242 Standard_Boolean ViewerTest::PickShapes (const TopAbs_ShapeEnum TheType,
3243                                          Handle(TopTools_HArray1OfShape)& thearr,
3244                                          const Standard_Integer MaxPick)
3245 {
3246
3247   Standard_Integer Taille = thearr->Length();
3248   if(Taille>1)
3249     cout<<" WARNING : Pick with Shift+ MB1 for Selection of more than 1 object"<<"\n";
3250
3251   // step 1: prepare the data
3252   Standard_Integer curindex = TheAISContext()->OpenLocalContext();
3253   if(TheType==TopAbs_SHAPE){
3254     Handle(AIS_TypeFilter) F1 = new AIS_TypeFilter(AIS_KOI_Shape);
3255     TheAISContext()->AddFilter(F1);
3256   }
3257   else{
3258     Handle(StdSelect_ShapeTypeFilter) TF = new StdSelect_ShapeTypeFilter(TheType);
3259     TheAISContext()->AddFilter(TF);
3260     TheAISContext()->ActivateStandardMode(TheType);
3261
3262   }
3263
3264   // step 2 : wait for the selection...
3265
3266   Standard_Boolean NbPickGood (0),NbToReach(thearr->Length());
3267   Standard_Integer NbPickFail(0);
3268   Standard_Integer argccc = 5;
3269   const char *bufff[] = { "A", "B", "C","D", "E" };
3270   const char **argvvv = (const char **) bufff;
3271
3272
3273   while(NbPickGood<NbToReach && NbPickFail <= MaxPick){
3274     while(ViewerMainLoop(argccc,argvvv)){}
3275     Standard_Integer NbStored = TheAISContext()->NbSelected();
3276     if((unsigned int ) NbStored != NbPickGood)
3277       NbPickGood= NbStored;
3278     else
3279       NbPickFail++;
3280     cout<<"NbPicked =  "<<NbPickGood<<" |  Nb Pick Fail :"<<NbPickFail<<"\n";
3281   }
3282
3283   // step3 get result.
3284
3285   if((unsigned int ) NbPickFail >= NbToReach) return Standard_False;
3286
3287   Standard_Integer i(0);
3288   for(TheAISContext()->InitSelected();TheAISContext()->MoreSelected();TheAISContext()->NextSelected()){
3289     i++;
3290     if(TheAISContext()->HasSelectedShape())
3291       thearr->SetValue(i,TheAISContext()->SelectedShape());
3292     else{
3293       Handle(AIS_InteractiveObject) IO = TheAISContext()->SelectedInteractive();
3294       thearr->SetValue(i,(*((Handle(AIS_Shape)*) &IO))->Shape());
3295     }
3296   }
3297
3298   TheAISContext()->CloseLocalContext(curindex);
3299   return Standard_True;
3300 }
3301
3302
3303 //=======================================================================
3304 //function : VPickShape
3305 //purpose  :
3306 //=======================================================================
3307 static int VPickShape( Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3308 {
3309   TopoDS_Shape PickSh;
3310   TopAbs_ShapeEnum theType = TopAbs_COMPOUND;
3311
3312   if(argc==1)
3313     theType = TopAbs_SHAPE;
3314   else{
3315     if(!strcasecmp(argv[1],"V" )) theType = TopAbs_VERTEX;
3316     else if (!strcasecmp(argv[1],"E" )) theType = TopAbs_EDGE;
3317     else if (!strcasecmp(argv[1],"W" )) theType = TopAbs_WIRE;
3318     else if (!strcasecmp(argv[1],"F" )) theType = TopAbs_FACE;
3319     else if(!strcasecmp(argv[1],"SHAPE" )) theType = TopAbs_SHAPE;
3320     else if (!strcasecmp(argv[1],"SHELL" )) theType = TopAbs_SHELL;
3321     else if (!strcasecmp(argv[1],"SOLID" )) theType = TopAbs_SOLID;
3322   }
3323
3324   static Standard_Integer nbOfSub[8]={0,0,0,0,0,0,0,0};
3325   static TCollection_AsciiString nameType[8] = {"COMPS","SOL","SHE","F","W","E","V","SHAP"};
3326
3327   TCollection_AsciiString name;
3328
3329
3330   Standard_Integer NbToPick = argc>2 ? argc-2 : 1;
3331   if(NbToPick==1){
3332     PickSh = ViewerTest::PickShape(theType);
3333
3334     if(PickSh.IsNull())
3335       return 1;
3336     if(argc>2){
3337       name += argv[2];
3338     }
3339     else{
3340
3341       if(!PickSh.IsNull()){
3342         nbOfSub[Standard_Integer(theType)]++;
3343         name += "Picked_";
3344         name += nameType[Standard_Integer(theType)];
3345         TCollection_AsciiString indxstring(nbOfSub[Standard_Integer(theType)]);
3346         name +="_";
3347         name+=indxstring;
3348       }
3349     }
3350     // si on avait une petite methode pour voir si la shape
3351     // est deja dans la Double map, ca eviterait de creer....
3352     DBRep::Set(name.ToCString(),PickSh);
3353
3354     Handle(AIS_Shape) newsh = new AIS_Shape(PickSh);
3355     GetMapOfAIS().Bind(newsh, name);
3356     TheAISContext()->Display(newsh);
3357     di<<"Nom de la shape pickee : "<<name.ToCString()<<"\n";
3358   }
3359
3360   // Plusieurs objets a picker, vite vite vite....
3361   //
3362   else{
3363     Standard_Boolean autonaming = !strcasecmp(argv[2],".");
3364     Handle(TopTools_HArray1OfShape) arr = new TopTools_HArray1OfShape(1,NbToPick);
3365     if(ViewerTest::PickShapes(theType,arr)){
3366       for(Standard_Integer i=1;i<=NbToPick;i++){
3367         PickSh = arr->Value(i);
3368         if(!PickSh.IsNull()){
3369           if(autonaming){
3370             nbOfSub[Standard_Integer(theType)]++;
3371             name.Clear();
3372             name += "Picked_";
3373             name += nameType[Standard_Integer(theType)];
3374             TCollection_AsciiString indxstring(nbOfSub[Standard_Integer(theType)]);
3375             name +="_";
3376             name+=indxstring;
3377           }
3378         }
3379         else
3380           name = argv[1+i];
3381
3382         DBRep::Set(name.ToCString(),PickSh);
3383         Handle(AIS_Shape) newsh = new AIS_Shape(PickSh);
3384         GetMapOfAIS().Bind(newsh, name);
3385         di<<"display of picke shape #"<<i<<" - nom : "<<name.ToCString()<<"\n";
3386         TheAISContext()->Display(newsh);
3387
3388       }
3389     }
3390   }
3391   return 0;
3392 }
3393
3394 //=======================================================================
3395 //function : list of known objects
3396 //purpose  :
3397 //=======================================================================
3398 static int VIOTypes( Draw_Interpretor& di, Standard_Integer , const char** )
3399 {
3400   //                             1234567890         12345678901234567         123456789
3401   TCollection_AsciiString Colum [3]={"Standard Types","Type Of Object","Signature"};
3402   TCollection_AsciiString BlankLine(64,'_');
3403   Standard_Integer i ;
3404
3405   di<<"/n"<<BlankLine.ToCString()<<"\n";
3406
3407   for( i =0;i<=2;i++)
3408     Colum[i].Center(20,' ');
3409   for(i=0;i<=2;i++)
3410     di<<"|"<<Colum[i].ToCString();
3411   di<<"|"<<"\n";
3412
3413   di<<BlankLine.ToCString()<<"\n";
3414
3415   //  TCollection_AsciiString thetypes[5]={"Datum","Shape","Object","Relation","None"};
3416   const char ** names = GetTypeNames();
3417
3418   TCollection_AsciiString curstring;
3419   TCollection_AsciiString curcolum[3];
3420
3421
3422   // les objets de type Datum..
3423   curcolum[1]+="Datum";
3424   for(i =0;i<=6;i++){
3425     curcolum[0].Clear();
3426     curcolum[0] += names[i];
3427
3428     curcolum[2].Clear();
3429     curcolum[2]+=TCollection_AsciiString(i+1);
3430
3431     for(Standard_Integer j =0;j<=2;j++){
3432       curcolum[j].Center(20,' ');
3433       di<<"|"<<curcolum[j].ToCString();
3434     }
3435     di<<"|"<<"\n";
3436   }
3437   di<<BlankLine.ToCString()<<"\n";
3438
3439   // les objets de type shape
3440   curcolum[1].Clear();
3441   curcolum[1]+="Shape";
3442   curcolum[1].Center(20,' ');
3443
3444   for(i=0;i<=2;i++){
3445     curcolum[0].Clear();
3446     curcolum[0] += names[7+i];
3447     curcolum[2].Clear();
3448     curcolum[2]+=TCollection_AsciiString(i);
3449
3450     for(Standard_Integer j =0;j<=2;j++){
3451       curcolum[j].Center(20,' ');
3452       di<<"|"<<curcolum[j].ToCString();
3453     }
3454     di<<"|"<<"\n";
3455   }
3456   di<<BlankLine.ToCString()<<"\n";
3457   // les IO de type objet...
3458   curcolum[1].Clear();
3459   curcolum[1]+="Object";
3460   curcolum[1].Center(20,' ');
3461   for(i=0;i<=1;i++){
3462     curcolum[0].Clear();
3463     curcolum[0] += names[10+i];
3464     curcolum[2].Clear();
3465     curcolum[2]+=TCollection_AsciiString(i);
3466
3467     for(Standard_Integer j =0;j<=2;j++){
3468       curcolum[j].Center(20,' ');
3469       di<<"|"<<curcolum[j].ToCString();
3470     }
3471     di<<"|"<<"\n";
3472   }
3473   di<<BlankLine.ToCString()<<"\n";
3474   // les contraintes et dimensions.
3475   // pour l'instant on separe juste contraintes et dimensions...
3476   // plus tard, on detaillera toutes les sortes...
3477   curcolum[1].Clear();
3478   curcolum[1]+="Relation";
3479   curcolum[1].Center(20,' ');
3480   for(i=0;i<=1;i++){
3481     curcolum[0].Clear();
3482     curcolum[0] += names[12+i];
3483     curcolum[2].Clear();
3484     curcolum[2]+=TCollection_AsciiString(i);
3485
3486     for(Standard_Integer j =0;j<=2;j++){
3487       curcolum[j].Center(20,' ');
3488       di<<"|"<<curcolum[j].ToCString();
3489     }
3490     di<<"|"<<"\n";
3491   }
3492   di<<BlankLine.ToCString()<<"\n";
3493
3494
3495   return 0;
3496 }
3497
3498
3499 static int VEraseType( Draw_Interpretor& , Standard_Integer argc, const char** argv)
3500 {
3501   if(argc!=2) return 1;
3502
3503   AIS_KindOfInteractive TheType;
3504   Standard_Integer TheSign(-1);
3505   GetTypeAndSignfromString(argv[1],TheType,TheSign);
3506
3507
3508   AIS_ListOfInteractive LIO;
3509
3510   // en attendant l'amelioration ais pour les dimensions...
3511   //
3512   Standard_Integer dimension_status(-1);
3513   if(TheType==AIS_KOI_Relation){
3514     dimension_status = TheSign ==1 ? 1 : 0;
3515     TheSign=-1;
3516   }
3517
3518   TheAISContext()->DisplayedObjects(TheType,TheSign,LIO);
3519   Handle(AIS_InteractiveObject) curio;
3520   for(AIS_ListIteratorOfListOfInteractive it(LIO);it.More();it.Next()){
3521     curio  = it.Value();
3522
3523     if(dimension_status == -1)
3524       TheAISContext()->Erase(curio,Standard_False);
3525     else {
3526       AIS_KindOfDimension KOD = (*((Handle(AIS_Relation)*)&curio))->KindOfDimension();
3527       if ((dimension_status==0 && KOD == AIS_KOD_NONE)||
3528           (dimension_status==1 && KOD != AIS_KOD_NONE))
3529         TheAISContext()->Erase(curio,Standard_False);
3530     }
3531   }
3532   TheAISContext()->UpdateCurrentViewer();
3533   return 0;
3534 }
3535 static int VDisplayType(Draw_Interpretor& , Standard_Integer argc, const char** argv)
3536 {
3537   if(argc!=2) return 1;
3538
3539   AIS_KindOfInteractive TheType;
3540   Standard_Integer TheSign(-1);
3541   GetTypeAndSignfromString(argv[1],TheType,TheSign);
3542
3543   // en attendant l'amelioration ais pour les dimensions...
3544   //
3545   Standard_Integer dimension_status(-1);
3546   if(TheType==AIS_KOI_Relation){
3547     dimension_status = TheSign ==1 ? 1 : 0;
3548     TheSign=-1;
3549   }
3550
3551   AIS_ListOfInteractive LIO;
3552   TheAISContext()->ObjectsInside(LIO,TheType,TheSign);
3553   Handle(AIS_InteractiveObject) curio;
3554   for(AIS_ListIteratorOfListOfInteractive it(LIO);it.More();it.Next()){
3555     curio  = it.Value();
3556     if(dimension_status == -1)
3557       TheAISContext()->Display(curio,Standard_False);
3558     else {
3559       AIS_KindOfDimension KOD = (*((Handle(AIS_Relation)*)&curio))->KindOfDimension();
3560       if ((dimension_status==0 && KOD == AIS_KOD_NONE)||
3561           (dimension_status==1 && KOD != AIS_KOD_NONE))
3562         TheAISContext()->Display(curio,Standard_False);
3563     }
3564
3565   }
3566
3567   TheAISContext()->UpdateCurrentViewer();
3568   return 0;
3569 }
3570
3571 //==============================================================================
3572 //function : VSetTransMode
3573 //purpose  :
3574 //Draw arg : vsettransmode shape flag1 [flag2] [flag3] [X Y Z]
3575 //==============================================================================
3576
3577 static int VSetTransMode ( Draw_Interpretor& di, Standard_Integer argc, const char** argv ) {
3578   // Verification des arguments
3579   if ( a3DView().IsNull() ) {
3580     ViewerTest::ViewerInit();
3581     di << "La commande vinit n'a pas ete appele avant" << "\n";
3582   }
3583
3584   if ( argc < 3 || argc > 8 ) {
3585     di << argv[0] << " Invalid number of arguments" << "\n";
3586     return 1;
3587   }
3588
3589   TCollection_AsciiString shapeName;
3590   shapeName = argv[1];
3591   Standard_Integer persFlag1 = Draw::Atoi(argv[2]);
3592   Standard_Integer persFlag2 = 0;
3593   Standard_Integer persFlag3 = 0;
3594   gp_Pnt origin = gp_Pnt( 0.0, 0.0, 0.0 );
3595   if ( argc == 4 || argc == 5 || argc == 7 || argc == 8 ) {
3596     persFlag2 = Draw::Atoi(argv[3]);
3597   }
3598   if ( argc == 5 || argc == 8 ) {
3599     persFlag3 = Draw::Atoi(argv[4]);
3600   }
3601   if ( argc >= 6 ) {
3602     origin.SetX( Draw::Atof(argv[argc - 3]) );
3603     origin.SetY( Draw::Atof(argv[argc - 2]) );
3604     origin.SetZ( Draw::Atof(argv[argc - 1]) );
3605   }
3606
3607   Standard_Boolean IsBound = GetMapOfAIS().IsBound2(shapeName);
3608   Handle(Standard_Transient) anObj;
3609   if ( IsBound ) {
3610     anObj = GetMapOfAIS().Find2(shapeName);
3611     if ( anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject)) ) {
3612       Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast(anObj);
3613       aShape->SetTransformPersistence( (persFlag1 | persFlag2 | persFlag3), origin );
3614       if ( persFlag1 == 0 && persFlag2 == 0 && persFlag3 == 0 ) {
3615         di << argv[0] << " All persistence modifiers were removed" << "\n";
3616       }
3617     } else {
3618       di << argv[0] << " Wrong object type" << "\n";
3619       return 1;
3620     }
3621   } else { // Create the AIS_Shape from a name
3622     const Handle(AIS_InteractiveObject) aShape = GetAISShapeFromName((const char* )shapeName.ToCString());
3623     if ( !aShape.IsNull() ) {
3624       GetMapOfAIS().Bind( aShape, shapeName );
3625       aShape->SetTransformPersistence( (persFlag1 | persFlag2 | persFlag3), origin );
3626       TheAISContext()->Display( aShape, Standard_False );
3627     } else {
3628       di << argv[0] << " Object not found" << "\n";
3629       return 1;
3630     }
3631   }
3632
3633   // Upadate the screen and redraw the view
3634   TheAISContext()->UpdateCurrentViewer();
3635   return 0;
3636 }
3637
3638 static Standard_Integer vr(Draw_Interpretor& , Standard_Integer , const char** a)
3639 {
3640   ifstream s(a[1]);
3641   BRep_Builder builder;
3642   TopoDS_Shape shape;
3643   BRepTools::Read(shape, s, builder);
3644   DBRep::Set(a[1], shape);
3645   Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
3646   Handle(AIS_Shape) ais = new AIS_Shape(shape);
3647   Ctx->Display(ais);
3648   return 0;
3649 }
3650
3651 //==============================================================================
3652 //function : ViewerTest::Commands
3653 //purpose  : Add all the viewer command in the Draw_Interpretor
3654 //==============================================================================
3655
3656 void ViewerTest::Commands(Draw_Interpretor& theCommands)
3657 {
3658   ViewerTest::ViewerCommands(theCommands);
3659   ViewerTest::RelationCommands(theCommands);
3660   ViewerTest::ObjectCommands(theCommands);
3661   ViewerTest::FilletCommands(theCommands);
3662   ViewerTest::VoxelCommands(theCommands);
3663   ViewerTest::OpenGlCommands(theCommands);
3664
3665   const char *group = "AIS_Display";
3666
3667   // display
3668   theCommands.Add("visos",
3669                   "visos [name1 ...] [nbUIsos nbVIsos IsoOnPlane(0|1)]\n"
3670                   "\tIf last 3 optional parameters are not set prints numbers of U-, V- isolines and IsoOnPlane.\n",
3671                   __FILE__, visos, group);
3672
3673   theCommands.Add("vdisplay",
3674                   "vdisplay [-noupdate|-update] name1 [name2] ... [name n]"
3675       "\n\t\t: Displays named objects."
3676       "\n\t\t: Option -noupdate suppresses viewer redraw call."
3677                   __FILE__,VDisplay2,group);
3678
3679   theCommands.Add ("vupdate",
3680       "vupdate name1 [name2] ... [name n]"
3681       "\n\t\t: Updates named objects in interactive context",
3682       __FILE__, VUpdate, group);
3683
3684   theCommands.Add("verase",
3685       "verase [-noupdate|-update] [name1] ...  [name n]"
3686       "\n\t\t: Erases selected or named objects."
3687       "\n\t\t: If there are no selected or named objects the whole viewer is erased.",
3688                   __FILE__, VErase, group);
3689
3690   theCommands.Add("vremove",
3691     "vremove [-noupdate|-update] [-context] [-all] [name1] ...  [name n]"
3692     "or vremove [-context] -all to remove all objects"
3693       "\n\t\t: Removes selected or named objects."
3694       "\n\t\t  If -context is in arguments, the objects are not deleted"
3695       "\n\t\t  from the map of objects and names."
3696       "\n\t\t: Option -noupdate suppresses viewer redraw call.",
3697       __FILE__, VRemove, group);
3698
3699   theCommands.Add("vdonly",
3700                   "vdonly [-noupdate|-update] [name1] ...  [name n]"
3701       "\n\t\t: Displays only selected or named objects",
3702                   __FILE__,VDonly2,group);
3703
3704   theCommands.Add("vdisplayall",
3705                   "Displays all erased interactive objects (see vdir and vstate)",
3706                   __FILE__,VDisplayAll,group);
3707
3708   theCommands.Add("veraseall",
3709                   "Erases all objects displayed in the viewer",
3710                   __FILE__, VErase, group);
3711
3712   theCommands.Add("verasetype",
3713                   "verasetype <Type>"
3714       "\n\t\t: Erase all the displayed objects of one given kind (see vtypes)",
3715                   __FILE__,VEraseType,group);
3716
3717   theCommands.Add("vdisplaytype",
3718                   "vdisplaytype        : vdisplaytype <Type> <Signature> \n\t display all the objects of one given kind (see vtypes) which are stored the AISContext ",
3719                   __FILE__,VDisplayType,group);
3720
3721   theCommands.Add("vdisplaymode",
3722                   "vdispmode       : vdispmode  [name] mode(1,2,..) : no name -> on selected objects ",
3723                   __FILE__,VDispMode,group);
3724
3725   theCommands.Add("verasemode",
3726                   "verasemode      : verasemode [name] mode(1,2,..) : no name -> on selected objects",
3727                   __FILE__,VDispMode,group);
3728
3729   theCommands.Add("vsetdispmode",
3730                   "vsetdispmode [name] mode(1,2,..)"
3731       "\n\t\t: Sets display mode for all, selected or named objects.",
3732                   __FILE__,VDispMode,group);
3733
3734   theCommands.Add("vunsetdispmode",
3735                   "vunsetdispmode [name]"
3736       "\n\t\t: Unsets custom display mode for selected or named objects.",
3737                   __FILE__,VDispMode,group);
3738
3739   theCommands.Add("vdir",
3740                   "Lists all objects displayed in 3D viewer",
3741                   __FILE__,VDir,group);
3742
3743   theCommands.Add("vdump",
3744     #ifdef HAVE_FREEIMAGE
3745               "vdump <filename>.{png|bmp|jpg|gif} [rgb|rgba|depth=rgb] [mono|left|right=mono]"
3746       "\n\t\t:                                    [width Width=0 height Height=0]"
3747       "\n\t\t: Dumps content of the active view into PNG, BMP, JPEG or GIF file",
3748     #else
3749               "vdump <filename>.{ppm} [rgb|rgba|depth=rgb] [mono|left|right=mono]"
3750       "\n\t\t:                        [width Width=0 height Height=0]"
3751       "\n\t\t: Dumps content of the active view into PPM image file",
3752     #endif
3753                   __FILE__,VDump,group);
3754
3755   theCommands.Add("vsub",      "vsub 0/1 (off/on) [obj]        : Subintensity(on/off) of selected objects",
3756                   __FILE__,VSubInt,group);
3757
3758   theCommands.Add("vsetcolor",
3759                   "vsetcolor [name] ColorName"
3760       "\n\t\t: Sets color for all, selected or named objects.",
3761                   __FILE__,VColor2,group);
3762
3763   theCommands.Add("vunsetcolor",
3764                   "vunsetcolor [name]"
3765       "\n\t\t: Resets color for all, selected or named objects.",
3766                   __FILE__,VColor2,group);
3767
3768   theCommands.Add("vsettransparency",
3769                   "vsettransparency [name] Coefficient"
3770       "\n\t\t: Sets transparency for all, selected or named objects."
3771       "\n\t\t: The Coefficient may be between 0.0 (opaque) and 1.0 (fully transparent).",
3772                   __FILE__,VTransparency,group);
3773
3774   theCommands.Add("vunsettransparency",
3775                   "vunsettransparency [name]"
3776       "\n\t\t: Resets transparency for all, selected or named objects.",
3777                   __FILE__,VTransparency,group);
3778
3779   theCommands.Add("vsetmaterial",
3780                   "vmaterial          : vmaterial  [name of shape] MaterialName",
3781                   __FILE__,VMaterial,group);
3782
3783   theCommands.Add("vunsetmaterial",
3784                   "vmaterial          : vmaterial  [name of shape]",
3785                   __FILE__,VMaterial,group);
3786
3787   theCommands.Add("vsetwidth",
3788                   "vsetwidth          : vwidth  [name of shape] width(0->10)",
3789                   __FILE__,VWidth,group);
3790
3791   theCommands.Add("vunsetwidth",
3792                   "vunsetwidth          : vwidth  [name of shape]",
3793                   __FILE__,VWidth,group);
3794
3795   theCommands.Add("vsetinteriorstyle",
3796                   "vsetinteriorstyle    : vsetinteriorstyle [name of shape] style",
3797                   __FILE__,VInteriorStyle,group);
3798
3799   theCommands.Add("vardis",
3800                   "vardis          : display activeareas",
3801                   __FILE__,VDispAreas,group);
3802
3803   theCommands.Add("varera",
3804                   "varera           : erase activeareas",
3805                   __FILE__,VClearAreas,group);
3806
3807   theCommands.Add("vsensdis",
3808                   "vardisp           : display active entities",
3809                   __FILE__,VDispSensi,group);
3810   theCommands.Add("vsensera",
3811                   "vardisp           : erase  active entities",
3812                   __FILE__,VClearSensi,group);
3813
3814   theCommands.Add("vselprecision",
3815                   "vselprecision : vselprecision [precision_mode [tolerance_value]]",
3816                   __FILE__,VSelPrecision,group);
3817
3818   theCommands.Add("vperf",
3819                   "vperf: vperf  ShapeName 1/0(Transfo/Location) 1/0(Primitives sensibles ON/OFF)",
3820                   __FILE__,VPerf,group);
3821
3822   theCommands.Add("vanimation",
3823                   "vanimation CrankArmFile CylinderHeadFile PropellerFile EngineBlockFile",
3824                   __FILE__,VAnimation,group);
3825
3826   theCommands.Add("vsetshading",
3827                   "vsetshading  : vsetshading name Quality(default=0.0008) ",
3828                   __FILE__,VShading,group);
3829
3830   theCommands.Add("vunsetshading",
3831                   "vunsetshading :vunsetshading name ",
3832                   __FILE__,VShading,group);
3833
3834   theCommands.Add("vtexture",
3835                   "'vtexture NameOfShape TextureFile' \n \
3836                   or 'vtexture NameOfShape' if you want to disable texture mapping \n \
3837                   or 'vtexture NameOfShape ?' to list available textures\n \
3838                   or 'vtexture NameOfShape IdOfTexture' (0<=IdOfTexture<=20)' to use predefined  textures\n ",
3839                   __FILE__,VTexture,group);
3840
3841   theCommands.Add("vtexscale",
3842                   "'vtexscale  NameOfShape ScaleU ScaleV' \n \
3843                    or 'vtexscale NameOfShape ScaleUV' \n \
3844                    or 'vtexscale NameOfShape' to disable scaling\n ",
3845                   __FILE__,VTexture,group);
3846
3847   theCommands.Add("vtexorigin",
3848                   "'vtexorigin NameOfShape UOrigin VOrigin' \n \
3849                    or 'vtexorigin NameOfShape UVOrigin' \n \
3850                    or 'vtexorigin NameOfShape' to disable origin positioning\n ",
3851                   __FILE__,VTexture,group);
3852
3853   theCommands.Add("vtexrepeat",
3854                   "'vtexrepeat  NameOfShape URepeat VRepeat' \n \
3855                    or 'vtexrepeat NameOfShape UVRepeat \n \
3856                    or 'vtexrepeat NameOfShape' to disable texture repeat \n ",
3857                   VTexture,group);
3858
3859   theCommands.Add("vtexdefault",
3860                   "'vtexdefault NameOfShape' to set texture mapping default parameters \n",
3861                   VTexture,group);
3862
3863   theCommands.Add("vsetam",
3864                   "vsetActivatedModes: vsetam mode(1->7)  ",
3865                   __FILE__,VActivatedMode,group);
3866
3867   theCommands.Add("vunsetam",
3868                   "vunsetActivatedModes:   vunsetam  ",
3869                   __FILE__,VActivatedMode,group);
3870
3871   theCommands.Add("vstate",
3872       "vstate [name1] ... [nameN]"
3873       "\n\t\t: Reports show/hidden state for selected or named objects",
3874                   __FILE__,VState,group);
3875
3876   theCommands.Add("vpickshapes",
3877                   "vpickshape subtype(VERTEX,EDGE,WIRE,FACE,SHELL,SOLID) [name1 or .] [name2 or .] [name n or .]",
3878                   __FILE__,VPickShape,group);
3879
3880   theCommands.Add("vtypes",
3881                   "vtypes : list of known types and signatures in AIS - To be Used in vpickobject command for selection with filters",
3882                   VIOTypes,group);
3883
3884   theCommands.Add("vsettransmode",
3885                   "vsettransmode   : vsettransmode shape flag1 [flag2] [flag3] [X Y Z]",
3886                   __FILE__,VSetTransMode,group);
3887
3888   theCommands.Add("vr", "vr : reading of the shape",
3889                   __FILE__,vr, group);
3890
3891 }
3892
3893 //=====================================================================
3894 //========================= for testing Draft and Rib =================
3895 //=====================================================================
3896 #include <BRepOffsetAPI_MakeThickSolid.hxx>
3897 #include <DBRep.hxx>
3898 #include <TopoDS_Face.hxx>
3899 #include <gp_Pln.hxx>
3900 #include <AIS_KindOfSurface.hxx>
3901 #include <BRepOffsetAPI_DraftAngle.hxx>
3902 #include <Precision.hxx>
3903 #include <BRepAlgo.hxx>
3904 #include <OSD_Environment.hxx>
3905 #include <DrawTrSurf.hxx>
3906 //#include <DbgTools.hxx>
3907 //#include <FeatAlgo_MakeLinearForm.hxx>
3908
3909
3910
3911
3912 //=======================================================================
3913 //function : IsValid
3914 //purpose  :
3915 //=======================================================================
3916 static Standard_Boolean IsValid(const TopTools_ListOfShape& theArgs,
3917                                 const TopoDS_Shape& theResult,
3918                                 const Standard_Boolean closedSolid,
3919                                 const Standard_Boolean GeomCtrl)
3920 {
3921   OSD_Environment check ("DONT_SWITCH_IS_VALID") ;
3922   TCollection_AsciiString checkValid = check.Value();
3923   Standard_Boolean ToCheck = Standard_True;
3924   if (!checkValid.IsEmpty()) {
3925 #ifdef DEB
3926     cout <<"DONT_SWITCH_IS_VALID positionnee a :"<<checkValid.ToCString()<<"\n";
3927 #endif
3928     if ( checkValid=="true" || checkValid=="TRUE" ) {
3929       ToCheck= Standard_False;
3930     }
3931   } else {
3932 #ifdef DEB
3933     cout <<"DONT_SWITCH_IS_VALID non positionne"<<"\n";
3934 #endif
3935   }
3936   Standard_Boolean IsValid = Standard_True;
3937   if (ToCheck)
3938     IsValid = BRepAlgo::IsValid(theArgs,theResult,closedSolid,GeomCtrl) ;
3939   return IsValid;
3940
3941 }
3942
3943 //===============================================================================
3944 // TDraft : test draft, uses AIS Viewer
3945 // Solid Face Plane Angle  Reverse
3946 //===============================================================================
3947 static Standard_Integer TDraft(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3948 {
3949   if (argc < 5) return 1;
3950 // argv[1] - TopoDS_Shape Solid
3951 // argv[2] - TopoDS_Shape Face
3952 // argv[3] - TopoDS_Shape Plane
3953 // argv[4] - Standard_Real Angle
3954 // argv[5] - Standard_Integer Reverse
3955
3956 //  Sprintf(prefix, argv[1]);
3957   Standard_Real anAngle = 0;
3958   Standard_Boolean Rev = Standard_False;
3959   Standard_Integer rev = 0;
3960   TopoDS_Shape Solid  = GetShapeFromName(argv[1]);
3961   TopoDS_Shape face   = GetShapeFromName(argv[2]);
3962   TopoDS_Face Face    = TopoDS::Face(face);
3963   TopoDS_Shape Plane  = GetShapeFromName(argv[3]);
3964   if (Plane.IsNull ()) {
3965     di << "TEST : Plane is NULL" << "\n";
3966     return 1;
3967   }
3968   anAngle = Draw::Atof(argv[4]);
3969   anAngle = 2*M_PI * anAngle / 360.0;
3970   gp_Pln aPln;
3971   Handle( Geom_Surface )aSurf;
3972   AIS_KindOfSurface aSurfType;
3973   Standard_Real Offset;
3974   gp_Dir aDir;
3975   if(argc > 4) { // == 5
3976     rev = Draw::Atoi(argv[5]);
3977     Rev = (rev)? Standard_True : Standard_False;
3978   }
3979
3980   TopoDS_Face face2 = TopoDS::Face(Plane);
3981   if(!AIS::GetPlaneFromFace(face2, aPln, aSurf, aSurfType, Offset))
3982     {
3983       di << "TEST : Can't find plane" << "\n";
3984       return 1;
3985     }
3986
3987   aDir = aPln.Axis().Direction();
3988   if (!aPln.Direct())
3989     aDir.Reverse();
3990   if (Plane.Orientation() == TopAbs_REVERSED)
3991     aDir.Reverse();
3992   di << "TEST : gp::Resolution() = " << gp::Resolution() << "\n";
3993
3994   BRepOffsetAPI_DraftAngle Draft (Solid);
3995
3996   if(Abs(anAngle)< Precision::Angular()) {
3997     di << "TEST : NULL angle" << "\n";
3998     return 1;}
3999
4000   if(Rev) anAngle = - anAngle;
4001   Draft.Add (Face, aDir, anAngle, aPln);
4002   Draft.Build ();
4003   if (!Draft.IsDone())  {
4004     di << "TEST : Draft Not DONE " << "\n";
4005     return 1;
4006   }
4007   TopTools_ListOfShape Larg;
4008   Larg.Append(Solid);
4009   if (!IsValid(Larg,Draft.Shape(),Standard_True,Standard_False)) {
4010     di << "TEST : DesignAlgo returns Not valid" << "\n";
4011     return 1;
4012   }
4013
4014   Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
4015   Handle(AIS_Shape) ais = new AIS_Shape(Draft.Shape());
4016
4017   if ( !ais.IsNull() ) {
4018     ais->SetColor(DEFAULT_COLOR);
4019     ais->SetMaterial(DEFAULT_MATERIAL);
4020     // Display the AIS_Shape without redraw
4021     Ctx->Display(ais, Standard_False);
4022
4023     const char *Name = "draft1";
4024     Standard_Boolean IsBound = GetMapOfAIS().IsBound2(Name);
4025     if (IsBound) {
4026       Handle(AIS_InteractiveObject) an_object =
4027         Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(Name));
4028       if (!an_object.IsNull()) {
4029         Ctx->Remove(an_object,
4030                     Standard_True) ;
4031         GetMapOfAIS().UnBind2(Name) ;
4032       }
4033     }
4034     GetMapOfAIS().Bind(ais, Name);
4035 //  DBRep::Set("draft", ais->Shape());
4036   }
4037   Ctx->Display(ais, Standard_True);
4038   return 0;
4039 }
4040
4041 //==============================================================================
4042 //function : splitParameter
4043 //purpose  : Split parameter string to parameter name and parameter value
4044 //==============================================================================
4045 Standard_Boolean ViewerTest::SplitParameter (const TCollection_AsciiString& theString,
4046                                              TCollection_AsciiString&       theName,
4047                                              TCollection_AsciiString&       theValue)
4048 {
4049   Standard_Integer aParamNameEnd = theString.FirstLocationInSet ("=", 1, theString.Length());
4050
4051   if (aParamNameEnd == 0)
4052   {
4053     return Standard_False;
4054   }
4055
4056   TCollection_AsciiString aString (theString);
4057   if (aParamNameEnd != 0)
4058   {
4059     theValue = aString.Split (aParamNameEnd);
4060     aString.Split (aString.Length() - 1);
4061     theName = aString;
4062   }
4063
4064   return Standard_True;
4065 }
4066
4067 //============================================================================
4068 //  MyCommands
4069 //============================================================================
4070 void ViewerTest::MyCommands( Draw_Interpretor& theCommands)
4071 {
4072
4073   DrawTrSurf::BasicCommands(theCommands);
4074   const char* group = "Check Features Operations commands";
4075
4076   theCommands.Add("Draft","Draft    Solid Face Plane Angle Reverse",
4077                   __FILE__,
4078                   &TDraft,group); //Draft_Modification
4079 }
4080
4081 //==============================================================================
4082 // ViewerTest::Factory
4083 //==============================================================================
4084 void ViewerTest::Factory(Draw_Interpretor& theDI)
4085 {
4086   // definition of Viewer Command
4087   ViewerTest::Commands(theDI);
4088   ViewerTest::AviCommands(theDI);
4089
4090 #ifdef DEB
4091       theDI << "Draw Plugin : OCC V2d & V3d commands are loaded" << "\n";
4092 #endif
4093 }
4094
4095 // Declare entry point PLUGINFACTORY
4096 DPLUGIN(ViewerTest)