0029528: Visualization, TKOpenGl - allow defining sRGB textures
[occt.git] / src / QABugs / QABugs_17.cxx
1 // Created on: 2002-03-18
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 <ViewerTest_EventManager.hxx>
27 #include <AIS_Shape.hxx>
28 #include <TopoDS_Shape.hxx>
29
30 #include <Geom_Circle.hxx>
31 #include <Geom_Ellipse.hxx>
32 #include <Geom_Plane.hxx>
33 #include <Geom_BSplineSurface.hxx>
34 #include <gp_Pln.hxx>
35 #include <Geom2d_Curve.hxx>
36 #include <GeomAPI.hxx>
37 #include <Geom2dAdaptor_Curve.hxx>
38 #include <Geom2dGcc_QualifiedCurve.hxx>
39 #include <Geom2dGcc_Lin2d2Tan.hxx>
40 #include <Geom2d_Line.hxx>
41 #include <BRepBuilderAPI_MakeEdge.hxx>
42 #include <TopoDS_Edge.hxx>
43 #include <Precision.hxx>
44 #include <Geom2d_Circle.hxx>
45 #include <Geom2dGcc_QCurve.hxx>
46 #include <GccEnt_QualifiedCirc.hxx>
47 #include <Geom2dGcc_Lin2d2TanIter.hxx>
48 #include <BRepBuilderAPI_MakeWire.hxx>
49 #include <TopExp_Explorer.hxx>
50 #include <TopoDS.hxx>
51 #include <TopoDS_Wire.hxx>
52 #include <BRep_Tool.hxx>
53 #include <gp_Circ.hxx>
54 #include <BRepOffsetAPI_MakePipeShell.hxx>
55 #include <AIS_Trihedron.hxx>
56 #include <Geom_Axis2Placement.hxx>
57 #include <V3d_View.hxx>
58 #include <BRepBuilderAPI_MakeVertex.hxx>
59 #include <AIS_LengthDimension.hxx>
60 #include <AIS_RadiusDimension.hxx>
61 #include <BRepPrimAPI_MakeBox.hxx>
62 #include <GeomAdaptor_Surface.hxx>
63 #include <Extrema_ExtPS.hxx>
64 #include <Geom_CartesianPoint.hxx>
65 #include <Geom2d_CartesianPoint.hxx>
66 #include <Geom2dGcc_Circ2d3Tan.hxx>
67 #include <Aspect_Window.hxx>
68
69 #include <TopoDS_Compound.hxx>
70 #include <TopoDS_CompSolid.hxx>
71 #include <StdSelect_ShapeTypeFilter.hxx>
72 #include <Prs3d_Projector.hxx>
73 #include <HLRAlgo_Projector.hxx>
74 #include <Standard_ErrorHandler.hxx>
75 #include <Font_NameOfFont.hxx>
76
77 static Standard_Integer BUC60842 (Draw_Interpretor& di, Standard_Integer /*argc*/,const char ** /*argv*/)
78 {
79   Standard_Character abuf[16];
80   //Standard_Character * abuf = new Standard_Character[16];
81
82   Standard_CString st = abuf;
83
84   Handle(Geom_Circle) cir = new Geom_Circle (gp_Ax2 (gp_Pnt (823.687192, 502.366825, 478.960440), gp_Dir (0.173648, 0.984808, 0.000000), gp_Dir (-0.932169, 0.164367, -0.322560)), 50);
85   Handle(Geom_Ellipse) ell = new Geom_Ellipse (gp_Ax2 (gp_Pnt (1262.224429, 425.040878, 363.609716), gp_Dir (0.173648, 0.984808, 0.000000), gp_Dir (-0.932169, 0.164367, -0.322560)), 150, 100);
86   Handle(Geom_Plane) plne = new Geom_Plane (gp_Ax3 (gp_Ax2 (gp_Pnt (1262.224429, 425.040878, 363.609716), gp_Dir (0.173648, 0.984808, 0.000000), gp_Dir (-0.932169, 0.164367, -0.322560))));
87
88   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
89
90   gp_Pln pln = plne->Pln();
91   Handle(Geom2d_Curve) curve2d = GeomAPI::To2d (ell, pln);
92   Sprintf(abuf,"ell");
93   DrawTrSurf::Set(st,curve2d);
94   if(!aContext.IsNull()) {
95     Handle(AIS_Shape) aisp = 
96       new AIS_Shape (BRepBuilderAPI_MakeEdge(GeomAPI::To3d(curve2d, pln)).Edge());
97     aContext->Display (aisp, Standard_False);
98   }
99
100   Handle(Geom2d_Curve) fromcurve2d = GeomAPI::To2d (cir, pln);
101   Sprintf(abuf,"cil");
102   DrawTrSurf::Set(st,fromcurve2d);
103   if(!aContext.IsNull()) {
104     Handle(AIS_Shape) aisp = 
105       new AIS_Shape (BRepBuilderAPI_MakeEdge(GeomAPI::To3d(fromcurve2d, pln)).Edge());
106     aContext->Display (aisp, Standard_False);
107   }
108
109   Geom2dAdaptor_Curve acur (curve2d), afromcur (fromcurve2d);
110   Geom2dGcc_QualifiedCurve qcur (acur, GccEnt_outside);
111   Geom2dGcc_QualifiedCurve qfromcur (afromcur, GccEnt_outside);
112   Geom2dGcc_Lin2d2Tan lintan (qcur, qfromcur, 0.1, 0.0, 0.0);
113   Standard_Integer i=0;
114   for(i=0;i<lintan.NbSolutions();i++) {
115     Sprintf(abuf,"lintan_%d",i);
116     Handle(Geom2d_Line) glin = new Geom2d_Line(lintan.ThisSolution(i));
117     DrawTrSurf::Set(st,glin);
118     if(!aContext.IsNull()) {
119       Handle(AIS_Shape) aisp = 
120         new AIS_Shape (BRepBuilderAPI_MakeEdge(GeomAPI::To3d(glin, pln)).Edge());
121       aContext->Display (aisp, Standard_False);
122     }
123   }
124   aContext->UpdateCurrentViewer();
125   di << " Is Done = \n" << (Standard_Integer) lintan.IsDone();
126   return 0;
127 }
128
129 static Standard_Integer BUC60843 (Draw_Interpretor& di, Standard_Integer argc,const char ** argv)
130 {
131   if (argc != 4 && argc != 5 && argc != 6 && argc != 7) {
132     di << "Usage : " << argv[0] << "result_shape name_of_circle name_of_curve [ par1 [ tol ] ]\n";
133     return 1;
134   }
135
136   Standard_Real par1 = 0.0, par2 = 0.0;
137   Standard_Real tol  = Precision::Angular();
138   if (argc >= 5)
139     par1 = Draw::Atof(argv[4]);
140   if (argc == 6)
141     par2 = Draw::Atof(argv[5]);
142   if (argc == 7)
143     tol = Draw::Atof(argv[6]);
144   Handle(Geom2d_Curve)  aCur2d1 = DrawTrSurf::GetCurve2d(argv[2]);
145   Handle(Geom2d_Curve)  aCur2d2 = DrawTrSurf::GetCurve2d(argv[3]);
146   if (aCur2d1.IsNull() || aCur2d2.IsNull()) {
147     di << "Faulty : not curves\n";
148     return 1;
149   }
150   Standard_Boolean c1IsCircle = Standard_False;
151   Handle(Geom2d_Circle) aCir2d = Handle(Geom2d_Circle)::DownCast(aCur2d1);
152   if (!aCir2d.IsNull()) {
153     c1IsCircle = Standard_True;
154     if (argc == 6) tol = Draw::Atof(argv[5]);
155   }
156   if(c1IsCircle) {
157     Geom2dAdaptor_Curve acur(aCur2d2);
158     Geom2dGcc_QCurve qcur(acur, GccEnt_unqualified);
159     GccEnt_QualifiedCirc qfromcur(aCir2d->Circ2d(), GccEnt_unqualified);
160     Geom2dGcc_Lin2d2TanIter lintan(qfromcur, qcur , par1, tol); 
161     if (lintan.IsDone()) {
162       gp_Lin2d lin = lintan.ThisSolution(); 
163       Handle(Geom2d_Line) glin = new Geom2d_Line(lin); 
164       DrawTrSurf::Set(argv[1], glin);
165     } else {
166       di << "Faulty : tangent line is not done.\n";
167     }
168   }
169   else {
170     Geom2dAdaptor_Curve acur1(aCur2d1);
171     Geom2dAdaptor_Curve acur2(aCur2d2);
172     Geom2dGcc_QCurve qcur1(acur1, GccEnt_unqualified);
173     Geom2dGcc_QCurve qcur2(acur2, GccEnt_unqualified);
174     Geom2dGcc_Lin2d2TanIter lintan(qcur1, qcur2 , par1, par2, tol); 
175     if (lintan.IsDone()) {
176       gp_Lin2d lin = lintan.ThisSolution(); 
177       Handle(Geom2d_Line) glin = new Geom2d_Line(lin); 
178       DrawTrSurf::Set(argv[1], glin);
179     } else {
180       di << "Faulty : tangent line is not done.\n";
181     }
182   }   
183   return 0;
184 }
185
186 static Standard_Integer BUC60970 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
187 {
188   if(argc!=3)
189   {
190     di << "Usage : " << argv[0] << " shape result\n";
191     return 1;
192   }
193
194   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
195   if(aContext.IsNull()) {
196     di << "use 'vinit' command before " << argv[0] << "\n";
197     return 1;
198   }
199
200   TopoDS_Shape aResult = DBRep::Get(argv[1]);
201
202   BRepBuilderAPI_MakeWire bRepSpineWire; 
203   TopExp_Explorer exp_(aResult, TopAbs_WIRE); 
204
205   Standard_Integer i = 0; 
206   for(;exp_.More();exp_.Next()){     
207     i++; 
208     bRepSpineWire.Add(TopoDS::Wire(exp_.Current())); 
209   } 
210
211   //printf("total no of wires are ............. %d\n", i); 
212   di << "total no of wires are ............. " << i << "\n"; 
213
214   TopoDS_Wire spineWire = bRepSpineWire.Wire(); 
215   aContext->Display (new AIS_Shape(spineWire), Standard_False);
216
217   DBRep::Set("slineW",spineWire);
218
219   TopExp_Explorer spineWireExp(spineWire, TopAbs_EDGE); 
220   Standard_Real first, last; 
221   Handle(Geom_Curve) curl_ = BRep_Tool::Curve(TopoDS::Edge(spineWireExp.Current()), first, last); 
222   gp_Pnt firstPnt; 
223   gp_Vec tanVec; 
224   curl_->D1(first, firstPnt, tanVec); 
225   tanVec.Normalize(); 
226   gp_Dir tanDir(tanVec.X(), tanVec.Y(), tanVec.Z()); 
227   gp_Ax2 gpAx2(firstPnt, tanDir); 
228   gp_Circ gpCirc(gpAx2, 2.5); 
229   BRepBuilderAPI_MakeWire aMWire(BRepBuilderAPI_MakeEdge(new Geom_Circle(gpCirc)).Edge());
230   TopoDS_Wire topoWire(aMWire); 
231   aContext->Display (new AIS_Shape(topoWire), Standard_False);
232
233   DBRep::Set("topoW",topoWire);
234
235   BRepOffsetAPI_MakePipeShell bRepPipe(spineWire);
236   bRepPipe.Add(topoWire); 
237   bRepPipe.Build(); 
238
239   aContext->Display (new AIS_Shape(bRepPipe.Shape()), Standard_True);
240
241   DBRep::Set(argv[2],bRepPipe.Shape());
242
243   return 0;
244 }
245
246 static Standard_Integer BUC60915_1(Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
247 {
248   if (argc > 1) {
249     di<<"Function don't has parameters\n";
250     return 1;
251   }
252
253   if(ViewerTest::GetAISContext().IsNull())
254   {
255     di << "View was not created. Use 'vinit' command before "
256        << argv[0] << "\n";
257     return 1;
258   }
259   Handle(AIS_InteractiveContext) context = ViewerTest::GetAISContext();
260
261   //The following dimesion code has problems regarding arrow_size. The desired effect is not produced.
262   /***************************************/
263   //First view
264   /***************************************/
265   gp_Pnt p1 = gp_Pnt(602.51,50.,0.);
266   gp_Pnt p2 = gp_Pnt(602.51,200.,0.);
267   gp_Pnt p3 = gp_Pnt(102.51,200.,0.);
268   gp_Pnt p4 = gp_Pnt(102.51,170.,0.);
269   gp_Pnt p5 = gp_Pnt(502.51,170.,0.);
270   gp_Pnt p6 = gp_Pnt(502.51,80.,0.);
271   gp_Pnt p7 = gp_Pnt(102.51,80.,0.);
272   gp_Pnt p8 = gp_Pnt(102.51,50.,0.);
273   TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(p1);
274   TopoDS_Vertex V2 = BRepBuilderAPI_MakeVertex(p2);
275   TopoDS_Vertex V3 = BRepBuilderAPI_MakeVertex(p3);
276   TopoDS_Vertex V4 = BRepBuilderAPI_MakeVertex(p4);
277   TopoDS_Vertex V5 = BRepBuilderAPI_MakeVertex(p5);
278   TopoDS_Vertex V6 = BRepBuilderAPI_MakeVertex(p6);
279   TopoDS_Vertex V7 = BRepBuilderAPI_MakeVertex(p7);
280   TopoDS_Vertex V8 = BRepBuilderAPI_MakeVertex(p8);
281   gp_Pnt plnpt(0, 0, 0);
282   gp_Dir plndir(0, 0, 1);
283   Handle(Geom_Plane) pln = new Geom_Plane(plnpt,plndir);
284   Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect();
285   anAspect->MakeArrows3d (Standard_True);
286   anAspect->ArrowAspect()->SetAngle (M_PI/180.0 * 10.0);
287   /***************************************/
288   //dimension "L 502.51"
289   /***************************************/
290   Handle(AIS_LengthDimension) len = new AIS_LengthDimension(V2, V3, pln->Pln());
291   anAspect->ArrowAspect()->SetLength (30.0);
292   len->SetDimensionAspect (anAspect);
293   context->Display (len, Standard_False);
294   /***************************************/
295   //dimension "L 90"
296   /***************************************/
297   Handle(AIS_LengthDimension) len1 = new AIS_LengthDimension(V7, V4, pln->Pln());
298   len1->SetDimensionAspect (anAspect);
299   len1->SetFlyout (30.0);
300   anAspect->ArrowAspect()->SetLength (100.0);
301   context->Display (len1, Standard_False);
302   /***************************************/
303   //dimension "L 150"
304   /***************************************/
305   Handle(AIS_LengthDimension) len2 = new AIS_LengthDimension(V1, V2, pln->Pln());
306   len2->SetDimensionAspect (anAspect);
307   context->Display (len2, Standard_False);
308   /***************************************/
309   //dimension "R 88.58"
310   /***************************************/
311   gp_Circ cir = gp_Circ(gp_Ax2(gp_Pnt(191.09, -88.58, 0), gp_Dir(0, 0, 1)), 88.58);
312   TopoDS_Edge E1 = BRepBuilderAPI_MakeEdge(cir,gp_Pnt(191.09,0,0.),gp_Pnt(191.09,-177.16,0.) );
313   Handle(AIS_RadiusDimension) dim1 = new AIS_RadiusDimension(E1);
314   dim1->SetDimensionAspect (anAspect);
315   context->Display (dim1, Standard_False);
316   /***************************************/
317   //dimension "R 43.80"
318   /***************************************/
319   gp_Circ cir1 = gp_Circ(gp_Ax2(gp_Pnt(191.09, -88.58, 0), gp_Dir(0, 0, 1)), 43.80);
320   TopoDS_Edge E_cir1 = BRepBuilderAPI_MakeEdge(cir1);
321   dim1 = new AIS_RadiusDimension(E_cir1);
322   anAspect->ArrowAspect()->SetLength (60.0);
323   dim1->SetDimensionAspect (anAspect);
324   context->Display (dim1, Standard_False);
325   /***************************************/
326   //dimension "R 17.86"
327   /***************************************/
328   gp_Circ cir2 = gp_Circ(gp_Ax2(gp_Pnt(566.11, -88.58, 0), gp_Dir(0, 0, -1)), 17.86);
329   TopoDS_Edge E_cir2 = BRepBuilderAPI_MakeEdge(cir2);
330   dim1 = new AIS_RadiusDimension(E_cir2);
331   anAspect->ArrowAspect()->SetLength (40.0);
332   dim1->SetDimensionAspect (anAspect);
333   context->Display (dim1, Standard_True);
334
335   return 0;
336 }
337
338 static Standard_Integer  OCC138 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** argv)
339 {
340   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
341   if(aContext.IsNull()) { 
342     di << "use 'vinit' command before " << argv[0] << "\n";
343     return 1;
344   }
345
346   BRepPrimAPI_MakeBox box1(gp_Pnt(0, 0, 0),  gp_Pnt(100, 100, 100));
347   BRepPrimAPI_MakeBox box2(gp_Pnt(120, 120, 120),  gp_Pnt(300, 300,300));
348   BRepPrimAPI_MakeBox box3(gp_Pnt(320, 320, 320),  gp_Pnt(500, 500,500));
349
350   Handle(AIS_InteractiveObject) ais1 = new AIS_Shape(box1.Shape());
351   Handle(AIS_InteractiveObject) ais2 = new AIS_Shape(box2.Shape());
352   Handle(AIS_InteractiveObject) ais3 = new AIS_Shape(box3.Shape());
353
354   aContext->Display (ais1, Standard_False);
355   aContext->Display (ais2, Standard_False);
356   aContext->Display (ais3, Standard_False);
357
358   aContext->AddOrRemoveSelected (ais1, Standard_False);
359   aContext->AddOrRemoveSelected (ais2, Standard_False);
360   aContext->AddOrRemoveSelected (ais3, Standard_False);
361
362   di << "\n No of currents = " << aContext->NbSelected();
363
364   aContext->InitSelected();
365
366   int count = 1;
367   while(aContext->MoreSelected())
368   {
369     di << "\n count is = " << count++;
370     Handle(AIS_InteractiveObject) ais = aContext->SelectedInteractive();
371     aContext->AddOrRemoveSelected (ais, Standard_False);
372     aContext->InitSelected();
373   }
374
375   aContext->UpdateCurrentViewer();
376
377   return 0; 
378 }
379
380 static int geom_get_2Dpt_from_3Dpt(const gp_Pnt& pnt3d, const gp_Pln& pln, gp_Pnt2d& pnt2d)
381
382   int ret = 0; 
383   Handle(Geom_Plane) gpln = new Geom_Plane(pln); 
384   GeomAdaptor_Surface adsur(gpln); 
385   Extrema_ExtPS extps(pnt3d, adsur, 0.001, 0.001); 
386   if( extps.IsDone() ) 
387   { 
388     int index;
389     for(index=1; index<= extps.NbExt(); index++ ) 
390     { 
391       Extrema_POnSurf pons = extps.Point(index); 
392       Standard_Real U, V; 
393       pons.Parameter(U, V); 
394       pnt2d.SetCoord(U, V); 
395       ret = 1; 
396     } 
397   } 
398   return ret;
399
400
401 static Standard_Integer OCC353 (Draw_Interpretor& di, Standard_Integer , const char ** )
402 {
403   gp_Ax2 ax21( gp_Pnt(100,0,0), gp_Dir(0,0,1) );
404   Handle(Geom_Circle) h_cir1 = new Geom_Circle( ax21, 25 );
405
406   gp_Ax2 ax22( gp_Pnt(-100,0,0), gp_Dir(0,0,1) );
407   Handle(Geom_Circle) h_cir2 = new Geom_Circle( ax22, 25 );
408
409   gp_Pln refpln( gp_Pnt(0,0,0), gp_Dir(0,0,1) );
410   Handle(Geom2d_Curve) cir2d1 = GeomAPI::To2d(h_cir1, refpln);
411   Handle(Geom2d_Curve) cir2d2 = GeomAPI::To2d(h_cir2, refpln);
412
413   Geom2dAdaptor_Curve adop1(cir2d1);
414   Geom2dAdaptor_Curve adop2(cir2d2);
415
416   Geom2dGcc_QualifiedCurve qcur1(adop1, GccEnt_enclosing);
417   Geom2dGcc_QualifiedCurve qcur2(adop2, GccEnt_enclosing);
418
419   Handle(Geom_CartesianPoint) h_carpt = new Geom_CartesianPoint(0,175,0);
420
421   gp_Pnt pt3d = h_carpt->Pnt();
422   gp_Pnt2d pt2d;
423   geom_get_2Dpt_from_3Dpt(pt3d, refpln, pt2d);
424
425   Standard_CString st;
426   st = "cir2d1";
427   DrawTrSurf::Set(st,cir2d1);
428   st = "cir2d2";
429   DrawTrSurf::Set(st,cir2d2);
430   st = "pt2d";
431   DrawTrSurf::Set(st,pt2d);
432
433   Handle(Geom2d_CartesianPoint) pt = new Geom2d_CartesianPoint(pt2d);
434   Geom2dGcc_Circ2d3Tan sol( qcur1, qcur2, pt, 0.001, 0.0, 0.0);
435
436   int res = 0;
437   Standard_Character buf[10];
438   buf[0] = '\0';
439
440   if( sol.IsDone() ) {
441     res = sol.NbSolutions();
442     for(Standard_Integer i=1;i<=res;i++) {
443       Handle(Geom2d_Circle) aC = new Geom2d_Circle(sol.ThisSolution(i));
444       Sprintf(buf,"Result_%d",i);
445       st = buf;
446       DrawTrSurf::Set(st,aC);
447     }
448   }
449   else
450     di << "\n Faulty: no solutions found ";
451   //printf("\n Faulty: no solutions found ");
452
453   //printf("\n Num of solutions are %d ", res );
454   di << "\n Num of solutions are " << res << " ";
455
456   return 0;
457 }
458
459 static Standard_Integer OCC280 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
460 {
461   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
462   if(aContext.IsNull()) 
463   { 
464     di << "use 'vinit' command before " << argv[0] << "\n";
465     return -1;
466   }
467   if ( argc != 3) {
468     di << "ERROR : Usage : " << argv[0] << " hlr=0/1 setsurfecedetail=0/1; set perspecrive view\n";
469     return 1;
470   }
471
472   Standard_Integer HLR = Draw::Atoi(argv[1]);
473   if (HLR != 0) {
474     HLR = 1;
475   }
476
477   TCollection_AsciiString anOldName = ViewerTest::GetCurrentViewName();
478   Handle(V3d_Viewer) aViewer = ViewerTest::GetViewerFromContext();
479   aViewer->SetDefaultTypeOfView (V3d_PERSPECTIVE);
480   Handle(Aspect_Window) asp = ViewerTest::CurrentView()->Window();
481   Handle(V3d_View) aNewView = aViewer->CreateView();
482   ViewerTest::CurrentView (aNewView);
483   TCollection_AsciiString aNewName=anOldName + "_new";
484   ViewerTest::InitViewName(aNewName,ViewerTest::CurrentView());
485   aNewView->SetWindow (asp);
486   if (!asp->IsMapped()) asp->Map();
487   aNewView->Redraw();
488   ViewerTest::RemoveView(anOldName,false);
489   ViewerTest::UnsetEventManager();
490   ViewerTest::SetEventManager (new ViewerTest_EventManager (aNewView, ViewerTest::GetAISContext()));
491
492   if (HLR == 1)
493   {
494     di << "HLR\n";
495     ViewerTest::CurrentView()->SetComputedMode (Standard_True);
496   }
497
498   return 0;
499 }
500
501 static Standard_Integer  OCC138LC (Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** argv)
502 {
503   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
504   if(aContext.IsNull()) { 
505     di << "use 'vinit' command before " << argv[0] << "\n";
506     return 1;
507   }
508
509   BRepPrimAPI_MakeBox box1(gp_Pnt(0, 0, 0),  gp_Pnt(100, 100, 100));
510   BRepPrimAPI_MakeBox box2(gp_Pnt(120, 120, 120),  gp_Pnt(300, 300,300));
511   BRepPrimAPI_MakeBox box3(gp_Pnt(320, 320, 320),  gp_Pnt(500, 500,500));
512
513   Handle(AIS_InteractiveObject) ais1 = new AIS_Shape(box1.Shape());
514   Handle(AIS_InteractiveObject) ais2 = new AIS_Shape(box2.Shape());
515   Handle(AIS_InteractiveObject) ais3 = new AIS_Shape(box3.Shape());
516
517   aContext->Display (ais1, Standard_False);
518   aContext->Display (ais2, Standard_False);
519   aContext->Display (ais3, Standard_False);
520
521   aContext->AddOrRemoveSelected (ais1, Standard_False);
522   aContext->AddOrRemoveSelected (ais2, Standard_False);
523   aContext->AddOrRemoveSelected (ais3, Standard_False);
524
525   di << "\n No of selected = " << aContext->NbSelected();
526
527   aContext->InitSelected();
528
529   int count = 1;
530   while(aContext->MoreSelected())
531   {
532     di << "\n count is = %d" << count++;
533     Handle(AIS_InteractiveObject) ais = aContext->SelectedInteractive();
534     aContext->AddOrRemoveSelected (ais, Standard_False);
535     aContext->InitSelected();
536   }
537
538   aContext->UpdateCurrentViewer();
539
540   return 0; 
541 }
542
543 #include <BRepBndLib.hxx>
544 #include <Draw.hxx>
545 //=======================================================================
546 //function : OCC566
547 //purpose  : 
548 //=======================================================================
549 static Standard_Integer OCC566(Draw_Interpretor& di,Standard_Integer n,const char ** a)
550 {
551   if (n < 2) {
552     di<<"Usage: " << a[0] << " shape [ xmin ymin zmin xmax ymax zmax]\n";
553     return 1;
554   }
555   TopoDS_Shape S = DBRep::Get(a[1]);
556   if (S.IsNull()) return 1;
557   Bnd_Box B;
558   BRepBndLib::AddClose(S,B);
559   Standard_Real axmin,aymin,azmin,axmax,aymax,azmax;
560   B.Get(axmin,aymin,azmin,axmax,aymax,azmax);
561   di << axmin<<" "<< aymin<<" "<< azmin<<" "<< axmax<<" "<< aymax<<" "<< azmax;
562   if (n >= 8) {
563     Draw::Set(a[2],axmin) ;
564     Draw::Set(a[3],aymin) ;
565     Draw::Set(a[4],azmin) ;
566     Draw::Set(a[5],axmax) ;
567     Draw::Set(a[6],aymax) ;
568     Draw::Set(a[7],azmax) ;
569   }
570   return 0;
571 }
572
573 #include <BRepFilletAPI_MakeFillet.hxx>
574 //=======================================================================
575 //function : OCC570
576 //purpose  : 
577 //=======================================================================
578 static Standard_Integer OCC570 (Draw_Interpretor& di, Standard_Integer argc,const char ** argv)
579 {
580   if (argc < 2) {
581     di<<"Usage: " << argv[0] << " result\n";
582     return 1;
583   }
584
585   BRepPrimAPI_MakeBox mkBox(100.,100.,100.);
586   TopoDS_Shape aBox = mkBox.Shape();
587
588   TopExp_Explorer aExp;
589   aExp.Init(aBox,TopAbs_WIRE);
590   if (aExp.More())
591   {
592     TopoDS_Shape aWire = aExp.Current();
593
594     aExp.Init(aWire,TopAbs_EDGE);
595     TopoDS_Edge e1 = TopoDS::Edge(aExp.Current()); aExp.Next();
596     TopoDS_Edge e2 = TopoDS::Edge(aExp.Current()); aExp.Next();
597     TopoDS_Edge e3 = TopoDS::Edge(aExp.Current()); aExp.Next();
598     TopoDS_Edge e4 = TopoDS::Edge(aExp.Current());
599
600     try
601     {
602       OCC_CATCH_SIGNALS
603         BRepFilletAPI_MakeFillet mkFillet(aBox);
604       mkFillet.SetContinuity(GeomAbs_C1,.001);
605
606       // Setup variable fillet data
607       TColgp_Array1OfPnt2d t_pnt(1,4);
608       t_pnt.SetValue(1,gp_Pnt2d(0.0,5.0));
609       t_pnt.SetValue(2,gp_Pnt2d(0.3,15.0));
610       t_pnt.SetValue(3,gp_Pnt2d(0.7,15.0));
611       t_pnt.SetValue(4,gp_Pnt2d(1.0,5.0));
612
613       // HERE:
614       // It is impossible to build fillet if at least one edge
615       // with variable radius is added!!! If all are constant, everything is ok.
616       mkFillet.Add(t_pnt,e1);
617       mkFillet.Add(5.0,e2);
618       mkFillet.Add(t_pnt,e3);
619       mkFillet.Add(5.0,e4);
620
621       mkFillet.Build();
622       TopoDS_Shape aFinalShape = mkFillet.Shape();
623
624       DBRep::Set(argv[1],aFinalShape);
625     }
626     catch(Standard_Failure const&)
627     {
628       di << argv[0] << ": Exception in fillet\n";
629       return 2;
630     }
631   }
632
633   return 0;
634 }
635
636 #include <Law_Interpol.hxx>
637
638 static Standard_Real t3d = 1.e-4;
639 static Standard_Real t2d = 1.e-5;
640 static Standard_Real ta  = 1.e-2;
641 static Standard_Real fl  = 1.e-3;
642 static Standard_Real tapp_angle = 1.e-2;
643 static GeomAbs_Shape blend_cont = GeomAbs_C1;
644
645 static BRepFilletAPI_MakeFillet* Rake = 0;
646 static char name[100];
647
648 static void printtolblend(Draw_Interpretor& di)
649 {
650   di<<"tolerance ang : "<<ta<<"\n";
651   di<<"tolerance 3d  : "<<t3d<<"\n";
652   di<<"tolerance 2d  : "<<t2d<<"\n";
653   di<<"fleche        : "<<fl<<"\n";
654
655   di<<"tolblend "<<ta<<" "<<t3d<<" "<<t2d<<" "<<fl<<"\n";
656 }
657
658 static Standard_Integer MKEVOL(Draw_Interpretor& di, 
659                                Standard_Integer narg, 
660                                const char ** a)
661 {
662   if(Rake != 0) {delete Rake; Rake = 0;}
663   printtolblend(di);
664   if (narg < 3) return 1;
665   TopoDS_Shape V = DBRep::Get(a[2]);
666   Rake = new BRepFilletAPI_MakeFillet(V);
667   Rake->SetParams(ta,t3d,t2d,t3d,t2d,fl);
668   Rake->SetContinuity(blend_cont, tapp_angle);
669   if (narg == 4) {
670     ChFi3d_FilletShape FSh = ChFi3d_Rational;
671     if (!strcasecmp(a[3], "Q")) {
672       FSh = ChFi3d_QuasiAngular;
673     }
674     else if (!strcasecmp(a[3], "P")) {
675       FSh = ChFi3d_Polynomial;
676     }
677     Rake->SetFilletShape(FSh);
678   }
679   strcpy(name, a[1]);
680   return 0;
681 }
682
683 static Standard_Integer UPDATEVOL(Draw_Interpretor& di, 
684                                   Standard_Integer narg, 
685                                   const char ** a)
686 {
687   if(Rake == 0){
688     di << "MakeFillet non initialise\n";
689     return 1 ;
690   }
691   if(narg%2 != 0 || narg < 4) return 1;
692   TColgp_Array1OfPnt2d uandr(1,(narg/2)-1);
693   Standard_Real Rad, Par;
694   TopoDS_Shape aLocalEdge(DBRep::Get(a[1],TopAbs_EDGE));
695   TopoDS_Edge E = TopoDS::Edge(aLocalEdge);
696   for (Standard_Integer ii = 1; ii <= (narg/2)-1; ii++){
697     Par = Draw::Atof(a[2*ii]);
698     Rad = Draw::Atof(a[2*ii + 1]);
699     uandr.ChangeValue(ii).SetCoord(Par,Rad);
700   }
701   //HELPDESK: Add law creation
702   const Standard_Boolean aLawMode = !strcmp(a[0],"OCC570evollaw");
703   if (aLawMode)
704   {
705     di<<"INFO: Using law to define variable fillet\n";
706     Handle(Law_Interpol) law = new Law_Interpol;
707     law->Set(uandr);
708     Rake->Add(law,E);
709   }
710   else
711     Rake->Add(uandr,E);
712
713   return 0;
714 }
715
716 static Standard_Integer BUILDEVOL(Draw_Interpretor& di,
717                                   Standard_Integer, 
718                                   const char **)
719 {
720   if(Rake == 0){
721     di << "MakeFillet non initialise\n";
722     return 1 ;
723   }
724   Rake->Build();
725   if(Rake->IsDone()){
726     TopoDS_Shape result = Rake->Shape();
727     DBRep::Set(name,result);
728     if(Rake != 0) {delete Rake; Rake = 0;}
729     return 0;
730   }
731   if(Rake != 0) {delete Rake; Rake = 0;}
732   return 1;
733 }
734
735 #include <TColGeom_SequenceOfCurve.hxx>
736 #include <Geom_TrimmedCurve.hxx>
737 #include <GeomFill_NSections.hxx>
738 #include <BRepBuilderAPI_MakeFace.hxx>
739 //=======================================================================
740 //function : OCC606
741 //purpose  : 
742 //=======================================================================
743 static Standard_Integer OCC606 ( Draw_Interpretor& di, Standard_Integer n, const char ** a )
744 {
745   if (n != 3 && n != 4)
746   {
747     di << "Usage : " << a[0] << " result shape [-t]\n";
748     return 0;
749   }
750
751   Standard_Boolean TrimMode = (n == 4);
752   if (TrimMode) di<<"INFO: Using trimmed curves...\n";
753   else di<<"INFO: Using non trimmed curves...\n";
754
755   TopoDS_Shape S = DBRep::Get(a[2]);
756
757   TopExp_Explorer t_exp(S,TopAbs_EDGE);
758   TColGeom_SequenceOfCurve n_curves1;
759   TColStd_SequenceOfReal np;
760   Standard_Real param = 5.0;
761
762   for (;t_exp.More();t_exp.Next())
763   {
764     Standard_Real f,l;
765     Handle(Geom_Curve) h_cur = BRep_Tool::Curve(TopoDS::Edge(t_exp.Current()),f,l);
766     if (!h_cur.IsNull())
767     {
768       if (TrimMode) h_cur = new Geom_TrimmedCurve(h_cur,f,l);
769
770       n_curves1.Append(h_cur);
771       np.Append(param);
772       param += 1.0;
773     }
774   }
775
776   if (n_curves1.Length()>1 && !np.IsEmpty())
777   {
778     try
779     {
780       OCC_CATCH_SIGNALS
781         GeomFill_NSections b_surface1(n_curves1, np);
782       Handle(Geom_BSplineSurface) result_surf1 = b_surface1.BSplineSurface();
783       if (!result_surf1.IsNull())
784       {
785         BRepBuilderAPI_MakeFace b_face1(result_surf1, Precision::Confusion());
786         TopoDS_Face bsp_face1 = b_face1.Face();
787         DBRep::Set(a[1],bsp_face1);
788       }
789     }
790     catch(Standard_Failure const&)
791     {
792       di<<"ERROR: Exception in GeomFill_NSections\n";
793     }
794   }
795
796
797   return 0;
798 }
799
800 //=======================================================================
801 //function : OCC813
802 //purpose  : 
803 //=======================================================================
804 static Standard_Integer OCC813 (Draw_Interpretor& di, Standard_Integer argc,const char ** argv)
805 {
806   if (argc < 3)
807   {
808     di << "Usage : " << argv[0] << " U V\n";
809     return 1;
810   }
811
812   Standard_CString str;
813   Standard_Real U = Draw::Atof(argv[1]);
814   Standard_Real V = Draw::Atof(argv[2]);
815
816   //Between ellipse and point:
817
818   Handle(Geom_Ellipse) ell = new Geom_Ellipse(gp_Ax2(gp_Pnt(1262.224429,425.040878,363.609716),
819     gp_Dir(0.173648,0.984808,0.000000),
820     gp_Dir(-0.932169,0.164367,-0.322560)), 150, 100);
821   Handle(Geom_Plane) plne = new Geom_Plane(gp_Ax3(gp_Ax2(gp_Pnt(1262.224429,425.040878,363.609716),
822     gp_Dir(0.173648,0.984808,0.000000),
823     gp_Dir(-0.932169,0.164367,-0.322560))) );
824
825   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
826
827   gp_Pnt2d pt2d(U,V);
828   gp_Pln pln = plne->Pln();
829
830   str = "OCC813_pnt"; DrawTrSurf::Set(str,pt2d);
831
832   Handle(Geom2d_Curve) curve2d = GeomAPI::To2d(ell,pln);
833   Geom2dAdaptor_Curve acur(curve2d);
834   Geom2dGcc_QualifiedCurve qcur(acur, GccEnt_outside);
835
836   str = "OCC813_ell"; DrawTrSurf::Set(str,curve2d);
837   if(!aContext.IsNull()) {
838     Handle(AIS_Shape) aisp = 
839       new AIS_Shape (BRepBuilderAPI_MakeEdge(GeomAPI::To3d(curve2d, pln)).Edge());
840     aContext->Display (aisp, Standard_False);
841   }
842
843   //This does not give any solutions.
844   Geom2dGcc_Lin2d2Tan lintan(qcur, pt2d, 0.1);
845   di<<"OCC813 nb of solutions = "<<lintan.NbSolutions()<<"\n";
846
847   Standard_Character abuf[16];
848   Standard_CString st = abuf;
849
850   Standard_Integer i;
851   for(i=1;i<=lintan.NbSolutions();i++) {
852     Sprintf(abuf,"lintan_%d",i);
853     Handle(Geom2d_Line) glin = new Geom2d_Line(lintan.ThisSolution(i));
854     DrawTrSurf::Set(st,glin);
855     if(!aContext.IsNull()) {
856       Handle(AIS_Shape) aisp = 
857         new AIS_Shape (BRepBuilderAPI_MakeEdge(GeomAPI::To3d(glin, pln)).Edge());
858       aContext->Display (aisp, Standard_False);
859     }
860   }
861
862   if (!aContext.IsNull())
863   {
864     aContext->UpdateCurrentViewer();
865   }
866
867   return 0;
868 }
869
870 //=======================================================================
871 //function : OCC814
872 //purpose  : 
873 //=======================================================================
874 static Standard_Integer OCC814 (Draw_Interpretor& di, Standard_Integer argc,const char ** argv)
875 {
876   if (argc > 1)
877   {
878     di << "Usage : " << argv[0] << "\n";
879     return 1;
880   }
881
882   Standard_CString str;
883
884   //Between Ellipse and Circle:
885
886   Handle(Geom_Circle) cir = new Geom_Circle(gp_Ax2(gp_Pnt(823.687192,502.366825,478.960440),
887     gp_Dir(0.173648,0.984808,0.000000),
888     gp_Dir(-0.932169,0.164367,-0.322560)), 50);
889   Handle(Geom_Ellipse) ell = new Geom_Ellipse(gp_Ax2(gp_Pnt(1262.224429,425.040878,363.609716),
890     gp_Dir(0.173648,0.984808,0.000000),
891     gp_Dir(-0.932169,0.164367,-0.322560)), 150, 100);
892   Handle(Geom_Plane) plne = new Geom_Plane(gp_Ax3(gp_Ax2(gp_Pnt(1262.224429,425.040878,363.609716),
893     gp_Dir(0.173648,0.984808,0.000000),
894     gp_Dir(-0.932169,0.164367,-0.322560))) );
895
896   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
897
898   gp_Pln pln = plne->Pln();
899   Handle(Geom2d_Curve) curve2d = GeomAPI::To2d(ell, pln);
900   Handle(Geom2d_Curve) fromcurve2d = GeomAPI::To2d(cir, pln);
901
902   str = "OCC814_cir"; DrawTrSurf::Set(str,curve2d);
903   str = "OCC814_ell"; DrawTrSurf::Set(str,fromcurve2d);
904   if(!aContext.IsNull()) {
905     Handle(AIS_Shape) aisp = 
906       new AIS_Shape (BRepBuilderAPI_MakeEdge(GeomAPI::To3d(curve2d, pln)).Edge());
907     aContext->Display (aisp, Standard_False);
908   }
909   if(!aContext.IsNull()) {
910     Handle(AIS_Shape) aisp = 
911       new AIS_Shape (BRepBuilderAPI_MakeEdge(GeomAPI::To3d(fromcurve2d, pln)).Edge());
912     aContext->Display (aisp, Standard_False);
913   }
914
915   Geom2dAdaptor_Curve acur(curve2d), afromcur(fromcurve2d);
916
917   Geom2dGcc_QualifiedCurve qcur(acur, GccEnt_outside) ;
918   Geom2dGcc_QualifiedCurve qfromcur(afromcur, GccEnt_outside) ;
919
920   //This does not give any solutions.
921   Geom2dGcc_Lin2d2Tan lintan(qcur, qfromcur, 0.1);
922   di<<"OCC814 nb of solutions = "<<lintan.NbSolutions()<<"\n";
923
924   Standard_Character abuf[16];
925   Standard_CString st = abuf;
926
927   Standard_Integer i;
928   for(i=1;i<=lintan.NbSolutions();i++) {
929     Sprintf(abuf,"lintan_%d",i);
930     Handle(Geom2d_Line) glin = new Geom2d_Line(lintan.ThisSolution(i));
931     DrawTrSurf::Set(st,glin);
932     if(!aContext.IsNull()) {
933       Handle(AIS_Shape) aisp = 
934         new AIS_Shape (BRepBuilderAPI_MakeEdge(GeomAPI::To3d(glin, pln)).Edge());
935       aContext->Display (aisp, Standard_False);
936     }
937   }
938
939   if (!aContext.IsNull())
940   {
941     aContext->UpdateCurrentViewer();
942   }
943
944   return 0;
945 }
946
947 #include <ShapeAnalysis_Wire.hxx>
948 #include <IntRes2d_SequenceOfIntersectionPoint.hxx>
949 #include <TColgp_SequenceOfPnt.hxx>
950 #include <ShapeFix_Wire.hxx>
951 //=======================================================================
952 //function : OCC884
953 //purpose  : 
954 //=======================================================================
955 static Standard_Integer OCC884 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
956 {
957   if (argc < 3 || argc > 5)
958   {
959     di << "Usage : " << argv[0] << " result shape [toler [maxtoler]]\n";
960     return 1;
961   }
962
963   TopoDS_Shape shape = DBRep::Get(argv[2]); //read the shape
964
965   TopExp_Explorer exp(shape, TopAbs_EDGE);
966   if (!exp.More())
967   {
968     di<<"Error: no edge found\n";
969     return 1;
970   }
971
972   BRep_Builder builder;
973   TopoDS_Wire wire;
974   builder.MakeWire(wire);
975   builder.Add(wire, TopoDS::Edge(exp.Current()));
976
977   // HelpDesk: Create planar face if possible
978   TopoDS_Face face = BRepBuilderAPI_MakeFace(wire,Standard_True);
979
980   Handle(ShapeAnalysis_Wire) advWA = new ShapeAnalysis_Wire;
981   advWA->Load(wire);
982   advWA->SetFace(face);
983   advWA->SetPrecision(0.001);
984
985   IntRes2d_SequenceOfIntersectionPoint points2d;
986   TColgp_SequenceOfPnt points3d;
987
988   di << "Info: CheckSelfIntersectingEdge = " << (Standard_Integer) advWA->CheckSelfIntersectingEdge(1,points2d,points3d) << "\n";
989
990   ShapeExtend_Status status = ShapeExtend_FAIL1;
991   if (advWA->StatusSelfIntersection(status))
992     di << "Info: No P Curve found in the edge\n";
993
994   status = ShapeExtend_FAIL2; 
995   if (advWA->StatusSelfIntersection(status))
996     di << "Info: No Vertices found in the edge\n";
997
998   status = ShapeExtend_DONE1; 
999   if (advWA->StatusSelfIntersection(status))
1000     di << "Info: Self-intersection found in the edge\n";
1001
1002   Standard_Integer i, num = points2d.Length();
1003   di << "Info: No. of self-intersection points : " << num << "\n";
1004
1005   char str[80];
1006   Standard_CString aName = str;
1007   for (i = 1; i <= num; ++i)
1008   { 
1009     gp_Pnt pt = points3d(i); 
1010     di << "Info: Intersecting pt : (" << pt.X() << ", " << pt.Y() << ", " << pt.Z() << ")\n";
1011     Sprintf(str,"p_%d",i);
1012     DrawTrSurf::Set(aName,pt);
1013   }
1014
1015   Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
1016   sfw->Load(wire);
1017   sfw->SetFace(face);
1018
1019   if (argc > 3) sfw->SetPrecision(Draw::Atof(argv[3])/*0.1*/);
1020   if (argc > 4) sfw->SetMaxTolerance(Draw::Atof(argv[4]));
1021   di << "Info: Precision is set to " << sfw->Precision() << "\n";
1022   di << "Info: MaxTolerance is set to " << sfw->MaxTolerance() << "\n";
1023
1024   sfw->ModifyTopologyMode() = 1;
1025   sfw->ModifyGeometryMode() = 1; 
1026   sfw->FixSelfIntersectingEdgeMode() = 1;
1027   //printf("Info: FixSelfIntersection = %d\n",sfw->FixSelfIntersection());
1028   di << "Info: FixSelfIntersection = " << (Standard_Integer) sfw->FixSelfIntersection() << "\n";
1029
1030   DBRep::Set(argv[1],sfw->Wire());
1031
1032   status = ShapeExtend_OK;
1033   if (sfw->StatusSelfIntersection(status))
1034     di << "Info: ShapeExtend_OK : No intersection found\n";
1035   //printf("Info: ShapeExtend_OK : No intersection found\n");
1036
1037   status = ShapeExtend_FAIL1;
1038   if (sfw->StatusSelfIntersection(status))
1039     di << "Info: ShapeExtend_FAIL1 : analysis failed (edge has no pcurve, or no vertices etc.)\n";
1040
1041   status = ShapeExtend_FAIL2;
1042   if (sfw->StatusSelfIntersection(status))
1043     di << "Info: ShapeExtend_FAIL2 : self-intersection was found, but not fixed because of limit of increasing tolerance (MaxTolerance)\n";
1044
1045   status = ShapeExtend_FAIL3;
1046   if (sfw->StatusSelfIntersection(status))
1047     di << "Info: ShapeExtend_FAIL3 : intercestion of non adjacent edges found, but not fixed because of limit of increasing tolerance (MaxTolerance)\n";
1048
1049   status = ShapeExtend_DONE1;
1050   if (sfw->StatusSelfIntersection(status))
1051     di << "Info: ShapeExtend_DONE1 : tolerance of vertex was increased to fix self-intersection\n";
1052
1053   status = ShapeExtend_DONE2;
1054   if (sfw->StatusSelfIntersection(status))
1055     di << "Info: ShapeExtend_DONE2 : vertex was moved to fix self-intersection\n";
1056
1057   status = ShapeExtend_DONE3;
1058   if (sfw->StatusSelfIntersection(status))
1059     di << "Info: ShapeExtend_DONE3 : some edges were removed because of intersection\n";
1060
1061   status = ShapeExtend_DONE4;
1062   if (sfw->StatusSelfIntersection(status))
1063     di << "Info: ShapeExtend_DONE4 : pcurve(s) was(were) modified\n";
1064
1065   status = ShapeExtend_DONE5;
1066   if (sfw->StatusSelfIntersection(status))
1067     di << "Info: ShapeExtend_DONE5 : non adjacent intersection fixed by increasing tolerance of vertex(vertices)\n";
1068
1069   status = ShapeExtend_DONE6;
1070   if (sfw->StatusSelfIntersection(status))
1071     di << "Info: ShapeExtend_DONE6 : tolerance of edge was increased to hide intersection\n";
1072
1073   status = ShapeExtend_DONE7;
1074   if (sfw->StatusSelfIntersection(status))
1075     di << "Info: ShapeExtend_DONE7 : range of some edges was decreased to avoid intersection\n";
1076
1077   return 0;
1078 }
1079
1080 #include <Graphic3d_MaterialAspect.hxx>
1081 #include <Prs3d_Drawer.hxx>
1082 #include <Prs3d_ShadingAspect.hxx>
1083 //=======================================================================
1084 //function : OCC1174_1
1085 //purpose  : 
1086 //=======================================================================
1087 static Standard_Integer OCC1174_1 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1088 {
1089   if (argc != 2)
1090   {
1091     di << "Usage : " << argv[0] << " shape\n";
1092     return 1;
1093   }
1094
1095   Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
1096   if(anAISContext.IsNull())
1097   {
1098     di << "use 'vinit' command before " << argv[0] << "\n";
1099     return 1;
1100   }
1101
1102   TopoDS_Shape aShape = DBRep::Get(argv[1]);
1103
1104   Handle(AIS_Shape) anAisIO = new AIS_Shape(aShape);
1105
1106   Quantity_Color aColF(0.0, 0.4, 0.0, Quantity_TOC_sRGB);
1107   Quantity_Color aColB(0.0, 0.0, 0.6, Quantity_TOC_sRGB);
1108
1109   Handle(Prs3d_Drawer) aDrawer = anAisIO->Attributes();
1110   Handle(Prs3d_ShadingAspect) aShadingAspect = aDrawer->ShadingAspect();
1111
1112   Graphic3d_MaterialAspect aFront = aShadingAspect->Material(Aspect_TOFM_FRONT_SIDE);
1113   aFront.SetAmbientColor(aColF);
1114   aFront.SetDiffuseColor(aColF);
1115   aFront.SetSpecularColor(aColF);
1116   aFront.SetEmissiveColor(Quantity_NOC_BLACK);
1117   aFront.SetTransparency(0.0);
1118   aShadingAspect->SetMaterial(aFront,Aspect_TOFM_FRONT_SIDE);
1119
1120   Graphic3d_MaterialAspect aBack = aShadingAspect->Material(Aspect_TOFM_BACK_SIDE);
1121   aBack.SetAmbientColor(aColB);
1122   aBack.SetDiffuseColor(aColB);
1123   aBack.SetSpecularColor(aColB);
1124   aBack.SetEmissiveColor(Quantity_NOC_BLACK);
1125   aBack.SetTransparency(0.0);
1126   aShadingAspect->SetMaterial(aBack,Aspect_TOFM_BACK_SIDE);
1127
1128   aDrawer->SetShadingAspect (aShadingAspect);
1129
1130   anAISContext->Display (anAisIO, 1, 0, Standard_True);
1131
1132   Standard_Real r, g, b; 
1133   aShadingAspect->Color(Aspect_TOFM_FRONT_SIDE).Values(r,g,b, Quantity_TOC_sRGB);
1134   di << "Info: color on front side (" << r << "," << g << "," << b << ")\n";
1135   aShadingAspect->Color(Aspect_TOFM_BACK_SIDE).Values(r,g,b, Quantity_TOC_sRGB);
1136   di << "Info: color on back side (" << r << "," << g << "," << b << ")\n";
1137
1138   return 0;
1139 }
1140
1141 //=======================================================================
1142 //function : OCC1174_2
1143 //purpose  : 
1144 //=======================================================================
1145 static Standard_Integer OCC1174_2 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1146 {
1147   if (argc != 2)
1148   {
1149     di << "Usage : " << argv[0] << " shape\n";
1150     return 1;
1151   }
1152
1153   Handle(AIS_InteractiveContext) AISContext = ViewerTest::GetAISContext();
1154   if(AISContext.IsNull()) 
1155   {
1156     di << "use 'vinit' command before " << argv[0] << "\n";
1157     return 1;
1158   }
1159
1160   TopoDS_Shape sh = DBRep::Get(argv[1]);
1161
1162   Handle(AIS_Shape) ais = new AIS_Shape(sh); 
1163   AISContext->Display (ais, 1, 0, Standard_False);
1164   AISContext->SetMaterial (ais, Graphic3d_NOM_SHINY_PLASTIC, Standard_False);
1165
1166   Quantity_Color colf(0.0, 0.4, 0.0, Quantity_TOC_sRGB);
1167   Quantity_Color colb(0.0, 0.0, 0.6, Quantity_TOC_sRGB);
1168   Handle(Prs3d_ShadingAspect) sa = ais->Attributes()->ShadingAspect(); 
1169
1170   Graphic3d_MaterialAspect front = sa->Material(Aspect_TOFM_FRONT_SIDE); 
1171   front.SetAmbientColor(colf); 
1172   front.SetDiffuseColor(colf); 
1173   front.SetSpecularColor(colf); 
1174   front.SetEmissiveColor(Quantity_NOC_BLACK);
1175   front.SetTransparency (0.4f);
1176   sa->SetMaterial(front,Aspect_TOFM_FRONT_SIDE); 
1177
1178   Graphic3d_MaterialAspect back = sa->Material(Aspect_TOFM_BACK_SIDE); 
1179   back.SetAmbientColor(colb); 
1180   back.SetDiffuseColor(colb); 
1181   back.SetSpecularColor(colb); 
1182   back.SetEmissiveColor(Quantity_NOC_BLACK);
1183   back.SetTransparency (0.2f);
1184   sa->SetMaterial(back,Aspect_TOFM_BACK_SIDE); 
1185
1186   AISContext->Redisplay (ais, 1, 0);
1187
1188   return 0;
1189 }
1190
1191 #include <TopoDS_Solid.hxx>
1192 #include <BRepFeat_MakeDPrism.hxx>
1193 //=======================================================================
1194 //function : OCCN1
1195 //purpose  : FEATURE OPERATION (BOSS and SLOT)
1196 //=======================================================================
1197 static Standard_Integer OCCN1 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1198 {
1199   if (argc != 4)
1200   {
1201     di << "Usage : " << argv[0] << " angle fuse(1 for boss / 0 for slot) length\n";
1202     return 1;
1203   }
1204
1205   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
1206   if(aContext.IsNull()) 
1207   {
1208     di << "use 'vinit' command before " << argv[0] << "\n";
1209     return 1;
1210   }
1211   Standard_Real    angle  = Draw::Atof(argv[1]);
1212   Standard_Integer fuse   = Draw::Atoi(argv[2]);
1213   Standard_Real    length = Draw::Atof(argv[3]);
1214
1215   BRepBuilderAPI_MakeEdge edge1(gp_Pnt(0, 0, 0), gp_Pnt(50, 0, 0));
1216   BRepBuilderAPI_MakeEdge edge2(gp_Pnt(50, 0, 0), gp_Pnt(50, 50, 0));
1217   BRepBuilderAPI_MakeEdge edge3(gp_Pnt(50, 50, 0), gp_Pnt(0, 50, 0));
1218   BRepBuilderAPI_MakeEdge edge4(gp_Pnt(0, 50, 0), gp_Pnt(0, 0, 0));
1219   TopoDS_Edge ted1 = edge1.Edge();
1220   TopoDS_Edge ted2 = edge2.Edge();
1221   TopoDS_Edge ted3 = edge3.Edge();
1222   TopoDS_Edge ted4 = edge4.Edge();
1223
1224   BRepBuilderAPI_MakeWire wire(ted1, ted2, ted3, ted4);
1225   TopoDS_Wire twire = wire.Wire();
1226
1227   BRepBuilderAPI_MakeFace face(twire);
1228   TopoDS_Face tface = face.Face();
1229   ////////Handle(AIS_Shape) face_ais = new AIS_Shape( tface );
1230   ////////aContext->Display(face_ais);
1231
1232   TopoDS_Solid box;
1233   BRepPrimAPI_MakeBox block(gp_Pnt(-50, -50, -150), 150, 150, 100);
1234   box = block.Solid();
1235
1236   TopoDS_Face top_face;
1237   top_face = block.TopFace();
1238
1239   BRepFeat_MakeDPrism slot(box, tface, top_face, angle, fuse,
1240     Standard_True);
1241
1242   slot.Perform(length);
1243   TopoDS_Shape S2 = slot.Shape();
1244
1245   DBRep::Set("OCCN1_tface",tface);
1246   DBRep::Set("OCCN1_slot",S2);
1247
1248   return 0;
1249 }
1250
1251 #include <BRepPrimAPI_MakeCylinder.hxx>
1252 #include <BRepPrimAPI_MakeSphere.hxx>
1253 #include <BRepAlgoAPI_Section.hxx>
1254 //=======================================================================
1255 //function : OCCN2
1256 //purpose  : BOOLEAN OPERATION
1257 //=======================================================================
1258 static Standard_Integer OCCN2 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1259 {
1260   if (argc > 2) {
1261     di << "Usage : " << argv[0] << "\n";
1262     return 1;
1263   }
1264
1265   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
1266   if(aContext.IsNull()) 
1267   {
1268     di << "use 'vinit' command before " << argv[0] << "\n";
1269     return 1;
1270   }
1271
1272   BRepPrimAPI_MakeCylinder cylinder(50,200);
1273   TopoDS_Shape cylinder_sh = cylinder.Shape();
1274
1275   BRepPrimAPI_MakeSphere sphere(gp_Pnt(60,0,100),50);
1276   TopoDS_Shape sphere_sh = sphere.Shape();
1277
1278   di << "BRepAlgoAPI_Section section(cylinder_sh, sphere_sh)\n";
1279   BRepAlgoAPI_Section section(cylinder_sh, sphere_sh);
1280   if (!section.IsDone()){
1281     di << "Error performing intersection: not done.\n";
1282   }
1283   const TopoDS_Shape& shape = section.Shape();
1284
1285   DBRep::Set("OCCN2_cylinder",cylinder_sh);
1286   DBRep::Set("OCCN2_sphere",sphere_sh);
1287   DBRep::Set("OCCN2_section",shape);
1288
1289   return 0;
1290 }
1291
1292 #include <TColgp_Array1OfPnt.hxx>
1293 #include <Geom_BezierCurve.hxx>
1294
1295 static Standard_Integer OCC2569 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1296 {
1297   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
1298   if(aContext.IsNull()) 
1299   {
1300     di << "use 'vinit' command before " << argv[0] << "\n";
1301     return 1;
1302   }
1303   if(argc != 3) {
1304     di << "Usage : " << argv[0] << " nbpoles result\n";
1305     return 1;
1306   }
1307
1308   int poles=Draw::Atoi(argv[1]); 
1309
1310   TColgp_Array1OfPnt arr(1, poles); 
1311   for(int i=1; i<=poles; i++) 
1312     arr.SetValue(i, gp_Pnt(i+10, i*2+20, i*3+45)); 
1313
1314   Handle(Geom_BezierCurve) bez = new Geom_BezierCurve(arr); 
1315   if(bez.IsNull()) {
1316     di << "\n The curve is not created.\n";
1317   } else {
1318     di << "\n Degree = " << bez->Degree() << "\n";   
1319   }
1320   TopoDS_Edge sh = BRepBuilderAPI_MakeEdge(bez).Edge(); 
1321   Handle(AIS_Shape) ais = new AIS_Shape(sh); 
1322   aContext->Display (ais, Standard_True);
1323   DrawTrSurf::Set(argv[2],bez);
1324   return 0;
1325 }
1326
1327 #include <TopTools_IndexedMapOfShape.hxx>
1328 #include <TopExp.hxx>
1329
1330 static Standard_Integer OCC1642 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
1331 {
1332   if (argc != 10) {
1333     di<<"Usage: " << argv[0] << " FinalWare FinalFace InitWare InitFace shape FixReorder FixDegenerated FixConnected FixSelfIntersection\n";
1334     return 1;
1335   }
1336
1337   TopoDS_Shape shape = DBRep::Get(argv[5]);
1338
1339   TopExp_Explorer exp(shape, TopAbs_WIRE);
1340   TopoDS_Shape wire = exp.Current();
1341
1342   Handle(ShapeAnalysis_Wire) advWA = new ShapeAnalysis_Wire;
1343   advWA->Load(TopoDS::Wire(wire));
1344
1345   DBRep::Set(argv[3],wire);
1346
1347   TopoDS_Face face =
1348     BRepBuilderAPI_MakeFace(TopoDS::Wire(wire),Standard_True);
1349
1350   DBRep::Set(argv[4],face);
1351
1352   advWA->SetFace(face);
1353   Standard_Real precision_to_ana = 0.0001;
1354   advWA->SetPrecision(precision_to_ana);
1355
1356   TopTools_IndexedMapOfShape M;
1357   TopExp::MapShapes(wire, TopAbs_EDGE, M);
1358
1359   int j= 1;
1360   for(j= 1; j<=M.Extent(); ++j) {
1361     Standard_Integer num=1;
1362     IntRes2d_SequenceOfIntersectionPoint points2d;
1363     TColgp_SequenceOfPnt points3d;
1364
1365     std::cout << "\n j =" << j << ",  CheckSelfIntersectingEdge = " <<
1366       advWA->CheckSelfIntersectingEdge(j, points2d, points3d);
1367
1368
1369     ShapeExtend_Status status = ShapeExtend_FAIL1;
1370     if(advWA->StatusSelfIntersection(status))
1371
1372       status = ShapeExtend_FAIL2;
1373     if(advWA->StatusSelfIntersection(status))
1374       di << "\n No Vertices found in the edge";
1375
1376     status = ShapeExtend_DONE1;
1377     if(advWA->StatusSelfIntersection(status))
1378       di << "\n Self-intersection found in the edge";
1379
1380     num = points2d.Length();
1381     di << "\n No. of self-intersecting edges : " << num;
1382
1383     for(int i=1; i<=num; ++i) {
1384       gp_Pnt pt = points3d(i);
1385       di << "\n Intersecting pt : (" << pt.X() << ", " << pt.Y()<< ", " << pt.Z() << ")";
1386     }
1387
1388   }
1389
1390   Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
1391   sfw->Load(TopoDS::Wire(wire));
1392   sfw->SetFace(face);
1393   sfw->SetPrecision(Precision::Confusion());
1394
1395   sfw->FixReorderMode() = 1;
1396   sfw->ClosedWireMode() = 1;
1397   sfw->FixDegeneratedMode() = 1;
1398   sfw->FixConnectedMode() = 1;
1399   sfw->ModifyTopologyMode() = 1;
1400   sfw->ModifyGeometryMode() = 1;
1401   sfw->FixSelfIntersectionMode() = 1;
1402   sfw->FixSelfIntersectingEdgeMode() = 1;
1403   sfw->FixIntersectingEdgesMode() = 1;
1404   sfw->FixNonAdjacentIntersectingEdgesMode() = 1;
1405   sfw->FixEdgeCurvesMode() = 1;
1406
1407   sfw->ModifyRemoveLoopMode() = 1;
1408   sfw->SetMaxTolerance(1.0);
1409
1410   di << "\n FixReorder = " << (Standard_Integer) sfw->FixReorder();
1411   di << "\n FixDegenerated = " << (Standard_Integer) sfw->FixDegenerated();
1412   di << "\n FixConnected = " << (Standard_Integer) sfw->FixConnected();
1413   di << "\n";
1414   di << "\n FixSelfIntersection = " << (Standard_Integer) sfw->FixSelfIntersection();
1415   di << "\n";
1416
1417   Draw::Set(argv[6],sfw->FixReorder()) ;
1418   Draw::Set(argv[7],sfw->FixDegenerated()) ;
1419   Draw::Set(argv[8],sfw->FixConnected()) ;
1420   Draw::Set(argv[9],sfw->FixSelfIntersection()) ;
1421
1422   ShapeExtend_Status status = ShapeExtend_OK;
1423   if(sfw->StatusSelfIntersection(status))
1424     di << "\n ShapeExtend_OK : No intersection found";
1425
1426   status = ShapeExtend_FAIL1;
1427   if(sfw->StatusSelfIntersection(status))
1428     di << "\n ShapeExtend_FAIL1 : analysis failed (edge has no pcurve,or no vertices etc.)";
1429
1430   status = ShapeExtend_FAIL2;
1431   if(sfw->StatusSelfIntersection(status))
1432     di << "\n ShapeExtend_FAIL2 : self-intersection was found, but not fixed because of limit of increasing tolerance (MaxTolerance)";
1433
1434   status = ShapeExtend_FAIL3;
1435   if(sfw->StatusSelfIntersection(status))
1436     di << "\n ShapeExtend_FAIL3 : intercestion of non adjacent edges found, but not fixed because of limit of increasing tolerance (MaxTolerance)";
1437
1438   status = ShapeExtend_DONE1;
1439   if(sfw->StatusSelfIntersection(status))
1440     di << "\n ShapeExtend_DONE1 : tolerance of vertex was increased to fix self-intersection";
1441
1442   status = ShapeExtend_DONE2;
1443   if(sfw->StatusSelfIntersection(status))
1444     di << "\n ShapeExtend_DONE2 : vertex was moved to fix self-intersection";
1445
1446   status = ShapeExtend_DONE3;
1447   if(sfw->StatusSelfIntersection(status))
1448     di << "\n ShapeExtend_DONE3 : some edges were removed because of intersection";
1449
1450   status = ShapeExtend_DONE4;
1451   if(sfw->StatusSelfIntersection(status))
1452     di << "\n ShapeExtend_DONE4 : pcurve(s) was(were) modified";
1453
1454   status = ShapeExtend_DONE5;
1455   if(sfw->StatusSelfIntersection(status))
1456     di << "\n ShapeExtend_DONE5 : non adjacent intersection fixed by increasing tolerance of vertex(vertices)";
1457
1458   status = ShapeExtend_DONE6;
1459   if(sfw->StatusSelfIntersection(status))
1460     di << "\n ShapeExtend_DONE6 : tolerance of edge was increased to hide intersection";
1461
1462   status = ShapeExtend_DONE7;
1463   if(sfw->StatusSelfIntersection(status))
1464     di << "\n ShapeExtend_DONE7 : range of some edges was decreased to avoid intersection";
1465
1466   TopoDS_Wire finalwire = sfw->Wire();
1467
1468   DBRep::Set(argv[1],finalwire);
1469
1470
1471   advWA->Load(TopoDS::Wire(finalwire));
1472
1473   TopoDS_Face fface =
1474     BRepBuilderAPI_MakeFace(TopoDS::Wire(finalwire),Standard_True);
1475
1476   DBRep::Set(argv[2],fface);
1477
1478   advWA->SetFace(fface);
1479
1480   TopTools_IndexedMapOfShape fM;
1481   TopExp::MapShapes(finalwire, TopAbs_EDGE, fM);
1482
1483   for(j= 1; j<=fM.Extent(); ++j) {
1484     Standard_Integer num=1;
1485     IntRes2d_SequenceOfIntersectionPoint points2d;
1486     TColgp_SequenceOfPnt points3d;
1487
1488     di << "\n j =" << j << ",  CheckSelfIntersectingEdge = " <<
1489       (Standard_Integer) advWA->CheckSelfIntersectingEdge(j, points2d, points3d);
1490
1491
1492     status = ShapeExtend_FAIL1;
1493     if(advWA->StatusSelfIntersection(status))
1494
1495       status = ShapeExtend_FAIL2;
1496     if(advWA->StatusSelfIntersection(status))
1497       di << "\n No Vertices found in the edge";
1498
1499     status = ShapeExtend_DONE1;
1500     if(advWA->StatusSelfIntersection(status))
1501       di << "\n Self-intersection found in the edge";
1502
1503     num = points2d.Length();
1504     di << "\n No. of self-intersecting edges : " << num;
1505
1506     for(int i=1; i<=num; ++i) {
1507       gp_Pnt pt = points3d(i);
1508       di << "\n Intersecting pt : (" << pt.X() << ", " << pt.Y() << ", " << pt.Z() << ")";
1509     }
1510
1511   }
1512
1513   di << "\n";
1514
1515   return 0;
1516 }
1517
1518 void QABugs::Commands_17(Draw_Interpretor& theCommands) {
1519   const char *group = "QABugs";
1520
1521   theCommands.Add ("BUC60842", "BUC60842", __FILE__, BUC60842, group);
1522   theCommands.Add ("BUC60843", "BUC60843 result_shape name_of_circle name_of_curve [ par1 [ tol ] ]", __FILE__, BUC60843, group);
1523   theCommands.Add ("BUC60970", "BUC60970 shape result", __FILE__, BUC60970, group);
1524   theCommands.Add ("BUC60915", "BUC60915", __FILE__, BUC60915_1, group);
1525   theCommands.Add ("OCC138", "OCC138", __FILE__, OCC138, group);
1526   theCommands.Add ("OCC353","OCC353",__FILE__,OCC353,group);
1527   theCommands.Add ("OCC280","OCC280 hlr=0/1 setsurfecedetail=0/1; set perspecrive view",__FILE__,OCC280,group);
1528   theCommands.Add ("OCC138LC", "OCC138LC", __FILE__, OCC138LC, group);
1529   theCommands.Add ("OCC566", "OCC566 shape [ xmin ymin zmin xmax ymax zmax] ; print bounding box", __FILE__, OCC566, group);
1530   theCommands.Add ("OCC570", "OCC570 result", __FILE__, OCC570, group);
1531
1532   theCommands.Add("OCC570mkevol",
1533     "OCC570mkevol result object (then use updatevol) [R/Q/P]; mkevol",
1534     __FILE__, MKEVOL,group);
1535   theCommands.Add("OCC570updatevol",
1536     "OCC570updatevol edge u1 rad1 u2 rad2 ...; updatevol",
1537     __FILE__, UPDATEVOL,group);
1538   theCommands.Add("OCC570updatevollaw",
1539     "OCC570updatevollaw edge u1 rad1 u2 rad2 ...; updatevollaw",
1540     __FILE__, UPDATEVOL,group);
1541   theCommands.Add("OCC570buildevol",
1542     "OCC570buildevol; end of the evol fillet computation",
1543     __FILE__, BUILDEVOL,group);
1544
1545   theCommands.Add ("OCC606", "OCC606 result shape [-t]", __FILE__, OCC606, group);
1546
1547   theCommands.Add ("OCC813", "OCC813 U V", __FILE__, OCC813, group);
1548   theCommands.Add ("OCC814", "OCC814", __FILE__, OCC814, group);
1549   theCommands.Add ("OCC884", "OCC884 result shape [toler [maxtoler]]", __FILE__, OCC884, group);
1550
1551   theCommands.Add ("OCC1174_1", "OCC1174_1 shape", __FILE__, OCC1174_1, group);
1552   theCommands.Add ("OCC1174_2", "OCC1174_2 shape", __FILE__, OCC1174_2, group);
1553
1554   theCommands.Add ("OCCN1", "OCCN1 angle fuse(1 for boss / 0 for slot) length", __FILE__, OCCN1, group);
1555   theCommands.Add ("OCCN2", "OCCN2", __FILE__, OCCN2, group);
1556
1557   theCommands.Add ("OCC2569", "OCC2569 nbpoles result", __FILE__, OCC2569, group);
1558
1559   theCommands.Add ("OCC1642", "OCC1642 FinalWare FinalFace InitWare InitFace shape FixReorder FixDegenerated FixConnected FixSelfIntersection", __FILE__, OCC1642, group);
1560
1561   return;
1562 }