1 // Created on: 1991-07-24
2 // Created by: Christophe MARION
3 // Copyright (c) 1991-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.
18 #include <BRepPrim_Builder.hxx>
19 #include <BRepPrim_Direction.hxx>
20 #include <BRepPrim_OneAxis.hxx>
22 #include <gp_Circ.hxx>
23 #include <gp_Circ2d.hxx>
25 #include <gp_Lin2d.hxx>
27 #include <gp_Pnt2d.hxx>
29 #include <Precision.hxx>
30 #include <Standard_DomainError.hxx>
31 #include <Standard_OutOfRange.hxx>
32 #include <TopoDS_Edge.hxx>
33 #include <TopoDS_Face.hxx>
34 #include <TopoDS_Shell.hxx>
35 #include <TopoDS_Vertex.hxx>
36 #include <TopoDS_Wire.hxx>
57 #define WLATERALSTART 0
72 //=======================================================================
73 //function : BRepPrim_OneAxis_Check
74 //purpose : raise Standard_DomainError if something was built
75 //=======================================================================
77 static void BRepPrim_OneAxis_Check(const Standard_Boolean V[],
78 const Standard_Boolean E[],
79 const Standard_Boolean W[],
80 const Standard_Boolean F[])
83 for (i = 0; i < NBVERTICES; i++)
84 if (V[i]) throw Standard_DomainError();
85 for (i = 0; i < NBEDGES; i++)
86 if (E[i]) throw Standard_DomainError();
87 for (i = 0; i < NBWIRES; i++)
88 if (W[i]) throw Standard_DomainError();
89 for (i = 0; i < NBFACES; i++)
90 if (F[i]) throw Standard_DomainError();
93 //=======================================================================
94 //function : BRepPrim_OneAxis
96 //=======================================================================
98 BRepPrim_OneAxis::BRepPrim_OneAxis(const BRepPrim_Builder& B,
100 const Standard_Real VMin,
101 const Standard_Real VMax) :
112 ShellBuilt = Standard_False;
113 for (i = 0; i < NBVERTICES; i++)
114 VerticesBuilt[i] = Standard_False;
115 for (i = 0; i < NBEDGES; i++)
116 EdgesBuilt[i] = Standard_False;
117 for (i = 0; i < NBWIRES; i++)
118 WiresBuilt[i] = Standard_False;
119 for (i = 0; i < NBFACES; i++)
120 FacesBuilt[i] = Standard_False;
124 //=======================================================================
125 //function : ~BRepPrim_OneAxis
126 //purpose : Destructor
127 //=======================================================================
129 BRepPrim_OneAxis::~BRepPrim_OneAxis()
133 //=======================================================================
134 //function : SetMeridianOffset
136 //=======================================================================
138 void BRepPrim_OneAxis::SetMeridianOffset(const Standard_Real O)
140 myMeridianOffset = O;
143 //=======================================================================
144 //function : Axes, Angle, VMin, VMax
146 //=======================================================================
148 const gp_Ax2& BRepPrim_OneAxis::Axes () const
153 void BRepPrim_OneAxis::Axes (const gp_Ax2& A)
155 BRepPrim_OneAxis_Check(VerticesBuilt,EdgesBuilt,WiresBuilt,FacesBuilt);
159 Standard_Real BRepPrim_OneAxis::Angle () const
164 void BRepPrim_OneAxis::Angle (const Standard_Real A)
166 BRepPrim_OneAxis_Check(VerticesBuilt,EdgesBuilt,WiresBuilt,FacesBuilt);
170 Standard_Real BRepPrim_OneAxis::VMin () const
175 void BRepPrim_OneAxis::VMin (const Standard_Real V)
177 BRepPrim_OneAxis_Check(VerticesBuilt,EdgesBuilt,WiresBuilt,FacesBuilt);
181 Standard_Real BRepPrim_OneAxis::VMax () const
186 void BRepPrim_OneAxis::VMax (const Standard_Real V)
188 BRepPrim_OneAxis_Check(VerticesBuilt,EdgesBuilt,WiresBuilt,FacesBuilt);
192 //=======================================================================
193 //function : MeridianOnAxis
195 //=======================================================================
197 Standard_Boolean BRepPrim_OneAxis::MeridianOnAxis
198 (const Standard_Real V) const
200 return Abs(MeridianValue(V).X()) < Precision::Confusion();
203 //=======================================================================
204 //function : MeridianClosed
206 //=======================================================================
208 Standard_Boolean BRepPrim_OneAxis::MeridianClosed() const
210 if (VMaxInfinite()) return Standard_False;
211 if (VMinInfinite()) return Standard_False;
212 return MeridianValue(myVMin).IsEqual(MeridianValue(myVMax),
213 Precision::Confusion());
216 //=======================================================================
217 //function : VMaxInfinite
219 //=======================================================================
221 Standard_Boolean BRepPrim_OneAxis::VMaxInfinite() const
223 return Precision::IsPositiveInfinite(myVMax);
226 //=======================================================================
227 //function : VMinInfinite
229 //=======================================================================
231 Standard_Boolean BRepPrim_OneAxis::VMinInfinite() const
233 return Precision::IsNegativeInfinite(myVMin);
236 //=======================================================================
239 //=======================================================================
241 Standard_Boolean BRepPrim_OneAxis::HasTop() const
243 if (VMaxInfinite()) return Standard_False;
244 if (MeridianClosed()) return Standard_False;
245 if (MeridianOnAxis(myVMax)) return Standard_False;
246 return Standard_True;
249 //=======================================================================
250 //function : HasBottom
252 //=======================================================================
254 Standard_Boolean BRepPrim_OneAxis::HasBottom() const
256 if (VMinInfinite()) return Standard_False;
257 if (MeridianClosed()) return Standard_False;
258 if (MeridianOnAxis(myVMin)) return Standard_False;
259 return Standard_True;
262 //=======================================================================
263 //function : HasSides
265 //=======================================================================
267 Standard_Boolean BRepPrim_OneAxis::HasSides() const
269 return 2*M_PI - myAngle > Precision::Angular();
272 //=======================================================================
275 //=======================================================================
277 const TopoDS_Shell& BRepPrim_OneAxis::Shell()
280 myBuilder.MakeShell(myShell);
282 myBuilder.AddShellFace(myShell,LateralFace());
284 myBuilder.AddShellFace(myShell,TopFace());
286 myBuilder.AddShellFace(myShell,BottomFace());
288 myBuilder.AddShellFace(myShell,StartFace());
289 myBuilder.AddShellFace(myShell,EndFace());
292 myShell.Closed (BRep_Tool::IsClosed (myShell));
293 myBuilder.CompleteShell(myShell);
294 ShellBuilt = Standard_True;
299 //=======================================================================
300 //function : LateralFace
301 //purpose : build the lateral face
302 //=======================================================================
304 const TopoDS_Face& BRepPrim_OneAxis::LateralFace ()
307 if (!FacesBuilt[FLATERAL]) {
309 // build an empty lateral face
310 myFaces[FLATERAL] = MakeEmptyLateralFace();
313 if (VMaxInfinite() && VMinInfinite()) {
314 myBuilder.AddFaceWire(myFaces[FLATERAL],LateralStartWire());
315 myBuilder.AddFaceWire(myFaces[FLATERAL],LateralEndWire());
318 myBuilder.AddFaceWire(myFaces[FLATERAL],LateralWire());
320 // put the parametric curves
321 if (MeridianClosed()) {
323 myBuilder.SetPCurve(myEdges[ETOP],myFaces[FLATERAL],
324 gp_Lin2d(gp_Pnt2d(0,myVMin),gp_Dir2d(1,0)),
325 gp_Lin2d(gp_Pnt2d(0,myVMax),gp_Dir2d(1,0)));
328 if (!VMaxInfinite()) {
329 myBuilder.SetPCurve(myEdges[ETOP],myFaces[FLATERAL],
330 gp_Lin2d(gp_Pnt2d(0,myVMax),gp_Dir2d(1,0)));
331 if (!HasSides() || MeridianOnAxis(myVMax)) {
332 // closed edge set parameters
333 myBuilder.SetParameters(myEdges[ETOP],
338 if (!VMinInfinite()) {
339 myBuilder.SetPCurve(myEdges[EBOTTOM],myFaces[FLATERAL],
340 gp_Lin2d(gp_Pnt2d(0,myVMin),gp_Dir2d(1,0)));
341 if (!HasSides() || MeridianOnAxis(myVMin)) {
342 // closed edge set parameters
343 myBuilder.SetParameters(myEdges[EBOTTOM],
350 myBuilder.SetPCurve(myEdges[ESTART],myFaces[FLATERAL],
351 gp_Lin2d(gp_Pnt2d(0,-myMeridianOffset),
354 myBuilder.SetPCurve(myEdges[EEND],myFaces[FLATERAL],
355 gp_Lin2d(gp_Pnt2d(myAngle,-myMeridianOffset),
360 myBuilder.SetPCurve(myEdges[ESTART],myFaces[FLATERAL],
361 gp_Lin2d(gp_Pnt2d(myAngle,-myMeridianOffset),
363 gp_Lin2d(gp_Pnt2d(0,-myMeridianOffset),
366 myBuilder.CompleteFace(myFaces[FLATERAL]);
367 FacesBuilt[FLATERAL] = Standard_True;
369 return myFaces[FLATERAL];
372 //=======================================================================
374 //purpose : build and return the TopFace
375 //=======================================================================
377 const TopoDS_Face& BRepPrim_OneAxis::TopFace ()
380 if (!FacesBuilt[FTOP]) {
382 Standard_DomainError_Raise_if(!HasTop(),
383 "BRepPrim_OneAxis::TopFace:No top face");
385 // make the empty face by translating the axes
386 Standard_Real z = MeridianValue(myVMax).Y();
387 gp_Vec V = myAxes.Direction();
389 myBuilder.MakeFace(myFaces[FTOP],gp_Pln(myAxes.Translated(V)));
391 myBuilder.AddFaceWire(myFaces[FTOP],TopWire());
393 // put the parametric curves
394 myBuilder.SetPCurve(myEdges[ETOP],myFaces[FTOP],
395 gp_Circ2d(gp_Ax2d(gp_Pnt2d(0,0),gp_Dir2d(1,0)),
396 MeridianValue(myVMax).X()));
398 myBuilder.SetPCurve(myEdges[ETOPSTART],myFaces[FTOP],
399 gp_Lin2d(gp_Pnt2d(0,0),gp_Dir2d(1,0)));
400 myBuilder.SetPCurve(myEdges[ETOPEND],myFaces[FTOP],
401 gp_Lin2d(gp_Pnt2d(0,0),
402 gp_Dir2d(Cos(myAngle),Sin(myAngle))));
405 myBuilder.CompleteFace(myFaces[FTOP]);
406 FacesBuilt[FTOP] = Standard_True;
409 return myFaces[FTOP];
412 //=======================================================================
413 //function : BottomFace
415 //=======================================================================
417 const TopoDS_Face& BRepPrim_OneAxis::BottomFace ()
420 if (!FacesBuilt[FBOTTOM]) {
422 Standard_DomainError_Raise_if(!HasBottom(),
423 "BRepPrim_OneAxis::BottomFace:No bottom face");
425 // make the empty face by translating the axes
426 Standard_Real z = MeridianValue(myVMin).Y();
427 gp_Vec V = myAxes.Direction();
429 gp_Ax2 axes = myAxes.Translated(V);
430 myBuilder.MakeFace(myFaces[FBOTTOM],gp_Pln(axes));
431 myBuilder.ReverseFace(myFaces[FBOTTOM]);
432 myBuilder.AddFaceWire(myFaces[FBOTTOM],BottomWire());
434 // put the parametric curves
435 myBuilder.SetPCurve(myEdges[EBOTTOM],myFaces[FBOTTOM],
436 gp_Circ2d(gp_Ax2d(gp_Pnt2d(0,0),gp_Dir2d(1,0)),
437 MeridianValue(myVMin).X()));
439 myBuilder.SetPCurve(myEdges[EBOTSTART],myFaces[FBOTTOM],
440 gp_Lin2d(gp_Pnt2d(0,0),gp_Dir2d(1,0)));
441 myBuilder.SetPCurve(myEdges[EBOTEND],myFaces[FBOTTOM],
442 gp_Lin2d(gp_Pnt2d(0,0),
443 gp_Dir2d(Cos(myAngle),Sin(myAngle))));
446 myBuilder.CompleteFace(myFaces[FBOTTOM]);
447 FacesBuilt[FBOTTOM] = Standard_True;
450 return myFaces[FBOTTOM];
453 //=======================================================================
454 //function : StartFace
456 //=======================================================================
458 const TopoDS_Face& BRepPrim_OneAxis::StartFace ()
461 if (!FacesBuilt[FSTART]) {
463 Standard_DomainError_Raise_if(!HasSides(),
464 "BRepPrim_OneAxes::StartFace:No side faces");
466 // build the empty face, perpendicular to myTool.Axes()
467 gp_Ax2 axes(myAxes.Location(),myAxes.YDirection().Reversed(),myAxes.XDirection());
468 myBuilder.MakeFace(myFaces[FSTART],gp_Pln(axes));
471 if (VMaxInfinite() && VMinInfinite())
472 myBuilder.AddFaceWire(myFaces[FSTART],AxisStartWire());
474 myBuilder.AddFaceWire(myFaces[FSTART],StartWire());
477 SetMeridianPCurve(myEdges[ESTART],myFaces[FSTART]);
478 if (EdgesBuilt[EAXIS])
479 myBuilder.SetPCurve(myEdges[EAXIS],myFaces[FSTART],
480 gp_Lin2d(gp_Pnt2d(0,0),gp_Dir2d(0,1)));
481 if (EdgesBuilt[ETOPSTART])
482 myBuilder.SetPCurve(myEdges[ETOPSTART],myFaces[FSTART],
483 gp_Lin2d(gp_Pnt2d(0,MeridianValue(myVMax).Y()),gp_Dir2d(1,0)));
484 if (EdgesBuilt[EBOTSTART])
485 myBuilder.SetPCurve(myEdges[EBOTSTART],myFaces[FSTART],
486 gp_Lin2d(gp_Pnt2d(0,MeridianValue(myVMin).Y()),gp_Dir2d(1,0)));
489 myBuilder.CompleteFace(myFaces[FSTART]);
490 FacesBuilt[FSTART] = Standard_True;
493 return myFaces[FSTART];
496 //=======================================================================
499 //=======================================================================
501 const TopoDS_Face& BRepPrim_OneAxis::EndFace ()
504 if (!FacesBuilt[FEND]) {
506 Standard_DomainError_Raise_if(!HasSides(),
507 "BRepPrim_OneAxes::EndFace:No side faces");
509 // build the empty face, perpendicular to myTool.Axes()
510 gp_Ax2 axes(myAxes.Location(),myAxes.YDirection().Reversed(),myAxes.XDirection());
511 axes.Rotate(myAxes.Axis(),myAngle);
512 myBuilder.MakeFace(myFaces[FEND],gp_Pln(axes));
513 myBuilder.ReverseFace(myFaces[FEND]);
515 if (VMaxInfinite() && VMinInfinite())
516 myBuilder.AddFaceWire(myFaces[FEND],AxisEndWire());
517 myBuilder.AddFaceWire(myFaces[FEND],EndWire());
520 SetMeridianPCurve(myEdges[EEND],myFaces[FEND]);
521 if (EdgesBuilt[EAXIS])
522 myBuilder.SetPCurve(myEdges[EAXIS],myFaces[FEND],
523 gp_Lin2d(gp_Pnt2d(0,0),gp_Dir2d(0,1)));
524 if (EdgesBuilt[ETOPEND])
525 myBuilder.SetPCurve(myEdges[ETOPEND],myFaces[FEND],
526 gp_Lin2d(gp_Pnt2d(0,MeridianValue(myVMax).Y()),
528 if (EdgesBuilt[EBOTEND])
529 myBuilder.SetPCurve(myEdges[EBOTEND],myFaces[FEND],
530 gp_Lin2d(gp_Pnt2d(0,MeridianValue(myVMin).Y()),
533 myBuilder.CompleteFace(myFaces[FEND]);
534 FacesBuilt[FEND] = Standard_True;
537 return myFaces[FEND];
540 //=======================================================================
541 //function : LateralWire
543 //=======================================================================
545 const TopoDS_Wire& BRepPrim_OneAxis::LateralWire ()
548 if (!WiresBuilt[WLATERAL]) {
550 myBuilder.MakeWire(myWires[WLATERAL]);
553 myBuilder.AddWireEdge(myWires[WLATERAL],TopEdge() ,Standard_False);
554 myBuilder.AddWireEdge( myWires[WLATERAL],EndEdge() ,Standard_True);
556 myBuilder.AddWireEdge(myWires[WLATERAL],BottomEdge() ,Standard_True);
557 myBuilder.AddWireEdge( myWires[WLATERAL],StartEdge() ,Standard_False);
559 myBuilder.CompleteWire(myWires[WLATERAL]);
560 WiresBuilt[WLATERAL] = Standard_True;
563 return myWires[WLATERAL];
567 //=======================================================================
568 //function : LateralStartWire
570 //=======================================================================
572 const TopoDS_Wire& BRepPrim_OneAxis::LateralStartWire ()
575 if (!WiresBuilt[WLATERALSTART]) {
577 myBuilder.MakeWire(myWires[WLATERALSTART]);
579 myBuilder.AddWireEdge(myWires[WLATERALSTART],StartEdge(),Standard_False);
581 myBuilder.CompleteWire(myWires[WLATERALSTART]);
582 WiresBuilt[WLATERALSTART] = Standard_True;
585 return myWires[WLATERALSTART];
589 //=======================================================================
590 //function : LateralEndWire
592 //=======================================================================
594 const TopoDS_Wire& BRepPrim_OneAxis::LateralEndWire ()
597 if (!WiresBuilt[WLATERALEND]) {
599 myBuilder.MakeWire(myWires[WLATERALEND]);
601 myBuilder.AddWireEdge(myWires[WLATERALEND],EndEdge(),Standard_True);
603 myBuilder.CompleteWire(myWires[WLATERALEND]);
604 WiresBuilt[WLATERALEND] = Standard_True;
607 return myWires[WLATERALEND];
610 //=======================================================================
613 //=======================================================================
615 const TopoDS_Wire& BRepPrim_OneAxis::TopWire ()
618 if (!WiresBuilt[WTOP]) {
620 Standard_DomainError_Raise_if(!HasTop(),
621 "BRepPrim_OneAxis::TopWire: no top");
623 myBuilder.MakeWire(myWires[WTOP]);
625 myBuilder.AddWireEdge(myWires[WTOP],TopEdge() ,Standard_True);
627 myBuilder.AddWireEdge(myWires[WTOP],StartTopEdge() ,Standard_True);
628 myBuilder.AddWireEdge(myWires[WTOP],EndTopEdge() ,Standard_False);
630 myBuilder.CompleteWire(myWires[WTOP]);
631 WiresBuilt[WTOP] = Standard_True;
634 return myWires[WTOP];
637 //=======================================================================
638 //function : BottomWire
640 //=======================================================================
642 const TopoDS_Wire& BRepPrim_OneAxis::BottomWire ()
645 if (!WiresBuilt[WBOTTOM]) {
647 Standard_DomainError_Raise_if(!HasBottom(),
648 "BRepPrim_OneAxis::BottomWire: no bottom");
650 myBuilder.MakeWire(myWires[WBOTTOM]);
652 myBuilder.AddWireEdge(myWires[WBOTTOM],BottomEdge() ,Standard_False);
654 myBuilder.AddWireEdge(myWires[WBOTTOM],EndBottomEdge() ,Standard_True);
655 myBuilder.AddWireEdge(myWires[WBOTTOM],StartBottomEdge(),Standard_False);
658 myBuilder.CompleteWire(myWires[WBOTTOM]);
659 WiresBuilt[WBOTTOM] = Standard_True;
662 return myWires[WBOTTOM];
665 //=======================================================================
666 //function : StartWire
668 //=======================================================================
670 const TopoDS_Wire& BRepPrim_OneAxis::StartWire ()
673 if (!WiresBuilt[WSTART]) {
675 Standard_DomainError_Raise_if(!HasSides(),
676 "BRepPrim_OneAxes::StartWire:no sides");
678 myBuilder.MakeWire(myWires[WSTART]);
681 myBuilder.AddWireEdge(myWires[WSTART],StartBottomEdge() ,Standard_True);
683 if (!MeridianClosed()) {
684 if (!VMaxInfinite() || !VMinInfinite())
685 myBuilder.AddWireEdge( myWires[WSTART],AxisEdge() ,Standard_False);
689 myBuilder.AddWireEdge(myWires[WSTART],StartTopEdge() ,Standard_False);
690 myBuilder.AddWireEdge( myWires[WSTART],StartEdge() ,Standard_True);
692 myBuilder.CompleteWire(myWires[WSTART]);
693 WiresBuilt[WSTART] = Standard_True;
696 return myWires[WSTART];
699 //=======================================================================
700 //function : AxisStartWire
702 //=======================================================================
704 const TopoDS_Wire& BRepPrim_OneAxis::AxisStartWire ()
707 if (!WiresBuilt[WAXISSTART]) {
709 Standard_DomainError_Raise_if
711 "BRepPrim_OneAxes::AxisStartWire:no sides");
713 Standard_DomainError_Raise_if
714 (!VMaxInfinite() || !VMinInfinite(),
715 "BRepPrim_OneAxes::AxisStartWire:not infinite");
717 Standard_DomainError_Raise_if
719 "BRepPrim_OneAxes::AxisStartWire:meridian closed");
721 myBuilder.MakeWire(myWires[WAXISSTART]);
723 myBuilder.AddWireEdge( myWires[WAXISSTART],AxisEdge() ,Standard_False);
725 myBuilder.CompleteWire(myWires[WAXISSTART]);
726 WiresBuilt[WAXISSTART] = Standard_True;
729 return myWires[WAXISSTART];
732 //=======================================================================
735 //=======================================================================
737 const TopoDS_Wire& BRepPrim_OneAxis::EndWire ()
740 if (!WiresBuilt[WEND]) {
742 Standard_DomainError_Raise_if(!HasSides(),
743 "BRepPrim_OneAxes::EndWire:no sides");
745 myBuilder.MakeWire(myWires[WEND]);
748 myBuilder.AddWireEdge(myWires[WEND],EndTopEdge(), Standard_True);
749 if (!MeridianClosed()) {
750 if (!VMaxInfinite() || !VMinInfinite()) {
751 myBuilder.AddWireEdge( myWires[WEND],AxisEdge(), Standard_True);
755 myBuilder.AddWireEdge(myWires[WEND],EndBottomEdge(), Standard_False);
756 myBuilder.AddWireEdge( myWires[WEND],EndEdge(), Standard_False);
758 myBuilder.CompleteWire(myWires[WEND]);
759 WiresBuilt[WEND] = Standard_True;
761 return myWires[WEND];
764 //=======================================================================
765 //function : AxisEndWire
767 //=======================================================================
769 const TopoDS_Wire& BRepPrim_OneAxis::AxisEndWire ()
772 if (!WiresBuilt[WAXISEND]) {
774 Standard_DomainError_Raise_if
776 "BRepPrim_OneAxes::AxisEndWire:no sides");
778 Standard_DomainError_Raise_if
779 (!VMaxInfinite() || !VMinInfinite(),
780 "BRepPrim_OneAxes::AxisEndWire:not infinite");
782 Standard_DomainError_Raise_if
784 "BRepPrim_OneAxes::AxisEndWire:meridian closed");
786 myBuilder.MakeWire(myWires[WAXISEND]);
788 myBuilder.AddWireEdge( myWires[WAXISEND],AxisEdge(), Standard_True);
790 myBuilder.CompleteWire(myWires[WAXISEND]);
791 WiresBuilt[WAXISEND] = Standard_True;
793 return myWires[WAXISEND];
796 //=======================================================================
797 //function : AxisEdge
798 //purpose : make the edge on the axis, oriented +Z
799 //=======================================================================
801 const TopoDS_Edge& BRepPrim_OneAxis::AxisEdge ()
804 if (!EdgesBuilt[EAXIS]) {
806 Standard_DomainError_Raise_if(!HasSides(),
807 "BRepPrim_OneAxis::AxisEdge:no sides");
808 Standard_DomainError_Raise_if(MeridianClosed(),
809 "BRepPrim_OneAxis::AxisEdge:closed");
811 // build the empty edge.
812 myBuilder.MakeEdge(myEdges[EAXIS],gp_Lin(myAxes.Axis()));
815 myBuilder.AddEdgeVertex(myEdges[EAXIS],AxisTopVertex(),
816 MeridianValue(myVMax).Y(),Standard_False);
818 myBuilder.AddEdgeVertex(myEdges[EAXIS],AxisBottomVertex(),
819 MeridianValue(myVMin).Y(),Standard_True);
821 myBuilder.CompleteEdge(myEdges[EAXIS]);
822 EdgesBuilt[EAXIS] = Standard_True;
825 return myEdges[EAXIS];
828 //=======================================================================
829 //function : StartEdge
831 //=======================================================================
833 const TopoDS_Edge& BRepPrim_OneAxis::StartEdge ()
836 if (!EdgesBuilt[ESTART]) {
838 // is it shared with the EndEdge
840 if (!HasSides() && EdgesBuilt[EEND])
841 myEdges[ESTART] = myEdges[EEND];
844 // build the empty Edge
845 myEdges[ESTART] = MakeEmptyMeridianEdge(0.);
847 if (MeridianClosed()) {
849 myBuilder.AddEdgeVertex(myEdges[ESTART],
851 myVMin+myMeridianOffset,
852 myVMax+myMeridianOffset);
855 if (!VMaxInfinite()) {
856 myBuilder.AddEdgeVertex(myEdges[ESTART],
858 myVMax+myMeridianOffset,
861 if (!VMinInfinite()) {
862 myBuilder.AddEdgeVertex(myEdges[ESTART],
864 myVMin+myMeridianOffset,
870 myBuilder.CompleteEdge(myEdges[ESTART]);
871 EdgesBuilt[ESTART] = Standard_True;
875 return myEdges[ESTART];
878 //=======================================================================
881 //=======================================================================
883 const TopoDS_Edge& BRepPrim_OneAxis::EndEdge ()
886 if (!EdgesBuilt[EEND]) {
888 // is it shared with the start edge
889 if (!HasSides() && EdgesBuilt[ESTART])
890 myEdges[EEND] = myEdges[ESTART];
893 // build the empty Edge
894 myEdges[EEND] = MakeEmptyMeridianEdge(myAngle);
897 if (MeridianClosed()) {
899 myBuilder.AddEdgeVertex(myEdges[EEND],
901 myVMin+myMeridianOffset,
902 myVMax+myMeridianOffset);
905 if (!VMaxInfinite()) {
906 myBuilder.AddEdgeVertex(myEdges[EEND],
908 myVMax+myMeridianOffset,
911 if (!VMinInfinite()) {
912 myBuilder.AddEdgeVertex(myEdges[EEND],
914 myVMin+myMeridianOffset,
920 myBuilder.CompleteEdge(myEdges[EEND]);
921 EdgesBuilt[EEND] = Standard_True;
925 return myEdges[EEND];
928 //=======================================================================
929 //function : StartTopEdge
931 //=======================================================================
933 const TopoDS_Edge& BRepPrim_OneAxis::StartTopEdge ()
936 if (!EdgesBuilt[ETOPSTART]) {
938 Standard_DomainError_Raise_if
939 (!HasTop() || !HasSides(),
940 "BRepPrim_OneAxis::StartTopEdge:no sides or no top");
942 // build the empty Edge
943 gp_Vec V = myAxes.Direction();
944 V.Multiply(MeridianValue(myVMax).Y());
945 gp_Pnt P = myAxes.Location().Translated(V);
946 myBuilder.MakeEdge(myEdges[ETOPSTART],gp_Lin(P,myAxes.XDirection()));
948 myBuilder.AddEdgeVertex(myEdges[ETOPSTART],AxisTopVertex(),
950 myBuilder.AddEdgeVertex(myEdges[ETOPSTART],TopStartVertex(),
951 MeridianValue(myVMax).X(),Standard_False);
953 myBuilder.CompleteEdge(myEdges[ETOPSTART]);
954 EdgesBuilt[ETOPSTART] = Standard_True;
957 return myEdges[ETOPSTART];
960 //=======================================================================
961 //function : StartBottomEdge
963 //=======================================================================
965 const TopoDS_Edge& BRepPrim_OneAxis::StartBottomEdge ()
968 if (!EdgesBuilt[EBOTSTART]) {
970 Standard_DomainError_Raise_if
971 (!HasBottom() || !HasSides(),
972 "BRepPrim_OneAxis::StartBottomEdge:no sides or no top");
974 // build the empty Edge
975 gp_Vec V = myAxes.Direction();
976 V.Multiply(MeridianValue(myVMin).Y());
977 gp_Pnt P = myAxes.Location().Translated(V);
978 myBuilder.MakeEdge(myEdges[EBOTSTART],gp_Lin(P,myAxes.XDirection()));
980 myBuilder.AddEdgeVertex(myEdges[EBOTSTART],BottomStartVertex(),
981 MeridianValue(myVMin).X(),Standard_False);
982 myBuilder.AddEdgeVertex(myEdges[EBOTSTART],AxisBottomVertex(),
985 myBuilder.CompleteEdge(myEdges[EBOTSTART]);
986 EdgesBuilt[EBOTSTART] = Standard_True;
989 return myEdges[EBOTSTART];
992 //=======================================================================
993 //function : EndTopEdge
995 //=======================================================================
997 const TopoDS_Edge& BRepPrim_OneAxis::EndTopEdge ()
1000 if (!EdgesBuilt[ETOPEND]) {
1002 Standard_DomainError_Raise_if
1003 (!HasTop() || !HasSides(),
1004 "BRepPrim_OneAxis::EndTopEdge:no sides or no top");
1006 // build the empty Edge
1007 gp_Vec V = myAxes.Direction();
1008 V.Multiply(MeridianValue(myVMax).Y());
1009 gp_Pnt P = myAxes.Location().Translated(V);
1010 gp_Lin L(P,myAxes.XDirection());
1011 L.Rotate(myAxes.Axis(),myAngle);
1012 myBuilder.MakeEdge(myEdges[ETOPEND],L);
1014 myBuilder.AddEdgeVertex(myEdges[ETOPEND],AxisTopVertex(),
1016 myBuilder.AddEdgeVertex(myEdges[ETOPEND],TopEndVertex(),
1017 MeridianValue(myVMax).X(),Standard_False);
1019 myBuilder.CompleteEdge(myEdges[ETOPEND]);
1020 EdgesBuilt[ETOPEND] = Standard_True;
1023 return myEdges[ETOPEND];
1026 //=======================================================================
1027 //function : EndBottomEdge
1029 //=======================================================================
1031 const TopoDS_Edge& BRepPrim_OneAxis::EndBottomEdge ()
1033 // do it if not done
1034 if (!EdgesBuilt[EBOTEND]) {
1037 Standard_DomainError_Raise_if
1038 (!HasBottom() || !HasSides(),
1039 "BRepPrim_OneAxis::EndBottomEdge:no sides or no bottom");
1041 // build the empty Edge
1042 gp_Vec V = myAxes.Direction();
1043 V.Multiply(MeridianValue(myVMin).Y());
1044 gp_Pnt P = myAxes.Location().Translated(V);
1045 gp_Lin L(P,myAxes.XDirection());
1046 L.Rotate(myAxes.Axis(),myAngle);
1047 myBuilder.MakeEdge(myEdges[EBOTEND],L);
1049 myBuilder.AddEdgeVertex(myEdges[EBOTEND],AxisBottomVertex(),
1051 myBuilder.AddEdgeVertex(myEdges[EBOTEND],BottomEndVertex(),
1052 MeridianValue(myVMin).X(),Standard_False);
1054 myBuilder.CompleteEdge(myEdges[EBOTEND]);
1055 EdgesBuilt[EBOTEND] = Standard_True;
1058 return myEdges[EBOTEND];
1061 //=======================================================================
1062 //function : TopEdge
1064 //=======================================================================
1066 const TopoDS_Edge& BRepPrim_OneAxis::TopEdge ()
1068 // do it if not done
1069 if (!EdgesBuilt[ETOP]) {
1071 // Test if shared with bottom edge
1072 if (MeridianClosed() && EdgesBuilt[EBOTTOM]) {
1073 myEdges[ETOP] = myEdges[EBOTTOM];
1078 // build the empty Edge
1079 if (!MeridianOnAxis(myVMax)) {
1080 gp_Pnt2d mp = MeridianValue(myVMax);
1081 gp_Vec V = myAxes.Direction();
1083 gp_Pnt P = myAxes.Location().Translated(V);
1084 gp_Circ C(gp_Ax2(P,myAxes.Direction(),myAxes.XDirection()),mp.X());
1085 myBuilder.MakeEdge(myEdges[ETOP],C);
1088 myBuilder.MakeDegeneratedEdge(myEdges[ETOP]);
1092 myBuilder.AddEdgeVertex(myEdges[ETOP],
1097 myBuilder.AddEdgeVertex(myEdges[ETOP],
1101 myBuilder.AddEdgeVertex(myEdges[ETOP],
1108 myBuilder.CompleteEdge(myEdges[ETOP]);
1109 EdgesBuilt[ETOP] = Standard_True;
1112 return myEdges[ETOP];
1115 //=======================================================================
1116 //function : BottomEdge
1118 //=======================================================================
1120 const TopoDS_Edge& BRepPrim_OneAxis::BottomEdge ()
1122 // do it if not done
1123 if (!EdgesBuilt[EBOTTOM]) {
1125 // Test if shared with top edge
1126 if (MeridianClosed() && EdgesBuilt[ETOP]) {
1127 myEdges[EBOTTOM] = myEdges[ETOP];
1132 // build the empty Edge
1134 if (!MeridianOnAxis(myVMin)) {
1135 gp_Pnt2d mp = MeridianValue(myVMin);
1136 gp_Vec V = myAxes.Direction();
1138 gp_Pnt P = myAxes.Location().Translated(V);
1139 gp_Circ C(gp_Ax2(P,myAxes.Direction(),myAxes.XDirection()),mp.X());
1140 myBuilder.MakeEdge(myEdges[EBOTTOM],C);
1143 myBuilder.MakeDegeneratedEdge(myEdges[EBOTTOM]);
1147 myBuilder.AddEdgeVertex(myEdges[EBOTTOM],
1152 myBuilder.AddEdgeVertex(myEdges[EBOTTOM],
1156 myBuilder.AddEdgeVertex(myEdges[EBOTTOM],
1157 BottomStartVertex(),
1163 myBuilder.CompleteEdge(myEdges[EBOTTOM]);
1164 EdgesBuilt[EBOTTOM] = Standard_True;
1167 return myEdges[EBOTTOM];
1170 //=======================================================================
1171 //function : AxisTopVertex
1173 //=======================================================================
1175 const TopoDS_Vertex& BRepPrim_OneAxis::AxisTopVertex ()
1177 // do it if not done
1178 if (!VerticesBuilt[VAXISTOP]) {
1180 // deduct from others
1181 if (MeridianOnAxis(myVMax) && VerticesBuilt[VTOPSTART])
1182 myVertices[VAXISTOP] = myVertices[VTOPSTART];
1184 else if (MeridianOnAxis(myVMax) && VerticesBuilt[VTOPEND])
1185 myVertices[VAXISTOP] = myVertices[VTOPEND];
1188 Standard_DomainError_Raise_if(MeridianClosed(),
1189 "BRepPrim_OneAxis::AxisTopVertex");
1190 Standard_DomainError_Raise_if(VMaxInfinite(),
1191 "BRepPrim_OneAxis::AxisTopVertex");
1193 gp_Vec V = myAxes.Direction();
1194 V.Multiply(MeridianValue(myVMax).Y());
1195 gp_Pnt P = myAxes.Location().Translated(V);
1196 myBuilder.MakeVertex(myVertices[VAXISTOP],P);
1199 VerticesBuilt[VAXISTOP] = Standard_True;
1202 return myVertices[VAXISTOP];
1205 //=======================================================================
1206 //function : AxisBottomVertex
1208 //=======================================================================
1210 const TopoDS_Vertex& BRepPrim_OneAxis::AxisBottomVertex ()
1212 // do it if not done
1213 if (!VerticesBuilt[VAXISBOT]) {
1215 // deduct from others
1216 if (MeridianOnAxis(myVMin) && VerticesBuilt[VBOTSTART])
1217 myVertices[VAXISBOT] = myVertices[VBOTSTART];
1219 else if (MeridianOnAxis(myVMin) && VerticesBuilt[VBOTEND])
1220 myVertices[VAXISBOT] = myVertices[VBOTEND];
1223 Standard_DomainError_Raise_if(MeridianClosed(),
1224 "BRepPrim_OneAxis::AxisBottomVertex");
1225 Standard_DomainError_Raise_if(VMinInfinite(),
1226 "BRepPrim_OneAxis::AxisBottomVertex");
1228 gp_Vec V = myAxes.Direction();
1229 V.Multiply(MeridianValue(myVMin).Y());
1230 gp_Pnt P = myAxes.Location().Translated(V);
1231 myBuilder.MakeVertex(myVertices[VAXISBOT],P);
1234 VerticesBuilt[VAXISBOT] = Standard_True;
1237 return myVertices[VAXISBOT];
1240 //=======================================================================
1241 //function : TopStartVertex
1243 //=======================================================================
1245 const TopoDS_Vertex& BRepPrim_OneAxis::TopStartVertex ()
1247 // do it if not done
1248 if (!VerticesBuilt[VTOPSTART]) {
1250 // deduct from others
1251 if (MeridianOnAxis(myVMax) && VerticesBuilt[VAXISTOP])
1252 myVertices[VTOPSTART] = myVertices[VAXISTOP];
1253 else if ((MeridianOnAxis(myVMax) || !HasSides()) && VerticesBuilt[VTOPEND])
1254 myVertices[VTOPSTART] = myVertices[VTOPEND];
1255 else if (MeridianClosed() && VerticesBuilt[VBOTSTART])
1256 myVertices[VTOPSTART] = myVertices[VBOTSTART];
1257 else if ((MeridianClosed() && !HasSides()) && VerticesBuilt[VBOTEND])
1258 myVertices[VTOPSTART] = myVertices[VBOTEND];
1261 gp_Pnt2d mp = MeridianValue(myVMax);
1262 gp_Vec V = myAxes.Direction();
1264 gp_Pnt P = myAxes.Location().Translated(V);
1265 V = myAxes.XDirection();
1268 myBuilder.MakeVertex(myVertices[VTOPSTART],P);
1271 VerticesBuilt[VTOPSTART] = Standard_True;
1274 return myVertices[VTOPSTART];
1277 //=======================================================================
1278 //function : TopEndVertex
1280 //=======================================================================
1282 const TopoDS_Vertex& BRepPrim_OneAxis::TopEndVertex ()
1284 // do it if not done
1285 if (!VerticesBuilt[VTOPEND]) {
1288 // deduct from others
1289 if (MeridianOnAxis(myVMax) && VerticesBuilt[VAXISTOP])
1290 myVertices[VTOPEND] = myVertices[VAXISTOP];
1291 else if ((MeridianOnAxis(myVMax) || !HasSides()) && VerticesBuilt[VTOPSTART])
1292 myVertices[VTOPEND] = myVertices[VTOPSTART];
1293 else if (MeridianClosed() && VerticesBuilt[VBOTEND])
1294 myVertices[VTOPEND] = myVertices[VBOTEND];
1295 else if ((MeridianClosed() && !HasSides()) && VerticesBuilt[VBOTSTART])
1296 myVertices[VTOPEND] = myVertices[VBOTSTART];
1299 gp_Pnt2d mp = MeridianValue(myVMax);
1300 gp_Vec V = myAxes.Direction();
1302 gp_Pnt P = myAxes.Location().Translated(V);
1303 V = myAxes.XDirection();
1306 P.Rotate(myAxes.Axis(),myAngle);
1307 myBuilder.MakeVertex(myVertices[VTOPEND],P);
1310 VerticesBuilt[VTOPEND] = Standard_True;
1313 return myVertices[VTOPEND];
1316 //=======================================================================
1317 //function : BottomStartVertex
1319 //=======================================================================
1321 const TopoDS_Vertex& BRepPrim_OneAxis::BottomStartVertex ()
1323 // do it if not done
1324 if (!VerticesBuilt[VBOTSTART]) {
1326 // deduct from others
1327 if (MeridianOnAxis(myVMin) && VerticesBuilt[VAXISBOT])
1328 myVertices[VBOTSTART] = myVertices[VAXISBOT];
1329 else if ((MeridianOnAxis(myVMin) || !HasSides()) && VerticesBuilt[VBOTEND])
1330 myVertices[VBOTSTART] = myVertices[VBOTEND];
1331 else if (MeridianClosed() && VerticesBuilt[VTOPSTART])
1332 myVertices[VBOTSTART] = myVertices[VTOPSTART];
1333 else if ((MeridianClosed() && !HasSides()) && VerticesBuilt[VTOPEND])
1334 myVertices[VBOTSTART] = myVertices[VTOPEND];
1337 gp_Pnt2d mp = MeridianValue(myVMin);
1338 gp_Vec V = myAxes.Direction();
1340 gp_Pnt P = myAxes.Location().Translated(V);
1341 V = myAxes.XDirection();
1344 myBuilder.MakeVertex(myVertices[VBOTSTART],P);
1347 VerticesBuilt[VBOTSTART] = Standard_True;
1350 return myVertices[VBOTSTART];
1353 //=======================================================================
1354 //function : BottomEndVertex
1356 //=======================================================================
1358 const TopoDS_Vertex& BRepPrim_OneAxis::BottomEndVertex ()
1360 // do it if not done
1361 if (!VerticesBuilt[VBOTEND]) {
1363 // deduct from others
1364 if (MeridianOnAxis(myVMin) && VerticesBuilt[VAXISBOT])
1365 myVertices[VBOTEND] = myVertices[VAXISBOT];
1366 else if ((MeridianOnAxis(myVMin) || !HasSides()) && VerticesBuilt[VBOTSTART])
1367 myVertices[VBOTEND] = myVertices[VBOTSTART];
1368 else if (MeridianClosed() && VerticesBuilt[VTOPEND])
1369 myVertices[VBOTEND] = myVertices[VTOPEND];
1370 else if (MeridianClosed() && !HasSides() && VerticesBuilt[VTOPSTART])
1371 myVertices[VBOTEND] = myVertices[VTOPSTART];
1374 gp_Pnt2d mp = MeridianValue(myVMin);
1375 gp_Vec V = myAxes.Direction();
1377 gp_Pnt P = myAxes.Location().Translated(V);
1378 V = myAxes.XDirection();
1381 P.Rotate(myAxes.Axis(),myAngle);
1382 myBuilder.MakeVertex(myVertices[VBOTEND],P);
1385 VerticesBuilt[VBOTEND] = Standard_True;
1388 return myVertices[VBOTEND];