1 // Created on: 1997-07-23
2 // Created by: Henri JEANNIN
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 // Modified by Eric Gouthiere [sep-oct 98] -> add commands for display...
18 // Modified by Robert Coublanc [nov 16-17-18 1998]
19 // -split ViewerTest.cxx into 3 files : ViewerTest.cxx,
20 // ViewerTest_ObjectCommands.cxx
21 // ViewerTest_RelationCommands.cxx
22 // -add Functions and commands for interactive selection of shapes and objects
23 // in AIS Viewers. (PickShape(s), PickObject(s),
25 #include <Standard_Stream.hxx>
27 #include <ViewerTest.hxx>
28 #include <TopLoc_Location.hxx>
29 #include <TopTools_HArray1OfShape.hxx>
30 #include <TColStd_HArray1OfTransient.hxx>
31 #include <TColStd_HSequenceOfAsciiString.hxx>
32 #include <OSD_Timer.hxx>
33 #include <Geom_Axis2Placement.hxx>
34 #include <Geom_Axis1Placement.hxx>
35 #include <gp_Trsf.hxx>
36 #include <TopExp_Explorer.hxx>
37 #include <BRepAdaptor_Curve.hxx>
38 #include <StdSelect_ShapeTypeFilter.hxx>
40 #include <AIS_Drawer.hxx>
41 #include <AIS_ColoredShape.hxx>
42 #include <AIS_InteractiveObject.hxx>
43 #include <AIS_Trihedron.hxx>
44 #include <AIS_Axis.hxx>
45 #include <AIS_Relation.hxx>
46 #include <AIS_TypeFilter.hxx>
47 #include <AIS_SignatureFilter.hxx>
48 #include <AIS_LocalContext.hxx>
49 #include <AIS_ListOfInteractive.hxx>
50 #include <AIS_ListIteratorOfListOfInteractive.hxx>
51 #include <Aspect_InteriorStyle.hxx>
52 #include <Aspect_Window.hxx>
53 #include <Graphic3d_AspectFillArea3d.hxx>
54 #include <Graphic3d_AspectLine3d.hxx>
55 #include <Graphic3d_TextureRoot.hxx>
56 #include <Image_AlienPixMap.hxx>
57 #include <Prs3d_ShadingAspect.hxx>
58 #include <Prs3d_IsoAspect.hxx>
59 #include <TopTools_MapOfShape.hxx>
69 #include <Draw_Interpretor.hxx>
70 #include <TCollection_AsciiString.hxx>
71 #include <Draw_PluginMacro.hxx>
72 #include <ViewerTest.hxx>
74 // avoid warnings on 'extern "C"' functions returning C++ classes
76 #define _CRT_SECURE_NO_DEPRECATE
77 #pragma warning(4:4190)
78 #pragma warning (disable:4996)
81 #include <NIS_InteractiveContext.hxx>
82 #include <NIS_Triangulated.hxx>
83 extern int ViewerMainLoop(Standard_Integer argc, const char** argv);
85 #include <Quantity_Color.hxx>
86 #include <Quantity_NameOfColor.hxx>
88 #include <Graphic3d_NameOfMaterial.hxx>
90 #define DEFAULT_COLOR Quantity_NOC_GOLDENROD
91 #define DEFAULT_MATERIAL Graphic3d_NOM_BRASS
93 enum ViewerTest_RedrawMode
95 ViewerTest_RM_Auto = -1,
96 ViewerTest_RM_RedrawForce,
97 ViewerTest_RM_RedrawSuppress
100 //! Auxiliary method to parse redraw mode argument
101 static Standard_Boolean parseRedrawMode (const TCollection_AsciiString& theArg,
102 ViewerTest_RedrawMode& theMode)
104 TCollection_AsciiString anArgCase (theArg);
105 anArgCase.LowerCase();
106 if (anArgCase == "-update"
107 || anArgCase == "-redraw")
109 theMode = ViewerTest_RM_RedrawForce;
110 return Standard_True;
112 else if (anArgCase == "-noupdate"
113 || anArgCase == "-noredraw")
115 theMode = ViewerTest_RM_RedrawSuppress;
116 return Standard_True;
118 return Standard_False;
121 //=======================================================================
122 //function : GetColorFromName
123 //purpose : get the Quantity_NameOfColor from a string
124 //=======================================================================
126 Quantity_NameOfColor ViewerTest::GetColorFromName (const Standard_CString theName)
128 for (Standard_Integer anIter = Quantity_NOC_BLACK; anIter <= Quantity_NOC_WHITE; ++anIter)
130 Standard_CString aColorName = Quantity_Color::StringName (Quantity_NameOfColor (anIter));
131 if (strcasecmp (theName, aColorName) == 0)
133 return Quantity_NameOfColor (anIter);
137 return DEFAULT_COLOR;
140 //=======================================================================
141 //function : GetTypeNames
143 //=======================================================================
144 static const char** GetTypeNames()
146 static const char* names[14] = {"Point","Axis","Trihedron","PlaneTrihedron", "Line","Circle","Plane",
147 "Shape","ConnectedShape","MultiConn.Shape",
148 "ConnectedInter.","MultiConn.",
149 "Constraint","Dimension"};
150 static const char** ThePointer = names;
154 //=======================================================================
155 //function : GetTypeAndSignfromString
157 //=======================================================================
158 void GetTypeAndSignfromString (const char* name,AIS_KindOfInteractive& TheType,Standard_Integer& TheSign)
160 const char ** thefullnames = GetTypeNames();
161 Standard_Integer index(-1);
163 for(Standard_Integer i=0;i<=13 && index==-1;i++)
164 if(!strcasecmp(name,thefullnames[i]))
168 TheType = AIS_KOI_None;
174 TheType = AIS_KOI_Datum;
178 TheType = AIS_KOI_Shape;
182 TheType = AIS_KOI_Object;
186 TheType = AIS_KOI_Relation;
195 #include <Draw_Interpretor.hxx>
197 #include <Draw_Appli.hxx>
201 #include <TCollection_AsciiString.hxx>
202 #include <V3d_Viewer.hxx>
203 #include <V3d_View.hxx>
206 #include <AIS_InteractiveContext.hxx>
207 #include <AIS_Shape.hxx>
208 #include <AIS_TexturedShape.hxx>
209 #include <AIS_DisplayMode.hxx>
210 #include <TColStd_MapOfInteger.hxx>
211 #include <AIS_MapOfInteractive.hxx>
212 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
213 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
214 #include <ViewerTest_EventManager.hxx>
216 #include <TopoDS_Solid.hxx>
217 #include <BRepTools.hxx>
218 #include <BRep_Builder.hxx>
219 #include <TopAbs_ShapeEnum.hxx>
221 #include <TopoDS.hxx>
222 #include <BRep_Tool.hxx>
225 #include <Draw_Window.hxx>
226 #include <AIS_ListIteratorOfListOfInteractive.hxx>
227 #include <AIS_ListOfInteractive.hxx>
228 #include <AIS_DisplayMode.hxx>
229 #include <TopTools_ListOfShape.hxx>
230 #include <BRepOffsetAPI_MakeThickSolid.hxx>
231 #include <BRepOffset.hxx>
233 //==============================================================================
234 // VIEWER OBJECT MANAGEMENT GLOBAL VARIABLES
235 //==============================================================================
236 Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS(){
237 static ViewerTest_DoubleMapOfInteractiveAndName TheMap;
242 //==============================================================================
243 //function : VDisplayAISObject
244 //purpose : register interactive object in the map of AIS objects;
245 // if other object with such name already registered, it will be kept
246 // or replaced depending on value of <theReplaceIfExists>,
247 // if "true" - the old object will be cleared from AIS context;
248 // returns Standard_True if <theAISObj> registered in map;
249 //==============================================================================
250 Standard_EXPORT Standard_Boolean VDisplayAISObject (const TCollection_AsciiString& theName,
251 const Handle(AIS_InteractiveObject)& theAISObj,
252 Standard_Boolean theReplaceIfExists = Standard_True)
254 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
255 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
256 if (aContextAIS.IsNull())
258 std::cout << "AIS context is not available.\n";
259 return Standard_False;
262 if (aMap.IsBound2 (theName))
264 if (!theReplaceIfExists)
266 std::cout << "Other interactive object has been already "
267 << "registered with name: " << theName << ".\n"
268 << "Please use another name.\n";
269 return Standard_False;
272 // stop displaying object
273 Handle(AIS_InteractiveObject) anOldObj =
274 Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (theName));
276 if (!anOldObj.IsNull())
277 aContextAIS->Clear (anOldObj, Standard_True);
279 // remove name and old object from map
280 aMap.UnBind2 (theName);
283 if (theAISObj.IsNull())
285 // object with specified name already unbound
286 return Standard_True;
289 // unbind AIS object if was bound with another name
290 aMap.UnBind1 (theAISObj);
292 // can be registered without rebinding
293 aMap.Bind (theAISObj, theName);
294 aContextAIS->Display (theAISObj, Standard_True);
295 return Standard_True;
298 static TColStd_MapOfInteger theactivatedmodes(8);
299 static TColStd_ListOfTransient theEventMgrs;
301 static void VwrTst_InitEventMgr(const Handle(NIS_View)& aView,
302 const Handle(AIS_InteractiveContext)& Ctx)
304 theEventMgrs.Clear();
305 theEventMgrs.Prepend(new ViewerTest_EventManager(aView, Ctx));
308 static Handle(V3d_View)& a3DView()
310 static Handle(V3d_View) Viou;
315 Standard_EXPORT Handle(AIS_InteractiveContext)& TheAISContext(){
316 static Handle(AIS_InteractiveContext) aContext;
320 const Handle(V3d_View)& ViewerTest::CurrentView()
324 void ViewerTest::CurrentView(const Handle(V3d_View)& V)
329 Standard_EXPORT const Handle(NIS_InteractiveContext)& TheNISContext()
331 static Handle(NIS_InteractiveContext) aContext;
332 if (aContext.IsNull()) {
333 aContext = new NIS_InteractiveContext;
334 aContext->SetSelectionMode (NIS_InteractiveContext::Mode_Normal);
339 const Handle(AIS_InteractiveContext)& ViewerTest::GetAISContext()
341 return TheAISContext();
344 void ViewerTest::SetAISContext (const Handle(AIS_InteractiveContext)& aCtx)
346 TheAISContext() = aCtx;
347 ViewerTest::ResetEventManager();
350 Handle(V3d_Viewer) ViewerTest::GetViewerFromContext()
352 return !TheAISContext().IsNull() ? TheAISContext()->CurrentViewer() : Handle(V3d_Viewer)();
355 Handle(V3d_Viewer) ViewerTest::GetCollectorFromContext()
357 return !TheAISContext().IsNull() ? TheAISContext()->CurrentViewer() : Handle(V3d_Viewer)();
361 void ViewerTest::SetEventManager(const Handle(ViewerTest_EventManager)& EM){
362 theEventMgrs.Prepend(EM);
365 void ViewerTest::UnsetEventManager()
367 theEventMgrs.RemoveFirst();
371 void ViewerTest::ResetEventManager()
373 const Handle(NIS_View) aView =
374 Handle(NIS_View)::DownCast(ViewerTest::CurrentView());
375 VwrTst_InitEventMgr(aView, ViewerTest::GetAISContext());
378 Handle(ViewerTest_EventManager) ViewerTest::CurrentEventManager()
380 Handle(ViewerTest_EventManager) EM;
381 if(theEventMgrs.IsEmpty()) return EM;
382 Handle(Standard_Transient) Tr = theEventMgrs.First();
383 EM = *((Handle(ViewerTest_EventManager)*)&Tr);
387 //=======================================================================
388 //function : Get Context and active view
390 //=======================================================================
391 static Standard_Boolean getCtxAndView (Handle(AIS_InteractiveContext)& theCtx,
392 Handle(V3d_View)& theView)
394 theCtx = ViewerTest::GetAISContext();
395 theView = ViewerTest::CurrentView();
399 std::cout << "Error: cannot find an active view!\n";
400 return Standard_False;
402 return Standard_True;
405 //==============================================================================
406 //function : GetShapeFromName
407 //purpose : Compute an Shape from a draw variable or a file name
408 //==============================================================================
410 static TopoDS_Shape GetShapeFromName(const char* name)
412 TopoDS_Shape S = DBRep::Get(name);
415 BRep_Builder aBuilder;
416 BRepTools::Read( S, name, aBuilder);
422 //==============================================================================
423 //function : GetAISShapeFromName
424 //purpose : Compute an AIS_Shape from a draw variable or a file name
425 //==============================================================================
426 Handle(AIS_Shape) GetAISShapeFromName(const char* name)
428 Handle(AIS_Shape) retsh;
430 if(GetMapOfAIS().IsBound2(name)){
431 const Handle(AIS_InteractiveObject) IO =
432 Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
434 if(IO->Type()==AIS_KOI_Shape) {
435 if(IO->Signature()==0){
436 retsh = *((Handle(AIS_Shape)*)&IO);
439 cout << "an Object which is not an AIS_Shape "
440 "already has this name!!!"<<endl;
447 TopoDS_Shape S = GetShapeFromName(name);
449 retsh = new AIS_Shape(S);
455 //==============================================================================
457 //purpose : Remove all the object from the viewer
458 //==============================================================================
459 void ViewerTest::Clear()
461 if ( !a3DView().IsNull() ) {
462 if (TheAISContext()->HasOpenedContext())
463 TheAISContext()->CloseLocalContext();
464 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it(GetMapOfAIS());
465 while ( it.More() ) {
466 cout << "Remove " << it.Key2() << endl;
467 if (it.Key1()->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
468 const Handle(AIS_InteractiveObject) anObj =
469 Handle(AIS_InteractiveObject)::DownCast (it.Key1());
470 TheAISContext()->Remove(anObj,Standard_False);
471 } else if (it.Key1()->IsKind(STANDARD_TYPE(NIS_InteractiveObject))) {
472 const Handle(NIS_InteractiveObject) anObj =
473 Handle(NIS_InteractiveObject)::DownCast (it.Key1());
474 TheNISContext()->Remove(anObj);
478 TheAISContext()->UpdateCurrentViewer();
479 // TheNISContext()->UpdateViews();
480 GetMapOfAIS().Clear();
484 //==============================================================================
485 //function : StandardModesActivation
486 //purpose : Activate a selection mode, vertex, edge, wire ..., in a local
488 //==============================================================================
489 void ViewerTest::StandardModeActivation(const Standard_Integer mode )
491 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
493 if (TheAISContext()->HasOpenedContext())
494 aContext->CloseLocalContext();
497 if(!aContext->HasOpenedContext()) {
498 // To unhilight the preselected object
499 aContext->UnhilightCurrents(Standard_False);
500 // Open a local Context in order to be able to select subshape from
501 // the selected shape if any or for all if there is no selection
502 if (!aContext->FirstCurrentObject().IsNull()){
503 aContext->OpenLocalContext(Standard_False);
505 for(aContext->InitCurrent();aContext->MoreCurrent();aContext->NextCurrent()){
506 aContext->Load( aContext->Current(),-1,Standard_True);
510 aContext->OpenLocalContext();
513 const char *cmode="???";
516 case 0: cmode = "Shape"; break;
517 case 1: cmode = "Vertex"; break;
518 case 2: cmode = "Edge"; break;
519 case 3: cmode = "Wire"; break;
520 case 4: cmode = "Face"; break;
521 case 5: cmode = "Shell"; break;
522 case 6: cmode = "Solid"; break;
523 case 7: cmode = "Compsolid"; break;
524 case 8: cmode = "Compound"; break;
527 if(theactivatedmodes.Contains(mode))
529 aContext->DeactivateStandardMode(AIS_Shape::SelectionType(mode));
530 theactivatedmodes.Remove(mode);
531 cout<<"Mode "<< cmode <<" OFF"<<endl;
535 aContext->ActivateStandardMode(AIS_Shape::SelectionType(mode));
536 theactivatedmodes.Add(mode);
537 cout<<"Mode "<< cmode << " ON" << endl;
542 //==============================================================================
543 //function : CopyIsoAspect
544 //purpose : Returns copy Prs3d_IsoAspect with new number of isolines.
545 //==============================================================================
546 static Handle(Prs3d_IsoAspect) CopyIsoAspect
547 (const Handle(Prs3d_IsoAspect) &theIsoAspect,
548 const Standard_Integer theNbIsos)
550 Quantity_Color aColor;
551 Aspect_TypeOfLine aType;
552 Standard_Real aWidth;
554 theIsoAspect->Aspect()->Values(aColor, aType, aWidth);
556 Handle(Prs3d_IsoAspect) aResult =
557 new Prs3d_IsoAspect(aColor, aType, aWidth, theNbIsos);
562 //==============================================================================
564 //purpose : Returns or sets the number of U- and V- isos and isIsoOnPlane flag
565 //Draw arg : [name1 ...] [nbUIsos nbVIsos IsoOnPlane(0|1)]
566 //==============================================================================
567 static int visos (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
569 if (TheAISContext().IsNull()) {
570 di << argv[0] << " Call 'vinit' before!\n";
575 di << "Current number of isos : " <<
576 TheAISContext()->IsoNumber(AIS_TOI_IsoU) << " " <<
577 TheAISContext()->IsoNumber(AIS_TOI_IsoV) << "\n";
578 di << "IsoOnPlane mode is " <<
579 (TheAISContext()->IsoOnPlane() ? "ON" : "OFF") << "\n";
584 Standard_Integer aLastInd = argc - 1;
585 Standard_Boolean isChanged = Standard_False;
586 Standard_Integer aNbUIsos = 0;
587 Standard_Integer aNbVIsos = 0;
590 Standard_Boolean isIsoOnPlane = Standard_False;
592 if (strcmp(argv[aLastInd], "1") == 0) {
593 isIsoOnPlane = Standard_True;
594 isChanged = Standard_True;
595 } else if (strcmp(argv[aLastInd], "0") == 0) {
596 isIsoOnPlane = Standard_False;
597 isChanged = Standard_True;
601 aNbVIsos = Draw::Atoi(argv[aLastInd - 1]);
602 aNbUIsos = Draw::Atoi(argv[aLastInd - 2]);
605 di << "New number of isos : " << aNbUIsos << " " << aNbVIsos << "\n";
606 di << "New IsoOnPlane mode is " << (isIsoOnPlane ? "ON" : "OFF") << "\n";
608 TheAISContext()->IsoOnPlane(isIsoOnPlane);
611 // If there are no shapes provided set the default numbers.
612 TheAISContext()->SetIsoNumber(aNbUIsos, AIS_TOI_IsoU);
613 TheAISContext()->SetIsoNumber(aNbVIsos, AIS_TOI_IsoV);
620 for (i = 1; i <= aLastInd; i++) {
621 TCollection_AsciiString name(argv[i]);
622 Standard_Boolean IsBound = GetMapOfAIS().IsBound2(name);
625 const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2(name);
626 if (anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject))) {
627 const Handle(AIS_InteractiveObject) aShape =
628 Handle(AIS_InteractiveObject)::DownCast (anObj);
629 Handle(AIS_Drawer) CurDrawer = aShape->Attributes();
630 Handle(Prs3d_IsoAspect) aUIso = CurDrawer->UIsoAspect();
631 Handle(Prs3d_IsoAspect) aVIso = CurDrawer->VIsoAspect();
634 CurDrawer->SetUIsoAspect(CopyIsoAspect(aUIso, aNbUIsos));
635 CurDrawer->SetVIsoAspect(CopyIsoAspect(aVIso, aNbVIsos));
636 TheAISContext()->SetLocalAttributes
637 (aShape, CurDrawer, Standard_False);
638 TheAISContext()->Redisplay(aShape);
640 di << "Number of isos for " << argv[i] << " : "
641 << aUIso->Number() << " " << aVIso->Number() << "\n";
644 di << argv[i] << ": Not an AIS interactive object!\n";
647 di << argv[i] << ": Use 'vdisplay' before\n";
652 TheAISContext()->UpdateCurrentViewer();
658 //==============================================================================
659 //function : VDispAreas,VDispSensitive,...
661 //==============================================================================
662 static Standard_Integer VDispAreas (Draw_Interpretor& ,
663 Standard_Integer theArgNb,
668 std::cout << "Error: wrong syntax!\n";
672 Handle(AIS_InteractiveContext) aCtx;
673 Handle(V3d_View) aView;
674 if (!getCtxAndView (aCtx, aView))
679 aCtx->DisplayActiveAreas (aView);
682 static Standard_Integer VClearAreas (Draw_Interpretor& ,
683 Standard_Integer theArgNb,
688 std::cout << "Error: wrong syntax!\n";
692 Handle(AIS_InteractiveContext) aCtx;
693 Handle(V3d_View) aView;
694 if (!getCtxAndView (aCtx, aView))
699 aCtx->ClearActiveAreas (aView);
703 static Standard_Integer VDispSensi (Draw_Interpretor& ,
704 Standard_Integer theArgNb,
709 std::cout << "Error: wrong syntax!\n";
713 Handle(AIS_InteractiveContext) aCtx;
714 Handle(V3d_View) aView;
715 if (!getCtxAndView (aCtx, aView))
720 aCtx->DisplayActiveSensitive (aView);
725 static Standard_Integer VClearSensi (Draw_Interpretor& ,
726 Standard_Integer theArgNb,
731 std::cout << "Error: wrong syntax!\n";
735 Handle(AIS_InteractiveContext) aCtx;
736 Handle(V3d_View) aView;
737 if (!getCtxAndView (aCtx, aView))
741 aCtx->ClearActiveSensitive (aView);
745 //==============================================================================
747 //purpose : To list the displayed object with their attributes
748 //==============================================================================
749 static int VDir (Draw_Interpretor& theDI,
753 if (!a3DView().IsNull())
758 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
759 anIter.More(); anIter.Next())
761 theDI << "\t" << anIter.Key2().ToCString() << "\n";
766 //==============================================================================
767 //function : VSelPrecision
768 //purpose : To set the selection precision mode and tolerance value
769 //Draw arg : Selection precision mode (0 for window, 1 for view) and tolerance
770 // value (integer number of pixel for window mode, double value of
771 // sensitivity for view mode). Without arguments the function just
772 // prints the current precision mode and the corresponding tolerance.
773 //==============================================================================
774 static int VSelPrecision(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
778 di << "Use: " << argv[0] << " [precision_mode [tolerance_value]]\n";
782 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
783 if( aContext.IsNull() )
788 StdSelect_SensitivityMode aMode = aContext->SensitivityMode();
789 if( aMode == StdSelect_SM_WINDOW )
791 Standard_Integer aPixelTolerance = aContext->PixelTolerance();
792 di << "Precision mode : 0 (window)\n";
793 di << "Pixel tolerance : " << aPixelTolerance << "\n";
795 else if( aMode == StdSelect_SM_VIEW )
797 Standard_Real aSensitivity = aContext->Sensitivity();
798 di << "Precision mode : 1 (view)\n";
799 di << "Sensitivity : " << aSensitivity << "\n";
804 StdSelect_SensitivityMode aMode = ( StdSelect_SensitivityMode )Draw::Atoi( argv[1] );
805 aContext->SetSensitivityMode( aMode );
808 if( aMode == StdSelect_SM_WINDOW )
810 Standard_Integer aPixelTolerance = Draw::Atoi( argv[2] );
811 aContext->SetPixelTolerance( aPixelTolerance );
813 else if( aMode == StdSelect_SM_VIEW )
815 Standard_Real aSensitivity = Draw::Atof( argv[2] );
816 aContext->SetSensitivity( aSensitivity );
823 //==============================================================================
825 //purpose : To dump the active view snapshot to image file
826 //==============================================================================
827 static Standard_Integer VDump (Draw_Interpretor& theDI,
828 Standard_Integer theArgNb,
829 Standard_CString* theArgVec)
833 std::cout << "Error: wrong number of arguments! Image file name should be specified at least.\n";
837 Standard_Integer anArgIter = 1;
838 Standard_CString aFilePath = theArgVec[anArgIter++];
839 Graphic3d_BufferType aBufferType = Graphic3d_BT_RGB;
840 V3d_StereoDumpOptions aStereoOpts = V3d_SDO_MONO;
841 Standard_Integer aWidth = 0;
842 Standard_Integer aHeight = 0;
843 for (; anArgIter < theArgNb; ++anArgIter)
845 TCollection_AsciiString anArg (theArgVec[anArgIter]);
849 aBufferType = Graphic3d_BT_RGBA;
851 else if (anArg == "rgb")
853 aBufferType = Graphic3d_BT_RGB;
855 else if (anArg == "depth")
857 aBufferType = Graphic3d_BT_Depth;
859 else if (anArg == "l"
862 aStereoOpts = V3d_SDO_LEFT_EYE;
864 else if (anArg == "r"
867 aStereoOpts = V3d_SDO_RIGHT_EYE;
869 else if (anArg == "mono")
871 aStereoOpts = V3d_SDO_MONO;
873 else if (anArg == "w"
878 std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
881 else if (++anArgIter >= theArgNb)
883 std::cout << "Error: integer value is expected right after 'width'\n";
886 aWidth = Draw::Atoi (theArgVec[anArgIter]);
888 else if (anArg == "h"
889 || anArg == "height")
893 std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
896 if (++anArgIter >= theArgNb)
898 std::cout << "Error: integer value is expected right after 'height'\n";
901 aHeight = Draw::Atoi (theArgVec[anArgIter]);
903 else if (anArg.IsIntegerValue())
905 // compatibility with old syntax
909 std::cout << "Error: wrong syntax at " << theArgVec[anArgIter] << "\n";
912 else if (++anArgIter >= theArgNb)
914 std::cout << "Error: height value is expected right after width\n";
917 aWidth = Draw::Atoi (theArgVec[anArgIter - 1]);
918 aHeight = Draw::Atoi (theArgVec[anArgIter]);
922 std::cout << "Error: unknown argument '" << theArgVec[anArgIter] << "'\n";
926 if ((aWidth <= 0 && aHeight > 0)
927 || (aWidth > 0 && aHeight <= 0))
929 std::cout << "Error: dimensions " << aWidth << "x" << aHeight << " are incorrect\n";
933 Handle(V3d_View) aView = ViewerTest::CurrentView();
936 std::cout << "Error: cannot find an active view!\n";
940 if (aWidth <= 0 || aHeight <= 0)
942 if (aStereoOpts != V3d_SDO_MONO)
944 aView->Window()->Size (aWidth, aHeight);
948 if (!aView->Dump (aFilePath, aBufferType))
950 theDI << "Fail: view dump failed!\n";
956 Image_AlienPixMap aPixMap;
957 if (!aView->ToPixMap (aPixMap, aWidth, aHeight, aBufferType, Standard_True, aStereoOpts))
959 theDI << "Fail: view dump failed!\n";
963 if (aPixMap.SizeX() != Standard_Size(aWidth)
964 || aPixMap.SizeY() != Standard_Size(aHeight))
966 theDI << "Fail: dumped dimensions " << (Standard_Integer )aPixMap.SizeX() << "x" << (Standard_Integer )aPixMap.SizeY()
967 << " are lesser than requested " << aWidth << "x" << aHeight << "\n";
969 if (!aPixMap.Save (aFilePath))
971 theDI << "Fail: image can not be saved!\n";
977 //==============================================================================
978 //function : Displays,Erase...
981 //==============================================================================
982 static int VwrTst_DispErase(const Handle(AIS_InteractiveObject)& IO,
983 const Standard_Integer Mode,
984 const Standard_Integer TypeOfOperation,
985 const Standard_Boolean Upd)
987 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
989 switch(TypeOfOperation){
991 Ctx->Display(IO,Mode,Upd);
999 Ctx->SetDisplayMode((AIS_DisplayMode)Mode,Upd);
1001 Ctx->SetDisplayMode(IO,Mode,Upd);
1006 Ctx->SetDisplayMode(0,Upd);
1008 Ctx->UnsetDisplayMode(IO,Upd);
1015 //=======================================================================
1018 //=======================================================================
1019 static int VDispMode (Draw_Interpretor& , Standard_Integer argc, const char** argv)
1022 TCollection_AsciiString name;
1025 // display others presentations
1026 Standard_Integer TypeOfOperation = (strcasecmp(argv[0],"vdispmode")==0)? 1:
1027 (strcasecmp(argv[0],"verasemode")==0) ? 2 :
1028 (strcasecmp(argv[0],"vsetdispmode")==0) ? 3 :
1029 (strcasecmp(argv[0],"vunsetdispmode")==0) ? 4 : -1;
1031 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
1033 //unset displaymode.. comportement particulier...
1034 if(TypeOfOperation==4){
1036 if(Ctx->NbCurrents()==0 ||
1037 Ctx->NbSelected()==0){
1038 Handle(AIS_InteractiveObject) IO;
1039 VwrTst_DispErase(IO,-1,4,Standard_False);
1041 else if(!Ctx->HasOpenedContext()){
1042 for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
1043 VwrTst_DispErase(Ctx->Current(),-1,4,Standard_False);
1046 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1047 VwrTst_DispErase(Ctx->Interactive(),-1,4,Standard_False);}
1048 Ctx->UpdateCurrentViewer();
1051 Handle(AIS_InteractiveObject) IO;
1053 if(GetMapOfAIS().IsBound2(name)){
1054 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1056 VwrTst_DispErase(IO,-1,4,Standard_True);
1061 Standard_Integer Dmode = Draw::Atoi(argv[1]);
1062 if(Ctx->NbCurrents()==0 && TypeOfOperation==3){
1063 Handle(AIS_InteractiveObject) IO;
1064 VwrTst_DispErase(IO,Dmode,TypeOfOperation,Standard_True);
1066 if(!Ctx->HasOpenedContext()){
1067 // set/unset display mode sur le Contexte...
1068 for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
1069 VwrTst_DispErase(Ctx->Current(),Dmode,TypeOfOperation,Standard_False);
1071 Ctx->UpdateCurrentViewer();
1074 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
1075 Ctx->Display(Ctx->Interactive(),Dmode);
1079 Handle(AIS_InteractiveObject) IO;
1081 if(GetMapOfAIS().IsBound2(name))
1082 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1084 VwrTst_DispErase(IO,Draw::Atoi(argv[2]),TypeOfOperation,Standard_True);
1090 //=======================================================================
1093 //=======================================================================
1094 static int VSubInt(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1096 if(argc==1) return 1;
1097 Standard_Integer On = Draw::Atoi(argv[1]);
1098 const Handle(AIS_InteractiveContext)& Ctx = ViewerTest::GetAISContext();
1102 if(!Ctx->HasOpenedContext()){
1103 di<<"sub intensite ";
1106 di<<" pour "<<Ctx->NbCurrents()<<" objets"<<"\n";
1107 for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
1109 Ctx->SubIntensityOn(Ctx->Current(),Standard_False);}
1111 di <<"passage dans off"<<"\n";
1112 Ctx->SubIntensityOff(Ctx->Current(),Standard_False);
1117 for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()){
1119 Ctx->SubIntensityOn(Ctx->Interactive(),Standard_False);}
1121 Ctx->SubIntensityOff(Ctx->Interactive(),Standard_False);}
1124 Ctx->UpdateCurrentViewer();
1127 Handle(AIS_InteractiveObject) IO;
1128 TCollection_AsciiString name = argv[2];
1129 if(GetMapOfAIS().IsBound2(name)){
1130 IO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
1133 Ctx->SubIntensityOn(IO);
1135 Ctx->SubIntensityOff(IO);
1143 //! Auxiliary class to iterate presentations from different collections.
1144 class ViewTest_PrsIter
1148 //! Create and initialize iterator object.
1149 ViewTest_PrsIter (const TCollection_AsciiString& theName)
1150 : mySource (IterSource_All)
1152 NCollection_Sequence<TCollection_AsciiString> aNames;
1153 if (!theName.IsEmpty())
1154 aNames.Append (theName);
1158 //! Create and initialize iterator object.
1159 ViewTest_PrsIter (const NCollection_Sequence<TCollection_AsciiString>& theNames)
1160 : mySource (IterSource_All)
1165 //! Initialize the iterator.
1166 void Init (const NCollection_Sequence<TCollection_AsciiString>& theNames)
1168 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
1170 mySelIter.Nullify();
1171 myCurrent.Nullify();
1172 myCurrentTrs.Nullify();
1173 if (!mySeq.IsEmpty())
1175 mySource = IterSource_List;
1176 mySeqIter = NCollection_Sequence<TCollection_AsciiString>::Iterator (mySeq);
1178 else if (aCtx->NbCurrents() > 0)
1180 mySource = IterSource_Selected;
1182 mySelIter->InitCurrent();
1186 mySource = IterSource_All;
1187 myMapIter.Initialize (GetMapOfAIS());
1192 const TCollection_AsciiString& CurrentName() const
1194 return myCurrentName;
1197 const Handle(AIS_InteractiveObject)& Current() const
1202 const Handle(Standard_Transient)& CurrentTrs() const
1204 return myCurrentTrs;
1207 //! @return true if iterator points to valid object within collection
1208 Standard_Boolean More() const
1212 case IterSource_All: return myMapIter.More();
1213 case IterSource_List: return mySeqIter.More();
1214 case IterSource_Selected: return mySelIter->MoreCurrent();
1216 return Standard_False;
1219 //! Go to the next item.
1222 myCurrentName.Clear();
1223 myCurrentTrs.Nullify();
1224 myCurrent.Nullify();
1227 case IterSource_All:
1232 case IterSource_List:
1237 case IterSource_Selected:
1239 mySelIter->NextCurrent();
1252 case IterSource_All:
1254 if (myMapIter.More())
1256 myCurrentName = myMapIter.Key2();
1257 myCurrentTrs = myMapIter.Key1();
1258 myCurrent = Handle(AIS_InteractiveObject)::DownCast (myCurrentTrs);
1262 case IterSource_List:
1264 if (mySeqIter.More())
1266 if (!GetMapOfAIS().IsBound2 (mySeqIter.Value()))
1268 std::cout << "Error: object " << mySeqIter.Value() << " is not displayed!\n";
1271 myCurrentName = mySeqIter.Value();
1272 myCurrentTrs = GetMapOfAIS().Find2 (mySeqIter.Value());
1273 myCurrent = Handle(AIS_InteractiveObject)::DownCast (myCurrentTrs);
1277 case IterSource_Selected:
1279 if (mySelIter->MoreCurrent())
1281 myCurrentName = GetMapOfAIS().Find1 (mySelIter->Current());
1282 myCurrent = mySelIter->Current();
1300 Handle(AIS_InteractiveContext) mySelIter; //!< iterator for current (selected) objects (IterSource_Selected)
1301 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName myMapIter; //!< iterator for map of all objects (IterSource_All)
1302 NCollection_Sequence<TCollection_AsciiString> mySeq;
1303 NCollection_Sequence<TCollection_AsciiString>::Iterator mySeqIter;
1305 TCollection_AsciiString myCurrentName;//!< current item name
1306 Handle(Standard_Transient) myCurrentTrs; //!< current item (as transient object)
1307 Handle(AIS_InteractiveObject) myCurrent; //!< current item
1309 IterSource mySource; //!< iterated collection
1313 //==============================================================================
1314 //function : VInteriorStyle
1315 //purpose : sets interior style of the a selected or named or displayed shape
1316 //==============================================================================
1317 static int VSetInteriorStyle (Draw_Interpretor& theDI,
1318 Standard_Integer theArgNb,
1319 const char** theArgVec)
1321 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1324 std::cerr << "Error: no active view!\n";
1328 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
1329 Standard_Integer anArgIter = 1;
1330 for (; anArgIter < theArgNb; ++anArgIter)
1332 if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
1337 TCollection_AsciiString aName;
1338 if (theArgNb - anArgIter == 2)
1340 aName = theArgVec[anArgIter++];
1342 else if (theArgNb - anArgIter != 1)
1344 std::cout << "Error: wrong number of arguments! See usage:\n";
1345 theDI.PrintHelp (theArgVec[0]);
1348 Standard_Integer anInterStyle = Aspect_IS_SOLID;
1349 TCollection_AsciiString aStyleArg (theArgVec[anArgIter++]);
1350 aStyleArg.LowerCase();
1351 if (aStyleArg == "empty")
1355 else if (aStyleArg == "hollow")
1359 else if (aStyleArg == "hatch")
1363 else if (aStyleArg == "solid")
1367 else if (aStyleArg == "hiddenline")
1373 anInterStyle = aStyleArg.IntegerValue();
1375 if (anInterStyle < Aspect_IS_EMPTY
1376 || anInterStyle > Aspect_IS_HIDDENLINE)
1378 std::cout << "Error: style must be within a range [0 (Aspect_IS_EMPTY), "
1379 << Aspect_IS_HIDDENLINE << " (Aspect_IS_HIDDENLINE)]\n";
1383 if (!aName.IsEmpty()
1384 && !GetMapOfAIS().IsBound2 (aName))
1386 std::cout << "Error: object " << aName << " is not displayed!\n";
1390 if (aCtx->HasOpenedContext())
1392 aCtx->CloseLocalContext();
1394 for (ViewTest_PrsIter anIter (aName); anIter.More(); anIter.Next())
1396 const Handle(AIS_InteractiveObject)& anIO = anIter.Current();
1399 const Handle(Prs3d_Drawer)& aDrawer = anIO->Attributes();
1400 Handle(Prs3d_ShadingAspect) aShadingAspect = aDrawer->ShadingAspect();
1401 Handle(Graphic3d_AspectFillArea3d) aFillAspect = aShadingAspect->Aspect();
1402 aFillAspect->SetInteriorStyle ((Aspect_InteriorStyle )anInterStyle);
1403 aCtx->RecomputePrsOnly (anIO, Standard_False, Standard_True);
1407 // update the screen and redraw the view
1408 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
1409 a3DView()->SetImmediateUpdate (isAutoUpdate);
1410 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
1411 || aToUpdate == ViewerTest_RM_RedrawForce)
1413 TheAISContext()->UpdateCurrentViewer();
1418 //! Auxiliary structure for VAspects
1419 struct ViewerTest_AspectsChangeSet
1421 Standard_Integer ToSetColor;
1422 Quantity_Color Color;
1424 Standard_Integer ToSetLineWidth;
1425 Standard_Real LineWidth;
1427 Standard_Integer ToSetTransparency;
1428 Standard_Real Transparency;
1430 Standard_Integer ToSetMaterial;
1431 Graphic3d_NameOfMaterial Material;
1432 TCollection_AsciiString MatName;
1434 NCollection_Sequence<TopoDS_Shape> SubShapes;
1436 //! Empty constructor
1437 ViewerTest_AspectsChangeSet()
1439 Color (DEFAULT_COLOR),
1442 ToSetTransparency (0),
1445 Material (Graphic3d_NOM_DEFAULT) {}
1447 //! @return true if no changes have been requested
1448 Standard_Boolean IsEmpty() const
1450 return ToSetLineWidth == 0
1451 && ToSetTransparency == 0
1453 && ToSetMaterial == 0;
1456 //! @return true if properties are valid
1457 Standard_Boolean Validate (const Standard_Boolean theIsSubPart) const
1459 Standard_Boolean isOk = Standard_True;
1460 if (LineWidth <= 0.0
1461 || LineWidth > 10.0)
1463 std::cout << "Error: the width should be within [1; 10] range (specified " << LineWidth << ")\n";
1464 isOk = Standard_False;
1466 if (Transparency < 0.0
1467 || Transparency > 1.0)
1469 std::cout << "Error: the transparency should be within [0; 1] range (specified " << Transparency << ")\n";
1470 isOk = Standard_False;
1473 && ToSetTransparency)
1475 std::cout << "Error: the transparency can not be defined for sub-part of object!\n";
1476 isOk = Standard_False;
1478 if (ToSetMaterial == 1
1479 && Material == Graphic3d_NOM_DEFAULT)
1481 std::cout << "Error: unknown material " << MatName << ".\n";
1482 isOk = Standard_False;
1489 //==============================================================================
1490 //function : VAspects
1492 //==============================================================================
1493 static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
1494 Standard_Integer theArgNb,
1495 const char** theArgVec)
1497 TCollection_AsciiString aCmdName (theArgVec[0]);
1498 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1501 std::cerr << "Error: no active view!\n";
1505 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
1506 Standard_Integer anArgIter = 1;
1507 NCollection_Sequence<TCollection_AsciiString> aNames;
1508 for (; anArgIter < theArgNb; ++anArgIter)
1510 TCollection_AsciiString anArg = theArgVec[anArgIter];
1511 if (parseRedrawMode (anArg, aToUpdate))
1515 else if (!anArg.IsEmpty()
1516 && anArg.Value (1) != '-')
1518 aNames.Append (anArg);
1526 NCollection_Sequence<ViewerTest_AspectsChangeSet> aChanges;
1527 aChanges.Append (ViewerTest_AspectsChangeSet());
1528 ViewerTest_AspectsChangeSet* aChangeSet = &aChanges.ChangeLast();
1530 // parse syntax of legacy commands
1531 if (aCmdName == "vsetwidth")
1533 if (aNames.IsEmpty()
1534 || !aNames.Last().IsRealValue())
1536 std::cout << "Error: not enough arguments!\n";
1539 aChangeSet->ToSetLineWidth = 1;
1540 aChangeSet->LineWidth = aNames.Last().RealValue();
1541 aNames.Remove (aNames.Length());
1543 else if (aCmdName == "vunsetwidth")
1545 aChangeSet->ToSetLineWidth = -1;
1547 else if (aCmdName == "vsetcolor")
1549 if (aNames.IsEmpty())
1551 std::cout << "Error: not enough arguments!\n";
1554 aChangeSet->ToSetColor = 1;
1555 aChangeSet->Color = ViewerTest::GetColorFromName (aNames.Last().ToCString());
1556 aNames.Remove (aNames.Length());
1558 else if (aCmdName == "vunsetcolor")
1560 aChangeSet->ToSetColor = -1;
1562 else if (aCmdName == "vsettransparency")
1564 if (aNames.IsEmpty()
1565 || !aNames.Last().IsRealValue())
1567 std::cout << "Error: not enough arguments!\n";
1570 aChangeSet->ToSetTransparency = 1;
1571 aChangeSet->Transparency = aNames.Last().RealValue();
1572 aNames.Remove (aNames.Length());
1574 else if (aCmdName == "vunsettransparency")
1576 aChangeSet->ToSetTransparency = -1;
1578 else if (aCmdName == "vsetmaterial")
1580 if (aNames.IsEmpty())
1582 std::cout << "Error: not enough arguments!\n";
1585 aChangeSet->ToSetMaterial = 1;
1586 aChangeSet->MatName = aNames.Last();
1587 aChangeSet->Material = Graphic3d_MaterialAspect::MaterialFromName (aChangeSet->MatName.ToCString());
1588 aNames.Remove (aNames.Length());
1590 else if (aCmdName == "vunsetmaterial")
1592 aChangeSet->ToSetMaterial = -1;
1594 else if (anArgIter >= theArgNb)
1596 std::cout << "Error: not enough arguments!\n";
1600 if (!aChangeSet->IsEmpty())
1602 anArgIter = theArgNb;
1604 for (; anArgIter < theArgNb; ++anArgIter)
1606 TCollection_AsciiString anArg = theArgVec[anArgIter];
1608 if (anArg == "-setwidth"
1609 || anArg == "-setlinewidth")
1611 if (++anArgIter >= theArgNb)
1613 std::cout << "Error: wrong syntax at " << anArg << "\n";
1616 aChangeSet->ToSetLineWidth = 1;
1617 aChangeSet->LineWidth = Draw::Atof (theArgVec[anArgIter]);
1619 else if (anArg == "-unsetwidth"
1620 || anArg == "-unsetlinewidth")
1622 aChangeSet->ToSetLineWidth = -1;
1623 aChangeSet->LineWidth = 1.0;
1625 else if (anArg == "-settransp"
1626 || anArg == "-settransparency")
1628 if (++anArgIter >= theArgNb)
1630 std::cout << "Error: wrong syntax at " << anArg << "\n";
1633 aChangeSet->ToSetTransparency = 1;
1634 aChangeSet->Transparency = Draw::Atof (theArgVec[anArgIter]);
1635 if (aChangeSet->Transparency >= 0.0
1636 && aChangeSet->Transparency <= Precision::Confusion())
1638 aChangeSet->ToSetTransparency = -1;
1639 aChangeSet->Transparency = 0.0;
1642 else if (anArg == "-setalpha")
1644 if (++anArgIter >= theArgNb)
1646 std::cout << "Error: wrong syntax at " << anArg << "\n";
1649 aChangeSet->ToSetTransparency = 1;
1650 aChangeSet->Transparency = Draw::Atof (theArgVec[anArgIter]);
1651 if (aChangeSet->Transparency < 0.0
1652 || aChangeSet->Transparency > 1.0)
1654 std::cout << "Error: the transparency should be within [0; 1] range (specified " << aChangeSet->Transparency << ")\n";
1657 aChangeSet->Transparency = 1.0 - aChangeSet->Transparency;
1658 if (aChangeSet->Transparency >= 0.0
1659 && aChangeSet->Transparency <= Precision::Confusion())
1661 aChangeSet->ToSetTransparency = -1;
1662 aChangeSet->Transparency = 0.0;
1665 else if (anArg == "-unsettransp"
1666 || anArg == "-unsettransparency"
1667 || anArg == "-unsetalpha"
1668 || anArg == "-opaque")
1670 aChangeSet->ToSetTransparency = -1;
1671 aChangeSet->Transparency = 0.0;
1673 else if (anArg == "-setcolor")
1675 if (++anArgIter >= theArgNb)
1677 std::cout << "Error: wrong syntax at " << anArg << "\n";
1680 aChangeSet->ToSetColor = 1;
1681 aChangeSet->Color = ViewerTest::GetColorFromName (theArgVec[anArgIter]);
1683 else if (anArg == "-unsetcolor")
1685 aChangeSet->ToSetColor = -1;
1686 aChangeSet->Color = DEFAULT_COLOR;
1688 else if (anArg == "-setmat"
1689 || anArg == "-setmaterial")
1691 if (++anArgIter >= theArgNb)
1693 std::cout << "Error: wrong syntax at " << anArg << "\n";
1696 aChangeSet->ToSetMaterial = 1;
1697 aChangeSet->MatName = theArgVec[anArgIter];
1698 aChangeSet->Material = Graphic3d_MaterialAspect::MaterialFromName (aChangeSet->MatName.ToCString());
1700 else if (anArg == "-unsetmat"
1701 || anArg == "-unsetmaterial")
1703 aChangeSet->ToSetMaterial = -1;
1704 aChangeSet->Material = Graphic3d_NOM_DEFAULT;
1706 else if (anArg == "-subshape"
1707 || anArg == "-subshapes")
1709 if (aNames.IsEmpty())
1711 std::cout << "Error: main objects should specified explicitly when -subshapes is used!\n";
1715 aChanges.Append (ViewerTest_AspectsChangeSet());
1716 aChangeSet = &aChanges.ChangeLast();
1718 for (++anArgIter; anArgIter < theArgNb; ++anArgIter)
1720 Standard_CString aSubShapeName = theArgVec[anArgIter];
1721 if (*aSubShapeName == '-')
1727 TopoDS_Shape aSubShape = DBRep::Get (aSubShapeName);
1728 if (aSubShape.IsNull())
1730 std::cerr << "Error: shape " << aSubShapeName << " doesn't found!\n";
1733 aChangeSet->SubShapes.Append (aSubShape);
1736 if (aChangeSet->SubShapes.IsEmpty())
1738 std::cerr << "Error: empty list is specified after -subshapes!\n";
1742 else if (anArg == "-unset")
1744 aChangeSet->ToSetLineWidth = -1;
1745 aChangeSet->LineWidth = 1.0;
1746 aChangeSet->ToSetTransparency = -1;
1747 aChangeSet->Transparency = 0.0;
1748 aChangeSet->ToSetColor = -1;
1749 aChangeSet->Color = DEFAULT_COLOR;
1750 aChangeSet->ToSetMaterial = -1;
1751 aChangeSet->Material = Graphic3d_NOM_DEFAULT;
1755 std::cout << "Error: wrong syntax at " << anArg << "\n";
1760 Standard_Boolean isFirst = Standard_True;
1761 for (NCollection_Sequence<ViewerTest_AspectsChangeSet>::Iterator aChangesIter (aChanges);
1762 aChangesIter.More(); aChangesIter.Next())
1764 if (!aChangesIter.Value().Validate (!isFirst))
1768 isFirst = Standard_False;
1771 if (aCtx->HasOpenedContext())
1773 aCtx->CloseLocalContext();
1775 for (ViewTest_PrsIter aPrsIter (aNames); aPrsIter.More(); aPrsIter.Next())
1777 const TCollection_AsciiString& aName = aPrsIter.CurrentName();
1778 Handle(AIS_InteractiveObject) aPrs = aPrsIter.Current();
1779 Handle(AIS_ColoredShape) aColoredPrs;
1780 Standard_Boolean toDisplay = Standard_False;
1781 if (aChanges.Length() > 1)
1783 Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast (aPrs);
1784 if (aShapePrs.IsNull())
1786 std::cout << "Error: an object " << aName << " is not an AIS_Shape presentation!\n";
1789 aColoredPrs = Handle(AIS_ColoredShape)::DownCast (aShapePrs);
1790 if (aColoredPrs.IsNull())
1792 aColoredPrs = new AIS_ColoredShape (aShapePrs);
1793 aCtx->Remove (aShapePrs, Standard_False);
1794 GetMapOfAIS().UnBind2 (aName);
1795 GetMapOfAIS().Bind (aColoredPrs, aName);
1796 toDisplay = Standard_True;
1797 aShapePrs = aColoredPrs;
1804 NCollection_Sequence<ViewerTest_AspectsChangeSet>::Iterator aChangesIter (aChanges);
1805 aChangeSet = &aChangesIter.ChangeValue();
1806 if (aChangeSet->ToSetMaterial == 1)
1808 aCtx->SetMaterial (aPrs, aChangeSet->Material, Standard_False);
1810 else if (aChangeSet->ToSetMaterial == -1)
1812 aCtx->UnsetMaterial (aPrs, Standard_False);
1814 if (aChangeSet->ToSetColor == 1)
1816 aCtx->SetColor (aPrs, aChangeSet->Color, Standard_False);
1818 else if (aChangeSet->ToSetColor == -1)
1820 aCtx->UnsetColor (aPrs, Standard_False);
1822 if (aChangeSet->ToSetTransparency == 1)
1824 aCtx->SetTransparency (aPrs, aChangeSet->Transparency, Standard_False);
1826 else if (aChangeSet->ToSetTransparency == -1)
1828 aCtx->UnsetTransparency (aPrs, Standard_False);
1830 if (aChangeSet->ToSetLineWidth == 1)
1832 aCtx->SetWidth (aPrs, aChangeSet->LineWidth, Standard_False);
1834 else if (aChangeSet->ToSetLineWidth == -1)
1836 aCtx->UnsetWidth (aPrs, Standard_False);
1839 for (aChangesIter.Next(); aChangesIter.More(); aChangesIter.Next())
1841 aChangeSet = &aChangesIter.ChangeValue();
1842 for (NCollection_Sequence<TopoDS_Shape>::Iterator aSubShapeIter (aChangeSet->SubShapes);
1843 aSubShapeIter.More(); aSubShapeIter.Next())
1845 const TopoDS_Shape& aSubShape = aSubShapeIter.Value();
1846 if (aChangeSet->ToSetColor == 1)
1848 aColoredPrs->SetCustomColor (aSubShape, aChangeSet->Color);
1850 if (aChangeSet->ToSetLineWidth == 1)
1852 aColoredPrs->SetCustomWidth (aSubShape, aChangeSet->LineWidth);
1854 if (aChangeSet->ToSetColor == -1
1855 || aChangeSet->ToSetLineWidth == -1)
1857 aColoredPrs->UnsetCustomAspects (aSubShape, Standard_True);
1863 aCtx->Display (aPrs, Standard_False);
1865 else if (!aColoredPrs.IsNull())
1867 aColoredPrs->Redisplay();
1872 Handle(NIS_InteractiveObject) aNisObj = Handle(NIS_InteractiveObject)::DownCast (aPrsIter.CurrentTrs());
1873 Handle(NIS_Triangulated) aNisTri = Handle(NIS_Triangulated)::DownCast (aNisObj);
1874 if (!aNisObj.IsNull())
1876 if (aChangeSet->ToSetTransparency != 0)
1878 aNisObj->SetTransparency (aChangeSet->Transparency);
1881 if (!aNisTri.IsNull())
1883 if (aChangeSet->ToSetColor != 0)
1885 aNisTri->SetColor (aChangeSet->Color);
1887 if (aChangeSet->ToSetLineWidth != 0)
1889 aNisTri->SetLineWidth (aChangeSet->LineWidth);
1895 // update the screen and redraw the view
1896 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
1897 a3DView()->SetImmediateUpdate (isAutoUpdate);
1898 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
1899 || aToUpdate == ViewerTest_RM_RedrawForce)
1901 TheAISContext()->UpdateCurrentViewer();
1906 //==============================================================================
1907 //function : VDonly2
1909 //purpose : Display only a selected or named object
1910 // if there is no selected or named object s, nothing is done
1911 //==============================================================================
1912 static int VDonly2 (Draw_Interpretor& ,
1913 Standard_Integer theArgNb,
1914 const char** theArgVec)
1916 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
1919 std::cerr << "Error: no active view!\n";
1923 if (aCtx->HasOpenedContext())
1925 aCtx->CloseLocalContext();
1927 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
1929 Standard_Integer anArgIter = 1;
1930 for (; anArgIter < theArgNb; ++anArgIter)
1932 if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
1938 NCollection_Map<Handle(Standard_Transient)> aDispSet;
1939 if (anArgIter >= theArgNb)
1941 // display only selected objects
1942 if (aCtx->NbCurrents() < 1)
1947 for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
1949 aDispSet.Add (aCtx->Current());
1954 // display only specified objects
1955 for (; anArgIter < theArgNb; ++anArgIter)
1957 TCollection_AsciiString aName = theArgVec[anArgIter];
1958 if (GetMapOfAIS().IsBound2 (aName))
1960 const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
1961 if (anObj->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
1963 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anObj);
1964 aCtx->Display (aShape, Standard_False);
1966 else if (anObj->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
1968 Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anObj);
1969 TheNISContext()->Display (aShape);
1971 aDispSet.Add (anObj);
1976 // weed out other objects
1977 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS()); anIter.More(); anIter.Next())
1979 if (aDispSet.Contains (anIter.Key1()))
1984 if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
1986 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
1987 aCtx->Erase (aShape, Standard_False);
1989 else if (anIter.Key1()->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
1991 const Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
1992 TheNISContext()->Erase (aShape);
1996 // update the screen and redraw the view
1997 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
1998 a3DView()->SetImmediateUpdate (isAutoUpdate);
1999 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2000 || aToUpdate == ViewerTest_RM_RedrawForce)
2002 TheAISContext()->UpdateCurrentViewer();
2008 //==============================================================================
2009 //function : VRemove
2010 //purpose : Removes selected or named objects.
2011 // If there is no selected or named objects,
2012 // all objects in the viewer can be removed with argument -all.
2013 // If -context is in arguments, the object is not deleted from the map of
2014 // objects (deleted only from the current context).
2015 //==============================================================================
2016 int VRemove (Draw_Interpretor& theDI,
2017 Standard_Integer theArgNb,
2018 const char** theArgVec)
2020 if (a3DView().IsNull())
2022 std::cout << "Error: wrong syntax!\n";
2026 TheAISContext()->CloseAllContexts (Standard_False);
2028 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2029 Standard_Boolean isContextOnly = Standard_False;
2030 Standard_Boolean toRemoveAll = Standard_False;
2031 Standard_Boolean toPrintInfo = Standard_True;
2033 Standard_Integer anArgIter = 1;
2034 for (; anArgIter < theArgNb; ++anArgIter)
2036 TCollection_AsciiString anArg = theArgVec[anArgIter];
2038 if (anArg == "-context")
2040 isContextOnly = Standard_True;
2042 else if (anArg == "-all")
2044 toRemoveAll = Standard_True;
2046 else if (anArg == "-noinfo")
2048 toPrintInfo = Standard_False;
2050 else if (!parseRedrawMode (anArg, aToUpdate))
2056 && anArgIter < theArgNb)
2058 std::cout << "Error: wrong syntax!\n";
2062 NCollection_List<TCollection_AsciiString> anIONameList;
2065 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2066 anIter.More(); anIter.Next())
2068 anIONameList.Append (anIter.Key2());
2071 else if (anArgIter < theArgNb) // removed objects names are in argument list
2073 for (; anArgIter < theArgNb; ++anArgIter)
2075 TCollection_AsciiString aName = theArgVec[anArgIter];
2076 if (!GetMapOfAIS().IsBound2 (aName))
2078 theDI << aName.ToCString() << " was not bound to some object.\n";
2082 const Handle(Standard_Transient)& aTransientObj = GetMapOfAIS().Find2 (aName);
2084 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (aTransientObj);
2087 if (anIO->GetContext() != TheAISContext())
2089 theDI << aName.ToCString() << " was not displayed in current context.\n";
2090 theDI << "Please activate view with this object displayed and try again.\n";
2094 anIONameList.Append (aName);
2098 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (aTransientObj);
2099 if (!aNisIO.IsNull())
2101 anIONameList.Append (aName);
2105 else if (TheAISContext()->NbCurrents() > 0
2106 || TheNISContext()->GetSelected().Extent() > 0)
2108 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2109 anIter.More(); anIter.Next())
2111 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2114 if (!TheAISContext()->IsCurrent (anIO))
2119 anIONameList.Append (anIter.Key2());
2123 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2124 if (!aNisIO.IsNull())
2126 if (!TheNISContext()->IsSelected (aNisIO))
2131 anIONameList.Append (anIter.Key2());
2136 // Unbind all removed objects from the map of displayed IO.
2137 for (NCollection_List<TCollection_AsciiString>::Iterator anIter (anIONameList);
2138 anIter.More(); anIter.Next())
2140 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anIter.Value()));
2143 TheAISContext()->Remove (anIO, Standard_False);
2146 theDI << anIter.Value().ToCString() << " was removed\n";
2151 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anIter.Value()));
2152 if (!aNisIO.IsNull())
2154 TheNISContext()->Remove (aNisIO);
2157 theDI << anIter.Value().ToCString() << " was removed\n";
2163 GetMapOfAIS().UnBind2 (anIter.Value());
2167 // update the screen and redraw the view
2168 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2169 a3DView()->SetImmediateUpdate (isAutoUpdate);
2170 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2171 || aToUpdate == ViewerTest_RM_RedrawForce)
2173 TheAISContext()->UpdateCurrentViewer();
2179 //==============================================================================
2181 //purpose : Erase some selected or named objects
2182 // if there is no selected or named objects, the whole viewer is erased
2183 //==============================================================================
2184 int VErase (Draw_Interpretor& theDI,
2185 Standard_Integer theArgNb,
2186 const char** theArgVec)
2188 if (a3DView().IsNull())
2190 std::cout << "Error: no active view!\n";
2193 TheAISContext()->CloseAllContexts (Standard_False);
2195 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2196 const Standard_Boolean toEraseAll = TCollection_AsciiString (theArgNb > 0 ? theArgVec[0] : "") == "veraseall";
2198 Standard_Integer anArgIter = 1;
2199 for (; anArgIter < theArgNb; ++anArgIter)
2201 if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
2207 if (anArgIter < theArgNb)
2211 std::cerr << "Error: wrong syntax, " << theArgVec[0] << " too much arguments.\n";
2215 // has a list of names
2216 for (; anArgIter < theArgNb; ++anArgIter)
2218 TCollection_AsciiString aName = theArgVec[anArgIter];
2219 if (!GetMapOfAIS().IsBound2 (aName))
2224 const Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
2225 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anObj);
2226 theDI << aName.ToCString() << " ";
2229 TheAISContext()->Erase (anIO, Standard_False);
2233 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anObj);
2234 if (!aNisIO.IsNull())
2236 TheNISContext()->Erase (aNisIO);
2241 else if (!toEraseAll
2242 && TheAISContext()->NbCurrents() > 0)
2244 // remove all currently selected objects
2245 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2246 anIter.More(); anIter.Next())
2248 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2250 && TheAISContext()->IsCurrent (anIO))
2252 theDI << anIter.Key2().ToCString() << " ";
2253 TheAISContext()->Erase (anIO, Standard_False);
2259 // erase entire viewer
2260 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2261 anIter.More(); anIter.Next())
2263 const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2266 TheAISContext()->Erase (anIO, Standard_False);
2270 const Handle(NIS_InteractiveObject) aNisIO = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2271 if (!aNisIO.IsNull())
2273 TheNISContext()->Erase (aNisIO);
2279 // update the screen and redraw the view
2280 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2281 a3DView()->SetImmediateUpdate (isAutoUpdate);
2282 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2283 || aToUpdate == ViewerTest_RM_RedrawForce)
2285 TheAISContext()->UpdateCurrentViewer();
2291 //==============================================================================
2292 //function : VDisplayAll
2294 //purpose : Display all the objects of the Map
2295 //==============================================================================
2296 static int VDisplayAll (Draw_Interpretor& ,
2297 Standard_Integer theArgNb,
2298 const char** theArgVec)
2301 if (a3DView().IsNull())
2303 std::cout << "Error: no active view!\n";
2307 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2309 Standard_Integer anArgIter = 1;
2310 for (; anArgIter < theArgNb; ++anArgIter)
2312 if (!parseRedrawMode (theArgVec[anArgIter], aToUpdate))
2317 if (anArgIter < theArgNb)
2319 std::cout << theArgVec[0] << "Error: wrong syntax\n";
2323 if (TheAISContext()->HasOpenedContext())
2325 TheAISContext()->CloseLocalContext();
2328 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2329 anIter.More(); anIter.Next())
2331 if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
2333 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2334 TheAISContext()->Erase (aShape, Standard_False);
2336 else if (anIter.Key1()->IsKind(STANDARD_TYPE(NIS_InteractiveObject)))
2338 const Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2339 TheNISContext()->Erase (aShape);
2343 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2344 anIter.More(); anIter.Next())
2346 if (anIter.Key1()->IsKind (STANDARD_TYPE(AIS_InteractiveObject)))
2348 const Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2349 TheAISContext()->Display (aShape, Standard_False);
2351 else if (anIter.Key1()->IsKind (STANDARD_TYPE(NIS_InteractiveObject)))
2353 Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anIter.Key1());
2354 TheNISContext()->Display (aShape);
2358 // update the screen and redraw the view
2359 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2360 a3DView()->SetImmediateUpdate (isAutoUpdate);
2361 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2362 || aToUpdate == ViewerTest_RM_RedrawForce)
2364 TheAISContext()->UpdateCurrentViewer();
2370 //! Auxiliary method to find presentation
2371 inline Handle(PrsMgr_Presentation) findPresentation (const Handle(AIS_InteractiveContext)& theCtx,
2372 const Handle(AIS_InteractiveObject)& theIO,
2373 const Standard_Integer theMode)
2377 return Handle(PrsMgr_Presentation)();
2382 if (theCtx->MainPrsMgr()->HasPresentation (theIO, theMode))
2384 return theCtx->MainPrsMgr()->Presentation (theIO, theMode);
2387 else if (theCtx->MainPrsMgr()->HasPresentation (theIO, theIO->DisplayMode()))
2389 return theCtx->MainPrsMgr()->Presentation (theIO, theIO->DisplayMode());
2391 else if (theCtx->MainPrsMgr()->HasPresentation (theIO, theCtx->DisplayMode()))
2393 return theCtx->MainPrsMgr()->Presentation (theIO, theCtx->DisplayMode());
2395 return Handle(PrsMgr_Presentation)();
2398 enum ViewerTest_BndAction
2405 //! Auxiliary method to print bounding box of presentation
2406 inline void bndPresentation (Draw_Interpretor& theDI,
2407 const Handle(PrsMgr_Presentation)& thePrs,
2408 const TCollection_AsciiString& theName,
2409 const ViewerTest_BndAction theAction)
2413 case BndAction_Hide:
2415 thePrs->Presentation()->GraphicUnHighlight();
2418 case BndAction_Show:
2420 thePrs->Presentation()->BoundBox();
2423 case BndAction_Print:
2425 Graphic3d_Vec3d aMin, aMax;
2426 thePrs->Presentation()->MinMaxValues (aMin.x(), aMin.y(), aMin.z(),
2427 aMax.x(), aMax.y(), aMax.z());
2428 theDI << theName << "\n"
2429 << aMin.x() << " " << aMin.y() << " " << aMin.z() << " "
2430 << aMax.x() << " " << aMax.y() << " " << aMax.z() << "\n";
2436 //==============================================================================
2437 //function : VBounding
2439 //==============================================================================
2440 int VBounding (Draw_Interpretor& theDI,
2441 Standard_Integer theArgNb,
2442 const char** theArgVec)
2444 Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
2447 std::cout << "Error: no active view!\n";
2451 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2452 ViewerTest_BndAction anAction = BndAction_Show;
2453 Standard_Integer aMode = -1;
2455 Standard_Integer anArgIter = 1;
2456 for (; anArgIter < theArgNb; ++anArgIter)
2458 TCollection_AsciiString anArg (theArgVec[anArgIter]);
2460 if (anArg == "-print")
2462 anAction = BndAction_Print;
2464 else if (anArg == "-show")
2466 anAction = BndAction_Show;
2468 else if (anArg == "-hide")
2470 anAction = BndAction_Hide;
2472 else if (anArg == "-mode")
2474 if (++anArgIter >= theArgNb)
2476 std::cout << "Error: wrong syntax at " << anArg << "\n";
2479 aMode = Draw::Atoi (theArgVec[anArgIter]);
2481 else if (!parseRedrawMode (anArg, aToUpdate))
2487 if (anArgIter < theArgNb)
2489 // has a list of names
2490 for (; anArgIter < theArgNb; ++anArgIter)
2492 TCollection_AsciiString aName = theArgVec[anArgIter];
2493 if (!GetMapOfAIS().IsBound2 (aName))
2495 std::cout << "Error: presentation " << aName << " does not exist\n";
2499 Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName));
2500 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
2503 std::cout << "Error: presentation " << aName << " does not exist\n";
2506 bndPresentation (theDI, aPrs, aName, anAction);
2509 else if (TheAISContext()->NbCurrents() > 0)
2511 // remove all currently selected objects
2512 for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
2514 Handle(AIS_InteractiveObject) anIO = aCtx->Current();
2515 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
2518 bndPresentation (theDI, aPrs, GetMapOfAIS().IsBound1 (anIO) ? GetMapOfAIS().Find1 (anIO) : "", anAction);
2525 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
2526 anIter.More(); anIter.Next())
2528 Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
2529 Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
2532 bndPresentation (theDI, aPrs, anIter.Key2(), anAction);
2537 // update the screen and redraw the view
2538 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2539 a3DView()->SetImmediateUpdate (isAutoUpdate);
2540 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2541 || aToUpdate == ViewerTest_RM_RedrawForce)
2543 TheAISContext()->UpdateCurrentViewer();
2549 //==============================================================================
2550 //function : VTexture
2552 //==============================================================================
2553 Standard_Integer VTexture (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgv)
2555 TCollection_AsciiString aCommandName (theArgv[0]);
2557 NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)> aMapOfArgs;
2558 if (aCommandName == "vtexture")
2562 std::cout << theArgv[0] << ": " << " invalid arguments.\n";
2563 std::cout << "Type help for more information.\n";
2567 // look for options of vtexture command
2568 TCollection_AsciiString aParseKey;
2569 for (Standard_Integer anArgIt = 2; anArgIt < theArgsNb; ++anArgIt)
2571 TCollection_AsciiString anArg (theArgv [anArgIt]);
2574 if (anArg.Value (1) == '-' && !anArg.IsRealValue())
2577 aParseKey.Remove (1);
2578 aParseKey.UpperCase();
2579 aMapOfArgs.Bind (aParseKey, new TColStd_HSequenceOfAsciiString);
2583 if (aParseKey.IsEmpty())
2588 aMapOfArgs(aParseKey)->Append (anArg);
2591 else if (aCommandName == "vtexscale"
2592 || aCommandName == "vtexorigin"
2593 || aCommandName == "vtexrepeat")
2595 // scan for parameters of vtexscale, vtexorigin, vtexrepeat commands
2596 // equal to -scale, -origin, -repeat options of vtexture command
2597 if (theArgsNb < 2 || theArgsNb > 4)
2599 std::cout << theArgv[0] << ": " << " invalid arguments.\n";
2600 std::cout << "Type help for more information.\n";
2604 Handle(TColStd_HSequenceOfAsciiString) anArgs = new TColStd_HSequenceOfAsciiString;
2607 anArgs->Append ("OFF");
2609 else if (theArgsNb == 4)
2611 anArgs->Append (TCollection_AsciiString (theArgv[2]));
2612 anArgs->Append (TCollection_AsciiString (theArgv[3]));
2615 TCollection_AsciiString anArgKey;
2616 if (aCommandName == "vtexscale")
2620 else if (aCommandName == "vtexorigin")
2622 anArgKey = "ORIGIN";
2626 anArgKey = "REPEAT";
2629 aMapOfArgs.Bind (anArgKey, anArgs);
2631 else if (aCommandName == "vtexdefault")
2633 // scan for parameters of vtexdefault command
2634 // equal to -default option of vtexture command
2635 aMapOfArgs.Bind ("DEFAULT", new TColStd_HSequenceOfAsciiString);
2638 // Check arguments for validity
2639 NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)>::Iterator aMapIt (aMapOfArgs);
2640 for (; aMapIt.More(); aMapIt.Next())
2642 const TCollection_AsciiString& aKey = aMapIt.Key();
2643 const Handle(TColStd_HSequenceOfAsciiString)& anArgs = aMapIt.Value();
2645 // -scale, -origin, -repeat: one argument "off", or two real values
2646 if ((aKey.IsEqual ("SCALE") || aKey.IsEqual ("ORIGIN") || aKey.IsEqual ("REPEAT"))
2647 && ((anArgs->Length() == 1 && anArgs->Value(1) == "OFF")
2648 || (anArgs->Length() == 2 && anArgs->Value(1).IsRealValue() && anArgs->Value(2).IsRealValue())))
2653 // -modulate: single argument "on" / "off"
2654 if (aKey.IsEqual ("MODULATE") && anArgs->Length() == 1 && (anArgs->Value(1) == "OFF" || anArgs->Value(1) == "ON"))
2659 // -default: no arguments
2660 if (aKey.IsEqual ("DEFAULT") && anArgs->IsEmpty())
2665 TCollection_AsciiString aLowerKey;
2668 aLowerKey.LowerCase();
2669 std::cout << theArgv[0] << ": " << aLowerKey << " is unknown option, or the arguments are unacceptable.\n";
2670 std::cout << "Type help for more information.\n";
2674 Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
2675 if (anAISContext.IsNull())
2677 std::cout << aCommandName << ": " << " please use 'vinit' command to initialize view.\n";
2681 Standard_Integer aPreviousMode = 0;
2683 ViewerTest::CurrentView()->SetSurfaceDetail (V3d_TEX_ALL);
2685 TCollection_AsciiString aShapeName (theArgv[1]);
2686 Handle(AIS_InteractiveObject) anIO;
2688 const ViewerTest_DoubleMapOfInteractiveAndName& aMapOfIO = GetMapOfAIS();
2689 if (aMapOfIO.IsBound2 (aShapeName))
2691 anIO = Handle(AIS_InteractiveObject)::DownCast (aMapOfIO.Find2 (aShapeName));
2696 std::cout << aCommandName << ": shape " << aShapeName << " does not exists.\n";
2700 Handle(AIS_TexturedShape) aTexturedIO;
2701 if (anIO->IsKind (STANDARD_TYPE (AIS_TexturedShape)))
2703 aTexturedIO = Handle(AIS_TexturedShape)::DownCast (anIO);
2704 aPreviousMode = aTexturedIO->DisplayMode();
2708 anAISContext->Clear (anIO, Standard_False);
2709 aTexturedIO = new AIS_TexturedShape (DBRep::Get (theArgv[1]));
2710 GetMapOfAIS().UnBind1 (anIO);
2711 GetMapOfAIS().UnBind2 (aShapeName);
2712 GetMapOfAIS().Bind (aTexturedIO, aShapeName);
2715 // -------------------------------------------
2716 // Turn texturing on/off - only for vtexture
2717 // -------------------------------------------
2719 if (aCommandName == "vtexture")
2721 TCollection_AsciiString aTextureArg (theArgsNb > 2 ? theArgv[2] : "");
2723 if (aTextureArg.IsEmpty())
2725 std::cout << aCommandName << ": " << " Texture mapping disabled.\n";
2726 std::cout << "To enable it, use 'vtexture NameOfShape NameOfTexture'\n" << "\n";
2728 anAISContext->SetDisplayMode (aTexturedIO, AIS_Shaded, Standard_False);
2729 if (aPreviousMode == 3)
2731 anAISContext->RecomputePrsOnly (aTexturedIO);
2734 anAISContext->Display (aTexturedIO, Standard_True);
2737 else if (aTextureArg.Value(1) != '-') // "-option" on place of texture argument
2739 if (aTextureArg == "?")
2741 TCollection_AsciiString aTextureFolder = Graphic3d_TextureRoot::TexturesFolder();
2743 theDi << "\n Files in current directory : \n" << "\n";
2744 theDi.Eval ("glob -nocomplain *");
2746 TCollection_AsciiString aCmnd ("glob -nocomplain ");
2747 aCmnd += aTextureFolder;
2750 theDi << "Files in " << aTextureFolder.ToCString() << " : \n" << "\n";
2751 theDi.Eval (aCmnd.ToCString());
2756 aTexturedIO->SetTextureFileName (aTextureArg);
2761 // ------------------------------------
2762 // Process other options and commands
2763 // ------------------------------------
2765 Handle(TColStd_HSequenceOfAsciiString) aValues;
2766 if (aMapOfArgs.Find ("DEFAULT", aValues))
2768 aTexturedIO->SetTextureRepeat (Standard_False);
2769 aTexturedIO->SetTextureOrigin (Standard_False);
2770 aTexturedIO->SetTextureScale (Standard_False);
2771 aTexturedIO->EnableTextureModulate();
2775 if (aMapOfArgs.Find ("SCALE", aValues))
2777 if (aValues->Value(1) != "OFF")
2779 aTexturedIO->SetTextureScale (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
2783 aTexturedIO->SetTextureScale (Standard_False);
2787 if (aMapOfArgs.Find ("ORIGIN", aValues))
2789 if (aValues->Value(1) != "OFF")
2791 aTexturedIO->SetTextureOrigin (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
2795 aTexturedIO->SetTextureOrigin (Standard_False);
2799 if (aMapOfArgs.Find ("REPEAT", aValues))
2801 if (aValues->Value(1) != "OFF")
2803 aTexturedIO->SetTextureRepeat (Standard_True, aValues->Value(1).RealValue(), aValues->Value(2).RealValue());
2807 aTexturedIO->SetTextureRepeat (Standard_False);
2811 if (aMapOfArgs.Find ("MODULATE", aValues))
2813 if (aValues->Value(1) == "ON")
2815 aTexturedIO->EnableTextureModulate();
2819 aTexturedIO->DisableTextureModulate();
2824 if (aTexturedIO->DisplayMode() == 3 || aPreviousMode == 3)
2826 anAISContext->RecomputePrsOnly (aTexturedIO);
2830 anAISContext->SetDisplayMode (aTexturedIO, 3, Standard_False);
2831 anAISContext->Display (aTexturedIO, Standard_True);
2832 anAISContext->Update (aTexturedIO,Standard_True);
2838 //==============================================================================
2839 //function : VDisplay2
2841 //purpose : Display an object from its name
2842 //==============================================================================
2843 static int VDisplay2 (Draw_Interpretor& theDI,
2844 Standard_Integer theArgNb,
2845 const char** theArgVec)
2849 std::cout << theArgVec[0] << "Error: wrong syntax!\n";
2852 else if (a3DView().IsNull())
2854 ViewerTest::ViewerInit();
2855 std::cout << "Command vinit should be called before!\n";
2859 const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
2860 if (aCtx->HasOpenedContext())
2862 aCtx->CloseLocalContext();
2865 ViewerTest_RedrawMode aToUpdate = ViewerTest_RM_Auto;
2866 Standard_Integer isMutable = -1;
2867 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
2869 const TCollection_AsciiString aName = theArgVec[anArgIter];
2870 TCollection_AsciiString aNameCase = aName;
2871 aNameCase.LowerCase();
2872 if (parseRedrawMode (aName, aToUpdate))
2876 else if (aNameCase == "-mutable")
2881 else if (!GetMapOfAIS().IsBound2 (aName))
2883 // create the AIS_Shape from a name
2884 const Handle(AIS_InteractiveObject) aShape = GetAISShapeFromName (aName.ToCString());
2885 if (!aShape.IsNull())
2887 if (isMutable != -1)
2889 aShape->SetMutable (isMutable == 1);
2891 GetMapOfAIS().Bind (aShape, aName);
2892 aCtx->Display (aShape, Standard_False);
2897 Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (aName);
2898 if (anObj->IsKind (STANDARD_TYPE (AIS_InteractiveObject)))
2900 Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (anObj);
2901 if (isMutable != -1)
2903 aShape->SetMutable (isMutable == 1);
2906 if (aShape->Type() == AIS_KOI_Datum)
2908 aCtx->Display (aShape, Standard_False);
2912 theDI << "Display " << aName.ToCString() << "\n";
2913 // get the Shape from a name
2914 TopoDS_Shape aNewShape = GetShapeFromName (aName.ToCString());
2916 // update the Shape in the AIS_Shape
2917 Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aShape);
2918 if (!aShapePrs.IsNull())
2920 aShapePrs->Set (aNewShape);
2922 aCtx->Redisplay (aShape, Standard_False);
2923 aCtx->Display (aShape, Standard_False);
2926 else if (anObj->IsKind (STANDARD_TYPE (NIS_InteractiveObject)))
2928 Handle(NIS_InteractiveObject) aShape = Handle(NIS_InteractiveObject)::DownCast (anObj);
2929 TheNISContext()->Display (aShape);
2933 const Standard_Boolean isAutoUpdate = a3DView()->SetImmediateUpdate (Standard_False);
2934 a3DView()->SetImmediateUpdate (isAutoUpdate);
2935 if ((isAutoUpdate && aToUpdate != ViewerTest_RM_RedrawSuppress)
2936 || aToUpdate == ViewerTest_RM_RedrawForce)
2938 // update the screen and redraw the view
2939 aCtx->UpdateCurrentViewer();
2944 //===============================================================================================
2945 //function : VUpdate
2947 //===============================================================================================
2948 static int VUpdate (Draw_Interpretor& /*theDi*/, Standard_Integer theArgsNb, const char** theArgVec)
2950 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
2951 if (aContextAIS.IsNull())
2953 std::cout << theArgVec[0] << "AIS context is not available.\n";
2959 std::cout << theArgVec[0] << ": insufficient arguments. Type help for more information.\n";
2963 const ViewerTest_DoubleMapOfInteractiveAndName& anAISMap = GetMapOfAIS();
2965 AIS_ListOfInteractive aListOfIO;
2967 for (int anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
2969 TCollection_AsciiString aName = TCollection_AsciiString (theArgVec[anArgIt]);
2971 Handle(AIS_InteractiveObject) anAISObj;
2972 if (anAISMap.IsBound2 (aName))
2974 anAISObj = Handle(AIS_InteractiveObject)::DownCast (anAISMap.Find2 (aName));
2977 if (anAISObj.IsNull())
2979 std::cout << theArgVec[0] << ": no AIS interactive object named \"" << aName << "\".\n";
2983 aListOfIO.Append (anAISObj);
2986 AIS_ListIteratorOfListOfInteractive anIOIt (aListOfIO);
2987 for (; anIOIt.More(); anIOIt.Next())
2989 aContextAIS->Update (anIOIt.Value(), Standard_False);
2992 aContextAIS->UpdateCurrentViewer();
2997 //==============================================================================
2999 //purpose : Test the annimation of an object along a
3000 // predifined trajectory
3001 //Draw arg : vperf ShapeName 1/0(Transfo/Location) 1/0(Primitives sensibles ON/OFF)
3002 //==============================================================================
3004 static int VPerf(Draw_Interpretor& di, Standard_Integer , const char** argv) {
3007 if (TheAISContext()->HasOpenedContext())
3008 TheAISContext()->CloseLocalContext();
3010 Standard_Real Step=4*M_PI/180;
3011 Standard_Real Angle=0;
3013 Handle(AIS_InteractiveObject) aIO;
3014 if (GetMapOfAIS().IsBound2(argv[1]))
3015 aIO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(argv[1]));
3019 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aIO);
3023 if (Draw::Atoi(argv[3])==1 ) {
3024 di<<" Primitives sensibles OFF"<<"\n";
3025 TheAISContext()->Deactivate(aIO);
3028 di<<" Primitives sensibles ON"<<"\n";
3030 // Movement par transformation
3031 if(Draw::Atoi(argv[2]) ==1) {
3032 di<<" Calcul par Transformation"<<"\n";
3033 for (Standard_Real myAngle=0;Angle<10*2*M_PI; myAngle++) {
3037 myTransfo.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1) ) ,Angle );
3038 TheAISContext()->SetLocation(aShape,myTransfo);
3039 TheAISContext() ->UpdateCurrentViewer();
3044 di<<" Calcul par Locations"<<"\n";
3045 gp_Trsf myAngleTrsf;
3046 myAngleTrsf.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1) ), Step );
3047 TopLoc_Location myDeltaAngle (myAngleTrsf);
3048 TopLoc_Location myTrueLoc;
3050 for (Standard_Real myAngle=0;Angle<10*2*M_PI; myAngle++) {
3053 myTrueLoc=myTrueLoc*myDeltaAngle;
3054 TheAISContext()->SetLocation(aShape,myTrueLoc );
3055 TheAISContext() ->UpdateCurrentViewer();
3058 if (Draw::Atoi(argv[3])==1 ){
3059 // On reactive la selection des primitives sensibles
3060 TheAISContext()->Activate(aIO,0);
3062 a3DView() -> Redraw();
3064 di<<" Temps ecoule "<<"\n";
3070 //==================================================================================
3071 // Function : VAnimation
3072 //==================================================================================
3073 static int VAnimation (Draw_Interpretor& di, Standard_Integer argc, const char** argv) {
3075 di<<"Use: "<<argv[0]<<" CrankArmFile CylinderHeadFile PropellerFile EngineBlockFile"<<"\n";
3079 Standard_Real thread = 4;
3080 Standard_Real angleA=0;
3081 Standard_Real angleB;
3083 gp_Ax1 Ax1(gp_Pnt(0,0,0),gp_Vec(0,0,1));
3086 TopoDS_Shape CrankArm;
3087 TopoDS_Shape CylinderHead;
3088 TopoDS_Shape Propeller;
3089 TopoDS_Shape EngineBlock;
3091 //BRepTools::Read(CrankArm,"/dp_26/Indus/ege/assemblage/CrankArm.rle",B);
3092 //BRepTools::Read(CylinderHead,"/dp_26/Indus/ege/assemblage/CylinderHead.rle",B);
3093 //BRepTools::Read(Propeller,"/dp_26/Indus/ege/assemblage/Propeller.rle",B);
3094 //BRepTools::Read(EngineBlock,"/dp_26/Indus/ege/assemblage/EngineBlock.rle",B);
3095 BRepTools::Read(CrankArm,argv[1],B);
3096 BRepTools::Read(CylinderHead,argv[2],B);
3097 BRepTools::Read(Propeller,argv[3],B);
3098 BRepTools::Read(EngineBlock,argv[4],B);
3100 if (CrankArm.IsNull() || CylinderHead.IsNull() || Propeller.IsNull() || EngineBlock.IsNull()) {di<<" Syntaxe error:loading failure."<<"\n";}
3106 Handle(AIS_Shape) myAisCylinderHead = new AIS_Shape (CylinderHead);
3107 Handle(AIS_Shape) myAisEngineBlock = new AIS_Shape (EngineBlock);
3108 Handle(AIS_Shape) myAisCrankArm = new AIS_Shape (CrankArm);
3109 Handle(AIS_Shape) myAisPropeller = new AIS_Shape (Propeller);
3111 GetMapOfAIS().Bind(myAisCylinderHead,"a");
3112 GetMapOfAIS().Bind(myAisEngineBlock,"b");
3113 GetMapOfAIS().Bind(myAisCrankArm,"c");
3114 GetMapOfAIS().Bind(myAisPropeller,"d");
3116 myAisCylinderHead->SetMutable (Standard_True);
3117 myAisEngineBlock ->SetMutable (Standard_True);
3118 myAisCrankArm ->SetMutable (Standard_True);
3119 myAisPropeller ->SetMutable (Standard_True);
3121 TheAISContext()->SetColor (myAisCylinderHead, Quantity_NOC_INDIANRED);
3122 TheAISContext()->SetColor (myAisEngineBlock, Quantity_NOC_RED);
3123 TheAISContext()->SetColor (myAisPropeller, Quantity_NOC_GREEN);
3125 TheAISContext()->Display (myAisCylinderHead, Standard_False);
3126 TheAISContext()->Display (myAisEngineBlock, Standard_False);
3127 TheAISContext()->Display (myAisCrankArm, Standard_False);
3128 TheAISContext()->Display (myAisPropeller, Standard_False);
3130 TheAISContext()->Deactivate(myAisCylinderHead);
3131 TheAISContext()->Deactivate(myAisEngineBlock );
3132 TheAISContext()->Deactivate(myAisCrankArm );
3133 TheAISContext()->Deactivate(myAisPropeller );
3135 // Boucle de mouvement
3136 for (Standard_Real myAngle = 0;angleA<2*M_PI*10.175 ;myAngle++) {
3138 angleA = thread*myAngle*M_PI/180;
3139 X = Sin(angleA)*3/8;
3140 angleB = atan(X / Sqrt(-X * X + 1));
3141 Standard_Real decal(25*0.6);
3144 //Build a transformation on the display
3145 gp_Trsf aPropellerTrsf;
3146 aPropellerTrsf.SetRotation(Ax1,angleA);
3147 TheAISContext()->SetLocation(myAisPropeller,aPropellerTrsf);
3149 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));
3150 gp_Trsf aCrankArmTrsf;
3151 aCrankArmTrsf.SetTransformation( base.Rotated(gp_Ax1(gp_Pnt(3*decal,0,0),gp_Dir(0,0,1)),angleB));
3152 TheAISContext()->SetLocation(myAisCrankArm,aCrankArmTrsf);
3154 TheAISContext()->UpdateCurrentViewer();
3157 TopoDS_Shape myNewCrankArm =myAisCrankArm ->Shape().Located( myAisCrankArm ->Transformation() );
3158 TopoDS_Shape myNewPropeller =myAisPropeller->Shape().Located( myAisPropeller->Transformation() );
3160 myAisCrankArm ->ResetTransformation();
3161 myAisPropeller->ResetTransformation();
3163 myAisCrankArm -> Set(myNewCrankArm );
3164 myAisPropeller -> Set(myNewPropeller);
3166 TheAISContext()->Activate(myAisCylinderHead,0);
3167 TheAISContext()->Activate(myAisEngineBlock,0 );
3168 TheAISContext()->Activate(myAisCrankArm ,0 );
3169 TheAISContext()->Activate(myAisPropeller ,0 );
3175 TheAISContext()->Redisplay(myAisCrankArm ,Standard_False);
3176 TheAISContext()->Redisplay(myAisPropeller,Standard_False);
3178 TheAISContext()->UpdateCurrentViewer();
3179 a3DView()->Redraw();
3188 //==============================================================================
3189 //function : VShading
3190 //purpose : Sharpen or roughten the quality of the shading
3191 //Draw arg : vshading ShapeName 0.1->0.00001 1 deg-> 30 deg
3192 //==============================================================================
3193 static int VShading(Draw_Interpretor& ,Standard_Integer argc, const char** argv)
3195 Standard_Real myDevCoef;
3196 Handle(AIS_InteractiveObject) TheAisIO;
3199 const Standard_Boolean HaveToSet = (strcasecmp(argv[0],"vsetshading") == 0);
3201 if (TheAISContext()->HasOpenedContext())
3202 TheAISContext()->CloseLocalContext();
3207 myDevCoef =Draw::Atof(argv[2]);
3210 TCollection_AsciiString name=argv[1];
3211 if (GetMapOfAIS().IsBound2(name ))
3212 TheAisIO = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(name));
3213 if (TheAisIO.IsNull())
3214 TheAisIO=GetAISShapeFromName((const char *)name.ToCString());
3217 TheAISContext()->SetDeviationCoefficient(TheAisIO,myDevCoef,Standard_True);
3219 TheAISContext()->SetDeviationCoefficient(TheAisIO,0.0008,Standard_True);
3221 TheAISContext()->Redisplay(TheAisIO);
3224 //==============================================================================
3225 //function : HaveMode
3226 //use : VActivatedModes
3227 //==============================================================================
3228 #include <TColStd_ListIteratorOfListOfInteger.hxx>
3230 Standard_Boolean HaveMode(const Handle(AIS_InteractiveObject)& TheAisIO,const Standard_Integer mode )
3232 TColStd_ListOfInteger List;
3233 TheAISContext()->ActivatedModes (TheAisIO,List);
3234 TColStd_ListIteratorOfListOfInteger it;
3235 Standard_Boolean Found=Standard_False;
3236 for (it.Initialize(List); it.More()&&!Found; it.Next() ){
3237 if (it.Value()==mode ) Found=Standard_True;
3244 //==============================================================================
3245 //function : VActivatedMode
3247 //purpose : permet d'attribuer a chacune des shapes un mode d'activation
3248 // (edges,vertex...)qui lui est propre et le mode de selection standard.
3249 // La fonction s'applique aux shapes selectionnees(current ou selected dans le viewer)
3250 // Dans le cas ou on veut psser la shape en argument, la fonction n'autorise
3251 // qu'un nom et qu'un mode.
3252 //Draw arg : vsetam [ShapeName] mode(0,1,2,3,4,5,6,7)
3253 //==============================================================================
3254 #include <AIS_ListIteratorOfListOfInteractive.hxx>
3256 static int VActivatedMode (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3259 Standard_Boolean ThereIsName = Standard_False ;
3261 if(!a3DView().IsNull()){
3263 const Standard_Boolean HaveToSet = (strcasecmp(argv[0],"vsetam") == 0);
3264 // verification des arguments
3266 if (argc<2||argc>3) { di<<" Syntaxe error"<<"\n";return 1;}
3267 ThereIsName = (argc == 3);
3271 if (argc>1) {di<<" Syntaxe error"<<"\n";return 1;}
3273 di<<" R.A.Z de tous les modes de selecion"<<"\n";
3274 di<<" Fermeture du Context local"<<"\n";
3275 if (TheAISContext()->HasOpenedContext())
3276 TheAISContext()->CloseLocalContext();
3280 // IL n'y a aps de nom de shape passe en argument
3281 if (HaveToSet && !ThereIsName){
3282 Standard_Integer aMode=Draw::Atoi(argv [1]);
3284 const char *cmode="???";
3286 case 0: cmode = "Shape"; break;
3287 case 1: cmode = "Vertex"; break;
3288 case 2: cmode = "Edge"; break;
3289 case 3: cmode = "Wire"; break;
3290 case 4: cmode = "Face"; break;
3291 case 5: cmode = "Shell"; break;
3292 case 6: cmode = "Solid"; break;
3293 case 7: cmode = "Compound"; break;
3296 if( !TheAISContext()->HasOpenedContext() ) {
3297 // il n'y a pas de Context local d'ouvert
3298 // on en ouvre un et on charge toutes les shapes displayees
3299 // on load tous les objets displayees et on Activate les objets de la liste
3300 AIS_ListOfInteractive ListOfIO;
3301 // on sauve dans une AISListOfInteractive tous les objets currents
3302 if (TheAISContext()->NbCurrents()>0 ){
3303 TheAISContext()->UnhilightCurrents(Standard_False);
3305 for (TheAISContext()->InitCurrent(); TheAISContext()->MoreCurrent(); TheAISContext()->NextCurrent() ){
3306 ListOfIO.Append(TheAISContext()->Current() );
3310 TheAISContext()->OpenLocalContext(Standard_False);
3311 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
3314 Handle(AIS_InteractiveObject) aIO =
3315 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
3317 TheAISContext()->Load(aIO,0,Standard_False);
3320 // traitement des objets qui etaient currents dans le Contexte global
3321 if (!ListOfIO.IsEmpty() ) {
3322 // il y avait des objets currents
3323 AIS_ListIteratorOfListOfInteractive iter;
3324 for (iter.Initialize(ListOfIO); iter.More() ; iter.Next() ) {
3325 Handle(AIS_InteractiveObject) aIO=iter.Value();
3326 TheAISContext()->Activate(aIO,aMode);
3327 di<<" Mode: "<<cmode<<" ON pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3331 // On applique le mode a tous les objets displayes
3332 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
3333 it2 (GetMapOfAIS());
3335 Handle(AIS_InteractiveObject) aIO =
3336 Handle(AIS_InteractiveObject)::DownCast(it2.Key1());
3337 if (!aIO.IsNull()) {
3338 di<<" Mode: "<<cmode<<" ON pour "<<it2.Key2().ToCString() <<"\n";
3339 TheAISContext()->Activate(aIO,aMode);
3348 // un Context local est deja ouvert
3349 // Traitement des objets du Context local
3350 if (TheAISContext()->NbSelected()>0 ){
3351 TheAISContext()->UnhilightSelected(Standard_False);
3352 // il y a des objets selected,on les parcourt
3353 for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
3354 Handle(AIS_InteractiveObject) aIO=TheAISContext()->Interactive();
3357 if (HaveMode(aIO,aMode) ) {
3358 di<<" Mode: "<<cmode<<" OFF pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3359 TheAISContext()->Deactivate(aIO,aMode);
3362 di<<" Mode: "<<cmode<<" ON pour "<<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3363 TheAISContext()->Activate(aIO,aMode);
3369 // il n'y a pas d'objets selected
3370 // tous les objets diplayes sont traites
3371 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName
3374 Handle(AIS_InteractiveObject) aIO =
3375 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
3376 if (!aIO.IsNull()) {
3377 if (HaveMode(aIO,aMode) ) {
3378 di<<" Mode: "<<cmode<<" OFF pour "
3379 <<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3380 TheAISContext()->Deactivate(aIO,aMode);
3383 di<<" Mode: "<<cmode<<" ON pour"
3384 <<GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3385 TheAISContext()->Activate(aIO,aMode);
3393 else if (HaveToSet && ThereIsName){
3394 Standard_Integer aMode=Draw::Atoi(argv [2]);
3395 Handle(AIS_InteractiveObject) aIO =
3396 Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(argv[1]));
3398 if (!aIO.IsNull()) {
3399 const char *cmode="???";
3402 case 0: cmode = "Shape"; break;
3403 case 1: cmode = "Vertex"; break;
3404 case 2: cmode = "Edge"; break;
3405 case 3: cmode = "Wire"; break;
3406 case 4: cmode = "Face"; break;
3407 case 5: cmode = "Shell"; break;
3408 case 6: cmode = "Solid"; break;
3409 case 7: cmode = "Compound"; break;
3412 if( !TheAISContext()->HasOpenedContext() ) {
3413 TheAISContext()->OpenLocalContext(Standard_False);
3414 // On charge tous les objets de la map
3415 ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it (GetMapOfAIS());
3417 Handle(AIS_InteractiveObject) aShape=
3418 Handle(AIS_InteractiveObject)::DownCast(it.Key1());
3419 if (!aShape.IsNull())
3420 TheAISContext()->Load(aShape,0,Standard_False);
3423 TheAISContext()->Activate(aIO,aMode);
3424 di<<" Mode: "<<cmode<<" ON pour "<<argv[1]<<"\n";
3428 // un Context local est deja ouvert
3429 if (HaveMode(aIO,aMode) ) {
3430 di<<" Mode: "<<cmode<<" OFF pour "<<argv[1]<<"\n";
3431 TheAISContext()->Deactivate(aIO,aMode);
3434 di<<" Mode: "<<cmode<<" ON pour "<<argv[1]<<"\n";
3435 TheAISContext()->Activate(aIO,aMode);
3444 //! Auxiliary method to print Interactive Object information
3445 static void objInfo (const NCollection_Map<Handle(AIS_InteractiveObject)>& theDetected,
3446 const Handle(Standard_Transient)& theObject,
3447 Draw_Interpretor& theDI)
3449 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theObject);
3452 theDI << theObject->DynamicType()->Name() << " is not AIS presentation\n";
3456 theDI << (TheAISContext()->IsDisplayed (anObj) ? "Displayed" : "Hidden ")
3457 << (TheAISContext()->IsSelected (anObj) ? " Selected" : " ")
3458 << (theDetected.Contains (anObj) ? " Detected" : " ")
3460 if (anObj->Type() == AIS_KOI_Datum)
3463 if (anObj->Signature() == 3) { theDI << " AIS_Trihedron"; }
3464 else if (anObj->Signature() == 2) { theDI << " AIS_Axis"; }
3465 else if (anObj->Signature() == 6) { theDI << " AIS_Circle"; }
3466 else if (anObj->Signature() == 5) { theDI << " AIS_Line"; }
3467 else if (anObj->Signature() == 7) { theDI << " AIS_Plane"; }
3468 else if (anObj->Signature() == 1) { theDI << " AIS_Point"; }
3469 else if (anObj->Signature() == 4) { theDI << " AIS_PlaneTrihedron"; }
3472 else if (anObj->Type() == AIS_KOI_Shape
3473 && anObj->Signature() == 0)
3475 theDI << " AIS_Shape";
3477 else if (anObj->Type() == AIS_KOI_Relation)
3479 // AIS_Dimention and AIS_Relation
3480 Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (anObj);
3481 switch (aRelation->KindOfDimension())
3483 case AIS_KOD_PLANEANGLE: theDI << " AIS_AngleDimension"; break;
3484 case AIS_KOD_LENGTH: theDI << " AIS_Chamf2/3dDimension/AIS_LengthDimension"; break;
3485 case AIS_KOD_DIAMETER: theDI << " AIS_DiameterDimension"; break;
3486 case AIS_KOD_ELLIPSERADIUS: theDI << " AIS_EllipseRadiusDimension"; break;
3487 //case AIS_KOD_FILLETRADIUS: theDI << " AIS_FilletRadiusDimension "; break;
3488 case AIS_KOD_OFFSET: theDI << " AIS_OffsetDimension"; break;
3489 case AIS_KOD_RADIUS: theDI << " AIS_RadiusDimension"; break;
3490 default: theDI << " UNKNOWN dimension"; break;
3495 theDI << " UserPrs";
3497 theDI << " (" << theObject->DynamicType()->Name() << ")";
3500 //! Print information about locally selected sub-shapes
3501 static void localCtxInfo (Draw_Interpretor& theDI)
3503 Handle(AIS_InteractiveContext) aCtx = TheAISContext();
3504 if (!aCtx->HasOpenedContext())
3509 TCollection_AsciiString aPrevName;
3510 Handle(AIS_LocalContext) aCtxLoc = aCtx->LocalContext();
3511 for (aCtxLoc->InitSelected(); aCtxLoc->MoreSelected(); aCtxLoc->NextSelected())
3513 const TopoDS_Shape aSubShape = aCtxLoc->SelectedShape();
3514 const Handle(AIS_Shape) aShapeIO = Handle(AIS_Shape)::DownCast (aCtxLoc->SelectedInteractive());
3515 if (aSubShape.IsNull()
3516 || aShapeIO.IsNull()
3517 || !GetMapOfAIS().IsBound1 (aShapeIO))
3522 const TCollection_AsciiString aParentName = GetMapOfAIS().Find1 (aShapeIO);
3523 TopTools_MapOfShape aFilter;
3524 Standard_Integer aNumber = 0;
3525 const TopoDS_Shape aShape = aShapeIO->Shape();
3526 for (TopExp_Explorer anIter (aShape, aSubShape.ShapeType());
3527 anIter.More(); anIter.Next())
3529 if (!aFilter.Add (anIter.Current()))
3531 continue; // filter duplicates
3535 if (!anIter.Current().IsSame (aSubShape))
3540 Standard_CString aShapeName = NULL;
3541 switch (aSubShape.ShapeType())
3543 case TopAbs_COMPOUND: aShapeName = " Compound"; break;
3544 case TopAbs_COMPSOLID: aShapeName = "CompSolid"; break;
3545 case TopAbs_SOLID: aShapeName = " Solid"; break;
3546 case TopAbs_SHELL: aShapeName = " Shell"; break;
3547 case TopAbs_FACE: aShapeName = " Face"; break;
3548 case TopAbs_WIRE: aShapeName = " Wire"; break;
3549 case TopAbs_EDGE: aShapeName = " Edge"; break;
3550 case TopAbs_VERTEX: aShapeName = " Vertex"; break;
3552 case TopAbs_SHAPE: aShapeName = " Shape"; break;
3555 if (aParentName != aPrevName)
3557 theDI << "Locally selected sub-shapes within " << aParentName << ":\n";
3558 aPrevName = aParentName;
3560 theDI << " " << aShapeName << " #" << aNumber << "\n";
3566 //==============================================================================
3569 //Draw arg : vstate [nameA] ... [nameN]
3570 //==============================================================================
3571 static Standard_Integer VState (Draw_Interpretor& theDI,
3572 Standard_Integer theArgNb,
3573 Standard_CString* theArgVec)
3575 Handle(AIS_InteractiveContext) aCtx = TheAISContext();
3578 std::cerr << "Error: No opened viewer!\n";
3582 NCollection_Map<Handle(AIS_InteractiveObject)> aDetected;
3583 for (aCtx->InitDetected(); aCtx->MoreDetected(); aCtx->NextDetected())
3585 aDetected.Add (aCtx->DetectedCurrentObject());
3588 const Standard_Boolean toShowAll = (theArgNb >= 2 && *theArgVec[1] == '*');
3592 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
3594 const TCollection_AsciiString anObjName = theArgVec[anArgIter];
3595 if (!GetMapOfAIS().IsBound2 (anObjName))
3597 theDI << anObjName << " doesn't exist!\n";
3601 const Handle(Standard_Transient) anObjTrans = GetMapOfAIS().Find2 (anObjName);
3602 TCollection_AsciiString aName = anObjName;
3603 aName.LeftJustify (20, ' ');
3604 theDI << " " << aName << " ";
3605 objInfo (aDetected, anObjTrans, theDI);
3611 if (aCtx->NbCurrents() > 0
3614 for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
3616 Handle(AIS_InteractiveObject) anObj = aCtx->Current();
3617 TCollection_AsciiString aName = GetMapOfAIS().Find1 (anObj);
3618 aName.LeftJustify (20, ' ');
3619 theDI << aName << " ";
3620 objInfo (aDetected, anObj, theDI);
3626 theDI << "Neutral-point state:\n";
3627 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anObjIter (GetMapOfAIS());
3628 anObjIter.More(); anObjIter.Next())
3630 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anObjIter.Key1());
3636 TCollection_AsciiString aName = anObjIter.Key2();
3637 aName.LeftJustify (20, ' ');
3638 theDI << " " << aName << " ";
3639 objInfo (aDetected, anObj, theDI);
3642 localCtxInfo (theDI);
3646 //=======================================================================
3647 //function : PickObjects
3649 //=======================================================================
3650 Standard_Boolean ViewerTest::PickObjects(Handle(TColStd_HArray1OfTransient)& arr,
3651 const AIS_KindOfInteractive TheType,
3652 const Standard_Integer TheSignature,
3653 const Standard_Integer MaxPick)
3655 Handle(AIS_InteractiveObject) IO;
3656 Standard_Integer curindex = (TheType == AIS_KOI_None) ? 0 : TheAISContext()->OpenLocalContext();
3658 // step 1: prepare the data
3660 Handle(AIS_SignatureFilter) F1 = new AIS_SignatureFilter(TheType,TheSignature);
3661 TheAISContext()->AddFilter(F1);
3664 // step 2 : wait for the selection...
3665 // Standard_Boolean IsGood (Standard_False);
3666 // Standard_Integer NbPick(0);
3667 Standard_Boolean NbPickGood (0),NbToReach(arr->Length());
3668 Standard_Integer NbPickFail(0);
3669 Standard_Integer argccc = 5;
3670 const char *bufff[] = { "A", "B", "C","D", "E" };
3671 const char **argvvv = (const char **) bufff;
3674 while(NbPickGood<NbToReach && NbPickFail <= MaxPick){
3675 while(ViewerMainLoop(argccc,argvvv)){}
3676 Standard_Integer NbStored = TheAISContext()->NbSelected();
3677 if((unsigned int ) NbStored != NbPickGood)
3678 NbPickGood= NbStored;
3681 cout<<"NbPicked = "<<NbPickGood<<" | Nb Pick Fail :"<<NbPickFail<<endl;
3684 // step3 get result.
3686 if((unsigned int ) NbPickFail >= NbToReach) return Standard_False;
3688 Standard_Integer i(0);
3689 for(TheAISContext()->InitSelected();
3690 TheAISContext()->MoreSelected();
3691 TheAISContext()->NextSelected()){
3693 Handle(AIS_InteractiveObject) IO2 = TheAISContext()->SelectedInteractive();
3694 arr->SetValue(i,IO2);
3699 TheAISContext()->CloseLocalContext(curindex);
3701 return Standard_True;
3705 //=======================================================================
3706 //function : PickObject
3708 //=======================================================================
3709 Handle(AIS_InteractiveObject) ViewerTest::PickObject(const AIS_KindOfInteractive TheType,
3710 const Standard_Integer TheSignature,
3711 const Standard_Integer MaxPick)
3713 Handle(AIS_InteractiveObject) IO;
3714 Standard_Integer curindex = (TheType == AIS_KOI_None) ? 0 : TheAISContext()->OpenLocalContext();
3716 // step 1: prepare the data
3719 Handle(AIS_SignatureFilter) F1 = new AIS_SignatureFilter(TheType,TheSignature);
3720 TheAISContext()->AddFilter(F1);
3723 // step 2 : wait for the selection...
3724 Standard_Boolean IsGood (Standard_False);
3725 Standard_Integer NbPick(0);
3726 Standard_Integer argccc = 5;
3727 const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
3728 const char **argvvv = (const char **) bufff;
3731 while(!IsGood && NbPick<= MaxPick){
3732 while(ViewerMainLoop(argccc,argvvv)){}
3733 IsGood = (TheAISContext()->NbSelected()>0) ;
3735 cout<<"Nb Pick :"<<NbPick<<endl;
3739 // step3 get result.
3741 TheAISContext()->InitSelected();
3742 IO = TheAISContext()->SelectedInteractive();
3746 TheAISContext()->CloseLocalContext(curindex);
3750 //=======================================================================
3751 //function : PickShape
3752 //purpose : First Activate the rightmode + Put Filters to be able to
3753 // pick objets that are of type <TheType>...
3754 //=======================================================================
3756 TopoDS_Shape ViewerTest::PickShape(const TopAbs_ShapeEnum TheType,
3757 const Standard_Integer MaxPick)
3760 // step 1: prepare the data
3762 Standard_Integer curindex = TheAISContext()->OpenLocalContext();
3763 TopoDS_Shape result;
3765 if(TheType==TopAbs_SHAPE){
3766 Handle(AIS_TypeFilter) F1 = new AIS_TypeFilter(AIS_KOI_Shape);
3767 TheAISContext()->AddFilter(F1);
3770 Handle(StdSelect_ShapeTypeFilter) TF = new StdSelect_ShapeTypeFilter(TheType);
3771 TheAISContext()->AddFilter(TF);
3772 TheAISContext()->ActivateStandardMode(TheType);
3777 // step 2 : wait for the selection...
3778 Standard_Boolean NoShape (Standard_True);
3779 Standard_Integer NbPick(0);
3780 Standard_Integer argccc = 5;
3781 const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
3782 const char **argvvv = (const char **) bufff;
3785 while(NoShape && NbPick<= MaxPick){
3786 while(ViewerMainLoop(argccc,argvvv)){}
3787 NoShape = (TheAISContext()->NbSelected()==0) ;
3789 cout<<"Nb Pick :"<<NbPick<<endl;
3792 // step3 get result.
3796 TheAISContext()->InitSelected();
3797 if(TheAISContext()->HasSelectedShape())
3798 result = TheAISContext()->SelectedShape();
3800 Handle(AIS_InteractiveObject) IO = TheAISContext()->SelectedInteractive();
3801 result = (*((Handle(AIS_Shape)*) &IO))->Shape();
3806 TheAISContext()->CloseLocalContext(curindex);
3812 //=======================================================================
3813 //function : PickShapes
3815 //=======================================================================
3816 Standard_Boolean ViewerTest::PickShapes (const TopAbs_ShapeEnum TheType,
3817 Handle(TopTools_HArray1OfShape)& thearr,
3818 const Standard_Integer MaxPick)
3821 Standard_Integer Taille = thearr->Length();
3823 cout<<" WARNING : Pick with Shift+ MB1 for Selection of more than 1 object"<<"\n";
3825 // step 1: prepare the data
3826 Standard_Integer curindex = TheAISContext()->OpenLocalContext();
3827 if(TheType==TopAbs_SHAPE){
3828 Handle(AIS_TypeFilter) F1 = new AIS_TypeFilter(AIS_KOI_Shape);
3829 TheAISContext()->AddFilter(F1);
3832 Handle(StdSelect_ShapeTypeFilter) TF = new StdSelect_ShapeTypeFilter(TheType);
3833 TheAISContext()->AddFilter(TF);
3834 TheAISContext()->ActivateStandardMode(TheType);
3838 // step 2 : wait for the selection...
3840 Standard_Boolean NbPickGood (0),NbToReach(thearr->Length());
3841 Standard_Integer NbPickFail(0);
3842 Standard_Integer argccc = 5;
3843 const char *bufff[] = { "A", "B", "C","D", "E" };
3844 const char **argvvv = (const char **) bufff;
3847 while(NbPickGood<NbToReach && NbPickFail <= MaxPick){
3848 while(ViewerMainLoop(argccc,argvvv)){}
3849 Standard_Integer NbStored = TheAISContext()->NbSelected();
3850 if((unsigned int ) NbStored != NbPickGood)
3851 NbPickGood= NbStored;
3854 cout<<"NbPicked = "<<NbPickGood<<" | Nb Pick Fail :"<<NbPickFail<<"\n";
3857 // step3 get result.
3859 if((unsigned int ) NbPickFail >= NbToReach) return Standard_False;
3861 Standard_Integer i(0);
3862 for(TheAISContext()->InitSelected();TheAISContext()->MoreSelected();TheAISContext()->NextSelected()){
3864 if(TheAISContext()->HasSelectedShape())
3865 thearr->SetValue(i,TheAISContext()->SelectedShape());
3867 Handle(AIS_InteractiveObject) IO = TheAISContext()->SelectedInteractive();
3868 thearr->SetValue(i,(*((Handle(AIS_Shape)*) &IO))->Shape());
3872 TheAISContext()->CloseLocalContext(curindex);
3873 return Standard_True;
3877 //=======================================================================
3878 //function : VPickShape
3880 //=======================================================================
3881 static int VPickShape( Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3883 TopoDS_Shape PickSh;
3884 TopAbs_ShapeEnum theType = TopAbs_COMPOUND;
3887 theType = TopAbs_SHAPE;
3889 if(!strcasecmp(argv[1],"V" )) theType = TopAbs_VERTEX;
3890 else if (!strcasecmp(argv[1],"E" )) theType = TopAbs_EDGE;
3891 else if (!strcasecmp(argv[1],"W" )) theType = TopAbs_WIRE;
3892 else if (!strcasecmp(argv[1],"F" )) theType = TopAbs_FACE;
3893 else if(!strcasecmp(argv[1],"SHAPE" )) theType = TopAbs_SHAPE;
3894 else if (!strcasecmp(argv[1],"SHELL" )) theType = TopAbs_SHELL;
3895 else if (!strcasecmp(argv[1],"SOLID" )) theType = TopAbs_SOLID;
3898 static Standard_Integer nbOfSub[8]={0,0,0,0,0,0,0,0};
3899 static TCollection_AsciiString nameType[8] = {"COMPS","SOL","SHE","F","W","E","V","SHAP"};
3901 TCollection_AsciiString name;
3904 Standard_Integer NbToPick = argc>2 ? argc-2 : 1;
3906 PickSh = ViewerTest::PickShape(theType);
3915 if(!PickSh.IsNull()){
3916 nbOfSub[Standard_Integer(theType)]++;
3918 name += nameType[Standard_Integer(theType)];
3919 TCollection_AsciiString indxstring(nbOfSub[Standard_Integer(theType)]);
3924 // si on avait une petite methode pour voir si la shape
3925 // est deja dans la Double map, ca eviterait de creer....
3926 DBRep::Set(name.ToCString(),PickSh);
3928 Handle(AIS_Shape) newsh = new AIS_Shape(PickSh);
3929 GetMapOfAIS().Bind(newsh, name);
3930 TheAISContext()->Display(newsh);
3931 di<<"Nom de la shape pickee : "<<name.ToCString()<<"\n";
3934 // Plusieurs objets a picker, vite vite vite....
3937 Standard_Boolean autonaming = !strcasecmp(argv[2],".");
3938 Handle(TopTools_HArray1OfShape) arr = new TopTools_HArray1OfShape(1,NbToPick);
3939 if(ViewerTest::PickShapes(theType,arr)){
3940 for(Standard_Integer i=1;i<=NbToPick;i++){
3941 PickSh = arr->Value(i);
3942 if(!PickSh.IsNull()){
3944 nbOfSub[Standard_Integer(theType)]++;
3947 name += nameType[Standard_Integer(theType)];
3948 TCollection_AsciiString indxstring(nbOfSub[Standard_Integer(theType)]);
3956 DBRep::Set(name.ToCString(),PickSh);
3957 Handle(AIS_Shape) newsh = new AIS_Shape(PickSh);
3958 GetMapOfAIS().Bind(newsh, name);
3959 di<<"display of picke shape #"<<i<<" - nom : "<<name.ToCString()<<"\n";
3960 TheAISContext()->Display(newsh);
3968 //=======================================================================
3969 //function : list of known objects
3971 //=======================================================================
3972 static int VIOTypes( Draw_Interpretor& di, Standard_Integer , const char** )
3974 // 1234567890 12345678901234567 123456789
3975 TCollection_AsciiString Colum [3]={"Standard Types","Type Of Object","Signature"};
3976 TCollection_AsciiString BlankLine(64,'_');
3977 Standard_Integer i ;
3979 di<<"/n"<<BlankLine.ToCString()<<"\n";
3982 Colum[i].Center(20,' ');
3984 di<<"|"<<Colum[i].ToCString();
3987 di<<BlankLine.ToCString()<<"\n";
3989 // TCollection_AsciiString thetypes[5]={"Datum","Shape","Object","Relation","None"};
3990 const char ** names = GetTypeNames();
3992 TCollection_AsciiString curstring;
3993 TCollection_AsciiString curcolum[3];
3996 // les objets de type Datum..
3997 curcolum[1]+="Datum";
3999 curcolum[0].Clear();
4000 curcolum[0] += names[i];
4002 curcolum[2].Clear();
4003 curcolum[2]+=TCollection_AsciiString(i+1);
4005 for(Standard_Integer j =0;j<=2;j++){
4006 curcolum[j].Center(20,' ');
4007 di<<"|"<<curcolum[j].ToCString();
4011 di<<BlankLine.ToCString()<<"\n";
4013 // les objets de type shape
4014 curcolum[1].Clear();
4015 curcolum[1]+="Shape";
4016 curcolum[1].Center(20,' ');
4019 curcolum[0].Clear();
4020 curcolum[0] += names[7+i];
4021 curcolum[2].Clear();
4022 curcolum[2]+=TCollection_AsciiString(i);
4024 for(Standard_Integer j =0;j<=2;j++){
4025 curcolum[j].Center(20,' ');
4026 di<<"|"<<curcolum[j].ToCString();
4030 di<<BlankLine.ToCString()<<"\n";
4031 // les IO de type objet...
4032 curcolum[1].Clear();
4033 curcolum[1]+="Object";
4034 curcolum[1].Center(20,' ');
4036 curcolum[0].Clear();
4037 curcolum[0] += names[10+i];
4038 curcolum[2].Clear();
4039 curcolum[2]+=TCollection_AsciiString(i);
4041 for(Standard_Integer j =0;j<=2;j++){
4042 curcolum[j].Center(20,' ');
4043 di<<"|"<<curcolum[j].ToCString();
4047 di<<BlankLine.ToCString()<<"\n";
4048 // les contraintes et dimensions.
4049 // pour l'instant on separe juste contraintes et dimensions...
4050 // plus tard, on detaillera toutes les sortes...
4051 curcolum[1].Clear();
4052 curcolum[1]+="Relation";
4053 curcolum[1].Center(20,' ');
4055 curcolum[0].Clear();
4056 curcolum[0] += names[12+i];
4057 curcolum[2].Clear();
4058 curcolum[2]+=TCollection_AsciiString(i);
4060 for(Standard_Integer j =0;j<=2;j++){
4061 curcolum[j].Center(20,' ');
4062 di<<"|"<<curcolum[j].ToCString();
4066 di<<BlankLine.ToCString()<<"\n";
4073 static int VEraseType( Draw_Interpretor& , Standard_Integer argc, const char** argv)
4075 if(argc!=2) return 1;
4077 AIS_KindOfInteractive TheType;
4078 Standard_Integer TheSign(-1);
4079 GetTypeAndSignfromString(argv[1],TheType,TheSign);
4082 AIS_ListOfInteractive LIO;
4084 // en attendant l'amelioration ais pour les dimensions...
4086 Standard_Integer dimension_status(-1);
4087 if(TheType==AIS_KOI_Relation){
4088 dimension_status = TheSign ==1 ? 1 : 0;
4092 TheAISContext()->DisplayedObjects(TheType,TheSign,LIO);
4093 Handle(AIS_InteractiveObject) curio;
4094 for(AIS_ListIteratorOfListOfInteractive it(LIO);it.More();it.Next()){
4097 if(dimension_status == -1)
4098 TheAISContext()->Erase(curio,Standard_False);
4100 AIS_KindOfDimension KOD = (*((Handle(AIS_Relation)*)&curio))->KindOfDimension();
4101 if ((dimension_status==0 && KOD == AIS_KOD_NONE)||
4102 (dimension_status==1 && KOD != AIS_KOD_NONE))
4103 TheAISContext()->Erase(curio,Standard_False);
4106 TheAISContext()->UpdateCurrentViewer();
4109 static int VDisplayType(Draw_Interpretor& , Standard_Integer argc, const char** argv)
4111 if(argc!=2) return 1;
4113 AIS_KindOfInteractive TheType;
4114 Standard_Integer TheSign(-1);
4115 GetTypeAndSignfromString(argv[1],TheType,TheSign);
4117 // en attendant l'amelioration ais pour les dimensions...
4119 Standard_Integer dimension_status(-1);
4120 if(TheType==AIS_KOI_Relation){
4121 dimension_status = TheSign ==1 ? 1 : 0;
4125 AIS_ListOfInteractive LIO;
4126 TheAISContext()->ObjectsInside(LIO,TheType,TheSign);
4127 Handle(AIS_InteractiveObject) curio;
4128 for(AIS_ListIteratorOfListOfInteractive it(LIO);it.More();it.Next()){
4130 if(dimension_status == -1)
4131 TheAISContext()->Display(curio,Standard_False);
4133 AIS_KindOfDimension KOD = (*((Handle(AIS_Relation)*)&curio))->KindOfDimension();
4134 if ((dimension_status==0 && KOD == AIS_KOD_NONE)||
4135 (dimension_status==1 && KOD != AIS_KOD_NONE))
4136 TheAISContext()->Display(curio,Standard_False);
4141 TheAISContext()->UpdateCurrentViewer();
4145 //==============================================================================
4146 //function : VSetTransMode
4148 //Draw arg : vsettransmode shape flag1 [flag2] [flag3] [X Y Z]
4149 //==============================================================================
4151 static int VSetTransMode ( Draw_Interpretor& di, Standard_Integer argc, const char** argv ) {
4152 // Verification des arguments
4153 if ( a3DView().IsNull() ) {
4154 ViewerTest::ViewerInit();
4155 di << "La commande vinit n'a pas ete appele avant" << "\n";
4158 if ( argc < 3 || argc > 8 ) {
4159 di << argv[0] << " Invalid number of arguments" << "\n";
4163 TCollection_AsciiString shapeName;
4164 shapeName = argv[1];
4165 Standard_Integer persFlag1 = Draw::Atoi(argv[2]);
4166 Standard_Integer persFlag2 = 0;
4167 Standard_Integer persFlag3 = 0;
4168 gp_Pnt origin = gp_Pnt( 0.0, 0.0, 0.0 );
4169 if ( argc == 4 || argc == 5 || argc == 7 || argc == 8 ) {
4170 persFlag2 = Draw::Atoi(argv[3]);
4172 if ( argc == 5 || argc == 8 ) {
4173 persFlag3 = Draw::Atoi(argv[4]);
4176 origin.SetX( Draw::Atof(argv[argc - 3]) );
4177 origin.SetY( Draw::Atof(argv[argc - 2]) );
4178 origin.SetZ( Draw::Atof(argv[argc - 1]) );
4181 Standard_Boolean IsBound = GetMapOfAIS().IsBound2(shapeName);
4182 Handle(Standard_Transient) anObj;
4184 anObj = GetMapOfAIS().Find2(shapeName);
4185 if ( anObj->IsKind(STANDARD_TYPE(AIS_InteractiveObject)) ) {
4186 Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast(anObj);
4187 aShape->SetTransformPersistence( (persFlag1 | persFlag2 | persFlag3), origin );
4188 if ( persFlag1 == 0 && persFlag2 == 0 && persFlag3 == 0 ) {
4189 di << argv[0] << " All persistence modifiers were removed" << "\n";
4192 di << argv[0] << " Wrong object type" << "\n";
4195 } else { // Create the AIS_Shape from a name
4196 const Handle(AIS_InteractiveObject) aShape = GetAISShapeFromName((const char* )shapeName.ToCString());
4197 if ( !aShape.IsNull() ) {
4198 GetMapOfAIS().Bind( aShape, shapeName );
4199 aShape->SetTransformPersistence( (persFlag1 | persFlag2 | persFlag3), origin );
4200 TheAISContext()->Display( aShape, Standard_False );
4202 di << argv[0] << " Object not found" << "\n";
4207 // Upadate the screen and redraw the view
4208 TheAISContext()->UpdateCurrentViewer();
4212 static Standard_Integer vr(Draw_Interpretor& , Standard_Integer , const char** a)
4215 BRep_Builder builder;
4217 BRepTools::Read(shape, s, builder);
4218 DBRep::Set(a[1], shape);
4219 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
4220 Handle(AIS_Shape) ais = new AIS_Shape(shape);
4225 //==============================================================================
4226 //function : ViewerTest::Commands
4227 //purpose : Add all the viewer command in the Draw_Interpretor
4228 //==============================================================================
4230 void ViewerTest::Commands(Draw_Interpretor& theCommands)
4232 ViewerTest::ViewerCommands(theCommands);
4233 ViewerTest::RelationCommands(theCommands);
4234 ViewerTest::ObjectCommands(theCommands);
4235 ViewerTest::FilletCommands(theCommands);
4236 ViewerTest::VoxelCommands(theCommands);
4237 ViewerTest::OpenGlCommands(theCommands);
4239 const char *group = "AIS_Display";
4242 theCommands.Add("visos",
4243 "visos [name1 ...] [nbUIsos nbVIsos IsoOnPlane(0|1)]\n"
4244 "\tIf last 3 optional parameters are not set prints numbers of U-, V- isolines and IsoOnPlane.\n",
4245 __FILE__, visos, group);
4247 theCommands.Add("vdisplay",
4248 "vdisplay [-noupdate|-update] [-mutable] name1 [name2] ... [name n]"
4249 "\n\t\t: Displays named objects."
4250 "\n\t\t: Option -noupdate suppresses viewer redraw call."
4251 "\n\t\t: Option -mutable enables optimizations for mutable objects."
4252 __FILE__,VDisplay2,group);
4254 theCommands.Add ("vupdate",
4255 "vupdate name1 [name2] ... [name n]"
4256 "\n\t\t: Updates named objects in interactive context",
4257 __FILE__, VUpdate, group);
4259 theCommands.Add("verase",
4260 "verase [-noupdate|-update] [name1] ... [name n]"
4261 "\n\t\t: Erases selected or named objects."
4262 "\n\t\t: If there are no selected or named objects the whole viewer is erased.",
4263 __FILE__, VErase, group);
4265 theCommands.Add("vremove",
4266 "vremove [-noupdate|-update] [-context] [-all] [-noinfo] [name1] ... [name n]"
4267 "or vremove [-context] -all to remove all objects"
4268 "\n\t\t: Removes selected or named objects."
4269 "\n\t\t If -context is in arguments, the objects are not deleted"
4270 "\n\t\t from the map of objects and names."
4271 "\n\t\t: Option -noupdate suppresses viewer redraw call."
4272 "\n\t\t: Option -noinfo suppresses displaying the list of removed objects.",
4273 __FILE__, VRemove, group);
4275 theCommands.Add("vdonly",
4276 "vdonly [-noupdate|-update] [name1] ... [name n]"
4277 "\n\t\t: Displays only selected or named objects",
4278 __FILE__,VDonly2,group);
4280 theCommands.Add("vdisplayall",
4281 "Displays all erased interactive objects (see vdir and vstate)",
4282 __FILE__,VDisplayAll,group);
4284 theCommands.Add("veraseall",
4285 "Erases all objects displayed in the viewer",
4286 __FILE__, VErase, group);
4288 theCommands.Add("verasetype",
4290 "\n\t\t: Erase all the displayed objects of one given kind (see vtypes)",
4291 __FILE__,VEraseType,group);
4293 theCommands.Add("vbounding",
4294 "vbounding [-noupdate|-update] [-mode] name1 [name2 [...]]"
4295 "\n\t\t: [-print] [-hide]"
4296 "\n\t\t: Temporarily display bounding box of specified Interactive"
4297 "\n\t\t: Objects, or print it to console if -print is specified."
4298 "\n\t\t: Already displayed box might be hidden by -hide option.",
4299 __FILE__,VBounding,group);
4301 theCommands.Add("vdisplaytype",
4302 "vdisplaytype : vdisplaytype <Type> <Signature> \n\t display all the objects of one given kind (see vtypes) which are stored the AISContext ",
4303 __FILE__,VDisplayType,group);
4305 theCommands.Add("vdisplaymode",
4306 "vdispmode : vdispmode [name] mode(1,2,..) : no name -> on selected objects ",
4307 __FILE__,VDispMode,group);
4309 theCommands.Add("verasemode",
4310 "verasemode : verasemode [name] mode(1,2,..) : no name -> on selected objects",
4311 __FILE__,VDispMode,group);
4313 theCommands.Add("vsetdispmode",
4314 "vsetdispmode [name] mode(1,2,..)"
4315 "\n\t\t: Sets display mode for all, selected or named objects.",
4316 __FILE__,VDispMode,group);
4318 theCommands.Add("vunsetdispmode",
4319 "vunsetdispmode [name]"
4320 "\n\t\t: Unsets custom display mode for selected or named objects.",
4321 __FILE__,VDispMode,group);
4323 theCommands.Add("vdir",
4324 "Lists all objects displayed in 3D viewer",
4325 __FILE__,VDir,group);
4327 theCommands.Add("vdump",
4328 #ifdef HAVE_FREEIMAGE
4329 "vdump <filename>.{png|bmp|jpg|gif} [rgb|rgba|depth=rgb] [mono|left|right=mono]"
4330 "\n\t\t: [width Width=0 height Height=0]"
4331 "\n\t\t: Dumps content of the active view into PNG, BMP, JPEG or GIF file",
4333 "vdump <filename>.{ppm} [rgb|rgba|depth=rgb] [mono|left|right=mono]"
4334 "\n\t\t: [width Width=0 height Height=0]"
4335 "\n\t\t: Dumps content of the active view into PPM image file",
4337 __FILE__,VDump,group);
4339 theCommands.Add("vsub", "vsub 0/1 (off/on) [obj] : Subintensity(on/off) of selected objects",
4340 __FILE__,VSubInt,group);
4342 theCommands.Add("vaspects",
4343 "vaspects [-noupdate|-update] [name1 [name2 [...]]]"
4344 "\n\t\t: [-setcolor ColorName] [-unsetcolor]"
4345 "\n\t\t: [-setmaterial MatName] [-unsetmaterial]"
4346 "\n\t\t: [-settransparency Transp] [-unsettransparency]"
4347 "\n\t\t: [-setwidth LineWidth] [-unsetwidth]"
4348 "\n\t\t: [-subshapes subname1 [subname2 [...]]]"
4349 "\n\t\t: Manage presentation properties of all, selected or named objects."
4350 "\n\t\t: When -subshapes is specified than following properties will be"
4351 "\n\t\t: assigned to specified sub-shapes.",
4352 __FILE__,VAspects,group);
4354 theCommands.Add("vsetcolor",
4355 "vsetcolor [-noupdate|-update] [name] ColorName"
4356 "\n\t\t: Sets color for all, selected or named objects."
4357 "\n\t\t: Alias for vaspects -setcolor [name] ColorName.",
4358 __FILE__,VAspects,group);
4360 theCommands.Add("vunsetcolor",
4361 "vunsetcolor [-noupdate|-update] [name]"
4362 "\n\t\t: Resets color for all, selected or named objects."
4363 "\n\t\t: Alias for vaspects -unsetcolor [name].",
4364 __FILE__,VAspects,group);
4366 theCommands.Add("vsettransparency",
4367 "vsettransparency [-noupdate|-update] [name] Coefficient"
4368 "\n\t\t: Sets transparency for all, selected or named objects."
4369 "\n\t\t: The Coefficient may be between 0.0 (opaque) and 1.0 (fully transparent)."
4370 "\n\t\t: Alias for vaspects -settransp [name] Coefficient.",
4371 __FILE__,VAspects,group);
4373 theCommands.Add("vunsettransparency",
4374 "vunsettransparency [-noupdate|-update] [name]"
4375 "\n\t\t: Resets transparency for all, selected or named objects."
4376 "\n\t\t: Alias for vaspects -unsettransp [name].",
4377 __FILE__,VAspects,group);
4379 theCommands.Add("vsetmaterial",
4380 "vsetmaterial [-noupdate|-update] [name] MaterialName"
4381 "\n\t\t: Alias for vaspects -setmaterial [name] MaterialName.",
4382 __FILE__,VAspects,group);
4384 theCommands.Add("vunsetmaterial",
4385 "vunsetmaterial [-noupdate|-update] [name]"
4386 "\n\t\t: Alias for vaspects -unsetmaterial [name].",
4387 __FILE__,VAspects,group);
4389 theCommands.Add("vsetwidth",
4390 "vsetwidth [-noupdate|-update] [name] width(0->10)"
4391 "\n\t\t: Alias for vaspects -setwidth [name] width.",
4392 __FILE__,VAspects,group);
4394 theCommands.Add("vunsetwidth",
4395 "vunsetwidth [-noupdate|-update] [name]"
4396 "\n\t\t: Alias for vaspects -unsetwidth [name] width.",
4397 __FILE__,VAspects,group);
4399 theCommands.Add("vsetinteriorstyle",
4400 "vsetinteriorstyle [-noupdate|-update] [name] style"
4401 "\n\t\t: Where style is: 0 = EMPTY, 1 = HOLLOW, 2 = HATCH, 3 = SOLID, 4 = HIDDENLINE.",
4402 __FILE__,VSetInteriorStyle,group);
4404 theCommands.Add("vardis",
4405 "vardis : display activeareas",
4406 __FILE__,VDispAreas,group);
4408 theCommands.Add("varera",
4409 "varera : erase activeareas",
4410 __FILE__,VClearAreas,group);
4412 theCommands.Add("vsensdis",
4413 "vardisp : display active entities",
4414 __FILE__,VDispSensi,group);
4415 theCommands.Add("vsensera",
4416 "vardisp : erase active entities",
4417 __FILE__,VClearSensi,group);
4419 theCommands.Add("vselprecision",
4420 "vselprecision : vselprecision [precision_mode [tolerance_value]]",
4421 __FILE__,VSelPrecision,group);
4423 theCommands.Add("vperf",
4424 "vperf: vperf ShapeName 1/0(Transfo/Location) 1/0(Primitives sensibles ON/OFF)",
4425 __FILE__,VPerf,group);
4427 theCommands.Add("vanimation",
4428 "vanimation CrankArmFile CylinderHeadFile PropellerFile EngineBlockFile",
4429 __FILE__,VAnimation,group);
4431 theCommands.Add("vsetshading",
4432 "vsetshading : vsetshading name Quality(default=0.0008) ",
4433 __FILE__,VShading,group);
4435 theCommands.Add("vunsetshading",
4436 "vunsetshading :vunsetshading name ",
4437 __FILE__,VShading,group);
4439 theCommands.Add ("vtexture",
4440 "\n'vtexture NameOfShape [TextureFile | IdOfTexture]\n"
4441 " [-scale u v] [-scale off]\n"
4442 " [-origin u v] [-origin off]\n"
4443 " [-repeat u v] [-repeat off]\n"
4444 " [-modulate {on | off}]"
4446 " The texture can be specified by filepath or as ID (0<=IdOfTexture<=20)\n"
4447 " specifying one of the predefined textures.\n"
4448 " The options are: \n"
4449 " -scale u v : enable texture scaling and set scale factors\n"
4450 " -scale off : disable texture scaling\n"
4451 " -origin u v : enable texture origin positioning and set the origin\n"
4452 " -origin off : disable texture origin positioning\n"
4453 " -repeat u v : enable texture repeat and set texture coordinate scaling\n"
4454 " -repeat off : disable texture repeat\n"
4455 " -modulate {on | off} : enable or disable texture modulation\n"
4456 " -default : sets texture mapping default parameters\n"
4457 "or 'vtexture NameOfShape' if you want to disable texture mapping\n"
4458 "or 'vtexture NameOfShape ?' to list available textures\n",
4459 __FILE__, VTexture, group);
4461 theCommands.Add("vtexscale",
4462 "'vtexscale NameOfShape ScaleU ScaleV' \n \
4463 or 'vtexscale NameOfShape ScaleUV' \n \
4464 or 'vtexscale NameOfShape' to disable scaling\n ",
4465 __FILE__,VTexture,group);
4467 theCommands.Add("vtexorigin",
4468 "'vtexorigin NameOfShape UOrigin VOrigin' \n \
4469 or 'vtexorigin NameOfShape UVOrigin' \n \
4470 or 'vtexorigin NameOfShape' to disable origin positioning\n ",
4471 __FILE__,VTexture,group);
4473 theCommands.Add("vtexrepeat",
4474 "'vtexrepeat NameOfShape URepeat VRepeat' \n \
4475 or 'vtexrepeat NameOfShape UVRepeat \n \
4476 or 'vtexrepeat NameOfShape' to disable texture repeat \n ",
4479 theCommands.Add("vtexdefault",
4480 "'vtexdefault NameOfShape' to set texture mapping default parameters \n",
4483 theCommands.Add("vsetam",
4484 "vsetActivatedModes: vsetam mode(1->7) ",
4485 __FILE__,VActivatedMode,group);
4487 theCommands.Add("vunsetam",
4488 "vunsetActivatedModes: vunsetam ",
4489 __FILE__,VActivatedMode,group);
4491 theCommands.Add("vstate",
4492 "vstate [name1] ... [nameN]"
4493 "\n\t\t: Reports show/hidden state for selected or named objects",
4494 __FILE__,VState,group);
4496 theCommands.Add("vpickshapes",
4497 "vpickshape subtype(VERTEX,EDGE,WIRE,FACE,SHELL,SOLID) [name1 or .] [name2 or .] [name n or .]",
4498 __FILE__,VPickShape,group);
4500 theCommands.Add("vtypes",
4501 "vtypes : list of known types and signatures in AIS - To be Used in vpickobject command for selection with filters",
4504 theCommands.Add("vsettransmode",
4505 "vsettransmode : vsettransmode shape flag1 [flag2] [flag3] [X Y Z]",
4506 __FILE__,VSetTransMode,group);
4508 theCommands.Add("vr", "vr : reading of the shape",
4509 __FILE__,vr, group);
4513 //=====================================================================
4514 //========================= for testing Draft and Rib =================
4515 //=====================================================================
4516 #include <BRepOffsetAPI_MakeThickSolid.hxx>
4517 #include <DBRep.hxx>
4518 #include <TopoDS_Face.hxx>
4519 #include <gp_Pln.hxx>
4520 #include <AIS_KindOfSurface.hxx>
4521 #include <BRepOffsetAPI_DraftAngle.hxx>
4522 #include <Precision.hxx>
4523 #include <BRepAlgo.hxx>
4524 #include <OSD_Environment.hxx>
4525 #include <DrawTrSurf.hxx>
4526 //#include <DbgTools.hxx>
4527 //#include <FeatAlgo_MakeLinearForm.hxx>
4532 //=======================================================================
4533 //function : IsValid
4535 //=======================================================================
4536 static Standard_Boolean IsValid(const TopTools_ListOfShape& theArgs,
4537 const TopoDS_Shape& theResult,
4538 const Standard_Boolean closedSolid,
4539 const Standard_Boolean GeomCtrl)
4541 OSD_Environment check ("DONT_SWITCH_IS_VALID") ;
4542 TCollection_AsciiString checkValid = check.Value();
4543 Standard_Boolean ToCheck = Standard_True;
4544 if (!checkValid.IsEmpty()) {
4546 cout <<"DONT_SWITCH_IS_VALID positionnee a :"<<checkValid.ToCString()<<"\n";
4548 if ( checkValid=="true" || checkValid=="TRUE" ) {
4549 ToCheck= Standard_False;
4553 cout <<"DONT_SWITCH_IS_VALID non positionne"<<"\n";
4556 Standard_Boolean IsValid = Standard_True;
4558 IsValid = BRepAlgo::IsValid(theArgs,theResult,closedSolid,GeomCtrl) ;
4563 //===============================================================================
4564 // TDraft : test draft, uses AIS Viewer
4565 // Solid Face Plane Angle Reverse
4566 //===============================================================================
4567 static Standard_Integer TDraft(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
4569 if (argc < 5) return 1;
4570 // argv[1] - TopoDS_Shape Solid
4571 // argv[2] - TopoDS_Shape Face
4572 // argv[3] - TopoDS_Shape Plane
4573 // argv[4] - Standard_Real Angle
4574 // argv[5] - Standard_Integer Reverse
4576 // Sprintf(prefix, argv[1]);
4577 Standard_Real anAngle = 0;
4578 Standard_Boolean Rev = Standard_False;
4579 Standard_Integer rev = 0;
4580 TopoDS_Shape Solid = GetShapeFromName(argv[1]);
4581 TopoDS_Shape face = GetShapeFromName(argv[2]);
4582 TopoDS_Face Face = TopoDS::Face(face);
4583 TopoDS_Shape Plane = GetShapeFromName(argv[3]);
4584 if (Plane.IsNull ()) {
4585 di << "TEST : Plane is NULL" << "\n";
4588 anAngle = Draw::Atof(argv[4]);
4589 anAngle = 2*M_PI * anAngle / 360.0;
4591 Handle( Geom_Surface )aSurf;
4592 AIS_KindOfSurface aSurfType;
4593 Standard_Real Offset;
4595 if(argc > 4) { // == 5
4596 rev = Draw::Atoi(argv[5]);
4597 Rev = (rev)? Standard_True : Standard_False;
4600 TopoDS_Face face2 = TopoDS::Face(Plane);
4601 if(!AIS::GetPlaneFromFace(face2, aPln, aSurf, aSurfType, Offset))
4603 di << "TEST : Can't find plane" << "\n";
4607 aDir = aPln.Axis().Direction();
4610 if (Plane.Orientation() == TopAbs_REVERSED)
4612 di << "TEST : gp::Resolution() = " << gp::Resolution() << "\n";
4614 BRepOffsetAPI_DraftAngle Draft (Solid);
4616 if(Abs(anAngle)< Precision::Angular()) {
4617 di << "TEST : NULL angle" << "\n";
4620 if(Rev) anAngle = - anAngle;
4621 Draft.Add (Face, aDir, anAngle, aPln);
4623 if (!Draft.IsDone()) {
4624 di << "TEST : Draft Not DONE " << "\n";
4627 TopTools_ListOfShape Larg;
4629 if (!IsValid(Larg,Draft.Shape(),Standard_True,Standard_False)) {
4630 di << "TEST : DesignAlgo returns Not valid" << "\n";
4634 Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
4635 Handle(AIS_Shape) ais = new AIS_Shape(Draft.Shape());
4637 if ( !ais.IsNull() ) {
4638 ais->SetColor(DEFAULT_COLOR);
4639 ais->SetMaterial(DEFAULT_MATERIAL);
4640 // Display the AIS_Shape without redraw
4641 Ctx->Display(ais, Standard_False);
4643 const char *Name = "draft1";
4644 Standard_Boolean IsBound = GetMapOfAIS().IsBound2(Name);
4646 Handle(AIS_InteractiveObject) an_object =
4647 Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(Name));
4648 if (!an_object.IsNull()) {
4649 Ctx->Remove(an_object,
4651 GetMapOfAIS().UnBind2(Name) ;
4654 GetMapOfAIS().Bind(ais, Name);
4655 // DBRep::Set("draft", ais->Shape());
4657 Ctx->Display(ais, Standard_True);
4661 //==============================================================================
4662 //function : splitParameter
4663 //purpose : Split parameter string to parameter name and parameter value
4664 //==============================================================================
4665 Standard_Boolean ViewerTest::SplitParameter (const TCollection_AsciiString& theString,
4666 TCollection_AsciiString& theName,
4667 TCollection_AsciiString& theValue)
4669 Standard_Integer aParamNameEnd = theString.FirstLocationInSet ("=", 1, theString.Length());
4671 if (aParamNameEnd == 0)
4673 return Standard_False;
4676 TCollection_AsciiString aString (theString);
4677 if (aParamNameEnd != 0)
4679 theValue = aString.Split (aParamNameEnd);
4680 aString.Split (aString.Length() - 1);
4684 return Standard_True;
4687 //============================================================================
4689 //============================================================================
4690 void ViewerTest::MyCommands( Draw_Interpretor& theCommands)
4693 DrawTrSurf::BasicCommands(theCommands);
4694 const char* group = "Check Features Operations commands";
4696 theCommands.Add("Draft","Draft Solid Face Plane Angle Reverse",
4698 &TDraft,group); //Draft_Modification
4701 //==============================================================================
4702 // ViewerTest::Factory
4703 //==============================================================================
4704 void ViewerTest::Factory(Draw_Interpretor& theDI)
4706 // definition of Viewer Command
4707 ViewerTest::Commands(theDI);
4708 ViewerTest::AviCommands(theDI);
4711 theDI << "Draw Plugin : OCC V2d & V3d commands are loaded" << "\n";
4715 // Declare entry point PLUGINFACTORY