1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/BRepPrim/BRepPrim_OneAxis.cxx
dln a104bb8fe2 0024734: Convertation of the generic classes to the non-generic. Part 4
Generic classes "LProp_FuncCurExt", "LProp_FuncCurNul" and "LProp_NumericCurInf" from "LProp" package converted to the non-generic classes and moved to the "Geom2dLProp" package. Therefore names of this classes were changed to "Geom2dLProp_FuncCurExt", "Geom2dLProp_FuncCurNul" and "Geom2dLProp_NumericCurInf".
Generic class "Sweep_LinearRegularSweep" from "Sweep" package converted to the non-generic classes and moved to the "BRepSweep" package. Therefore name of this class was changed to "BRepSweep_NumLinearRegularSweep". Also 2 internal classes of "BRepSweep_NumLinearRegularSweep" moved to "BRepSweep.cdl".
Generic classes "Primitives_Wedge" and "Primitives_OneAxis" from "Primitives" package converted to the non-generic classes and moved to the "BRepPrim" package. Therefore names of this classes were changed to "BRepPrim_GWedge" and "BRepPrim_OneAxis". Also enum "Direction" moved to BRepPrim. Therefore all "Primitives" package was deleted.
And some other minor changes were done.

Internal classes Array2OfShapes and SequenceOfShapes from BRepSweep_NumLinearRegularSweep replaced to Array2OfShape and SequenceOfShape from TopTools.
2014-03-27 16:30:38 +04:00

1391 lines
39 KiB
C++

