0026583: Eliminate compile warnings obtained by building occt with vc14: declaration...
[occt.git] / src / BRepFeat / BRepFeat.cxx
CommitLineData
b311480e 1// Created on: 1996-04-23
2// Created by: Jacques GOUSSARD
3// Copyright (c) 1996-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
42cf5bc1 18#include <Bnd_Box.hxx>
7fd59977 19#include <BRep_Builder.hxx>
42cf5bc1 20#include <BRep_Tool.hxx>
21#include <BRepAdaptor_Curve.hxx>
22#include <BRepBndLib.hxx>
23#include <BRepBuilderAPI.hxx>
24#include <BRepFeat.hxx>
25#include <BRepLib_MakeFace.hxx>
7fd59977 26#include <BRepLProp.hxx>
42cf5bc1 27#include <BRepTools.hxx>
7fd59977 28#include <BRepTopAdaptor_FClass2d.hxx>
42cf5bc1 29#include <ElSLib.hxx>
30#include <Extrema_ExtPC.hxx>
31#include <GCPnts_QuasiUniformDeflection.hxx>
32#include <Geom2d_TrimmedCurve.hxx>
7fd59977 33#include <Geom2dAdaptor_Curve.hxx>
42cf5bc1 34#include <Geom_ConicalSurface.hxx>
35#include <Geom_Curve.hxx>
36#include <Geom_CylindricalSurface.hxx>
37#include <Geom_Plane.hxx>
38#include <Geom_RectangularTrimmedSurface.hxx>
39#include <Geom_Surface.hxx>
40#include <Geom_TrimmedCurve.hxx>
41#include <GeomAdaptor_Curve.hxx>
7fd59977 42#include <GeomProjLib.hxx>
42cf5bc1 43#include <gp_Pnt.hxx>
7fd59977 44#include <gp_Vec2d.hxx>
42cf5bc1 45#include <LocOpe.hxx>
46#include <LocOpe_BuildShape.hxx>
7fd59977 47#include <LocOpe_CSIntersector.hxx>
48#include <LocOpe_PntFace.hxx>
42cf5bc1 49#include <Precision.hxx>
7fd59977 50#include <TColGeom_SequenceOfCurve.hxx>
42cf5bc1 51#include <TopExp_Explorer.hxx>
52#include <TopoDS.hxx>
53#include <TopoDS_Edge.hxx>
54#include <TopoDS_Face.hxx>
55#include <TopoDS_Shape.hxx>
56#include <TopoDS_Shell.hxx>
57#include <TopoDS_Solid.hxx>
58#include <TopoDS_Vertex.hxx>
59#include <TopTools_MapOfShape.hxx>
7fd59977 60
42cf5bc1 61//#include <BRepAlgo_Cut.hxx>
7fd59977 62#define NECHANTBARYC 11
63
64//=======================================================================
65//function : SampleEdges
66//purpose :
67//=======================================================================
68
69void BRepFeat::SampleEdges(const TopoDS_Shape& theShape,
ecba6de3 70 TColgp_SequenceOfPnt& theSeq)
7fd59977 71{
72 LocOpe::SampleEdges(theShape,theSeq);
73}
74
75
76
77//=======================================================================
78//function : Barycenter
79//purpose : Calcul du barycentre des edges d'un shape
80//=======================================================================
81
82void BRepFeat::Barycenter(const TopoDS_Shape& S,
ecba6de3 83 gp_Pnt& B)
7fd59977 84{
85 TopTools_MapOfShape theMap;
86 TopExp_Explorer exp(S,TopAbs_EDGE);
87 TopLoc_Location Loc;
88 Handle(Geom_Curve) C;
89 Standard_Real f,l,prm;
90 gp_XYZ Bar(0.,0.,0.);
91 Standard_Integer i, nbp= 0;
92
93 for (; exp.More(); exp.Next()) {
94 const TopoDS_Edge& edg = TopoDS::Edge(exp.Current());
95 if (!theMap.Add(edg)) {
96 continue;
97 }
98 if (!BRep_Tool::Degenerated(edg)) {
99 C = BRep_Tool::Curve(edg,Loc,f,l);
100 C = Handle(Geom_Curve)::DownCast(C->Transformed(Loc.Transformation()));
101 for (i=1;i<NECHANTBARYC; i++) {
ecba6de3 102 prm = ((NECHANTBARYC-i)*f + i*l)/NECHANTBARYC;
103 Bar += C->Value(prm).XYZ();
104 nbp++;
7fd59977 105 }
106 }
107 }
108 // Adds every vertex
109 for (exp.Init(S,TopAbs_VERTEX); exp.More(); exp.Next()) {
110 if (theMap.Add(exp.Current())) {
111 Bar += (BRep_Tool::Pnt(TopoDS::Vertex(exp.Current()))).XYZ();
112 nbp++;
113 }
114 }
115
116 Bar.Divide((Standard_Real)nbp);
117 B.SetXYZ(Bar);
118}
119
120
121//=======================================================================
122//function : ParametricBarycenter
123//purpose : Calcul du barycentre "parametrique" shape sur une courbe
124//=======================================================================
125
126Standard_Real BRepFeat::ParametricBarycenter(const TopoDS_Shape& S,
ecba6de3 127 const Handle(Geom_Curve)& CC)
7fd59977 128{
129 TopTools_MapOfShape theMap;
130 TopExp_Explorer exp(S,TopAbs_EDGE);
131 TopLoc_Location Loc;
132 Handle(Geom_Curve) C;
133 Standard_Real f,l,prm;
134 Standard_Integer i, nbp= 0;
135 GeomAdaptor_Curve TheCurve(CC);
136 Extrema_ExtPC extpc;
137 extpc.Initialize(TheCurve,CC->FirstParameter(),CC->LastParameter());
138 Standard_Real parbar = 0;
139
140 for (; exp.More(); exp.Next()) {
141 const TopoDS_Edge& edg = TopoDS::Edge(exp.Current());
142 if (!theMap.Add(edg)) {
143 continue;
144 }
145 if (!BRep_Tool::Degenerated(edg)) {
146 C = BRep_Tool::Curve(edg,Loc,f,l);
147 C = Handle(Geom_Curve)::DownCast(C->Transformed(Loc.Transformation()));
148 for (i=1;i<NECHANTBARYC; i++) {
ecba6de3 149 prm = ((NECHANTBARYC-i)*f + i*l)/NECHANTBARYC;
150 gp_Pnt pone = C->Value(prm);
151 // On projette sur CC
152 extpc.Perform(pone);
153 if (extpc.IsDone() && extpc.NbExt() >= 1) {
154 Standard_Real Dist2Min = extpc.SquareDistance(1);
155 Standard_Integer kmin = 1;
156 for (Standard_Integer k=2; k<=extpc.NbExt(); k++) {
157 Standard_Real Dist2 = extpc.SquareDistance(k);
158 if (Dist2 < Dist2Min) {
159 Dist2Min = Dist2;
160 kmin = k;
161 }
162 }
163 nbp++;
164 Standard_Real prmp = extpc.Point(kmin).Parameter();
165 parbar += prmp;
166 }
7fd59977 167 }
168 }
169 }
170 // Adds every vertex
171 for (exp.Init(S,TopAbs_VERTEX); exp.More(); exp.Next()) {
172 if (theMap.Add(exp.Current())) {
173 gp_Pnt pone = BRep_Tool::Pnt(TopoDS::Vertex(exp.Current()));
174 // On projette sur CC
175 extpc.Perform(pone);
176 if (extpc.IsDone() && extpc.NbExt() >= 1) {
ecba6de3 177 Standard_Real Dist2Min = extpc.SquareDistance(1);
178 for (Standard_Integer k=2; k<=extpc.NbExt(); k++) {
179 Standard_Real Dist2 = extpc.SquareDistance(k);
180 if (Dist2 < Dist2Min) {
181 Dist2Min = Dist2;
182 }
183 }
184 nbp++;
185 }
7fd59977 186 }
187 }
188
189 parbar /=((Standard_Real)nbp);
190 return parbar;
191}
192
193
194//=======================================================================
195//function : ParametricBarycenter
196//purpose : Calcul du barycentre "parametrique" shape sur une courbe
197//=======================================================================
198
199void BRepFeat::ParametricMinMax(const TopoDS_Shape& S,
ecba6de3 200 const Handle(Geom_Curve)& CC,
201 Standard_Real& prmin,
202 Standard_Real& prmax,
203 Standard_Real& prbmin,
204 Standard_Real& prbmax,
205 Standard_Boolean& flag,
464cd2fb 206 const Standard_Boolean theOri)
7fd59977 207{
208 LocOpe_CSIntersector ASI(S);
209 TColGeom_SequenceOfCurve scur;
210 scur.Append(CC);
211 ASI.Perform(scur);
212 if(ASI.IsDone() && ASI.NbPoints(1) >=1) {
464cd2fb 213 if (!theOri) {
7fd59977 214 prmin = Min(ASI.Point(1,1).Parameter(),
ecba6de3 215 ASI.Point(1, ASI.NbPoints(1)).Parameter());
7fd59977 216 prmax = Max(ASI.Point(1,1).Parameter(),
ecba6de3 217 ASI.Point(1, ASI.NbPoints(1)).Parameter());
7fd59977 218 }
219 else {
220 TopAbs_Orientation Ori = ASI.Point(1,1).Orientation();
221 if (Ori == TopAbs_FORWARD) {
ecba6de3 222 prmin = ASI.Point(1,1).Parameter();
223 prmax = ASI.Point(1, ASI.NbPoints(1)).Parameter();
7fd59977 224 }
225 else {
ecba6de3 226 prmax = ASI.Point(1,1).Parameter();
227 prmin = ASI.Point(1, ASI.NbPoints(1)).Parameter();
7fd59977 228 }
229 }
230 flag = Standard_True;
231 }
232 else {
233 prmax = RealFirst();
234 prmin = RealLast();
235 flag = Standard_False;
236 }
237
238 TopTools_MapOfShape theMap;
239 TopExp_Explorer exp(S,TopAbs_EDGE);
240 TopLoc_Location Loc;
241 Handle(Geom_Curve) C;
242 Standard_Real f,l,prm;
243// Standard_Integer i, nbp= 0;
244 Standard_Integer i;
245 GeomAdaptor_Curve TheCurve(CC);
246 Extrema_ExtPC extpc;
247 extpc.Initialize(TheCurve,CC->FirstParameter(),CC->LastParameter());
248 prbmin = RealLast();
249 prbmax = RealFirst();
250 for (; exp.More(); exp.Next()) {
251 const TopoDS_Edge& edg = TopoDS::Edge(exp.Current());
252 if (!theMap.Add(edg)) {
253 continue;
254 }
255 if (!BRep_Tool::Degenerated(edg)) {
256 C = BRep_Tool::Curve(edg,Loc,f,l);
257 C = Handle(Geom_Curve)::DownCast(C->Transformed(Loc.Transformation()));
258 for (i=1;i<NECHANTBARYC; i++) {
ecba6de3 259 prm = ((NECHANTBARYC-i)*f + i*l)/NECHANTBARYC;
260 gp_Pnt pone = C->Value(prm);
261 // On projette sur CC
262 extpc.Perform(pone);
263 if (extpc.IsDone() && extpc.NbExt() >= 1) {
264 Standard_Real Dist2Min = extpc.SquareDistance(1);
265 Standard_Integer kmin = 1;
266 for (Standard_Integer k=2; k<=extpc.NbExt(); k++) {
267 Standard_Real Dist2 = extpc.SquareDistance(k);
268 if (Dist2 < Dist2Min) {
269 Dist2Min = Dist2;
270 kmin = k;
271 }
272 }
273 Standard_Real prmp = extpc.Point(kmin).Parameter();
274 if (prmp <= prbmin) {
275 prbmin = prmp;
276 }
277 if (prmp >= prbmax) {
278 prbmax = prmp;
279 }
280 }
7fd59977 281 }
282 }
283 }
284 // Adds every vertex
285 for (exp.Init(S,TopAbs_VERTEX); exp.More(); exp.Next()) {
286 if (theMap.Add(exp.Current())) {
287 gp_Pnt pone = BRep_Tool::Pnt(TopoDS::Vertex(exp.Current()));
288 // On projette sur CC
289 extpc.Perform(pone);
290 if (extpc.IsDone() && extpc.NbExt() >= 1) {
ecba6de3 291 Standard_Real Dist2Min = extpc.SquareDistance(1);
292 Standard_Integer kmin = 1;
293 for (Standard_Integer k=2; k<=extpc.NbExt(); k++) {
294 Standard_Real Dist2 = extpc.SquareDistance(k);
295 if (Dist2 < Dist2Min) {
296 Dist2Min = Dist2;
297 kmin = k;
298 }
299 }
300 Standard_Real prmp = extpc.Point(kmin).Parameter();
301 if (prmp <= prbmin) {
302 prbmin = prmp;
303 }
304 if (prmp >= prbmax) {
305 prbmax = prmp;
306 }
307 }
7fd59977 308 }
309 }
310}
311
312
313
314
315//=======================================================================
316//function : IsIn
317//purpose :
318//=======================================================================
319
320static Standard_Boolean IsIn (BRepTopAdaptor_FClass2d& FC,
ecba6de3 321 Geom2dAdaptor_Curve AC)
7fd59977 322{
323 Standard_Real Def = 100*Precision::Confusion();
324 GCPnts_QuasiUniformDeflection QU(AC,Def);
325
326 for (Standard_Integer i = 1; i <= QU.NbPoints(); i++) {
327 gp_Pnt2d P = AC.Value(QU.Parameter(i));
328 if (FC.Perform(P, Standard_False) == TopAbs_OUT) {
329 return Standard_False;
7fd59977 330 }
331 }
332 return Standard_True;
333}
334
335
336//=======================================================================
337//function : PutInBoundsU
338//purpose : Recadre la courbe 2d dans les bounds de la face
339//=======================================================================
340 //---------------
341 // Recadre en U.
342 //---------------
343
344static void PutInBoundsU (Standard_Real umin,
ecba6de3 345 Standard_Real umax,
346 Standard_Real eps,
347 Standard_Real period,
348 Standard_Real f,
349 Standard_Real l,
350 Handle(Geom2d_Curve)& C2d)
7fd59977 351{
352 gp_Pnt2d Pf = C2d->Value(f);
353 gp_Pnt2d Pl = C2d->Value(l);
354 gp_Pnt2d Pm = C2d->Value(0.34*f + 0.66*l);
355 Standard_Real minC = Min(Pf.X(),Pl.X()); minC = Min(minC,Pm.X());
356 Standard_Real maxC = Max(Pf.X(),Pl.X()); maxC = Max(maxC,Pm.X());
357 Standard_Real du = 0.;
358 if (minC< umin - eps) {
359 du = (int((umin - minC)/period) + 1)*period;
360 }
361 if (minC > umax + eps) {
362 du = -(int((minC - umax)/period) + 1)*period;
363 }
364 if (du != 0) {
365 gp_Vec2d T1(du,0.);
366 C2d->Translate(T1);
367 minC += du; maxC += du;
368 }
369 // Ajuste au mieux la courbe dans le domaine.
370 if (maxC > umax +100*eps) {
371 Standard_Real d1 = maxC - umax;
372 Standard_Real d2 = umin - minC + period;
373 if (d2 < d1) du =-period;
374 if ( du != 0.) {
375 gp_Vec2d T2(du,0.);
376 C2d->Translate(T2);
377 }
378 }
379}
380
381
382//=======================================================================
383//function : PutInBoundsU
384//purpose : Recadre la courbe 2d dans les bounds de la face
385//=======================================================================
386 //---------------
387 // Recadre en V.
388 //---------------
389
390static void PutInBoundsV (Standard_Real vmin,
ecba6de3 391 Standard_Real vmax,
392 Standard_Real eps,
393 Standard_Real period,
394 Standard_Real f,
395 Standard_Real l,
396 Handle(Geom2d_Curve)& C2d)
7fd59977 397{
398 gp_Pnt2d Pf = C2d->Value(f);
399 gp_Pnt2d Pl = C2d->Value(l);
400 gp_Pnt2d Pm = C2d->Value(0.34*f + 0.66*l);
401 Standard_Real minC = Min(Pf.Y(),Pl.Y()); minC = Min(minC,Pm.Y());
402 Standard_Real maxC = Max(Pf.Y(),Pl.Y()); maxC = Max(maxC,Pm.Y());
403 Standard_Real dv = 0.;
404 if (minC< vmin - eps) {
405 dv = (int((vmin - minC)/period) + 1)*period;
406 }
407 if (minC > vmax + eps) {
408 dv = -(int((minC - vmax)/period) + 1)*period;
409 }
410 if (dv != 0) {
411 gp_Vec2d T1(0.,dv);
412 C2d->Translate(T1);
413 minC += dv; maxC += dv;
414 }
415 // Ajuste au mieux la courbe dans le domaine.
416 if (maxC > vmax +100*eps) {
417 Standard_Real d1 = maxC - vmax;
418 Standard_Real d2 = vmin - minC + period;
419 if (d2 < d1) dv =-period;
420 if ( dv != 0.) {
421 gp_Vec2d T2(0.,dv);
422 C2d->Translate(T2);
423 }
424 }
425}
426
427
428//=======================================================================
429//function : IsInside
430//purpose :
431//=======================================================================
432
433
434Standard_Boolean BRepFeat::IsInside(const TopoDS_Face& F1,
ecba6de3 435 const TopoDS_Face& F2)
7fd59977 436{
437 TopExp_Explorer exp;
438 exp.Init(F1, TopAbs_EDGE);
439
440 Standard_Real umin,umax,vmin,vmax, uperiod=0, vperiod=0;
441 Standard_Integer flagu = 0, flagv = 0;
442 TopLoc_Location L; // Recup S avec la location pour eviter la copie.
443 Handle (Geom_Surface) S = BRep_Tool::Surface(F2);
444// Standard_Real periodu, periodv;
445 BRepTools::UVBounds(F2,umin,umax,vmin,vmax);
446
447 if (S->IsUPeriodic()) {
448 flagu = 1;
449 uperiod = S->UPeriod();
450 }
451
452 if (S->IsVPeriodic()) {
453 flagv = 1;
454 vperiod = S->VPeriod();
455 }
456 TopoDS_Shape aLocalShape = F2.Oriented(TopAbs_FORWARD);
457 BRepTopAdaptor_FClass2d FC (TopoDS::Face(aLocalShape),Precision::Confusion());
458// BRepTopAdaptor_FClass2d FC (TopoDS::Face(F2.Oriented(TopAbs_FORWARD)),
ecba6de3 459// Precision::Confusion());
7fd59977 460 for(; exp.More(); exp.Next()) {
461 Standard_Real f1,l1;
462 Handle(Geom_Curve) C0 = BRep_Tool::Curve(TopoDS::Edge(exp.Current()),f1,l1);
463 Handle(Geom2d_Curve) C = GeomProjLib::Curve2d(C0,f1,l1,S);
464 TopoDS_Edge E = TopoDS::Edge(exp.Current());
465 if(flagu == 1 || flagv == 1) {
466 Standard_Real eps = BRep_Tool::Tolerance(E);
467 BRep_Tool::Range(E,f1,l1);
468 if(flagu == 1) PutInBoundsU(umin, umax, eps, uperiod, f1, l1, C);
469 if(flagv == 1) PutInBoundsV(vmin, vmax, eps, vperiod, f1, l1, C);
470 }
471 Geom2dAdaptor_Curve AC(C,f1,l1);
472 if (!IsIn(FC,AC)) {
473 return Standard_False;
7fd59977 474 }
475 }
476 return Standard_True;
477}
478
479
480
481//=======================================================================
482//function : FaceUntil
483//purpose :
484//=======================================================================
485
486
487void BRepFeat::FaceUntil(const TopoDS_Shape& Sbase,
ecba6de3 488 TopoDS_Face& FUntil)
7fd59977 489{
490 Bnd_Box B;
491 BRepBndLib::Add(Sbase,B);
d7988ee1 492 Standard_Real x[2], y[2], z[2];
493 B.Get(x[0],y[0],z[0],x[1],y[1],z[1]);
494 Standard_Real diam = 10.*Sqrt(B.SquareExtent());
7fd59977 495
496 Handle(Geom_Surface) s = BRep_Tool::Surface(FUntil);
497 Handle(Standard_Type) styp = s->DynamicType();
498 if (styp == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
499 s = Handle(Geom_RectangularTrimmedSurface)::DownCast(s)->BasisSurface();
500 styp = s->DynamicType();
501 }
502 Handle(Geom_RectangularTrimmedSurface) str;
503 if (styp == STANDARD_TYPE(Geom_Plane)) {
d7988ee1 504 gp_Pln aPln = Handle(Geom_Plane)::DownCast(s)->Pln();
505 Standard_Real u, v, umin = RealLast(), umax = -umin,
506 vmin = RealLast(), vmax = -vmin;
507 for(Standard_Integer i = 0 ; i < 2; i++)
508 {
509 for(Standard_Integer j = 0; j < 2; j++)
510 {
511 for(Standard_Integer k = 0; k < 2; k++)
512 {
513 gp_Pnt aP(x[i], y[j], z[k]);
514 ElSLib::Parameters(aPln, aP, u, v);
515 if(u < umin)
516 umin = u;
517 if(u > umax)
518 umax = u;
519 if(v < vmin)
520 vmin = v;
521 if(v > vmax)
522 vmax = v;
523 }
524 }
525 }
526 umin -= diam;
527 umax += diam;
528 vmin -= diam;
529 vmax += diam;
7fd59977 530 str = new Geom_RectangularTrimmedSurface
d7988ee1 531 (s, umin, umax, vmin, vmax, Standard_True, Standard_True);
7fd59977 532 }
533 else if (styp == STANDARD_TYPE(Geom_CylindricalSurface)) {
d7988ee1 534 gp_Cylinder aCyl = Handle(Geom_CylindricalSurface)::DownCast(s)->Cylinder();
535 Standard_Real u, v, vmin = RealLast(), vmax = -vmin;
536 for(Standard_Integer i = 0 ; i < 2; i++)
537 {
538 for(Standard_Integer j = 0; j < 2; j++)
539 {
540 for(Standard_Integer k = 0; k < 2; k++)
541 {
542 gp_Pnt aP(x[i], y[j], z[k]);
543 ElSLib::Parameters(aCyl, aP, u, v);
544 if(v < vmin)
545 vmin = v;
546 if(v > vmax)
547 vmax = v;
548 }
549 }
550 }
551 vmin -= diam;
552 vmax += diam;
7fd59977 553 str = new Geom_RectangularTrimmedSurface
d7988ee1 554 (s, vmin, vmax, Standard_False, Standard_True);
7fd59977 555 }
556 else if (styp == STANDARD_TYPE(Geom_ConicalSurface)) {
d7988ee1 557 gp_Cone aCon = Handle(Geom_ConicalSurface)::DownCast(s)->Cone();
558 Standard_Real u, v, vmin = RealLast(), vmax = -vmin;
559 for(Standard_Integer i = 0 ; i < 2; i++)
560 {
561 for(Standard_Integer j = 0; j < 2; j++)
562 {
563 for(Standard_Integer k = 0; k < 2; k++)
564 {
565 gp_Pnt aP(x[i], y[j], z[k]);
566 ElSLib::Parameters(aCon, aP, u, v);
567 if(v < vmin)
568 vmin = v;
569 if(v > vmax)
570 vmax = v;
571 }
572 }
573 }
574 vmin -= diam;
575 vmax += diam;
7fd59977 576 str = new Geom_RectangularTrimmedSurface
d7988ee1 577 (s, vmin, vmax, Standard_False, Standard_True);
7fd59977 578 }
579 else {
580 FUntil.Nullify();
581 return;
582 }
583
1c72dff6 584 FUntil = BRepLib_MakeFace(str, Precision::Confusion());
7fd59977 585}
586
587
588
589//=======================================================================
590//function : Tool
591//purpose :
592//=======================================================================
593
594TopoDS_Solid BRepFeat::Tool(const TopoDS_Shape& SRef,
ecba6de3 595 const TopoDS_Face& Fac,
596 const TopAbs_Orientation Orf)
7fd59977 597{
598 TopTools_ListOfShape lfaces;
599// for (TopExp_Explorer exp(SRef,TopAbs_FACE); exp.More(); exp.Next()) {
600 TopExp_Explorer exp(SRef,TopAbs_FACE) ;
601 for ( ; exp.More(); exp.Next()) {
602 if (exp.Current().ShapeType() == TopAbs_FACE) {
603 lfaces.Append(exp.Current());
604 }
605 }
606
607 LocOpe_BuildShape bs(lfaces);
608 const TopoDS_Shape& Res = bs.Shape();
609 TopoDS_Shell Sh;
610 if (Res.ShapeType() == TopAbs_SHELL) {
611 // faire un solide
612 Sh = TopoDS::Shell(Res);
613 }
614 else if (Res.ShapeType() == TopAbs_SOLID) {
615 exp.Init(Res,TopAbs_SHELL);
616 Sh = TopoDS::Shell(exp.Current());
617 exp.Next();
618 if (exp.More()) {
619 Sh.Nullify();
620 }
621 }
622
623 if (Sh.IsNull()) {
624 TopoDS_Solid So;
625 return So;
626 }
627
628
629 Sh.Orientation(TopAbs_FORWARD);
1d47d8d0 630
7fd59977 631 TopAbs_Orientation orient = TopAbs_FORWARD;
1d47d8d0 632
7fd59977 633 for (exp.Init(Sh,TopAbs_FACE); exp.More(); exp.Next()) {
634 if (exp.Current().IsSame(Fac)) {
635 orient = exp.Current().Orientation();
636 break;
637 }
638 }
639
640 Standard_Boolean reverse = Standard_False;
641 if ((orient == Fac.Orientation() && Orf == TopAbs_REVERSED) ||
642 (orient != Fac.Orientation() && Orf == TopAbs_FORWARD)) {
643 reverse = Standard_True;
644 }
645
646 if (reverse) {
647 Sh.Reverse();
648 }
649
650 BRep_Builder B;
651 TopoDS_Solid Soc;
652 B.MakeSolid(Soc);
653 B.Add(Soc,Sh);
654 return Soc;
655}
656
657
658//=======================================================================
659//function : Print
660//purpose : Print the error Description of a StatusError on a stream.
661//=======================================================================
ecba6de3 662
7fd59977 663Standard_OStream& BRepFeat::Print(const BRepFeat_StatusError se,
ecba6de3 664 Standard_OStream& s)
7fd59977 665{
666 switch(se) {
667 case BRepFeat_OK :
668 s << "No error";
669 break;
670 case BRepFeat_BadDirect :
671 s << "Directions must be opposite";
672 break;
673 case BRepFeat_BadIntersect :
674 s << "Intersection failure";
675 break;
676 case BRepFeat_EmptyBaryCurve :
677 s << "Empty BaryCurve";
678 break;
679 case BRepFeat_EmptyCutResult :
680 s << "Failure in Cut : Empty resulting shape";
681 break;;
682 case BRepFeat_FalseSide :
683 s << "Verify plane and wire orientation";
684 break;
685 case BRepFeat_IncDirection :
686 s << "Incoherent Direction for shapes From and Until";
687 break;
688 case BRepFeat_IncSlidFace :
689 s << "Sliding face not in Base shape";
690 break;
691 case BRepFeat_IncParameter :
692 s << "Incoherent Parameter : shape Until before shape From";
693 break;
694 case BRepFeat_IncTypes :
695 s << "Invalid option for faces From and Until : 1 Support and 1 not";
696 break;
697 case BRepFeat_IntervalOverlap :
698 s << "Shapes From and Until overlap";
699 break;
700 case BRepFeat_InvFirstShape :
701 s << "Invalid First shape : more than 1 face";
702 break;
703 case BRepFeat_InvOption :
704 s << "Invalid option";
705 break;
706 case BRepFeat_InvShape :
707 s << "Invalid shape";
708 break;
709 case BRepFeat_LocOpeNotDone :
710 s << "Local Operation not done";
711 break;
712 case BRepFeat_LocOpeInvNotDone :
713 s << "Local Operation : intersection line conflict";
714 break;
715 case BRepFeat_NoExtFace :
716 s << "No Extreme faces";
717 break;
718 case BRepFeat_NoFaceProf :
719 s << "No Face Profile";
720 break;
721 case BRepFeat_NoGluer :
722 s << "Gluer Failure";
723 break;
724 case BRepFeat_NoIntersectF :
725 s << "No intersection between Feature and shape From";
726 break;
727 case BRepFeat_NoIntersectU :
728 s << "No intersection between Feature and shape Until";
729 break;
730 case BRepFeat_NoParts :
731 s << "No parts of tool kept";
732 break;
733 case BRepFeat_NoProjPt :
734 s << "No projection points";
735 break;
736 case BRepFeat_NotInitialized :
737 s << "Fields not initialized";
738 break;
739 case BRepFeat_NotYetImplemented :
740 s << "Not yet implemented";
741 break;
742 case BRepFeat_NullRealTool :
743 s << "Real Tool : Null DPrism";
744 break;
745 case BRepFeat_NullToolF :
746 s << "Null Tool : Invalid type for shape Form";
747 break;
748 case BRepFeat_NullToolU :
749 s << "Null Tool : Invalid type for shape Until";
750 break;
751 }
752 return s;
753}
754