0020716: Eliminate usage of "config.h" header file
[occt.git] / src / BRepTest / BRepTest_FilletCommands.cxx
1 // Created on: 1994-06-20
2 // Created by: Modeling
3 // Copyright (c) 1994-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <BRepTest.hxx>
18 #include <TColgp_Array1OfPnt2d.hxx>
19 #include <DBRep.hxx>
20 #include <Draw_Interpretor.hxx>
21 #include <Draw_Appli.hxx>
22 #include <BRepFilletAPI_MakeFillet.hxx>
23 #include <BRepAlgo_BooleanOperation.hxx>
24 #include <BRepAlgo_Fuse.hxx>
25 #include <BRepAlgo_Cut.hxx>
26 #include <BiTgte_Blend.hxx>
27 #include <TopOpeBRepBuild_HBuilder.hxx>
28 #include <TopTools_ListIteratorOfListOfShape.hxx>
29 #include <TopAbs_ShapeEnum.hxx>
30 #include <TopoDS_Shape.hxx>
31 #include <TopoDS_Compound.hxx>
32 #include <TopoDS_Edge.hxx>
33 #include <TopoDS_Vertex.hxx>
34 #include <TopoDS.hxx>
35 #include <TopExp.hxx>
36 #include <TopExp_Explorer.hxx>
37
38 //#include <BOPTools_DSFiller.hxx>
39 #include <BOPAlgo_PaveFiller.hxx>
40
41 #include <BRepAlgoAPI_BooleanOperation.hxx>
42 #include <BRepAlgoAPI_Fuse.hxx>
43 #include <BRepAlgoAPI_Cut.hxx>
44 #include <BRepAlgoAPI_Section.hxx>
45
46 #include <FilletSurf_Builder.hxx>
47 #include <ChFi3d_FilletShape.hxx>
48 #include <Geom_TrimmedCurve.hxx>
49 #include <TopTools_ListOfShape.hxx>
50 #include <FilletSurf_StatusType.hxx>
51 #include <FilletSurf_ErrorTypeStatus.hxx>
52 #include <TopAbs.hxx>
53 #include <DrawTrSurf.hxx>
54
55 #include <stdio.h>
56
57
58 static Standard_Real t3d = 1.e-4;
59 static Standard_Real t2d = 1.e-5;
60 static Standard_Real ta  = 1.e-2;
61 static Standard_Real fl  = 1.e-3;
62 static Standard_Real tapp_angle = 1.e-2;
63 static GeomAbs_Shape blend_cont = GeomAbs_C1;
64
65 static BRepFilletAPI_MakeFillet* Rakk = 0;
66 static BRepFilletAPI_MakeFillet* Rake = 0;
67 static char name[100];
68
69
70 static Standard_Integer contblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
71 {
72   if(narg ==1) {
73     //cout<<"tolerance angular of approximation  : "<< tapp_angle <<endl;
74     //cout<<"internal continuity                 : ";
75     di<<"tolerance angular of approximation  : "<< tapp_angle <<"\n";
76     di<<"internal continuity                 : ";
77     switch (blend_cont) {
78       case GeomAbs_C0:
79          //cout << ""<<endl;
80          di << "C0"<<"\n";
81          break;
82       case GeomAbs_C1:
83          //cout << "C1"<<endl;
84          di << "C1"<<"\n";
85          break;
86       case GeomAbs_C2:
87          //cout << "C2"<<endl;
88          di << "C2"<<"\n";
89          break;
90        default:
91          break;
92        }
93     return 0;
94   }
95   else {
96     if (narg >3) return 1;
97     if (narg == 3) {  tapp_angle = Abs(Draw::Atof(a[2])); }
98     char c=a[1][1];
99     switch (c) {
100     case '0':
101       blend_cont = GeomAbs_C0;
102       break;
103     case '2':
104       blend_cont = GeomAbs_C2;
105       break;
106     default :
107        blend_cont = GeomAbs_C1;    
108     }
109     return 0;
110   }
111 }
112
113 static void printtolblend(Draw_Interpretor& di)
114 {
115   //cout<<"tolerance ang : "<<ta<<endl;
116   //cout<<"tolerance 3d  : "<<t3d<<endl;
117   //cout<<"tolerance 2d  : "<<t2d<<endl;
118   //cout<<"fleche        : "<<fl<<endl;
119
120   //cout<<"tolblend "<<ta<<" "<<t3d<<" "<<t2d<<" "<<fl<<endl;
121
122   di<<"tolerance ang : "<<ta<<"\n";
123   di<<"tolerance 3d  : "<<t3d<<"\n";
124   di<<"tolerance 2d  : "<<t2d<<"\n";
125   di<<"fleche        : "<<fl<<"\n";
126
127   di<<"tolblend "<<ta<<" "<<t3d<<" "<<t2d<<" "<<fl<<"\n";
128 }
129
130 static Standard_Integer tolblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
131 {
132   if(narg == 1){
133     printtolblend(di);
134     return 0;
135   }
136   else if(narg == 5){
137     ta = Draw::Atof(a[1]);
138     t3d = Draw::Atof(a[2]);
139     t2d = Draw::Atof(a[3]);
140     fl = Draw::Atof(a[4]);
141     return 0;
142   }
143   return 1;
144 }
145 static Standard_Integer BLEND(Draw_Interpretor& di, Standard_Integer narg, const char** a)
146 {
147   if(Rakk != 0) {delete Rakk; Rakk = 0;}
148   printtolblend(di);
149   if (narg<5) return 1;
150   TopoDS_Shape V = DBRep::Get(a[2]);
151   if(V.IsNull()) return 1;
152   ChFi3d_FilletShape FSh = ChFi3d_Rational;
153   if (narg%2 == 0) {
154     if (!strcasecmp(a[narg-1], "Q")) {
155       FSh = ChFi3d_QuasiAngular;
156     }
157     else if (!strcasecmp(a[narg-1], "P")) {
158       FSh = ChFi3d_Polynomial;
159     }
160   }
161   Rakk = new BRepFilletAPI_MakeFillet(V,FSh);
162   Rakk->SetParams(ta,t3d,t2d,t3d,t2d,fl);
163   Rakk->SetContinuity(blend_cont, tapp_angle);
164   Standard_Real Rad;
165   TopoDS_Edge E;
166   Standard_Integer nbedge = 0;
167   for (Standard_Integer ii = 1; ii < (narg-1)/2; ii++){
168     Rad = Draw::Atof(a[2*ii + 1]);
169     TopoDS_Shape aLocalEdge(DBRep::Get(a[(2*ii+2)],TopAbs_EDGE));
170     E = TopoDS::Edge(aLocalEdge);
171 //    E = TopoDS::Edge(DBRep::Get(a[(2*ii+2)],TopAbs_EDGE));
172     if(!E.IsNull()){
173       Rakk->Add(Rad,E);
174       nbedge++;
175     }
176   }
177   if(!nbedge) return 1;
178   Rakk->Build();
179   if(!Rakk->IsDone()) return 1;
180   TopoDS_Shape res = Rakk->Shape();
181   DBRep::Set(a[1],res);
182   return 0;
183 }
184
185 static void PrintHist(const TopoDS_Shape& S,
186                       TopTools_ListIteratorOfListOfShape& It,
187                       Standard_Integer& nbgen)
188 {
189   TopoDS_Compound C;
190   BRep_Builder B;
191   B.MakeCompound(C);
192   B.Add(C,S);
193   char localname[100];
194   if(nbgen<10){
195     Sprintf(localname,"generated_00%d", nbgen++);
196   }
197   else if(nbgen<100){
198     Sprintf(localname,"generated_0%d", nbgen++);
199   }
200   else {
201     Sprintf(localname,"generated_%d", nbgen++);
202   }
203   for(; It.More(); It.Next()){
204     B.Add(C,It.Value());
205   }
206   DBRep::Set(localname,C);
207 }
208   
209 static Standard_Integer CheckHist(Draw_Interpretor& di, 
210                                   Standard_Integer , 
211                                   const char** )
212 {
213   if(Rakk == 0) {
214     //cout<<"No active Builder"<<endl;
215     di<<"No active Builder"<<"\n";
216     return 1;
217   }
218   if(!Rakk->IsDone()) {
219     //cout<<"Active Builder Not Done"<<endl;
220     di<<"Active Builder Not Done"<<"\n";
221     return 1;
222   }
223   Standard_Integer nbc = Rakk->NbContours();
224   Standard_Integer nbgen = 0;
225   TopTools_ListIteratorOfListOfShape It;
226   TopoDS_Shape curshape;
227   for(Standard_Integer i = 1; i <= nbc; i++){
228     curshape = Rakk->FirstVertex(i);
229     It.Initialize(Rakk->Generated(curshape));
230     PrintHist(curshape,It,nbgen);
231     Standard_Integer nbe = Rakk->NbEdges(i);
232     for(Standard_Integer j = 1; j <= nbe; j++){
233       curshape = Rakk->Edge(i,j);
234       It.Initialize(Rakk->Generated(curshape));
235       PrintHist(curshape,It,nbgen);
236     }
237     curshape = Rakk->LastVertex(i);
238     It.Initialize(Rakk->Generated(curshape));
239     PrintHist(curshape,It,nbgen);
240   }
241   //cout<<"foreach g [lsort [dir gen*]] { wclick; puts [dname $g]; donl $g; }"<<endl;
242   di<<"foreach g [lsort [dir gen*]] { wclick; puts [dname $g]; donl $g; }"<<"\n";
243   return 0;
244 }
245
246 static Standard_Integer MKEVOL(Draw_Interpretor& di, 
247                                Standard_Integer narg, 
248                                const char** a)
249 {
250   if(Rake != 0) {delete Rake; Rake = 0;}
251   printtolblend(di);
252   if (narg < 3) return 1;
253   TopoDS_Shape V = DBRep::Get(a[2]);
254   Rake = new BRepFilletAPI_MakeFillet(V);
255   Rake->SetParams(ta,t3d,t2d,t3d,t2d,fl);
256   Rake->SetContinuity(blend_cont, tapp_angle);
257   if (narg == 4) {
258     ChFi3d_FilletShape FSh = ChFi3d_Rational;
259     if (!strcasecmp(a[3], "Q")) {
260       FSh = ChFi3d_QuasiAngular;
261     }
262     else if (!strcasecmp(a[3], "P")) {
263       FSh = ChFi3d_Polynomial;
264     }
265     Rake->SetFilletShape(FSh);
266   }
267   strcpy(name, a[1]);
268   return 0;
269 }
270
271 static Standard_Integer UPDATEVOL(Draw_Interpretor& di, 
272                                   Standard_Integer narg, 
273                                   const char** a)
274 {
275   if(Rake == 0){
276     //cout << "MakeFillet not initialized"<<endl;
277     di << "MakeFillet not initialized"<<"\n";
278     return 1 ;
279   }
280   if(narg%2 != 0 || narg < 4) return 1;
281   TColgp_Array1OfPnt2d uandr(1,(narg/2)-1);
282   Standard_Real Rad, Par;
283   TopoDS_Shape aLocalEdge(DBRep::Get(a[1],TopAbs_EDGE));
284   TopoDS_Edge E = TopoDS::Edge(aLocalEdge);
285 //  TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[1],TopAbs_EDGE));
286   for (Standard_Integer ii = 1; ii <= (narg/2)-1; ii++){
287     Par = Draw::Atof(a[2*ii]);
288     Rad = Draw::Atof(a[2*ii + 1]);
289     uandr.ChangeValue(ii).SetCoord(Par,Rad);
290   }
291   Rake->Add(uandr,E);
292   return 0;
293 }
294
295 static Standard_Integer BUILDEVOL(Draw_Interpretor& di, 
296                                   Standard_Integer, 
297                                   const char**)
298 {
299   if(Rake == 0){
300     //cout << "MakeFillet not initialized"<<endl;
301     di << "MakeFillet not initialized"<<"\n";
302     return 1 ;
303   }
304   Rake->Build();
305   if(Rake->IsDone()){
306     TopoDS_Shape result = Rake->Shape();
307     DBRep::Set(name,result);
308     if(Rake != 0) {delete Rake; Rake = 0;}
309     return 0;
310   }
311   if(Rake != 0) {delete Rake; Rake = 0;}
312   return 1;
313 }
314
315
316
317
318 //**********************************************
319 // command fuse and cut with fillets *
320 //**********************************************
321
322 Standard_Integer topoblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
323 {
324   printtolblend(di);
325   if(narg != 5) return 1;
326   Standard_Boolean fuse  = !strcmp(a[0],"fubl");
327   TopoDS_Shape S1 = DBRep::Get(a[2]);
328   TopoDS_Shape S2 = DBRep::Get(a[3]);
329   Standard_Real Rad = Draw::Atof(a[4]);
330   BRepAlgo_BooleanOperation* BC;
331   if(fuse){
332     BC = new BRepAlgo_Fuse(S1,S2);
333   }
334   else{
335     BC = new BRepAlgo_Cut(S1,S2);
336   }
337   TopoDS_Shape ShapeCut = BC->Shape();
338   
339   Handle(TopOpeBRepBuild_HBuilder) build = BC->Builder();
340   TopTools_ListIteratorOfListOfShape its;
341   
342   TopoDS_Compound result;
343   BRep_Builder B; 
344   B.MakeCompound(result);
345   
346   TopExp_Explorer ex;
347   for (ex.Init(ShapeCut,TopAbs_SOLID); ex.More(); ex.Next()) {
348     const TopoDS_Shape& cutsol = ex.Current();  
349     
350     BRepFilletAPI_MakeFillet fill(cutsol);
351     fill.SetParams(ta,t3d,t2d,t3d,t2d,fl);
352     fill.SetContinuity(blend_cont, tapp_angle);
353     its = build->Section();
354     while (its.More()) {
355       TopoDS_Edge E = TopoDS::Edge(its.Value());
356       fill.Add(Rad,E);
357       its.Next();
358     }
359     
360     fill.Build();
361     if(fill.IsDone()){
362       B.Add(result,fill.Shape());
363     }
364     else {
365       B.Add(result,cutsol);
366     }
367   }
368   
369   delete BC;
370   DBRep::Set(a[1],result);
371   return 0;
372 }
373
374 //**********************************************
375 // bfuse or bcut and then blend the section
376 //**********************************************
377
378 Standard_Integer boptopoblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
379 {
380   printtolblend(di);
381   if(narg != 5) return 1;
382
383   Standard_Boolean fuse  = !strcmp(a[0],"bfuseblend");
384   TopoDS_Shape S1 = DBRep::Get(a[2]);
385   TopoDS_Shape S2 = DBRep::Get(a[3]);
386   if (S1.IsNull() || S2.IsNull()) {
387     printf(" Null shapes are not allowed \n");
388     return 1;
389   }
390   Standard_Real Rad = Draw::Atof(a[4]);
391
392   BOPAlgo_PaveFiller theDSFiller;
393   BOPCol_ListOfShape aLS;
394   aLS.Append(S1); 
395   aLS.Append(S2); 
396   theDSFiller.SetArguments(aLS);
397   //
398   theDSFiller.Perform();
399   if (theDSFiller.ErrorStatus()) {
400     printf("Check types of the arguments, please\n");
401     return 1;
402   }
403
404   BRepAlgoAPI_BooleanOperation* pBuilder=NULL;
405
406   if (fuse)
407     pBuilder = new BRepAlgoAPI_Fuse( S1, S2, theDSFiller );
408   else
409     pBuilder = new BRepAlgoAPI_Cut ( S1, S2, theDSFiller );
410
411   Standard_Boolean anIsDone = pBuilder->IsDone();
412   if (!anIsDone)
413     {
414       printf("boolean operation not done ErrorStatus()=%d\n", pBuilder->ErrorStatus());
415       return 1;
416     }
417
418   TopoDS_Shape ResultOfBop = pBuilder->Shape();
419   
420   delete pBuilder;
421   pBuilder = new BRepAlgoAPI_Section( S1, S2, theDSFiller );
422   TopoDS_Shape theSection = pBuilder->Shape();
423
424   TopoDS_Compound result;
425   BRep_Builder BB; 
426   BB.MakeCompound(result);
427   
428   TopExp_Explorer Explo( ResultOfBop, TopAbs_SOLID );
429   for (; Explo.More(); Explo.Next())
430     {
431       const TopoDS_Shape& aSolid = Explo.Current();
432
433       BRepFilletAPI_MakeFillet Blender(aSolid);
434       Blender.SetParams(ta,t3d,t2d,t3d,t2d,fl);
435       Blender.SetContinuity( blend_cont, tapp_angle );
436
437       TopExp_Explorer expsec( theSection, TopAbs_EDGE );
438       for (; expsec.More(); expsec.Next())
439         {
440           TopoDS_Edge anEdge = TopoDS::Edge(expsec.Current());
441           Blender.Add( Rad, anEdge );
442         }
443
444       Blender.Build();
445       if (Blender.IsDone())
446         BB.Add( result, Blender.Shape() );
447       else
448         BB.Add( result, aSolid );
449     }
450
451   delete pBuilder;
452   DBRep::Set( a[1], result );
453   return 0;
454 }
455
456
457 static Standard_Integer blend1(Draw_Interpretor& di, Standard_Integer narg, const char** a)
458 {
459   if (narg<5) return 1;
460   TopoDS_Shape V = DBRep::Get(a[2]);
461   if(V.IsNull()) return 1;
462   Standard_Integer nb ,i;
463   Standard_Real Rad;
464   Standard_Boolean simul=Standard_False;
465   const char *ns0=(a[1]);
466   Rad = Draw::Atof(a[3]);
467   TopTools_ListOfShape E;
468   for (i=4; i <=(narg-1) ; i++){
469     TopoDS_Shape edge= DBRep::Get(a[i],TopAbs_EDGE);
470    if (edge.IsNull()) return 1 ;
471    if(edge.ShapeType()!=TopAbs_EDGE) return 1;
472     E.Append(edge);
473   } 
474   FilletSurf_Builder aRakk(V,E,Rad);
475   if (simul) aRakk.Simulate();
476   else  aRakk.Perform();
477
478   //if (Rakk.IsDone()==FilletSurf_IsNotOk) 
479   // { FilletSurf_ErrorTypeStatus err=Rakk.StatusError();
480   //   if (err==FilletSurf_EmptyList) cout<< "StatusError=EmptyList"<<endl;
481   //   else if (err==FilletSurf_EdgeNotG1) cout<< "StatusError=NotG1"<<endl;
482   //   else if (err==FilletSurf_FacesNotG1) cout<< "StatusError=facesNotG1"<<endl;   
483   //   else if (err==FilletSurf_EdgeNotOnShape) 
484   //   cout<< "StatusError=edgenotonshape"<<endl;
485   //   else if (err==FilletSurf_NotSharpEdge ) cout<< "StatusError=notsharpedge"<<endl;
486   //   else if (err==FilletSurf_PbFilletCompute) cout <<"StatusError=PBFillet"<<endl;
487   // }
488   // else {
489   //  if (Rakk.IsDone()==FilletSurf_IsPartial) cout <<"resultat partiel"<<endl; 
490   if (aRakk.IsDone()==FilletSurf_IsNotOk)
491    { FilletSurf_ErrorTypeStatus err=aRakk.StatusError();
492      if (err==FilletSurf_EmptyList) di<< "StatusError=EmptyList"<<"\n";
493      else if (err==FilletSurf_EdgeNotG1) di<< "StatusError=NotG1"<<"\n";
494      else if (err==FilletSurf_FacesNotG1) di<< "StatusError=facesNotG1"<<"\n";
495      else if (err==FilletSurf_EdgeNotOnShape)
496      di<< "StatusError=edgenotonshape"<<"\n";
497      else if (err==FilletSurf_NotSharpEdge ) di<< "StatusError=notsharpedge"<<"\n";
498      else if (err==FilletSurf_PbFilletCompute) di <<"StatusError=PBFillet"<<"\n";
499    }
500    else {
501     if (aRakk.IsDone()==FilletSurf_IsPartial) di <<"partial result"<<"\n";
502  
503     nb=aRakk.NbSurface();
504     char localname [100];
505     char *temp; 
506     
507     // affichage du type d'arret 
508     
509    if (!simul)
510    { 
511     //if (Rakk.StartSectionStatus()==FilletSurf_NoExtremityOnEdge)
512     //  {cout<<" type deb conges = WLBLOUT"<<endl;}
513     //else if (Rakk.StartSectionStatus()==FilletSurf_OneExtremityOnEdge )
514     //  { cout<<" type deb conges = WLBLSTOP"<<endl;}
515     //else if (Rakk.StartSectionStatus()==FilletSurf_TwoExtremityOnEdge)
516     //  {cout<<" type deb conges = WLBLEND"<<endl;}
517     if (aRakk.StartSectionStatus()==FilletSurf_NoExtremityOnEdge)
518       {di<<" type start fillets = WLBLOUT"<<"\n";}
519     else if (aRakk.StartSectionStatus()==FilletSurf_OneExtremityOnEdge)
520       { di<<" type start fillets = WLBLSTOP"<<"\n";}
521     else if (aRakk.StartSectionStatus()==FilletSurf_TwoExtremityOnEdge)
522       {di<<" type start fillets = WLBLEND"<<"\n";}
523     
524     //if (Rakk.EndSectionStatus()==FilletSurf_NoExtremityOnEdge) 
525     //  {cout<<" type fin  conges = WLBLOUT"<<endl;}
526     //else if (Rakk.EndSectionStatus()==FilletSurf_OneExtremityOnEdge) 
527     //  {cout<<" type fin  conges = WLBLSTOP"<<endl;}
528     //else if (Rakk.EndSectionStatus()==FilletSurf_TwoExtremityOnEdge) 
529     //  { cout<<" type fin  conges = WLBLEND"<<endl;}
530     if (aRakk.EndSectionStatus()==FilletSurf_NoExtremityOnEdge)
531       {di<<" type end fillets = WLBLOUT"<<"\n";}
532     else if (aRakk.EndSectionStatus()==FilletSurf_OneExtremityOnEdge)
533       {di<<" type end fillets = WLBLSTOP"<<"\n";}
534     else if (aRakk.EndSectionStatus()==FilletSurf_TwoExtremityOnEdge)
535       { di<<" type end fillets = WLBLEND"<<"\n";}
536     Standard_Real f,l;
537     f = aRakk.FirstParameter();
538     l = aRakk.LastParameter();
539     //cout<<"parameter on edge start : "<<f<<endl;
540     //cout<<"parameter on edge end   : "<<l<<endl;
541     di<<"parametre on edge start : "<<f<<"\n";
542     di<<"parametre on edge end   : "<<l<<"\n";
543     for (i=1;i<=nb;i++){
544       //precision 
545       //cout<<"precision "<< i << "= "<<Rakk.TolApp3d(i)<<endl;
546       di<<"precision "<< i << "= "<<aRakk.TolApp3d(i)<<"\n";
547       
548       // display resulting surfaces  
549       Sprintf(localname, "%s%d" ,ns0,i);
550       temp = localname;
551       DrawTrSurf::Set(temp,aRakk.SurfaceFillet(i));
552       di << localname<< " ";
553       
554       // display curves 3d 
555       Sprintf(localname, "%s%d" ,"courb1",i);
556       temp =localname; 
557       DrawTrSurf::Set(temp,aRakk.CurveOnFace1(i));
558       di << localname<< " ";
559       Sprintf(localname, "%s%d" ,"courb2",i);
560       temp =localname;
561       DrawTrSurf::Set(temp,aRakk.CurveOnFace2(i));
562       di << localname<< " ";     
563       
564       // display supports 
565       Sprintf(localname, "%s%d" ,"face1",i);
566       temp =localname ;
567       DBRep::Set(temp,aRakk.SupportFace1(i));
568       di << localname<< " ";
569       Sprintf(localname, "%s%d" ,"face2",i);
570       temp =localname; 
571       DBRep::Set(temp,aRakk.SupportFace2(i));
572       di << localname<< " ";
573       
574       // display Pcurves on faces 
575       Sprintf(localname, "%s%d" ,"pcurveonface1",i);
576       temp =localname ;
577       DrawTrSurf::Set(temp,aRakk.PCurveOnFace1(i));
578       di << localname<< " ";
579       Sprintf(localname, "%s%d" ,"pcurveonface2",i);
580       temp =localname; 
581       DrawTrSurf::Set(temp,aRakk.PCurveOnFace2(i));
582       di << localname<< " ";
583       
584       // display Pcurves on the fillet
585       Sprintf(localname, "%s%d" ,"pcurveonconge1",i);
586       temp =localname;
587       DrawTrSurf::Set(temp,aRakk.PCurve1OnFillet(i));
588       di << localname<< " ";
589       Sprintf(localname, "%s%d" ,"pcurveonconge2",i);
590       temp =localname; 
591       DrawTrSurf::Set(temp,aRakk.PCurve2OnFillet(i));
592       di << localname<< " ";
593       
594     } }
595    else{
596    Standard_Integer j;
597   
598    for (i=1;i<=nb;i++)
599     {Standard_Integer s=aRakk.NbSection(i);
600     for (j=1;j<=s;j++)
601      {Handle(Geom_TrimmedCurve Sec);
602      aRakk.Section(i,j,Sec);
603     Sprintf(localname, "%s%d%d" ,"sec",i,j);
604      temp =localname;
605     DrawTrSurf::Set (temp,Sec);
606     di << localname<< " ";}
607    }}
608  }
609   return 0;
610 }
611
612 //=======================================================================
613 //function : rollingball
614 //purpose  : 
615 //=======================================================================
616
617 Standard_Integer rollingball(Draw_Interpretor& di, Standard_Integer n, const char** a)
618 {
619   if ( n < 2) return 1;
620
621   TopoDS_Shape S = DBRep::Get(a[2]);
622   if ( S.IsNull()) return 1;
623   Standard_Real Rad = Draw::Atof(a[3]);
624   
625   Standard_Real Tol = t3d; //the same as blend ! 1.e-7;
626   
627   BiTgte_Blend Roll;
628   Roll.Init(S,Rad,Tol,Standard_False);
629   
630   Standard_Integer Nb = 0;
631   for ( Standard_Integer i = 4; i <= n-1; i++) {
632     if ( !strcmp(a[i],"@")) {
633       Nb++;
634       continue;
635     }
636
637     if ( Nb == 0) { // return stop faces.
638       TopoDS_Shape aLocalFace(DBRep::Get(a[i],TopAbs_FACE));
639       TopoDS_Face F1 = TopoDS::Face(aLocalFace);
640 //      TopoDS_Face F1 = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
641       if ( F1.IsNull()) {
642         //cout << " Stop face not referenced." << endl;
643         di << " Stop face not referenced." << "\n";
644         return 1;
645       }
646       Roll.SetStoppingFace(F1);
647     }
648     else if (Nb == 1) { // return faces on which the ball rotates
649       TopoDS_Shape aLocalFace(DBRep::Get(a[i],TopAbs_FACE));
650       TopoDS_Face F1 = TopoDS::Face(aLocalFace);
651 //      TopoDS_Face F1 = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
652       i++;
653       if ( !strcmp(a[i],"@")) {
654         //cout << " Even number of ball support faces is required " << endl;
655         di << " Even number of ball support faces is required " << "\n";
656         return 1;
657       }
658       aLocalFace = DBRep::Get(a[i],TopAbs_FACE);
659       TopoDS_Face F2 = TopoDS::Face(aLocalFace);
660 //      TopoDS_Face F2 = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
661       if ( F1.IsNull() || F2.IsNull()) {
662         //cout << " Support face not referenced." << endl;
663         di << " Support face not referenced." << "\n";
664         return 1;
665       }
666       Roll.SetFaces(F1,F2);
667     }
668     else if (Nb == 2) { // return the edge on which the ball rotates
669       TopoDS_Shape aLocalShape(DBRep::Get(a[i],TopAbs_EDGE));
670       TopoDS_Edge E = TopoDS::Edge(aLocalShape);
671 //      TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[i],TopAbs_EDGE));
672       if ( E.IsNull()) {
673         //cout << " Edge not referenced." << endl;
674         di << " Edge not referenced." << "\n";
675         return 1;
676       }
677       Roll.SetEdge(E);
678     }
679
680   }
681   Standard_Boolean BuildShape = (!strcmp(a[0],"brollingball"));
682
683   Roll.Perform(BuildShape);
684
685   Standard_Boolean ComputeBranches = (!strcmp(a[0],"trollingball"));
686   char localname[100];
687   if (ComputeBranches) {
688     Standard_Integer NbBranches = Roll.NbBranches();
689     for (Standard_Integer i = 1; i <= NbBranches; i++) {
690       Standard_Integer From,To;
691       Roll.IndicesOfBranche(i,From,To);
692       //cout << " Indexes of the " << i << "th Branch : ";
693       //cout << "   " << From << "     " << To << endl;
694       di << " Indexes of the " << i << "th Branch : ";
695       di << "   " << From << "     " << To << "\n";
696       for (Standard_Integer j = From; j <= To; j++) {
697         const TopoDS_Shape& CurF = Roll.Face(j);
698         Sprintf(localname,"%s_%d_%d",a[1],i,j);
699         DBRep::Set(localname,CurF);
700       }
701     }
702     
703   }
704   else 
705     DBRep::Set(a[1],Roll.Shape());
706
707   return 0;
708 }
709
710 //=======================================================================
711 //function : FilletCommands
712 //purpose  : 
713 //=======================================================================
714
715 void  BRepTest::FilletCommands(Draw_Interpretor& theCommands)
716 {
717   static Standard_Boolean done = Standard_False;
718   if (done) return;
719   done = Standard_True;
720
721   DBRep::BasicCommands(theCommands);
722
723   const char* g = "TOPOLOGY Fillet construction commands";
724    
725   theCommands.Add("continuityblend",
726                   "continuityblend C0/C1/C2  [tangle]",__FILE__,
727                   contblend,g);
728
729   theCommands.Add("tolblend",
730                   "tolblend [ta t3d t2d fl]",__FILE__,
731                   tolblend,g);
732
733   theCommands.Add("blend",
734                   "blend result object rad1 ed1 rad2 ed2 ... [R/Q/P]",__FILE__,
735                   BLEND,g);
736
737   theCommands.Add("checkhist",
738                   "checkhist",__FILE__,
739                   CheckHist,g);
740
741   theCommands.Add("mkevol",
742                   "mkevol result object (then use updatevol) [R/Q/P]",__FILE__,
743                   MKEVOL,g);
744
745   theCommands.Add("updatevol",
746                   "updatevol edge u1 rad1 u2 rad2 ...",__FILE__,
747                   UPDATEVOL,g);
748
749   theCommands.Add("buildevol",
750                   "buildevol end of the evol fillet computation",__FILE__,
751                   BUILDEVOL,g);
752
753   theCommands.Add("fubl",
754                   "fubl result shape1 shape2 radius",__FILE__,
755                   topoblend,g);
756   
757   theCommands.Add("cubl",
758                   "cubl result shape tool radius",__FILE__,
759                   topoblend,g);
760
761   theCommands.Add("bfuseblend",
762                   "bfuseblend result shape1 shape2 radius",__FILE__,
763                   boptopoblend,g);
764   
765   theCommands.Add("bcutblend",
766                   "bcutblend result shape tool radius",__FILE__,
767                   boptopoblend,g);
768
769   theCommands.Add("blend1",
770                   "blend1 result object rad ed1  ed2 ...",__FILE__,
771                   blend1,g); 
772
773   theCommands.Add("rollingball",
774                   "rollingball  r S radius [stopf1 ..] @ [f1 f2 ..] @ [e1 ..]",
775                   __FILE__,
776                   rollingball);
777
778   theCommands.Add("brollingball",
779                   "brollingball r S radius [stopf1 ..] @ [f1 f2 ..] @ [e1 ..]",
780                   __FILE__,
781                   rollingball);
782
783   theCommands.Add("trollingball",
784                   "trollingball r S radius [stopf1 ..] @ [f1 f2 ..] @ [e1 ..]",
785                   __FILE__,
786                   rollingball);
787 }