1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-06-20 11:54:07 +03:00
occt/src/BRepSweep/BRepSweep_Rotation.cxx
kgv c22b52d60e 0028966: Coding Rules - remove Adaptor2d_HCurve2d, Adaptor3d_HCurve and Adaptor3d_HSurface classes
Adaptor2d_Curve2d, Adaptor3d_Curve and Adaptor3d_Surface now inherit Standard_Transient.
Interfaces Adaptor2d_HCurve2d, Adaptor3d_HCurve, Adaptor3d_HSurface and their subclasses
are now aliases to Adaptor2d_Curve2d, Adaptor3d_Curve and Adaptor3d_Surface.
Removed numerous unsafe reinterpret casts.

Generic classes Adaptor3d_GenHCurve, Adaptor3d_GenHSurface, Adaptor2d_GenHCurve2d have been removed.
Several redundant .lxx files have been merged into .hxx.

Removed obsolete adaptor classes with H suffix.
2020-12-11 19:12:48 +03:00

949 lines
28 KiB
C++

// Created on: 1993-02-15
// Created by: Laurent BOURESCHE
// Copyright (c) 1993-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 <BRepSweep_Rotation.hxx>
#include <GeomAdaptor_SurfaceOfRevolution.hxx>
#include <BRep_Tool.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepTools.hxx>
#include <BRepTools_Quilt.hxx>
#include <ElCLib.hxx>
#include <ElSLib.hxx>
#include <Geom2d_Circle.hxx>
#include <Geom2d_Line.hxx>
#include <Geom_Circle.hxx>
#include <Geom_ConicalSurface.hxx>
#include <Geom_Curve.hxx>
#include <Geom_CylindricalSurface.hxx>
#include <Geom_Line.hxx>
#include <Geom_Plane.hxx>
#include <Geom_SphericalSurface.hxx>
#include <Geom_Surface.hxx>
#include <Geom_SurfaceOfRevolution.hxx>
#include <Geom_ToroidalSurface.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <GeomAdaptor_Surface.hxx>
#include <gp.hxx>
#include <gp_Ax1.hxx>
#include <gp_Ax3.hxx>
#include <gp_Ax22d.hxx>
#include <gp_Circ2d.hxx>
#include <gp_Cone.hxx>
#include <gp_Cylinder.hxx>
#include <gp_Dir.hxx>
#include <gp_Dir2d.hxx>
#include <gp_Lin.hxx>
#include <gp_Lin2d.hxx>
#include <gp_Pln.hxx>
#include <gp_Pnt.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Sphere.hxx>
#include <gp_Torus.hxx>
#include <gp_Trsf.hxx>
#include <Precision.hxx>
#include <Standard_ConstructionError.hxx>
#include <Sweep_NumShape.hxx>
#include <TopExp.hxx>
#include <TopLoc_Location.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <Geom_BSplineCurve.hxx>
#include <Geom_BezierCurve.hxx>
#include <TopExp_Explorer.hxx>
static Standard_Real ComputeTolerance(TopoDS_Edge& E,
const TopoDS_Face& F,
const Handle(Geom2d_Curve)& C)
{
if(BRep_Tool::Degenerated(E)) return BRep_Tool::Tolerance(E);
Standard_Real first,last;
Handle(Geom_Surface) surf = BRep_Tool::Surface(F);
Handle(Geom_Curve) c3d = BRep_Tool::Curve(E,first,last);
Standard_Real d2 = 0.;
Standard_Integer nn = 23;
Standard_Real unsurnn = 1./nn;
for(Standard_Integer i = 0; i <= nn; i++){
Standard_Real t = unsurnn*i;
Standard_Real u = first*(1.-t) + last*t;
gp_Pnt Pc3d = c3d->Value(u);
gp_Pnt2d UV = C->Value(u);
gp_Pnt Pcons = surf->Value(UV.X(),UV.Y());
if (Precision::IsInfinite(Pcons.X()) ||
Precision::IsInfinite(Pcons.Y()) ||
Precision::IsInfinite(Pcons.Z())) {
d2=Precision::Infinite();
break;
}
Standard_Real temp = Pc3d.SquareDistance(Pcons);
if(temp > d2) d2 = temp;
}
d2 = 1.5*sqrt(d2);
if(d2<1.e-7) d2 = 1.e-7;
return d2;
}
static void SetThePCurve(const BRep_Builder& B,
TopoDS_Edge& E,
const TopoDS_Face& F,
const TopAbs_Orientation O,
const Handle(Geom2d_Curve)& C)
{
// check if there is already a pcurve
Standard_Real f,l;
Handle(Geom2d_Curve) OC;
TopLoc_Location SL;
Handle(Geom_Plane) GP = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(F,SL));
if (GP.IsNull())
OC = BRep_Tool::CurveOnSurface(E,F,f,l);
if (OC.IsNull())
B.UpdateEdge(E,C,F,ComputeTolerance(E,F,C));
else {
if (O == TopAbs_REVERSED)
B.UpdateEdge(E,OC,C,F,ComputeTolerance(E,F,C));
else
B.UpdateEdge(E,C,OC,F,ComputeTolerance(E,F,C));
}
}
//=======================================================================
//function : BRepSweep_Rotation
//purpose :
//=======================================================================
BRepSweep_Rotation::BRepSweep_Rotation(const TopoDS_Shape& S,
const Sweep_NumShape& N,
const TopLoc_Location& L,
const gp_Ax1& A,
const Standard_Real D,
const Standard_Boolean C):
BRepSweep_Trsf(BRep_Builder(),S,N,L,C),
myAng(D),
myAxe(A)
{
Standard_ConstructionError_Raise_if(D < Precision::Angular(),
"BRepSweep_Rotation::Constructor");
Init();
}
//=======================================================================
//function : MakeEmptyVertex
//purpose :
//=======================================================================
TopoDS_Shape BRepSweep_Rotation::MakeEmptyVertex
(const TopoDS_Shape& aGenV,
const Sweep_NumShape& aDirV)
{
//call only in construction mode with copy.
Standard_ConstructionError_Raise_if
(!myCopy,"BRepSweep_Rotation::MakeEmptyVertex");
gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
TopoDS_Vertex V;
if (aDirV.Index()==2) P.Transform(myLocation.Transformation());
////// modified by jgv, 1.10.01, for buc61005 //////
//myBuilder.Builder().MakeVertex(V,P,Precision::Confusion());
myBuilder.Builder().MakeVertex( V, P, BRep_Tool::Tolerance(TopoDS::Vertex(aGenV)) );
////////////////////////////////////////////////////
if (aDirV.Index() == 1 &&
IsInvariant(aGenV) &&
myDirShapeTool.NbShapes() == 3) {
myBuiltShapes(myGenShapeTool.Index(aGenV),3) = Standard_True;
myShapes(myGenShapeTool.Index(aGenV),3) = V;
}
return V;
}
//=======================================================================
//function : MakeEmptyDirectingEdge
//purpose :
//=======================================================================
TopoDS_Shape BRepSweep_Rotation::MakeEmptyDirectingEdge
(const TopoDS_Shape& aGenV,
const Sweep_NumShape&)
{
TopoDS_Edge E;
gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
gp_Dir Dirz(myAxe.Direction());
gp_Vec V(Dirz);
gp_Pnt O(myAxe.Location());
O.Translate(V.Dot(gp_Vec(O,P)) * V);
if (O.IsEqual(P,Precision::Confusion())) {
// make a degenerated edge
// temporary make 3D curve null so that
// parameters should be registered.
// myBuilder.Builder().MakeEdge(E);
gp_Ax2 Axis(O,Dirz);
Handle(Geom_Circle) GC = new Geom_Circle(Axis,0.);
myBuilder.Builder().
MakeEdge(E,GC,BRep_Tool::Tolerance(TopoDS::Vertex(aGenV)));
myBuilder.Builder().Degenerated(E,Standard_True);
}
else {
gp_Ax2 Axis(O,Dirz,gp_Dir(gp_Vec(O,P)));
Handle(Geom_Circle) GC = new Geom_Circle(Axis,O.Distance(P));
Standard_Real tol = BRep_Tool::Tolerance(TopoDS::Vertex(aGenV));
myBuilder.Builder().MakeEdge(E, GC, tol);
}
return E;
}
//=======================================================================
//function : MakeEmptyGeneratingEdge
//purpose :
//=======================================================================
TopoDS_Shape BRepSweep_Rotation::MakeEmptyGeneratingEdge
(const TopoDS_Shape& aGenE,
const Sweep_NumShape& aDirV)
{
//call in case of construction with copy, or only when meridian touches myaxe.
TopoDS_Edge E;
if(BRep_Tool::Degenerated(TopoDS::Edge(aGenE)))
{
myBuilder.Builder().MakeEdge(E);
myBuilder.Builder().UpdateEdge(E, BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
myBuilder.Builder().Degenerated(E, Standard_True);
}
else
{
Standard_Real First,Last;
TopLoc_Location Loc;
Handle(Geom_Curve) C = Handle(Geom_Curve)::DownCast
(BRep_Tool::Curve(TopoDS::Edge(aGenE),Loc,First,Last)->Copy());
if(!C.IsNull())
{
C->Transform(Loc.Transformation());
if(aDirV.Index() == 2) C->Transform(myLocation.Transformation());
}
myBuilder.Builder().MakeEdge(E,C,BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
}
if (aDirV.Index() == 1 &&
IsInvariant(aGenE) &&
myDirShapeTool.NbShapes() == 3) {
myBuiltShapes(myGenShapeTool.Index(aGenE),3) = Standard_True;
myShapes(myGenShapeTool.Index(aGenE),3) = E;
}
return E;
}
//=======================================================================
//function : SetParameters
//purpose :
//=======================================================================
void BRepSweep_Rotation::SetParameters
(const TopoDS_Shape& aNewFace,
TopoDS_Shape& aNewVertex,
const TopoDS_Shape& aGenF,
const TopoDS_Shape& aGenV,
const Sweep_NumShape&)
{
//Glue the parameter of vertices directly included in cap faces.
gp_Pnt2d pnt2d = BRep_Tool::Parameters(TopoDS::Vertex(aGenV),
TopoDS::Face(aGenF));
myBuilder.Builder().UpdateVertex
(TopoDS::Vertex(aNewVertex),pnt2d.X(),pnt2d.Y(),
TopoDS::Face(aNewFace),Precision::PConfusion());
}
//=======================================================================
//function : SetDirectingParameter
//purpose :
//=======================================================================
void BRepSweep_Rotation::SetDirectingParameter
(const TopoDS_Shape& aNewEdge,
TopoDS_Shape& aNewVertex,
const TopoDS_Shape&,
const Sweep_NumShape&,
const Sweep_NumShape& aDirV)
{
Standard_Real param = 0;
TopAbs_Orientation ori = TopAbs_FORWARD;
if (aDirV.Index() == 2) {
param = myAng;
ori = TopAbs_REVERSED;
}
TopoDS_Vertex V_wnt = TopoDS::Vertex(aNewVertex);
V_wnt.Orientation(ori);
myBuilder.Builder().UpdateVertex(V_wnt,
param,TopoDS::Edge(aNewEdge),
Precision::PConfusion());
}
//=======================================================================
//function : SetGeneratingParameter
//purpose :
//=======================================================================
void BRepSweep_Rotation::SetGeneratingParameter
(const TopoDS_Shape& aNewEdge,
TopoDS_Shape& aNewVertex,
const TopoDS_Shape& aGenE,
const TopoDS_Shape& aGenV,
const Sweep_NumShape&)
{
TopoDS_Vertex vbid = TopoDS::Vertex(aNewVertex);
vbid.Orientation(aGenV.Orientation());
myBuilder.Builder().UpdateVertex
(vbid,
BRep_Tool::Parameter(TopoDS::Vertex(aGenV),TopoDS::Edge(aGenE)),
TopoDS::Edge(aNewEdge),Precision::PConfusion());
}
//=======================================================================
//function : MakeEmptyFace
//purpose :
//=======================================================================
TopoDS_Shape BRepSweep_Rotation::MakeEmptyFace
(const TopoDS_Shape& aGenS,
const Sweep_NumShape& aDirS)
{
Standard_Real toler;
TopoDS_Face F;
Handle(Geom_Surface) S;
if(aGenS.ShapeType()==TopAbs_EDGE){
TopLoc_Location L;
Standard_Real First,Last;
Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(aGenS),L,First,Last);
toler = BRep_Tool::Tolerance(TopoDS::Edge(aGenS));
gp_Trsf Tr = L.Transformation();
C = Handle(Geom_Curve)::DownCast(C->Copy());
//// modified by jgv, 9.12.03 ////
C = new Geom_TrimmedCurve( C, First, Last );
//////////////////////////////////
C->Transform(Tr);
Handle(GeomAdaptor_Curve) HC = new GeomAdaptor_Curve();
HC->Load(C,First,Last);
GeomAdaptor_SurfaceOfRevolution AS(HC,myAxe);
switch(AS.GetType()){
case GeomAbs_Plane :
{
Handle(Geom_Plane) Pl = new Geom_Plane(AS.Plane());
S = Pl;
}
break;
case GeomAbs_Cylinder :
{
Handle(Geom_CylindricalSurface) Cy =
new Geom_CylindricalSurface(AS.Cylinder());
S = Cy;
}
break;
case GeomAbs_Sphere :
{
Handle(Geom_SphericalSurface) Sp =
new Geom_SphericalSurface(AS.Sphere());
S = Sp;
}
break;
case GeomAbs_Cone :
{
Handle(Geom_ConicalSurface) Co =
new Geom_ConicalSurface(AS.Cone());
S = Co;
}
break;
case GeomAbs_Torus :
{
Handle(Geom_ToroidalSurface) To =
new Geom_ToroidalSurface(AS.Torus());
S = To;
}
break;
default :
{
Handle(Geom_SurfaceOfRevolution) Se =
new Geom_SurfaceOfRevolution(C,myAxe);
S = Se;
}
break;
}
}
else{
TopLoc_Location L;
S = BRep_Tool::Surface(TopoDS::Face(aGenS),L);
toler = BRep_Tool::Tolerance(TopoDS::Face(aGenS));
gp_Trsf Tr = L.Transformation();
S = Handle(Geom_Surface)::DownCast(S->Copy());
S->Transform(Tr);
if (aDirS.Index()==2) S->Transform(myLocation.Transformation());
}
myBuilder.Builder().MakeFace(F,S,toler);
return F;
}
//=======================================================================
//function : SetPCurve
//purpose :
//=======================================================================
void BRepSweep_Rotation::SetPCurve
(const TopoDS_Shape& aNewFace,
TopoDS_Shape& aNewEdge,
const TopoDS_Shape& aGenF,
const TopoDS_Shape& aGenE,
const Sweep_NumShape&,
const TopAbs_Orientation orien)
{
//Set on edges of cap faces the same pcurves as
//on edges of the generator face.
Standard_Real First,Last;
SetThePCurve(myBuilder.Builder(),
TopoDS::Edge(aNewEdge),
TopoDS::Face(aNewFace),
orien,
BRep_Tool::CurveOnSurface
(TopoDS::Edge(aGenE),TopoDS::Face(aGenF),First,Last));
}
//=======================================================================
//function : SetGeneratingPCurve
//purpose :
//=======================================================================
void BRepSweep_Rotation::SetGeneratingPCurve
(const TopoDS_Shape& aNewFace,
TopoDS_Shape& aNewEdge,
const TopoDS_Shape&,
const Sweep_NumShape&,
const Sweep_NumShape& aDirV,
const TopAbs_Orientation orien)
{
TopLoc_Location Loc;
GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewFace),Loc));
Standard_Real First,Last;
Standard_Real u,v;
gp_Pnt point;
gp_Pnt2d pnt2d;
gp_Dir2d dir2d;
gp_Lin2d L;
if (AS.GetType()==GeomAbs_Plane){
gp_Pln pln = AS.Plane();
gp_Ax3 ax3 = pln.Position();
Handle(Geom_Curve) aC = BRep_Tool::Curve(TopoDS::Edge(aNewEdge),Loc,First,Last);
Handle(Geom_Line) GL = Handle(Geom_Line)::DownCast(aC);
if (GL.IsNull()) {
Handle(Geom_TrimmedCurve) aTrimmedCurve = Handle(Geom_TrimmedCurve)::DownCast(aC);
if (!aTrimmedCurve.IsNull()) {
GL = Handle(Geom_Line)::DownCast(aTrimmedCurve->BasisCurve());
if (GL.IsNull()) {
throw Standard_ConstructionError("BRepSweep_Rotation::SetGeneratingPCurve");
}
}
}
gp_Lin gl = GL->Lin();
gl.Transform(Loc.Transformation());
point = gl.Location();
gp_Dir dir = gl.Direction();
ElSLib::PlaneParameters(ax3,point,u,v);
pnt2d.SetCoord(u,v);
dir2d.SetCoord(dir.Dot(ax3.XDirection()),dir.Dot(ax3.YDirection()));
L.SetLocation(pnt2d);
L.SetDirection(dir2d);
}
else if (AS.GetType()==GeomAbs_Torus){
gp_Torus tor = AS.Torus();
BRepAdaptor_Curve BC(TopoDS::Edge(aNewEdge));
Standard_Real U = BC.FirstParameter();
point = BC.Value(U);
if (point.Distance(tor.Location()) < Precision::Confusion()) {
v = M_PI;
// modified by NIZHNY-EAP Wed Mar 1 17:49:29 2000 ___BEGIN___
u = 0.;
}
else {
ElSLib::TorusParameters(tor.Position(),tor.MajorRadius(),
tor.MinorRadius(),point,u,v);
}
// u = 0.;
v = ElCLib::InPeriod(v,0.,2*M_PI);
if((2*M_PI - v) <= Precision::PConfusion()) v -= 2*M_PI;
if (aDirV.Index() == 2) {
Standard_Real uLeft = u-myAng;
ElCLib::AdjustPeriodic(-M_PI,M_PI,Precision::PConfusion(),uLeft,u);
}
else {
Standard_Real uRight = u+myAng;
ElCLib::AdjustPeriodic(-M_PI,M_PI,Precision::PConfusion(),u,uRight);
}
// modified by NIZHNY-EAP Wed Mar 1 17:49:32 2000 ___END___
pnt2d.SetCoord(u,v-U);
L.SetLocation(pnt2d);
L.SetDirection(gp::DY2d());
}
else if (AS.GetType()==GeomAbs_Sphere){
gp_Sphere sph = AS.Sphere();
BRepAdaptor_Curve BC(TopoDS::Edge(aNewEdge));
Standard_Real U = BC.FirstParameter();
point = BC.Value(U);
ElSLib::SphereParameters(sph.Position(),sph.Radius(),point,u,v);
u = 0.;
if (aDirV.Index() == 2) u = myAng;
pnt2d.SetCoord(u,v-U);
L.SetLocation(pnt2d);
L.SetDirection(gp::DY2d());
}
else{
Standard_Real anAngleTemp = 0;
if (aDirV.Index() == 2) anAngleTemp = myAng;
L.SetLocation(gp_Pnt2d(anAngleTemp,0));
L.SetDirection(gp::DY2d());
}
Handle(Geom2d_Line) GL = new Geom2d_Line(L);
SetThePCurve(myBuilder.Builder(),
TopoDS::Edge(aNewEdge),
TopoDS::Face(aNewFace),
orien,
GL);
}
//=======================================================================
//function : SetDirectingPCurve
//purpose :
//=======================================================================
void BRepSweep_Rotation::SetDirectingPCurve
(const TopoDS_Shape& aNewFace,
TopoDS_Shape& aNewEdge,
const TopoDS_Shape& aGenE,
const TopoDS_Shape& aGenV,
const Sweep_NumShape&,
const TopAbs_Orientation orien)
{
TopLoc_Location Loc;
GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewFace),Loc));
Standard_Real
par = BRep_Tool::Parameter(TopoDS::Vertex(aGenV),TopoDS::Edge(aGenE));
gp_Pnt p2 = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
gp_Pnt2d p22d;
Standard_Real u,v;
Handle(Geom2d_Curve) thePCurve;
switch(AS.GetType()){
case GeomAbs_Plane :
{
gp_Pln pln = AS.Plane();
gp_Ax3 ax3 = pln.Position();
gp_Pnt p1 = pln.Location();
Standard_Real R = p1.Distance(p2);
ElSLib::PlaneParameters(ax3,p2,u,v);
gp_Dir2d dx2d(u,v);
gp_Ax22d axe(gp::Origin2d(),dx2d,gp::DY2d());
gp_Circ2d C(axe,R);
Handle(Geom2d_Circle) GC = new Geom2d_Circle(C);
thePCurve = GC;
}
break;
case GeomAbs_Cone :
{
gp_Cone cone = AS.Cone();
ElSLib::ConeParameters(cone.Position(),cone.RefRadius(),
cone.SemiAngle(),p2,u,v);
p22d.SetCoord(0.,v);
gp_Lin2d L(p22d,gp::DX2d());
Handle(Geom2d_Line) GL = new Geom2d_Line(L);
thePCurve = GL;
}
break;
case GeomAbs_Sphere :
{
gp_Sphere sph = AS.Sphere();
ElSLib::SphereParameters(sph.Position(),sph.Radius(),p2,u,v);
p22d.SetCoord(0.,v);
gp_Lin2d L(p22d,gp::DX2d());
Handle(Geom2d_Line) GL = new Geom2d_Line(L);
thePCurve = GL;
}
break;
case GeomAbs_Torus :
{
gp_Pnt p1;
Standard_Real u1,u2,v1,v2;
gp_Torus tor = AS.Torus();
BRepAdaptor_Curve BC(TopoDS::Edge(aGenE));
p1 = BC.Value(BC.FirstParameter());
if (p1.Distance(tor.Location()) < Precision::Confusion()){
v1 = M_PI;
// modified by NIZHNY-EAP Thu Mar 2 09:43:26 2000 ___BEGIN___
u1 = 0.;
// modified by NIZHNY-EAP Thu Mar 2 15:28:59 2000 ___END___
}
else {
ElSLib::TorusParameters(tor.Position(),tor.MajorRadius(),
tor.MinorRadius(),p1,u1,v1);
}
p2 = BC.Value(BC.LastParameter());
if (p2.Distance(tor.Location()) < Precision::Confusion()){
v2 = M_PI;
}
else {
ElSLib::TorusParameters(tor.Position(),tor.MajorRadius(),
tor.MinorRadius(),p2,u2,v2);
}
ElCLib::AdjustPeriodic(0.,2*M_PI,Precision::PConfusion(),v1,v2);
// modified by NIZHNY-EAP Thu Mar 2 15:29:04 2000 ___BEGIN___
u2 = u1 + myAng;
ElCLib::AdjustPeriodic(-M_PI,M_PI,Precision::PConfusion(),u1,u2);
if (aGenV.Orientation()==TopAbs_FORWARD){
p22d.SetCoord(u1,v1);
}
else {
p22d.SetCoord(u1,v2);
// modified by NIZHNY-EAP Thu Mar 2 09:43:32 2000 ___END___
}
gp_Lin2d L(p22d,gp::DX2d());
Handle(Geom2d_Line) GL = new Geom2d_Line(L);
thePCurve = GL;
}
break;
default :
{
p22d.SetCoord(0.,par);
gp_Lin2d L(p22d,gp::DX2d());
Handle(Geom2d_Line) GL = new Geom2d_Line(L);
thePCurve = GL;
}
break;
}
SetThePCurve(myBuilder.Builder(),
TopoDS::Edge(aNewEdge),
TopoDS::Face(aNewFace),
orien,
thePCurve);
}
//modified by NIZNHY-PKV Tue Jun 14 08:33:55 2011f
//=======================================================================
//function : DirectSolid
//purpose :
//=======================================================================
TopAbs_Orientation
BRepSweep_Rotation::DirectSolid (const TopoDS_Shape& aGenS,
const Sweep_NumShape&)
{ // compare the face normal and the direction
Standard_Real aU1, aU2, aV1, aV2, aUx, aVx, aX, aMV2, aTol2, aTx;
TopAbs_Orientation aOr;
gp_Pnt aP;
gp_Vec du,dv;
BRepAdaptor_Surface surf(TopoDS::Face(aGenS));
//
aTol2=Precision::Confusion();
aTol2=aTol2*aTol2;
//
const gp_Pnt& aPAxeLoc=myAxe.Location();
const gp_Dir& aPAxeDir=myAxe.Direction();
//
aU1=surf.FirstUParameter();
aU2=surf.LastUParameter();
aV1=surf.FirstVParameter();
aV2=surf.LastVParameter();
//
aTx=0.5;
aUx=aTx*(aU1+aU2);
aVx=aTx*(aV1+aV2);
surf.D1(aUx, aVx, aP, du, dv);
//
gp_Vec aV(aPAxeLoc, aP);
aV.Cross(aPAxeDir);
aMV2=aV.SquareMagnitude();
if (aMV2<aTol2) {
aTx=0.43213918;
aUx=aU1*(1.-aTx)+aU2*aTx;
aVx=aV1*(1.-aTx)+aV2*aTx;
surf.D1(aUx, aVx, aP, du, dv);
aV.SetXYZ(aP.XYZ()-aPAxeLoc.XYZ());
aV.Cross(aPAxeDir);
}
//
aX = aV.DotCross(du, dv);
aOr = (aX > 0.) ? TopAbs_FORWARD : TopAbs_REVERSED;
return aOr;
}
/*
//=======================================================================
//function : DirectSolid
//purpose :
//=======================================================================
TopAbs_Orientation
BRepSweep_Rotation::DirectSolid (const TopoDS_Shape& aGenS,
const Sweep_NumShape&)
{
// compare the face normal and the direction
BRepAdaptor_Surface surf(TopoDS::Face(aGenS));
gp_Pnt P;
gp_Vec du,dv;
surf.D1((surf.FirstUParameter() + surf.LastUParameter()) / 2.,
(surf.FirstVParameter() + surf.LastVParameter()) / 2.,
P,du,dv);
gp_Vec V(myAxe.Location(),P);
V.Cross(myAxe.Direction());
Standard_Real x = V.DotCross(du,dv);
TopAbs_Orientation orient = (x > 0) ? TopAbs_FORWARD : TopAbs_REVERSED;
return orient;
}
*/
//modified by NIZNHY-PKV Tue Jun 14 08:33:59 2011t
//=======================================================================
//function : GGDShapeIsToAdd
//purpose :
//=======================================================================
Standard_Boolean BRepSweep_Rotation::GGDShapeIsToAdd
(const TopoDS_Shape& aNewShape,
const TopoDS_Shape& aNewSubShape,
const TopoDS_Shape& aGenS,
const TopoDS_Shape& aSubGenS,
const Sweep_NumShape& aDirS )const
{
Standard_Boolean aRes = Standard_True;
if (aNewShape.ShapeType()==TopAbs_FACE &&
aNewSubShape.ShapeType()==TopAbs_EDGE &&
aGenS.ShapeType()==TopAbs_EDGE &&
aSubGenS.ShapeType()==TopAbs_VERTEX &&
aDirS.Type()==TopAbs_EDGE){
TopLoc_Location Loc;
GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewShape),Loc));
if (AS.GetType()==GeomAbs_Plane){
return (!IsInvariant(aSubGenS));
}
else{
return aRes;
}
}
else{
return aRes;
}
}
//=======================================================================
//function : GDDShapeIsToAdd
//purpose :
//=======================================================================
Standard_Boolean BRepSweep_Rotation::GDDShapeIsToAdd
(const TopoDS_Shape& aNewShape,
const TopoDS_Shape& aNewSubShape,
const TopoDS_Shape& aGenS,
const Sweep_NumShape& aDirS,
const Sweep_NumShape& aSubDirS )const
{
if ( aNewShape.ShapeType() == TopAbs_SOLID &&
aNewSubShape.ShapeType() == TopAbs_FACE &&
aGenS.ShapeType() == TopAbs_FACE &&
aDirS.Type() == TopAbs_EDGE &&
aSubDirS.Type() == TopAbs_VERTEX ){
return ( Abs(myAng - 2 * M_PI) > Precision::Angular() );
}
else if ( aNewShape.ShapeType() == TopAbs_FACE &&
aNewSubShape.ShapeType() == TopAbs_EDGE &&
aGenS.ShapeType() == TopAbs_EDGE &&
aDirS.Type() == TopAbs_EDGE &&
aSubDirS.Type() == TopAbs_VERTEX ){
TopLoc_Location Loc;
GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewShape),Loc));
if (AS.GetType()==GeomAbs_Plane){
return ( Abs(myAng - 2 * M_PI) > Precision::Angular() );
}
else {
return Standard_True;
}
}
else {
return Standard_True;
}
}
//=======================================================================
//function : SeparatedWires
//purpose :
//=======================================================================
Standard_Boolean BRepSweep_Rotation::SeparatedWires
(const TopoDS_Shape& aNewShape,
const TopoDS_Shape& aNewSubShape,
const TopoDS_Shape& aGenS,
const TopoDS_Shape& aSubGenS,
const Sweep_NumShape& aDirS )const
{
if (aNewShape.ShapeType()==TopAbs_FACE &&
aNewSubShape.ShapeType()==TopAbs_EDGE &&
aGenS.ShapeType()==TopAbs_EDGE &&
aSubGenS.ShapeType()==TopAbs_VERTEX &&
aDirS.Type()==TopAbs_EDGE){
TopLoc_Location Loc;
GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewShape),Loc));
if (AS.GetType()==GeomAbs_Plane){
return (Abs(myAng-2*M_PI) <= Precision::Angular());
}
else{
return Standard_False;
}
}
else{
return Standard_False;
}
}
//=======================================================================
//function : SplitShell
//purpose :
//=======================================================================
TopoDS_Shape BRepSweep_Rotation::SplitShell(const TopoDS_Shape& aNewShape)const
{
BRepTools_Quilt Q;
Q.Add(aNewShape);
return Q.Shells();
}
//=======================================================================
//function : HasShape
//purpose :
//=======================================================================
Standard_Boolean BRepSweep_Rotation::HasShape
(const TopoDS_Shape& aGenS,
const Sweep_NumShape& aDirS)const
{
if(aDirS.Type()==TopAbs_EDGE&&
aGenS.ShapeType()==TopAbs_EDGE)
{
// Verify that the edge has entrails
const TopoDS_Edge& anEdge = TopoDS::Edge(aGenS);
//
if(BRep_Tool::Degenerated(anEdge)) return Standard_False;
Standard_Real aPFirst, aPLast;
TopLoc_Location aLoc;
Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aLoc, aPFirst, aPLast);
if(aCurve.IsNull()) return Standard_False;
if(IsInvariant(aGenS)) return Standard_False;
//Check seem edge
TopExp_Explorer FaceExp(myGenShape, TopAbs_FACE);
for (;FaceExp.More(); FaceExp.Next()) {
TopoDS_Face F = TopoDS::Face(FaceExp.Current());
if (BRepTools::IsReallyClosed(anEdge, F))
return Standard_False;
}
return Standard_True;
}
else
{
return Standard_True;
}
}
//=======================================================================
//function : IsInvariant
//purpose :
//=======================================================================
Standard_Boolean BRepSweep_Rotation::IsInvariant
(const TopoDS_Shape& aGenS)const
{
if(aGenS.ShapeType()==TopAbs_EDGE)
{
BRepAdaptor_Curve aC(TopoDS::Edge(aGenS));
if (aC.GetType() == GeomAbs_Line ||
aC.GetType() == GeomAbs_BSplineCurve ||
aC.GetType() == GeomAbs_BezierCurve)
{
TopoDS_Vertex V1, V2;
TopExp::Vertices(TopoDS::Edge(aGenS), V1, V2);
if (IsInvariant(V1) && IsInvariant(V2))
{
if (aC.GetType() == GeomAbs_Line)
return Standard_True;
Standard_Real aTol = Max(BRep_Tool::Tolerance(V1), BRep_Tool::Tolerance(V2));
gp_Lin Lin(myAxe.Location(), myAxe.Direction());
const TColgp_Array1OfPnt& aPoles = (aC.GetType() == GeomAbs_BSplineCurve
? aC.BSpline()->Poles() : aC.Bezier()->Poles());
for (Standard_Integer i=aPoles.Lower(); i <= aPoles.Upper(); i++)
{
if (Lin.Distance(aPoles(i)) > aTol)
return Standard_False;
}
return Standard_True;
}
}
}
else if(aGenS.ShapeType()==TopAbs_VERTEX){
gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aGenS));
gp_Lin Lin (myAxe.Location(), myAxe.Direction());
return ( Lin.Distance(P) <= BRep_Tool::Tolerance(TopoDS::Vertex(aGenS)));
}
return Standard_False;
}
//=======================================================================
//function : Angle
//purpose :
//=======================================================================
Standard_Real BRepSweep_Rotation::Angle()const
{
return myAng;
}
//=======================================================================
//function : Axe
//purpose :
//=======================================================================
gp_Ax1 BRepSweep_Rotation::Axe()const
{
return myAxe;
}