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
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <BRepTest.hxx>
18 #include <TColgp_Array1OfPnt2d.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>
36 #include <TopExp_Explorer.hxx>
38 //#include <BOPTools_DSFiller.hxx>
39 #include <BOPAlgo_PaveFiller.hxx>
41 #include <BRepAlgoAPI_BooleanOperation.hxx>
42 #include <BRepAlgoAPI_Fuse.hxx>
43 #include <BRepAlgoAPI_Cut.hxx>
44 #include <BRepAlgoAPI_Section.hxx>
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>
53 #include <DrawTrSurf.hxx>
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;
65 static BRepFilletAPI_MakeFillet* Rakk = 0;
66 static BRepFilletAPI_MakeFillet* Rake = 0;
67 static char name[100];
70 static Standard_Integer contblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
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 : ";
96 if (narg >3) return 1;
97 if (narg == 3) { tapp_angle = Abs(Draw::Atof(a[2])); }
101 blend_cont = GeomAbs_C0;
104 blend_cont = GeomAbs_C2;
107 blend_cont = GeomAbs_C1;
113 static void printtolblend(Draw_Interpretor& di)
115 //cout<<"tolerance ang : "<<ta<<endl;
116 //cout<<"tolerance 3d : "<<t3d<<endl;
117 //cout<<"tolerance 2d : "<<t2d<<endl;
118 //cout<<"fleche : "<<fl<<endl;
120 //cout<<"tolblend "<<ta<<" "<<t3d<<" "<<t2d<<" "<<fl<<endl;
122 di<<"tolerance ang : "<<ta<<"\n";
123 di<<"tolerance 3d : "<<t3d<<"\n";
124 di<<"tolerance 2d : "<<t2d<<"\n";
125 di<<"fleche : "<<fl<<"\n";
127 di<<"tolblend "<<ta<<" "<<t3d<<" "<<t2d<<" "<<fl<<"\n";
130 static Standard_Integer tolblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
137 ta = Draw::Atof(a[1]);
138 t3d = Draw::Atof(a[2]);
139 t2d = Draw::Atof(a[3]);
140 fl = Draw::Atof(a[4]);
145 static Standard_Integer BLEND(Draw_Interpretor& di, Standard_Integer narg, const char** a)
147 if(Rakk != 0) {delete Rakk; Rakk = 0;}
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;
154 if (!strcasecmp(a[narg-1], "Q")) {
155 FSh = ChFi3d_QuasiAngular;
157 else if (!strcasecmp(a[narg-1], "P")) {
158 FSh = ChFi3d_Polynomial;
161 Rakk = new BRepFilletAPI_MakeFillet(V,FSh);
162 Rakk->SetParams(ta,t3d,t2d,t3d,t2d,fl);
163 Rakk->SetContinuity(blend_cont, tapp_angle);
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));
177 if(!nbedge) return 1;
179 if(!Rakk->IsDone()) return 1;
180 TopoDS_Shape res = Rakk->Shape();
181 DBRep::Set(a[1],res);
185 static void PrintHist(const TopoDS_Shape& S,
186 TopTools_ListIteratorOfListOfShape& It,
187 Standard_Integer& nbgen)
195 Sprintf(localname,"generated_00%d", nbgen++);
198 Sprintf(localname,"generated_0%d", nbgen++);
201 Sprintf(localname,"generated_%d", nbgen++);
203 for(; It.More(); It.Next()){
206 DBRep::Set(localname,C);
209 static Standard_Integer CheckHist(Draw_Interpretor& di,
214 //cout<<"No active Builder"<<endl;
215 di<<"No active Builder"<<"\n";
218 if(!Rakk->IsDone()) {
219 //cout<<"Active Builder Not Done"<<endl;
220 di<<"Active Builder Not Done"<<"\n";
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);
237 curshape = Rakk->LastVertex(i);
238 It.Initialize(Rakk->Generated(curshape));
239 PrintHist(curshape,It,nbgen);
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";
246 static Standard_Integer MKEVOL(Draw_Interpretor& di,
247 Standard_Integer narg,
250 if(Rake != 0) {delete Rake; Rake = 0;}
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);
258 ChFi3d_FilletShape FSh = ChFi3d_Rational;
259 if (!strcasecmp(a[3], "Q")) {
260 FSh = ChFi3d_QuasiAngular;
262 else if (!strcasecmp(a[3], "P")) {
263 FSh = ChFi3d_Polynomial;
265 Rake->SetFilletShape(FSh);
271 static Standard_Integer UPDATEVOL(Draw_Interpretor& di,
272 Standard_Integer narg,
276 //cout << "MakeFillet not initialized"<<endl;
277 di << "MakeFillet not initialized"<<"\n";
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);
295 static Standard_Integer BUILDEVOL(Draw_Interpretor& di,
300 //cout << "MakeFillet not initialized"<<endl;
301 di << "MakeFillet not initialized"<<"\n";
306 TopoDS_Shape result = Rake->Shape();
307 DBRep::Set(name,result);
308 if(Rake != 0) {delete Rake; Rake = 0;}
311 if(Rake != 0) {delete Rake; Rake = 0;}
318 //**********************************************
319 // command fuse and cut with fillets *
320 //**********************************************
322 Standard_Integer topoblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
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;
332 BC = new BRepAlgo_Fuse(S1,S2);
335 BC = new BRepAlgo_Cut(S1,S2);
337 TopoDS_Shape ShapeCut = BC->Shape();
339 Handle(TopOpeBRepBuild_HBuilder) build = BC->Builder();
340 TopTools_ListIteratorOfListOfShape its;
342 TopoDS_Compound result;
344 B.MakeCompound(result);
347 for (ex.Init(ShapeCut,TopAbs_SOLID); ex.More(); ex.Next()) {
348 const TopoDS_Shape& cutsol = ex.Current();
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();
355 TopoDS_Edge E = TopoDS::Edge(its.Value());
362 B.Add(result,fill.Shape());
365 B.Add(result,cutsol);
370 DBRep::Set(a[1],result);
374 //**********************************************
375 // bfuse or bcut and then blend the section
376 //**********************************************
378 Standard_Integer boptopoblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
383 cout << "Use <command name> result shape1 shape2 radius [-d]" << endl;
387 Standard_Boolean fuse = !strcmp(a[0],"bfuseblend");
388 TopoDS_Shape S1 = DBRep::Get(a[2]);
389 TopoDS_Shape S2 = DBRep::Get(a[3]);
390 if (S1.IsNull() || S2.IsNull()) {
391 printf(" Null shapes are not allowed \n");
394 Standard_Real Rad = Draw::Atof(a[4]);
395 Standard_Boolean isDebug = Standard_False;
399 if(!strcmp(a[5], "-d"))
401 isDebug = Standard_True;
405 BOPAlgo_PaveFiller theDSFiller;
406 BOPCol_ListOfShape aLS;
409 theDSFiller.SetArguments(aLS);
411 theDSFiller.Perform();
412 if (theDSFiller.ErrorStatus()) {
413 printf("Check types of the arguments, please\n");
417 BRepAlgoAPI_BooleanOperation* pBuilder=NULL;
420 pBuilder = new BRepAlgoAPI_Fuse( S1, S2, theDSFiller );
422 pBuilder = new BRepAlgoAPI_Cut ( S1, S2, theDSFiller );
424 Standard_Boolean anIsDone = pBuilder->IsDone();
427 printf("boolean operation not done ErrorStatus()=%d\n", pBuilder->ErrorStatus());
431 TopoDS_Shape ResultOfBop = pBuilder->Shape();
435 const int aStrLen = 1000;
441 DBRep::Set( strcat(aBuff, "_bop"), ResultOfBop );
443 di << "Intermediate result of BOP-operation is saved to \"" << aBuff << "\" variable\n";
446 pBuilder = new BRepAlgoAPI_Section( S1, S2, theDSFiller );
447 TopoDS_Shape theSection = pBuilder->Shape();
452 DBRep::Set( strcat(aBuff, "_sec"), theSection );
453 di << "Intermediate bopsection result is saved to \"" << aBuff << "\" variable\n";
456 TopoDS_Compound result;
458 BB.MakeCompound(result);
460 TopExp_Explorer Explo( ResultOfBop, TopAbs_SOLID );
461 for (; Explo.More(); Explo.Next())
463 const TopoDS_Shape& aSolid = Explo.Current();
465 BRepFilletAPI_MakeFillet Blender(aSolid);
466 Blender.SetParams(ta,t3d,t2d,t3d,t2d,fl);
467 Blender.SetContinuity( blend_cont, tapp_angle );
469 TopExp_Explorer expsec( theSection, TopAbs_EDGE );
470 for (; expsec.More(); expsec.Next())
472 TopoDS_Edge anEdge = TopoDS::Edge(expsec.Current());
473 Blender.Add( Rad, anEdge );
477 if (Blender.IsDone())
478 BB.Add( result, Blender.Shape() );
481 di << "Error: Cannot find the result of BLEND-operation."
482 " The result of BOP operation will be returned.\n";
483 BB.Add( result, aSolid );
488 DBRep::Set( a[1], result );
493 static Standard_Integer blend1(Draw_Interpretor& di, Standard_Integer narg, const char** a)
495 if (narg<5) return 1;
496 TopoDS_Shape V = DBRep::Get(a[2]);
497 if(V.IsNull()) return 1;
498 Standard_Integer nb ,i;
500 Standard_Boolean simul=Standard_False;
501 const char *ns0=(a[1]);
502 Rad = Draw::Atof(a[3]);
503 TopTools_ListOfShape E;
504 for (i=4; i <=(narg-1) ; i++){
505 TopoDS_Shape edge= DBRep::Get(a[i],TopAbs_EDGE);
506 if (edge.IsNull()) return 1 ;
507 if(edge.ShapeType()!=TopAbs_EDGE) return 1;
510 FilletSurf_Builder aRakk(V,E,Rad);
511 if (simul) aRakk.Simulate();
512 else aRakk.Perform();
514 //if (Rakk.IsDone()==FilletSurf_IsNotOk)
515 // { FilletSurf_ErrorTypeStatus err=Rakk.StatusError();
516 // if (err==FilletSurf_EmptyList) cout<< "StatusError=EmptyList"<<endl;
517 // else if (err==FilletSurf_EdgeNotG1) cout<< "StatusError=NotG1"<<endl;
518 // else if (err==FilletSurf_FacesNotG1) cout<< "StatusError=facesNotG1"<<endl;
519 // else if (err==FilletSurf_EdgeNotOnShape)
520 // cout<< "StatusError=edgenotonshape"<<endl;
521 // else if (err==FilletSurf_NotSharpEdge ) cout<< "StatusError=notsharpedge"<<endl;
522 // else if (err==FilletSurf_PbFilletCompute) cout <<"StatusError=PBFillet"<<endl;
525 // if (Rakk.IsDone()==FilletSurf_IsPartial) cout <<"resultat partiel"<<endl;
526 if (aRakk.IsDone()==FilletSurf_IsNotOk)
527 { FilletSurf_ErrorTypeStatus err=aRakk.StatusError();
528 if (err==FilletSurf_EmptyList) di<< "StatusError=EmptyList"<<"\n";
529 else if (err==FilletSurf_EdgeNotG1) di<< "StatusError=NotG1"<<"\n";
530 else if (err==FilletSurf_FacesNotG1) di<< "StatusError=facesNotG1"<<"\n";
531 else if (err==FilletSurf_EdgeNotOnShape)
532 di<< "StatusError=edgenotonshape"<<"\n";
533 else if (err==FilletSurf_NotSharpEdge ) di<< "StatusError=notsharpedge"<<"\n";
534 else if (err==FilletSurf_PbFilletCompute) di <<"StatusError=PBFillet"<<"\n";
537 if (aRakk.IsDone()==FilletSurf_IsPartial) di <<"partial result"<<"\n";
539 nb=aRakk.NbSurface();
540 char localname [100];
543 // affichage du type d'arret
547 //if (Rakk.StartSectionStatus()==FilletSurf_NoExtremityOnEdge)
548 // {cout<<" type deb conges = WLBLOUT"<<endl;}
549 //else if (Rakk.StartSectionStatus()==FilletSurf_OneExtremityOnEdge )
550 // { cout<<" type deb conges = WLBLSTOP"<<endl;}
551 //else if (Rakk.StartSectionStatus()==FilletSurf_TwoExtremityOnEdge)
552 // {cout<<" type deb conges = WLBLEND"<<endl;}
553 if (aRakk.StartSectionStatus()==FilletSurf_NoExtremityOnEdge)
554 {di<<" type start fillets = WLBLOUT"<<"\n";}
555 else if (aRakk.StartSectionStatus()==FilletSurf_OneExtremityOnEdge)
556 { di<<" type start fillets = WLBLSTOP"<<"\n";}
557 else if (aRakk.StartSectionStatus()==FilletSurf_TwoExtremityOnEdge)
558 {di<<" type start fillets = WLBLEND"<<"\n";}
560 //if (Rakk.EndSectionStatus()==FilletSurf_NoExtremityOnEdge)
561 // {cout<<" type fin conges = WLBLOUT"<<endl;}
562 //else if (Rakk.EndSectionStatus()==FilletSurf_OneExtremityOnEdge)
563 // {cout<<" type fin conges = WLBLSTOP"<<endl;}
564 //else if (Rakk.EndSectionStatus()==FilletSurf_TwoExtremityOnEdge)
565 // { cout<<" type fin conges = WLBLEND"<<endl;}
566 if (aRakk.EndSectionStatus()==FilletSurf_NoExtremityOnEdge)
567 {di<<" type end fillets = WLBLOUT"<<"\n";}
568 else if (aRakk.EndSectionStatus()==FilletSurf_OneExtremityOnEdge)
569 {di<<" type end fillets = WLBLSTOP"<<"\n";}
570 else if (aRakk.EndSectionStatus()==FilletSurf_TwoExtremityOnEdge)
571 { di<<" type end fillets = WLBLEND"<<"\n";}
573 f = aRakk.FirstParameter();
574 l = aRakk.LastParameter();
575 //cout<<"parameter on edge start : "<<f<<endl;
576 //cout<<"parameter on edge end : "<<l<<endl;
577 di<<"parametre on edge start : "<<f<<"\n";
578 di<<"parametre on edge end : "<<l<<"\n";
581 //cout<<"precision "<< i << "= "<<Rakk.TolApp3d(i)<<endl;
582 di<<"precision "<< i << "= "<<aRakk.TolApp3d(i)<<"\n";
584 // display resulting surfaces
585 Sprintf(localname, "%s%d" ,ns0,i);
587 DrawTrSurf::Set(temp,aRakk.SurfaceFillet(i));
588 di << localname<< " ";
591 Sprintf(localname, "%s%d" ,"courb1",i);
593 DrawTrSurf::Set(temp,aRakk.CurveOnFace1(i));
594 di << localname<< " ";
595 Sprintf(localname, "%s%d" ,"courb2",i);
597 DrawTrSurf::Set(temp,aRakk.CurveOnFace2(i));
598 di << localname<< " ";
601 Sprintf(localname, "%s%d" ,"face1",i);
603 DBRep::Set(temp,aRakk.SupportFace1(i));
604 di << localname<< " ";
605 Sprintf(localname, "%s%d" ,"face2",i);
607 DBRep::Set(temp,aRakk.SupportFace2(i));
608 di << localname<< " ";
610 // display Pcurves on faces
611 Sprintf(localname, "%s%d" ,"pcurveonface1",i);
613 DrawTrSurf::Set(temp,aRakk.PCurveOnFace1(i));
614 di << localname<< " ";
615 Sprintf(localname, "%s%d" ,"pcurveonface2",i);
617 DrawTrSurf::Set(temp,aRakk.PCurveOnFace2(i));
618 di << localname<< " ";
620 // display Pcurves on the fillet
621 Sprintf(localname, "%s%d" ,"pcurveonconge1",i);
623 DrawTrSurf::Set(temp,aRakk.PCurve1OnFillet(i));
624 di << localname<< " ";
625 Sprintf(localname, "%s%d" ,"pcurveonconge2",i);
627 DrawTrSurf::Set(temp,aRakk.PCurve2OnFillet(i));
628 di << localname<< " ";
635 {Standard_Integer s=aRakk.NbSection(i);
637 {Handle(Geom_TrimmedCurve) Sec;
638 aRakk.Section(i,j,Sec);
639 Sprintf(localname, "%s%d%d" ,"sec",i,j);
641 DrawTrSurf::Set (temp,Sec);
642 di << localname<< " ";}
648 //=======================================================================
649 //function : rollingball
651 //=======================================================================
653 Standard_Integer rollingball(Draw_Interpretor& di, Standard_Integer n, const char** a)
655 if ( n < 2) return 1;
657 TopoDS_Shape S = DBRep::Get(a[2]);
658 if ( S.IsNull()) return 1;
659 Standard_Real Rad = Draw::Atof(a[3]);
661 Standard_Real Tol = t3d; //the same as blend ! 1.e-7;
664 Roll.Init(S,Rad,Tol,Standard_False);
666 Standard_Integer Nb = 0;
667 for ( Standard_Integer i = 4; i <= n-1; i++) {
668 if ( !strcmp(a[i],"@")) {
673 if ( Nb == 0) { // return stop faces.
674 TopoDS_Shape aLocalFace(DBRep::Get(a[i],TopAbs_FACE));
675 TopoDS_Face F1 = TopoDS::Face(aLocalFace);
676 // TopoDS_Face F1 = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
678 //cout << " Stop face not referenced." << endl;
679 di << " Stop face not referenced." << "\n";
682 Roll.SetStoppingFace(F1);
684 else if (Nb == 1) { // return faces on which the ball rotates
685 TopoDS_Shape aLocalFace(DBRep::Get(a[i],TopAbs_FACE));
686 TopoDS_Face F1 = TopoDS::Face(aLocalFace);
687 // TopoDS_Face F1 = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
689 if ( !strcmp(a[i],"@")) {
690 //cout << " Even number of ball support faces is required " << endl;
691 di << " Even number of ball support faces is required " << "\n";
694 aLocalFace = DBRep::Get(a[i],TopAbs_FACE);
695 TopoDS_Face F2 = TopoDS::Face(aLocalFace);
696 // TopoDS_Face F2 = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
697 if ( F1.IsNull() || F2.IsNull()) {
698 //cout << " Support face not referenced." << endl;
699 di << " Support face not referenced." << "\n";
702 Roll.SetFaces(F1,F2);
704 else if (Nb == 2) { // return the edge on which the ball rotates
705 TopoDS_Shape aLocalShape(DBRep::Get(a[i],TopAbs_EDGE));
706 TopoDS_Edge E = TopoDS::Edge(aLocalShape);
707 // TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[i],TopAbs_EDGE));
709 //cout << " Edge not referenced." << endl;
710 di << " Edge not referenced." << "\n";
717 Standard_Boolean BuildShape = (!strcmp(a[0],"brollingball"));
719 Roll.Perform(BuildShape);
721 Standard_Boolean ComputeBranches = (!strcmp(a[0],"trollingball"));
723 if (ComputeBranches) {
724 Standard_Integer NbBranches = Roll.NbBranches();
725 for (Standard_Integer i = 1; i <= NbBranches; i++) {
726 Standard_Integer From,To;
727 Roll.IndicesOfBranche(i,From,To);
728 //cout << " Indexes of the " << i << "th Branch : ";
729 //cout << " " << From << " " << To << endl;
730 di << " Indexes of the " << i << "th Branch : ";
731 di << " " << From << " " << To << "\n";
732 for (Standard_Integer j = From; j <= To; j++) {
733 const TopoDS_Shape& CurF = Roll.Face(j);
734 Sprintf(localname,"%s_%d_%d",a[1],i,j);
735 DBRep::Set(localname,CurF);
741 DBRep::Set(a[1],Roll.Shape());
746 //=======================================================================
747 //function : FilletCommands
749 //=======================================================================
751 void BRepTest::FilletCommands(Draw_Interpretor& theCommands)
753 static Standard_Boolean done = Standard_False;
755 done = Standard_True;
757 DBRep::BasicCommands(theCommands);
759 const char* g = "TOPOLOGY Fillet construction commands";
761 theCommands.Add("continuityblend",
762 "continuityblend C0/C1/C2 [tangle]",__FILE__,
765 theCommands.Add("tolblend",
766 "tolblend [ta t3d t2d fl]",__FILE__,
769 theCommands.Add("blend",
770 "blend result object rad1 ed1 rad2 ed2 ... [R/Q/P]",__FILE__,
773 theCommands.Add("checkhist",
774 "checkhist",__FILE__,
777 theCommands.Add("mkevol",
778 "mkevol result object (then use updatevol) [R/Q/P]",__FILE__,
781 theCommands.Add("updatevol",
782 "updatevol edge u1 rad1 u2 rad2 ...",__FILE__,
785 theCommands.Add("buildevol",
786 "buildevol end of the evol fillet computation",__FILE__,
789 theCommands.Add("fubl",
790 "fubl result shape1 shape2 radius",__FILE__,
793 theCommands.Add("cubl",
794 "cubl result shape tool radius",__FILE__,
797 theCommands.Add("bfuseblend",
798 "bfuseblend result shape1 shape2 radius [-d]",__FILE__,
801 theCommands.Add("bcutblend",
802 "bcutblend result shape1 tool radius [-d]",__FILE__,
805 theCommands.Add("blend1",
806 "blend1 result object rad ed1 ed2 ...",__FILE__,
809 theCommands.Add("rollingball",
810 "rollingball r S radius [stopf1 ..] @ [f1 f2 ..] @ [e1 ..]",
814 theCommands.Add("brollingball",
815 "brollingball r S radius [stopf1 ..] @ [f1 f2 ..] @ [e1 ..]",
819 theCommands.Add("trollingball",
820 "trollingball r S radius [stopf1 ..] @ [f1 f2 ..] @ [e1 ..]",