0022807: Loading of STEP entities in model during reading of STEP file requires redun...
[occt.git] / src / BRepFeat / BRepFeat_MakeRevol.cxx
CommitLineData
7fd59977 1// File: BRepFeat_MakeRevol.cxx
2// Created: Tue Feb 13 14:42:59 1996
3// Author: Jacques GOUSSARD
4// <jag@bravox>
5
6
7#include <BRepFeat_MakeRevol.ixx>
8
9#include <BRepFeat.hxx>
10#include <LocOpe.hxx>
11#include <LocOpe_Revol.hxx>
12#include <LocOpe_Builder.hxx>
13#include <LocOpe_Gluer.hxx>
14#include <LocOpe_FindEdges.hxx>
15#include <LocOpe_SequenceOfCirc.hxx>
16#include <LocOpe_BuildShape.hxx>
17#include <LocOpe_CSIntersector.hxx>
18#include <LocOpe_PntFace.hxx>
19
20#include <gp_Vec.hxx>
21#include <gp_Pnt.hxx>
22#include <gp_Ax1.hxx>
23#include <gp_Pnt2d.hxx>
24#include <TColgp_SequenceOfPnt.hxx>
25#include <Geom_Surface.hxx>
26#include <Geom_Curve.hxx>
27#include <Geom_Circle.hxx>
28#include <Geom2d_Curve.hxx>
29#include <Geom_RectangularTrimmedSurface.hxx>
30#include <Bnd_Box.hxx>
31
32#include <BRepSweep_Revol.hxx>
33#include <BRep_Builder.hxx>
34#include <BRep_Tool.hxx>
35#include <TopExp_Explorer.hxx>
36#include <TopTools_MapOfShape.hxx>
37#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
38#include <TopTools_ListIteratorOfListOfShape.hxx>
39#include <TopTools_MapIteratorOfMapOfShape.hxx>
40#include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
41
42#include <BRepAlgoAPI_Cut.hxx>
43#include <BRepAlgoAPI_Fuse.hxx>
44
45#include <BRepLib_MakeFace.hxx>
46#include <BRepTools_Modifier.hxx>
47#include <BRepTools_TrsfModification.hxx>
48
49#include <Standard_ConstructionError.hxx>
50
51#include <TopoDS_Solid.hxx>
52#include <TopoDS_Compound.hxx>
53#include <TopoDS_Shell.hxx>
54
55#include <gp_Pln.hxx>
56#include <Geom_Plane.hxx>
57
58
59#include <TopExp.hxx>
60#include <Precision.hxx>
61#include <BRepBndLib.hxx>
62#include <BRepBuilderAPI.hxx>
63#include <BRepFeat.hxx>
64
65#include <ElCLib.hxx>
66
67#ifdef DEB
68Standard_IMPORT Standard_Boolean BRepFeat_GettraceFEAT();
69#endif
70
71static void MajMap(const TopoDS_Shape&, // base
72 const LocOpe_Revol&,
73 TopTools_DataMapOfShapeListOfShape&, // myMap
74 TopoDS_Shape&, // myFShape
75 TopoDS_Shape&); // myLShape
76
77
78static void SetGluedFaces(const TopoDS_Face& theSkface,
79 const TopoDS_Shape& theSbase,
80 const TopoDS_Shape& thePbase,
81 const TopTools_DataMapOfShapeListOfShape& theSlmap,
82 LocOpe_Revol&,
83 TopTools_DataMapOfShapeShape&);
84
85
86static void VerifGluedFaces(const TopoDS_Face& theSkface,
87 const TopoDS_Shape& thePbase,
88 Handle(Geom_Curve)& theBCurve,
89 TColGeom_SequenceOfCurve& theCurves,
90 LocOpe_Revol& theRevol,
91 TopTools_DataMapOfShapeShape& theMap);
92
93
94static Standard_Boolean ToFuse(const TopoDS_Face& ,
95 const TopoDS_Face&);
96
97
98
99
100//=======================================================================
101//function : Init
102//purpose :
103//=======================================================================
104
105void BRepFeat_MakeRevol::Init(const TopoDS_Shape& Sbase,
106 const TopoDS_Shape& Pbase,
107 const TopoDS_Face& Skface,
108 const gp_Ax1& Axis,
109 const Standard_Integer Mode,
110 const Standard_Boolean Modify)
111{
112#ifdef DEB
113 Standard_Boolean trc = BRepFeat_GettraceFEAT();
114 if (trc) cout << "BRepFeat_MakeRevol::Init" << endl;
115#endif
116 myAxis = Axis;
117 myPbase = Pbase;
118 mySbase = Sbase;
119 BasisShapeValid();
120 mySkface = Skface;
121 SketchFaceValid();
122 myPbase = Pbase;
123 mySlface.Clear();
124 if(Mode == 0) {
125 myFuse = Standard_False;
126 myJustFeat = Standard_False;
127 }
128 else if(Mode == 1) {
129 myFuse = Standard_True;
130 myJustFeat = Standard_False;
131 }
132 else if(Mode == 2) {
133 myFuse = Standard_True;
134 myJustFeat = Standard_True;
135 }
136 else {
137 }
138 myModify = Modify;
139 myJustGluer = Standard_False;
140
141 //-------------- ifv
142// mySkface.Nullify();
143 //-------------- ifv
144
145
146 myShape.Nullify();
147 myMap.Clear();
148 myFShape.Nullify();
149 myLShape.Nullify();
150 TopExp_Explorer exp;
151 for (exp.Init(mySbase,TopAbs_FACE);exp.More();exp.Next()) {
152 TopTools_ListOfShape thelist;
153 myMap.Bind(exp.Current(), thelist);
154 myMap(exp.Current()).Append(exp.Current());
155 }
156#ifdef DEB
157 if (trc) {
158 if (myJustFeat) cout << " Just Feature" << endl;
159 if (myFuse) cout << " Fuse" << endl;
160 if (!myFuse) cout << " Cut" << endl;
161 if (!myModify) cout << " Modify = 0" << endl;
162 }
163#endif
164}
165
166
167//=======================================================================
168//function : Add
0d969553 169//purpose : add faces add edges of sliding
7fd59977 170//=======================================================================
171
172void BRepFeat_MakeRevol::Add(const TopoDS_Edge& E,
173 const TopoDS_Face& F)
174{
175#ifdef DEB
176 Standard_Boolean trc = BRepFeat_GettraceFEAT();
177 if (trc) cout << "BRepFeat_MakeRevol::Add(Edge,face)" << endl;
178#endif
179 TopExp_Explorer exp;
180 for (exp.Init(mySbase,TopAbs_FACE);exp.More();exp.Next()) {
181 if (exp.Current().IsSame(F)) {
182 break;
183 }
184 }
185 if (!exp.More()) {
186 Standard_ConstructionError::Raise();
187 }
188
189 for (exp.Init(myPbase,TopAbs_EDGE);exp.More();exp.Next()) {
190 if (exp.Current().IsSame(E)) {
191 break;
192 }
193 }
194 if (!exp.More()) {
195 Standard_ConstructionError::Raise();
196 }
197
198 if (!mySlface.IsBound(F)) {
199 TopTools_ListOfShape thelist;
200 mySlface.Bind(F, thelist);
201 }
202 TopTools_ListIteratorOfListOfShape itl(mySlface(F));
203 for (; itl.More();itl.Next()) {
204 if (itl.Value().IsSame(E)) {
205 break;
206 }
207 }
208 if (!itl.More()) {
209 mySlface(F).Append(E);
210 }
211}
212
213
214//=======================================================================
215//function : Perform
216//purpose :
217//=======================================================================
218
219void BRepFeat_MakeRevol::Perform(const Standard_Real Angle)
220{
221#ifdef DEB
222 Standard_Boolean trc = BRepFeat_GettraceFEAT();
223 if (trc) cout << "BRepFeat_MakeRevol::Perform(Angle)" << endl;
224#endif
225 mySFrom.Nullify();
226 ShapeFromValid();
227 mySUntil.Nullify();
228 ShapeUntilValid();
229 myGluedF.Clear();
230 myPerfSelection = BRepFeat_NoSelection;
231 PerfSelectionValid();
232 Standard_Boolean RevolComp = (2*PI-Abs(Angle) <= Precision::Angular());
233 LocOpe_Revol theRevol;
234 Standard_Real angledec = 0.;
235 TopExp_Explorer exp;
236 if(RevolComp) {
237 /*
238 if (!mySkface.IsNull() || !mySlface.IsEmpty()) {
239 for (exp.Init(mySbase,TopAbs_FACE); exp.More(); exp.Next()) {
240 if (exp.Current().IsSame(mySkface)) {
241 angledec = PI/5; // pourquoi pas
242 if (myFuse) angledec = -angledec;
243 break;
244 }
245 }
246 }
247 */
248 mySkface.Nullify();
249 }
250 if(angledec == 0.) theRevol.Perform(myPbase, myAxis, Angle);
251 else theRevol.Perform(myPbase, myAxis, Angle, angledec);
252
253 TopoDS_Shape VraiRevol = theRevol.Shape();
254
255 MajMap(myPbase,theRevol,myMap,myFShape,myLShape);
256
257 myGShape = VraiRevol;
258 GeneratedShapeValid();
259 TopoDS_Shape Base = theRevol.FirstShape();
260 exp.Init(Base, TopAbs_FACE);
261 TopoDS_Face theBase = TopoDS::Face(exp.Current());
262 exp.Next();
263 if(exp.More()) {
264 NotDone();
265 myStatusError = BRepFeat_InvFirstShape;
266 return;
267 }
268
269 TopoDS_Face FFace;
270
271 Standard_Boolean found = Standard_False;
272
273 if(!mySkface.IsNull() || !mySlface.IsEmpty()) {
274 if(myLShape.ShapeType() == TopAbs_WIRE) {
275 TopExp_Explorer ex1(VraiRevol, TopAbs_FACE);
276 for(; ex1.More(); ex1.Next()) {
277 TopExp_Explorer ex2(ex1.Current(), TopAbs_WIRE);
278 for(; ex2.More(); ex2.Next()) {
279 if(ex2.Current().IsSame(myLShape)) {
280 FFace = TopoDS::Face(ex1.Current());
281 found = Standard_True;
282 break;
283 }
284 }
285 if(found) break;
286 }
287 }
288
289 TopExp_Explorer exp(mySbase, TopAbs_FACE);
290 for(; exp.More(); exp.Next()) {
291 const TopoDS_Face& ff = TopoDS::Face(exp.Current());
292 if(ToFuse(ff, FFace)) {
293 TopTools_DataMapOfShapeListOfShape sl;
294 if(!FFace.IsSame(myPbase) && BRepFeat::IsInside(ff, FFace))
295 //SetGluedFaces(ff, mySbase, FFace, sl, theRevol, myGluedF);
296 break;
297 }
298 }
299 }
300
301 //SetGluedFaces(mySkface, mySbase, theBase, mySlface, theRevol, myGluedF);
302 GluedFacesValid();
303 if (!mySkface.IsNull()) {
304 VerifGluedFaces(mySkface, theBase, myBCurve, myCurves, theRevol, myGluedF);
305 }
306
307 if(myGluedF.IsEmpty()) {
308 if(myFuse == 1) {
309 //modified by NIZNHY-PKV Thu Mar 21 18:15:06 2002 f
310 //BRepAlgo_Fuse f(mySbase, myGShape);
311 //myShape = f.Shape();
312 //UpdateDescendants(f.Builder(), myShape, Standard_False);
313 BRepAlgoAPI_Fuse f(mySbase, myGShape);
314 myShape = f.Shape();
315 UpdateDescendants(f, myShape, Standard_False);
316 //modified by NIZNHY-PKV Thu Mar 21 18:15:11 2002 t
317 Done();
318 }
319 else if(myFuse == 0) {
320 //modified by NIZNHY-PKV Thu Mar 21 18:15:37 2002 f
321 //BRepAlgo_Cut c(mySbase, myGShape);
322 //myShape = c.Shape();
323 //UpdateDescendants(c.Builder(), myShape, Standard_False);
324 BRepAlgoAPI_Cut c(mySbase, myGShape);
325 myShape = c.Shape();
326 UpdateDescendants(c, myShape, Standard_False);
327 //modified by NIZNHY-PKV Thu Mar 21 18:15:47 2002 t
328 Done();
329 }
330 else {
331 myShape = myGShape;
332 Done();
333 }
334 }
335 else {
336 theRevol.Curves(myCurves);
337 myBCurve = theRevol.BarycCurve();
338 GlobalPerform();
339 }
340}
341
342
343//=======================================================================
344//function : Perform
0d969553 345//purpose : feature till shape Until
7fd59977 346//=======================================================================
347
348void BRepFeat_MakeRevol::Perform(const TopoDS_Shape& Until)
349{
350#ifdef DEB
351 Standard_Boolean trc = BRepFeat_GettraceFEAT();
352 if (trc) cout << "BRepFeat_MakeRevol::Perform(Until)" << endl;
353#endif
354 Standard_Real Angle = 0.;
355 Standard_Boolean TourComplet = Standard_False;
356
357 if (Until.IsNull()) {
358 Standard_ConstructionError::Raise();
359 }
360 TopExp_Explorer exp(Until, TopAbs_FACE);
361 if (!exp.More()) {
362 Standard_ConstructionError::Raise();
363 }
364 if (!mySkface.IsNull() && Until.IsSame(mySkface)) {
365 Angle = 2*PI;
366 TourComplet = Standard_True;
367 }
368 myGluedF.Clear();
369 myPerfSelection = BRepFeat_SelectionU;
370 PerfSelectionValid();
371 mySFrom.Nullify();
372 ShapeFromValid();
373 mySUntil = Until;
374 Standard_Boolean Trf = TransformShapeFU(1);
375 ShapeUntilValid();
376
0d969553
Y
377// Do systematically almost complete revolution
378// BRepSweep_Revol theRevol(myPbase,myAxis,2.*PI-10.*Precision::Angular());
7fd59977 379 LocOpe_Revol theRevol;
380 if(!TourComplet) {
381 Angle = 2.*PI- 3*PI/180.;
382#ifdef DEB
0d969553 383 if (trc) cout << " No complete Revolution" << endl;
7fd59977 384#endif
385 }
386 theRevol.Perform(myPbase, myAxis, Angle);
387 TopoDS_Shape VraiRevol = theRevol.Shape();
388 MajMap(myPbase,theRevol,myMap,myFShape,myLShape);
389
390
391 if(!Trf) {
392
393 myGShape = VraiRevol;
394 GeneratedShapeValid();
395
396 TopoDS_Shape Base = theRevol.FirstShape();
397 exp.Init(Base, TopAbs_FACE);
398 TopoDS_Face theBase = TopoDS::Face(exp.Current());
399 exp.Next();
400 if(exp.More()) {
401 NotDone();
402 myStatusError = BRepFeat_InvFirstShape;
403 return;
404 }
405
406 //SetGluedFaces(mySkface, mySbase, theBase, mySlface, theRevol, myGluedF);
407 GluedFacesValid();
408 //VerifGluedFaces(mySkface, theBase, myBCurve, myCurves, theRevol, myGluedF);
409
410 theRevol.Curves(myCurves);
411 myBCurve = theRevol.BarycCurve();
412 GlobalPerform();
413 }
414 else {
415 TColGeom_SequenceOfCurve scur;
416 theRevol.Curves(myCurves);
417 myBCurve = theRevol.BarycCurve();
418 scur.Clear();
419 scur.Append(myBCurve);
420 LocOpe_CSIntersector ASI(mySUntil);
421 ASI.Perform(scur);
422 if (ASI.IsDone() && ASI.NbPoints(1) >=1) {
423 TopAbs_Orientation Or = ASI.Point(1,1).Orientation();
424 TopoDS_Face FUntil = ASI.Point(1,1).Face();
425 TopoDS_Shape Comp;
426 BRep_Builder B;
427 B.MakeCompound(TopoDS::Compound(Comp));
428 TopoDS_Solid S = BRepFeat::Tool(mySUntil, FUntil, Or);
429 if (!S.IsNull()) B.Add(Comp,S);
430 //modified by NIZNHY-PKV Thu Mar 21 18:17:31 2002 f
431 //BRepAlgo_Cut trP(VraiRevol,Comp);
432 BRepAlgoAPI_Cut trP(VraiRevol,Comp);
433 //modified by NIZNHY-PKV Thu Mar 21 18:17:37 2002 t
434 TopoDS_Shape Cutsh = trP.Shape();
435 TopExp_Explorer ex(Cutsh, TopAbs_SOLID);
436 for(; ex.More(); ex.Next()) {
437 TopExp_Explorer ex1(ex.Current(), TopAbs_FACE);
438 for(; ex1.More(); ex1.Next()) {
439 const TopoDS_Face& fac = TopoDS::Face(ex1.Current());
440 if(fac.IsSame(myPbase)) {
441 VraiRevol = ex.Current();
442 break;
443 }
444 }
445 }
446 if(myFuse == 1) {
447 //modified by NIZNHY-PKV Thu Mar 21 18:17:53 2002 f
448 //BRepAlgo_Fuse f(mySbase, VraiRevol);
449 //myShape = f.Shape();
450 //UpdateDescendants(f.Builder(), myShape, Standard_False);
451 BRepAlgoAPI_Fuse f(mySbase, VraiRevol);
452 myShape = f.Shape();
453 UpdateDescendants(f, myShape, Standard_False);
454 //modified by NIZNHY-PKV Thu Mar 21 18:17:57 2002 t
455 Done();
456 }
457 else if(myFuse == 0) {
458 //modified by NIZNHY-PKV Thu Mar 21 18:18:23 2002 f
459 //BRepAlgo_Cut c(mySbase, VraiRevol);
460 //myShape = c.Shape();
461 //UpdateDescendants(c.Builder(), myShape, Standard_False);
462 BRepAlgoAPI_Cut c(mySbase, VraiRevol);
463 myShape = c.Shape();
464 UpdateDescendants(c, myShape, Standard_False);
465 //modified by NIZNHY-PKV Thu Mar 21 18:18:28 2002 t
466 Done();
467 }
468 else {
469 myShape = VraiRevol;
470 Done();
471 }
472 }
473 }
0d969553 474 // Loop of control of descendance
7fd59977 475/*
476 TopExp_Explorer expr(mySbase, TopAbs_FACE);
477 char nom1[20], nom2[20];
478 Standard_Integer ii = 0;
479 for(; expr.More(); expr.Next()) {
480 ii++;
481 sprintf(nom1, "faceinitial_%d", ii);
482 DBRep::Set(nom1, expr.Current());
483 Standard_Integer jj = 0;
484 const TopTools_ListOfShape& list = Modified(expr.Current());
485 TopTools_ListIteratorOfListOfShape ite(list);
486 for(; ite.More(); ite.Next()) {
487 jj++;
488 sprintf(nom2, "facemodifie_%d_%d", ii, jj);
489 DBRep::Set(nom2, ite.Value());
490 }
491 }
492
493 expr.Init(myPbase, TopAbs_EDGE);
494 ii=0;
495 for(; expr.More(); expr.Next()) {
496 ii++;
497 sprintf(nom1, "edgeinitial_%d", ii);
498 DBRep::Set(nom1, expr.Current());
499 Standard_Integer jj = 0;
500 const TopTools_ListOfShape& list = Generated(expr.Current());
501 TopTools_ListIteratorOfListOfShape ite(list);
502 for(; ite.More(); ite.Next()) {
503 jj++;
504 sprintf(nom2, "facegeneree_%d_%d", ii, jj);
505 DBRep::Set(nom2, ite.Value());
506 }
507 }
508*/
509 }
510
511
512//=======================================================================
513//function : Perform
0d969553 514//purpose : feature limited by two shapes
7fd59977 515//=======================================================================
516
517void BRepFeat_MakeRevol::Perform(const TopoDS_Shape& From,
518 const TopoDS_Shape& Until)
519{
520#ifdef DEB
521 Standard_Boolean trc = BRepFeat_GettraceFEAT();
522 if (trc) cout << "BRepFeat_MakeRevol::Perform(From,Until)" << endl;
523#endif
524 if (From.IsNull() || Until.IsNull()) {
525 Standard_ConstructionError::Raise();
526 }
527 if (!mySkface.IsNull()) {
528 if (From.IsSame(mySkface)) {
529 myJustGluer = Standard_True;
530 Perform(Until);
531 if (myJustGluer) return;
532 }
533 else if (Until.IsSame(mySkface)) {
534 myJustGluer = Standard_True;
535 myAxis.Reverse();
536 Perform(From);
537 if (myJustGluer) return;
538 }
539 }
540
541 myGluedF.Clear();
542 myPerfSelection = BRepFeat_SelectionFU;
543 PerfSelectionValid();
544
545 TopExp_Explorer exp(From, TopAbs_FACE);
546 if (!exp.More()) {
547 Standard_ConstructionError::Raise();
548 }
549 exp.Init(Until, TopAbs_FACE);
550 if (!exp.More()) {
551 Standard_ConstructionError::Raise();
552 }
553
554 mySFrom = From;
555 Standard_Boolean Trff = TransformShapeFU(0);
556 ShapeFromValid();
557 mySUntil = Until;
558 Standard_Boolean Trfu = TransformShapeFU(1);
559 ShapeUntilValid();
560
561 if(Trfu != Trff) {
562 NotDone();
563 myStatusError = BRepFeat_IncTypes;
564 return;
565 }
566
567 LocOpe_Revol theRevol;
568 theRevol.Perform(myPbase, myAxis, 2*PI);
569 TopoDS_Shape VraiRevol = theRevol.Shape();
570
571 MajMap(myPbase,theRevol,myMap,myFShape,myLShape);
572
573 if(!Trff) {
574 myGShape = VraiRevol;
575 GeneratedShapeValid();
576
577 //SetGluedFaces(TopoDS_Face(), mySbase, myPbase, mySlface, theRevol, myGluedF);
578 GluedFacesValid();
579// VerifGluedFaces(mySkface, theBase, myBCurve, myCurves, theRevol, myGluedF);
580
581 theRevol.Curves(myCurves);
582 myBCurve = theRevol.BarycCurve();
583 GlobalPerform();
584 }
585 else {
586 theRevol.Curves(myCurves);
587 myBCurve = theRevol.BarycCurve();
588 TColGeom_SequenceOfCurve scur;
589 scur.Clear();
590 scur.Append(myBCurve);
591 LocOpe_CSIntersector ASI1(mySUntil);
592 LocOpe_CSIntersector ASI2(mySFrom);
593 ASI1.Perform(scur);
594 ASI2.Perform(scur);
595 TopAbs_Orientation OrU, OrF;
596 TopoDS_Face FFrom, FUntil;
597 Standard_Real PrF, PrU;
598 if (ASI1.IsDone() && ASI1.NbPoints(1) >=1) {
599 OrU = ASI1.Point(1,1).Orientation();
600 FUntil = ASI1.Point(1,1).Face();
601 PrU = ASI1.Point(1,1).Parameter();
602 }
603 else {
604 NotDone();
605 myStatusError = BRepFeat_NoIntersectU;
606 return;
607 }
608 if (ASI2.IsDone() && ASI2.NbPoints(1) >=1) {
609 Standard_Real pr1 = ASI2.Point(1,1).Parameter();
610 pr1 = ElCLib::InPeriod(pr1,PrU-2*PI,PrU);
611 Standard_Real pr2 = ASI2.Point(1,ASI2.NbPoints(1)).Parameter();
612 pr2 = ElCLib::InPeriod(pr2,PrU-2*PI,PrU);
613 OrF = OrU;
614 FFrom = ASI2.Point(1,1).Face();
615 PrF = Max(pr1, pr2);
616 }
617 else {
618 NotDone();
619 myStatusError = BRepFeat_NoIntersectF;
620 return;
621 }
622 if(!(PrU > PrF)) {
623 NotDone();
624 myStatusError = BRepFeat_IncParameter;
625 return;
626 }
627 TopoDS_Shape Comp;
628 BRep_Builder B;
629 B.MakeCompound(TopoDS::Compound(Comp));
630 TopoDS_Solid SF = BRepFeat::Tool(mySFrom, FFrom, OrF);
631 if (!SF.IsNull()) B.Add(Comp,SF);
632 TopoDS_Solid SU = BRepFeat::Tool(mySUntil, FUntil, OrU);
633 if (!SU.IsNull()) B.Add(Comp,SU);
634 //modified by NIZNHY-PKV Thu Mar 21 18:18:54 2002 f
635 //BRepAlgo_Cut trP(VraiRevol,Comp);
636 BRepAlgoAPI_Cut trP(VraiRevol,Comp);
637 //modified by NIZNHY-PKV Thu Mar 21 18:18:57 2002 t
638 TopoDS_Shape Cutsh = trP.Shape();
639 TopExp_Explorer ex(Cutsh, TopAbs_SOLID);
640// Standard_Real PrF = BRepFeat::ParametricBarycenter(mySFrom, myBCurve);
641// Standard_Real PrU = BRepFeat::ParametricBarycenter(mySUntil, myBCurve);
642 VraiRevol = ex.Current();
643 for(; ex.More(); ex.Next()) {
644 Standard_Real PrCur = BRepFeat::
645 ParametricBarycenter(ex.Current(), myBCurve);
646 if(PrF <= PrCur && PrU >= PrCur) {
647 VraiRevol = ex.Current();
648 break;
649 }
650 }
651 if(myFuse == 1) {
652 //modified by NIZNHY-PKV Thu Mar 21 18:19:14 2002 f
653 //BRepAlgo_Fuse f(mySbase, VraiRevol);
654 //myShape = f.Shape();
655 //UpdateDescendants(f.Builder(), myShape, Standard_False);
656 BRepAlgoAPI_Fuse f(mySbase, VraiRevol);
657 myShape = f.Shape();
658 UpdateDescendants(f, myShape, Standard_False);
659 //modified by NIZNHY-PKV Thu Mar 21 18:19:18 2002 t
660 Done();
661 }
662 else if(myFuse == 0) {
663 //modified by NIZNHY-PKV Thu Mar 21 18:19:46 2002 f
664 //BRepAlgo_Cut c(mySbase, VraiRevol);
665 //myShape = c.Shape();
666 //UpdateDescendants(c.Builder(), myShape, Standard_False);
667 BRepAlgoAPI_Cut c(mySbase, VraiRevol);
668 myShape = c.Shape();
669 UpdateDescendants(c, myShape, Standard_False);
670 //modified by NIZNHY-PKV Thu Mar 21 18:19:50 2002 t
671 Done();
672 }
673 else {
674 myShape = VraiRevol;
675 Done();
676 }
677 }
678}
679
680
681//=======================================================================
682//function : PerformThruAll
0d969553 683//purpose : feature throughout the initial shape
7fd59977 684//=======================================================================
685
686void BRepFeat_MakeRevol::PerformThruAll()
687{
688#ifdef DEB
689 Standard_Boolean trc = BRepFeat_GettraceFEAT();
690 if (trc) cout << "BRepFeat_MakeRevol::PerformThruAll()" << endl;
691#endif
692 Perform(2.*PI);
693}
694
695//=======================================================================
696//function : PerformUntilAngle
0d969553 697//purpose : feature till shape Until defined with the angle
7fd59977 698//=======================================================================
699
700void BRepFeat_MakeRevol::PerformUntilAngle(const TopoDS_Shape& Until,
701 const Standard_Real Angle)
702{
703#ifdef DEB
704 Standard_Boolean trc = BRepFeat_GettraceFEAT();
705 if (trc) cout << "BRepFeat_MakeRevol::PerformUntilAngle(Until,Angle)" << endl;
706#endif
707 if (Until.IsNull()) {
708 Perform(Angle);
709 }
710 if(Angle == 0) {
711 Perform(Until);
712 }
713 TopExp_Explorer exp(Until, TopAbs_FACE);
714 if (!exp.More()) {
715 Standard_ConstructionError::Raise();
716 }
717 if (!mySkface.IsNull() && Until.IsSame(mySkface)) {
718 Perform(Angle);
719 return;
720 }
721 myGluedF.Clear();
722 myPerfSelection = BRepFeat_NoSelection;
723 PerfSelectionValid();
724 mySFrom.Nullify();
725 ShapeFromValid();
726 mySUntil = Until;
727 Standard_Boolean Trf = TransformShapeFU(1);
728 ShapeUntilValid();
729
0d969553 730// Produce systematicallt an almost complete revolution
7fd59977 731// BRepSweep_Revol theRevol(myPbase,myAxis,2.*PI-10.*Precision::Angular());
732 LocOpe_Revol theRevol;
733 theRevol.Perform(myPbase, myAxis, Angle);
734 TopoDS_Shape VraiRevol = theRevol.Shape();
735
736 MajMap(myPbase,theRevol,myMap,myFShape,myLShape);
737
738 if(Trf) {
739 myGShape = VraiRevol;
740 GeneratedShapeValid();
741
742 TopoDS_Shape Base = theRevol.FirstShape();
743 exp.Init(Base, TopAbs_FACE);
744 TopoDS_Face theBase = TopoDS::Face(exp.Current());
745 exp.Next();
746 if(exp.More()) {
747 NotDone();
748 myStatusError = BRepFeat_InvFirstShape;
749 return;
750 }
751
752 //SetGluedFaces(mySkface, mySbase, theBase, mySlface, theRevol, myGluedF);
753 GluedFacesValid();
754 //VerifGluedFaces(mySkface, theBase, myBCurve, myCurves, theRevol, myGluedF);
755
756
757 theRevol.Curves(myCurves);
758 myBCurve = theRevol.BarycCurve();
759 GlobalPerform();
760 }
761 else {
762 TColGeom_SequenceOfCurve scur;
763 theRevol.Curves(myCurves);
764 myBCurve = theRevol.BarycCurve();
765 scur.Clear();
766 scur.Append(myBCurve);
767 LocOpe_CSIntersector ASI(mySUntil);
768 ASI.Perform(scur);
769 if (ASI.IsDone() && ASI.NbPoints(1) >=1) {
770 TopAbs_Orientation Or = ASI.Point(1,1).Orientation();
771 TopoDS_Face FUntil = ASI.Point(1,1).Face();
772 TopoDS_Shape Comp;
773 BRep_Builder B;
774 B.MakeCompound(TopoDS::Compound(Comp));
775 TopoDS_Solid S = BRepFeat::Tool(mySUntil, FUntil, Or);
776 if (!S.IsNull()) B.Add(Comp,S);
777 //modified by NIZNHY-PKV Thu Mar 21 18:20:14 2002 f
778 //BRepAlgo_Cut trP(VraiRevol,Comp);
779 BRepAlgoAPI_Cut trP(VraiRevol,Comp);
780 //modified by NIZNHY-PKV Thu Mar 21 18:20:19 2002 t
781 TopoDS_Shape Cutsh = trP.Shape();
782 TopExp_Explorer ex(Cutsh, TopAbs_SOLID);
783 for(; ex.More(); ex.Next()) {
784 TopExp_Explorer ex1(ex.Current(), TopAbs_FACE);
785 for(; ex1.More(); ex1.Next()) {
786 const TopoDS_Face& fac = TopoDS::Face(ex1.Current());
787 if(fac.IsSame(myPbase)) {
788 VraiRevol = ex.Current();
789 break;
790 }
791 }
792 }
793 if(myFuse == 1) {
794 //modified by NIZNHY-PKV Thu Mar 21 18:20:36 2002 f
795 //BRepAlgo_Fuse f(mySbase, VraiRevol);
796 //myShape = f.Shape();
797 //UpdateDescendants(f.Builder(), myShape, Standard_False);
798 BRepAlgoAPI_Fuse f(mySbase, VraiRevol);
799 myShape = f.Shape();
800 UpdateDescendants(f, myShape, Standard_False);
801 //modified by NIZNHY-PKV Thu Mar 21 18:20:40 2002 t
802 Done();
803 }
804 else if(myFuse == 0) {
805 //modified by NIZNHY-PKV Thu Mar 21 18:21:07 2002 f
806 //BRepAlgo_Cut c(mySbase, VraiRevol);
807 //myShape = c.Shape();
808 //UpdateDescendants(c.Builder(), myShape, Standard_False);
809 BRepAlgoAPI_Cut c(mySbase, VraiRevol);
810 myShape = c.Shape();
811 UpdateDescendants(c, myShape, Standard_False);
812 //modified by NIZNHY-PKV Thu Mar 21 18:21:26 2002 t
813 Done();
814 }
815 else {
816 myShape = VraiRevol;
817 Done();
818 }
819 }
820 }
821}
822//=======================================================================
823//function : Curves
0d969553 824//purpose : circles parallel to the generating edge of revolution
7fd59977 825//=======================================================================
826
827void BRepFeat_MakeRevol::Curves(TColGeom_SequenceOfCurve& scur)
828{
829 scur = myCurves;
830}
831
832//=======================================================================
833//function : BarycCurve
0d969553 834//purpose : pass through the center of mass of the primitive
7fd59977 835//=======================================================================
836
837Handle(Geom_Curve) BRepFeat_MakeRevol::BarycCurve()
838{
839 return myBCurve;
840}
841
842
843//=======================================================================
844//function : SetGluedFaces
0d969553 845//purpose : management of gluing faces
7fd59977 846//=======================================================================
847
848static void SetGluedFaces(const TopoDS_Face& theSkface,
849 const TopoDS_Shape& theSbase,
850 const TopoDS_Shape& thePbase,
851 const TopTools_DataMapOfShapeListOfShape& theSlmap,
852 LocOpe_Revol& theRevol,
853 TopTools_DataMapOfShapeShape& theMap)
854{
855 TopExp_Explorer exp;
856 if (!theSkface.IsNull() && thePbase.ShapeType() == TopAbs_FACE) {
857 for (exp.Init(theSbase,TopAbs_FACE); exp.More(); exp.Next()) {
858 if (exp.Current().IsSame(theSkface)) {
859 theMap.Bind(thePbase,theSkface);
860 break;
861 }
862 }
863 }
864 else {
865 TopExp_Explorer exp2;
866 for (exp.Init(thePbase,TopAbs_FACE);exp.More();exp.Next()) {
867 const TopoDS_Face& fac = TopoDS::Face(exp.Current());
868 for (exp2.Init(theSbase,TopAbs_FACE);exp2.More();exp2.Next()) {
869 if (exp2.Current().IsSame(fac)) {
870 theMap.Bind(fac,fac);
871 break;
872 }
873 }
874 }
875 }
876
0d969553 877 // Sliding
7fd59977 878 TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itm(theSlmap);
879 if(!theSlmap.IsEmpty()) {
880 for (; itm.More(); itm.Next()) {
881 const TopoDS_Face& fac = TopoDS::Face(itm.Key());
882 const TopTools_ListOfShape& ledg = itm.Value();
883 TopTools_ListIteratorOfListOfShape it;
884 for (it.Initialize(ledg); it.More(); it.Next()) {
885 const TopTools_ListOfShape& gfac = theRevol.Shapes(it.Value());
886 if (gfac.Extent() != 1) {
887#ifdef DEB
888 Standard_Boolean trc = BRepFeat_GettraceFEAT();
889 if (trc) cout << " BRepFeat_MakeRevol : Pb SetGluedFace" << endl;
890#endif
891 }
892 theMap.Bind(gfac.First(),fac);
893 }
894 }
895 }
896}
897
898//=======================================================================
899//function : VerifGluedFaces
0d969553
Y
900//purpose : Check intersection Tool/theSkface = thePbase
901// if yes -> OK otherwise -> case without gluing
7fd59977 902//=======================================================================
903
904static void VerifGluedFaces(const TopoDS_Face& theSkface,
905 const TopoDS_Shape& thePbase,
906 Handle(Geom_Curve)& theBCurve,
907 TColGeom_SequenceOfCurve& theCurves,
908 LocOpe_Revol& theRevol,
909 TopTools_DataMapOfShapeShape& theMap)
910{
911 Standard_Boolean GluedFaces = Standard_True;
912 TopoDS_Shape VraiRevol = theRevol.Shape();
913
914 TColGeom_SequenceOfCurve scur;
915 theRevol.Curves(theCurves);
916 theBCurve = theRevol.BarycCurve();
917 scur.Clear();
918 scur.Append(theBCurve);
919 LocOpe_CSIntersector ASI(theSkface);
920 ASI.Perform(scur);
921 if (ASI.IsDone() && ASI.NbPoints(1) >=1) {
922 TopAbs_Orientation Or = ASI.Point(1,1).Orientation();
923 TopoDS_Face FSk = ASI.Point(1,1).Face();
924 TopoDS_Shape Comp;
925 BRep_Builder B;
926 B.MakeCompound(TopoDS::Compound(Comp));
927 TopoDS_Solid S = BRepFeat::Tool(theSkface, FSk, Or);
928 if (!S.IsNull()) B.Add(Comp,S);
929 //modified by NIZNHY-PKV Thu Mar 21 18:21:54 2002 f
930 //BRepAlgo_Cut trP(VraiRevol,Comp);
931 BRepAlgoAPI_Cut trP(VraiRevol,Comp);
932 //modified by NIZNHY-PKV Thu Mar 21 18:21:58 2002 t
933 TopoDS_Shape Cutsh = trP.Shape();
934 TopExp_Explorer ex(Cutsh, TopAbs_SOLID);
935 for(; ex.More(); ex.Next()) {
936 TopExp_Explorer ex1(ex.Current(), TopAbs_FACE);
937 for(; ex1.More(); ex1.Next()) {
938 const TopoDS_Face& fac1 = TopoDS::Face(ex1.Current());
939 TopExp_Explorer ex2(thePbase, TopAbs_FACE);
940 for(; ex2.More(); ex2.Next()) {
941 const TopoDS_Face& fac2 = TopoDS::Face(ex2.Current());
942 if(fac1.IsSame(fac2)) break;
943 }
944 if (ex2.More()) break;
945 }
946 if (ex1.More()) continue;
947 GluedFaces = Standard_False;
948 break;
949 }
950 if (!GluedFaces) {
951#ifdef DEB
952 Standard_Boolean trc = BRepFeat_GettraceFEAT();
0d969553 953 if (trc) cout << " Intersection Revol/skface : no gluing" << endl;
7fd59977 954#endif
955 theMap.Clear();
956 }
957 }
958}
959
960//=======================================================================
961//function : MajMap
0d969553 962//purpose : management of descendants
7fd59977 963//=======================================================================
964
965static void MajMap(const TopoDS_Shape& theB,
966 const LocOpe_Revol& theP,
967 TopTools_DataMapOfShapeListOfShape& theMap, // myMap
968 TopoDS_Shape& theFShape, // myFShape
969 TopoDS_Shape& theLShape) // myLShape
970{
971 TopExp_Explorer exp(theP.FirstShape(),TopAbs_WIRE);
972 if (exp.More()) {
973 theFShape = exp.Current();
974 TopTools_ListOfShape thelist;
975 theMap.Bind(theFShape, thelist);
976 for (exp.Init(theP.FirstShape(),TopAbs_FACE);exp.More();exp.Next()) {
977 theMap(theFShape).Append(exp.Current());
978 }
979 }
980
981 exp.Init(theP.LastShape(),TopAbs_WIRE);
982 if (exp.More()) {
983 theLShape = exp.Current();
984 TopTools_ListOfShape thelist1;
985 theMap.Bind(theLShape, thelist1);
986 for (exp.Init(theP.LastShape(),TopAbs_FACE);exp.More();exp.Next()) {
987 theMap(theLShape).Append(exp.Current());
988 }
989 }
990
991 for (exp.Init(theB,TopAbs_EDGE); exp.More(); exp.Next()) {
992 if (!theMap.IsBound(exp.Current())) {
993 TopTools_ListOfShape thelist2;
994 theMap.Bind(exp.Current(), thelist2);
995 theMap(exp.Current()) = theP.Shapes(exp.Current());
996 }
997 }
998}
999
1000
1001
1002//=======================================================================
1003//function : ToFuse
0d969553 1004//purpose : two faces samedomaine or not
7fd59977 1005//=======================================================================
1006
1007Standard_Boolean ToFuse(const TopoDS_Face& F1,
1008 const TopoDS_Face& F2)
1009{
1010 if (F1.IsNull() || F2.IsNull()) {
1011 return Standard_False;
1012 }
1013
1014 Handle(Geom_Surface) S1,S2;
1015 TopLoc_Location loc1, loc2;
1016 Handle(Standard_Type) typS1,typS2;
1017 const Standard_Real tollin = Precision::Confusion();
1018 const Standard_Real tolang = Precision::Angular();
1019
1020 S1 = BRep_Tool::Surface(F1,loc1);
1021 S2 = BRep_Tool::Surface(F2,loc2);
1022
1023 typS1 = S1->DynamicType();
1024 typS2 = S2->DynamicType();
1025
1026 if (typS1 == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
1027 S1 = (*((Handle(Geom_RectangularTrimmedSurface)*)&S1))->BasisSurface();
1028 typS1 = S1->DynamicType();
1029 }
1030
1031 if (typS2 == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
1032 S2 = (*((Handle(Geom_RectangularTrimmedSurface)*)&S2))->BasisSurface();
1033 typS2 = S2->DynamicType();
1034 }
1035
1036 if (typS1 != typS2) {
1037 return Standard_False;
1038 }
1039
1040
1041 Standard_Boolean ValRet = Standard_False;
1042 if (typS1 == STANDARD_TYPE(Geom_Plane)) {
0d969553 1043 S1 = BRep_Tool::Surface(F1); // to apply the location.
7fd59977 1044 S2 = BRep_Tool::Surface(F2);
1045 gp_Pln pl1( (*((Handle(Geom_Plane)*)&S1))->Pln());
1046 gp_Pln pl2( (*((Handle(Geom_Plane)*)&S2))->Pln());
1047
1048 if (pl1.Position().IsCoplanar(pl2.Position(),tollin,tolang)) {
1049 ValRet = Standard_True;
1050 }
1051 }
1052
1053 return ValRet;
1054}
1055
1056
1057
1058
1059
1060
1061
1062
1063