0020716: Eliminate usage of "config.h" header file
[occt.git] / src / BRepTest / BRepTest_FilletCommands.cxx
CommitLineData
b311480e 1// Created on: 1994-06-20
2// Created by: Modeling
3// Copyright (c) 1994-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
7fd59977 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
4e57c75e 38//#include <BOPTools_DSFiller.hxx>
39#include <BOPAlgo_PaveFiller.hxx>
40
7fd59977 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
7fd59977 55#include <stdio.h>
7fd59977 56
57
58static Standard_Real t3d = 1.e-4;
59static Standard_Real t2d = 1.e-5;
60static Standard_Real ta = 1.e-2;
61static Standard_Real fl = 1.e-3;
62static Standard_Real tapp_angle = 1.e-2;
63static GeomAbs_Shape blend_cont = GeomAbs_C1;
64
65static BRepFilletAPI_MakeFillet* Rakk = 0;
66static BRepFilletAPI_MakeFillet* Rake = 0;
67static char name[100];
68
69
70static 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;
7fd59977 90 default:
91 break;
7fd59977 92 }
93 return 0;
94 }
95 else {
96 if (narg >3) return 1;
91322f44 97 if (narg == 3) { tapp_angle = Abs(Draw::Atof(a[2])); }
7fd59977 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
113static 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
130static 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){
91322f44 137 ta = Draw::Atof(a[1]);
138 t3d = Draw::Atof(a[2]);
139 t2d = Draw::Atof(a[3]);
140 fl = Draw::Atof(a[4]);
7fd59977 141 return 0;
142 }
143 return 1;
144}
145static 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++){
91322f44 168 Rad = Draw::Atof(a[2*ii + 1]);
7fd59977 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
185static 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){
91322f44 195 Sprintf(localname,"generated_00%d", nbgen++);
7fd59977 196 }
197 else if(nbgen<100){
91322f44 198 Sprintf(localname,"generated_0%d", nbgen++);
7fd59977 199 }
200 else {
91322f44 201 Sprintf(localname,"generated_%d", nbgen++);
7fd59977 202 }
203 for(; It.More(); It.Next()){
204 B.Add(C,It.Value());
205 }
206 DBRep::Set(localname,C);
207}
208
209static Standard_Integer CheckHist(Draw_Interpretor& di,
210 Standard_Integer ,
211 const char** )
212{
213 if(Rakk == 0) {
0d969553
Y
214 //cout<<"No active Builder"<<endl;
215 di<<"No active Builder"<<"\n";
7fd59977 216 return 1;
217 }
218 if(!Rakk->IsDone()) {
0d969553
Y
219 //cout<<"Active Builder Not Done"<<endl;
220 di<<"Active Builder Not Done"<<"\n";
7fd59977 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
246static 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
271static Standard_Integer UPDATEVOL(Draw_Interpretor& di,
272 Standard_Integer narg,
273 const char** a)
274{
275 if(Rake == 0){
0d969553
Y
276 //cout << "MakeFillet not initialized"<<endl;
277 di << "MakeFillet not initialized"<<"\n";
7fd59977 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++){
91322f44 287 Par = Draw::Atof(a[2*ii]);
288 Rad = Draw::Atof(a[2*ii + 1]);
7fd59977 289 uandr.ChangeValue(ii).SetCoord(Par,Rad);
290 }
291 Rake->Add(uandr,E);
292 return 0;
293}
294
295static Standard_Integer BUILDEVOL(Draw_Interpretor& di,
296 Standard_Integer,
297 const char**)
298{
299 if(Rake == 0){
0d969553
Y
300 //cout << "MakeFillet not initialized"<<endl;
301 di << "MakeFillet not initialized"<<"\n";
7fd59977 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//**********************************************
0d969553 319// command fuse and cut with fillets *
7fd59977 320//**********************************************
321
322Standard_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]);
91322f44 329 Standard_Real Rad = Draw::Atof(a[4]);
7fd59977 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
378Standard_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 }
91322f44 390 Standard_Real Rad = Draw::Atof(a[4]);
7fd59977 391
4e57c75e 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()) {
7fd59977 400 printf("Check types of the arguments, please\n");
401 return 1;
402 }
7fd59977 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
457static 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]);
91322f44 466 Rad = Draw::Atof(a[3]);
7fd59977 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 }
75259fc5 474 FilletSurf_Builder aRakk(V,E,Rad);
475 if (simul) aRakk.Simulate();
476 else aRakk.Perform();
7fd59977 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;
75259fc5 490 if (aRakk.IsDone()==FilletSurf_IsNotOk)
491 { FilletSurf_ErrorTypeStatus err=aRakk.StatusError();
7fd59977 492 if (err==FilletSurf_EmptyList) di<< "StatusError=EmptyList"<<"\n";
493 else if (err==FilletSurf_EdgeNotG1) di<< "StatusError=NotG1"<<"\n";
75259fc5 494 else if (err==FilletSurf_FacesNotG1) di<< "StatusError=facesNotG1"<<"\n";
495 else if (err==FilletSurf_EdgeNotOnShape)
7fd59977 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 {
75259fc5 501 if (aRakk.IsDone()==FilletSurf_IsPartial) di <<"partial result"<<"\n";
7fd59977 502
75259fc5 503 nb=aRakk.NbSurface();
7fd59977 504 char localname [100];
505 char *temp;
506
507 // affichage du type d'arret
508
509 if (!simul)
510 {
75259fc5 511 //if (Rakk.StartSectionStatus()==FilletSurf_NoExtremityOnEdge)
7fd59977 512 // {cout<<" type deb conges = WLBLOUT"<<endl;}
75259fc5 513 //else if (Rakk.StartSectionStatus()==FilletSurf_OneExtremityOnEdge )
7fd59977 514 // { cout<<" type deb conges = WLBLSTOP"<<endl;}
515 //else if (Rakk.StartSectionStatus()==FilletSurf_TwoExtremityOnEdge)
516 // {cout<<" type deb conges = WLBLEND"<<endl;}
75259fc5 517 if (aRakk.StartSectionStatus()==FilletSurf_NoExtremityOnEdge)
0d969553 518 {di<<" type start fillets = WLBLOUT"<<"\n";}
75259fc5 519 else if (aRakk.StartSectionStatus()==FilletSurf_OneExtremityOnEdge)
0d969553 520 { di<<" type start fillets = WLBLSTOP"<<"\n";}
75259fc5 521 else if (aRakk.StartSectionStatus()==FilletSurf_TwoExtremityOnEdge)
0d969553 522 {di<<" type start fillets = WLBLEND"<<"\n";}
7fd59977 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;}
75259fc5 530 if (aRakk.EndSectionStatus()==FilletSurf_NoExtremityOnEdge)
0d969553 531 {di<<" type end fillets = WLBLOUT"<<"\n";}
75259fc5 532 else if (aRakk.EndSectionStatus()==FilletSurf_OneExtremityOnEdge)
0d969553 533 {di<<" type end fillets = WLBLSTOP"<<"\n";}
75259fc5 534 else if (aRakk.EndSectionStatus()==FilletSurf_TwoExtremityOnEdge)
0d969553 535 { di<<" type end fillets = WLBLEND"<<"\n";}
7fd59977 536 Standard_Real f,l;
75259fc5 537 f = aRakk.FirstParameter();
538 l = aRakk.LastParameter();
0d969553
Y
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";
7fd59977 543 for (i=1;i<=nb;i++){
544 //precision
545 //cout<<"precision "<< i << "= "<<Rakk.TolApp3d(i)<<endl;
75259fc5 546 di<<"precision "<< i << "= "<<aRakk.TolApp3d(i)<<"\n";
7fd59977 547
0d969553 548 // display resulting surfaces
91322f44 549 Sprintf(localname, "%s%d" ,ns0,i);
7fd59977 550 temp = localname;
75259fc5 551 DrawTrSurf::Set(temp,aRakk.SurfaceFillet(i));
7fd59977 552 di << localname<< " ";
553
0d969553 554 // display curves 3d
91322f44 555 Sprintf(localname, "%s%d" ,"courb1",i);
7fd59977 556 temp =localname;
75259fc5 557 DrawTrSurf::Set(temp,aRakk.CurveOnFace1(i));
7fd59977 558 di << localname<< " ";
91322f44 559 Sprintf(localname, "%s%d" ,"courb2",i);
7fd59977 560 temp =localname;
75259fc5 561 DrawTrSurf::Set(temp,aRakk.CurveOnFace2(i));
7fd59977 562 di << localname<< " ";
563
0d969553 564 // display supports
91322f44 565 Sprintf(localname, "%s%d" ,"face1",i);
7fd59977 566 temp =localname ;
75259fc5 567 DBRep::Set(temp,aRakk.SupportFace1(i));
7fd59977 568 di << localname<< " ";
91322f44 569 Sprintf(localname, "%s%d" ,"face2",i);
7fd59977 570 temp =localname;
75259fc5 571 DBRep::Set(temp,aRakk.SupportFace2(i));
7fd59977 572 di << localname<< " ";
573
0d969553 574 // display Pcurves on faces
91322f44 575 Sprintf(localname, "%s%d" ,"pcurveonface1",i);
7fd59977 576 temp =localname ;
75259fc5 577 DrawTrSurf::Set(temp,aRakk.PCurveOnFace1(i));
7fd59977 578 di << localname<< " ";
91322f44 579 Sprintf(localname, "%s%d" ,"pcurveonface2",i);
7fd59977 580 temp =localname;
75259fc5 581 DrawTrSurf::Set(temp,aRakk.PCurveOnFace2(i));
7fd59977 582 di << localname<< " ";
583
0d969553 584 // display Pcurves on the fillet
91322f44 585 Sprintf(localname, "%s%d" ,"pcurveonconge1",i);
7fd59977 586 temp =localname;
75259fc5 587 DrawTrSurf::Set(temp,aRakk.PCurve1OnFillet(i));
7fd59977 588 di << localname<< " ";
91322f44 589 Sprintf(localname, "%s%d" ,"pcurveonconge2",i);
7fd59977 590 temp =localname;
75259fc5 591 DrawTrSurf::Set(temp,aRakk.PCurve2OnFillet(i));
7fd59977 592 di << localname<< " ";
593
594 } }
595 else{
596 Standard_Integer j;
597
598 for (i=1;i<=nb;i++)
75259fc5 599 {Standard_Integer s=aRakk.NbSection(i);
7fd59977 600 for (j=1;j<=s;j++)
601 {Handle(Geom_TrimmedCurve Sec);
75259fc5 602 aRakk.Section(i,j,Sec);
91322f44 603 Sprintf(localname, "%s%d%d" ,"sec",i,j);
7fd59977 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
617Standard_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;
91322f44 623 Standard_Real Rad = Draw::Atof(a[3]);
7fd59977 624
0d969553 625 Standard_Real Tol = t3d; //the same as blend ! 1.e-7;
7fd59977 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
0d969553 637 if ( Nb == 0) { // return stop faces.
7fd59977 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()) {
0d969553
Y
642 //cout << " Stop face not referenced." << endl;
643 di << " Stop face not referenced." << "\n";
7fd59977 644 return 1;
645 }
646 Roll.SetStoppingFace(F1);
647 }
0d969553 648 else if (Nb == 1) { // return faces on which the ball rotates
7fd59977 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],"@")) {
0d969553
Y
654 //cout << " Even number of ball support faces is required " << endl;
655 di << " Even number of ball support faces is required " << "\n";
7fd59977 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()) {
0d969553
Y
662 //cout << " Support face not referenced." << endl;
663 di << " Support face not referenced." << "\n";
7fd59977 664 return 1;
665 }
666 Roll.SetFaces(F1,F2);
667 }
0d969553 668 else if (Nb == 2) { // return the edge on which the ball rotates
7fd59977 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()) {
0d969553
Y
673 //cout << " Edge not referenced." << endl;
674 di << " Edge not referenced." << "\n";
7fd59977 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);
0d969553 692 //cout << " Indexes of the " << i << "th Branch : ";
7fd59977 693 //cout << " " << From << " " << To << endl;
0d969553 694 di << " Indexes of the " << i << "th Branch : ";
7fd59977 695 di << " " << From << " " << To << "\n";
696 for (Standard_Integer j = From; j <= To; j++) {
697 const TopoDS_Shape& CurF = Roll.Face(j);
91322f44 698 Sprintf(localname,"%s_%d_%d",a[1],i,j);
7fd59977 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
715void 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}