1 // Created on: 1993-02-15
2 // Created by: Laurent BOURESCHE
3 // Copyright (c) 1993-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 <BRepSweep_Rotation.ixx>
18 #include <BRepTools_Quilt.hxx>
19 #include <BRepAdaptor_Curve.hxx>
20 #include <BRepAdaptor_Surface.hxx>
21 #include <BRep_Tool.hxx>
22 #include <BRepTools.hxx>
24 #include <TopoDS_Shape.hxx>
25 #include <TopoDS_Vertex.hxx>
29 #include <GeomAdaptor_Curve.hxx>
30 #include <GeomAdaptor_Surface.hxx>
31 #include <Adaptor3d_SurfaceOfRevolution.hxx>
32 #include <Geom_SurfaceOfRevolution.hxx>
33 #include <Geom_CylindricalSurface.hxx>
34 #include <Geom_ConicalSurface.hxx>
35 #include <Geom_SphericalSurface.hxx>
36 #include <Geom_ToroidalSurface.hxx>
37 #include <Geom_Plane.hxx>
38 #include <Geom_Circle.hxx>
39 #include <Geom_Line.hxx>
40 #include <Geom2d_Circle.hxx>
41 #include <Geom2d_Line.hxx>
43 #include <gp_Trsf.hxx>
44 #include <gp_Circ2d.hxx>
46 #include <gp_Dir2d.hxx>
48 #include <gp_Lin2d.hxx>
50 #include <gp_Pnt2d.hxx>
51 #include <gp_Ax22d.hxx>
52 #include <gp_Cylinder.hxx>
54 #include <gp_Cone.hxx>
55 #include <gp_Sphere.hxx>
56 #include <gp_Torus.hxx>
58 #include <Precision.hxx>
59 #include <Standard_ConstructionError.hxx>
61 #include <GeomAdaptor_HCurve.hxx>
62 #include <Geom_TrimmedCurve.hxx>
64 static Standard_Real ComputeTolerance(TopoDS_Edge& E,
66 const Handle(Geom2d_Curve)& C)
69 if(BRep_Tool::Degenerated(E)) return BRep_Tool::Tolerance(E);
71 Standard_Real first,last;
73 Handle(Geom_Surface) surf = BRep_Tool::Surface(F);
74 Handle(Geom_Curve) c3d = BRep_Tool::Curve(E,first,last);
76 Standard_Real d2 = 0.;
77 Standard_Integer nn = 23;
78 Standard_Real unsurnn = 1./nn;
79 for(Standard_Integer i = 0; i <= nn; i++){
80 Standard_Real t = unsurnn*i;
81 Standard_Real u = first*(1.-t) + last*t;
82 gp_Pnt Pc3d = c3d->Value(u);
83 gp_Pnt2d UV = C->Value(u);
84 gp_Pnt Pcons = surf->Value(UV.X(),UV.Y());
85 if (Precision::IsInfinite(Pcons.X()) ||
86 Precision::IsInfinite(Pcons.Y()) ||
87 Precision::IsInfinite(Pcons.Z())) {
88 d2=Precision::Infinite();
91 Standard_Real temp = Pc3d.SquareDistance(Pcons);
92 if(temp > d2) d2 = temp;
95 if(d2<1.e-7) d2 = 1.e-7;
99 static void SetThePCurve(const BRep_Builder& B,
101 const TopoDS_Face& F,
102 const TopAbs_Orientation O,
103 const Handle(Geom2d_Curve)& C)
105 // check if there is already a pcurve
107 Handle(Geom2d_Curve) OC;
109 Handle(Geom_Plane) GP = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(F,SL));
111 OC = BRep_Tool::CurveOnSurface(E,F,f,l);
113 B.UpdateEdge(E,C,F,ComputeTolerance(E,F,C));
115 if (O == TopAbs_REVERSED)
116 B.UpdateEdge(E,OC,C,F,ComputeTolerance(E,F,C));
118 B.UpdateEdge(E,C,OC,F,ComputeTolerance(E,F,C));
122 //=======================================================================
123 //function : BRepSweep_Rotation
125 //=======================================================================
127 BRepSweep_Rotation::BRepSweep_Rotation(const TopoDS_Shape& S,
128 const Sweep_NumShape& N,
129 const TopLoc_Location& L,
131 const Standard_Real D,
132 const Standard_Boolean C):
133 BRepSweep_Trsf(BRep_Builder(),S,N,L,C),
138 Standard_ConstructionError_Raise_if(D < Precision::Angular(),
139 "BRepSweep_Rotation::Constructor");
144 //=======================================================================
145 //function : MakeEmptyVertex
147 //=======================================================================
149 TopoDS_Shape BRepSweep_Rotation::MakeEmptyVertex
150 (const TopoDS_Shape& aGenV,
151 const Sweep_NumShape& aDirV)
153 //call only in construction mode with copy.
154 Standard_ConstructionError_Raise_if
155 (!myCopy,"BRepSweep_Translation::MakeEmptyVertex");
156 gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
158 if (aDirV.Index()==2) P.Transform(myLocation.Transformation());
159 ////// modified by jgv, 1.10.01, for buc61005 //////
160 //myBuilder.Builder().MakeVertex(V,P,Precision::Confusion());
161 myBuilder.Builder().MakeVertex( V, P, BRep_Tool::Tolerance(TopoDS::Vertex(aGenV)) );
162 ////////////////////////////////////////////////////
163 if (aDirV.Index() == 1 &&
164 IsInvariant(aGenV) &&
165 myDirShapeTool.NbShapes() == 3) {
166 myBuiltShapes(myGenShapeTool.Index(aGenV),3) = Standard_True;
167 myShapes(myGenShapeTool.Index(aGenV),3) = V;
173 //=======================================================================
174 //function : MakeEmptyDirectingEdge
176 //=======================================================================
178 TopoDS_Shape BRepSweep_Rotation::MakeEmptyDirectingEdge
179 (const TopoDS_Shape& aGenV,
180 const Sweep_NumShape&)
183 gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
184 gp_Dir Dirz(myAxe.Direction());
186 gp_Pnt O(myAxe.Location());
187 O.Translate(V.Dot(gp_Vec(O,P)) * V);
188 if (O.IsEqual(P,Precision::Confusion())) {
189 // make a degenerated edge
190 // temporary make 3D curve null so that
191 // parameters should be registered.
192 // myBuilder.Builder().MakeEdge(E);
194 Handle(Geom_Circle) GC = new Geom_Circle(Axis,0.);
196 MakeEdge(E,GC,BRep_Tool::Tolerance(TopoDS::Vertex(aGenV)));
197 myBuilder.Builder().Degenerated(E,Standard_True);
200 gp_Ax2 Axis(O,Dirz,gp_Dir(gp_Vec(O,P)));
201 Handle(Geom_Circle) GC = new Geom_Circle(Axis,O.Distance(P));
202 Standard_Real tol = BRep_Tool::Tolerance(TopoDS::Vertex(aGenV));
203 myBuilder.Builder().MakeEdge(E, GC, tol);
205 gp_Pnt PLast = GC->Value(myAng);
206 if(PLast.SquareDistance(P) > tol*tol) E.Closed(Standard_False);
216 //=======================================================================
217 //function : MakeEmptyGeneratingEdge
219 //=======================================================================
221 TopoDS_Shape BRepSweep_Rotation::MakeEmptyGeneratingEdge
222 (const TopoDS_Shape& aGenE,
223 const Sweep_NumShape& aDirV)
225 //call in case of construction with copy, or only when meridian touches myaxe.
226 Standard_Real First,Last;
228 Handle(Geom_Curve) C = Handle(Geom_Curve)::DownCast
229 (BRep_Tool::Curve(TopoDS::Edge(aGenE),Loc,First,Last)->Copy());
230 C->Transform(Loc.Transformation());
232 if(aDirV.Index() == 2) C->Transform(myLocation.Transformation());
233 myBuilder.Builder().MakeEdge(E,C,BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
234 if (aDirV.Index() == 1 &&
235 IsInvariant(aGenE) &&
236 myDirShapeTool.NbShapes() == 3) {
237 myBuiltShapes(myGenShapeTool.Index(aGenE),3) = Standard_True;
238 myShapes(myGenShapeTool.Index(aGenE),3) = E;
244 //=======================================================================
245 //function : SetParameters
247 //=======================================================================
249 void BRepSweep_Rotation::SetParameters
250 (const TopoDS_Shape& aNewFace,
251 TopoDS_Shape& aNewVertex,
252 const TopoDS_Shape& aGenF,
253 const TopoDS_Shape& aGenV,
254 const Sweep_NumShape&)
256 //Glue the parameter of vertices directly included in cap faces.
257 gp_Pnt2d pnt2d = BRep_Tool::Parameters(TopoDS::Vertex(aGenV),
258 TopoDS::Face(aGenF));
259 myBuilder.Builder().UpdateVertex
260 (TopoDS::Vertex(aNewVertex),pnt2d.X(),pnt2d.Y(),
261 TopoDS::Face(aNewFace),Precision::PConfusion());
264 //=======================================================================
265 //function : SetDirectingParameter
267 //=======================================================================
269 void BRepSweep_Rotation::SetDirectingParameter
270 (const TopoDS_Shape& aNewEdge,
271 TopoDS_Shape& aNewVertex,
273 const Sweep_NumShape&,
274 const Sweep_NumShape& aDirV)
276 Standard_Real param = 0;
277 TopAbs_Orientation ori = TopAbs_FORWARD;
278 if (aDirV.Index() == 2) {
280 ori = TopAbs_REVERSED;
282 TopoDS_Vertex V_wnt = TopoDS::Vertex(aNewVertex);
283 V_wnt.Orientation(ori);
284 myBuilder.Builder().UpdateVertex(V_wnt,
285 param,TopoDS::Edge(aNewEdge),
286 Precision::PConfusion());
290 //=======================================================================
291 //function : SetGeneratingParameter
293 //=======================================================================
295 void BRepSweep_Rotation::SetGeneratingParameter
296 (const TopoDS_Shape& aNewEdge,
297 TopoDS_Shape& aNewVertex,
298 const TopoDS_Shape& aGenE,
299 const TopoDS_Shape& aGenV,
300 const Sweep_NumShape&)
302 TopoDS_Vertex vbid = TopoDS::Vertex(aNewVertex);
303 vbid.Orientation(aGenV.Orientation());
304 myBuilder.Builder().UpdateVertex
306 BRep_Tool::Parameter(TopoDS::Vertex(aGenV),TopoDS::Edge(aGenE)),
307 TopoDS::Edge(aNewEdge),Precision::PConfusion());
311 //=======================================================================
312 //function : MakeEmptyFace
314 //=======================================================================
316 TopoDS_Shape BRepSweep_Rotation::MakeEmptyFace
317 (const TopoDS_Shape& aGenS,
318 const Sweep_NumShape& aDirS)
322 Handle(Geom_Surface) S;
323 if(aGenS.ShapeType()==TopAbs_EDGE){
325 Standard_Real First,Last;
326 Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(aGenS),L,First,Last);
327 toler = BRep_Tool::Tolerance(TopoDS::Edge(aGenS));
328 gp_Trsf Tr = L.Transformation();
329 C = Handle(Geom_Curve)::DownCast(C->Copy());
330 //// modified by jgv, 9.12.03 ////
331 C = new Geom_TrimmedCurve( C, First, Last );
332 //////////////////////////////////
335 Handle(GeomAdaptor_HCurve) HC = new GeomAdaptor_HCurve();
336 HC->ChangeCurve().Load(C,First,Last);
337 Adaptor3d_SurfaceOfRevolution AS(HC,myAxe);
338 switch(AS.GetType()){
341 Handle(Geom_Plane) Pl = new Geom_Plane(AS.Plane());
345 case GeomAbs_Cylinder :
347 Handle(Geom_CylindricalSurface) Cy =
348 new Geom_CylindricalSurface(AS.Cylinder());
352 case GeomAbs_Sphere :
354 Handle(Geom_SphericalSurface) Sp =
355 new Geom_SphericalSurface(AS.Sphere());
361 Handle(Geom_ConicalSurface) Co =
362 new Geom_ConicalSurface(AS.Cone());
368 Handle(Geom_ToroidalSurface) To =
369 new Geom_ToroidalSurface(AS.Torus());
375 Handle(Geom_SurfaceOfRevolution) Se =
376 new Geom_SurfaceOfRevolution(C,myAxe);
384 S = BRep_Tool::Surface(TopoDS::Face(aGenS),L);
385 toler = BRep_Tool::Tolerance(TopoDS::Face(aGenS));
386 gp_Trsf Tr = L.Transformation();
387 S = Handle(Geom_Surface)::DownCast(S->Copy());
389 if (aDirS.Index()==2) S->Transform(myLocation.Transformation());
391 myBuilder.Builder().MakeFace(F,S,toler);
396 //=======================================================================
397 //function : SetPCurve
399 //=======================================================================
401 void BRepSweep_Rotation::SetPCurve
402 (const TopoDS_Shape& aNewFace,
403 TopoDS_Shape& aNewEdge,
404 const TopoDS_Shape& aGenF,
405 const TopoDS_Shape& aGenE,
406 const Sweep_NumShape&,
407 const TopAbs_Orientation orien)
409 //Set on edges of cap faces the same pcurves as
410 //on edges of the generator face.
411 Standard_Real First,Last;
412 SetThePCurve(myBuilder.Builder(),
413 TopoDS::Edge(aNewEdge),
414 TopoDS::Face(aNewFace),
416 BRep_Tool::CurveOnSurface
417 (TopoDS::Edge(aGenE),TopoDS::Face(aGenF),First,Last));
421 //=======================================================================
422 //function : SetGeneratingPCurve
424 //=======================================================================
426 void BRepSweep_Rotation::SetGeneratingPCurve
427 (const TopoDS_Shape& aNewFace,
428 TopoDS_Shape& aNewEdge,
430 const Sweep_NumShape&,
431 const Sweep_NumShape& aDirV,
432 const TopAbs_Orientation orien)
435 GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewFace),Loc));
436 Standard_Real First,Last;
442 if (AS.GetType()==GeomAbs_Plane){
443 gp_Pln pln = AS.Plane();
444 gp_Ax3 ax3 = pln.Position();
445 Handle(Geom_Line) GL = Handle(Geom_Line)::DownCast
446 (BRep_Tool::Curve(TopoDS::Edge(aNewEdge),Loc,First,Last));
447 gp_Lin gl = GL->Lin();
448 gl.Transform(Loc.Transformation());
449 point = gl.Location();
450 gp_Dir dir = gl.Direction();
451 ElSLib::PlaneParameters(ax3,point,u,v);
453 dir2d.SetCoord(dir.Dot(ax3.XDirection()),dir.Dot(ax3.YDirection()));
454 L.SetLocation(pnt2d);
455 L.SetDirection(dir2d);
457 else if (AS.GetType()==GeomAbs_Torus){
458 gp_Torus tor = AS.Torus();
459 BRepAdaptor_Curve BC(TopoDS::Edge(aNewEdge));
460 Standard_Real U = BC.FirstParameter();
462 if (point.Distance(tor.Location()) < Precision::Confusion()) {
464 // modified by NIZHNY-EAP Wed Mar 1 17:49:29 2000 ___BEGIN___
468 ElSLib::TorusParameters(tor.Position(),tor.MajorRadius(),
469 tor.MinorRadius(),point,u,v);
472 v = ElCLib::InPeriod(v,0.,2*M_PI);
473 if((2*M_PI - v) <= Precision::PConfusion()) v -= 2*M_PI;
474 if (aDirV.Index() == 2) {
475 Standard_Real uLeft = u-myAng;
476 ElCLib::AdjustPeriodic(-M_PI,M_PI,Precision::PConfusion(),uLeft,u);
479 Standard_Real uRight = u+myAng;
480 ElCLib::AdjustPeriodic(-M_PI,M_PI,Precision::PConfusion(),u,uRight);
482 // modified by NIZHNY-EAP Wed Mar 1 17:49:32 2000 ___END___
483 pnt2d.SetCoord(u,v-U);
484 L.SetLocation(pnt2d);
485 L.SetDirection(gp::DY2d());
487 else if (AS.GetType()==GeomAbs_Sphere){
488 gp_Sphere sph = AS.Sphere();
489 BRepAdaptor_Curve BC(TopoDS::Edge(aNewEdge));
490 Standard_Real U = BC.FirstParameter();
492 ElSLib::SphereParameters(sph.Position(),sph.Radius(),point,u,v);
494 if (aDirV.Index() == 2) u = myAng;
495 pnt2d.SetCoord(u,v-U);
496 L.SetLocation(pnt2d);
497 L.SetDirection(gp::DY2d());
501 if (aDirV.Index() == 2) u = myAng;
502 L.SetLocation(gp_Pnt2d(u,0));
503 L.SetDirection(gp::DY2d());
505 Handle(Geom2d_Line) GL = new Geom2d_Line(L);
506 SetThePCurve(myBuilder.Builder(),
507 TopoDS::Edge(aNewEdge),
508 TopoDS::Face(aNewFace),
514 //=======================================================================
515 //function : SetDirectingPCurve
517 //=======================================================================
519 void BRepSweep_Rotation::SetDirectingPCurve
520 (const TopoDS_Shape& aNewFace,
521 TopoDS_Shape& aNewEdge,
522 const TopoDS_Shape& aGenE,
523 const TopoDS_Shape& aGenV,
524 const Sweep_NumShape&,
525 const TopAbs_Orientation orien)
528 GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewFace),Loc));
530 par = BRep_Tool::Parameter(TopoDS::Vertex(aGenV),TopoDS::Edge(aGenE));
531 gp_Pnt p2 = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
534 Handle(Geom2d_Curve) thePCurve;
536 switch(AS.GetType()){
540 gp_Pln pln = AS.Plane();
541 gp_Ax3 ax3 = pln.Position();
542 gp_Pnt p1 = pln.Location();
543 Standard_Real R = p1.Distance(p2);
544 ElSLib::PlaneParameters(ax3,p2,u,v);
546 gp_Ax22d axe(gp::Origin2d(),dx2d,gp::DY2d());
548 Handle(Geom2d_Circle) GC = new Geom2d_Circle(C);
555 gp_Cone cone = AS.Cone();
556 ElSLib::ConeParameters(cone.Position(),cone.RefRadius(),
557 cone.SemiAngle(),p2,u,v);
559 gp_Lin2d L(p22d,gp::DX2d());
560 Handle(Geom2d_Line) GL = new Geom2d_Line(L);
565 case GeomAbs_Sphere :
567 gp_Sphere sph = AS.Sphere();
568 ElSLib::SphereParameters(sph.Position(),sph.Radius(),p2,u,v);
570 gp_Lin2d L(p22d,gp::DX2d());
571 Handle(Geom2d_Line) GL = new Geom2d_Line(L);
579 Standard_Real u1,u2,v1,v2;
580 gp_Torus tor = AS.Torus();
581 BRepAdaptor_Curve BC(TopoDS::Edge(aGenE));
582 p1 = BC.Value(BC.FirstParameter());
583 if (p1.Distance(tor.Location()) < Precision::Confusion()){
585 // modified by NIZHNY-EAP Thu Mar 2 09:43:26 2000 ___BEGIN___
587 // modified by NIZHNY-EAP Thu Mar 2 15:28:59 2000 ___END___
590 ElSLib::TorusParameters(tor.Position(),tor.MajorRadius(),
591 tor.MinorRadius(),p1,u1,v1);
593 p2 = BC.Value(BC.LastParameter());
594 if (p2.Distance(tor.Location()) < Precision::Confusion()){
598 ElSLib::TorusParameters(tor.Position(),tor.MajorRadius(),
599 tor.MinorRadius(),p2,u2,v2);
601 ElCLib::AdjustPeriodic(0.,2*M_PI,Precision::PConfusion(),v1,v2);
602 // modified by NIZHNY-EAP Thu Mar 2 15:29:04 2000 ___BEGIN___
604 ElCLib::AdjustPeriodic(-M_PI,M_PI,Precision::PConfusion(),u1,u2);
605 if (aGenV.Orientation()==TopAbs_FORWARD){
606 p22d.SetCoord(u1,v1);
609 p22d.SetCoord(u1,v2);
610 // modified by NIZHNY-EAP Thu Mar 2 09:43:32 2000 ___END___
612 gp_Lin2d L(p22d,gp::DX2d());
613 Handle(Geom2d_Line) GL = new Geom2d_Line(L);
620 p22d.SetCoord(0.,par);
621 gp_Lin2d L(p22d,gp::DX2d());
622 Handle(Geom2d_Line) GL = new Geom2d_Line(L);
627 SetThePCurve(myBuilder.Builder(),
628 TopoDS::Edge(aNewEdge),
629 TopoDS::Face(aNewFace),
634 //modified by NIZNHY-PKV Tue Jun 14 08:33:55 2011f
635 //=======================================================================
636 //function : DirectSolid
638 //=======================================================================
640 BRepSweep_Rotation::DirectSolid (const TopoDS_Shape& aGenS,
641 const Sweep_NumShape&)
642 { // compare the face normal and the direction
643 Standard_Real aU1, aU2, aV1, aV2, aUx, aVx, aX, aMV2, aTol2, aTx;
644 TopAbs_Orientation aOr;
647 BRepAdaptor_Surface surf(TopoDS::Face(aGenS));
649 aTol2=Precision::Confusion();
652 const gp_Pnt& aPAxeLoc=myAxe.Location();
653 const gp_Dir& aPAxeDir=myAxe.Direction();
655 aU1=surf.FirstUParameter();
656 aU2=surf.LastUParameter();
657 aV1=surf.FirstVParameter();
658 aV2=surf.LastVParameter();
663 surf.D1(aUx, aVx, aP, du, dv);
665 gp_Vec aV(aPAxeLoc, aP);
667 aMV2=aV.SquareMagnitude();
670 aUx=aU1*(1.-aTx)+aU2*aTx;
671 aVx=aV1*(1.-aTx)+aV2*aTx;
672 surf.D1(aUx, aVx, aP, du, dv);
673 aV.SetXYZ(aP.XYZ()-aPAxeLoc.XYZ());
677 aX = aV.DotCross(du, dv);
678 aOr = (aX > 0.) ? TopAbs_FORWARD : TopAbs_REVERSED;
682 //=======================================================================
683 //function : DirectSolid
685 //=======================================================================
687 BRepSweep_Rotation::DirectSolid (const TopoDS_Shape& aGenS,
688 const Sweep_NumShape&)
690 // compare the face normal and the direction
691 BRepAdaptor_Surface surf(TopoDS::Face(aGenS));
694 surf.D1((surf.FirstUParameter() + surf.LastUParameter()) / 2.,
695 (surf.FirstVParameter() + surf.LastVParameter()) / 2.,
698 gp_Vec V(myAxe.Location(),P);
699 V.Cross(myAxe.Direction());
700 Standard_Real x = V.DotCross(du,dv);
701 TopAbs_Orientation orient = (x > 0) ? TopAbs_FORWARD : TopAbs_REVERSED;
705 //modified by NIZNHY-PKV Tue Jun 14 08:33:59 2011t
707 //=======================================================================
708 //function : GGDShapeIsToAdd
710 //=======================================================================
712 Standard_Boolean BRepSweep_Rotation::GGDShapeIsToAdd
713 (const TopoDS_Shape& aNewShape,
714 const TopoDS_Shape& aNewSubShape,
715 const TopoDS_Shape& aGenS,
716 const TopoDS_Shape& aSubGenS,
717 const Sweep_NumShape& aDirS )const
719 if (aNewShape.ShapeType()==TopAbs_FACE &&
720 aNewSubShape.ShapeType()==TopAbs_EDGE &&
721 aGenS.ShapeType()==TopAbs_EDGE &&
722 aSubGenS.ShapeType()==TopAbs_VERTEX &&
723 aDirS.Type()==TopAbs_EDGE){
725 GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewShape),Loc));
726 if (AS.GetType()==GeomAbs_Plane){
727 return (!IsInvariant(aSubGenS));
730 return Standard_True;
734 return Standard_True;
739 //=======================================================================
740 //function : GDDShapeIsToAdd
742 //=======================================================================
744 Standard_Boolean BRepSweep_Rotation::GDDShapeIsToAdd
745 (const TopoDS_Shape& aNewShape,
746 const TopoDS_Shape& aNewSubShape,
747 const TopoDS_Shape& aGenS,
748 const Sweep_NumShape& aDirS,
749 const Sweep_NumShape& aSubDirS )const
751 if ( aNewShape.ShapeType() == TopAbs_SOLID &&
752 aNewSubShape.ShapeType() == TopAbs_FACE &&
753 aGenS.ShapeType() == TopAbs_FACE &&
754 aDirS.Type() == TopAbs_EDGE &&
755 aSubDirS.Type() == TopAbs_VERTEX ){
756 return ( Abs(myAng - 2 * M_PI) > Precision::Angular() );
758 else if ( aNewShape.ShapeType() == TopAbs_FACE &&
759 aNewSubShape.ShapeType() == TopAbs_EDGE &&
760 aGenS.ShapeType() == TopAbs_EDGE &&
761 aDirS.Type() == TopAbs_EDGE &&
762 aSubDirS.Type() == TopAbs_VERTEX ){
764 GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewShape),Loc));
765 if (AS.GetType()==GeomAbs_Plane){
766 return ( Abs(myAng - 2 * M_PI) > Precision::Angular() );
769 return Standard_True;
773 return Standard_True;
778 //=======================================================================
779 //function : SeparatedWires
781 //=======================================================================
783 Standard_Boolean BRepSweep_Rotation::SeparatedWires
784 (const TopoDS_Shape& aNewShape,
785 const TopoDS_Shape& aNewSubShape,
786 const TopoDS_Shape& aGenS,
787 const TopoDS_Shape& aSubGenS,
788 const Sweep_NumShape& aDirS )const
790 if (aNewShape.ShapeType()==TopAbs_FACE &&
791 aNewSubShape.ShapeType()==TopAbs_EDGE &&
792 aGenS.ShapeType()==TopAbs_EDGE &&
793 aSubGenS.ShapeType()==TopAbs_VERTEX &&
794 aDirS.Type()==TopAbs_EDGE){
796 GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewShape),Loc));
797 if (AS.GetType()==GeomAbs_Plane){
798 return (Abs(myAng-2*M_PI) <= Precision::Angular());
801 return Standard_False;
805 return Standard_False;
809 //=======================================================================
810 //function : SplitShell
812 //=======================================================================
814 TopoDS_Shape BRepSweep_Rotation::SplitShell(const TopoDS_Shape& aNewShape)const
821 //=======================================================================
822 //function : HasShape
824 //=======================================================================
826 Standard_Boolean BRepSweep_Rotation::HasShape
827 (const TopoDS_Shape& aGenS,
828 const Sweep_NumShape& aDirS)const
830 if(aDirS.Type()==TopAbs_EDGE&&
831 aGenS.ShapeType()==TopAbs_EDGE){
832 return !IsInvariant(aGenS);
835 return Standard_True;
840 //=======================================================================
841 //function : IsInvariant
843 //=======================================================================
845 Standard_Boolean BRepSweep_Rotation::IsInvariant
846 (const TopoDS_Shape& aGenS)const
848 if(aGenS.ShapeType()==TopAbs_EDGE){
850 Standard_Real First,Last;
852 C = BRep_Tool::Curve(TopoDS::Edge(aGenS),Loc,First,Last);
853 Handle(Standard_Type) TheType = C->DynamicType();
854 if ( TheType == STANDARD_TYPE(Geom_Line)) {
855 TopoDS_Vertex V1, V2;
856 TopExp::Vertices(TopoDS::Edge(aGenS), V1, V2);
857 return ( IsInvariant(V1) && IsInvariant(V2));
860 return Standard_False;
863 else if(aGenS.ShapeType()==TopAbs_VERTEX){
864 gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aGenS));
865 gp_Lin Lin (myAxe.Location(), myAxe.Direction());
866 return ( Lin.Distance(P) <= BRep_Tool::Tolerance(TopoDS::Vertex(aGenS)));
869 return Standard_False;
872 //=======================================================================
875 //=======================================================================
877 Standard_Real BRepSweep_Rotation::Angle()const
882 //=======================================================================
885 //=======================================================================
887 gp_Ax1 BRepSweep_Rotation::Axe()const