0028643: Coding rules - eliminate GCC compiler warnings -Wmisleading-indentation
[occt.git] / src / QABugs / QABugs_11.cxx
1 // Created on: 2002-03-20
2 // Created by: QA Admin
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <stdio.h>
17
18 #include <QABugs.hxx>
19
20 #include <Draw.hxx>
21 #include <Draw_Interpretor.hxx>
22 #include <DBRep.hxx>
23 #include <DrawTrSurf.hxx>
24 #include <AIS_InteractiveContext.hxx>
25 #include <ViewerTest.hxx>
26 #include <AIS_Shape.hxx>
27 #include <TopoDS_Shape.hxx>
28
29 #include <Geom_Surface.hxx>
30 #include <Geom_Axis2Placement.hxx>
31 #include <gp.hxx>
32 #include <gp_Trsf.hxx>
33 #include <AIS_Trihedron.hxx>
34 #include <BRepPrimAPI_MakeBox.hxx>
35 #include <Graphic3d_MaterialAspect.hxx>
36 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
37 #include <TopoDS_Solid.hxx>
38 #include <BRepPrimAPI_MakeSphere.hxx>
39 #include <BRepPrimAPI_MakeCone.hxx>
40 #include <BRepPrimAPI_MakeCylinder.hxx>
41 #include <IGESToBRep_Reader.hxx>
42 #include <TopExp_Explorer.hxx>
43 #include <TopoDS.hxx>
44 #include <GCPnts_UniformDeflection.hxx>
45 #include <BRepAdaptor_Curve.hxx>
46 #include <IGESToBRep.hxx>
47 #include <V3d_Viewer.hxx>
48 #include <BRepAdaptor_CompCurve.hxx>
49 #include <GCPnts_AbscissaPoint.hxx>
50 #include <Standard_ErrorHandler.hxx>
51 #include <Standard_Overflow.hxx>
52 #include <Standard_Underflow.hxx>
53 #include <Standard_DivideByZero.hxx>
54 #include <OSD_SIGSEGV.hxx>
55 #include <OSD_Exception_ACCESS_VIOLATION.hxx>
56 #include <OSD_Exception_STACK_OVERFLOW.hxx>
57 #include <OSD.hxx>
58 #include <STEPCAFControl_Writer.hxx>
59 #include <STEPControl_StepModelType.hxx>
60 #include <Interface_Static.hxx>
61 #include <IFSelect_ReturnStatus.hxx>
62 #include <Standard_Failure.hxx>
63 #include <TColgp_HArray1OfPnt2d.hxx>
64 #include <Geom2dAPI_Interpolate.hxx>
65 #include <Geom2d_BSplineCurve.hxx>
66 #include <Geom2dConvert_BSplineCurveToBezierCurve.hxx>
67 #include <Geom2d_BezierCurve.hxx>
68 #include <BRep_Tool.hxx>
69 #include <GeomProjLib.hxx>
70 #include <Geom2dAPI_InterCurveCurve.hxx>
71 #include <IntRes2d_IntersectionSegment.hxx>
72 #include <TDataStd_RealArray.hxx>
73 #include <TDF_CopyLabel.hxx>
74 #include <NCollection_Vector.hxx>
75 #include <TColStd_Array1OfInteger.hxx>
76 #include <Geom_BSplineCurve.hxx>
77 #include <TColgp_Array1OfPnt.hxx>
78 #include <AIS_ColorScale.hxx>
79 #include <AIS_ListOfInteractive.hxx>
80 #include <AIS_ListIteratorOfListOfInteractive.hxx>
81 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
82 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
83 #include <BRepBuilderAPI_MakePolygon.hxx>
84 #include <gp_GTrsf.hxx>
85 #include <Poly_Triangulation.hxx>
86 #include <IGESControl_Reader.hxx>
87 #include <IGESData_IGESModel.hxx>
88 #include <IGESData_IGESEntity.hxx>
89 #include <V3d_View.hxx>
90 #include <BRepFeat_SplitShape.hxx>
91 #include <BRepAlgoAPI_Section.hxx>
92 #include <TColStd_PackedMapOfInteger.hxx>
93
94 #if ! defined(_WIN32)
95 extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
96 #else
97 Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
98 #endif
99
100 static Standard_Integer  OCC128 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** argv)
101 {
102   Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
103   if(myAISContext.IsNull()) {
104     di << "use 'vinit' command before " << argv[0] ;
105     return 1;
106   }
107
108   Handle(Geom_Axis2Placement) aTrihedronAxis = new Geom_Axis2Placement(gp::XOY());
109
110   gp_Trsf trsf1;
111   trsf1.SetTranslation(gp_Vec(100, 100, 0));
112   aTrihedronAxis->Transform(trsf1);
113   Handle(AIS_Trihedron) myTrihedron = new AIS_Trihedron(aTrihedronAxis);
114   myTrihedron->SetColor(Quantity_NOC_LIGHTSTEELBLUE4);
115   myTrihedron->SetSize(100);
116   myAISContext->Display(myTrihedron, Standard_True);
117
118 //  TopoDS_Shape shape1 = (TopoDS_Shape) BRepPrimAPI_MakeBox(50,50,50);
119   TopoDS_Shape shape1 = BRepPrimAPI_MakeBox(50,50,50).Shape();
120   Handle(AIS_Shape) AS = new AIS_Shape(shape1);
121   AS->SetDisplayMode(1);
122   Graphic3d_MaterialAspect mat(Graphic3d_NOM_PLASTIC);
123   AS->SetMaterial(mat);
124   AS->SetColor(Quantity_NOC_RED);
125   myAISContext->Display (AS, Standard_False);
126
127   gp_Trsf TouchTrsf;
128   TouchTrsf.SetTranslation(gp_Vec(20, 20, 0));
129
130   myAISContext->ResetLocation(AS);
131   myAISContext->SetLocation(AS , TouchTrsf) ;
132   myAISContext->Redisplay(AS, Standard_True);
133
134  return 0;
135 }
136
137   // Remove as bad version of QAAddOrRemoveSelected from QADraw
138 //static Standard_Integer OCC129 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
139 //{
140 //  if( argc != 3) {
141 //    di<<"Usage : " << argv[0] << " shape islocal\n";
142 //    return 1;
143 //  }
144 //  //get AIS_Shape:
145 //  Handle(AIS_InteractiveContext) anAISCtx = ViewerTest::GetAISContext();
146 //
147 // //   ViewerTest_DoubleMapOfInteractiveAndName& aMap =
148 // //                          ViewerTest::GetDataMapOfAIS ();
149 //  ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
150 //
151 //  TCollection_AsciiString aName(argv[1]);
152 //  Handle(AIS_InteractiveObject) AISObj;
153 //
154 //  if(aMap.IsBound2(aName)) {
155 //    AISObj = aMap.Find2(aName);
156 //    if(AISObj.IsNull()){
157 //      di<<"No interactive object \n";
158 //      return 1;
159 //    }
160 //
161 //    Standard_Integer aNum = -1;
162 //
163 //    if(Draw::Atoi(argv[2])) {
164 //      aNum = anAISCtx->OpenLocalContext();
165 //    }
166 //
167 //    if(anAISCtx->HasOpenedContext()){
168 //      anAISCtx->InitSelected();
169 //      anAISCtx->AddOrRemoveSelected(AISObj);
170 //    }
171 //    else {
172 //      anAISCtx->InitCurrent();
173 //      anAISCtx->AddOrRemoveCurrentObject(AISObj);
174 //    }
175 //
176 //    if(aNum >= 0) {
177 // //      anAISCtx->CloseLocalContext(aNum);
178 //    }
179 //
180 //    return 0;
181 //  }
182 //  //select this shape:
183 //  else {
184 //    di<<"Use 'vdisplay' before";
185 //    return 1;
186 //  }
187 //}
188
189 static Standard_Integer OCC136 (Draw_Interpretor& di, Standard_Integer argc, const char ** /*argv*/)
190 {
191   if(argc > 1){
192     di<<"Usage: OCC136\n";
193     return 1;
194   }
195
196   //create some primitives:
197   // Two basic points:
198   Standard_Real Size=100;
199   gp_Pnt P0(0,0,0), P1(Size,Size,Size);
200   //box
201   TopoDS_Solid aBox = BRepPrimAPI_MakeBox(P0,P1);
202   //sphere
203   TopoDS_Solid aSphere = BRepPrimAPI_MakeSphere (Size*0.5);
204   //cone
205   gp_Ax2 anAx2(P1, gp_Dir(1,1,1));
206   TopoDS_Solid aCone = BRepPrimAPI_MakeCone(anAx2, Size*0.7, Size*0.3, Size);
207   //cylinder
208   anAx2.SetLocation(gp_Pnt(Size,0,0));
209   anAx2.SetDirection(gp_Dir(-1,-1,1));
210   TopoDS_Solid aCyl = BRepPrimAPI_MakeCylinder(anAx2, Size*0.5, Size);
211
212   Handle(AIS_InteractiveContext) anAISCtx = ViewerTest::GetAISContext();
213   if(anAISCtx.IsNull()){
214     di<<"Null interactive context. Use 'vinit' at first.\n";
215     return 1;
216   }
217
218   anAISCtx->EraseAll (Standard_False);
219
220   //load primitives to context
221   Handle(AIS_InteractiveObject) aSh1 = new AIS_Shape(aBox);
222   anAISCtx->Display (aSh1, Standard_False);
223
224   Handle(AIS_InteractiveObject) aSh2 = new AIS_Shape(aSphere);
225   anAISCtx->Display (aSh2, Standard_False);
226
227   Handle(AIS_InteractiveObject) aSh3 = new AIS_Shape(aCone);
228   anAISCtx->Display (aSh3, Standard_False);
229
230   Handle(AIS_InteractiveObject) aSh4 = new AIS_Shape(aCyl);
231   anAISCtx->Display (aSh4, Standard_False);
232
233   //set selected
234   anAISCtx->InitSelected();
235   anAISCtx->AddOrRemoveSelected (aSh1, Standard_False);
236   anAISCtx->AddOrRemoveSelected (aSh2, Standard_False);
237   anAISCtx->AddOrRemoveSelected (aSh3, Standard_False);
238   anAISCtx->AddOrRemoveSelected (aSh4, Standard_False);
239
240   //remove all this objects from context
241   anAISCtx->Remove (aSh1, Standard_False);
242   anAISCtx->Remove (aSh2, Standard_False);
243   anAISCtx->Remove (aSh3, Standard_False);
244   anAISCtx->Remove (aSh4, Standard_False);
245
246   anAISCtx->UpdateCurrentViewer();
247   return 0;
248 }
249
250 static int BUC60610(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
251   if(argc < 2){
252     printf("Usage: %s  iges_input [name]\n",argv[0]);
253     return(1);
254   }
255   Standard_Character *Ch = NULL;
256
257   if(argc > 2) {
258     Ch = new Standard_Character[strlen(argv[2])+3];
259   }
260   IGESToBRep_Reader IR;
261   IR.LoadFile (argv[1]);
262   IR.Clear();
263   IR.TransferRoots();
264   TopoDS_Shape aTopShape = IR.OneShape();
265   TopExp_Explorer ex(aTopShape, TopAbs_EDGE);
266   Standard_Integer i=0;
267   for( ; ex.More(); ex.Next()){
268     const TopoDS_Edge &E = TopoDS::Edge(ex.Current());
269     BRepAdaptor_Curve aCurve(E);
270     GCPnts_UniformDeflection plin(aCurve, 0.1);
271     di << "Num points = " << plin.NbPoints() << "\n";
272     if(argc > 2) {
273       i++;
274       Sprintf(Ch,"%s_%i",argv[2],1);
275       DBRep::Set(Ch,E);
276     }
277   }
278   return (1);
279 }
280
281 //====================================================
282 //
283 // Following code is inserted from
284 // /dn03/KAS/dev/QAopt/src/QADraw/QADraw_TOPOLOGY.cxx
285 // ( 75455 Apr 16 18:59)
286 //
287 //====================================================
288
289 //OCC105
290 #include <BRepTools_WireExplorer.hxx>
291 #include <BRep_Tool.hxx>
292 #include <GCPnts_UniformAbscissa.hxx>
293 #include <TopExp.hxx>
294
295 //
296 // usage : OCC105 shape
297 //
298 // comments:
299 //GCPnts_UniformAbscissa returns bad end point foe first edge. Its value is
300
301 //Value Pnt = -338.556216693211 -394.465571897208 0
302 //should be
303 //Value Pnt = -307.47165394 -340.18073533 0
304
305 static int OCC105(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
306 {
307   if (argc != 2){
308     di<<"Usage : OCC105 shape\n";
309     return 1;
310   }
311 //  TopoDS_Wire myTopoDSWire = TopoDS::Wire(DBRep::Get("aa.brep"));
312   TopoDS_Wire myTopoDSWire = TopoDS::Wire(DBRep::Get(argv[1]));
313   Standard_Real l = 0.5; //Draw::Atof(argv[2]);
314   // Find the first vertex of the wire
315   BRepTools_WireExplorer wire_exp(myTopoDSWire);
316   TopoDS_Vertex vlast;
317   {
318     TopoDS_Vertex vw1, vw2;
319     TopExp::Vertices(myTopoDSWire,vw1,vw2);
320     TopoDS_Vertex ve1, ve2;
321     TopoDS_Edge edge = TopoDS::Edge(wire_exp.Current());
322     TopExp::Vertices(edge,ve1,ve2);
323     if (vw1.IsSame(ve1) || vw1.IsSame(ve2))
324       vlast = vw1;
325     else {
326 //      assert(vw2.IsSame(ve1) || vw2.IsSame(ve2));
327       vlast = vw2;
328     }
329   }
330   for ( ; wire_exp.More(); wire_exp.Next())
331     {
332       di << "\n\n New Edge \n"   << "\n";
333       Standard_Real newufirst, newulast;
334       TopoDS_Edge edge = TopoDS::Edge(wire_exp.Current());
335       Standard_Real ufirst, ulast;
336       Handle(Geom_Curve) acurve;
337       TopoDS_Vertex ve1, ve2;
338       TopExp::Vertices(edge,ve1,ve2);
339       if (ve1.IsSame(vlast))
340         {
341           acurve = BRep_Tool::Curve(edge, ufirst, ulast);
342           newufirst = ufirst;
343           newulast  = ulast;
344           vlast = ve2;
345         }
346       else
347         {
348 //          assert(ve2.IsSame(vlast));
349 //          assert ( wire_exp.Orientation( ) == TopAbs_REVERSED );
350           acurve = BRep_Tool::Curve( edge, ufirst, ulast );
351           newufirst = acurve->ReversedParameter( ufirst );
352           newulast  = acurve->ReversedParameter( ulast );
353           acurve = acurve->Reversed( );
354           vlast = ve1;
355         }
356
357       GeomAdaptor_Curve   curve;
358       GCPnts_UniformAbscissa  algo;
359       curve.Load(acurve);
360       algo.Initialize( curve, l, newufirst, newulast );
361       if (!algo.IsDone())
362         di << "Not Done!!!"   << "\n";
363       for (Standard_Integer Index = 1; Index<=algo.NbPoints();Index++) {
364         Standard_Real t = algo.Parameter(Index);
365         gp_Pnt      pt3 = curve.Value(t);
366         di << "Parameter t = " << t   << "\n";
367         di << "Value Pnt = " << pt3.X()<<" " <<pt3.Y()<<" " << pt3.Z()  << "\n";
368       }
369     }
370   return 0;
371
372 }
373
374 #include <TColStd_SequenceOfTransient.hxx>
375 #include <GeomFill_Pipe.hxx>
376 static int pipe_OCC9 (Draw_Interpretor& di,
377                       Standard_Integer n, const char ** a)
378 {
379   if (n < 6) {
380     di << "Usage: " << a[0] << " result path cur1 cur2 radius [tolerance]\n";
381     return 1;
382   }
383
384   TColStd_SequenceOfTransient aCurveSeq;
385   Standard_Integer i;
386   for (i=2 ; i<=4; i++) {
387     Handle(Geom_Curve) aC = Handle(Geom_Curve)::DownCast( DrawTrSurf::Get(a[i]) );
388     if (aC.IsNull()) {
389       di << a[i] << " is not a curve\n";
390       return 1;
391     }
392     aCurveSeq.Append(aC);
393   }
394
395   GeomFill_Pipe aPipe(Handle(Geom_Curve)::DownCast( aCurveSeq(1) ),
396                       Handle(Geom_Curve)::DownCast( aCurveSeq(2) ),
397                       Handle(Geom_Curve)::DownCast( aCurveSeq(3) ),
398                       Draw::Atof (a[5]) );
399
400   if (n == 7) {
401     aPipe.Perform(Draw::Atof (a[6]), Standard_True);
402   } else {
403     aPipe.Perform(Standard_True/*, Standard_True*/);
404   }
405
406   if (!aPipe.IsDone()) {
407     di << "GeomFill_Pipe cannot make a surface\n";
408     return 1;
409   }
410
411   Handle(Geom_Surface) aSurf = aPipe.Surface();
412
413   DrawTrSurf::Set(a[1], aSurf);
414   return 0;
415 }
416
417 //======================================================================
418 // OCC125
419 // usage : OCC125 shell
420 //======================================================================
421 #include <ShapeFix_Shell.hxx>
422
423 Standard_Integer  OCC125(Draw_Interpretor& di ,
424                          Standard_Integer n,
425                          const char ** a)
426 {
427   if (n!=2) {
428     di<<" Use OCC125 shell";
429     return 1;
430   }
431
432   TopoDS_Shape S = DBRep::Get(a[1]);
433
434   if (S.IsNull()) {
435     di<<" Null shape is not allowed";
436     return 1;
437   }
438
439   TopAbs_ShapeEnum aT;
440   aT=S.ShapeType();
441   if (aT!=TopAbs_SHELL) {
442     di<<" Shape Type must be SHELL";
443     return 1;
444   }
445
446   const TopoDS_Shell& aShell = TopoDS::Shell(S);
447   //
448   Standard_Boolean isAccountMultiConex, bNonManifold, bResult;
449
450   isAccountMultiConex=Standard_True;
451   bNonManifold=Standard_False;
452
453   Handle (ShapeFix_Shell) aFix = new ShapeFix_Shell(aShell);
454   bResult=aFix->FixFaceOrientation(aShell, isAccountMultiConex, bNonManifold);
455
456   di<<"bResult="<<(Standard_Integer)bResult;
457
458   TopoDS_Shape aShape;
459   aShape=aFix->Shape();
460
461   TCollection_AsciiString aName(a[1]), aDef("_sh"), aRName;
462   aRName=aName;
463   aRName=aRName+aDef;
464   DBRep::Set (aRName.ToCString(), aShape);
465   di<<aRName.ToCString();
466   //
467   return 0;
468 }
469
470 #include <BRepLib_FindSurface.hxx>
471 #include <BRepBuilderAPI_MakeFace.hxx>
472 Standard_Integer  OCC157(Draw_Interpretor& di,
473                          Standard_Integer n,
474                          const char ** a)
475 //static Standard_Integer findplanarsurface(Draw_Interpretor&, Standard_Integer n, const char ** a)
476 {
477   if (n<3) {
478     di << "bad number of arguments\n";
479     return 1;
480   }
481
482   // try to read a shape:
483   TopoDS_Shape inputShape=DBRep::Get(a[2]);
484   if (inputShape.IsNull() || inputShape.ShapeType() != TopAbs_WIRE) {
485     di << "Invalid input shape\n";
486     return 1;
487   }
488   Standard_Real toler = Draw::Atof(a[3]);
489   TopoDS_Wire aWire = TopoDS::Wire(inputShape);
490   BRepLib_FindSurface FS(aWire, toler, Standard_True);
491   if(FS.Found()) {
492     di<<"OCC157: OK; Planar surface is found\n";
493     Handle(Geom_Surface) aSurf = FS.Surface();
494     BRepBuilderAPI_MakeFace aMakeFace(aSurf,aWire,Standard_True);
495     if(aMakeFace.IsDone()) {
496       TopoDS_Face aFace = aMakeFace.Face();
497       DBRep::Set(a[1],aFace);
498     }
499   }
500   else di<<"OCC157: ERROR; Planar surface is not found with toler = "<<toler <<"\n";
501   return 0;
502
503 }
504
505 // #include <MyCommandsCMD.h>
506 #include <ShapeFix_Shape.hxx>
507 #include <BRepOffset_MakeOffset.hxx>
508 #include <BRepOffsetAPI_MakeOffset.hxx>
509 #include <BRepOffset_Mode.hxx>
510 #include <GeomAbs_JoinType.hxx>
511 #include <AIS_Shape.hxx>
512
513 #include <BRepTools.hxx>
514
515 Standard_Integer  OCC165(Draw_Interpretor& di ,
516                          Standard_Integer n,
517                          const char ** a)
518
519
520 //=======================================================================
521
522 // static int YOffset (Draw_Interpretor& di, Standard_Integer argc, const char ** argv);
523
524 // void MyOffsets_Commands(Draw_Interpretor& theCommands)
525 // {
526 //      theCommands.Add("yoffset" , "yoffset" , __FILE__, YOffset, " Offset on Z Direction");
527 // }
528
529 //=======================================================================
530
531 // static int YOffset (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
532  {
533    if (n > 2)
534      {
535        di <<"Usage : " << a[0] << " [file]\n";
536        return 1;
537      }
538         di.Eval ("axo");
539
540 #define _OFFSET_TELCO_
541 #ifdef _OFFSET_TELCO_
542
543         Standard_CString file = a[1];
544
545         BRep_Builder aBuilder;
546         TopoDS_Shape theShape;
547         //BRepTools::Read(theShape, Standard_CString("/dn02/users_SUN/inv/3/OCC165/2d_tr_line.brep"), aBuilder);
548         BRepTools::Read(theShape, file, aBuilder);
549         DBRep::Set("shape", theShape);
550
551         TopoDS_Wire theWire = TopoDS::Wire(theShape);
552
553         Standard_Real anOffset = 1.5;
554
555 #else
556
557         Standard_Real xA = 0.0, xB = 200.0, xC = 200.0, xD = 0.0,
558                 yA = 0.0, yB = 0.0, yC = 200.0, yD = 200.0,
559                 zA = 0.0, zB = 0.0, zC = 0.0, zD = 0.0;
560
561         BRepBuilderAPI_MakePolygon theSquare;
562         TopoDS_Vertex theA = BRepBuilderAPI_MakeVertex(gp_Pnt(xA, yA, zA));
563         theSquare.Add(theA);
564         TopoDS_Vertex theB = BRepBuilderAPI_MakeVertex(gp_Pnt(xB, yB, zB));
565         theSquare.Add(theB);
566         TopoDS_Vertex theC = BRepBuilderAPI_MakeVertex(gp_Pnt(xC, yC, zC));
567         theSquare.Add(theC);
568         TopoDS_Vertex theD = BRepBuilderAPI_MakeVertex(gp_Pnt(xD, yD, zD));
569         theSquare.Add(theD);
570
571         theSquare.Close();
572         TopoDS_Wire theWire = theSquare.Wire();
573
574         Standard_Real anOffset = 10;
575
576
577 #endif /* _OFFSET_TELCO_ */
578
579
580         TopoDS_Face theFace = BRepBuilderAPI_MakeFace(theWire).Face();
581         DBRep::Set("face", theFace);
582
583
584         Standard_Real anAlt = 0.;
585         GeomAbs_JoinType theJoin = GeomAbs_Intersection;
586 //GeomAbs_Intersection; //GeomAbs_Arc;
587         BRepOffsetAPI_MakeOffset aMakeOffset(theFace, theJoin);
588         aMakeOffset.AddWire(theWire);
589
590         aMakeOffset.Perform(anOffset, anAlt);
591
592         TopoDS_Shape theOffsetShapePos = aMakeOffset.Shape();
593         DBRep::Set("offset", theOffsetShapePos);
594         return 0;
595 //      return TCL_OK;
596 }
597
598 #include<BRepAlgoAPI_Cut.hxx>
599
600 #include<BRepPrimAPI_MakeHalfSpace.hxx>
601 #include<Geom_CartesianPoint.hxx>
602 #include<AIS_Point.hxx>
603
604 #include <BRepBuilderAPI_MakeEdge.hxx>
605 #include <BRepBuilderAPI_MakeWire.hxx>
606 #include <BRepBuilderAPI_MakeFace.hxx>
607
608 static Standard_Integer OCC297 (Draw_Interpretor& di,Standard_Integer /*argc*/, const char ** argv )
609
610 {
611   Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
612   if (myAISContext.IsNull()) {
613     di << "use 'vinit' command before " << argv[0] << "\n";
614     return -1;
615   }
616   
617   gp_Pnt pt1_(250., 250., 0.);
618   gp_Pnt pt2_(-250., 250., 0.);
619   gp_Pnt pt3_(-250., -250., 0.);
620   gp_Pnt pt4_(250., -250., 0.);
621   BRepBuilderAPI_MakeEdge edg1_(pt1_, pt2_);
622   BRepBuilderAPI_MakeEdge edg2_(pt2_, pt3_);
623   BRepBuilderAPI_MakeEdge edg3_(pt3_, pt4_);
624   BRepBuilderAPI_MakeEdge edg4_(pt4_, pt1_);
625
626   BRepBuilderAPI_MakeWire wire_(edg1_, edg2_, edg3_, edg4_);
627   BRepBuilderAPI_MakeFace face_(wire_);
628   TopoDS_Face sh_ = face_.Face();
629
630   int up = 1;
631
632   gp_Pnt g_pnt;
633   if (up)
634     g_pnt = gp_Pnt(0, 0, -100);
635   else
636     g_pnt = gp_Pnt(0, 0, 100);
637
638   myAISContext->EraseAll(Standard_False);
639   Handle(Geom_CartesianPoint) GEOMPoint = new Geom_CartesianPoint(g_pnt);
640   Handle(AIS_Point) AISPoint = new AIS_Point(GEOMPoint);
641   myAISContext->Display(AISPoint, Standard_True);
642
643   BRepPrimAPI_MakeHalfSpace half_(sh_, g_pnt);
644   TopoDS_Solid sol1_ = half_.Solid();
645
646   DBRep::Set("Face", sol1_);
647
648   gp_Ax1 ax1_(gp_Pnt(0., 0., -100.), gp_Dir(0., 0., 1.));
649
650   Standard_Real x = 0., y = 0., z = -80.;
651
652   BRepPrimAPI_MakeBox box(gp_Pnt(x, y, z), gp_Pnt(x + 150, y + 200, z + 200));
653
654   DBRep::Set("Box", box.Shape());
655
656   return 0;
657
658 }
659
660 #include<GProp_GProps.hxx>
661 #include<BRepGProp.hxx>
662
663 static Standard_Integer OCC305 (Draw_Interpretor& di,Standard_Integer argc, const char ** argv )
664
665 {
666   if (argc != 2)
667   {
668     di <<"Usage : " << argv[0] << " file\n";
669     return 1;
670   }
671   Standard_CString file = argv[1];
672
673   Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
674   if(myAISContext.IsNull()) {
675     di << "use 'vinit' command before " << argv[0] << "\n";
676     return -1;
677   }
678
679 TopoDS_Shape sh;
680 BRep_Builder builder;
681 //BRepTools::Read(sh, "/dn02/users_SUN/inv/3/OCC305/testc.brep", builder);
682 BRepTools::Read(sh, file, builder);
683
684 TopoDS_Wire wire;
685 builder.MakeWire(wire);
686 TopoDS_Edge ed;
687 TopoDS_Vertex vt1, vt2;
688 TopExp_Explorer wex(sh, TopAbs_EDGE);
689 for(;wex.More();wex.Next())
690 {
691     ed = TopoDS::Edge(wex.Current());
692     TopExp::Vertices(ed, vt1, vt2);
693     builder.UpdateVertex(vt1, 0.01);
694     builder.UpdateVertex(vt2, 0.01);
695     builder.UpdateEdge(ed, 0.01);
696     builder.Add(wire, ed);
697
698
699     GProp_GProps lprop;
700     BRepGProp::LinearProperties(ed, lprop);
701     printf("\n length = %f", lprop.Mass());
702 }
703  DBRep::Set("Wire",wire);
704 // Handle(AIS_Shape) res = new AIS_Shape( wire );
705 // aContext->SetColor( res, Quantity_NOC_RED );
706 // aContext->Display( res );
707
708 // BRepOffsetAPI_MakeOffset off(wire, GeomAbs_Arc);
709 // off.Perform(0.5, 0);
710
711 // printf("\n IsDone = %d", off.IsDone());
712 // sh = off.Shape();
713 // res = new AIS_Shape( sh );
714 // aContext->SetColor( res, Quantity_NOC_GREEN );
715 // aContext->Display( res );
716
717   return 0;
718
719 }
720
721 static Standard_Integer OCC166 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** argv)
722 {
723
724   Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
725   if(myAISContext.IsNull()) {
726     di << "use 'vinit' command before " << argv[0];
727     return 1;
728   }
729
730   BRepPrimAPI_MakeBox aBox(gp_Pnt(0, 0, 0), 100, 100, 100);
731   Handle(AIS_Shape) anAISBox = new AIS_Shape(aBox.Shape());
732   myAISContext->SetAutoActivateSelection (Standard_False);
733   myAISContext->Display(anAISBox, 1);
734
735   TColStd_ListOfInteger anActivatedModes;
736   myAISContext->ActivatedModes (anAISBox, anActivatedModes);
737   if(anActivatedModes.Extent() != 1 || anActivatedModes.First() != -1 )
738     return 1;
739
740   return 0;
741 }
742
743 #include <TDocStd_Document.hxx>
744 #include <DDocStd.hxx>
745 #include <PCDM_StoreStatus.hxx>
746 #include <TDocStd_Application.hxx>
747
748 static Standard_Integer OCC381_Save (Draw_Interpretor& di, Standard_Integer nb, const char ** a)
749 {
750   if (nb != 2) {
751     di << "Usage: " << a[0] << " Doc\n";
752     return 1;
753   }
754
755   Handle(TDocStd_Document) D;
756   if (!DDocStd::GetDocument(a[1],D)) return 1;
757
758   Handle(TDocStd_Application) A = DDocStd::GetApplication();
759
760   TCollection_ExtendedString theStatusMessage;
761   if (!D->IsSaved()) {
762     di << "this document has never been saved\n";
763     return 0;
764   }
765   PCDM_StoreStatus theStatus = A->Save(D, theStatusMessage);
766   if (theStatus != PCDM_SS_OK ) {
767     switch ( theStatus ) {
768       case PCDM_SS_DriverFailure: {
769         di << "Error saving document: Could not store , no driver found to make it\n";
770         break ;
771       }
772       case PCDM_SS_WriteFailure: {
773         di << "Error saving document: Write access failure\n";
774         break;
775       }
776       case PCDM_SS_Failure: {
777         di << "Error saving document: Write failure\n" ;
778         break;
779       }
780       case PCDM_SS_Doc_IsNull: {
781         di << "Error saving document: No document to save\n";
782         break ;
783       }
784       case PCDM_SS_No_Obj: {
785         di << "Error saving document: No objects written\n";
786         break;
787       }
788       case PCDM_SS_Info_Section_Error: {
789         di << "Error saving document: Write info section failure\n" ;
790         break;
791       }
792       default:
793           break;
794     }
795     return 1;
796   }
797   return 0;
798 }
799
800 static Standard_Integer OCC381_SaveAs (Draw_Interpretor& di, Standard_Integer nb, const char ** a)
801 {
802   if (nb != 3) {
803     di << "Usage: " << a[0] << " Doc Path\n";
804     return 1;
805   }
806
807   Handle(TDocStd_Document) D;
808   if (!DDocStd::GetDocument(a[1],D)) return 1;
809
810   TCollection_ExtendedString path (a[2]);
811   Handle(TDocStd_Application) A = DDocStd::GetApplication();
812
813   TCollection_ExtendedString theStatusMessage;
814   PCDM_StoreStatus theStatus = A->SaveAs(D,path, theStatusMessage);
815   if (theStatus != PCDM_SS_OK ) {
816     switch ( theStatus ) {
817       case PCDM_SS_DriverFailure: {
818         di << "Error saving document: Could not store , no driver found to make it\n";
819         break ;
820       }
821       case PCDM_SS_WriteFailure: {
822         di << "Error saving document: Write access failure\n";
823         break;
824       }
825       case PCDM_SS_Failure: {
826         di << "Error saving document: Write failure\n" ;
827         break;
828       }
829       case PCDM_SS_Doc_IsNull: {
830         di << "Error saving document: No document to save\n";
831         break ;
832       }
833       case PCDM_SS_No_Obj: {
834         di << "Error saving document: No objects written\n";
835         break;
836       }
837       case PCDM_SS_Info_Section_Error: {
838         di << "Error saving document: Write info section failure\n" ;
839         break;
840       }
841       default:
842           break;
843     }
844     return 1;
845   }
846
847   return 0;
848 }
849
850 #include <BRepClass3d_SolidClassifier.hxx>
851
852 Standard_Integer OCC299bug (Draw_Interpretor& theDi,
853                             Standard_Integer  theArgNb,
854                             const char**      theArgVec)
855 {
856   if (theArgNb < 3)
857   {
858     theDi << "Usage : " << theArgVec[0] << " Solid Point [Tolerance=1.e-7]\n";
859     return -1;
860   }
861
862   TopoDS_Shape aS = DBRep::Get (theArgVec[1]);
863   if (aS.IsNull())
864   {
865     theDi << " Null Shape is not allowed here\n";
866     return 1;
867   }
868   else if (aS.ShapeType() != TopAbs_SOLID)
869   {
870     theDi << " Shape type must be SOLID\n";
871     return 1;
872   }
873
874   gp_Pnt aP (8., 9., 10.);
875   if (!DrawTrSurf::GetPoint (theArgVec[2], aP))
876   {
877     theDi << " Null Point is not allowed here\n";
878     return 1;
879   }
880   const Standard_Real aTol = (theArgNb == 4) ? Draw::Atof (theArgVec[3]) : 1.e-7;
881
882   BRepClass3d_SolidClassifier aSC (aS);
883   aSC.Perform (aP, aTol);
884
885   switch (aSC.State())
886   {
887     case TopAbs_IN:      theDi << "The point is IN shape\n";      return 0;
888     case TopAbs_OUT:     theDi << "The point is OUT of shape\n";  return 0;
889     case TopAbs_ON:      theDi << "The point is ON shape\n";      return 0;
890     case TopAbs_UNKNOWN:
891     default:             theDi << "The point is UNKNOWN shape\n"; return 0;
892   }
893 }
894
895 #include <OSD_Process.hxx>
896 #include <OSD_Path.hxx>
897
898 static Standard_Integer OCC309bug (Draw_Interpretor& di, Standard_Integer nb, const char ** a)
899 {
900   if (nb != 1) {
901     di << "Usage: " << a[0] << "\n";
902     return 1;
903   }
904   OSD_Process p;
905   OSD_Path d = p.CurrentDirectory();
906   TCollection_AsciiString s;
907   d.SystemName(s);
908   di << "*" <<  s.ToCString() << "*\n";
909   d.UpTrek();
910   d.SystemName(s);
911   di <<  "*" <<  s.ToCString() <<  "*\n";
912   return 0;
913 }
914
915 static Standard_Integer OCC310bug (Draw_Interpretor& di, Standard_Integer nb, const char ** a)
916 {
917   if (nb != 1) {
918     di << "Usage: " << a[0] << "\n";
919     return 1;
920   }
921   OSD_Path p("/where/you/want/tmp/qwerty/tmp/");
922   di << p.Trek().ToCString() << "\n";
923   p.UpTrek();
924   di << p.Trek().ToCString() << "\n";
925   return 0;
926 }
927
928 #include <BRepAlgoAPI_Fuse.hxx>
929 #include <BRepAlgoAPI_Common.hxx>
930
931 static Standard_Integer OCC277bug (Draw_Interpretor& di, Standard_Integer nb, const char ** a)
932 {
933   if(nb != 1) {
934     di << "Usage : " << a[0] << "\n";
935     return 1;
936   }
937
938   BRepPrimAPI_MakeBox box1( 100, 100, 100 );
939   BRepPrimAPI_MakeBox box2( gp_Pnt( 50, 50,50 ), 200, 200, 200 );
940
941   TopoDS_Shape shape1 = box1.Shape();
942   TopoDS_Shape shape2 = box2.Shape();
943
944   TopoDS_Shape fuse,comm;
945   di << "fuse = BRepAlgoAPI_Fuse( shape1, shape2 )\n";
946   di << "comm = BRepAlgoAPI_Common( shape1, shape2 )\n";
947   fuse = BRepAlgoAPI_Fuse(shape1, shape2).Shape();
948   comm = BRepAlgoAPI_Common(shape1, shape2).Shape();
949
950   return 0;
951 }
952
953 #include <ShapeAnalysis_Edge.hxx>
954
955 static Standard_Integer OCC333bug (Draw_Interpretor& di, Standard_Integer n, const char ** a)
956 {
957   if( n < 3) {
958     di<<"-1\n";
959     di << "Usage: " << a[0] << " edge1 edge2 [toler domaindist]\n";
960     return 1;
961   }
962   TopoDS_Shape Sh1 = DBRep::Get(a[1]);
963   TopoDS_Shape Sh2 = DBRep::Get(a[2]);
964   if(Sh1.IsNull() || Sh2.IsNull()) {
965     di<<"-2\n";
966     di<<"Invalid arguments\n";
967     return 1;
968   }
969   TopoDS_Edge e1 = TopoDS::Edge(Sh1);
970   TopoDS_Edge e2 = TopoDS::Edge(Sh2);
971   if(e1.IsNull() || e2.IsNull()) {
972     di<<"-3\n";
973     di<<"Invalid type of arguments\n";
974     return 1;
975   }
976   Standard_Real aTol = Precision::Confusion();
977   Standard_Real aDistDomain = 0.0;
978   Standard_Integer k = 3;
979   if(k < n)
980     aTol = Draw::Atof(a[k++]);
981   if(k < n)
982     aDistDomain = Draw::Atof(a[k++]);
983
984   ShapeAnalysis_Edge sae;
985   if(sae.CheckOverlapping(e1,e2,aTol,aDistDomain)) {
986     if(aDistDomain ==0.0) {
987       di<<"1\n";
988       di<<"Edges is overlaping comletly\n";
989     } else {
990       di<<"2\n";
991       di<<"Edges is overlaped\n";
992       di<<"with tolerance = "<<aTol<<"\n";
993       di<<"on segment length = "<<aDistDomain<<"\n";
994     }
995   } else {
996     di<<"3\n";
997     di<<"Edges is not overlaped\n";
998   }
999   return 0;
1000 }
1001
1002
1003 #include <DDocStd_DrawDocument.hxx>
1004 #include <TDataStd_Name.hxx>
1005 #include <Draw.hxx>
1006 #include <XCAFDoc_ShapeTool.hxx>
1007 #include <XCAFDoc_DocumentTool.hxx>
1008 #include <TDF_LabelSequence.hxx>
1009 #include <TPrsStd_AISPresentation.hxx>
1010 #include <TDF_Data.hxx>
1011 #include <TDF_Label.hxx>
1012 #include <XCAFPrs_Driver.hxx>
1013
1014 //------------------------------------------------------------------------------------------
1015 // name    : OCC363
1016 // Purpose :
1017 //------------------------------------------------------------------------------------------
1018 static Standard_Integer OCC363 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1019 {
1020   try
1021   {
1022     OCC_CATCH_SIGNALS
1023     // 1. Verufy amount of arguments
1024     if(argc < 3) { di <<"Error OCC363 : Use : OCC363 document filename\n"; return 1; }
1025
1026     // 2. Retrieve DDocStd application
1027     Handle(TDocStd_Application) App = DDocStd::GetApplication();
1028
1029     // 3. Open document
1030     TCollection_ExtendedString name(argv[2]);
1031     Handle(TDocStd_Document) Doc;
1032     if(App->Open(name, Doc) != PCDM_RS_OK) { di << "Error OCC363 : document was not opened successfully\n"; return 1;}
1033     Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(Doc);
1034     TDataStd_Name::Set(Doc->GetData()->Root(),argv[1]);
1035     Draw::Set(argv[1],DD);
1036
1037     // 4. Create prsentations
1038     Handle(XCAFDoc_ShapeTool) shapes = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1039     TDF_LabelSequence seq;
1040     shapes->GetFreeShapes ( seq );
1041     Handle(TPrsStd_AISPresentation) prs;
1042     for ( Standard_Integer i=1; i <= seq.Length(); i++ )
1043       if ( ! seq.Value(i).FindAttribute ( TPrsStd_AISPresentation::GetID(), prs ) )
1044         prs = TPrsStd_AISPresentation::Set(seq.Value(i),XCAFPrs_Driver::GetID());
1045   }
1046   catch(Standard_Failure) { di << "FAULTY OCC363 : Exception during reading document.\n";return 0;}
1047
1048   di << "OCC363 OK\n";
1049   return 0;
1050 }
1051
1052 // Must use OCC299
1053 ////======================================================================================
1054 //// Function : OCC372
1055 //// Purpose  :
1056 ////======================================================================================
1057 //static Standard_Integer OCC372 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1058 //{
1059 //  try
1060 //  {
1061 //    OCC_CATCH_SIGNALS
1062 //    // 1. Verufy amount of arguments
1063 //    if(argc < 2) {di << "OCC372 FAULTY. Use : OCC372 brep-file";return 0;}
1064 //
1065 //    // 2. Read solid
1066 //    BRep_Builder B;
1067 //    TopoDS_Shape Ref;
1068 //    BRepTools::Read(Ref, argv[1], B);
1069 //
1070 //    // 3. Calculate location of aP3d in relation to the solid
1071 //    gp_Pnt aP3d(6311.4862583184, -2841.3092756034, 16.461053497188);
1072 //    BRepClass3d_SolidClassifier SC(Ref);
1073 //    SC.Perform(aP3d, 1e-7);
1074 //
1075 //    // 4. Check returned state. The point must be inside the solid.
1076 //    TopAbs_State aState=SC.State();
1077 //    switch (aState)
1078 //    {
1079 //    case TopAbs_OUT:
1080 //      di<<"OCC372 FAULTY. aState = TopAbs_OUT";
1081 //      return 0;
1082 //    case TopAbs_ON:
1083 //      di<<"OCC372 FAULTY. aState = TopAbs_ON";
1084 //     return 0;
1085 //    case TopAbs_IN:
1086 //      di<<"OCC372 OK. aState = TopAbs_IN" ;
1087 //      return 0;
1088 //    default:
1089 //      di<<"OCC372 FAULTY. aState = UNKNOWN";
1090 //      return 0;
1091 //    }
1092 //  }
1093 //  catch (Standard_Failure) { di<<"OCC372 FAULTY. Exception raised"; }
1094 //
1095 //  return 0;
1096 //}
1097
1098 #include <BRepTopAdaptor_FClass2d.hxx>
1099
1100 //======================================================================================
1101 // Function : OCC377
1102 // Purpose  :
1103 //======================================================================================
1104 static Standard_Integer OCC377 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1105 {
1106   try
1107   {
1108     OCC_CATCH_SIGNALS
1109     // 1. Verify validity of arguments
1110     if ( argc < 1 ) {di << "Error OCC377. Use  OCC377 file x y precuv \n";return 0;}
1111
1112     // 2. Initialize parameters
1113     gp_Pnt2d p2d;
1114     p2d.SetX ( Draw::Atof(argv[2]) );
1115     p2d.SetY ( Draw::Atof(argv[3]) );
1116     Standard_Real precuv = Draw::Atof (argv[4] );
1117
1118     // 3. Read shape
1119     BRep_Builder B;
1120     TopoDS_Shape Shape;
1121     BRepTools::Read ( Shape, argv[1], B );
1122
1123     // 4. Verify whether enrtry point is on wire and reversed ones (indeed results of veridying must be same)
1124     TopExp_Explorer exp;
1125     Standard_Integer i=1;
1126     for (exp.Init(Shape.Oriented(TopAbs_FORWARD),TopAbs_WIRE); exp.More(); exp.Next(), i++)
1127     {
1128       // 4.1. Verify whether enrtry point is on wire
1129       const TopoDS_Wire& wir = TopoDS::Wire(exp.Current());
1130       TopoDS_Face newFace = TopoDS::Face(Shape.EmptyCopied());
1131
1132       TopAbs_Orientation orWire = wir.Orientation();
1133       newFace.Orientation(TopAbs_FORWARD);
1134       B.Add(newFace,wir);
1135
1136       BRepTopAdaptor_FClass2d FClass2d1(newFace,precuv);
1137       TopAbs_State stat1 = FClass2d1.PerformInfinitePoint();
1138       //di << "Wire " << i << ": Infinite point is " <<
1139       //  ( stat1 == TopAbs_IN ? "IN" : stat1 == TopAbs_OUT ? "OUT" : stat1 == TopAbs_ON ? "ON" : "UNKNOWN" ) << "\n";
1140
1141       TCollection_AsciiString TmpString;
1142       stat1 == TopAbs_IN ? TmpString.AssignCat("IN") : stat1 == TopAbs_OUT ? TmpString.AssignCat("OUT") : stat1 == TopAbs_ON ? TmpString.AssignCat("ON") : TmpString.AssignCat("UNKNOWN");
1143       di << "Wire " << i << ": Infinite point is " << TmpString.ToCString() << "\n";
1144
1145       stat1 = FClass2d1.Perform(p2d);
1146       //di << "Wire " << i << ": point ( " << p2d.X() << ", " << p2d.Y() << " ) is " <<
1147       //  ( stat1 == TopAbs_IN ? "IN" : stat1 == TopAbs_OUT ? "OUT" : stat1 == TopAbs_ON ? "ON" : "UNKNOWN" ) << "\n";
1148
1149       TmpString.Clear();
1150       stat1 == TopAbs_IN ? TmpString.AssignCat("IN") : stat1 == TopAbs_OUT ? TmpString.AssignCat("OUT") : stat1 == TopAbs_ON ? TmpString.AssignCat("ON") : TmpString.AssignCat("UNKNOWN");
1151       di << "Wire " << i << ": point ( " << p2d.X() << ", " << p2d.Y() << " ) is " << TmpString.ToCString() << "\n";
1152
1153       // 4.2. Verify whether enrtry point is on reversed wire
1154       newFace = TopoDS::Face(Shape.EmptyCopied());
1155       newFace.Orientation(TopAbs_FORWARD);
1156       orWire = TopAbs::Reverse(orWire);
1157       B.Add(newFace,wir.Oriented(orWire));
1158       BRepTopAdaptor_FClass2d FClass2d2(newFace,precuv);
1159       TopAbs_State stat2 = FClass2d2.PerformInfinitePoint();
1160       //di << "Reversed Wire " << i << ": Infinite point is " <<
1161       //  ( stat2 == TopAbs_IN ? "IN" : stat2 == TopAbs_OUT ? "OUT" : stat2 == TopAbs_ON ? "ON" : "UNKNOWN" ) << "\n";
1162
1163       TmpString.Clear();
1164       stat2 == TopAbs_IN ? TmpString.AssignCat("IN") : stat2 == TopAbs_OUT ? TmpString.AssignCat("OUT") : stat2 == TopAbs_ON ? TmpString.AssignCat("ON") : TmpString.AssignCat("UNKNOWN");
1165       di << "Reversed Wire " << i << ": Infinite point is " << TmpString.ToCString() << "\n";
1166
1167       stat2 = FClass2d2.Perform(p2d);
1168       //di << "Reversed Wire " << i << ": point ( " << p2d.X() << ", " << p2d.Y() << " ) is " <<
1169       //  ( stat2 == TopAbs_IN ? "IN" : stat2 == TopAbs_OUT ? "OUT" : stat2 == TopAbs_ON ? "ON" : "UNKNOWN" ) << "\n";
1170
1171       TmpString.Clear();
1172       stat2 == TopAbs_IN ? TmpString.AssignCat("IN") : stat2 == TopAbs_OUT ? TmpString.AssignCat("OUT") : stat2 == TopAbs_ON ? TmpString.AssignCat("ON") : TmpString.AssignCat("UNKNOWN");
1173       di << "Reversed Wire " << i << ": point ( " << p2d.X() << ", " << p2d.Y() << " ) is " << TmpString.ToCString() << "\n";
1174
1175       // 4.3. Compare results (they must be same)
1176       if(stat1 ==stat2) di << "OCC377 OK\n";
1177       else {di << "OCC377 FAULTY\n"; return 0;}
1178     }
1179   }
1180   catch(Standard_Failure)
1181   {
1182     di << "OCC377 Exception";
1183   }
1184
1185   return 0;
1186 }
1187
1188 #include <ShapeUpgrade_ShapeDivideAngle.hxx>
1189 #include <ShapeBuild_ReShape.hxx>
1190
1191 //=======================================================================
1192 //function : OCC22
1193 //purpose  :
1194 //=======================================================================
1195 static Standard_Integer OCC22 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1196 {
1197   try
1198   {
1199     OCC_CATCH_SIGNALS
1200     // 1. Verify arguments of the command
1201     if (argc < 5) { di << "OCC22 FAULTY. Use : OCC22 Result Shape CompoundOfSubshapesToBeDivided ConsiderLocation"; return 0;}
1202
1203     Standard_Boolean aConsiderLocation;
1204     if(strcmp(argv[4], "0")==0) aConsiderLocation = Standard_False;
1205     else aConsiderLocation = Standard_True;
1206
1207     // 2. Iniitialize aShapeUpgrade
1208     ShapeUpgrade_ShapeDivideAngle aShapeUpgrade(M_PI/2.);
1209     // precision
1210     aShapeUpgrade.SetPrecision (Precision::Confusion());
1211     // tolerance
1212     aShapeUpgrade.SetMaxTolerance(0.1);
1213     // subshapes to be divided
1214     TopoDS_Shape aSubShapesToBeDivided = DBRep::Get(argv[3]);
1215     if(aSubShapesToBeDivided.IsNull()) {di << "OCC22 FAULTY. Compound of subshapes to be divided is not exist. Please, verify input values. \n";return 0;}
1216     aShapeUpgrade.Init(aSubShapesToBeDivided);
1217     // context
1218     Handle(ShapeBuild_ReShape) aReshape = new ShapeBuild_ReShape;
1219     aShapeUpgrade.SetContext(aReshape);
1220     if(aConsiderLocation) aReshape->ModeConsiderLocation() = Standard_True;
1221
1222     // 3. Perform splitting
1223     if (aShapeUpgrade.Perform (Standard_False))         di << "Upgrade_SplitRevolution_Done \n";
1224     else if (aShapeUpgrade.Status (ShapeExtend_OK))     di << "Upgrade_SplitRevolution_OK \n";
1225     else if (aShapeUpgrade.Status (ShapeExtend_FAIL)) { di << "OCC22 FAULTY. Operation failed. Angle was not divided\n";return 0;}
1226
1227     // 4. Perform rebuilding shape
1228     // 4.1. Retrieve Shape
1229     TopoDS_Shape anInitShape = DBRep::Get(argv[2]);
1230     if(anInitShape.IsNull()) { di << "OCC22 FAULTY. Initial shape is not exist. Please verify input values \n"; return 0;}
1231     // 4.2 Rebuid retrieved shape
1232     TopoDS_Shape aResultShape = aReshape->Apply(anInitShape);
1233     // 4.3. Create result Draw shape
1234     DBRep::Set(argv[1], aResultShape);
1235   }
1236   catch (Standard_Failure) {di << "OCC22 Exception \n" ;return 0;}
1237
1238   return 0;
1239 }
1240
1241
1242 #include <ShapeProcess_OperLibrary.hxx>
1243 #include <ShapeProcess_ShapeContext.hxx>
1244 #include <ShapeProcess.hxx>
1245
1246 #include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
1247 #include <BRepMesh_IncrementalMesh.hxx>
1248
1249 //=======================================================================
1250 //function : OCC24
1251 //purpose  :
1252 //=======================================================================
1253 static Standard_Integer OCC24 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1254 {
1255   try
1256   {
1257     OCC_CATCH_SIGNALS
1258     // 1. Verify amount of arguments of the command
1259     if (argc < 6) { di << "OCC24 FAULTY. Use : OCC22 Result Shape CompoundOfSubshapes ResourceFileName SequenceName"; return 0;}
1260
1261     // 2. Retrieve parameters
1262     // initial shape
1263     TopoDS_Shape anInitShape = DBRep::Get(argv[2]);
1264     if(anInitShape.IsNull()) { di << "OCC24 FAULTY. Initial shape is not exist. Please verify input values \n"; return 0;}
1265     // compound of subshapes
1266     TopoDS_Shape aSubShapes = DBRep::Get(argv[3]);
1267     if(aSubShapes.IsNull()) {di << "OCC24 FAULTY. Compound of subshapes is not exist. Please, verify input values. \n";return 0;}
1268     // name of resource file
1269     const char* aResourceFile = argv[4];
1270     // name of sequence from resource file to be executed
1271     const char* aSequenceName = argv[5];
1272
1273     // 3. Initialize ShapeContext and perform sequence of operation specified with resource file
1274     ShapeProcess_OperLibrary::Init();
1275     Handle(ShapeProcess_ShapeContext) aShapeContext = new ShapeProcess_ShapeContext (aSubShapes, aResourceFile);
1276     aShapeContext->SetDetalisation (TopAbs_EDGE);
1277     ShapeProcess::Perform (aShapeContext, aSequenceName);
1278
1279     // 4. Rebuild initil shape in accordance with performed operation
1280     Handle(ShapeBuild_ReShape) aReshape = new ShapeBuild_ReShape;
1281     TopTools_DataMapIteratorOfDataMapOfShapeShape anIter (aShapeContext->Map());
1282     for (; anIter.More(); anIter.Next())
1283       aReshape->Replace(anIter.Key(), anIter.Value());
1284     TopoDS_Shape aResultShape = aReshape->Apply(anInitShape);
1285
1286     // 5 Create resultant Draw shape
1287     DBRep::Set(argv[1], aResultShape);
1288
1289   }
1290   catch (Standard_Failure) {di << "OCC24 Exception \n" ;return 0;}
1291
1292   return 0;
1293 }
1294
1295 //=======================================================================
1296 //function : OCC369
1297 //purpose  : Verify whether exception occurs during building mesh
1298 //=======================================================================
1299 static Standard_Integer OCC369(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1300 {
1301   try
1302   {
1303     OCC_CATCH_SIGNALS
1304     // 1. Verify amount of arguments of the command
1305     if (argc < 2) { di << "OCC369 FAULTY. Use : OCC369 Shape \n"; return 0;}
1306
1307     // 2. Retrieve shape
1308     TopoDS_Shape aShape = DBRep::Get(argv[1]);
1309     if(aShape.IsNull()) {di << "OCC369 FAULTY. Entry shape is NULL \n"; return 0;}
1310
1311     // 3. Build mesh
1312     BRepMesh_FastDiscret::Parameters aMeshParams;
1313     aMeshParams.Relative = Standard_True;
1314     aMeshParams.Deflection = 0.2;
1315     aMeshParams.Angle = M_PI / 6;
1316     BRepMesh_IncrementalMesh aMesh(aShape, aMeshParams);
1317
1318   }
1319   catch (Standard_Failure) {di << "OCC369 Exception \n" ;return 0;}
1320
1321   di << "OCC369 OK \n";
1322   return 0;
1323 }
1324
1325 #include <math_Vector.hxx>
1326 #include <math_Matrix.hxx>
1327 static Standard_Integer OCC524 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1328 {
1329   if(argc != 9){
1330     di<<"Usage : " << argv[0] << " LowerVector UpperVector InitialValueVector LowerRowMatrix UpperRowMatrix LowerColMatrix UpperColMatrix InitialValueMatrix\n";
1331     return 1;
1332   }
1333   Standard_Integer LowerVector = Draw::Atoi(argv[1]);
1334   Standard_Integer UpperVector = Draw::Atoi(argv[2]);
1335   Standard_Real InitialValueVector = Draw::Atof(argv[3]);
1336   Standard_Integer LowerRowMatrix = Draw::Atoi(argv[4]);
1337   Standard_Integer UpperRowMatrix = Draw::Atoi(argv[5]);
1338   Standard_Integer LowerColMatrix = Draw::Atoi(argv[6]);
1339   Standard_Integer UpperColMatrix = Draw::Atoi(argv[7]);
1340   Standard_Real InitialValueMatrix = Draw::Atof(argv[8]);
1341
1342   math_Vector Vector1(LowerVector, UpperVector);
1343   math_Vector Vector2(LowerVector, UpperVector);
1344
1345   math_Vector Vector(LowerVector, UpperVector, InitialValueVector);
1346   math_Matrix Matrix(LowerRowMatrix, UpperRowMatrix, LowerColMatrix, UpperColMatrix, InitialValueMatrix);
1347
1348   //Vector.Dump(cout);
1349   //cout<<endl;
1350
1351   //Matrix.Dump(cout);
1352   //cout<<endl;
1353
1354   Vector1.Multiply(Vector, Matrix);
1355
1356   //Vector1.Dump(cout);
1357   Standard_SStream aSStream1;
1358   Vector1.Dump(aSStream1);
1359   di << aSStream1;
1360   di<<"\n";
1361
1362   if (Matrix.RowNumber() > 1) {
1363     Matrix(Matrix.LowerRow() + 1, Matrix.LowerCol()) += 1.;
1364   }
1365   Vector2.TMultiply(Vector, Matrix);
1366
1367   //Vector2.Dump(cout);
1368   Standard_SStream aSStream2;
1369   Vector2.Dump(aSStream2);
1370   di << aSStream2;
1371   di<<"\n";
1372
1373   return 0;
1374 }
1375
1376 #include <GeomPlate_BuildPlateSurface.hxx>
1377 //=======================================================================
1378 //function : OCC525
1379 //purpose  :
1380 //=======================================================================
1381 static Standard_Integer OCC525(Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** /*argv*/)
1382 {
1383   GeomPlate_BuildPlateSurface aBuilder;
1384   aBuilder.Perform();
1385
1386   if (aBuilder.IsDone())
1387   {
1388     di << "Error in OCC525. Null result is expected.\n";
1389   }
1390   else
1391   {
1392     di << "OCC525 OK \n";
1393   }
1394
1395   return 0;
1396 }
1397
1398 #include <BRepPrimAPI_MakeWedge.hxx>
1399 #include <gce_MakeRotation.hxx>
1400 #include <gce_MakeTranslation.hxx>
1401 #include <BRepBuilderAPI_Transform.hxx>
1402 #include <BRepPrimAPI_MakeWedge.hxx>
1403 //=======================================================================
1404 //function :  OCC578
1405 //purpose  :
1406 //=======================================================================
1407 static Standard_Integer OCC578 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1408 {
1409   if(argc != 4) {
1410     di << "Usage : " << argv[0] << " shape1 shape2 shape3\n";
1411     return 1;
1412   }
1413
1414   gp_Pnt P0(0,0,0.0);
1415   double xperiod = 1.0;
1416   double yperiod = 1.0;
1417   double sub_thick = 0.5;
1418
1419   // mask_substrate
1420   //TopoDS_Shape substrate = BRepPrimAPI_MakeBox( P0, xperiod, yperiod, sub_thick );
1421   TopoDS_Shape substrate = BRepPrimAPI_MakeBox( P0, xperiod, yperiod, sub_thick ).Shape();
1422
1423   // --------------------------------------------------------------------
1424
1425   // wedge
1426   //TopoDS_Shape wedge1 = BRepPrimAPI_MakeWedge(0.5, 0.05, 0.5,
1427         //                                    0.1,  0.1  , 0.4, 0.4 );
1428   TopoDS_Shape wedge1 = BRepPrimAPI_MakeWedge(0.5, 0.05, 0.5,
1429                                               0.1,  0.1  , 0.4, 0.4 ).Shape();
1430
1431   gp_Trsf rotate = gce_MakeRotation ( gp_Pnt(0.0,0.0,0.0),
1432                                      gp_Dir(1.0,0.0,0.0),
1433                                      1.570795 );
1434
1435   gp_Trsf translate = gce_MakeTranslation(gp_Pnt( 0.0, -0.5, 0.0),
1436                                           gp_Pnt( 0.25, 0.25, 0.5)
1437                                           );
1438
1439   rotate.PreMultiply( translate );
1440
1441   TopoDS_Shape wedge1a = BRepBuilderAPI_Transform( wedge1, rotate );
1442
1443   if (wedge1a.IsNull()) {
1444     di<<" Null shape1 is not allowed\n";
1445     return 1;
1446   }
1447   DBRep::Set(argv[1], wedge1a);
1448
1449   // --------------------------------------------------------------------
1450
1451   // wedge top
1452   //TopoDS_Shape wedge2 = BRepPrimAPI_MakeWedge(0.5, 0.3, 0.5,
1453         //                                    0.1,  0.1  , 0.4, 0.4 );
1454   TopoDS_Shape wedge2 = BRepPrimAPI_MakeWedge(0.5, 0.3, 0.5,
1455                                               0.1,  0.1  , 0.4, 0.4 ).Shape();
1456
1457   gp_Trsf rotate2 = gce_MakeRotation ( gp_Pnt(0.0,0.0,0.0),
1458                                       gp_Dir(1.0,0.0,0.0),
1459                                       1.570795 * 3.0 );
1460
1461   gp_Trsf translate2 = gce_MakeTranslation(gp_Pnt( 0.0, 0.0, 0.0),
1462                                            gp_Pnt( 0.25, 0.25, 0.5)
1463                                            );
1464
1465   rotate2.PreMultiply( translate2 );
1466
1467   TopoDS_Shape wedge2a = BRepBuilderAPI_Transform( wedge2, rotate2 );
1468
1469   if (wedge2a.IsNull()) {
1470     di<<" Null shape2 is not allowed\n";
1471     return 1;
1472   }
1473   DBRep::Set(argv[2], wedge2a);
1474
1475
1476   // combine wedges
1477   di << "wedge_common = BRepAlgoAPI_Fuse(wedge1a , wedge2a)\n";
1478   TopoDS_Shape wedge_common = BRepAlgoAPI_Fuse(wedge1a , wedge2a).Shape();
1479
1480   di << "sub_etch1 = BRepAlgoAPI_Cut(substrate, wedge_common)\n";
1481   TopoDS_Shape sub_etch1 = BRepAlgoAPI_Cut(substrate, wedge_common).Shape();
1482  
1483   if (sub_etch1.IsNull()) {
1484     di<<" Null shape3 is not allowed\n";
1485     return 1;
1486   }
1487   DBRep::Set(argv[3], sub_etch1);
1488
1489   return 0;
1490 }
1491
1492 #include <Standard_GUID.hxx>
1493 //=======================================================================
1494 //function :  OCC669
1495 //purpose  :
1496 //=======================================================================
1497 static Standard_Integer OCC669 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1498 {
1499   if(argc != 2){
1500     di<<"Usage : " << argv[0] << " GUID\n";
1501     return -1;
1502   }
1503   Standard_GUID guid(argv[1]);
1504   //guid.ShallowDump(cout);
1505   Standard_SStream aSStream;
1506   guid.ShallowDump(aSStream);
1507   di << aSStream;
1508   di<<"\n";
1509   return 0;
1510 }
1511
1512 #include <XCAFDoc.hxx>
1513 //=======================================================================
1514 //function :  OCC738_ShapeRef
1515 //purpose  :
1516 //=======================================================================
1517 static Standard_Integer OCC738_ShapeRef (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1518 {
1519   if(argc != 1){
1520     di<<"Usage : " << argv[0] << "\n";
1521     return -1;
1522   }
1523   const Standard_GUID& guid = XCAFDoc::ShapeRefGUID ();
1524   //guid.ShallowDump(cout);
1525   Standard_SStream aSStream;
1526   guid.ShallowDump(aSStream);
1527   di << aSStream;
1528   return 0;
1529 }
1530
1531 //=======================================================================
1532 //function :  OCC738_Assembly
1533 //purpose  : 
1534 //=======================================================================
1535 static Standard_Integer OCC738_Assembly (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1536 {
1537   if(argc != 1){
1538     di<<"Usage : " << argv[0] << "\n";
1539     return -1;
1540   }
1541   const Standard_GUID& guid = XCAFDoc::AssemblyGUID ();
1542   //guid.ShallowDump(cout);
1543   Standard_SStream aSStream;
1544   guid.ShallowDump(aSStream);
1545   di << aSStream;
1546   return 0;
1547 }
1548
1549 #if defined(DDataStd_def01)
1550 #include <DDataStd_DrawPresentation.hxx>
1551 //=======================================================================
1552 //function :  OCC739_DrawPresentation
1553 //purpose  : 
1554 //=======================================================================
1555 static Standard_Integer OCC739_DrawPresentation (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1556 {
1557   if(argc != 1){
1558     di<<"Usage : " << argv[0] << "\n";
1559     return -1;
1560   }
1561   const Standard_GUID& guid = DDataStd_DrawPresentation::GetID() ;
1562   //guid.ShallowDump(cout);
1563   Standard_SStream aSStream;
1564   guid.ShallowDump(aSStream);
1565   di << aSStream;
1566   return 0;
1567 }
1568 #endif
1569
1570 //=======================================================================
1571 //function :  OCC708
1572 //purpose  : 
1573 //=======================================================================
1574 static Standard_Integer OCC708 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1575 {
1576   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
1577   if(aContext.IsNull()) { 
1578     di << argv[0] << "ERROR : use 'vinit' command before \n";
1579     return 1;
1580   }
1581
1582   if ( argc != 2) {
1583     di << "ERROR : Usage : " << argv[0] << " shape ; Deactivate the current transformation\n";
1584     return 1;
1585   }
1586   
1587   Standard_Boolean updateviewer = Standard_True;
1588
1589   ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
1590   
1591   TCollection_AsciiString aName(argv[1]);
1592   Handle(AIS_InteractiveObject) AISObj;
1593
1594   if(!aMap.IsBound2(aName)) {
1595     di << "Use 'vdisplay' before\n";
1596     return 1;
1597   } else {
1598     AISObj = Handle(AIS_InteractiveObject)::DownCast(aMap.Find2(aName));
1599     if(AISObj.IsNull()){
1600       di << argv[1] << " : No interactive object\n";
1601       return 1;
1602     } 
1603     AISObj->ResetTransformation();
1604
1605     aContext->Erase(AISObj, updateviewer);
1606     aContext->UpdateCurrentViewer();
1607     aContext->Display(AISObj, updateviewer);
1608     aContext->UpdateCurrentViewer();
1609   }
1610   return 0;
1611 }
1612
1613 //=======================================================================
1614 //function :  OCC670
1615 //purpose  :
1616 //=======================================================================
1617 #include <TColStd_Array2OfInteger.hxx>
1618 static Standard_Integer OCC670 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1619 {
1620   if(argc != 1){
1621     di<<"Usage : " << argv[0] << "\n";
1622     return -1;
1623   }
1624
1625   // check that exception initialized without message string can be safely handled and printed
1626   try {
1627     throw Standard_OutOfRange();
1628   }
1629   catch (Standard_Failure const& anException) {
1630     std::cout << "Caught successfully: ";
1631     std::cout << anException << endl;
1632   }
1633   return 0;
1634 }
1635
1636 #include <GeomAPI_ProjectPointOnSurf.hxx>
1637 //=======================================================================
1638 //function :  OCC867
1639 //purpose  : 
1640 //=======================================================================
1641 static Standard_Integer OCC867(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1642 {
1643   if (argc!=7)  
1644   {
1645     di<<"Usage : " << argv[0] << " Point Surface Umin Usup Vmin Vsup \n";
1646     return 1;   
1647   }
1648   
1649   gp_Pnt aPoint3d;        
1650   DrawTrSurf::GetPoint(argv[1],aPoint3d);
1651   Handle (Geom_Surface) aSurface=DrawTrSurf::GetSurface(argv[2]);
1652   Standard_Real             Umin=Draw::Atof(argv[3]);
1653   Standard_Real             Usup=Draw::Atof(argv[4]);
1654   Standard_Real             Vmin=Draw::Atof(argv[5]);
1655   Standard_Real             Vsup=Draw::Atof(argv[6]);
1656  
1657   if (aSurface.IsNull()) {
1658     di << argv[2] << " Null surface \n" ;
1659     return 1;
1660   }
1661   
1662   GeomAPI_ProjectPointOnSurf PonSurf;
1663   PonSurf.Init(aSurface, Umin, Usup, Vmin, Vsup);
1664   PonSurf.Perform(aPoint3d);
1665
1666   return 0; 
1667 }
1668
1669 //=======================================================================
1670 //function :  OCC909
1671 //purpose  : 
1672 //=======================================================================
1673 static Standard_Integer OCC909 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1674 {
1675   if (argc!=3)  
1676   {
1677     di<<"Usage : " << argv[0] << " wire face\n";
1678     return 1;   
1679   }
1680   
1681   TopoDS_Wire awire = TopoDS::Wire(DBRep::Get(argv[1])); //read the wire
1682   TopoDS_Face aface = TopoDS::Face(DBRep::Get(argv[2])); //read the face
1683   if (awire.IsNull() || aface.IsNull()) {
1684     di << "Null object\n";
1685     return 1;
1686   }
1687
1688   Standard_Integer count = 0;
1689   TopExp_Explorer TE(awire, TopAbs_VERTEX);
1690   if ( TE.More()) {
1691     BRepTools_WireExplorer WE;
1692     for ( WE.Init(awire,aface); WE.More(); WE.Next()) {
1693       TopoDS_Edge E = WE.Current();
1694       count++;
1695     }
1696   }
1697   di << "Count = " << count << "\n";
1698
1699   return 0; 
1700 }
1701
1702 //=======================================================================
1703 //function :  OCC921
1704 //purpose  : 
1705 //=======================================================================
1706 static Standard_Integer OCC921 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1707 {
1708   if (argc != 2)
1709   {
1710     di <<"Usage : " << argv[0] << " face\n";
1711     return 1;
1712   }
1713   Standard_Real u1, u2, v1, v2;
1714   TopoDS_Face F = TopoDS::Face( DBRep::Get(argv[1]) ); //read the shape
1715   if (F.IsNull())
1716     return 1;
1717   BRepTools::UVBounds(F, u1, u2, v1, v2);
1718   di << "Bounds: " << u1 << "   " << u2 << "   " << v1 << "   " << v2 << "\n";
1719   return 0;
1720 }
1721
1722 #include <Expr_NamedUnknown.hxx>
1723 #include <Expr_GeneralExpression.hxx>
1724 #include <Expr_Exponential.hxx>
1725 //=======================================================================
1726 //function :  OCC902
1727 //purpose  : 
1728 //=======================================================================
1729 static Standard_Integer OCC902(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1730 {
1731   if (argc != 2)
1732   {
1733     di <<"Usage : " << argv[0] << " expression\n";
1734     return 1;
1735   }
1736
1737  TCollection_AsciiString  myStr(argv[1]);
1738
1739  Handle (Expr_NamedUnknown)      myNamed = new Expr_NamedUnknown(myStr);
1740  Handle (Expr_Exponential)       oldExpr = new Expr_Exponential(myNamed); 
1741  Handle (Expr_GeneralExpression) newExpr = oldExpr->Derivative(myNamed);
1742
1743  
1744  TCollection_AsciiString  res        = newExpr->String();
1745  Standard_CString         resStr     = res.ToCString();
1746  TCollection_AsciiString  res_old    = oldExpr->String();
1747  Standard_CString         res_oldStr = res_old.ToCString();
1748  
1749
1750  di << "X = " << argv[1] << "\n";
1751  di << "Y = " << res_oldStr << "\n";
1752  di << "Y' = " << resStr  << "\n";
1753
1754  return 0;
1755 }
1756
1757 #include <DDF.hxx>
1758 #include <TPrsStd_AISViewer.hxx>
1759 #include <TDF_Label.hxx>
1760 #include <TPrsStd_AISPresentation.hxx>
1761 //=======================================================================
1762 //function : OCC1029_AISTransparency 
1763 //purpose  : OCC1029_AISTransparency  (DOC,entry,[real])
1764 //=======================================================================
1765
1766 static Standard_Integer OCC1029_AISTransparency (Draw_Interpretor& di,
1767                                              Standard_Integer nb, 
1768                                              const char ** arg) 
1769 {
1770   if (nb >= 3 ) {     
1771     Handle(TDocStd_Document) D;
1772     if (!DDocStd::GetDocument(arg[1],D)) return 1;  
1773     TDF_Label L;
1774     if (!DDF::FindLabel(D->GetData(),arg[2],L)) return 1;  
1775
1776     Handle(TPrsStd_AISViewer) viewer;
1777     if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1;  
1778
1779     Handle(TPrsStd_AISPresentation) prs;
1780     if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) {   
1781       if( nb == 4 ) {
1782         prs->SetTransparency(Draw::Atof(arg[3]));
1783         TPrsStd_AISViewer::Update(L);
1784       }
1785       else {
1786          di << "Transparency = " << prs->Transparency() << "\n";
1787       }
1788       return 0;
1789     }
1790   }
1791   di << arg[0] << " : Error\n";
1792   return 1;
1793 }
1794
1795 //=======================================================================
1796 //function : OCC1030_AISColor 
1797 //purpose  : OCC1030_AISColor (DOC,entry,[color])
1798 //=======================================================================
1799
1800 static Standard_Integer OCC1030_AISColor (Draw_Interpretor& di,
1801                                       Standard_Integer nb, 
1802                                       const char ** arg) 
1803 {
1804   if (nb >= 3) {     
1805     Handle(TDocStd_Document) D;
1806     if (!DDocStd::GetDocument(arg[1],D)) return 1;  
1807     TDF_Label L;
1808     if (!DDF::FindLabel(D->GetData(),arg[2],L)) return 1;  
1809
1810     Handle(TPrsStd_AISViewer) viewer;
1811     if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1;  
1812
1813     Handle(TPrsStd_AISPresentation) prs;
1814     if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) {   
1815       if( nb == 4 ) {
1816         prs->SetColor((Quantity_NameOfColor)Draw::Atoi(arg[3]));
1817         TPrsStd_AISViewer::Update(L);
1818       }
1819       else
1820          di << "Color = " << prs->Color() << "\n";
1821       return 0; 
1822     }
1823   }
1824   di << arg[0] << " : Error\n";
1825   return 1;
1826 }
1827
1828 //=======================================================================
1829 //function : OCC1031_AISMaterial
1830 //purpose  : OCC1031_AISMaterial (DOC,entry,[material])
1831 //=======================================================================
1832
1833 static Standard_Integer OCC1031_AISMaterial (Draw_Interpretor& di,
1834                                          Standard_Integer nb,
1835                                          const char ** arg)
1836 {
1837   if (nb >= 3) {     
1838     Handle(TDocStd_Document) D;
1839     if (!DDocStd::GetDocument(arg[1],D)) return 1;  
1840     TDF_Label L;
1841     if (!DDF::FindLabel(D->GetData(),arg[2],L)) return 1;  
1842
1843     Handle(TPrsStd_AISViewer) viewer;
1844     if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1;  
1845
1846     Handle(TPrsStd_AISPresentation) prs;
1847     if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) {   
1848       if( nb == 4 ) {
1849         prs->SetMaterial((Graphic3d_NameOfMaterial)Draw::Atoi(arg[3]));
1850         TPrsStd_AISViewer::Update(L);
1851       }
1852       else {
1853          di << "Material = " << prs->Material() << "\n";
1854       }
1855       return 0;
1856     }
1857   }
1858   di << arg[0] << " : Error\n";
1859   return 1;
1860 }
1861
1862 //=======================================================================
1863 //function : OCC1032_AISWidth
1864 //purpose  : OCC1032_AISWidth (DOC,entry,[width])
1865 //=======================================================================
1866
1867 static Standard_Integer OCC1032_AISWidth (Draw_Interpretor& di,
1868                                       Standard_Integer nb, 
1869                                       const char ** arg) 
1870 {
1871   if (nb >= 3) {     
1872     Handle(TDocStd_Document) D;
1873     if (!DDocStd::GetDocument(arg[1],D)) return 1;  
1874     TDF_Label L;
1875     if (!DDF::FindLabel(D->GetData(),arg[2],L)) return 1;  
1876
1877     Handle(TPrsStd_AISViewer) viewer;
1878     if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1;  
1879
1880     Handle(TPrsStd_AISPresentation) prs;
1881     if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) {   
1882       if( nb == 4 ) {
1883         prs->SetWidth(Draw::Atof(arg[3]));
1884         TPrsStd_AISViewer::Update(L);
1885       }
1886       else {
1887          di << "Width = " << prs->Width() << "\n";
1888       }
1889       return 0;
1890     }
1891   }
1892   di << arg[0] << " : Error\n";
1893   return 1;
1894 }
1895
1896 //=======================================================================
1897 //function : OCC1033_AISMode
1898 //purpose  : OCC1033_AISMode (DOC,entry,[mode])
1899 //=======================================================================
1900
1901 static Standard_Integer OCC1033_AISMode (Draw_Interpretor& di,
1902                                      Standard_Integer nb, 
1903                                      const char ** arg) 
1904 {
1905   if (nb >= 3) {     
1906     Handle(TDocStd_Document) D;
1907     if (!DDocStd::GetDocument(arg[1],D)) return 1;  
1908     TDF_Label L;
1909     if (!DDF::FindLabel(D->GetData(),arg[2],L)) return 1;  
1910
1911     Handle(TPrsStd_AISViewer) viewer;
1912     if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1;  
1913
1914     Handle(TPrsStd_AISPresentation) prs;
1915     if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) {   
1916       if( nb == 4 ) {
1917         prs->SetMode(Draw::Atoi(arg[3]));
1918         TPrsStd_AISViewer::Update(L);
1919       }
1920       else {
1921          di << "Mode = " << prs->Mode() << "\n";
1922       }
1923       return 0;
1924     }
1925   }
1926   di << arg[0] << " : Error\n";
1927   return 1;
1928 }
1929
1930 //=======================================================================
1931 //function : OCC1034_AISSelectionMode
1932 //purpose  : OCC1034_AISSelectionMode (DOC,entry,[selectionmode])
1933 //=======================================================================
1934
1935 static Standard_Integer OCC1034_AISSelectionMode (Draw_Interpretor& di,
1936                                               Standard_Integer nb, 
1937                                               const char ** arg) 
1938 {
1939   if (nb >= 3) {     
1940     Handle(TDocStd_Document) D;
1941     if (!DDocStd::GetDocument(arg[1],D)) return 1;  
1942     TDF_Label L;
1943     if (!DDF::FindLabel(D->GetData(),arg[2],L)) return 1;  
1944
1945     Handle(TPrsStd_AISViewer) viewer;
1946     if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1;  
1947
1948     Handle(TPrsStd_AISPresentation) prs;
1949     if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) {   
1950       if( nb == 4 ) {
1951         prs->SetSelectionMode(Draw::Atoi(arg[3]));
1952         TPrsStd_AISViewer::Update(L);
1953       }
1954       else {
1955          di << "SelectionMode = " << prs->SelectionMode() << "\n";
1956       }
1957       return 0;
1958     }
1959   }
1960   di << arg[0] << " : Error\n";
1961   return 1;
1962 }
1963
1964 //=======================================================================
1965 //function :  OCC1487
1966 //purpose  :
1967 //=======================================================================
1968 static Standard_Integer OCC1487 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1969 {
1970   if(argc != 5) {
1971     di << "Usage : " << argv[0] << " CylinderVariant(=1/2) cylinder1 cylinder2 cutshape\n";
1972     return 1;
1973   }
1974
1975   Standard_Integer CaseNumber = Draw::Atoi(argv[1]);
1976
1977   //BRepPrimAPI_MakeCylinder o_mc1 (gp_Ax2 (gp_Pnt(0,-50,140), gp_Dir(1,0,0)), 50,1000);
1978   gp_Dir myDir(1,0,0);
1979   gp_Pnt myPnt(0,-50,140);
1980   gp_Ax2 myAx2(myPnt, myDir);
1981   BRepPrimAPI_MakeCylinder o_mc1 (myAx2, 50,1000);
1982
1983   TopoDS_Shape cyl1 = o_mc1.Shape();
1984
1985   TopoDS_Shape cyl2;
1986   TopoDS_Shape o_cut_shape;
1987   if (CaseNumber == 1) {
1988     //BRepPrimAPI_MakeCylinder o_mc2 (gp_Ax2 (gp_Pnt(21.65064, -50.0, 127.5),gp_Dir(-sin(M_PI/3), 0.0, 0.5)), 5, 150);
1989     gp_Dir myDir_mc2(-sin(M_PI/3), 0.0, 0.5);
1990     gp_Pnt myPnt_mc2(21.65064, -50.0, 127.5);
1991     gp_Ax2 myAx2_mc2(myPnt_mc2, myDir_mc2);
1992     BRepPrimAPI_MakeCylinder o_mc2 (myAx2_mc2, 5, 150);
1993
1994     cyl2 = o_mc2.Shape();
1995     di << "o_cut_shape = BRepAlgoAPI_Cut (o_mc1.Solid (), o_mc2.Solid ())\n";
1996     o_cut_shape = BRepAlgoAPI_Cut (o_mc1.Solid (), o_mc2.Solid ()).Shape();
1997   } else {
1998     //BRepPrimAPI_MakeCylinder o_mc2 (gp_Ax2 (gp_Pnt(978.34936, -50.0, 127.5),gp_Dir(sin(M_PI/3), 0.0, 0.5)), 5, 150);
1999     gp_Dir myDir_mc2(sin(M_PI/3), 0.0, 0.5);
2000     gp_Pnt myPnt_mc2(978.34936, -50.0, 127.5);
2001     gp_Ax2 myAx2_mc2(myPnt_mc2, myDir_mc2);
2002     BRepPrimAPI_MakeCylinder o_mc2 (myAx2_mc2, 5, 150);
2003
2004     cyl2 = o_mc2.Shape();
2005     di << "o_cut_shape = BRepAlgoAPI_Cut (o_mc1.Solid (), o_mc2.Solid ())\n";
2006     o_cut_shape = BRepAlgoAPI_Cut (o_mc1.Solid (), o_mc2.Solid ()).Shape();
2007   }
2008
2009   DBRep::Set(argv[2],cyl1);
2010   DBRep::Set(argv[3],cyl2);
2011   DBRep::Set(argv[4],o_cut_shape);
2012
2013   return 0;
2014 }
2015
2016 #include<TopTools_ListIteratorOfListOfShape.hxx>
2017 #include<BRepFilletAPI_MakeFillet.hxx>
2018 //=======================================================================
2019 //function :  OCC1077
2020 //purpose  :
2021 //=======================================================================
2022 TopoDS_Shape OCC1077_boolbl(BRepAlgoAPI_BooleanOperation& aBoolenaOperation,const Standard_Real aRadius)
2023 {
2024   Standard_Real t3d = 1.e-4;
2025   Standard_Real t2d = 1.e-5;
2026   Standard_Real ta  = 1.e-2;
2027   Standard_Real fl  = 1.e-3;
2028   Standard_Real tapp_angle = 1.e-2;
2029   GeomAbs_Shape blend_cont = GeomAbs_C1;
2030
2031   TopoDS_Shape ShapeCut = aBoolenaOperation.Shape();
2032
2033   TopTools_ListIteratorOfListOfShape its;
2034
2035   TopoDS_Compound result;
2036   BRep_Builder B;
2037   B.MakeCompound(result);
2038
2039   TopExp_Explorer ex;
2040   for (ex.Init(ShapeCut, TopAbs_SOLID); ex.More(); ex.Next())
2041     {
2042       const TopoDS_Shape& cutsol = ex.Current();
2043
2044       BRepFilletAPI_MakeFillet fill(cutsol);
2045       fill.SetParams(ta, t3d, t2d, t3d, t2d, fl);
2046       fill.SetContinuity(blend_cont, tapp_angle);
2047       its = aBoolenaOperation.SectionEdges();
2048       while (its.More())
2049         {
2050           TopoDS_Edge E = TopoDS::Edge(its.Value());
2051           fill.Add(aRadius, E);
2052           its.Next();
2053         }
2054
2055       fill.Build();
2056       if (fill.IsDone())
2057         {
2058           B.Add(result, fill.Shape());
2059         }
2060       else
2061         {
2062           B.Add(result, cutsol);
2063         }
2064     }
2065   return result;
2066 }
2067
2068 TopoDS_Shape OCC1077_cut_blend(const TopoDS_Shape& aShapeToCut, const TopoDS_Shape& aTool, const Standard_Real aRadius)
2069 {
2070   //return OCC1077_boolbl(BRepAlgoAPI_Cut(aShapeToCut, aTool),aRadius);
2071   BRepAlgoAPI_Cut aCut(aShapeToCut, aTool);
2072   return OCC1077_boolbl(aCut,aRadius);
2073 }
2074
2075 //TopoDS_Shape OCC1077_common_blend(const TopoDS_Shape& aShape1, const TopoDS_Shape& aShape2, const Standard_Real aRadius)
2076 //{
2077 //  return OCC1077_boolbl(BRepAlgoAPI_Common(aShape1, aShape2),aRadius);
2078 //}
2079
2080 TopoDS_Shape OCC1077_Bug()
2081 {
2082   TopoDS_Shape theBox = BRepPrimAPI_MakeBox(gp_Pnt(-5, - 5, - 5), 10, 10, 10).Shape();
2083   TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(7).Shape();
2084
2085   TopoDS_Shape theCommon = BRepAlgoAPI_Common(theBox,theSphere);
2086   TopoDS_Shape theCylinder1 = BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(0, 0, - 10),
2087                                                               gp_Dir(0, 0, 1)), 3, 20).Shape();
2088   TopoDS_Shape theCylinder2 = BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(-10, 0, 0),
2089                                                               gp_Dir(1, 0, 0)), 3, 20).Shape();
2090   TopoDS_Shape theCylinder3 = BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(0, - 10, 0),
2091                                                               gp_Dir(0, 1, 0)), 3, 20).Shape();
2092   TopoDS_Shape theTmp1 = OCC1077_cut_blend(theCommon,theCylinder1,0.7);
2093   Handle(ShapeFix_Shape) fixer = new ShapeFix_Shape(theTmp1);
2094   fixer->Perform();
2095   theTmp1 = fixer->Shape();
2096   TopoDS_Shape theTmp2 = OCC1077_cut_blend(theTmp1,theCylinder2,0.7);
2097   fixer->Init(theTmp2);
2098   fixer->Perform();
2099   theTmp2 = fixer->Shape();
2100   TopoDS_Shape theResult = OCC1077_cut_blend(theTmp2,theCylinder3,0.7);
2101   fixer->Init(theResult);
2102   fixer->Perform();
2103   theResult = fixer->Shape();
2104   return theResult;
2105 }
2106
2107 static Standard_Integer OCC1077 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2108 {
2109   if(argc < 1 || argc > 2) {
2110     di << "Usage : " << argv[0] << " result\n";
2111     return 1;
2112   }
2113
2114   TopoDS_Shape S = OCC1077_Bug();
2115   DBRep::Set(argv[1],S);
2116
2117   return 0;
2118 }
2119
2120 //////////////////////////////////////////////////////////////
2121 /*!
2122  * Compute uniform distribution of points using GCPnts_UniformAbscissa
2123  */
2124 //////////////////////////////////////////////////////////////
2125 static Standard_Integer OCC5739_UniAbs (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2126 {
2127   if (argc < 4)
2128   {
2129     di << "Usage : " << argv[0] << " name shape step\n";
2130     return 1;
2131   }
2132   const char *name = argv[1];
2133   Adaptor3d_Curve *adapCurve=NULL;
2134   Handle(Geom_Curve) curve = DrawTrSurf::GetCurve(argv[2]);
2135   if (!curve.IsNull())
2136     adapCurve = new GeomAdaptor_Curve(curve);
2137   else
2138   {
2139     TopoDS_Shape wire = DBRep::Get(argv[2]);
2140     if (wire.IsNull() || wire.ShapeType() != TopAbs_WIRE)
2141     {
2142       di << argv[0] <<" Faulty : incorrect 1st parameter, curve or wire expected\n";
2143       return 1;
2144     }
2145     adapCurve = new BRepAdaptor_CompCurve(TopoDS::Wire(wire));
2146   }
2147   double step = Draw::Atof(argv[3]);
2148   GCPnts_UniformAbscissa aUni(*adapCurve, step);
2149   int res;
2150   if (!aUni.IsDone())
2151   {
2152     di << argv[0] <<" : fail\n";
2153     res = 1;
2154   }
2155   else
2156   {
2157     int i, np = aUni.NbPoints();
2158     for (i=0; i < np; i++)
2159     {
2160       double par = aUni.Parameter(i+1);
2161       gp_Pnt p = adapCurve->Value(par);
2162       char n[20], *pname=n;
2163       Sprintf(n,"%s_%d",name,i+1);
2164       DrawTrSurf::Set(pname,p);
2165       di<<pname<<" ";
2166     }
2167     res = 0;
2168   }
2169   delete adapCurve;
2170   return res;
2171 }
2172
2173 static Standard_Integer OCC6046 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2174 {
2175   if (argc != 3)
2176   {
2177     di << "Usage : " << argv[0] << " nb_of_vectors size\n";
2178     return 1;
2179   }
2180
2181   Standard_Integer nb = Draw::Atoi(argv[1]);
2182   Standard_Integer sz = Draw::Atoi(argv[2]);
2183   Standard_Real val = 10;
2184   math_Vector **pv = new math_Vector *[nb];
2185
2186   di<<"creating "<<nb<<" vectors "<<sz<<" elements each...\n";
2187   Standard_Integer i;
2188   for (i=0; i < nb; i++) {
2189     pv[i] = new math_Vector (1, sz, val);
2190     if ((i % (nb/10)) == 0) {
2191       di<<" "<<i;
2192       //cout.flush();
2193       di<<"\n";
2194     }
2195   }
2196   di<<" done\n";
2197   di<<"deleting them ...\n";
2198   for (i=0; i < nb; i++) {
2199     delete pv[i];
2200     if ((i % (nb/10)) == 0) {
2201       di<<" "<<i;
2202       //cout.flush();
2203       di<<"\n";
2204     }
2205   }
2206   di<<" done\n";
2207
2208   delete [] pv;
2209
2210   return 0;
2211 }
2212
2213 static Standard_Integer OCC5698 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2214 {
2215   if (argc != 2)
2216   {
2217     di << "Usage : " << argv[0] << " wire\n";
2218     return 1;
2219   }
2220   TopoDS_Shape shape = DBRep::Get(argv[1],TopAbs_WIRE);
2221   if (shape.IsNull())
2222     return 1;
2223   TopoDS_Wire wire = TopoDS::Wire(shape);
2224   // create curve parameterised by curvilinear distance
2225   BRepAdaptor_CompCurve curve(wire,Standard_True);
2226   Standard_Real length = curve.LastParameter();
2227   Standard_Real need_length = length/2;
2228   gp_Pnt pnt;
2229   curve.D0(need_length,pnt);
2230   // create check_curve parameterised in a general way
2231   BRepAdaptor_CompCurve check_curve(wire);
2232   Standard_Real check_par =
2233     GCPnts_AbscissaPoint(check_curve, need_length, 0).Parameter();
2234   gp_Pnt check_pnt;
2235   check_curve.D0(check_par,check_pnt);
2236   // check that points are coinsiding
2237   Standard_Real error_dist = pnt.Distance(check_pnt);
2238   if (error_dist > Precision::Confusion()) {
2239     //cout.precision(3);
2240     di<<"error_dist = "<<error_dist<<
2241       "  ( "<<error_dist/need_length*100<<" %)\n";
2242     return 0;
2243   }
2244   di<<"OK\n";
2245   return 0;
2246 }
2247
2248 // stack overflow can be successfully handled only on 32-bit Windows
2249 #if defined(_WIN32) && !defined(_WIN64)
2250 static int StackOverflow (int i = -1)
2251 {
2252   char arr[2000];
2253   memset (arr, 0, sizeof(arr));
2254   if (i < 0)
2255     StackOverflow(i-1);
2256   return i;
2257 }
2258 #endif
2259
2260 // this code does not work with optimize mode on Windows
2261 #if defined(_MSC_VER)
2262 #pragma optimize( "", off )
2263 #endif
2264 static Standard_Integer OCC6143 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2265 {
2266   if (argc != 1)
2267     {
2268       cout << "Usage : " << argv[0] << "\n";
2269       return 1;
2270     }
2271   Standard_Boolean Succes;
2272   
2273   Succes = Standard_True;
2274   //OSD::SetSignal();
2275
2276   {//==== Test Divide ByZero (Integer) ========================================
2277     try{
2278       OCC_CATCH_SIGNALS
2279       cout << "(Integer) Divide By Zero..." << endl;
2280       di << "(Integer) Divide By Zero...";
2281       //cout.flush();
2282       di << "\n";
2283       Standard_Integer res, a =4, b = 0 ;
2284       res = a / b;
2285       di << "Error: 4 / 0 = " << res << " - no exception is raised!\n";
2286       Succes = Standard_False;
2287     }
2288 #if defined(SOLARIS) || defined(_WIN32)
2289     catch(Standard_DivideByZero)
2290 #else
2291     catch(Standard_NumericError)
2292 #endif
2293     {
2294       di << "Caught, OK\n";
2295     }
2296     catch(Standard_Failure const& anException) {
2297       di << " Caught (";
2298       di << anException.GetMessageString();
2299       di << ")... KO\n";
2300       Succes = Standard_False;
2301     }
2302     // this case tests if (...) supersedes (Standard_*),
2303     // the normal behaviour is not
2304     catch(...) {
2305       di<<" unknown exception... (But) Ok\n";
2306     }
2307   }
2308
2309   {//==== Test Divide ByZero (Real) ===========================================
2310     try{
2311       OCC_CATCH_SIGNALS
2312       cout << "(Real) Divide By Zero..." << endl;
2313       di << "(Real) Divide By Zero...";
2314       //cout.flush();
2315       di << "\n";
2316       Standard_Real res, a= 4.0, b=0.0;
2317       res = a / b;
2318       di << "Error: 4.0 / 0.0 = " << res << " - no exception is raised!\n";
2319       Succes = Standard_False;
2320     }
2321     catch(Standard_DivideByZero) // Solaris, Windows w/o SSE2
2322     {
2323       di << "Caught, OK\n";
2324     }
2325     catch(Standard_NumericError) // Linux, Windows with SSE2
2326     {
2327       di << "Caught, OK\n";
2328     }
2329     catch(Standard_Failure const& anException) {
2330       //cout << " Caught (" << Standard_Failure::Caught() << ")... KO" << endl;
2331       di << " Caught (";
2332       di << anException.GetMessageString();
2333       di << ")... KO\n";
2334       Succes = Standard_False;
2335     }
2336   }
2337
2338   {//==== Test Overflow (Integer) =============================================
2339     try{
2340       OCC_CATCH_SIGNALS
2341       cout << "(Integer) Overflow..." << endl;
2342       di << "(Integer) Overflow...";
2343       //cout.flush();
2344       di << "\n";
2345       Standard_Integer res, i=IntegerLast();
2346       res = i + 1;
2347       //++++ cout << " -- "<<res<<"="<<i<<"+1   Does not Caught... KO"<< endl;
2348       //++++ Succes = Standard_False;
2349       di << "Not caught: " << i << " + 1 = " << res << ", still OK\n";
2350     }
2351     catch(Standard_Overflow) {
2352       di << "Caught, OK\n";
2353     }
2354     catch(Standard_Failure const& anException) {
2355       //cout << " Caught (" << Standard_Failure::Caught() << ")... KO" << endl;
2356       di << " Caught (";
2357       di << anException.GetMessageString();
2358       di << ")... KO\n";
2359       Succes = Standard_False;
2360     }
2361   }
2362
2363   {//==== Test Overflow (Real) ================================================ 
2364     try{
2365       OCC_CATCH_SIGNALS
2366       cout << "(Real) Overflow..." << endl;
2367       di << "(Real) Overflow...";
2368       //cout.flush();
2369       di << "\n";
2370       Standard_Real res, r=RealLast();
2371       res = r * r;
2372       
2373       (void)sin(1.); //this function tests FPU flags and raises signal (tested on LINUX).
2374
2375       di << "Error: " << r << "*" << r << " = " << res << " - no exception is raised!\n";
2376       Succes = Standard_False;
2377     }
2378     catch(Standard_Overflow) // Solaris, Windows w/o SSE2
2379     {
2380       di << "Caught, OK\n";
2381     }
2382     catch(Standard_NumericError) // Linux, Windows with SSE2
2383     {
2384       di << "Caught, OK\n";
2385     }
2386     catch(Standard_Failure const& anException) {
2387       //cout << " Caught (" << Standard_Failure::Caught() << ")... KO" << endl;
2388       di << " Caught (";
2389       di << anException.GetMessageString();
2390       di << ")... KO\n";
2391       Succes = Standard_False;
2392     }
2393   }
2394
2395   {//==== Test Underflow (Real) ===============================================
2396     try{
2397       OCC_CATCH_SIGNALS
2398       cout << "(Real) Underflow" << endl; // to have message in log even if process crashed
2399       di << "(Real) Underflow";
2400       //cout.flush();
2401       di << "\n";
2402       Standard_Real res, r=1.0e-308;
2403       res = r * r;
2404       //res = res + 1.;
2405       //++++ cout<<"-- "<<res<<"="<<r<<"*"<<r<<"   Does not Caught... KO"<<endl;
2406       //++++ Succes = Standard_False;
2407       di << "Not caught: " << r << "*" << r << " = " << res << ", still OK\n";
2408     }
2409     catch(Standard_Underflow) // could be on Solaris, Windows w/o SSE2
2410     {
2411       di << "Exception caught, KO\n";
2412       Succes = Standard_False;
2413     }
2414     catch(Standard_NumericError) // could be on Linux, Windows with SSE2
2415     {
2416       di << "Exception caught, KO\n";
2417       Succes = Standard_False;
2418     }
2419     catch(Standard_Failure const& anException) {
2420       //cout << " Caught (" << Standard_Failure::Caught() << ")... KO" << endl;
2421       di << " Caught (";
2422       di << anException.GetMessageString();
2423       di << ")... KO\n";
2424       Succes = Standard_False;
2425     }
2426   }
2427
2428   {//==== Test Invalid Operation (Real) ===============================================
2429     try{
2430       OCC_CATCH_SIGNALS
2431       cout << "(Real) Invalid Operation..." << endl;
2432       di << "(Real) Invalid Operation...";
2433       //cout.flush();
2434       di << "\n";
2435       Standard_Real res, r=-1;
2436       res = sqrt(r);
2437       di << "Error: swrt(-1) = " << res << " - no exception is raised!\n";
2438       Succes = Standard_False;
2439     }
2440     catch(Standard_NumericError) {
2441       di << "Caught, OK\n";
2442     }
2443     catch(Standard_Failure const& anException) {
2444       //cout << " Caught (" << Standard_Failure::Caught() << ")... KO" << endl;
2445       di << " Caught (";
2446       di << anException.GetMessageString();
2447       di << ")... KO\n";
2448       Succes = Standard_False;
2449     }
2450   }
2451
2452   {//==== Test Access Violation ===============================================
2453     try {
2454       OCC_CATCH_SIGNALS
2455       cout << "Segmentation Fault..." << endl;
2456       di << "Segmentation Fault...";
2457       //cout.flush();
2458       di << "\n";
2459       int* pint=NULL;
2460       *pint = 4;
2461       di << "Error: writing by NULL address - no exception is raised!\n";
2462       Succes = Standard_False;
2463     }
2464 #ifdef _WIN32
2465     catch(OSD_Exception_ACCESS_VIOLATION)
2466 #else
2467     catch(OSD_SIGSEGV)
2468 #endif
2469     {
2470       di << "Caught, OK\n";
2471     } catch(Standard_Failure const& anException) {
2472       //cout << " Caught (" << Standard_Failure::Caught() << ")... KO" << endl;
2473       di << " Caught (";
2474       di << anException.GetMessageString();
2475       di << ")... KO\n";
2476       Succes = Standard_False;
2477     }
2478   }
2479
2480 #if defined(_WIN32) && !defined(_WIN64)
2481   {//==== Test Stack Overflow ===============================================
2482     try {
2483       OCC_CATCH_SIGNALS
2484       cout << "Stack Overflow..." << endl;
2485       di << "Stack Overflow...";
2486       //cout.flush();
2487       di << "\n";
2488       StackOverflow();
2489       di << "Error - no exception is raised!\n";
2490       Succes = Standard_False;
2491     }
2492     catch(OSD_Exception_STACK_OVERFLOW) {
2493       di << "Caught, OK\n";
2494     }
2495     catch(Standard_Failure const& anException) {
2496       //cout << " Caught (" << Standard_Failure::Caught() << ")... KO" << endl;
2497       di << " Caught (";
2498       di << anException.GetMessageString();
2499       di << ")... KO\n";
2500       Succes = Standard_False;
2501     }
2502   }
2503 #endif
2504
2505  if(Succes) {
2506    di << "TestExcept: Successfull completion\n";
2507  } else {
2508    di << "TestExcept: failure\n";
2509  }
2510
2511   return 0;
2512 }
2513 #if defined(_MSC_VER)
2514 #pragma optimize( "", on )
2515 #endif
2516
2517 static TopoDS_Compound AddTestStructure(int nCount_)
2518 {
2519   BRep_Builder B;
2520   int nCount=nCount_;
2521   TopoDS_Compound C;
2522   B.MakeCompound(C);
2523   BRepPrimAPI_MakeBox mkBox(1.0, 2.0, 3.0);
2524   for (int i=0; i<nCount; i++) {
2525     for (int j=0; j<nCount; j++) {
2526       gp_Trsf trsf;
2527       trsf.SetTranslationPart(gp_Vec(5.0*i, 05.0*j, 0.0));
2528       TopLoc_Location topLoc(trsf);
2529       TopoDS_Shape tempShape=mkBox.Shape().Located(topLoc);
2530       B.Add(C, tempShape);
2531     }
2532   }
2533   return C;
2534 }
2535
2536 static Standard_Integer OCC7141 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2537 {
2538   if (argc != 2 && argc != 3)
2539   {
2540     std::cout << "Usage : " << argv[0] << " [nCount] path\n";
2541     return 1;
2542   }
2543
2544   int nCount = (argc > 2 ? Draw::Atoi(argv[1]) : 10);
2545   TCollection_AsciiString aFilePath (argv[argc > 2 ? 2 : 1]);
2546   STEPCAFControl_Writer writer;
2547   Handle(TDocStd_Document) document;
2548   document = new TDocStd_Document("Pace Test-StepExporter-");
2549   Handle(XCAFDoc_ShapeTool) shapeTool;
2550   shapeTool = XCAFDoc_DocumentTool::ShapeTool(document->Main());
2551   shapeTool->AddShape(AddTestStructure(nCount), Standard_True);
2552   STEPControl_StepModelType mode = STEPControl_AsIs;
2553   if (!Interface_Static::SetIVal("write.step.assembly",1)) { //assembly mode
2554     di << "Failed to set assembly mode for step data\n\n";
2555     return 0;
2556   }
2557   try {
2558     OCC_CATCH_SIGNALS
2559     if( writer.Transfer(document, mode)) {
2560         writer.Write(aFilePath.ToCString());
2561     }
2562   }
2563   catch(OSD_Exception_STACK_OVERFLOW) {
2564     di << "Failed : STACK OVERFLOW\n\n";
2565   }
2566   catch (Standard_Failure const& anException) {
2567     di << "Failed :\n\n";
2568     //cout << Standard_Failure::Caught() << endl;
2569     di << anException.GetMessageString();
2570   }
2571   di << argv[0] << " : Finish\n";
2572   
2573   return 0;
2574 }
2575
2576 static Standard_Integer OCC7372 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2577 {
2578   if (argc != 1)
2579     {
2580       di << "Usage : " << argv[0] << "\n";
2581       return 1;
2582     }
2583   
2584   // 1. Create an array of points
2585   Handle(TColgp_HArray1OfPnt2d) ap = new TColgp_HArray1OfPnt2d(1,5);
2586   ap->SetValue(1,gp_Pnt2d(100.0,0.0));
2587   ap->SetValue(2,gp_Pnt2d(100.0,100.0));
2588   ap->SetValue(3,gp_Pnt2d(0.0,100.0));
2589   ap->SetValue(4,gp_Pnt2d(0.0,0.0));
2590   ap->SetValue(5,gp_Pnt2d(50.0,-50.0));
2591
2592   // 2. Create a periodic bspline through these 5 points
2593   Geom2dAPI_Interpolate intp(ap,Standard_True,1e-6);
2594   intp.Perform();
2595   Handle(Geom2d_BSplineCurve) bspline1 = intp.Curve();
2596
2597   // 3. Increase degree of curve from 3 to 8
2598   bspline1->IncreaseDegree(8); // Increase degree to demonstrate the error
2599   Standard_CString CString1 = "BSplineCurve";
2600   DrawTrSurf::Set(CString1,bspline1);
2601
2602   // 4. Convers BSpline curve to Bezier segments
2603   Geom2dConvert_BSplineCurveToBezierCurve bc(bspline1);
2604
2605   // 5. Test the result of conversion
2606   TCollection_AsciiString aRName;
2607   for(Standard_Integer i = 1; i <= bc.NbArcs(); i++) {
2608     Handle(Geom2d_BezierCurve) arc = bc.Arc(i);
2609     aRName="segment_";
2610     aRName=aRName+TCollection_AsciiString(i);
2611     Standard_CString aRNameStr = aRName.ToCString();
2612     DrawTrSurf::Set(aRNameStr,arc);
2613     di << aRNameStr << " ";
2614   }
2615
2616   return 0;
2617 }
2618
2619 static Standard_Integer OCC8169 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2620 {
2621   if (argc != 4)
2622   {
2623     di << "Usage : " << argv[0] << " edge1 edge2 plane\n";
2624     return 1;
2625   }
2626   TopoDS_Edge theEdge1 = TopoDS::Edge(DBRep::Get(argv[1],TopAbs_EDGE));
2627   if (theEdge1.IsNull()) {
2628     di << "Invalid input shape " << argv[1] << "\n";
2629     return 1;
2630   }
2631   TopoDS_Edge theEdge2 = TopoDS::Edge(DBRep::Get(argv[2],TopAbs_EDGE));
2632   if (theEdge2.IsNull()) {
2633     di << "Invalid input shape " << argv[2] << "\n";
2634     return 1;
2635   }
2636   TopoDS_Face theFace = TopoDS::Face(DBRep::Get(argv[3],TopAbs_FACE));
2637   if (theFace.IsNull()) {
2638     di << "Invalid input shape " << argv[3] << "\n";
2639     return 1;
2640   }
2641
2642   Handle(Geom_Surface) thePlane = BRep_Tool::Surface(theFace);
2643
2644   Standard_Real aConfusion = Precision::Confusion();
2645   Standard_Real aP1first, aP1last, aP2first, aP2last;
2646
2647   Handle(Geom_Curve) aCurve1 = BRep_Tool::Curve(theEdge1, aP1first, aP1last);
2648   Handle(Geom_Curve) aCurve2 = BRep_Tool::Curve(theEdge2, aP2first, aP2last);
2649   Handle(Geom2d_Curve) aCurve2d1 = GeomProjLib::Curve2d(aCurve1, aP1first, aP1last, thePlane);
2650   Handle(Geom2d_Curve) aCurve2d2 = GeomProjLib::Curve2d(aCurve2, aP2first, aP2last, thePlane);
2651
2652   Geom2dAPI_InterCurveCurve anInter(aCurve2d1, aCurve2d2, aConfusion);
2653
2654   Standard_Integer NbPoints = anInter.NbPoints();
2655
2656   di << "NbPoints = " << NbPoints << "\n" ;
2657
2658   if (NbPoints > 0) {
2659     Standard_Integer i;
2660     for (i=1; i<=NbPoints; i++) {
2661       gp_Pnt2d aPi = anInter.Point(i);
2662       di << "Point.X(" << i << ") = " << aPi.X() << "   Point.Y(" << i << ") = " << aPi.Y() << "\n" ;
2663     }
2664   }
2665
2666   Standard_Integer NbSegments = anInter.NbSegments();
2667
2668   di << "\nNbSegments = " << NbSegments << "\n" ;
2669
2670   if (NbSegments > 0) {
2671     IntRes2d_IntersectionSegment aSegment = anInter.Intersector().Segment(1);
2672
2673     gp_Pnt2d aP1 = aCurve2d1->Value(aSegment.FirstPoint().ParamOnFirst());
2674     gp_Pnt2d aP2 = aCurve2d2->Value(aSegment.FirstPoint().ParamOnSecond());
2675   
2676     Standard_Real aDist = aP1.Distance(aP2);
2677   
2678     di << "aP1.X() = " << aP1.X() << "   aP1.Y() = " << aP1.Y() << "\n" ;
2679     di << "aP2.X() = " << aP2.X() << "   aP2.Y() = " << aP2.Y() << "\n" ;
2680
2681     di << "Distance = " << aDist << "\n" ;
2682
2683     di << "Confusion = " << aConfusion << "\n" ;
2684
2685     if (aDist > aConfusion) {
2686       di << "\n" << argv[0] << " Faulty\n" ;
2687     } else {
2688       di << "\n" << argv[0] << " OK\n" ;
2689     }
2690   } else {
2691     di << "\n" << argv[0] << " OK\n" ;
2692   }
2693
2694   return 0;
2695 }
2696 static Standard_Integer OCC10138 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2697 {
2698   if (argc != 3)
2699   {
2700     di << "Usage : " << argv[0] << " lower upper\n";
2701     return 1;
2702   }
2703
2704   Standard_Integer LOWER = Draw::Atoi(argv[1]);
2705   Standard_Integer UPPER = Draw::Atoi(argv[2]);
2706
2707   //! 0. Create an empty document with several test labels
2708   Handle(TDocStd_Document) doc = new TDocStd_Document("XmlOcaf");
2709   doc->SetUndoLimit(100);
2710   TDF_Label main_label = doc->Main();
2711   TDF_Label label1 = main_label.FindChild(1, Standard_True);
2712   TDF_Label label2 = main_label.FindChild(2, Standard_True);
2713   
2714   //! 1. Set/Get OCAF attribute
2715   doc->OpenCommand();
2716   TDataStd_RealArray::Set(label1, LOWER, UPPER);
2717   Handle(TDataStd_RealArray) array;
2718   if (label1.FindAttribute(TDataStd_RealArray::GetID(), array) && 
2719       array->Lower() == LOWER && array->Upper() == UPPER)
2720     cout<<"1: OK"<<endl;
2721   else
2722   {
2723     cout<<"1: Failed.."<<endl;
2724     return 1;
2725   }
2726   doc->CommitCommand();
2727
2728   //! 2. Set/Get value
2729   doc->OpenCommand();
2730   Standard_Integer i;
2731   for (i = LOWER; i <= UPPER; i++)
2732     array->SetValue(i, i);
2733   for (i = LOWER; i <= UPPER; i++)
2734   {  
2735     if (array->Value(i) != i)
2736     {
2737       cout<<"2: Failed.."<<endl;
2738       return 2;
2739     }
2740   }
2741   cout<<"2: OK"<<endl;
2742   doc->CommitCommand();
2743
2744   //! 3. Re-init the array
2745   doc->OpenCommand();
2746   array->Init(LOWER + 2, UPPER + 4);
2747   if (array->Lower() != LOWER + 2 && array->Upper() != UPPER + 4)
2748   {
2749     cout<<"3: Failed.."<<endl;
2750     return 3;
2751   }
2752   for (i = LOWER + 2; i <= UPPER + 4; i++)
2753     array->SetValue(i, i);
2754   for (i = LOWER + 2; i <= UPPER + 4; i++)
2755   {  
2756     if (array->Value(i) != i)
2757     {
2758       cout<<"3: Failed.."<<endl;
2759       return 3;
2760     }
2761   }
2762   cout<<"3: OK"<<endl;
2763   doc->CommitCommand();
2764
2765   //! 4. Change array
2766   doc->OpenCommand();
2767   Handle(TColStd_HArray1OfReal) arr = new TColStd_HArray1OfReal(LOWER + 5, UPPER + 5);
2768   for (i = LOWER + 5; i <= UPPER + 5; i++)
2769     arr->SetValue(i, i);
2770   array->ChangeArray(arr);
2771   for (i = LOWER + 5; i <= UPPER + 5; i++)
2772   {  
2773     if (array->Value(i) != i)
2774     {
2775       cout<<"4: Failed.."<<endl;
2776       return 4;
2777     }
2778   }
2779   cout<<"4: OK"<<endl;
2780   doc->CommitCommand();
2781
2782   //! 5. Copy the array
2783   doc->OpenCommand();
2784   TDF_CopyLabel copier(label1, label2);
2785   copier.Perform();
2786   if (!copier.IsDone())
2787   {
2788     cout<<"5: Failed.."<<endl;
2789     return 5;
2790   }
2791   Handle(TDataStd_RealArray) array2;
2792   if (!label2.FindAttribute(TDataStd_RealArray::GetID(), array2))
2793   {
2794     cout<<"5: Failed.."<<endl;
2795     return 5;
2796   }
2797   for (i = LOWER + 5; i <= UPPER + 5; i++)
2798   {  
2799     if (array->Value(i) != i)
2800     {
2801       cout<<"5: Failed.."<<endl;
2802       return 5;
2803     }
2804   }
2805   cout<<"5: OK"<<endl;
2806   doc->CommitCommand();
2807
2808   //! 6. Undo/Redo
2809   //! 6.a: undoes the 5th action: the copied array should disappear
2810   doc->Undo();
2811   if (!label1.FindAttribute(TDataStd_RealArray::GetID(), array) ||
2812       label2.FindAttribute(TDataStd_RealArray::GetID(), array2))
2813   {
2814     cout<<"6.a: Failed.."<<endl;
2815     return 6;
2816   }
2817   //! 6.b: undoes the 4th action: the array should be changed to (lower+2,upper+4)
2818   doc->Undo();
2819   if (!label1.FindAttribute(TDataStd_RealArray::GetID(), array) || 
2820       array->Lower() != LOWER + 2 ||
2821       array->Upper() != UPPER + 4)
2822   {
2823     cout<<"6.b: Failed.."<<endl;
2824     return 6;
2825   }
2826   for (i = LOWER + 2; i <= UPPER + 4; i++)
2827   {
2828     if (array->Value(i) != i)
2829     {
2830       cout<<"6.b: Failed.."<<endl;
2831       return 6;
2832     }
2833   }
2834   //! 6.c: undoes the 3d action: the array should be changed to (lower,upper)
2835   doc->Undo();
2836   if (!label1.FindAttribute(TDataStd_RealArray::GetID(), array) || 
2837       array->Lower() != LOWER ||
2838       array->Upper() != UPPER)
2839   {
2840     cout<<"6.c: Failed.."<<endl;
2841     return 6;
2842   }
2843   for (i = LOWER; i <= UPPER; i++)
2844   {
2845     if (array->Value(i) != i)
2846     {
2847       cout<<"6.c: Failed.."<<endl;
2848       return 6;
2849     }
2850   }
2851   //! 6.d: undoes and redoes the 2nd action: no change is expected.
2852   doc->Undo();
2853   doc->Redo();
2854   if (!label1.FindAttribute(TDataStd_RealArray::GetID(), array) || 
2855       array->Lower() != LOWER ||
2856       array->Upper() != UPPER)
2857   {
2858     cout<<"6.d: Failed.."<<endl;
2859     return 6;
2860   }
2861   for (i = LOWER; i <= UPPER; i++)
2862   {
2863     if (array->Value(i) != i)
2864     {
2865       cout<<"6.d: Failed.."<<endl;
2866       return 6;
2867     }
2868   }
2869   cout<<"6: OK"<<endl;
2870
2871   //! 7. Re-set the array
2872   doc->OpenCommand();
2873   array = TDataStd_RealArray::Set(label1, LOWER + 1, UPPER + 1);
2874   if (array->Lower() != LOWER + 1 && array->Upper() != UPPER + 1)
2875   {
2876     cout<<"7: Failed.."<<endl;
2877     return 7;
2878   }
2879   for (i = LOWER + 1; i <= UPPER + 1; i++)
2880     array->SetValue(i, i);
2881   for (i = LOWER + 1; i <= UPPER + 1; i++)
2882   {  
2883     if (array->Value(i) != i)
2884     {
2885       cout<<"7: Failed.."<<endl;
2886       return 7;
2887     }
2888   }
2889   cout<<"7: OK"<<endl;
2890   doc->CommitCommand();
2891
2892   //! 8.Test of speed: set LOWER and UPPER equal to great integer number and 
2893   //! measure the time spent by this test.
2894   //! Good luck!
2895
2896   return 0;
2897 }
2898
2899 static Standard_Integer OCC7639 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2900 {
2901   Standard_Boolean IsEvenArgc =  Standard_True;
2902   if (argc % 2 == 0) {
2903     IsEvenArgc =  Standard_True;
2904   } else {
2905     IsEvenArgc =  Standard_False;
2906   }
2907
2908   if (argc < 3 || IsEvenArgc)
2909     {
2910       di << "Usage : " << argv[0] << " index1 value1 ... [indexN valueN]\n";
2911       return 1;
2912     }
2913
2914   Standard_Integer i, aValue, aPosition;
2915   NCollection_Vector<int> vec;
2916   for (i = 0; i < argc - 1; i++) {
2917     i++;
2918     aValue = Draw::Atoi(argv[i]);
2919     aPosition = Draw::Atoi(argv[i+1]);
2920     vec.SetValue(aValue, aPosition);
2921   }
2922   NCollection_Vector<int>::Iterator it(vec);
2923   Standard_Integer j;
2924   for (j = 0; it.More(); it.Next(), j++) {
2925     //di << it.Value() << "\n";                                               
2926     di << j << " " << it.Value() << "\n";                                               
2927   }
2928
2929   return 0;
2930 }
2931
2932 static Standard_Integer OCC8797 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2933 {
2934   if (argc != 1) {
2935     di << "Usage : " << argv[0] << "\n";
2936     return 1;
2937   }
2938
2939   gp_Pnt point(0.0,0.0,0.0);
2940
2941   TColgp_Array1OfPnt poles(0,6);
2942   poles(0)=point;
2943
2944   point.SetCoord(1.0,1.0,0.0);
2945   poles(1)=point;
2946
2947   point.SetCoord(2.0,1.0,0.0);
2948   poles(2)=point;
2949
2950   point.SetCoord(3.0,0.0,0.0);
2951   poles(3)=point;
2952
2953   point.SetCoord(4.0,1.0,0.0);
2954   poles(4)=point;
2955
2956   point.SetCoord(5.0,1.0,0.0);
2957   poles(5)=point;
2958
2959   point.SetCoord(6.0,0.0,0.0);
2960   poles(6)=point;
2961
2962   TColStd_Array1OfReal knots(0,2);
2963   knots(0)=0.0;
2964   knots(1)=0.5;
2965   knots(2)=1.0;
2966
2967   TColStd_Array1OfInteger multi(0,2);
2968   multi(0)=4;
2969   multi(1)=3;
2970   multi(2)=4;
2971
2972   Handle(Geom_BSplineCurve) spline = new Geom_BSplineCurve(poles,knots,multi,3);
2973
2974   //length!! 1.
2975   Standard_Real l_abcissa,l_gprop;
2976   GeomAdaptor_Curve adaptor_spline(spline);
2977   GCPnts_AbscissaPoint temp;
2978   l_abcissa=temp.Length(adaptor_spline);
2979   cout<<"Length Spline(abcissa_Pnt): "<<l_abcissa<<endl;
2980
2981   //length!! 2.
2982   TopoDS_Edge edge = BRepBuilderAPI_MakeEdge (spline);
2983   GProp_GProps prop;
2984   BRepGProp::LinearProperties(edge,prop);
2985   l_gprop=prop.Mass();
2986   cout<<"Length Spline(GProp_GProps): "<<l_gprop<<endl;
2987
2988   cout<<"Difference (abcissa_Pnt<->GProp_GProps): "<<l_gprop-l_abcissa<<endl;
2989
2990   return 0;
2991 }
2992
2993 static Standard_Integer OCC7068 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
2994 {
2995   if (argc != 1)
2996   {
2997     di << "Usage : " << argv[0] << "\n";
2998     return 1;
2999   }
3000
3001   Handle(AIS_InteractiveContext) AISContext = ViewerTest::GetAISContext();
3002   if(AISContext.IsNull())
3003   {
3004     di << "use 'vinit' command before " << argv[0] << "\n";
3005     return 1;
3006   }
3007
3008   // ObjectsInside
3009   AIS_ListOfInteractive ListOfIO_1;
3010   AISContext->ObjectsInside(ListOfIO_1);
3011   di<< "ObjectsInside = " << ListOfIO_1.Extent() <<"\n";
3012   if (!ListOfIO_1.IsEmpty() ) {
3013     AIS_ListIteratorOfListOfInteractive iter;
3014     for (iter.Initialize(ListOfIO_1); iter.More() ; iter.Next() ) {
3015       Handle(AIS_InteractiveObject) aIO=iter.Value();
3016       di<< GetMapOfAIS().Find1(aIO).ToCString() <<"\n";
3017     }
3018   }
3019
3020   return 0;
3021 }
3022
3023 static Standard_Integer OCC11457 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
3024 {
3025   if ((argc < 9) || (((argc-3) % 3) != 0))
3026   {
3027     di << "Usage : " << argv[0] << "polygon lastedge x1 y1 z1 x2 y2 z2 ...\n";
3028     return 1;
3029   }
3030   Standard_Integer i, j, np = (argc-3) / 3;
3031   BRepBuilderAPI_MakePolygon W;
3032   j = 3;
3033   for (i = 1; i <= np; i ++) {
3034     W.Add(gp_Pnt(Draw::Atof(argv[j]),Draw::Atof(argv[j+1]),Draw::Atof(argv[j+2])));
3035     j += 3;
3036   }
3037   W.Close();
3038   DBRep::Set(argv[1],W.Wire());
3039   DBRep::Set(argv[2],W.Edge());
3040   return 0;
3041 }
3042
3043 static Standard_Integer OCC13963 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
3044 {
3045   if (argc < 5) {
3046     di << "Usage : " << argv[0] << " ratio origin_x origin_y origin_z\n";
3047     return 1;
3048   }
3049   gp_Ax2 aPln (gp_Pnt(0.,0.,0.),
3050                gp_Dir(1., -1., 0.));
3051   gp_GTrsf aTrf;
3052   aTrf.SetAffinity (aPln, Draw::Atof(argv[4]));
3053   gp_XYZ aOrigin (Draw::Atof(argv[1]),Draw::Atof(argv[2]),Draw::Atof(argv[3]));
3054   gp_XYZ aResult (aOrigin);
3055   aTrf.Transforms(aResult);
3056   char sbf[512];
3057   Sprintf(sbf, "( %8.3f %8.3f %8.3f ) => ( %8.3f %8.3f %8.3f )\n",
3058           aOrigin.X(), aOrigin.Y(), aOrigin.Z(),
3059           aResult.X(), aResult.Y(), aResult.Z());
3060   di<<sbf;
3061   return 0;
3062 }
3063
3064 Standard_Integer OCC14376(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
3065 {
3066   if (argc < 2) {
3067     di << "Usage : " << argv[0] << " shape [deflection]\n";
3068     return 1;
3069   }
3070
3071   TopoDS_Shape aShape = DBRep::Get(argv[1]);
3072
3073   if (aShape.IsNull()) {
3074     di<<" Null shape is not allowed";
3075     return 1;
3076   }
3077
3078   Standard_Real aDeflection = 0.45110277533;
3079   if (argc > 2) {
3080     aDeflection = Draw::Atof(argv[2]);
3081   }
3082   di<<"deflection="<< aDeflection << "\n";
3083
3084   BRepMesh_IncrementalMesh aIMesh(aShape, aDeflection, Standard_False, M_PI / 9.);
3085   TopLoc_Location aLocation;
3086   Handle(Poly_Triangulation) aTriang = BRep_Tool::Triangulation(TopoDS::Face(aShape), aLocation);
3087
3088   if(aTriang.IsNull()) {
3089     di << argv[0] << " : Faulty\n" ;
3090   } else {
3091     di << argv[0] << " : OK\n" ;
3092     di<<"NbNodes="<< aTriang->NbNodes()<< "\n";
3093     di<<"NbTriangles="<< aTriang->NbTriangles()<< "\n";
3094   }
3095   return 0;
3096 }
3097
3098 static Standard_Integer OCC15489 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
3099 {
3100   if (argc != 4) {
3101     di << "Usage : " << argv[0] << " A B C\n";
3102     return 1;
3103   }
3104   try
3105     {
3106       gp_Lin2d aLin2d (Draw::Atof(argv[1]),Draw::Atof(argv[2]),Draw::Atof(argv[3]));
3107       gp_Pnt2d anOrigin = aLin2d.Location();
3108       di << "X_0 = " << anOrigin.X() << "   Y_0 = " << anOrigin.Y() << "\n" ;
3109     }
3110   catch(Standard_ConstructionError)
3111     {
3112       di << argv[0] << " Exception: Sqrt(A*A + B*B) <= Resolution from gp\n";
3113     }
3114   return 0;
3115 }
3116
3117 static Standard_Integer OCC15755 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
3118 {
3119   if (argc != 3) {
3120     di << "Usage : " << argv[0] << " file shape\n";
3121     return 1;
3122   }
3123
3124   IGESControl_Reader aReader;
3125   aReader.ReadFile(argv[1]);
3126   aReader.SetReadVisible(Standard_True);
3127   aReader.TransferRoots();
3128
3129   Handle(IGESData_IGESModel) model = aReader.IGESModel();
3130   if (model.IsNull()) {
3131     di << "model.IsNull()\n";
3132     return 1;
3133   }
3134   Standard_Integer nb = model->NbEntities();
3135   for (Standard_Integer i = 1; i <= nb; i ++) {
3136     Handle(IGESData_IGESEntity) ent = model->Entity(i);
3137     Handle(TCollection_HAsciiString) name;
3138     name = ent->NameValue();
3139     Standard_CString aStr = name->ToCString();
3140     di << "NameValue = " << aStr << "\n";
3141   }
3142
3143   TopoDS_Shape shape = aReader.OneShape();
3144   DBRep::Set(argv[2],shape);
3145   return 0;
3146 }
3147
3148 // For OCC16782 testing
3149 #include <AppStd_Application.hxx>
3150 #include <TDF_Tool.hxx>
3151 #include <TColStd_HArray1OfInteger.hxx>
3152 // Iterators
3153 #include <TColStd_ListIteratorOfListOfInteger.hxx>
3154 #include <TColStd_ListIteratorOfListOfReal.hxx>
3155 #include <TDataStd_ListIteratorOfListOfExtendedString.hxx>
3156 #include <TDataStd_ListIteratorOfListOfByte.hxx>
3157 #include <TDF_ListIteratorOfLabelList.hxx>
3158 // Attributes
3159 #include <TDataStd_Tick.hxx>
3160 #include <TDataStd_IntegerList.hxx>
3161 #include <TDataStd_RealList.hxx>
3162 #include <TDataStd_ExtStringList.hxx>
3163 #include <TDataStd_BooleanList.hxx>
3164 #include <TDataStd_ReferenceList.hxx>
3165 #include <TDataStd_BooleanArray.hxx>
3166 #include <TDataStd_ReferenceArray.hxx>
3167 #include <TDataStd_ByteArray.hxx>
3168 #include <TDataStd_NamedData.hxx>
3169 #include <TDF_Reference.hxx>
3170 //
3171 Handle(AppStd_Application) app;
3172 int TestSetGet(const Handle(TDocStd_Document)& doc)
3173 {
3174   // TDataStd_Tick:
3175   // Set
3176   TDataStd_Tick::Set(doc->Main());
3177   // Get
3178   Handle(TDataStd_Tick) tick;
3179   if (!doc->Main().FindAttribute(TDataStd_Tick::GetID(), tick))
3180     return 1;
3181   // Forget
3182   doc->Main().ForgetAttribute(TDataStd_Tick::GetID());
3183   if (doc->Main().IsAttribute(TDataStd_Tick::GetID()))
3184     return 2;
3185   doc->Main().ResumeAttribute(tick);
3186   if (!doc->Main().IsAttribute(TDataStd_Tick::GetID()))
3187     return 3;
3188   // Forget
3189   doc->Main().ForgetAttribute(TDataStd_Tick::GetID());
3190   if (doc->Main().IsAttribute(TDataStd_Tick::GetID()))
3191     return 2;
3192
3193   // TDataStd_IntegerList:
3194   // Set
3195   Handle(TDataStd_IntegerList) setintlist = TDataStd_IntegerList::Set(doc->Main());
3196   setintlist->Append(2);
3197   setintlist->Prepend(1);
3198   setintlist->InsertAfter(3, 2);
3199   setintlist->InsertBefore(0, 1);
3200   setintlist->Append(200);
3201   setintlist->Remove(0);
3202   setintlist->Remove(200);
3203   // Get
3204   Handle(TDataStd_IntegerList) getintlist;
3205   if (!doc->Main().FindAttribute(TDataStd_IntegerList::GetID(), getintlist))
3206     return 1;
3207   if (getintlist->First() != 1)
3208     return 2;
3209   if (getintlist->Last() != 3)
3210     return 3;
3211   const TColStd_ListOfInteger& intlist = getintlist->List();
3212   TColStd_ListIteratorOfListOfInteger itr_intlist(intlist);
3213   for (; itr_intlist.More(); itr_intlist.Next())
3214   {
3215     if (itr_intlist.Value() != 1 &&
3216         itr_intlist.Value() != 2 &&
3217         itr_intlist.Value() != 3)
3218     {
3219       return 4;
3220     }
3221   }
3222   getintlist->Clear();
3223
3224   // TDataStd_RealList:
3225   // Set
3226   Handle(TDataStd_RealList) setdbllist = TDataStd_RealList::Set(doc->Main());
3227   setdbllist->Append(2.5);
3228   setdbllist->Prepend(1.5);
3229   setdbllist->InsertAfter(3.5, 2.5);
3230   setdbllist->InsertBefore(0.5, 1.5);
3231   setdbllist->Append(200.5);
3232   setdbllist->Remove(0.5);
3233   setdbllist->Remove(200.5);
3234   // Get
3235   Handle(TDataStd_RealList) getdbllist;
3236   if (!doc->Main().FindAttribute(TDataStd_RealList::GetID(), getdbllist))
3237     return 1;
3238   if (getdbllist->First() != 1.5)
3239     return 2;
3240   if (getdbllist->Last() != 3.5)
3241     return 3;
3242   const TColStd_ListOfReal& dbllist = getdbllist->List();
3243   TColStd_ListIteratorOfListOfReal itr_dbllist(dbllist);
3244   for (; itr_dbllist.More(); itr_dbllist.Next())
3245   {
3246     if (itr_dbllist.Value() != 1.5 &&
3247         itr_dbllist.Value() != 2.5 &&
3248         itr_dbllist.Value() != 3.5)
3249     {
3250       return 4;
3251     }
3252   }
3253   getdbllist->Clear();
3254
3255   // TDataStd_ExtStringList:
3256   // Set
3257   Handle(TDataStd_ExtStringList) setstrlist = TDataStd_ExtStringList::Set(doc->Main());
3258   setstrlist->Append("Hello");
3259   setstrlist->Prepend("Guten Tag");
3260   setstrlist->InsertAfter("Bonjour", "Guten Tag");
3261   setstrlist->InsertBefore("Bonsoir", "Hello");
3262   setstrlist->Append("Good bye");
3263   setstrlist->Remove("Bonsoir");
3264   setstrlist->Remove("Good bye");
3265   // Get
3266   Handle(TDataStd_ExtStringList) getstrlist;
3267   if (!doc->Main().FindAttribute(TDataStd_ExtStringList::GetID(), getstrlist))
3268     return 1;
3269   if (getstrlist->First() != "Guten Tag")
3270     return 2;
3271   if (getstrlist->Last() != "Hello")
3272     return 3;
3273   const TDataStd_ListOfExtendedString& strlist = getstrlist->List();
3274   TDataStd_ListIteratorOfListOfExtendedString itr_strlist(strlist);
3275   for (; itr_strlist.More(); itr_strlist.Next())
3276   {
3277     if (itr_strlist.Value() != "Guten Tag" &&
3278         itr_strlist.Value() != "Bonjour" &&
3279         itr_strlist.Value() != "Hello")
3280     {
3281       return 4;
3282     }
3283   }
3284   getstrlist->Clear();
3285
3286   // TDataStd_BooleanList:
3287   // Set
3288   Handle(TDataStd_BooleanList) setboollist = TDataStd_BooleanList::Set(doc->Main());
3289   setboollist->Append(Standard_True);
3290   setboollist->Prepend(Standard_False);
3291   // Get
3292   Handle(TDataStd_BooleanList) getboollist;
3293   if (!doc->Main().FindAttribute(TDataStd_BooleanList::GetID(), getboollist))
3294     return 1;
3295   if (getboollist->First() != Standard_False)
3296     return 2;
3297   if (getboollist->Last() != Standard_True)
3298     return 3;
3299   const TDataStd_ListOfByte& boollist = getboollist->List();
3300   for (TDataStd_ListIteratorOfListOfByte itr_boollist(boollist); itr_boollist.More(); itr_boollist.Next())
3301   {
3302     if (itr_boollist.Value() != 1
3303      && itr_boollist.Value() != 0)
3304     {
3305       return 4;
3306     }
3307   }
3308   getboollist->Clear();
3309
3310   // TDataStd_ReferenceList:
3311   TDF_Label L1 = doc->Main().FindChild(100);
3312   TDF_Label L2 = doc->Main().FindChild(101);
3313   TDF_Label L3 = doc->Main().FindChild(102);
3314   TDF_Label L4 = doc->Main().FindChild(103);
3315   TDF_Label L5 = doc->Main().FindChild(104);
3316   // Set
3317   Handle(TDataStd_ReferenceList) setreflist = TDataStd_ReferenceList::Set(doc->Main());
3318   setreflist->Append(L1);
3319   setreflist->Prepend(L2);
3320   setreflist->InsertAfter(L3, L2);
3321   setreflist->InsertBefore(L4, L1);
3322   setreflist->Append(L5);
3323   setreflist->Remove(L4);
3324   setreflist->Remove(L5);
3325   // Get
3326   Handle(TDataStd_ReferenceList) getreflist;
3327   if (!doc->Main().FindAttribute(TDataStd_ReferenceList::GetID(), getreflist))
3328     return 1;
3329   if (getreflist->First() != L2)
3330     return 2;
3331   if (getreflist->Last() != L1)
3332     return 3;
3333   const TDF_LabelList& reflist = getreflist->List();
3334   TDF_ListIteratorOfLabelList itr_reflist(reflist);
3335   for (; itr_reflist.More(); itr_reflist.Next())
3336   {
3337     if (itr_reflist.Value() != L1 &&
3338         itr_reflist.Value() != L2 &&
3339         itr_reflist.Value() != L3)
3340     {
3341       return 4;
3342     }
3343   }
3344   getreflist->Clear();
3345
3346   // TDataStd_BooleanArray:
3347   // Set
3348   Handle(TDataStd_BooleanArray) setboolarr = TDataStd_BooleanArray::Set(doc->Main(), 12, 16);
3349   setboolarr->SetValue(12, Standard_True);
3350   setboolarr->SetValue(13, Standard_False);
3351   setboolarr->SetValue(14, Standard_False);
3352   setboolarr->SetValue(15, Standard_False);
3353   setboolarr->SetValue(16, Standard_True);
3354   setboolarr->SetValue(14, Standard_True);
3355   // Get
3356   Handle(TDataStd_BooleanArray) getboolarr;
3357   if (!doc->Main().FindAttribute(TDataStd_BooleanArray::GetID(), getboolarr))
3358     return 1;
3359   if (getboolarr->Value(12) != Standard_True)
3360     return 2;
3361   if (getboolarr->Value(13) != Standard_False)
3362     return 2;
3363   if (getboolarr->Value(14) != Standard_True)
3364     return 2;
3365   if (getboolarr->Value(15) != Standard_False)
3366     return 2;
3367   if (getboolarr->Value(16) != Standard_True)
3368     return 2;
3369
3370   // TDataStd_ReferenceArray:
3371   // Set
3372   Handle(TDataStd_ReferenceArray) setrefarr = TDataStd_ReferenceArray::Set(doc->Main(), 0, 4);
3373   setrefarr->SetValue(0, L1);
3374   setrefarr->SetValue(1, L2);
3375   setrefarr->SetValue(2, L3);
3376   setrefarr->SetValue(3, L4);
3377   setrefarr->SetValue(4, L5);
3378   // Get
3379   Handle(TDataStd_ReferenceArray) getrefarr;
3380   if (!doc->Main().FindAttribute(TDataStd_ReferenceArray::GetID(), getrefarr))
3381     return 1;
3382   if (getrefarr->Value(0) != L1)
3383     return 2;
3384   if (getrefarr->Value(1) != L2)
3385     return 2;
3386   if (getrefarr->Value(2) != L3)
3387     return 2;
3388   if (getrefarr->Value(3) != L4)
3389     return 2;
3390   if (getrefarr->Value(4) != L5)
3391     return 2;
3392
3393   // TDataStd_ByteArray:
3394   // Set
3395   Handle(TDataStd_ByteArray) setbytearr = TDataStd_ByteArray::Set(doc->Main(), 12, 16);
3396   setbytearr->SetValue(12, 0);
3397   setbytearr->SetValue(13, 1);
3398   setbytearr->SetValue(14, 2);
3399   setbytearr->SetValue(15, 3);
3400   setbytearr->SetValue(16, 255);
3401   // Get
3402   Handle(TDataStd_ByteArray) getbytearr;
3403   if (!doc->Main().FindAttribute(TDataStd_ByteArray::GetID(), getbytearr))
3404     return 1;
3405   if (getbytearr->Value(12) != 0)
3406     return 2;
3407   if (getbytearr->Value(13) != 1)
3408     return 2;
3409   if (getbytearr->Value(14) != 2)
3410     return 2;
3411   if (getbytearr->Value(15) != 3)
3412     return 2;
3413   if (getbytearr->Value(16) != 255)
3414     return 2;
3415   
3416   // TDataStd_NamedData:
3417   // Set:
3418   Handle(TDataStd_NamedData) setnd = TDataStd_NamedData::Set(doc->Main());
3419   setnd->SetInteger("Integer1", 1);
3420   setnd->SetInteger("Integer2", 2);
3421   setnd->SetInteger("Integer3", 8);
3422   setnd->SetInteger("Integer3", 3);
3423   // Get:
3424   Handle(TDataStd_NamedData) getnd;
3425   if (!doc->Main().FindAttribute(TDataStd_NamedData::GetID(), getnd))
3426     return 1;
3427   if (!getnd->HasIntegers())
3428     return 2;
3429   if (!getnd->HasInteger("Integer1"))
3430     return 3;
3431   if (getnd->GetInteger("Integer2") != 2)
3432     return 4;
3433   if (getnd->GetInteger("Integer3") != 3)
3434     return 4;
3435
3436   return 0;
3437 }
3438
3439 int TestUndoRedo(const Handle(TDocStd_Document)& doc)
3440 {
3441   // TDataStd_Tick:
3442   doc->OpenCommand();
3443   Handle(TDataStd_Tick) tick = TDataStd_Tick::Set(doc->Main());
3444   doc->CommitCommand();
3445   if (!doc->Main().IsAttribute(TDataStd_Tick::GetID()))
3446     return 1;
3447   doc->Undo();
3448   if (doc->Main().IsAttribute(TDataStd_Tick::GetID()))
3449     return 2;
3450   doc->Redo();
3451   if (!doc->Main().IsAttribute(TDataStd_Tick::GetID()))
3452     return 3;
3453
3454   // TDataStd_IntegerList:
3455   doc->OpenCommand();
3456   Handle(TDataStd_IntegerList) intlist = TDataStd_IntegerList::Set(doc->Main());
3457   intlist->Append(2);
3458   intlist->Prepend(1);
3459   intlist->InsertBefore(0, 1);
3460   intlist->InsertAfter(3, 2);
3461   doc->CommitCommand();
3462   if (!doc->Main().IsAttribute(TDataStd_IntegerList::GetID()))
3463     return 1;
3464   doc->Undo();
3465   if (!intlist->IsEmpty())
3466     return 2;
3467   doc->Redo();
3468   if (!intlist->Extent())
3469     return 3;
3470   if (intlist->First() != 0)
3471     return 4;
3472   if (intlist->Last() != 3)
3473     return 5;
3474   intlist->Clear();
3475
3476   // TDataStd_RealList:
3477   doc->OpenCommand();
3478   Handle(TDataStd_RealList) dbllist = TDataStd_RealList::Set(doc->Main());
3479   dbllist->Append(2.5);
3480   dbllist->Prepend(1.5);
3481   dbllist->InsertBefore(0.5, 1.5);
3482   dbllist->InsertAfter(3.5, 2.5);
3483   doc->CommitCommand();
3484   if (!doc->Main().IsAttribute(TDataStd_RealList::GetID()))
3485     return 1;
3486   doc->Undo();
3487   if (!dbllist->IsEmpty())
3488     return 2;
3489   doc->Redo();
3490   if (!dbllist->Extent())
3491     return 3;
3492   if (dbllist->First() != 0.5)
3493     return 4;
3494   if (dbllist->Last() != 3.5)
3495     return 5;
3496   dbllist->Clear();
3497
3498   // TDataStd_ExtStringList:
3499   doc->OpenCommand();
3500   Handle(TDataStd_ExtStringList) strlist = TDataStd_ExtStringList::Set(doc->Main());
3501   strlist->Append("Hello");
3502   strlist->Prepend("Guten Tag");
3503   strlist->InsertAfter("Bonjour", "Guten Tag");
3504   strlist->InsertBefore("Bonsoir", "Hello");
3505   doc->CommitCommand();
3506   if (!doc->Main().IsAttribute(TDataStd_ExtStringList::GetID()))
3507     return 1;
3508   doc->Undo();
3509   if (!strlist->IsEmpty())
3510     return 2;
3511   doc->Redo();
3512   if (!strlist->Extent())
3513     return 3;
3514   if (strlist->First() != "Guten Tag")
3515     return 4;
3516   if (strlist->Last() != "Hello")
3517     return 5;
3518   strlist->Clear();
3519
3520   // TDataStd_BooleanList:
3521   doc->OpenCommand();
3522   Handle(TDataStd_BooleanList) boollist = TDataStd_BooleanList::Set(doc->Main());
3523   boollist->Append(Standard_True);
3524   boollist->Prepend(Standard_False);
3525   doc->CommitCommand();
3526   if (!doc->Main().IsAttribute(TDataStd_BooleanList::GetID()))
3527     return 1;
3528   doc->Undo();
3529   if (!boollist->IsEmpty())
3530     return 2;
3531   doc->Redo();
3532   if (!boollist->Extent())
3533     return 3;
3534   if (boollist->First() != Standard_False)
3535     return 4;
3536   if (boollist->Last() != Standard_True)
3537     return 5;
3538   boollist->Clear();
3539
3540   // TDataStd_ReferenceList:
3541   TDF_Label L1 = doc->Main().FindChild(100);
3542   TDF_Label L2 = doc->Main().FindChild(101);
3543   TDF_Label L3 = doc->Main().FindChild(102);
3544   TDF_Label L4 = doc->Main().FindChild(103);
3545   doc->OpenCommand();
3546   Handle(TDataStd_ReferenceList) reflist = TDataStd_ReferenceList::Set(doc->Main());
3547   reflist->Append(L1);
3548   reflist->Prepend(L2);
3549   reflist->InsertBefore(L3, L1);
3550   reflist->InsertAfter(L4, L2);
3551   doc->CommitCommand();
3552   if (!doc->Main().IsAttribute(TDataStd_ReferenceList::GetID()))
3553     return 1;
3554   doc->Undo();
3555   if (!reflist->IsEmpty())
3556     return 2;
3557   doc->Redo();
3558   if (!reflist->Extent())
3559     return 3;
3560   if (reflist->First() != L2)
3561     return 4;
3562   if (reflist->Last() != L1)
3563     return 5;
3564   reflist->Clear();
3565
3566   // TDataStd_BooleanArray:
3567   doc->OpenCommand();
3568   Handle(TDataStd_BooleanArray) boolarr = TDataStd_BooleanArray::Set(doc->Main(), 23, 25);
3569   boolarr->SetValue(23, Standard_True);
3570   boolarr->SetValue(25, Standard_True);
3571   doc->CommitCommand();
3572   doc->OpenCommand();
3573   boolarr = TDataStd_BooleanArray::Set(doc->Main(), 230, 250);
3574   boolarr->SetValue(230, Standard_True);
3575   boolarr->SetValue(250, Standard_True);  
3576   doc->CommitCommand();
3577   doc->Undo();
3578   if (boolarr->Value(23) != Standard_True)
3579     return 2;
3580   if (boolarr->Value(24) != Standard_False)
3581     return 2;
3582   if (boolarr->Value(25) != Standard_True)
3583     return 2;
3584   doc->Redo();
3585   if (boolarr->Value(230) != Standard_True)
3586     return 3;
3587   if (boolarr->Value(240) != Standard_False)
3588     return 3;
3589   if (boolarr->Value(250) != Standard_True)
3590     return 3;
3591
3592   // TDataStd_ReferenceArray:
3593   doc->OpenCommand();
3594   Handle(TDataStd_ReferenceArray) refarr = TDataStd_ReferenceArray::Set(doc->Main(), 5, 8);
3595   refarr->SetValue(5, L1);
3596   refarr->SetValue(6, L2);
3597   refarr->SetValue(7, L3);
3598   refarr->SetValue(8, L4);
3599   doc->CommitCommand();
3600   if (!doc->Main().IsAttribute(TDataStd_ReferenceArray::GetID()))
3601     return 1;
3602   doc->Undo();
3603   doc->Redo();
3604   if (refarr->Value(5) != L1)
3605     return 4;
3606   if (refarr->Value(6) != L2)
3607     return 4;
3608   if (refarr->Value(7) != L3)
3609     return 4;
3610   if (refarr->Value(8) != L4)
3611     return 4;
3612
3613   // TDataStd_ByteArray:
3614   doc->OpenCommand();
3615   Handle(TDataStd_ByteArray) bytearr = TDataStd_ByteArray::Set(doc->Main(), 23, 25);
3616   bytearr->SetValue(23, 23);
3617   bytearr->SetValue(25, 25);
3618   doc->CommitCommand();
3619   doc->OpenCommand();
3620   bytearr = TDataStd_ByteArray::Set(doc->Main(), 230, 250);
3621   bytearr->SetValue(230, 230);
3622   bytearr->SetValue(250, 250);  
3623   doc->CommitCommand();
3624   doc->Undo();
3625   if (bytearr->Value(23) != 23)
3626     return 2;
3627   if (bytearr->Value(25) != 25)
3628     return 2;
3629   doc->Redo();
3630   if (bytearr->Value(230) != 230)
3631     return 3;
3632   if (bytearr->Value(250) != 250)
3633     return 3;
3634
3635   // TDataStd_NamedData:
3636   doc->OpenCommand();
3637   Handle(TDataStd_NamedData) nd = TDataStd_NamedData::Set(doc->Main());
3638   nd->SetByte("b14", 12);
3639   nd->SetByte("b17", 18);
3640   nd->SetByte("b14", 14);
3641   nd->SetByte("b17", 17);
3642   doc->CommitCommand();
3643   doc->OpenCommand();
3644   nd = TDataStd_NamedData::Set(doc->Main());
3645   nd->SetReal("r14", 14);
3646   nd->SetReal("r17", 17);
3647   nd->SetReal("r14", 14.4);
3648   nd->SetReal("r17", 17.7);
3649   doc->CommitCommand();
3650   doc->Undo();
3651   if (nd->HasStrings())
3652     return 1;
3653   if (nd->HasReals())
3654     return 1;
3655   if (nd->HasReal("r17"))
3656     return 2;
3657   if (!nd->HasBytes())
3658     return 3;
3659   if (nd->GetByte("b14") != 14)
3660     return 4;
3661   if (nd->GetByte("b17") != 17)
3662     return 4;
3663   if (nd->HasByte("b18"))
3664     return 5;
3665   doc->Redo();
3666   if (!nd->HasBytes())
3667     return 1;
3668   if (!nd->HasReals())
3669     return 1;
3670   if (nd->GetByte("b14") != 14)
3671     return 2;
3672   if (nd->GetReal("r14") != 14.4)
3673     return 2;
3674   if (nd->GetReal("r17") != 17.7)
3675     return 2;
3676
3677   return 0;
3678 }
3679
3680 int TestCopyPaste(const Handle(TDocStd_Document)& doc)
3681 {
3682   TDF_Label L1 = doc->Main().FindChild(1);
3683   TDF_Label L2 = doc->Main().FindChild(2);
3684   TDF_CopyLabel copier(L1, L2);
3685
3686   // TDataStd_Tick:
3687   TDataStd_Tick::Set(L1);
3688   copier.Perform();
3689   if (!copier.IsDone())
3690     return 1;
3691   if (!L2.IsAttribute(TDataStd_Tick::GetID()))
3692     return 2;
3693
3694   // TDataStd_IntegerList:
3695   Handle(TDataStd_IntegerList) intlist = TDataStd_IntegerList::Set(L1);
3696   intlist->Append(1);
3697   intlist->InsertAfter(2, 1);
3698   copier.Perform();
3699   if (!copier.IsDone())
3700     return 1;
3701   intlist->Clear();
3702   intlist.Nullify();
3703   if (!L2.FindAttribute(TDataStd_IntegerList::GetID(), intlist))
3704     return 2;
3705   if (intlist->First() != 1)
3706     return 3;
3707   if (intlist->Last() != 2)
3708     return 4;
3709   intlist->Clear();
3710
3711   // TDataStd_RealList:
3712   Handle(TDataStd_RealList) dbllist = TDataStd_RealList::Set(L1);
3713   dbllist->Append(1.5);
3714   dbllist->InsertAfter(2.5, 1.5);
3715   copier.Perform();
3716   if (!copier.IsDone())
3717     return 1;
3718   dbllist->Clear();
3719   dbllist.Nullify();
3720   if (!L2.FindAttribute(TDataStd_RealList::GetID(), dbllist))
3721     return 2;
3722   if (dbllist->First() != 1.5)
3723     return 3;
3724   if (dbllist->Last() != 2.5)
3725     return 4;
3726   dbllist->Clear();
3727
3728   // TDataStd_ExtStringList:
3729   Handle(TDataStd_ExtStringList) strlist = TDataStd_ExtStringList::Set(L1);
3730   strlist->Append("Open CASCADE");
3731   strlist->InsertAfter(" - is the best set of libraries!", "Open CASCADE");
3732   copier.Perform();
3733   if (!copier.IsDone())
3734     return 1;
3735   strlist->Clear();
3736   strlist.Nullify();
3737   if (!L2.FindAttribute(TDataStd_ExtStringList::GetID(), strlist))
3738     return 2;
3739   if (strlist->First() != "Open CASCADE")
3740     return 3;
3741   if (strlist->Last() != " - is the best set of libraries!")
3742     return 4;
3743   strlist->Clear();
3744
3745   // TDataStd_BooleanList:
3746   Handle(TDataStd_BooleanList) boollist = TDataStd_BooleanList::Set(L1);
3747   boollist->Append(Standard_True);
3748   boollist->Prepend(Standard_False);
3749   copier.Perform();
3750   if (!copier.IsDone())
3751     return 1;
3752   boollist->Clear();
3753   boollist.Nullify();
3754   if (!L2.FindAttribute(TDataStd_BooleanList::GetID(), boollist))
3755     return 2;
3756   if (boollist->First() != Standard_False)
3757     return 3;
3758   if (boollist->Last() != Standard_True)
3759     return 4;
3760   boollist->Clear();
3761
3762   // TDataStd_ReferenceList:
3763   TDF_Label L100 = doc->Main().FindChild(100);
3764   TDF_Label L101 = doc->Main().FindChild(101);
3765   Handle(TDataStd_ReferenceList) reflist = TDataStd_ReferenceList::Set(L1);
3766   reflist->Append(L100);
3767   reflist->InsertAfter(L101, L100);
3768   copier.Perform();
3769   if (!copier.IsDone())
3770     return 1;
3771   reflist->Clear();
3772   reflist.Nullify();
3773   if (!L2.FindAttribute(TDataStd_ReferenceList::GetID(), reflist))
3774     return 2;
3775   if (reflist->First() != L100)
3776     return 3;
3777   if (reflist->Last() != L101)
3778     return 4;
3779   reflist->Clear();
3780
3781   // TDataStd_BooleanArray:
3782   Handle(TDataStd_BooleanArray) boolarr = TDataStd_BooleanArray::Set(L1, 4, 6);
3783   boolarr->SetValue(4, Standard_True);
3784   boolarr->SetValue(6, Standard_True);
3785   copier.Perform();
3786   if (!copier.IsDone())
3787     return 1;
3788   boolarr.Nullify();
3789   if (!L2.FindAttribute(TDataStd_BooleanArray::GetID(), boolarr))
3790     return 2;
3791   if (boolarr->Value(4) != Standard_True)
3792     return 3;
3793   if (boolarr->Value(5) != Standard_False)
3794     return 3;
3795   if (boolarr->Value(6) != Standard_True)
3796     return 3;
3797
3798   // TDataStd_ReferenceArray:
3799   Handle(TDataStd_ReferenceArray) refarr = TDataStd_ReferenceArray::Set(L1, 3, 4);
3800   refarr->SetValue(3, L100);
3801   refarr->SetValue(4, L101);
3802   copier.Perform();
3803   if (!copier.IsDone())
3804     return 1;
3805   refarr.Nullify();
3806   if (!L2.FindAttribute(TDataStd_ReferenceArray::GetID(), refarr))
3807     return 2;
3808   if (refarr->Value(3) != L100)
3809     return 3;
3810   if (refarr->Value(4) != L101)
3811     return 3;
3812
3813   // TDataStd_ByteArray:
3814   Handle(TDataStd_ByteArray) bytearr = TDataStd_ByteArray::Set(L1, 4, 6);
3815   bytearr->SetValue(4, 40);
3816   bytearr->SetValue(6, 60);
3817   copier.Perform();
3818   if (!copier.IsDone())
3819     return 1;
3820   bytearr.Nullify();
3821   if (!L2.FindAttribute(TDataStd_ByteArray::GetID(), bytearr))
3822     return 2;
3823   if (bytearr->Value(4) != 40)
3824     return 3;