Files
OCCT/src/BRepPrim/BRepPrim_OneAxis.cxx
dpasukhi a5a7b3185b Coding - Apply .clang-format formatting #286
Update empty method guards to new style with regex (see PR).
Used clang-format 18.1.8.
New actions to validate code formatting is added.
Update .clang-format with disabling of include sorting.
  It is temporary changes, then include will be sorted.
Apply formatting for /src and /tools folder.
The files with .hxx,.cxx,.lxx,.h,.pxx,.hpp,*.cpp extensions.
2025-01-26 00:43:57 +00:00

1315 lines
38 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_Builder.hxx>
#include <BRepPrim_OneAxis.hxx>
#include <gp_Ax2.hxx>
#include <gp_Circ.hxx>
#include <gp_Circ2d.hxx>
#include <gp_Lin2d.hxx>
#include <gp_Pln.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Vec.hxx>
#include <Precision.hxx>
#include <Standard_DomainError.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Shell.hxx>
#include <TopoDS_Vertex.hxx>
#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])
throw Standard_DomainError();
for (i = 0; i < NBEDGES; i++)
if (E[i])
throw Standard_DomainError();
for (i = 0; i < NBWIRES; i++)
if (W[i])
throw Standard_DomainError();
for (i = 0; i < NBFACES; i++)
if (F[i])
throw Standard_DomainError();
}
//=================================================================================================
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;
}
//=================================================================================================
BRepPrim_OneAxis::~BRepPrim_OneAxis() {}
//=================================================================================================
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;
}
//=================================================================================================
Standard_Boolean BRepPrim_OneAxis::MeridianOnAxis(const Standard_Real V) const
{
return Abs(MeridianValue(V).X()) < Precision::Confusion();
}
//=================================================================================================
Standard_Boolean BRepPrim_OneAxis::MeridianClosed() const
{
if (VMaxInfinite())
return Standard_False;
if (VMinInfinite())
return Standard_False;
return MeridianValue(myVMin).IsEqual(MeridianValue(myVMax), Precision::Confusion());
}
//=================================================================================================
Standard_Boolean BRepPrim_OneAxis::VMaxInfinite() const
{
return Precision::IsPositiveInfinite(myVMax);
}
//=================================================================================================
Standard_Boolean BRepPrim_OneAxis::VMinInfinite() const
{
return Precision::IsNegativeInfinite(myVMin);
}
//=================================================================================================
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;
}
//=================================================================================================
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;
}
//=================================================================================================
Standard_Boolean BRepPrim_OneAxis::HasSides() const
{
return 2 * M_PI - myAngle > Precision::Angular();
}
//=================================================================================================
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());
}
myShell.Closed(BRep_Tool::IsClosed(myShell));
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}
//=================================================================================================
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];
}