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