// Created on: 1991-07-24
// Created by: Christophe MARION
// Copyright (c) 1991-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <BRepPrim_OneAxis.ixx>
#include <Precision.hxx>
#include <TopoDS_Shell.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Vertex.hxx>
#include <BRepPrim_Builder.hxx>
#include <BRepPrim_Direction.hxx>
#include <gp_Pln.hxx>
#include <gp_Lin2d.hxx>
#include <gp_Circ2d.hxx>
#include <gp_Lin.hxx>
#include <gp_Circ.hxx>
#include <gp_Vec.hxx>
#include <Standard_DomainError.hxx>
#include <Standard_OutOfRange.hxx>
#undef Standard_True
#undef Standard_False
#define Standard_True ((Standard_Boolean) 1)
#define Standard_False ((Standard_Boolean) 0)
#define NBVERTICES 6
#define VAXISTOP 0
#define VAXISBOT 1
#define VTOPSTART 2
#define VTOPEND 3
#define VBOTSTART 4
#define VBOTEND 5
#define NBEDGES 9
#define EAXIS 0
#define ESTART 1
#define EEND 2
#define ETOPSTART 3
#define ETOPEND 4
#define EBOTSTART 5
#define EBOTEND 6
#define ETOP 7
#define EBOTTOM 8
#define NBWIRES 9
#define WLATERAL 0
#define WLATERALSTART 0
#define WLATERALEND 1
#define WTOP 2
#define WBOTTOM 3
#define WSTART 5
#define WAXISSTART 6
#define WEND 7
#define WAXISEND 8
#define NBFACES 5
#define FLATERAL 0
#define FTOP 1
#define FBOTTOM 2
#define FSTART 3
#define FEND 4
//=======================================================================
//function : BRepPrim_OneAxis_Check
//purpose : raise Standard_DomainError if something was built
//=======================================================================
static void BRepPrim_OneAxis_Check(const Standard_Boolean V[],
const Standard_Boolean E[],
const Standard_Boolean W[],
const Standard_Boolean F[])
{
Standard_Integer i;
for (i = 0; i < NBVERTICES; i++)
if (V[i]) Standard_DomainError::Raise();
for (i = 0; i < NBEDGES; i++)
if (E[i]) Standard_DomainError::Raise();
for (i = 0; i < NBWIRES; i++)
if (W[i]) Standard_DomainError::Raise();
for (i = 0; i < NBFACES; i++)
if (F[i]) Standard_DomainError::Raise();
}
//=======================================================================
//function : BRepPrim_OneAxis
//purpose :
//=======================================================================
BRepPrim_OneAxis::BRepPrim_OneAxis(const BRepPrim_Builder& B,
const gp_Ax2& A,
const Standard_Real VMin,
const Standard_Real VMax) :
myBuilder(B),
myAxes(A),
myAngle(2*M_PI),
myVMin(VMin),
myVMax(VMax),
myMeridianOffset(0)
{
// init Built flags
Standard_Integer i;
ShellBuilt = Standard_False;
for (i = 0; i < NBVERTICES; i++)
VerticesBuilt[i] = Standard_False;
for (i = 0; i < NBEDGES; i++)
EdgesBuilt[i] = Standard_False;
for (i = 0; i < NBWIRES; i++)
WiresBuilt[i] = Standard_False;
for (i = 0; i < NBFACES; i++)
FacesBuilt[i] = Standard_False;
}
void BRepPrim_OneAxis::Delete()
{}
//=======================================================================
//function : SetMeridianOffset
//purpose :
//=======================================================================
void BRepPrim_OneAxis::SetMeridianOffset(const Standard_Real O)
{
myMeridianOffset = O;
}
//=======================================================================
//function : Axes, Angle, VMin, VMax
//purpose :
//=======================================================================
const gp_Ax2& BRepPrim_OneAxis::Axes () const
{
return myAxes;
}
void BRepPrim_OneAxis::Axes (const gp_Ax2& A)
{
BRepPrim_OneAxis_Check(VerticesBuilt,EdgesBuilt,WiresBuilt,FacesBuilt);
myAxes = A;
}
Standard_Real BRepPrim_OneAxis::Angle () const
{
return myAngle;
}
void BRepPrim_OneAxis::Angle (const Standard_Real A)
{
BRepPrim_OneAxis_Check(VerticesBuilt,EdgesBuilt,WiresBuilt,FacesBuilt);
myAngle = A;
}
Standard_Real BRepPrim_OneAxis::VMin () const
{
return myVMin;
}
void BRepPrim_OneAxis::VMin (const Standard_Real V)
{
BRepPrim_OneAxis_Check(VerticesBuilt,EdgesBuilt,WiresBuilt,FacesBuilt);
myVMin = V;
}
Standard_Real BRepPrim_OneAxis::VMax () const
{
return myVMax;
}
void BRepPrim_OneAxis::VMax (const Standard_Real V)
{
BRepPrim_OneAxis_Check(VerticesBuilt,EdgesBuilt,WiresBuilt,FacesBuilt);
myVMax = V;
}
//=======================================================================
//function : MeridianOnAxis
//purpose :
//=======================================================================
Standard_Boolean BRepPrim_OneAxis::MeridianOnAxis
(const Standard_Real V) const
{
return Abs(MeridianValue(V).X()) < Precision::Confusion();
}
//=======================================================================
//function : MeridianClosed
//purpose :
//=======================================================================
Standard_Boolean BRepPrim_OneAxis::MeridianClosed() const
{
if (VMaxInfinite()) return Standard_False;
if (VMinInfinite()) return Standard_False;
return MeridianValue(myVMin).IsEqual(MeridianValue(myVMax),
Precision::Confusion());
}
//=======================================================================
//function : VMaxInfinite
//purpose :
//=======================================================================
Standard_Boolean BRepPrim_OneAxis::VMaxInfinite() const
{
return Precision::IsPositiveInfinite(myVMax);
}
//=======================================================================
//function : VMinInfinite
//purpose :
//=======================================================================
Standard_Boolean BRepPrim_OneAxis::VMinInfinite() const
{
return Precision::IsNegativeInfinite(myVMin);
}
//=======================================================================
//function : HasTop
//purpose :
//=======================================================================
Standard_Boolean BRepPrim_OneAxis::HasTop() const
{
if (VMaxInfinite()) return Standard_False;
if (MeridianClosed()) return Standard_False;
if (MeridianOnAxis(myVMax)) return Standard_False;
return Standard_True;
}
//=======================================================================
//function : HasBottom
//purpose :
//=======================================================================
Standard_Boolean BRepPrim_OneAxis::HasBottom() const
{
if (VMinInfinite()) return Standard_False;
if (MeridianClosed()) return Standard_False;
if (MeridianOnAxis(myVMin)) return Standard_False;
return Standard_True;
}
//=======================================================================
//function : HasSides
//purpose :
//=======================================================================
Standard_Boolean BRepPrim_OneAxis::HasSides() const
{
return 2*M_PI - myAngle > Precision::Angular();
}
//=======================================================================
//function : Shell
//purpose :
//=======================================================================
const TopoDS_Shell& BRepPrim_OneAxis::Shell()
{
if (!ShellBuilt) {
myBuilder.MakeShell(myShell);
myBuilder.AddShellFace(myShell,LateralFace());
if (HasTop())
myBuilder.AddShellFace(myShell,TopFace());
if (HasBottom())
myBuilder.AddShellFace(myShell,BottomFace());
if (HasSides()) {
myBuilder.AddShellFace(myShell,StartFace());
myBuilder.AddShellFace(myShell,EndFace());
}
myBuilder.CompleteShell(myShell);
ShellBuilt = Standard_True;
}
return myShell;
}
//=======================================================================
//function : LateralFace
//purpose : build the lateral face
//=======================================================================
const TopoDS_Face& BRepPrim_OneAxis::LateralFace ()
{
// do it if not done
if (!FacesBuilt[FLATERAL]) {
// build an empty lateral face
myFaces[FLATERAL] = MakeEmptyLateralFace();
// add the wires
if (VMaxInfinite() && VMinInfinite()) {
myBuilder.AddFaceWire(myFaces[FLATERAL],LateralStartWire());
myBuilder.AddFaceWire(myFaces[FLATERAL],LateralEndWire());
}
else
myBuilder.AddFaceWire(myFaces[FLATERAL],LateralWire());
// put the parametric curves
if (MeridianClosed()) {
// closed edge
myBuilder.SetPCurve(myEdges[ETOP],myFaces[FLATERAL],
gp_Lin2d(gp_Pnt2d(0,myVMin),gp_Dir2d(1,0)),
gp_Lin2d(gp_Pnt2d(0,myVMax),gp_Dir2d(1,0)));
}
else {
if (!VMaxInfinite()) {
myBuilder.SetPCurve(myEdges[ETOP],myFaces[FLATERAL],
gp_Lin2d(gp_Pnt2d(0,myVMax),gp_Dir2d(1,0)));
if (!HasSides() || MeridianOnAxis(myVMax)) {
// closed edge set parameters
myBuilder.SetParameters(myEdges[ETOP],
TopEndVertex(),
0.,myAngle);
}
}
if (!VMinInfinite()) {
myBuilder.SetPCurve(myEdges[EBOTTOM],myFaces[FLATERAL],
gp_Lin2d(gp_Pnt2d(0,myVMin),gp_Dir2d(1,0)));
if (!HasSides() || MeridianOnAxis(myVMin)) {
// closed edge set parameters
myBuilder.SetParameters(myEdges[EBOTTOM],
BottomEndVertex(),
0.,myAngle);
}
}
}
if (HasSides()) {
myBuilder.SetPCurve(myEdges[ESTART],myFaces[FLATERAL],
gp_Lin2d(gp_Pnt2d(0,-myMeridianOffset),
gp_Dir2d(0,1)));
myBuilder.SetPCurve(myEdges[EEND],myFaces[FLATERAL],
gp_Lin2d(gp_Pnt2d(myAngle,-myMeridianOffset),
gp_Dir2d(0,1)));
}
else {
// closed edge
myBuilder.SetPCurve(myEdges[ESTART],myFaces[FLATERAL],
gp_Lin2d(gp_Pnt2d(myAngle,-myMeridianOffset),
gp_Dir2d(0,1)),
gp_Lin2d(gp_Pnt2d(0,-myMeridianOffset),
gp_Dir2d(0,1)));
}
myBuilder.CompleteFace(myFaces[FLATERAL]);
FacesBuilt[FLATERAL] = Standard_True;
}
return myFaces[FLATERAL];
}
//=======================================================================
//function : TopFace
//purpose : build and return the TopFace
//=======================================================================
const TopoDS_Face& BRepPrim_OneAxis::TopFace ()
{
// do it if not done
if (!FacesBuilt[FTOP]) {
Standard_DomainError_Raise_if(!HasTop(),
"BRepPrim_OneAxis::TopFace:No top face");
// make the empty face by translating the axes
Standard_Real z = MeridianValue(myVMax).Y();
gp_Vec V = myAxes.Direction();
V.Multiply(z);
myBuilder.MakeFace(myFaces[FTOP],gp_Pln(myAxes.Translated(V)));
myBuilder.AddFaceWire(myFaces[FTOP],TopWire());
// put the parametric curves
myBuilder.SetPCurve(myEdges[ETOP],myFaces[FTOP],
gp_Circ2d(gp_Ax2d(gp_Pnt2d(0,0),gp_Dir2d(1,0)),
MeridianValue(myVMax).X()));
if (HasSides()) {
myBuilder.SetPCurve(myEdges[ETOPSTART],myFaces[FTOP],
gp_Lin2d(gp_Pnt2d(0,0),gp_Dir2d(1,0)));
myBuilder.SetPCurve(myEdges[ETOPEND],myFaces[FTOP],
gp_Lin2d(gp_Pnt2d(0,0),
gp_Dir2d(Cos(myAngle),Sin(myAngle))));
}
myBuilder.CompleteFace(myFaces[FTOP]);
FacesBuilt[FTOP] = Standard_True;
}
return myFaces[FTOP];
}
//=======================================================================
//function : BottomFace
//purpose :
//=======================================================================
const TopoDS_Face& BRepPrim_OneAxis::BottomFace ()
{
// do it if not done
if (!FacesBuilt[FBOTTOM]) {
Standard_DomainError_Raise_if(!HasBottom(),
"BRepPrim_OneAxis::BottomFace:No bottom face");
// make the empty face by translating the axes
Standard_Real z = MeridianValue(myVMin).Y();
gp_Vec V = myAxes.Direction();
V.Multiply(z);
gp_Ax2 axes = myAxes.Translated(V);
myBuilder.MakeFace(myFaces[FBOTTOM],gp_Pln(axes));
myBuilder.ReverseFace(myFaces[FBOTTOM]);
myBuilder.AddFaceWire(myFaces[FBOTTOM],BottomWire());
// put the parametric curves
myBuilder.SetPCurve(myEdges[EBOTTOM],myFaces[FBOTTOM],
gp_Circ2d(gp_Ax2d(gp_Pnt2d(0,0),gp_Dir2d(1,0)),
MeridianValue(myVMin).X()));
if (HasSides()) {
myBuilder.SetPCurve(myEdges[EBOTSTART],myFaces[FBOTTOM],
gp_Lin2d(gp_Pnt2d(0,0),gp_Dir2d(1,0)));
myBuilder.SetPCurve(myEdges[EBOTEND],myFaces[FBOTTOM],
gp_Lin2d(gp_Pnt2d(0,0),
gp_Dir2d(Cos(myAngle),Sin(myAngle))));
}
myBuilder.CompleteFace(myFaces[FBOTTOM]);
FacesBuilt[FBOTTOM] = Standard_True;
}
return myFaces[FBOTTOM];
}
//=======================================================================
//function : StartFace
//purpose :
//=======================================================================
const TopoDS_Face& BRepPrim_OneAxis::StartFace ()
{
// do it if not done
if (!FacesBuilt[FSTART]) {
Standard_DomainError_Raise_if(!HasSides(),
"BRepPrim_OneAxes::StartFace:No side faces");
// build the empty face, perpendicular to myTool.Axes()
gp_Ax2 axes(myAxes.Location(),myAxes.YDirection().Reversed(),myAxes.XDirection());
myBuilder.MakeFace(myFaces[FSTART],gp_Pln(axes));
if (VMaxInfinite() && VMinInfinite())
myBuilder.AddFaceWire(myFaces[FSTART],AxisStartWire());
myBuilder.AddFaceWire(myFaces[FSTART],StartWire());
// parametric curves
SetMeridianPCurve(myEdges[ESTART],myFaces[FSTART]);
if (EdgesBuilt[EAXIS])
myBuilder.SetPCurve(myEdges[EAXIS],myFaces[FSTART],
gp_Lin2d(gp_Pnt2d(0,0),gp_Dir2d(0,1)));
if (EdgesBuilt[ETOPSTART])
myBuilder.SetPCurve(myEdges[ETOPSTART],myFaces[FSTART],
gp_Lin2d(gp_Pnt2d(0,MeridianValue(myVMax).Y()),gp_Dir2d(1,0)));
if (EdgesBuilt[EBOTSTART])
myBuilder.SetPCurve(myEdges[EBOTSTART],myFaces[FSTART],
gp_Lin2d(gp_Pnt2d(0,MeridianValue(myVMin).Y()),gp_Dir2d(1,0)));
myBuilder.CompleteFace(myFaces[FSTART]);
FacesBuilt[FSTART] = Standard_True;
}
return myFaces[FSTART];
}
//=======================================================================
//function : EndFace
//purpose :
//=======================================================================
const TopoDS_Face& BRepPrim_OneAxis::EndFace ()
{
// do it if not done
if (!FacesBuilt[FEND]) {
Standard_DomainError_Raise_if(!HasSides(),
"BRepPrim_OneAxes::EndFace:No side faces");
// build the empty face, perpendicular to myTool.Axes()
gp_Ax2 axes(myAxes.Location(),myAxes.YDirection().Reversed(),myAxes.XDirection());
axes.Rotate(myAxes.Axis(),myAngle);
myBuilder.MakeFace(myFaces[FEND],gp_Pln(axes));
myBuilder.ReverseFace(myFaces[FEND]);
if (VMaxInfinite() && VMinInfinite())
myBuilder.AddFaceWire(myFaces[FEND],AxisEndWire());
myBuilder.AddFaceWire(myFaces[FEND],EndWire());
// parametric curves
SetMeridianPCurve(myEdges[EEND],myFaces[FEND]);
if (EdgesBuilt[EAXIS])
myBuilder.SetPCurve(myEdges[EAXIS],myFaces[FEND],
gp_Lin2d(gp_Pnt2d(0,0),gp_Dir2d(0,1)));
if (EdgesBuilt[ETOPEND])
myBuilder.SetPCurve(myEdges[ETOPEND],myFaces[FEND],
gp_Lin2d(gp_Pnt2d(0,MeridianValue(myVMax).Y()),
gp_Dir2d(1,0)));
if (EdgesBuilt[EBOTEND])
myBuilder.SetPCurve(myEdges[EBOTEND],myFaces[FEND],
gp_Lin2d(gp_Pnt2d(0,MeridianValue(myVMin).Y()),
gp_Dir2d(1,0)));
myBuilder.CompleteFace(myFaces[FEND]);
FacesBuilt[FEND] = Standard_True;
}
return myFaces[FEND];
}
//=======================================================================
//function : LateralWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::LateralWire ()
{
// do it if not done
if (!WiresBuilt[WLATERAL]) {
myBuilder.MakeWire(myWires[WLATERAL]);
if (!VMaxInfinite())
myBuilder.AddWireEdge(myWires[WLATERAL],TopEdge() ,Standard_False);
myBuilder.AddWireEdge( myWires[WLATERAL],EndEdge() ,Standard_True);
if (!VMinInfinite())
myBuilder.AddWireEdge(myWires[WLATERAL],BottomEdge() ,Standard_True);
myBuilder.AddWireEdge( myWires[WLATERAL],StartEdge() ,Standard_False);
myBuilder.CompleteWire(myWires[WLATERAL]);
WiresBuilt[WLATERAL] = Standard_True;
}
return myWires[WLATERAL];
}
//=======================================================================
//function : LateralStartWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::LateralStartWire ()
{
// do it if not done
if (!WiresBuilt[WLATERALSTART]) {
myBuilder.MakeWire(myWires[WLATERALSTART]);
myBuilder.AddWireEdge(myWires[WLATERALSTART],StartEdge(),Standard_False);
myBuilder.CompleteWire(myWires[WLATERALSTART]);
WiresBuilt[WLATERALSTART] = Standard_True;
}
return myWires[WLATERALSTART];
}
//=======================================================================
//function : LateralEndWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::LateralEndWire ()
{
// do it if not done
if (!WiresBuilt[WLATERALEND]) {
myBuilder.MakeWire(myWires[WLATERALEND]);
myBuilder.AddWireEdge(myWires[WLATERALEND],EndEdge(),Standard_True);
myBuilder.CompleteWire(myWires[WLATERALEND]);
WiresBuilt[WLATERALEND] = Standard_True;
}
return myWires[WLATERALEND];
}
//=======================================================================
//function : TopWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::TopWire ()
{
// do it if not done
if (!WiresBuilt[WTOP]) {
Standard_DomainError_Raise_if(!HasTop(),
"BRepPrim_OneAxis::TopWire: no top");
myBuilder.MakeWire(myWires[WTOP]);
myBuilder.AddWireEdge(myWires[WTOP],TopEdge() ,Standard_True);
if (HasSides()) {
myBuilder.AddWireEdge(myWires[WTOP],StartTopEdge() ,Standard_True);
myBuilder.AddWireEdge(myWires[WTOP],EndTopEdge() ,Standard_False);
}
myBuilder.CompleteWire(myWires[WTOP]);
WiresBuilt[WTOP] = Standard_True;
}
return myWires[WTOP];
}
//=======================================================================
//function : BottomWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::BottomWire ()
{
// do it if not done
if (!WiresBuilt[WBOTTOM]) {
Standard_DomainError_Raise_if(!HasBottom(),
"BRepPrim_OneAxis::BottomWire: no bottom");
myBuilder.MakeWire(myWires[WBOTTOM]);
myBuilder.AddWireEdge(myWires[WBOTTOM],BottomEdge() ,Standard_False);
if (HasSides()) {
myBuilder.AddWireEdge(myWires[WBOTTOM],EndBottomEdge() ,Standard_True);
myBuilder.AddWireEdge(myWires[WBOTTOM],StartBottomEdge(),Standard_False);
}
myBuilder.CompleteWire(myWires[WBOTTOM]);
WiresBuilt[WBOTTOM] = Standard_True;
}
return myWires[WBOTTOM];
}
//=======================================================================
//function : StartWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::StartWire ()
{
// do it if not done
if (!WiresBuilt[WSTART]) {
Standard_DomainError_Raise_if(!HasSides(),
"BRepPrim_OneAxes::StartWire:no sides");
myBuilder.MakeWire(myWires[WSTART]);
if (HasBottom())
myBuilder.AddWireEdge(myWires[WSTART],StartBottomEdge() ,Standard_True);
if (!MeridianClosed()) {
if (!VMaxInfinite() || !VMinInfinite())
myBuilder.AddWireEdge( myWires[WSTART],AxisEdge() ,Standard_False);
}
if (HasTop())
myBuilder.AddWireEdge(myWires[WSTART],StartTopEdge() ,Standard_False);
myBuilder.AddWireEdge( myWires[WSTART],StartEdge() ,Standard_True);
myBuilder.CompleteWire(myWires[WSTART]);
WiresBuilt[WSTART] = Standard_True;
}
return myWires[WSTART];
}
//=======================================================================
//function : AxisStartWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::AxisStartWire ()
{
// do it if not done
if (!WiresBuilt[WAXISSTART]) {
Standard_DomainError_Raise_if
(!HasSides(),
"BRepPrim_OneAxes::AxisStartWire:no sides");
Standard_DomainError_Raise_if
(!VMaxInfinite() || !VMinInfinite(),
"BRepPrim_OneAxes::AxisStartWire:not infinite");
Standard_DomainError_Raise_if
(MeridianClosed(),
"BRepPrim_OneAxes::AxisStartWire:meridian closed");
myBuilder.MakeWire(myWires[WAXISSTART]);
myBuilder.AddWireEdge( myWires[WAXISSTART],AxisEdge() ,Standard_False);
myBuilder.CompleteWire(myWires[WAXISSTART]);
WiresBuilt[WAXISSTART] = Standard_True;
}
return myWires[WAXISSTART];
}
//=======================================================================
//function : EndWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::EndWire ()
{
// do it if not done
if (!WiresBuilt[WEND]) {
Standard_DomainError_Raise_if(!HasSides(),
"BRepPrim_OneAxes::EndWire:no sides");
myBuilder.MakeWire(myWires[WEND]);
if (HasTop())
myBuilder.AddWireEdge(myWires[WEND],EndTopEdge(), Standard_True);
if (!MeridianClosed()) {
if (!VMaxInfinite() || !VMinInfinite()) {
myBuilder.AddWireEdge( myWires[WEND],AxisEdge(), Standard_True);
}
}
if (HasBottom())
myBuilder.AddWireEdge(myWires[WEND],EndBottomEdge(), Standard_False);
myBuilder.AddWireEdge( myWires[WEND],EndEdge(), Standard_False);
myBuilder.CompleteWire(myWires[WEND]);
WiresBuilt[WEND] = Standard_True;
}
return myWires[WEND];
}
//=======================================================================
//function : AxisEndWire
//purpose :
//=======================================================================
const TopoDS_Wire& BRepPrim_OneAxis::AxisEndWire ()
{
// do it if not done
if (!WiresBuilt[WAXISEND]) {
Standard_DomainError_Raise_if
(!HasSides(),
"BRepPrim_OneAxes::AxisEndWire:no sides");
Standard_DomainError_Raise_if
(!VMaxInfinite() || !VMinInfinite(),
"BRepPrim_OneAxes::AxisEndWire:not infinite");
Standard_DomainError_Raise_if
(MeridianClosed(),
"BRepPrim_OneAxes::AxisEndWire:meridian closed");
myBuilder.MakeWire(myWires[WAXISEND]);
myBuilder.AddWireEdge( myWires[WAXISEND],AxisEdge(), Standard_True);
myBuilder.CompleteWire(myWires[WAXISEND]);
WiresBuilt[WAXISEND] = Standard_True;
}
return myWires[WAXISEND];
}
//=======================================================================
//function : AxisEdge
//purpose : make the edge on the axis, oriented +Z
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::AxisEdge ()
{
// do it if not done
if (!EdgesBuilt[EAXIS]) {
Standard_DomainError_Raise_if(!HasSides(),
"BRepPrim_OneAxis::AxisEdge:no sides");
Standard_DomainError_Raise_if(MeridianClosed(),
"BRepPrim_OneAxis::AxisEdge:closed");
// build the empty edge.
myBuilder.MakeEdge(myEdges[EAXIS],gp_Lin(myAxes.Axis()));
if (!VMaxInfinite())
myBuilder.AddEdgeVertex(myEdges[EAXIS],AxisTopVertex(),
MeridianValue(myVMax).Y(),Standard_False);
if (!VMinInfinite())
myBuilder.AddEdgeVertex(myEdges[EAXIS],AxisBottomVertex(),
MeridianValue(myVMin).Y(),Standard_True);
myBuilder.CompleteEdge(myEdges[EAXIS]);
EdgesBuilt[EAXIS] = Standard_True;
}
return myEdges[EAXIS];
}
//=======================================================================
//function : StartEdge
//purpose :
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::StartEdge ()
{
// do it if not done
if (!EdgesBuilt[ESTART]) {
// is it shared with the EndEdge
if (!HasSides() && EdgesBuilt[EEND])
myEdges[ESTART] = myEdges[EEND];
else {
// build the empty Edge
myEdges[ESTART] = MakeEmptyMeridianEdge(0.);
if (MeridianClosed()) {
// Closed edge
myBuilder.AddEdgeVertex(myEdges[ESTART],
TopStartVertex(),
myVMin+myMeridianOffset,
myVMax+myMeridianOffset);
}
else {
if (!VMaxInfinite()) {
myBuilder.AddEdgeVertex(myEdges[ESTART],
TopStartVertex(),
myVMax+myMeridianOffset,
Standard_False);
}
if (!VMinInfinite()) {
myBuilder.AddEdgeVertex(myEdges[ESTART],
BottomStartVertex(),
myVMin+myMeridianOffset,
Standard_True);
}
}
}
myBuilder.CompleteEdge(myEdges[ESTART]);
EdgesBuilt[ESTART] = Standard_True;
}
return myEdges[ESTART];
}
//=======================================================================
//function : EndEdge
//purpose :
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::EndEdge ()
{
// do it if not done
if (!EdgesBuilt[EEND]) {
// is it shared with the start edge
if (!HasSides() && EdgesBuilt[ESTART])
myEdges[EEND] = myEdges[ESTART];
else {
// build the empty Edge
myEdges[EEND] = MakeEmptyMeridianEdge(myAngle);
if (MeridianClosed()) {
// Closed edge
myBuilder.AddEdgeVertex(myEdges[EEND],
TopEndVertex(),
myVMin+myMeridianOffset,
myVMax+myMeridianOffset);
}
else {
if (!VMaxInfinite()) {
myBuilder.AddEdgeVertex(myEdges[EEND],
TopEndVertex(),
myVMax+myMeridianOffset,
Standard_False);
}
if (!VMinInfinite()) {
myBuilder.AddEdgeVertex(myEdges[EEND],
BottomEndVertex(),
myVMin+myMeridianOffset,
Standard_True);
}
}
}
myBuilder.CompleteEdge(myEdges[EEND]);
EdgesBuilt[EEND] = Standard_True;
}
return myEdges[EEND];
}
//=======================================================================
//function : StartTopEdge
//purpose :
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::StartTopEdge ()
{
// do it if not done
if (!EdgesBuilt[ETOPSTART]) {
Standard_DomainError_Raise_if
(!HasTop() || !HasSides(),
"BRepPrim_OneAxis::StartTopEdge:no sides or no top");
// build the empty Edge
gp_Vec V = myAxes.Direction();
V.Multiply(MeridianValue(myVMax).Y());
gp_Pnt P = myAxes.Location().Translated(V);
myBuilder.MakeEdge(myEdges[ETOPSTART],gp_Lin(P,myAxes.XDirection()));
myBuilder.AddEdgeVertex(myEdges[ETOPSTART],AxisTopVertex(),
0.,Standard_True);
myBuilder.AddEdgeVertex(myEdges[ETOPSTART],TopStartVertex(),
MeridianValue(myVMax).X(),Standard_False);
myBuilder.CompleteEdge(myEdges[ETOPSTART]);
EdgesBuilt[ETOPSTART] = Standard_True;
}
return myEdges[ETOPSTART];
}
//=======================================================================
//function : StartBottomEdge
//purpose :
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::StartBottomEdge ()
{
// do it if not done
if (!EdgesBuilt[EBOTSTART]) {
Standard_DomainError_Raise_if
(!HasBottom() || !HasSides(),
"BRepPrim_OneAxis::StartBottomEdge:no sides or no top");
// build the empty Edge
gp_Vec V = myAxes.Direction();
V.Multiply(MeridianValue(myVMin).Y());
gp_Pnt P = myAxes.Location().Translated(V);
myBuilder.MakeEdge(myEdges[EBOTSTART],gp_Lin(P,myAxes.XDirection()));
myBuilder.AddEdgeVertex(myEdges[EBOTSTART],BottomStartVertex(),
MeridianValue(myVMin).X(),Standard_False);
myBuilder.AddEdgeVertex(myEdges[EBOTSTART],AxisBottomVertex(),
0.,Standard_True);
myBuilder.CompleteEdge(myEdges[EBOTSTART]);
EdgesBuilt[EBOTSTART] = Standard_True;
}
return myEdges[EBOTSTART];
}
//=======================================================================
//function : EndTopEdge
//purpose :
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::EndTopEdge ()
{
// do it if not done
if (!EdgesBuilt[ETOPEND]) {
Standard_DomainError_Raise_if
(!HasTop() || !HasSides(),
"BRepPrim_OneAxis::EndTopEdge:no sides or no top");
// build the empty Edge
gp_Vec V = myAxes.Direction();
V.Multiply(MeridianValue(myVMax).Y());
gp_Pnt P = myAxes.Location().Translated(V);
gp_Lin L(P,myAxes.XDirection());
L.Rotate(myAxes.Axis(),myAngle);
myBuilder.MakeEdge(myEdges[ETOPEND],L);
myBuilder.AddEdgeVertex(myEdges[ETOPEND],AxisTopVertex(),
0.,Standard_True);
myBuilder.AddEdgeVertex(myEdges[ETOPEND],TopEndVertex(),
MeridianValue(myVMax).X(),Standard_False);
myBuilder.CompleteEdge(myEdges[ETOPEND]);
EdgesBuilt[ETOPEND] = Standard_True;
}
return myEdges[ETOPEND];
}
//=======================================================================
//function : EndBottomEdge
//purpose :
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::EndBottomEdge ()
{
// do it if not done
if (!EdgesBuilt[EBOTEND]) {
Standard_DomainError_Raise_if
(!HasBottom() || !HasSides(),
"BRepPrim_OneAxis::EndBottomEdge:no sides or no bottom");
// build the empty Edge
gp_Vec V = myAxes.Direction();
V.Multiply(MeridianValue(myVMin).Y());
gp_Pnt P = myAxes.Location().Translated(V);
gp_Lin L(P,myAxes.XDirection());
L.Rotate(myAxes.Axis(),myAngle);
myBuilder.MakeEdge(myEdges[EBOTEND],L);
myBuilder.AddEdgeVertex(myEdges[EBOTEND],AxisBottomVertex(),
0.,Standard_True);
myBuilder.AddEdgeVertex(myEdges[EBOTEND],BottomEndVertex(),
MeridianValue(myVMin).X(),Standard_False);
myBuilder.CompleteEdge(myEdges[EBOTEND]);
EdgesBuilt[EBOTEND] = Standard_True;
}
return myEdges[EBOTEND];
}
//=======================================================================
//function : TopEdge
//purpose :
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::TopEdge ()
{
// do it if not done
if (!EdgesBuilt[ETOP]) {
// Test if shared with bottom edge
if (MeridianClosed() && EdgesBuilt[EBOTTOM]) {
myEdges[ETOP] = myEdges[EBOTTOM];
}
else {
// build the empty Edge
if (!MeridianOnAxis(myVMax)) {
gp_Pnt2d mp = MeridianValue(myVMax);
gp_Vec V = myAxes.Direction();
V.Multiply(mp.Y());
gp_Pnt P = myAxes.Location().Translated(V);
gp_Circ C(gp_Ax2(P,myAxes.Direction(),myAxes.XDirection()),mp.X());
myBuilder.MakeEdge(myEdges[ETOP],C);
}
else
myBuilder.MakeDegeneratedEdge(myEdges[ETOP]);
if (!HasSides()) {
// closed edge
myBuilder.AddEdgeVertex(myEdges[ETOP],
TopEndVertex(),
0.,myAngle);
}
else {
myBuilder.AddEdgeVertex(myEdges[ETOP],
TopEndVertex(),
myAngle,
Standard_False);
myBuilder.AddEdgeVertex(myEdges[ETOP],
TopStartVertex(),
0.,
Standard_True);
}
}
myBuilder.CompleteEdge(myEdges[ETOP]);
EdgesBuilt[ETOP] = Standard_True;
}
return myEdges[ETOP];
}
//=======================================================================
//function : BottomEdge
//purpose :
//=======================================================================
const TopoDS_Edge& BRepPrim_OneAxis::BottomEdge ()
{
// do it if not done
if (!EdgesBuilt[EBOTTOM]) {
// Test if shared with top edge
if (MeridianClosed() && EdgesBuilt[ETOP]) {
myEdges[EBOTTOM] = myEdges[ETOP];
}
else {
// build the empty Edge
if (!MeridianOnAxis(myVMin)) {
gp_Pnt2d mp = MeridianValue(myVMin);
gp_Vec V = myAxes.Direction();
V.Multiply(mp.Y());
gp_Pnt P = myAxes.Location().Translated(V);
gp_Circ C(gp_Ax2(P,myAxes.Direction(),myAxes.XDirection()),mp.X());
myBuilder.MakeEdge(myEdges[EBOTTOM],C);
}
else
myBuilder.MakeDegeneratedEdge(myEdges[EBOTTOM]);
if (!HasSides()) {
// closed edge
myBuilder.AddEdgeVertex(myEdges[EBOTTOM],
BottomEndVertex(),
0.,myAngle);
}
else {
myBuilder.AddEdgeVertex(myEdges[EBOTTOM],
BottomEndVertex(),
myAngle,
Standard_False);
myBuilder.AddEdgeVertex(myEdges[EBOTTOM],
BottomStartVertex(),
0.,
Standard_True);
}
}
myBuilder.CompleteEdge(myEdges[EBOTTOM]);
EdgesBuilt[EBOTTOM] = Standard_True;
}
return myEdges[EBOTTOM];
}
//=======================================================================
//function : AxisTopVertex
//purpose :
//=======================================================================
const TopoDS_Vertex& BRepPrim_OneAxis::AxisTopVertex ()
{
// do it if not done
if (!VerticesBuilt[VAXISTOP]) {
// deduct from others
if (MeridianOnAxis(myVMax) && VerticesBuilt[VTOPSTART])
myVertices[VAXISTOP] = myVertices[VTOPSTART];
else if (MeridianOnAxis(myVMax) && VerticesBuilt[VTOPEND])
myVertices[VAXISTOP] = myVertices[VTOPEND];
else {
Standard_DomainError_Raise_if(MeridianClosed(),
"BRepPrim_OneAxis::AxisTopVertex");
Standard_DomainError_Raise_if(VMaxInfinite(),
"BRepPrim_OneAxis::AxisTopVertex");
gp_Vec V = myAxes.Direction();
V.Multiply(MeridianValue(myVMax).Y());
gp_Pnt P = myAxes.Location().Translated(V);
myBuilder.MakeVertex(myVertices[VAXISTOP],P);
}
VerticesBuilt[VAXISTOP] = Standard_True;
}
return myVertices[VAXISTOP];
}
//=======================================================================
//function : AxisBottomVertex
//purpose :
//=======================================================================
const TopoDS_Vertex& BRepPrim_OneAxis::AxisBottomVertex ()
{
// do it if not done
if (!VerticesBuilt[VAXISBOT]) {
// deduct from others
if (MeridianOnAxis(myVMin) && VerticesBuilt[VBOTSTART])
myVertices[VAXISBOT] = myVertices[VBOTSTART];
else if (MeridianOnAxis(myVMin) && VerticesBuilt[VBOTEND])
myVertices[VAXISBOT] = myVertices[VBOTEND];
else {
Standard_DomainError_Raise_if(MeridianClosed(),
"BRepPrim_OneAxis::AxisBottomVertex");
Standard_DomainError_Raise_if(VMinInfinite(),
"BRepPrim_OneAxis::AxisBottomVertex");
gp_Vec V = myAxes.Direction();
V.Multiply(MeridianValue(myVMin).Y());
gp_Pnt P = myAxes.Location().Translated(V);
myBuilder.MakeVertex(myVertices[VAXISBOT],P);
}
VerticesBuilt[VAXISBOT] = Standard_True;
}
return myVertices[VAXISBOT];
}
//=======================================================================
//function : TopStartVertex
//purpose :
//=======================================================================
const TopoDS_Vertex& BRepPrim_OneAxis::TopStartVertex ()
{
// do it if not done
if (!VerticesBuilt[VTOPSTART]) {
// deduct from others
if (MeridianOnAxis(myVMax) && VerticesBuilt[VAXISTOP])
myVertices[VTOPSTART] = myVertices[VAXISTOP];
else if ((MeridianOnAxis(myVMax) || !HasSides()) && VerticesBuilt[VTOPEND])
myVertices[VTOPSTART] = myVertices[VTOPEND];
else if (MeridianClosed() && VerticesBuilt[VBOTSTART])
myVertices[VTOPSTART] = myVertices[VBOTSTART];
else if ((MeridianClosed() && !HasSides()) && VerticesBuilt[VBOTEND])
myVertices[VTOPSTART] = myVertices[VBOTEND];
else{
gp_Pnt2d mp = MeridianValue(myVMax);
gp_Vec V = myAxes.Direction();
V.Multiply(mp.Y());
gp_Pnt P = myAxes.Location().Translated(V);
V = myAxes.XDirection();
V.Multiply(mp.X());
P.Translate(V);
myBuilder.MakeVertex(myVertices[VTOPSTART],P);
}
VerticesBuilt[VTOPSTART] = Standard_True;
}
return myVertices[VTOPSTART];
}
//=======================================================================
//function : TopEndVertex
//purpose :
//=======================================================================
const TopoDS_Vertex& BRepPrim_OneAxis::TopEndVertex ()
{
// do it if not done
if (!VerticesBuilt[VTOPEND]) {
// deduct from others
if (MeridianOnAxis(myVMax) && VerticesBuilt[VAXISTOP])
myVertices[VTOPEND] = myVertices[VAXISTOP];
else if ((MeridianOnAxis(myVMax) || !HasSides()) && VerticesBuilt[VTOPSTART])
myVertices[VTOPEND] = myVertices[VTOPSTART];
else if (MeridianClosed() && VerticesBuilt[VBOTEND])
myVertices[VTOPEND] = myVertices[VBOTEND];
else if ((MeridianClosed() && !HasSides()) && VerticesBuilt[VBOTSTART])
myVertices[VTOPEND] = myVertices[VBOTSTART];
else {
gp_Pnt2d mp = MeridianValue(myVMax);
gp_Vec V = myAxes.Direction();
V.Multiply(mp.Y());
gp_Pnt P = myAxes.Location().Translated(V);
V = myAxes.XDirection();
V.Multiply(mp.X());
P.Translate(V);
P.Rotate(myAxes.Axis(),myAngle);
myBuilder.MakeVertex(myVertices[VTOPEND],P);
}
VerticesBuilt[VTOPEND] = Standard_True;
}
return myVertices[VTOPEND];
}
//=======================================================================
//function : BottomStartVertex
//purpose :
//=======================================================================
const TopoDS_Vertex& BRepPrim_OneAxis::BottomStartVertex ()
{
// do it if not done
if (!VerticesBuilt[VBOTSTART]) {
// deduct from others
if (MeridianOnAxis(myVMin) && VerticesBuilt[VAXISBOT])
myVertices[VBOTSTART] = myVertices[VAXISBOT];
else if ((MeridianOnAxis(myVMin) || !HasSides()) && VerticesBuilt[VBOTEND])
myVertices[VBOTSTART] = myVertices[VBOTEND];
else if (MeridianClosed() && VerticesBuilt[VTOPSTART])
myVertices[VBOTSTART] = myVertices[VTOPSTART];
else if ((MeridianClosed() && !HasSides()) && VerticesBuilt[VTOPEND])
myVertices[VBOTSTART] = myVertices[VTOPEND];
else {
gp_Pnt2d mp = MeridianValue(myVMin);
gp_Vec V = myAxes.Direction();
V.Multiply(mp.Y());
gp_Pnt P = myAxes.Location().Translated(V);
V = myAxes.XDirection();
V.Multiply(mp.X());
P.Translate(V);
myBuilder.MakeVertex(myVertices[VBOTSTART],P);
}
VerticesBuilt[VBOTSTART] = Standard_True;
}
return myVertices[VBOTSTART];
}
//=======================================================================
//function : BottomEndVertex
//purpose :
//=======================================================================
const TopoDS_Vertex& BRepPrim_OneAxis::BottomEndVertex ()
{
// do it if not done
if (!VerticesBuilt[VBOTEND]) {
// deduct from others
if (MeridianOnAxis(myVMin) && VerticesBuilt[VAXISBOT])
myVertices[VBOTEND] = myVertices[VAXISBOT];
else if ((MeridianOnAxis(myVMin) || !HasSides()) && VerticesBuilt[VBOTSTART])
myVertices[VBOTEND] = myVertices[VBOTSTART];
else if (MeridianClosed() && VerticesBuilt[VTOPEND])
myVertices[VBOTEND] = myVertices[VTOPEND];
else if (MeridianClosed() && !HasSides() && VerticesBuilt[VTOPSTART])
myVertices[VBOTEND] = myVertices[VTOPSTART];
else {
gp_Pnt2d mp = MeridianValue(myVMin);
gp_Vec V = myAxes.Direction();
V.Multiply(mp.Y());
gp_Pnt P = myAxes.Location().Translated(V);
V = myAxes.XDirection();
V.Multiply(mp.X());
P.Translate(V);
P.Rotate(myAxes.Axis(),myAngle);
myBuilder.MakeVertex(myVertices[VBOTEND],P);
}
VerticesBuilt[VBOTEND] = Standard_True;
}
return myVertices[VBOTEND];
}