15c9c4445aacf462b5267a60253eb93e59bc3913
[occt.git] / src / QABugs / QABugs_3.cxx
1 // Created on: 2002-06-17
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 <QABugs.hxx>
17 #include <Draw.hxx>
18 #include <Draw_Interpretor.hxx>
19 #include <TopLoc_Location.hxx>
20 #include <TopoDS_Face.hxx>
21 #include <TopoDS.hxx>
22 #include <DBRep.hxx>
23 #include <Geom_Surface.hxx>
24 #include <BRep_Tool.hxx>
25 #include <GeomInt_IntSS.hxx>
26 #include <BRepBuilderAPI_MakeEdge.hxx>
27 #include <Standard_ErrorHandler.hxx>
28 #include <Graphic3d_ClipPlane.hxx>
29
30 #include <fstream>
31
32 static int BUC60623(Draw_Interpretor& di, Standard_Integer argc, const char ** a)
33 {
34   if(argc!=4)
35   {
36     di << "Usage : " << a[0] << " result Shape1 Shape2\n";
37     return -1;
38   }
39
40   TopLoc_Location L1;
41   TopLoc_Location L2;
42   TopoDS_Face F1 = TopoDS::Face(DBRep::Get(a[2],TopAbs_FACE));
43   TopoDS_Face F2 = TopoDS::Face(DBRep::Get(a[3],TopAbs_FACE));
44   Handle(Geom_Surface) GSF1 = BRep_Tool::Surface(F1, L1);
45   Handle(Geom_Surface) GSF2 = BRep_Tool::Surface(F2, L2);
46   GeomInt_IntSS Inter;
47   Inter.Perform(GSF1,GSF2, BRep_Tool::Tolerance(F1));
48   if (!Inter.IsDone()) {
49     di << "Intersection not done\n";
50     return 1;
51   }
52   Standard_Integer nbsol = Inter.NbLines();
53   if(!nbsol) {
54     di << "The number of solutions is zero!"   << "\n";
55     return 0;
56   }
57   Handle(Geom_Curve) Sol = Inter.Line(1);
58   if(!Sol.IsNull()) {
59     DBRep::Set(a[1], BRepBuilderAPI_MakeEdge(Sol));
60       return 0;
61     } else di << "The first solution is Null!"   << "\n";
62
63   di << "fini\n";
64   return 0;
65 }
66
67 #include<ViewerTest.hxx>
68 #include<AIS_InteractiveContext.hxx>
69 #include<AIS_Shape.hxx>
70   
71 static int BUC60569(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
72 {
73   if(argc!=2)
74   {
75     di << "Usage : " << argv[0] << " shape\n";
76     return -1;
77   }
78
79   Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
80   if(myAISContext.IsNull()) {
81     di << "use 'vinit' command before " << argv[0] << "\n";
82     return -1;
83   }
84
85   TopoDS_Shape theShape =  DBRep::Get(argv[1]);
86
87   Handle(AIS_Shape) anAISShape = new AIS_Shape( theShape ); 
88   myAISContext->Display( anAISShape, Standard_True );
89
90   Standard_DISABLE_DEPRECATION_WARNINGS
91   myAISContext->OpenLocalContext(); 
92   myAISContext->ActivateStandardMode(TopAbs_FACE);
93   Standard_ENABLE_DEPRECATION_WARNINGS
94
95   return 0;
96 }
97
98 static int BUC60614(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
99 {
100   if(argc!=2)
101   {
102     di << "Usage : "<< argv[0] << " shape\n";
103     return -1;
104   }
105
106   //  di.Eval("vinit");
107
108   TopoDS_Shape theShape =  DBRep::Get(argv[1]);
109
110 //  ViewerTest::GetAISContext(); 
111   Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
112   if(myAISContext.IsNull()) {
113     di << "use 'vinit' command before " << argv[0] << "\n";
114     return -1;    
115   }
116   Handle(AIS_Shape) anAISShape = new AIS_Shape( theShape ); 
117   myAISContext->Display( anAISShape, Standard_True );
118
119   Standard_DISABLE_DEPRECATION_WARNINGS
120   myAISContext->OpenLocalContext(); 
121   myAISContext->ActivateStandardMode(TopAbs_COMPOUND);
122   Standard_ENABLE_DEPRECATION_WARNINGS
123 //  myAISContext->ActivateStandardMode(TopAbs_SOLID);
124 //  di.Eval("vfit");
125 //  cout << "vfini" << endl;
126   return 0;
127 }
128
129 #include<BRep_Builder.hxx>
130 #include<BRepTools_ShapeSet.hxx>
131 #include<BRepTools.hxx>
132 #include<BRepAdaptor_HSurface.hxx>
133 #include<TopOpeBRep_PointClassifier.hxx>
134 #include<Precision.hxx>
135 #ifdef _MSC_VER
136 #include<stdio.h>
137 #endif
138
139 static int BUC60609(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
140   gp_Pnt2d uvSurf;
141   TopAbs_State state;
142   
143   if (argc == 3) {
144     // BUC60609 shape name
145   } else if ( argc == 5 ) {
146     // BUC60609 shape name U V
147   } else {
148     di << "Usage : "<< argv[0] << " shape name [U V]\n";
149     return(-1);
150   }
151   
152   TCollection_AsciiString  aFilePath(argv[1]); 
153   
154   filebuf fic;
155   istream in(&fic);
156   if (!fic.open(aFilePath.ToCString(),ios::in)) {
157     di << "Cannot open file for reading : " << aFilePath << "\n";
158     return(-1);
159   }
160
161   TopoDS_Shape theShape;
162   char typ[255];
163   in >> typ;
164   if (!in.fail()) {
165     if( !strcmp(typ, "DBRep_DrawableShape") ){
166       BRep_Builder B;
167       BRepTools_ShapeSet S(B);
168       S.Read(in);
169       S.Read(theShape,in);
170     }else{
171       di << "Wrong entity type in " << aFilePath << "\n";
172       return(-1);
173     }
174   }
175
176   const TopoDS_Face &face = TopoDS::Face (theShape);
177
178   if(argc > 2){
179     DBRep::Set(argv[2],face);
180   }
181
182   Standard_Real faceUMin,faceUMax,faceVMin,faceVMax;
183   
184   BRepTools::UVBounds (face, faceUMin,faceUMax,faceVMin,faceVMax);
185
186   di << "The bounds of the trimmed face:\n";
187   di << faceUMin << " <= U <= " << faceUMax << "\n";
188   di << faceVMin << " <= V <= " << faceVMax << "\n";
189   
190   Handle(BRepAdaptor_HSurface) hsurfa = new BRepAdaptor_HSurface(face);
191   
192   TopOpeBRep_PointClassifier PClass;
193
194   di << "Now test the point classifier by inputting U,V values\n";
195   di << "inside or outside the bounds displayed above\n";
196   di << "Type stop to exit\n";
197   
198   // Please register this:
199   // ***********************************************
200   // Note also that for periodic surfaces such as nimpod_1.topo,
201   // the U/V values may be +- 2pi compared to the actual face bounds
202   // (because U,V is probably coming from a Geom package routine).
203   // Hence IT WOULD BE USEFUL IF TopOpeBRep_PointClassifier COULD
204   // COPE WITH PERIODIC SURFACES, i.e. U,V +-Period giving same result.
205   // *************************************************
206
207   if (argc == 3) {
208     uvSurf = gp_Pnt2d(0.14,5.1);
209     state = PClass.Classify(face,uvSurf,Precision::PConfusion());
210     if(state == TopAbs_IN || state == TopAbs_ON){
211       di << "U=" << 0.14 << " V=" << 5.1 << "  classified INSIDE\n";
212     }else{
213       di << "U=" << 0.14 << " V=" << 5.1 << "  classified OUTSIDE\n";
214     }
215
216     uvSurf = gp_Pnt2d(1.28,5.1);
217     state = PClass.Classify(face,uvSurf,Precision::PConfusion());
218     if(state == TopAbs_IN || state == TopAbs_ON){
219       di << "U=" << 1.28 << " V=" << 5.1 << "  classified INSIDE\n";
220     }else{
221       di << "U=" << 1.28 << " V=" << 5.1 << "  classified OUTSIDE\n";
222     }
223   } else {
224     uvSurf = gp_Pnt2d(Draw::Atof(argv[3]),Draw::Atof(argv[4]));
225     state = PClass.Classify(face,uvSurf,Precision::PConfusion());
226     if(state == TopAbs_IN || state == TopAbs_ON){
227       di << "U=" << Draw::Atof(argv[3]) << " V=" << Draw::Atof(argv[4]) << "  classified INSIDE\n";
228     }else{
229       di << "U=" << Draw::Atof(argv[3]) << " V=" << Draw::Atof(argv[4]) << "  classified OUTSIDE\n";
230     }
231   }
232   return 0;
233 }
234
235 #include<BRepBuilderAPI_MakeVertex.hxx>
236 #include<TCollection_ExtendedString.hxx>
237 #include<AIS_LengthDimension.hxx>
238
239 static Standard_Integer BUC60632(Draw_Interpretor& di, Standard_Integer /*n*/, const char ** a)
240 {
241   
242   Handle(AIS_InteractiveContext) myAIScontext = ViewerTest::GetAISContext();
243   if(myAIScontext.IsNull()) {
244     di << "use 'vinit' command before " << a[0] << "\n";
245     return -1;
246   }
247   myAIScontext->EraseAll (Standard_False);
248   
249   TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(gp_Pnt(0,0,0)); 
250   TopoDS_Vertex V2 = BRepBuilderAPI_MakeVertex(gp_Pnt(10,10,0)); 
251   
252   Handle(AIS_Shape) Ve1 = new AIS_Shape(V1);
253   Handle(AIS_Shape) Ve2 = new AIS_Shape(V2);
254   
255   myAIScontext->Display (Ve1, Standard_False);
256   myAIScontext->Display (Ve2, Standard_False);
257   
258   Handle(Geom_Plane) Plane1 = new Geom_Plane(gp_Pnt(0,0,0),gp_Dir(0,0,1)); 
259   TCollection_ExtendedString Ext1("Dim1"); 
260   Handle(AIS_LengthDimension) Dim1 = new AIS_LengthDimension(V1,V2,Plane1->Pln()); 
261   Dim1->SetCustomValue (Draw::Atof(a[2]));
262
263   Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect();
264   anAspect->MakeArrows3d (Standard_False);
265   anAspect->MakeText3d (Standard_True);
266   anAspect->MakeTextShaded (Standard_True);
267   anAspect->TextAspect()->SetHeight (2.5);
268   anAspect->ArrowAspect()->SetLength (1.0);
269   Dim1->SetDimensionAspect (anAspect);
270
271   myAIScontext->SetDisplayMode (Dim1, Draw::Atoi(a[1]), Standard_False);
272   myAIScontext->Display (Dim1, Standard_True);
273   return 0;
274 }
275
276 #include<TopoDS_Wire.hxx>
277
278 static Standard_Integer BUC60652(Draw_Interpretor& di, Standard_Integer argc, const char ** argv )
279 {
280   if(argc!=2) {
281     di << "Usage : BUC60652 fase"   << "\n";
282     return 1;
283   }
284   TopoDS_Shape shape = DBRep::Get( argv[1] ); 
285   TopoDS_Face face = TopoDS::Face( shape ); 
286   TopoDS_Wire ow = BRepTools::OuterWire( face ); 
287   DBRep::Set( "w", ow ); 
288   return 0; 
289 }
290
291 #include <BRepAlgo_BooleanOperations.hxx>
292   
293 static Standard_Integer defNbPntMax = 30;
294 static Standard_Real defTol3d = 1.e-7;
295 static Standard_Real defTol2d = 1.e-7;
296 Standard_Integer NbPntMax = defNbPntMax;
297 Standard_Real Toler3d =defTol3d;
298 Standard_Real Toler2d = defTol2d;
299 //              //== // ksection : operateur section appelant BRepAlgo_BooleanOperation
300 //== // ksection : operateur section appelant BRepAlgo_BooleanOperations
301 //=======================================================================
302 Standard_Integer ksection(Draw_Interpretor& di, Standard_Integer n, const char ** a) {
303   if (n < 8) {
304     di << "Usage : " << a[0] << " resultat shell1 shell2 NbPntMax Toler3d Toler2d"   << "\n";
305     return -1;
306   }
307   // a[1]= resultat
308   // a[2]= shell1
309   // a[3]= shell2
310   // a[4]= NbPntMax
311   // a[5]= Toler3d
312   // a[6]= Toler2d
313   TopoDS_Shape s1 = DBRep::Get(a[2],TopAbs_SHELL);
314   TopoDS_Shape s2 = DBRep::Get(a[3],TopAbs_SHELL);
315   if (s1.IsNull() || s2.IsNull()) return 1;
316   NbPntMax=Draw::Atoi(a[4]);
317   Toler3d=Draw::Atof(a[5]);
318   Toler2d=Draw::Atof(a[6]);
319
320   di << "BRepAlgo_BooleanOperations myalgo\n";
321   BRepAlgo_BooleanOperations myalgo;
322
323   myalgo.Shapes(s1, s2);
324   myalgo.SetApproxParameters(NbPntMax,Toler3d,Toler2d);
325   TopoDS_Shape res; res = myalgo.Section();
326   DBRep::Set(a[1],res);
327   return 0;
328 }
329
330 #include <Geom_Axis2Placement.hxx>
331 #include <AIS_Trihedron.hxx>
332
333 static Standard_Integer BUC60574(Draw_Interpretor& di, Standard_Integer /*n*/, const char ** a)
334 {
335   
336   Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
337   if(myAISContext.IsNull()) {
338     di << "use 'vinit' command before " << a[0] << "\n";
339     return -1;
340   }
341   
342   Handle(Geom_Axis2Placement) atrihedronAxis = new Geom_Axis2Placement(gp::XOY()); 
343   Handle(AIS_Trihedron) atri = new AIS_Trihedron(atrihedronAxis); 
344   gp_Trsf aTrsf; 
345   gp_Vec trans(5,5,5); 
346   aTrsf.SetTranslation(trans); 
347   TopLoc_Location aLoc(aTrsf); 
348   myAISContext->SetLocation(atri,aLoc); 
349   myAISContext->Display(atri,0,-1,Standard_True, Standard_True);
350
351   Standard_DISABLE_DEPRECATION_WARNINGS
352   myAISContext->OpenLocalContext(Standard_False, Standard_True, Standard_False, Standard_False);
353   Standard_ENABLE_DEPRECATION_WARNINGS
354
355   myAISContext->Load(atri,3,Standard_True);
356
357   return 0;
358 }
359
360 #include <TopoDS_Solid.hxx>
361 #include <BRepPrimAPI_MakeBox.hxx>
362 #include <BRepPrimAPI_MakeSphere.hxx>
363
364 #include <BRepAlgoAPI_Fuse.hxx>
365 #include <BRepAlgo_Fuse.hxx>
366
367 #include <V3d_View.hxx>
368 #include <gce_MakePln.hxx>
369
370 #define DEFAULT_COLOR    Quantity_NOC_GOLDENROD
371
372 //=======================================================================
373 //function : GetColorFromName
374 //purpose  : get the Quantity_NameOfColor from a string
375 //=======================================================================
376
377 static Quantity_NameOfColor GetColorFromName( const char *name ) 
378
379   Quantity_NameOfColor ret = DEFAULT_COLOR;
380   
381   Standard_Boolean Found = Standard_False;
382   Standard_CString colstring;
383   for(Standard_Integer i=0;i<=514 && !Found;i++)
384     {
385       colstring = Quantity_Color::StringName(Quantity_NameOfColor(i));
386       if (!strcasecmp(name,colstring)) {
387         ret = (Quantity_NameOfColor)i;
388         Found = Standard_True;
389       }
390     }
391   
392   return ret;
393 }
394    
395 static Standard_Integer setcolor (Draw_Interpretor& di,Standard_Integer argc, const char ** argv )
396 {
397
398 Handle(AIS_InteractiveContext) myAISContext = ViewerTest::GetAISContext();
399 if(myAISContext.IsNull()) { 
400     di << "use 'vinit' command before " << argv[0] << "\n";
401     return -1;
402   }
403
404 Handle(V3d_View) myV3dView = ViewerTest::CurrentView();
405
406 switch (argc){
407
408  case 2:
409    {
410      di <<"case 2 : This command will change the background color to " << argv[1]<< "\n";
411 //   setcolor <name> 
412 //   Change the background color of the view with a predefined name Graphic3d_NOC_<name>  
413
414      myV3dView -> SetBackgroundColor(GetColorFromName(argv[1]));
415      myV3dView -> Redraw();
416    break;
417    }
418
419  case 3:
420    {
421      di <<"case 3 : This command will change the color of the objects to "<< argv[2]<< "\n";
422 //   setcolor <object> <name> 
423 //   Change the object color with a predefined name 
424
425      TopoDS_Shape aShape = DBRep::Get(argv[1]);
426      Handle(AIS_InteractiveObject) myShape = new AIS_Shape (aShape);
427      myAISContext->SetColor(myShape,GetColorFromName(argv[2]),Standard_True);
428      myAISContext->Display(myShape,Standard_True);
429      myAISContext->UpdateCurrentViewer();
430 //     return 0;
431    break;
432    }
433  case 4:
434    {
435      di <<"case 4 : This command will change the background color to <r> <g> <b> :"<< argv[1] << argv[2] << argv[3] << "\n";
436
437 //   setcolor <r> <g> <b> 
438 //   Change the background color of the view with the color values <r>,<g>,<b> 
439 //   A color value must be defined in the space [0.,1.] 
440
441      Standard_Real QuantityOfRed   = Draw::Atoi(argv[1]);
442      Standard_Real QuantityOfGreen = Draw::Atoi(argv[2]);
443      Standard_Real QuantityOfBlue  = Draw::Atoi(argv[3]);
444      myV3dView->SetBackgroundColor(Quantity_TOC_RGB,QuantityOfRed,QuantityOfGreen,QuantityOfBlue);
445      myV3dView->Redraw();
446    break;
447    }
448
449  case 5:
450    {
451     di <<"case 5 : This command will change the color of the objects to <r> <g> <b> : "<<argv[2]<< argv[3]<< argv[4]<< "\n";
452
453 //  setcolor <object> <r> <g> <b> 
454 //  change the object color with RGB values. 
455
456
457     Standard_Real QuantityOfRed   = Draw::Atof(argv[2]);
458     Standard_Real QuantityOfGreen = Draw::Atof(argv[3]);
459     Standard_Real QuantityOfBlue  = Draw::Atof(argv[4]);
460
461     TopoDS_Shape aShape = DBRep::Get(argv[1]);
462     Handle(AIS_InteractiveObject) myShape =  new AIS_Shape (aShape);
463     myAISContext->SetColor(myShape,Quantity_Color(QuantityOfRed,QuantityOfGreen,QuantityOfBlue,Quantity_TOC_RGB),Standard_True);
464     myAISContext->Display(myShape,Standard_True);
465     myAISContext->UpdateCurrentViewer();
466 //  myShape->SetColor(Quantity_Color(QuantityOfRed,QuantityOfGreen,QuantityOfBlue,Quantity_TOC_RGB));
467 //  myShape->Redisplay();
468    break;
469    }
470  }
471 return 0;
472 }
473
474 #include <BRepBndLib.hxx>
475 #include <Bnd_HArray1OfBox.hxx>
476   
477 static Standard_Integer BUC60729 (Draw_Interpretor& /*di*/,Standard_Integer /*argc*/, const char ** /*argv*/ )
478 {
479   Bnd_Box aMainBox;
480   TopoDS_Shape aShape = BRepPrimAPI_MakeBox(1,1,1).Solid();
481
482   BRepBndLib::Add(aShape , aMainBox );
483
484   Standard_Integer siMaxNbrBox = 6;
485   Bnd_BoundSortBox m_BoundSortBox;
486   m_BoundSortBox.Initialize( aMainBox, siMaxNbrBox );
487   TopExp_Explorer aExplorer(aShape,TopAbs_FACE);
488   Standard_Integer i;
489
490
491 //  Bnd_Box __emptyBox; // Box is void !
492 //  Handle(Bnd_HArray1OfBox) __aSetOfBox = new Bnd_HArray1OfBox( 1, siMaxNbrBox, __emptyBox ); 
493
494   for (i=1,aExplorer.ReInit(); aExplorer.More(); aExplorer.Next(),i++ ) 
495     { 
496       const TopoDS_Shape& aFace = aExplorer.Current();
497       Bnd_Box aBox;
498       BRepBndLib::Add( aFace, aBox );
499       m_BoundSortBox.Add( aBox, i );
500 //      __aSetOfBox->SetValue( i, aBox ); 
501     } 
502 //  m_BoundSortBox.Initialize( aMainBox, siMaxNbrBox );
503   
504   return 0;
505 }
506
507 static Standard_Integer BUC60724(Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** /*argv*/ )
508 {
509   TCollection_AsciiString as1("");
510   TCollection_AsciiString as2('\0');
511   if(as1.ToCString() == NULL || as1.Length() != 0 || as1.ToCString()[0] != '\0')
512     di << "Error : the first string is not zero string : " << as1.ToCString() << "\n";
513
514   if(as2.ToCString() == NULL || as2.Length() != 0 || as2.ToCString()[0] != '\0')
515     di << "Error : the second string is not zero string : " << as2.ToCString() << "\n";
516   
517   return 0;
518 }
519
520 #include <UnitsAPI.hxx>
521
522 static Standard_Integer BUC60727(Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** /*argv*/ )
523 {
524 di <<"Program Test\n";
525 UnitsAPI::SetLocalSystem(UnitsAPI_MDTV); //length is mm 
526 di <<"AnyToLS (3,mm) = " << UnitsAPI::AnyToLS(3.,"mm") << "\n"; // result was WRONG. 
527
528    return 0;
529 }
530
531 #include <gp_Circ.hxx>
532 #include <Geom_Circle.hxx>
533 #include <GeomAPI.hxx>
534 #include <Geom2d_CartesianPoint.hxx>
535 #include <Geom2dGcc_QualifiedCurve.hxx>
536 #include <Geom2dGcc_Circ2d2TanRad.hxx>
537 #include <Geom2d_Circle.hxx>
538 #include <ProjLib.hxx>
539
540 static Standard_Integer BUC60792(Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** argv )
541 {
542   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
543   if(aContext.IsNull()) { 
544     di << "use 'vinit' command before " << argv[0] << "\n";
545     return -1;
546   }
547
548   gp_Pnt pt3d(0, 20, 150);
549   gp_Ax2 anAx2(gp_Pnt(0, 0, 0), gp_Dir(1, 0, 0), gp_Dir(0, 0, 1));
550   gp_Circ circ(anAx2, 50.0); 
551   Handle(Geom_Circle) gcir = new Geom_Circle(circ); 
552   Handle(Geom_Plane) pln = new Geom_Plane(gp_Ax3(gp_Pnt(0, 0, 0), gp_Dir(1, 0, 0))); 
553   Handle(Geom2d_Curve) gcir1 = GeomAPI::To2d(gcir, pln->Pln()); 
554   TopoDS_Shape sh1 = BRepBuilderAPI_MakeEdge(gcir1, pln).Shape(); 
555   Handle(AIS_Shape) ais1 = new AIS_Shape(sh1); 
556   aContext->SetColor (ais1, Quantity_NOC_INDIANRED, Standard_False);
557   aContext->Display (ais1, Standard_False);
558   DBRep::Set("sh0",sh1);
559   gp_Pnt2d thepoint; 
560 //  local_get_2Dpointfrom3Dpoint(pt3d, pln->Pln(), thepoint); 
561   thepoint = ProjLib::Project(pln->Pln(),pt3d);
562   Handle(Geom2d_CartesianPoint) ThePoint = new Geom2d_CartesianPoint(thepoint); 
563   Geom2dAdaptor_Curve acur1(gcir1) ; 
564   Geom2dGcc_QualifiedCurve qcur1(acur1, GccEnt_outside) ; 
565   Geom2dGcc_Circ2d2TanRad cirtanrad(qcur1, ThePoint, 200.0, 0.0001); 
566   printf("\n No. of solutions = %d\n", cirtanrad.NbSolutions()); 
567   Handle(Geom2d_Circle) gccc; 
568   if( cirtanrad.NbSolutions() ) { 
569     for( int i = 1; i<=cirtanrad.NbSolutions(); i++) { 
570       gp_Circ2d ccc = cirtanrad.ThisSolution(i); 
571       gccc = new Geom2d_Circle(ccc); 
572       TopoDS_Shape sh = BRepBuilderAPI_MakeEdge(gccc, pln).Shape();
573       Standard_Character aStr[5];
574       Sprintf(aStr,"sh%d",i);
575       DBRep::Set(aStr,sh);
576       Handle(AIS_Shape) ais = new AIS_Shape(sh); 
577       if( i ==1 ) 
578         aContext->SetColor (ais, Quantity_NOC_GREEN, Standard_False);
579       if( i == 2) 
580         aContext->SetColor (ais, Quantity_NOC_HOTPINK, Standard_False);
581       aContext->Display (ais, Standard_False);
582       Standard_Real ParSol1, ParSol2, ParArg1, ParArg2; 
583       gp_Pnt2d PntSol1, PntSol2; 
584       cirtanrad.Tangency1(i, ParSol1, ParArg1, PntSol1);
585       printf("%f\t%f\t\t%f\t%f\n",ParSol1, ParArg1,PntSol1.X(),PntSol1.Y());
586       cirtanrad.Tangency2(i, ParSol2, ParArg2, PntSol2); 
587       printf("%f\t%f\t\t%f\t%f\n",ParSol2, ParArg2,PntSol2.X(),PntSol2.Y());
588     }
589   }
590   aContext->UpdateCurrentViewer();
591   return 0;
592 }
593
594 #include <TColgp_Array2OfPnt.hxx>
595 #include <Geom_BezierSurface.hxx>
596 #include <BRepBuilderAPI_MakeFace.hxx>
597 #include <BRepBuilderAPI_MakeWire.hxx>
598 #include <Geom_OffsetSurface.hxx>
599 #include <BRepFilletAPI_MakeFillet2d.hxx>
600 #include <GeomProjLib.hxx>
601 #include <Geom_TrimmedCurve.hxx>
602
603 static Standard_Integer BUC60811(Draw_Interpretor& di, Standard_Integer argc, const char ** argv )
604 {
605   if(argc == 4) {
606     TopLoc_Location L1;
607     TopoDS_Edge aEdge = TopoDS::Edge(DBRep::Get(argv[2],TopAbs_EDGE));
608     TopoDS_Face aFace = TopoDS::Face(DBRep::Get(argv[3],TopAbs_FACE));
609     Standard_Real f = 0.0, l = 0.0; 
610     Handle(Geom_Curve) GC = BRep_Tool::Curve(aEdge,f,l);
611     Handle(Geom_Surface) GS = BRep_Tool::Surface(aFace, L1);
612     GC = new Geom_TrimmedCurve(GC, f, l); 
613     Handle(Geom_Curve) projCurve = GeomProjLib::Project(GC,GS); 
614     BRepBuilderAPI_MakeWire *myWire; 
615     myWire = new BRepBuilderAPI_MakeWire(); 
616     myWire->Add((BRepBuilderAPI_MakeEdge(projCurve)).Edge());
617     DBRep::Set(argv[1],myWire->Wire());
618     return  0;
619   }
620   
621   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
622   if(aContext.IsNull()) { 
623     di << "use 'vinit' command before " << argv[0] << "\n";
624     return -1;
625   }
626   
627 //step 1. creating a Bezier Surface and a patch 
628   TopoDS_Face FP; 
629   TopoDS_Shape FP1; 
630   TopoDS_Solid solid; 
631   Handle(AIS_Shape) ais1; 
632   Handle(AIS_Shape) ais2; 
633   Handle(Geom_BezierSurface) BZ1;
634   TColgp_Array2OfPnt array1(1,3,1,3);
635   array1.SetValue(1,1,gp_Pnt(0,100,0));
636   array1.SetValue(1,2,gp_Pnt(200,100,0));
637   array1.SetValue(1,3,gp_Pnt(400,100,0)); 
638   array1.SetValue(2,1,gp_Pnt(0,200,100)); 
639   array1.SetValue(2,2,gp_Pnt(200,200,100)); 
640   array1.SetValue(2,3,gp_Pnt(400,200,100)); 
641   array1.SetValue(3,1,gp_Pnt(0,300,0)); 
642   array1.SetValue(3,2,gp_Pnt(200,300,0)); 
643   array1.SetValue(3,3,gp_Pnt(400,300,0)); 
644   BZ1 = new Geom_BezierSurface(array1);
645   BRepBuilderAPI_MakeFace bzf1( BZ1, Precision::Confusion() );
646   TopoDS_Face F1= bzf1.Face();
647   ais1 = new AIS_Shape(F1);
648   DBRep::Set("F1",F1);
649   aContext->SetMaterial(ais1,Graphic3d_NOM_ALUMINIUM,Standard_False);
650   aContext->Display (ais1, Standard_False);
651   BRep_Builder B;
652   TopoDS_Shell shell;
653   B.MakeShell(shell);
654   B.Add(shell, bzf1); 
655   shell.Closed (BRep_Tool::IsClosed (shell));
656   B.MakeSolid(solid);
657   B.Add(solid,shell); 
658   gp_Dir D(0, 0, 1.0f); 
659   BRepBuilderAPI_MakeWire mkw; 
660   gp_Pnt p1 = gp_Pnt(150., 150.0, 260.);
661   gp_Pnt p2 = gp_Pnt(350., 150., 260.); 
662   BRepBuilderAPI_MakeEdge* E1 = new BRepBuilderAPI_MakeEdge(p1,p2); 
663   mkw.Add(*E1); 
664   p1 = gp_Pnt(350., 150., 260.); 
665   p2 = gp_Pnt(350., 250., 260.); 
666   BRepBuilderAPI_MakeEdge* E2 = new BRepBuilderAPI_MakeEdge(p1,p2); 
667   mkw.Add(*E2); 
668   p1 = gp_Pnt(350., 250., 260.); 
669   p2 = gp_Pnt(300., 250.0, 260.); 
670   BRepBuilderAPI_MakeEdge* E3 = new BRepBuilderAPI_MakeEdge(p1,p2);
671   mkw.Add(*E3); 
672   p1 = gp_Pnt(300., 250.0, 260.); 
673   p2 = gp_Pnt(200., 200.0, 260.); 
674   BRepBuilderAPI_MakeEdge* E4 = new BRepBuilderAPI_MakeEdge(p1,p2); 
675   mkw.Add(*E4); 
676   p1 = gp_Pnt(200., 200.0, 260.); 
677   p2 = gp_Pnt(150., 200.0, 260.); 
678   BRepBuilderAPI_MakeEdge* E5 = new BRepBuilderAPI_MakeEdge(p1,p2);
679   mkw.Add(*E5); 
680   p1 = gp_Pnt(150., 200.0, 260.); 
681   p2 = gp_Pnt(150., 150.0, 260.); 
682   BRepBuilderAPI_MakeEdge* E6 = new BRepBuilderAPI_MakeEdge(p1,p2);
683   mkw.Add(*E6); 
684   FP = BRepBuilderAPI_MakeFace(mkw.Wire()); 
685   ais2 = new AIS_Shape( FP ); 
686   aContext->SetMaterial(ais2,Graphic3d_NOM_ALUMINIUM,Standard_False); 
687   aContext->Display (ais2, Standard_False);
688
689   DBRep::Set("FP",FP);
690   
691 //step 2. offseting the surface. 
692   Handle(Geom_OffsetSurface) offsurf; 
693   offsurf = new Geom_OffsetSurface(BZ1, -100); 
694   BRepBuilderAPI_MakeFace bzf2( offsurf, Precision::Confusion() ); 
695   TopoDS_Face F2= bzf2.Face(); 
696   Handle(AIS_Shape) ais22 = new AIS_Shape(F2); 
697   aContext->Display (ais22, Standard_False);
698   DBRep::Set("F2",F2);
699   
700 //step 3. filleting the patch. 
701 //( I want to project wire of this patch on offseted surface above) 
702   BRepFilletAPI_MakeFillet2d fillet( FP ); 
703   TopExp_Explorer Ex; 
704   Ex.Init(FP, TopAbs_VERTEX); 
705   TopoDS_Vertex v1 = TopoDS::Vertex(Ex.Current()); 
706   fillet.AddFillet(v1, 20); 
707   di << "\nError is " << fillet.Status() << "\n";
708 //  printf("\nError is %d ", fillet.Status()); 
709   Ex.Next(); 
710   TopoDS_Vertex V2 = TopoDS::Vertex(Ex.Current()); 
711   fillet.AddFillet(V2, 20); 
712   di << "\nError is " << fillet.Status() << "\n";
713 //  printf("\nError is %d ", fillet.Status());
714   fillet.Build(); 
715   FP1 = fillet.Shape(); 
716   ais2 = new AIS_Shape( FP1 ); 
717   aContext->SetMaterial(ais2,Graphic3d_NOM_ALUMINIUM,Standard_False); 
718   aContext->Display (ais2, Standard_False);
719
720   DBRep::Set("FP1",FP1);
721   
722 //step 4. Projecting the wire of this patch on offsetted surface. 
723 //  TopExp_Explorer Ex; 
724   BRepBuilderAPI_MakeWire *myWire; 
725   myWire = new BRepBuilderAPI_MakeWire(); 
726   for (Ex.Init( FP1, TopAbs_EDGE); Ex.More(); Ex.Next()) 
727     { 
728       TopoDS_Edge e1 = TopoDS::Edge(Ex.Current()); 
729       Standard_Real f = 0.0, l = 0.0; 
730       Handle(Geom_Curve) newBSplin = BRep_Tool::Curve(e1, f, l);
731       newBSplin = new Geom_TrimmedCurve(newBSplin, f, l); 
732       Handle(Geom_Curve) projCurve = GeomProjLib::Project(newBSplin,offsurf); 
733       myWire->Add((BRepBuilderAPI_MakeEdge(projCurve)).Edge()); 
734     } 
735   Handle(AIS_Shape) ais33 = new AIS_Shape( myWire->Wire() ); 
736   aContext->Display (ais33, Standard_True);
737
738   DBRep::Set("Wire",myWire->Wire());
739   
740   return 0;
741 }
742
743 #include<GeomAPI_ExtremaCurveCurve.hxx>
744
745 static int BUC60825(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
746
747 {
748   if(argc < 3){
749     printf("Usage: %s edge1 edge2",argv[0]);
750     return(-1);
751   }
752  
753         TopoDS_Edge E1 = TopoDS::Edge(DBRep::Get(argv[1])),
754         E2 = TopoDS::Edge(DBRep::Get(argv[2]));
755
756         Standard_Real fp , lp;
757
758         Handle(Geom_Curve) C1 = BRep_Tool::Curve(E1 , fp , lp),
759         C2 = BRep_Tool::Curve(E2 , fp , lp);
760
761         GeomAPI_ExtremaCurveCurve aExt(C1 , C2);
762
763         di << "NB RESULTS : " << aExt.NbExtrema() << "\n";
764
765         return 0;
766 }
767
768 #include <BRepBuilderAPI_MakePolygon.hxx>
769 #include <BRepOffsetAPI_ThruSections.hxx>
770
771 static int OCC10006(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
772 {
773   if(argc > 2) {
774     di << "Usage : " << argv[0] << " [BRepAlgoAPI/BRepAlgo = 1/0]\n";
775     return 1;
776   }
777   Standard_Boolean IsBRepAlgoAPI = Standard_True;
778   if (argc == 2) {
779     Standard_Integer IsB = Draw::Atoi(argv[1]);
780     if (IsB != 1) {
781       IsBRepAlgoAPI = Standard_False;
782 #if ! defined(BRepAlgo_def01)
783 //      di << "Error: There is not BRepAlgo_Fuse class\n";
784 //      return 1;
785 #endif
786     }
787   }
788
789   double bottompoints1[12] = { 10, -10, 0, 100, -10, 0, 100, -100, 0, 10, -100, 0};
790   double toppoints1[12] = { 0, 0, 10, 100, 0, 10, 100, -100, 10, 0, -100, 10};
791   double bottompoints2[12] = { 0, 0, 10.00, 100, 0, 10.00, 100, -100, 10.00, 0, -100, 10.00};
792   double toppoints2[12] = { 0, 0, 250, 100, 0, 250, 100, -100, 250, 0, -100, 250};
793   BRepBuilderAPI_MakePolygon bottompolygon1, toppolygon1, bottompolygon2, toppolygon2;
794   gp_Pnt tmppnt;
795   for (int i=0;i<4;i++) {
796     tmppnt.SetCoord(bottompoints1[3*i], bottompoints1[3*i+1], bottompoints1[3*i+2]);
797     bottompolygon1.Add(tmppnt);
798     tmppnt.SetCoord(toppoints1[3*i], toppoints1[3*i+1], toppoints1[3*i+2]);
799     toppolygon1.Add(tmppnt);
800     tmppnt.SetCoord(bottompoints2[3*i], bottompoints2[3*i+1], bottompoints2[3*i+2]);
801     bottompolygon2.Add(tmppnt);
802     tmppnt.SetCoord(toppoints2[3*i], toppoints2[3*i+1], toppoints2[3*i+2]);
803     toppolygon2.Add(tmppnt);
804   }
805   bottompolygon1.Close();
806   DBRep::Set("B1",bottompolygon1.Shape());
807   toppolygon1.Close();
808   DBRep::Set("T1",toppolygon1.Shape());
809   bottompolygon2.Close();
810   DBRep::Set("B2",bottompolygon2.Shape());
811   toppolygon2.Close();
812   DBRep::Set("T2",toppolygon2.Shape());
813   BRepOffsetAPI_ThruSections loft1(Standard_True, Standard_True);
814   loft1.AddWire(bottompolygon1.Wire());
815   loft1.AddWire(toppolygon1.Wire());
816   loft1.Build();
817   BRepOffsetAPI_ThruSections loft2(Standard_True, Standard_True);
818   loft2.AddWire(bottompolygon2.Wire());
819   loft2.AddWire(toppolygon2.Wire());
820   loft2.Build();
821   if (loft1.Shape().IsNull() || loft2.Shape().IsNull())
822     return 1;
823   DBRep::Set("TS1",loft1.Shape());
824   DBRep::Set("TS2",loft2.Shape());
825
826 //#if ! defined(BRepAlgoAPI_def01)
827 //  BRepAlgoAPI_Fuse result(loft1.Shape(), loft2.Shape());
828 //#else
829 //  BRepAlgo_Fuse result(loft1.Shape(), loft2.Shape());
830 //#endif
831   if (IsBRepAlgoAPI) {
832     di << "BRepAlgoAPI_Fuse result(loft1.Shape(), loft2.Shape())\n";
833     BRepAlgoAPI_Fuse result(loft1.Shape(), loft2.Shape());
834     DBRep::Set("F",result.Shape());
835   } else {
836     di << "BRepAlgo_Fuse result(loft1.Shape(), loft2.Shape())\n";
837     BRepAlgo_Fuse result(loft1.Shape(), loft2.Shape());
838     DBRep::Set("F",result.Shape());
839   }
840
841 //  DBRep::Set("F",result.Shape());
842   return 0;
843 }
844
845 #include <Geom_RectangularTrimmedSurface.hxx>
846 #include <GC_MakeTrimmedCone.hxx>
847
848 static Standard_Integer BUC60856(Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** argv )
849 {
850   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
851   if(aContext.IsNull()) { 
852     di << "use 'vinit' command before " << argv[0] << "\n";
853     return -1;
854   }
855
856   gp_Ax2  Cone_Ax;                                                                
857   double R1=8, R2=16;
858   gp_Pnt P0(0,0,0),                                                              
859   P1(0,0,20), P2(0,0,45);                                                        
860   Handle(Geom_RectangularTrimmedSurface) S = GC_MakeTrimmedCone (P1, P2, R1, R2).Value();
861   TopoDS_Shape myshape = BRepBuilderAPI_MakeFace(S, Precision::Confusion()).Shape();
862   Handle(AIS_Shape) ais1 = new AIS_Shape(myshape);
863   aContext->Display (ais1, Standard_False);
864   aContext->SetColor (ais1, Quantity_NOC_BLUE1, Standard_False);
865   
866   Handle(Geom_RectangularTrimmedSurface) S2 = GC_MakeTrimmedCone (P1, P2,R1, 0).Value();
867   TopoDS_Shape myshape2 = BRepBuilderAPI_MakeFace(S2, Precision::Confusion()).Shape();
868   Handle(AIS_Shape) ais2 = new AIS_Shape(myshape2);
869   aContext->Display (ais2, Standard_False);
870   aContext->SetColor (ais2, Quantity_NOC_RED, Standard_False);
871   return 0;
872 }
873
874 //==========================================================================
875 //function : CoordLoad
876 //           chargement d une face dans l explorer.
877 //==========================================================================
878 static Standard_Integer coordload (Draw_Interpretor& theDi,
879                                    Standard_Integer  theArgsNb,
880                                    const char**      theArgVec)
881
882   if (theArgsNb < 3)
883   {
884     return 1;
885   }
886
887   std::ifstream aFile (theArgVec[2], ios::in);
888   if (!aFile)
889   {
890     theDi << "unable to open " << theArgVec[2] << " for input\n";
891     return 2;
892   }
893
894   char aLine[80];
895   memset (aLine, 0, 40);
896   aFile.getline (aLine, 80);
897
898   gp_Pnt aPnt (0.0, 0.0, 0.0);
899   aLine[40] = '\0';
900   aPnt.SetY (Draw::Atof (&aLine[20]));
901   aLine[20] = '\0';
902   aPnt.SetX (Draw::Atof (aLine));
903   TopoDS_Vertex aVert1 = BRepBuilderAPI_MakeVertex (aPnt);
904   BRepBuilderAPI_MakeWire aMakeWire;
905   for (;;)
906   {
907     memset (aLine, 0, 40);
908     aFile.getline (aLine, 80);
909     if (!aFile)
910     {
911       break;
912     }
913
914     aLine[40] = '\0';
915     aPnt.SetY (Draw::Atof (&aLine[20]));
916     aLine[20] = '\0';
917     aPnt.SetX (Draw::Atof (aLine));
918     TopoDS_Vertex aVert2 = BRepBuilderAPI_MakeVertex (aPnt);
919     aMakeWire.Add (BRepBuilderAPI_MakeEdge (aVert1, aVert2));
920     aVert1 = aVert2;
921   }
922   aFile.close();
923
924   if (!aMakeWire.IsDone())
925   {
926     DBRep::Set (theArgVec[1], TopoDS_Face());
927     return 0;
928   }
929
930   BRepBuilderAPI_MakeFace aMakeFace (aMakeWire.Wire());
931   DBRep::Set (theArgVec[1], aMakeFace.IsDone() ? aMakeFace.Face() : TopoDS_Face());
932   return 0;
933 }
934
935 static Standard_Integer TestMem (Draw_Interpretor& /*di*/,
936                                  Standard_Integer /*nb*/, 
937                                  const char ** /*arg*/) 
938 {
939   TCollection_ExtendedString aString(1024*1024, 'A');
940   return 0;
941 }
942
943 static Standard_Integer BUC60876_ (Draw_Interpretor& di,
944                                  Standard_Integer argc, 
945                                  const char ** argv) 
946 {
947   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
948   if(aContext.IsNull()) { 
949     di << "use 'vinit' command before " << argv[0] << "\n";
950     return -1;
951   }     
952   if((argc != 2) && (argc != 3)) {
953     di<< "usage : " << argv[0] << " shape [mode==1]\n";
954     return -1;
955   }
956   TopoDS_Shape aShape = DBRep::Get(argv[1]);
957   Handle(AIS_InteractiveObject) anIO = new AIS_Shape(aShape);
958 //  Handle(AIS_InteractiveObject) anIOa = ViewerTest::GetAISShapeFromName(argv[1]);
959   anIO->SetHilightMode((argc == 3) ? Draw::Atoi(argv[2]) : 1);
960   aContext->Display (anIO, Standard_True);
961   return 0;
962 }
963
964 //=======================================================================
965 //function : buc60773
966 //purpose  : 
967 //=======================================================================
968
969 #include<TCollection_HAsciiString.hxx>
970
971 static Standard_Integer BUC60773 (Draw_Interpretor& /*di*/, Standard_Integer /*n*/, const char ** /*a*/)
972 {
973   Handle(TCollection_HAsciiString) hAscii = new TCollection_HAsciiString();
974   Standard_CString aStr = hAscii->ToCString();
975   TCollection_AsciiString aAscii(aStr);  
976   
977   return 0;
978 }
979
980 #include<BRepPrimAPI_MakeCylinder.hxx>
981 #include<BRepPrimAPI_MakeCone.hxx>
982
983 static int TestCMD(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
984
985 {
986   if(argc > 2) {
987     di << "Usage : " << argv[0] << " [BRepAlgoAPI/BRepAlgo = 1/0]\n";
988     return 1;
989   }
990   Standard_Boolean IsBRepAlgoAPI = Standard_True;
991   if (argc == 2) {
992     Standard_Integer IsB = Draw::Atoi(argv[1]);
993     if (IsB != 1) {
994       IsBRepAlgoAPI = Standard_False;
995 #if ! defined(BRepAlgo_def01)
996 //      di << "Error: There is not BRepAlgo_Fuse class\n";
997 //      return 1;
998 #endif
999     }
1000   }
1001
1002   //Cylindre 36.085182 20.0 8.431413 88.04671 20.0 38.931416 10.0
1003
1004   Standard_Real x11 = 36.085182;
1005   Standard_Real y11 = 20.0;
1006   Standard_Real z11 = 8.431413;
1007   Standard_Real x12 = 88.04671;
1008   Standard_Real y12 = 20.0;
1009   Standard_Real z12 = 38.931416;
1010   Standard_Real radius = 10.0;
1011
1012   gp_Pnt base1(x11, y11, z11);
1013   gp_Dir vect1(x12-x11, y12-y11, z12-z11);
1014   gp_Ax2 axis1(base1, vect1);
1015   Standard_Real height1 = sqrt( ((x12-x11)*(x12-x11)) + ((y12-y11)*(y12-y11)) + ((z12-z11)*(z12-z11)) );
1016   BRepPrimAPI_MakeCylinder cylinder(axis1, radius, height1);
1017
1018   TopoDS_Shape SCyl = cylinder.Shape();
1019   DBRep::Set("cyl", SCyl);
1020
1021    
1022   //Cone 70.7262 20.0 28.431412 105.36722 20.0 48.431416 6.0 3.0
1023   Standard_Real x21 = 70.7262;
1024   Standard_Real y21 = 20.0;
1025   Standard_Real z21 = 28.431412;
1026   Standard_Real x22 = 105.36722;
1027   Standard_Real y22 = 20.0;
1028   Standard_Real z22 = 48.431416;
1029   Standard_Real radius1 = 6.0;
1030   Standard_Real radius2 = 3.0;
1031
1032   gp_Pnt base2(x21, y21, z21);
1033   gp_Dir vect2(x22-x21, y22-y21, z22-z21);
1034   gp_Ax2 axis2(base2, vect2);
1035   Standard_Real height2 = sqrt( ((x22-x21)*(x22-x21)) + ((y22-y21)*(y22-y21)) + ((z22-z21)*(z22-z21)) );
1036   BRepPrimAPI_MakeCone cone(axis2, radius1, radius2, height2);
1037
1038   TopoDS_Shape SCon = cone.Shape();
1039   DBRep::Set("con", SCon);
1040
1041 //#if ! defined(BRepAlgoAPI_def01)
1042 //  BRepAlgoAPI_Fuse SFuse(SCyl, SCon);
1043 //#else
1044 //  BRepAlgo_Fuse SFuse(SCyl, SCon);
1045 //#endif
1046 //
1047 //  if(! SFuse.IsDone() )
1048 //    cout<<"Error: Boolean fuse operation failed !"<<endl;
1049 //
1050 //  TopoDS_Shape fuse = SFuse.Shape();
1051
1052   TopoDS_Shape fuse;
1053   if (IsBRepAlgoAPI) {
1054     di << "BRepAlgoAPI_Fuse SFuse(SCyl, SCon)\n";
1055     BRepAlgoAPI_Fuse SFuse(SCyl, SCon);
1056     if(! SFuse.IsDone() )
1057       di<<"Error: Boolean fuse operation failed !\n";
1058     fuse = SFuse.Shape();
1059   } else {
1060     di << "BRepAlgo_Fuse SFuse(SCyl, SCon)\n";
1061     BRepAlgo_Fuse SFuse(SCyl, SCon);
1062     if(! SFuse.IsDone() )
1063       di<<"Error: Boolean fuse operation failed !\n";
1064     fuse = SFuse.Shape();
1065   }
1066
1067   DBRep::Set("fus", fuse);
1068         
1069   return 0;
1070 }
1071
1072 #include <NCollection_DataMap.hxx>
1073 #include <TColStd_HSequenceOfAsciiString.hxx>
1074 #include <TopExp.hxx>
1075 #include <TopoDS_Iterator.hxx>
1076
1077 //---------------------------------------------------------------------------------------
1078
1079 static Standard_Integer statface (Draw_Interpretor& di,Standard_Integer /*argc*/, const char ** argv )
1080
1081 {  
1082   TopoDS_Shape aShape = DBRep::Get(argv[1]);
1083   if(aShape.IsNull())
1084   {
1085     di<<"Invalid input shape\n";
1086     return 1;
1087   }
1088   NCollection_DataMap<TCollection_AsciiString, Standard_Integer> aMap;
1089   Handle(TColStd_HSequenceOfAsciiString) aSequence = new TColStd_HSequenceOfAsciiString;
1090   Standard_CString aString;
1091   Standard_Integer l=0;
1092   TopExp_Explorer expl;
1093   Standard_Real f3d,l3d;
1094   for(expl.Init(aShape,TopAbs_FACE);expl.More();expl.Next())
1095   {
1096     // SURFACES
1097     TopoDS_Face aFace = TopoDS::Face (expl.Current());
1098     Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace);
1099     aString = aSurface->DynamicType()->Name();
1100
1101     if (aMap.IsBound(aString))
1102       aMap.ChangeFind(aString)++;
1103     else {
1104       aMap.Bind(aString, 1);
1105       aSequence->Append(aString);
1106     }
1107   }
1108   // PCURVES
1109   for(expl.Init(aShape,TopAbs_FACE);expl.More();expl.Next())
1110   {
1111     TopoDS_Face aFace = TopoDS::Face (expl.Current());
1112     TopoDS_Iterator anIt(aFace);
1113     TopoDS_Wire aWire = TopoDS::Wire (anIt.Value());
1114     TopoDS_Iterator it (aWire); 
1115     for (; it.More(); it.Next()) {
1116       TopoDS_Edge Edge = TopoDS::Edge (it.Value());
1117       Handle(Geom2d_Curve) aCurve2d = BRep_Tool::CurveOnSurface(Edge,aFace,f3d,l3d);
1118       aString = aCurve2d->DynamicType()->Name();
1119       if(aMap.IsBound(aString))
1120         aMap.ChangeFind(aString)++;
1121       else  {
1122         aMap.Bind(aString, 1);
1123         aSequence->Append(aString);
1124       }
1125     }
1126   }
1127   // 3d CURVES
1128   TopExp_Explorer exp;
1129   for (exp.Init(aShape,TopAbs_EDGE); exp.More(); exp.Next()) 
1130   {
1131     TopoDS_Edge Edge = TopoDS::Edge (exp.Current());
1132     Handle(Geom_Curve) aCurve3d = BRep_Tool::Curve (Edge,f3d,l3d);
1133     if(aCurve3d.IsNull())
1134     {
1135       l++;
1136     } else {
1137       aString = aCurve3d->DynamicType()->Name();
1138       if (aMap.IsBound(aString))
1139       {
1140         aMap.ChangeFind(aString)++;
1141       } else {
1142         aMap.Bind(aString, 1);
1143         aSequence->Append(aString);
1144       }
1145     }
1146   }
1147   // Output 
1148   di<<"\n";
1149
1150   for (Standard_Integer i = 1; i <= aSequence->Length(); i++) {
1151     di << aMap.Find(aSequence->Value(i)) << "   --   " << aSequence->Value(i).ToCString() << "\n";
1152   }
1153
1154   di<<"\n";
1155   di<<"Degenerated edges :\n";
1156   di<<l<<"   --    Degenerated edges \n";
1157
1158   return 0;
1159
1160 }
1161
1162 #include <BRepBuilderAPI_Transform.hxx>
1163
1164 static Standard_Integer BUC60841(Draw_Interpretor& di, Standard_Integer argc, const char ** argv )
1165 {
1166   if(argc > 2) {
1167     di << "Usage : " << argv[0] << " [BRepAlgoAPI/BRepAlgo = 1/0]\n";
1168     return 1;
1169   }
1170   Standard_Boolean IsBRepAlgoAPI = Standard_True;
1171   if (argc == 2) {
1172     Standard_Integer IsB = Draw::Atoi(argv[1]);
1173     if (IsB != 1) {
1174       IsBRepAlgoAPI = Standard_False;
1175 #if ! defined(BRepAlgo_def01)
1176 //      di << "Error: There is not BRepAlgo_Fuse class\n";
1177 //      return 1;
1178 #endif
1179     }
1180   }
1181
1182   gp_Ax2 Ax2 = gp_Ax2(gp_Pnt(0, 621, 78), gp_Dir(0, 1,0));
1183   BRepPrimAPI_MakeCylinder cyl(Ax2, 260, 150);
1184   //BRepPrimAPI_MakeCylinder cyl(gp_Ax2(gp_Pnt(0, 621, 78), gp_Dir(0, 1,0)), 260, 150);
1185
1186   TopoDS_Shape sh1 = cyl.Shape();
1187   DBRep::Set("sh1",sh1);
1188   gp_Trsf trsf1, trsf2;
1189   trsf1.SetTranslation(gp_Pnt(0.000000,700.000000,-170.000000),
1190                        gp_Pnt(0.000000,700.000000,-95.000000));
1191   trsf2.SetRotation(gp_Ax1(gp_Pnt(0.000000,700.000000,-170.000000),
1192                            gp_Dir(0.000000,0.000000,1.000000)), 0.436111);
1193   BRepBuilderAPI_Transform trans1(sh1, trsf1);
1194   TopoDS_Shape sh2 = trans1.Shape();
1195   DBRep::Set("sh2",sh2);
1196
1197 //#if ! defined(BRepAlgoAPI_def01)
1198 //  BRepAlgoAPI_Fuse fuse1(sh1, sh2);
1199 //#else
1200 //  BRepAlgo_Fuse fuse1(sh1, sh2);
1201 //#endif
1202 //
1203 //  TopoDS_Shape fsh1 = fuse1.Shape();
1204
1205   TopoDS_Shape fsh1;
1206   if (IsBRepAlgoAPI) {
1207     di << "BRepAlgoAPI_Fuse fuse1(sh1, sh2)\n";
1208     BRepAlgoAPI_Fuse fuse1(sh1, sh2);
1209     fsh1 = fuse1.Shape();
1210   } else {
1211     di << "BRepAlgo_Fuse fuse1(sh1, sh2)\n";
1212     BRepAlgo_Fuse fuse1(sh1, sh2);
1213     fsh1 = fuse1.Shape();
1214   }
1215
1216   DBRep::Set("fsh1",fsh1);
1217   BRepBuilderAPI_Transform trans2(fsh1, trsf2);
1218   TopoDS_Shape sh3 = trans2.Shape();
1219   DBRep::Set("sh3",sh3);
1220
1221 //#if ! defined(BRepAlgoAPI_def01)
1222 //  BRepAlgoAPI_Fuse fuse2(fsh1,sh3);
1223 //#else
1224 //  BRepAlgo_Fuse fuse2(fsh1,sh3);
1225 //#endif
1226 //
1227 //  TopoDS_Shape fsh2 = fuse2.Shape();
1228
1229   TopoDS_Shape fsh2;
1230   if (IsBRepAlgoAPI) {
1231     di << "BRepAlgoAPI_Fuse fuse2(fsh1,sh3)\n";
1232     BRepAlgoAPI_Fuse fuse2(fsh1,sh3);
1233     fsh2 = fuse2.Shape();
1234   } else {
1235     di << "BRepAlgo_Fuse fuse2(fsh1,sh3)\n";
1236     BRepAlgo_Fuse fuse2(fsh1,sh3);
1237     fsh2 = fuse2.Shape();
1238   }
1239
1240   DBRep::Set("fsh2",fsh2);
1241   Handle(AIS_Shape) aisp1 = new AIS_Shape(fsh2);
1242 //  aContext->Display(aisp1);
1243   return 0;
1244 }
1245
1246 #include <ShapeBuild_Edge.hxx>
1247
1248 static Standard_Integer BUC60874(Draw_Interpretor& /*di*/, Standard_Integer /*argc*/, const char ** argv )
1249 {
1250   TopoDS_Edge e = TopoDS::Edge(DBRep::Get(argv[1],TopAbs_EDGE));
1251   ShapeBuild_Edge().BuildCurve3d(e);
1252   DBRep::Set("ED",e);
1253   return 0;
1254 }
1255
1256
1257 #include<TDF_Label.hxx>
1258 #include<TDataStd_TreeNode.hxx>
1259
1260 #include<DDocStd.hxx>
1261
1262 #include<DDF.hxx>
1263
1264 #include<TDocStd_Modified.hxx>
1265 #include<TDF_ListIteratorOfDeltaList.hxx>
1266 #include<TDocStd_Document.hxx>
1267 #include<TDocStd_Application.hxx>
1268 #include<TDF_Delta.hxx>
1269 #include<TDataXtd_Constraint.hxx>
1270 #include<TPrsStd_AISPresentation.hxx>
1271 #include<TPrsStd_AISViewer.hxx>
1272 #include<TNaming_Builder.hxx>
1273 #include<TNaming_Naming.hxx>
1274 #include<TNaming_NamedShape.hxx>
1275   
1276 static int BUC60817(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1277   if(argc!=2) {
1278     di << "Usage : " << argv[0] << " D\n";
1279     di<<1;
1280     return 0;
1281   }
1282
1283   Handle(TDF_Data) DF;
1284   if (!DDF::GetDF(argv[1],DF)) {di<<2;return 0;}
1285   
1286   TDF_Label L1,L2;
1287   Handle(TDataStd_TreeNode) TN1,TN2;
1288
1289   DDF::AddLabel(DF,"0:2",L1);
1290   TN1 = TDataStd_TreeNode::Set(L1);
1291
1292   DDF::AddLabel(DF,"0:3",L2);
1293   TN2 = TDataStd_TreeNode::Set(L2);
1294
1295   TN1->Append(TN2);
1296   if(!(TN2->IsDescendant(TN1))) {di<<3;return 0;}
1297   if((TN1->IsDescendant(TN2))) {di<<4;return 0;}
1298
1299   di<<0;
1300   return 0;
1301 }
1302
1303 static int BUC60831_1(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1304   if(argc!=2) {
1305     di << "Usage : " << argv[0] << " D\n";
1306     di<<-1;
1307     return 0;
1308   }
1309
1310   Handle(TDF_Data) DF;
1311   if (!DDF::GetDF(argv[1],DF)) {di<<-2;return 0;}
1312   
1313   TDF_Label L;
1314   DDF::FindLabel(DF,"0:1",L,Standard_False);
1315   Handle(TDocStd_Modified) MDF;
1316   if (!L.Root().FindAttribute (TDocStd_Modified::GetID(), MDF)) {
1317     MDF = new TDocStd_Modified();
1318     L.Root().AddAttribute(MDF);
1319   }
1320
1321   di<<!MDF->IsEmpty();
1322   return 0;
1323 }
1324
1325 static int BUC60831_2(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1326   if(argc!=3) {
1327     di << "Usage : " << argv[0] << " D Label\n";
1328     di<<1;
1329     return 0;
1330   }
1331
1332   Handle(TDF_Data) DF;
1333   if (!DDF::GetDF(argv[1],DF)) {di<<2;return 0;}
1334   
1335   TDF_Label L;
1336   DDF::FindLabel(DF,argv[2],L,Standard_False);
1337
1338   TDocStd_Modified::Add(L);
1339   
1340   di<<0;
1341   return 0;
1342 }
1343
1344 static int BUC60836(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1345   if(argc!=2) {
1346     di << "Usage : " << argv[0] << " D\n";
1347     di<<1;
1348     return 0;
1349   }
1350
1351
1352   Handle(TDF_Data) aDF;
1353   if (!DDF::GetDF(argv[1],aDF)) {di<<2;return 0;}
1354
1355   Handle(TDocStd_Document) aDocument;
1356   if (!DDocStd::GetDocument(argv[1], aDocument)) {di<<3;return 0;}
1357    
1358   TDF_Label L;
1359   Handle(TDataStd_TreeNode) TN;
1360
1361   aDocument->NewCommand();
1362   DDF::AddLabel(aDF,"0:2",L);
1363   TN = TDataStd_TreeNode::Set(L);
1364
1365   aDocument->NewCommand();
1366   DDF::AddLabel(aDF,"0:3",L);
1367   TN = TDataStd_TreeNode::Set(L);
1368
1369   aDocument->NewCommand();
1370   DDF::AddLabel(aDF,"0:4",L);
1371   TN = TDataStd_TreeNode::Set(L);
1372   aDocument->NewCommand();
1373
1374   TDF_DeltaList Us,Rs;
1375   Us = aDocument->GetUndos();
1376   Rs = aDocument->GetUndos();
1377
1378   Standard_Integer i;
1379   char Names[10][5]={"n1","n2","n3","n4","n5","n6","n7","n8","n9","n10"};  
1380
1381   TDF_ListIteratorOfDeltaList IDL;
1382   for(IDL.Initialize(Us),i=1;IDL.More();IDL.Next(),i++){
1383     Handle(TDF_Delta) D = IDL.Value();
1384     TCollection_ExtendedString S(Names[i-1]);
1385     D->SetName(S);
1386 //    cout<<" U"<<i<<"="<<D->Name()<<endl;
1387   }
1388   
1389   aDocument->Undo();
1390   aDocument->Undo();
1391   
1392   Us = aDocument->GetUndos();
1393   Rs = aDocument->GetRedos();
1394
1395   for(IDL.Initialize(Us),i=1;IDL.More();IDL.Next(),i++){
1396     Handle(TDF_Delta) D = IDL.Value();
1397 //    cout<<" U"<<i<<"="<<D->Name()<<endl;
1398   }
1399
1400   TCollection_ExtendedString n2name ("n2");
1401   for(IDL.Initialize(Rs),i=1;IDL.More();IDL.Next(),i++){
1402     Handle(TDF_Delta) D = IDL.Value();
1403     if ( i == 1 && ! D->Name().IsEqual (n2name) ) 
1404     {
1405       di << 4;
1406       return 0;
1407    }
1408   }
1409
1410   di<<0;
1411   return 0;
1412 }
1413
1414 static int BUC60847(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1415   if(argc!=3) {
1416     di << "Usage : " << argv[0] << " D Shape\n";
1417     di<<1;
1418     return 0;
1419   }
1420
1421   Handle(TDF_Data) aDF;
1422   if (!DDF::GetDF(argv[1],aDF)) {di<<2;return 0;}
1423   
1424   TopoDS_Shape s = DBRep::Get(argv[2]);
1425   if (s.IsNull()) { di <<"shape not found\n"; di<<3;return 0;}
1426   TDF_Label L;
1427   DDF::AddLabel(aDF, "0:2", L);
1428   TNaming_Builder SI (L);
1429   SI.Generated(s);
1430
1431   Handle(TNaming_NamedShape) NS = new TNaming_NamedShape;
1432
1433   TNaming_Naming aNN;
1434   NS=aNN.Name(L,s,s);
1435 //  if (!NS->IsEmpty()) {di<<3;return 0;}
1436   if (NS->IsEmpty()) {di<<4;return 0;}
1437   di<<0;
1438   return 0;
1439 }
1440
1441 static int BUC60862(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1442   if(argc!=3) {
1443     di << "Usage : " << argv[0] << " D Shape\n";
1444     di<<1;
1445     return 0;
1446   }
1447
1448   Handle(TDF_Data) aDF;
1449   if (!DDF::GetDF(argv[1],aDF)) {di<<2;return 0;}
1450   
1451   TopoDS_Shape s = DBRep::Get(argv[2]);
1452   if (s.IsNull()) { di <<"shape not found\n"; di<<3;return 0;}
1453   TDF_Label L;
1454   DDF::AddLabel(aDF, "0:2", L);
1455   TNaming_Builder SI (L);
1456   SI.Generated(s);
1457
1458   Handle(TNaming_NamedShape) NS = new TNaming_NamedShape;
1459
1460   TNaming_Naming aNN;
1461   NS=aNN.Name(L,s,s);
1462   if (NS->IsEmpty()) {di<<4;return 0;}
1463   di<<0;
1464   return 0;
1465 }
1466
1467 static int BUC60867(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1468   if (argc == 2) {
1469     TCollection_ExtendedString path (argv[1]); 
1470     Handle(TDocStd_Application) A = DDocStd::GetApplication();
1471     Handle(TDocStd_Document) D;
1472     Standard_Integer insession = A->IsInSession(path);
1473     if (insession > 0) {  
1474       di <<"document " << insession << "  is already in session\n";
1475       di<<2;
1476       return 0;
1477     }
1478     PCDM_ReaderStatus Result = A->Open(path,D);
1479     if(Result==PCDM_RS_OK){
1480       di<<0;
1481       return 0; 
1482     }
1483   }
1484   di<<3;
1485   return 0;
1486 }
1487
1488 static int BUC60910(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1489   if(argc!=2) {
1490     di << "Usage : " << argv[0] << " D\n";
1491     di<<1;
1492     return 0;
1493   }
1494
1495   Handle(TDF_Data) aDF;
1496   if (!DDF::GetDF(argv[1],aDF)) {di<<2;return 0;}
1497   
1498   TDF_Label L;
1499   DDF::AddLabel(aDF, "0:2", L);
1500  
1501   Handle(TPrsStd_AISPresentation) AISP = 
1502     TPrsStd_AISPresentation::Set(L,TDataXtd_Constraint::GetID());
1503
1504   if (AISP->HasOwnMode()) {di<<3;return 0;}
1505   AISP->SetMode(3);
1506   Standard_Integer Mode = AISP->Mode();
1507   if (Mode!=3) {di<<4;return 0;}
1508   if (!AISP->HasOwnMode()) {di<<5;return 0;}
1509   AISP->UnsetMode();
1510   if (AISP->HasOwnMode()) {di<<6;return 0;}
1511   di<<0;
1512   return 0;
1513 }
1514
1515 static int BUC60925(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1516   if(argc!=2) {
1517     di << "Usage : " << argv[0] << " D\n";
1518     di<<1;
1519     return 0;
1520   }
1521
1522   Handle(TDF_Data) aDF;
1523   if (!DDF::GetDF(argv[1],aDF)) {di<<2;return 0;}
1524   
1525   TDF_Label L;
1526   DDF::AddLabel(aDF, "0:2", L);
1527   TDF_LabelMap LM;
1528   LM.Add(L);
1529   
1530   Handle(TNaming_NamedShape) NS = new TNaming_NamedShape;
1531 //  Handle(TNaming_Name) NN = new TNaming_Name;
1532   TNaming_Name NN;
1533
1534   NN.Type(TNaming_IDENTITY);
1535   NN.Append(NS);
1536   Standard_Boolean Res = NN.Solve(L,LM);
1537   
1538   if (Res!=Standard_False) {di<<3;return 0;}
1539   di<<0;
1540   return 0;
1541 }
1542
1543 static int BUC60932(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1544   if(argc!=2) {
1545     di << "Usage : " << argv[0] << " D\n";
1546     di<<1;
1547     return 0;
1548   }
1549
1550
1551   Handle(TDocStd_Document) aDocument;
1552   if (!DDocStd::GetDocument(argv[1], aDocument)) {di<<2;return 0;}
1553    
1554   if(!aDocument->InitDeltaCompaction()) {di<<3;return 0;}
1555   if(!aDocument->PerformDeltaCompaction()) {di<<4;return 0;}
1556
1557   di<<0;
1558   return 0;
1559 }
1560
1561 //=======================================================================
1562 //function : AISWidth
1563 //purpose  : AISWidth (DOC,entry,[width])
1564 // abv: testing command for checking bug BUC60917 in TPrsStd_AISPresentation
1565 //=======================================================================
1566
1567 static int AISWidth(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) {
1568
1569   if (argc >= 3) {     
1570     Handle(TDocStd_Document) D;
1571     if (!DDocStd::GetDocument(argv[1],D)) {di<<(-1);return 0;}
1572     TDF_Label L;
1573     if (!DDF::FindLabel(D->GetData(),argv[2],L)) {di<<(-2);return 0;}
1574
1575     Handle(TPrsStd_AISViewer) viewer;
1576     if( !TPrsStd_AISViewer::Find(L, viewer) ) {di<<(-3);return 0;}
1577
1578     Handle(TPrsStd_AISPresentation) prs;
1579     if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) {   
1580       if( argc == 4 ) {
1581         prs->SetWidth(Draw::Atof(argv[3]));
1582         TPrsStd_AISViewer::Update(L);
1583       }
1584       else {
1585        if (prs->HasOwnWidth()){ 
1586 //         cout << "Width = " << prs->Width() << endl;
1587          di<<prs->Width();
1588        }
1589        else{
1590          di << "AISWidth: Warning : Width wasn't set\n";
1591          di<<(-4);
1592        }
1593       }
1594       return 0;
1595     }
1596   }
1597   di << "AISWidth : Error"   << "\n";
1598   di<<(-5);
1599   return 0;
1600 }
1601
1602 //=======================================================================
1603 //function : BUC60921 ( & BUC60954 )
1604 //purpose  : Test memory allocation of OCAF in Undo/Redo operations
1605 //=======================================================================
1606
1607 static Standard_Integer BUC60921 (Draw_Interpretor& di,
1608                                   Standard_Integer nb, 
1609                                   const char ** arg) 
1610 {
1611   if (nb >= 4) {     
1612     Handle(TDocStd_Document) D;
1613     if (!DDocStd::GetDocument(arg[1],D)) {di<<1;return 0;}
1614     TDF_Label L;
1615     DDF::AddLabel(D->GetData(),arg[2],L);
1616
1617     BRep_Builder B;
1618     TopoDS_Shape S;
1619     BRepTools::Read ( S, arg[3], B );
1620     
1621     TNaming_Builder tnBuild(L);
1622     tnBuild.Generated(S);
1623 //    di << "File " << arg[3] << " added";
1624     di<<0;
1625     return 0;
1626   }
1627   di << "BUC60921 Doc label brep_file: directly read brep file and put shape to the label"   << "\n";
1628   di<<2;
1629   return 0;
1630 }
1631
1632 #include<IGESControl_Reader.hxx>
1633 #include<BRepPrimAPI_MakeHalfSpace.hxx>
1634
1635 static Standard_Integer BUC60951_(Draw_Interpretor& di, Standard_Integer argc, const char ** a)
1636 {
1637   //if(argc!=2)
1638   //  {
1639   //    cerr << "Usage : " << a[0] << " file.igs" << endl;
1640   //    return -1;
1641   //  }
1642   if(argc < 2 || argc > 3) {
1643     di << "Usage : " << a[0] << " [BRepAlgoAPI/BRepAlgo = 1/0]\n";
1644     return 1;
1645   }
1646   Standard_Boolean IsBRepAlgoAPI = Standard_True;
1647   if (argc == 3) {
1648     Standard_Integer IsB = Draw::Atoi(a[2]);
1649     if (IsB != 1) {
1650       IsBRepAlgoAPI = Standard_False;
1651 #if ! defined(BRepAlgo_def01)
1652 //      di << "Error: There is not BRepAlgo_Fuse class\n";
1653 //      return 1;
1654 #endif
1655     }
1656   }
1657   
1658   Handle(AIS_InteractiveContext) myContext = ViewerTest::GetAISContext(); 
1659
1660   if(myContext.IsNull()) {
1661     di << "use 'vinit' command before " << a[0] << "\n";
1662     return -1;
1663   }
1664
1665 //  IGESControlStd_Reader reader;
1666   IGESControl_Reader reader;
1667   reader.ReadFile(a[1]);
1668   reader.TransferRoots();
1669   TopoDS_Shape shape = reader.OneShape();
1670   printf("\n iges1 shape type = %d", shape.ShapeType() );
1671   TopTools_IndexedMapOfShape list;
1672   TopExp::MapShapes(shape, TopAbs_FACE, list);
1673   printf("\n No. of faces = %d", list.Extent());
1674
1675   TopoDS_Shell shell;
1676   BRep_Builder builder;
1677   builder.MakeShell(shell);
1678   for(int i=1;i<=list.Extent(); i++) { 
1679     TopoDS_Face face = TopoDS::Face(list.FindKey(i));
1680     builder.Add(shell, face);
1681   }
1682   shell.Closed (BRep_Tool::IsClosed (shell));
1683
1684   BRepPrimAPI_MakeHalfSpace half(shell, gp_Pnt(0, 0, 20));
1685   TopoDS_Solid sol = half.Solid();
1686   gp_Ax2 anAx2(gp_Pnt(-800.0, 0.0, 0), gp_Dir(0, 0, -1));
1687   BRepPrimAPI_MakeCylinder cyl(anAx2, 50, 300);
1688   TopoDS_Shape sh = cyl.Shape();
1689
1690 //#if ! defined(BRepAlgoAPI_def01)
1691 //  BRepAlgoAPI_Fuse fuse(sol, sh);
1692 //#else
1693 //  BRepAlgo_Fuse fuse(sol, sh);
1694 //#endif
1695 //
1696 //  sh = fuse.Shape();
1697
1698   if (IsBRepAlgoAPI) {
1699     di << "BRepAlgoAPI_Fuse fuse(sol, sh)\n";
1700     BRepAlgoAPI_Fuse fuse(sol, sh);
1701     sh = fuse.Shape();
1702   } else {
1703     di << "BRepAlgo_Fuse fuse(sol, sh)\n";
1704     BRepAlgo_Fuse fuse(sol, sh);
1705     sh = fuse.Shape();
1706   }
1707
1708   Handle(AIS_Shape) res = new AIS_Shape(sh);
1709   myContext->Display (res, Standard_True);
1710   return 0;
1711 }
1712
1713 void QABugs::Commands_3(Draw_Interpretor& theCommands) {
1714   const char *group = "QABugs";
1715
1716   theCommands.Add("BUC60623","BUC60623 result Shape1 Shape2",__FILE__,BUC60623,group);
1717   theCommands.Add("BUC60569","BUC60569 shape",__FILE__,BUC60569,group);
1718   theCommands.Add("BUC60614","BUC60614 shape",__FILE__,BUC60614,group);
1719   theCommands.Add("BUC60609","BUC60609 shape name [U V]",__FILE__,BUC60609,group);
1720   theCommands.Add("BUC60632","BUC60632 mode length",__FILE__,BUC60632,group);
1721   theCommands.Add("BUC60652","BUC60652 face",__FILE__,BUC60652,group);
1722   theCommands.Add("ksection","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d",__FILE__,ksection,group);
1723   theCommands.Add("BUC60682","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d",__FILE__,ksection,group);  
1724   theCommands.Add("BUC60669","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d",__FILE__,ksection,group);  
1725   theCommands.Add("PRO19626","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d",__FILE__,ksection,group);  
1726   theCommands.Add("BUC60574","BUC60574 ",__FILE__,BUC60574,group);
1727
1728   theCommands.Add("GER61351","GER61351 name/object name/r g b/object r g b",__FILE__,setcolor,group);
1729   theCommands.Add("setcolor","setcolor name/object name/r g b/object r g b",__FILE__,setcolor,group);
1730
1731   theCommands.Add("BUC60729","BUC60729",__FILE__,BUC60729,group);
1732   theCommands.Add("BUC60724","BUC60724",__FILE__,BUC60724,group);
1733   theCommands.Add("BUC60727","BUC60727",__FILE__,BUC60727,group);
1734   theCommands.Add("BUC60792","BUC60792",__FILE__,BUC60792,group);
1735   theCommands.Add("BUC60811","BUC60811",__FILE__,BUC60811,group);
1736
1737   theCommands.Add("BUC60825","BUC60825",__FILE__,BUC60825,group);
1738
1739   theCommands.Add("OCC10006","OCC10006 [BRepAlgoAPI/BRepAlgo = 1/0]",__FILE__,OCC10006,group);
1740
1741   theCommands.Add("BUC60856","BUC60856",__FILE__,BUC60856,group);
1742
1743   theCommands.Add("coordload","load coord from file",__FILE__,coordload);
1744
1745   theCommands.Add("TestMem","TestMem",__FILE__,TestMem,group);
1746   theCommands.Add("BUC60945","BUC60945",__FILE__,TestMem,group);
1747   theCommands.Add("BUC60876","BUC60876 shape",__FILE__,BUC60876_,group); 
1748   theCommands.Add("BUC60773","BUC60773",__FILE__,BUC60773,group); 
1749
1750   theCommands.Add("TestCMD","TestCMD [BRepAlgoAPI/BRepAlgo = 1/0]",__FILE__,TestCMD,group);
1751
1752   theCommands.Add("statface","statface face",__FILE__,statface,group);
1753
1754   theCommands.Add("BUC60841","BUC60841 [BRepAlgoAPI/BRepAlgo = 1/0]",__FILE__,BUC60841,group);
1755
1756   theCommands.Add("BUC60874","BUC60874",__FILE__,BUC60874,group);
1757
1758   theCommands.Add("BUC60817","BUC60817 D",__FILE__,BUC60817,group);
1759   theCommands.Add("BUC60831_1","BUC60831_1 D",__FILE__,BUC60831_1,group);
1760   theCommands.Add("BUC60831_2","BUC60831_2 D Label",__FILE__,BUC60831_2,group);
1761   theCommands.Add("BUC60836","BUC60836 D",__FILE__,BUC60836,group);
1762   theCommands.Add("BUC60847","BUC60847 D Shape",__FILE__,BUC60847,group);
1763   theCommands.Add("BUC60862","BUC60862 D Shape",__FILE__,BUC60862,group);
1764   theCommands.Add("BUC60867","BUC60867",__FILE__,BUC60867,group);
1765   theCommands.Add("BUC60910","BUC60910 D",__FILE__,BUC60910,group);
1766   theCommands.Add("BUC60925","BUC60925 D",__FILE__,BUC60925,group);
1767   theCommands.Add("BUC60932","BUC60932 D",__FILE__,BUC60932,group);
1768   theCommands.Add("AISWidth","AISWidth (DOC,entry,[width])",__FILE__,AISWidth,group);
1769   theCommands.Add("BUC60921","BUC60921 Doc label brep_file",__FILE__,BUC60921,group);
1770
1771   theCommands.Add("BUC60951","BUC60951 file.igs [BRepAlgoAPI/BRepAlgo = 1/0]",__FILE__,BUC60951_, group );
1772
1773 }