mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-09-08 14:17:06 +03:00
Some modifications according to remarks
This commit is contained in:
@@ -622,6 +622,7 @@ TopoDS_Edge BRepBuilderAPI_Sewing::SameParameterEdge(const TopoDS_Edge& edgeFirs
|
|||||||
whichSec = 1;
|
whichSec = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
|
||||||
Standard_Real first, last;
|
Standard_Real first, last;
|
||||||
BRep_Tool::Range(edge1, first, last);
|
BRep_Tool::Range(edge1, first, last);
|
||||||
@@ -957,8 +958,20 @@ TopoDS_Edge BRepBuilderAPI_Sewing::SameParameterEdge(const TopoDS_Edge& edgeFirs
|
|||||||
static_cast<BRep_TVertex*>(aV1edge.TShape().get())->Tolerance(aTolV1);
|
static_cast<BRep_TVertex*>(aV1edge.TShape().get())->Tolerance(aTolV1);
|
||||||
static_cast<BRep_TVertex*>(aV2edge.TShape().get())->Tolerance(aTolV2);
|
static_cast<BRep_TVertex*>(aV2edge.TShape().get())->Tolerance(aTolV2);
|
||||||
|
|
||||||
BRepLib::SetPCurve(edge, c2d2edge, fac2, myTolerance,
|
Standard_Real aLimTol = myTolerance;
|
||||||
aTolReached_3, aProjCurve);
|
aLimTol = Max(aLimTol, BRep_Tool::Tolerance(edgeFirst));
|
||||||
|
aLimTol = Max(aLimTol, BRep_Tool::Tolerance(edgeLast));
|
||||||
|
|
||||||
|
if (whichSec == 1) itf2.Initialize(listFacesLast);
|
||||||
|
else itf2.Initialize(listFacesFirst);
|
||||||
|
for (; itf2.More(); itf2.Next()) {
|
||||||
|
Handle(Geom2d_Curve) c2d2, c2d21;
|
||||||
|
Standard_Real firstOld, lastOld;
|
||||||
|
fac2 = TopoDS::Face(itf2.Value());
|
||||||
|
c2d2 = BRep_Tool::CurveOnSurface(edge2, fac2, firstOld, lastOld);
|
||||||
|
BRepLib::SetPCurve(edge, c2d2, fac2, aLimTol, Standard_True,
|
||||||
|
aTolReached_3, aProjCurve);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -124,7 +124,7 @@ public:
|
|||||||
//! Algorithm sets in theTolReached tolerance of edge after setting pcurve.
|
//! Algorithm sets in theTolReached tolerance of edge after setting pcurve.
|
||||||
Standard_EXPORT static void SetPCurve(const TopoDS_Edge& theE,
|
Standard_EXPORT static void SetPCurve(const TopoDS_Edge& theE,
|
||||||
const Handle(Geom2d_Curve)& theC,
|
const Handle(Geom2d_Curve)& theC,
|
||||||
const TopoDS_Face& theF, const Standard_Real theMaxTol,
|
const TopoDS_Face& theF, const Standard_Real theMaxTol, const Standard_Boolean theForceProj,
|
||||||
Standard_Real& theTolReached, Handle(Geom2d_Curve)& theProjCurve);
|
Standard_Real& theTolReached, Handle(Geom2d_Curve)& theProjCurve);
|
||||||
|
|
||||||
//! Sets the pcurve theC1, theC2 for the edge theE on the closed face theF.
|
//! Sets the pcurve theC1, theC2 for the edge theE on the closed face theF.
|
||||||
@@ -137,7 +137,7 @@ public:
|
|||||||
//! Algorithm sets in theTolReached tolerance of edge after setting pcurve.
|
//! Algorithm sets in theTolReached tolerance of edge after setting pcurve.
|
||||||
Standard_EXPORT static void SetPCurve(const TopoDS_Edge& theE,
|
Standard_EXPORT static void SetPCurve(const TopoDS_Edge& theE,
|
||||||
const Handle(Geom2d_Curve)& theC1, const Handle(Geom2d_Curve)& theC2,
|
const Handle(Geom2d_Curve)& theC1, const Handle(Geom2d_Curve)& theC2,
|
||||||
const TopoDS_Face& theF, const Standard_Real theMaxTol,
|
const TopoDS_Face& theF, const Standard_Real theMaxTol, const Standard_Boolean theForceProj,
|
||||||
Standard_Real& theTolReached,
|
Standard_Real& theTolReached,
|
||||||
Handle(Geom2d_Curve)& theProjCurve1,
|
Handle(Geom2d_Curve)& theProjCurve1,
|
||||||
Handle(Geom2d_Curve)& theProjCurve2);
|
Handle(Geom2d_Curve)& theProjCurve2);
|
||||||
|
@@ -363,55 +363,71 @@ static void UpdateTol(const TopoDS_Edge& theE, const Standard_Real theTol)
|
|||||||
void BRepLib::SetPCurve(const TopoDS_Edge& theE,
|
void BRepLib::SetPCurve(const TopoDS_Edge& theE,
|
||||||
const Handle(Geom2d_Curve)& theC,
|
const Handle(Geom2d_Curve)& theC,
|
||||||
const TopoDS_Face& theF,
|
const TopoDS_Face& theF,
|
||||||
const Standard_Real theMaxTol,
|
const Standard_Real theMaxTol, const Standard_Boolean theForceProj,
|
||||||
Standard_Real& theTolReached, Handle(Geom2d_Curve)& theProjCurve)
|
Standard_Real& theTolReached, Handle(Geom2d_Curve)& theProjCurve)
|
||||||
{
|
{
|
||||||
Standard_Real aSMTol = Precision::PConfusion();
|
|
||||||
Standard_Real aTol = BRep_Tool::Tolerance(theE);
|
|
||||||
BRep_Builder aBB;
|
|
||||||
Standard_Real fr, lr, f, l;
|
|
||||||
BRep_Tool::Range(theE, fr, lr);
|
|
||||||
Handle(Geom2d_Curve) aC = theC;
|
|
||||||
f = theC->FirstParameter();
|
|
||||||
l = theC->LastParameter();
|
|
||||||
if (!(Precision::IsInfinite(f) || Precision::IsInfinite(l)))
|
|
||||||
{
|
|
||||||
GeomLib::SameRange(aSMTol, theC, f, l, fr, lr, aC);
|
|
||||||
}
|
|
||||||
aBB.UpdateEdge(theE, aC, theF, aTol);
|
|
||||||
Handle(Geom_Surface) anS = BRep_Tool::Surface(theF);
|
|
||||||
Handle(Geom_Curve) aC3D = BRep_Tool::Curve(theE, f, l);
|
|
||||||
Standard_Real aTol1 = CompTol(aC3D, aC, anS, fr, lr);
|
|
||||||
if (aTol1 <= aTol)
|
|
||||||
{
|
|
||||||
theTolReached = aTol1;
|
|
||||||
aBB.SameParameter(theE, Standard_True);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (theMaxTol < aTol && aTol1 < 2.*aTol)
|
|
||||||
{
|
|
||||||
theTolReached = aTol1;
|
|
||||||
UpdateTol(theE, theTolReached);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
aBB.SameParameter(theE, Standard_False);
|
|
||||||
Standard_Real aNewTol = -1;
|
Standard_Real aNewTol = -1;
|
||||||
BRepLib::SameParameter(theE, aTol, aNewTol, Standard_True);
|
Standard_Real aSMTol = Precision::PConfusion();
|
||||||
if (aNewTol > 0)
|
Standard_Real fr, lr, f, l;
|
||||||
|
Handle(Geom_Curve) aC3D = BRep_Tool::Curve(theE, f, l);
|
||||||
|
Handle(Geom_Surface) anS = BRep_Tool::Surface(theF);
|
||||||
|
Handle(Geom2d_Curve) aC = theC;
|
||||||
|
BRep_Builder aBB;
|
||||||
|
Standard_Real aTol1 = RealLast();
|
||||||
|
BRep_Tool::Range(theE, fr, lr);
|
||||||
|
if (!theForceProj)
|
||||||
{
|
{
|
||||||
//Set old tolerance for edge, which has been changed by sameparameter
|
Standard_Real aTol = BRep_Tool::Tolerance(theE);
|
||||||
static_cast<BRep_TEdge*>(theE.TShape().get())->Tolerance(aTol);
|
f = theC->FirstParameter();
|
||||||
}
|
l = theC->LastParameter();
|
||||||
if (aNewTol > 0.)
|
if (!(Precision::IsInfinite(f) || Precision::IsInfinite(l)))
|
||||||
{
|
|
||||||
aC = BRep_Tool::CurveOnSurface(theE, theF, f, l);
|
|
||||||
aNewTol = CompTol(aC3D, aC, anS, fr, lr);
|
|
||||||
if (aNewTol < theMaxTol)
|
|
||||||
{
|
{
|
||||||
|
GeomLib::SameRange(aSMTol, theC, f, l, fr, lr, aC);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
if (anS.IsNull())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
if (aC3D.IsNull())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
aBB.UpdateEdge(theE, aC, theF, aTol);
|
||||||
|
//
|
||||||
|
aTol1 = CompTol(aC3D, aC, anS, fr, lr);
|
||||||
|
if (aTol1 <= aTol)
|
||||||
|
{
|
||||||
|
theTolReached = aTol1;
|
||||||
aBB.SameParameter(theE, Standard_True);
|
aBB.SameParameter(theE, Standard_True);
|
||||||
theTolReached = aNewTol;
|
return;
|
||||||
|
}
|
||||||
|
else if (theMaxTol < aTol && aTol1 < 2.*aTol)
|
||||||
|
{
|
||||||
|
theTolReached = aTol1;
|
||||||
UpdateTol(theE, theTolReached);
|
UpdateTol(theE, theTolReached);
|
||||||
return ;
|
return;
|
||||||
|
}
|
||||||
|
aBB.SameParameter(theE, Standard_False);
|
||||||
|
BRepLib::SameParameter(theE, aTol, aNewTol, Standard_True);
|
||||||
|
if (aNewTol < 0)
|
||||||
|
{
|
||||||
|
//Set old tolerance for edge, which has been changed by sameparameter
|
||||||
|
static_cast<BRep_TEdge*>(theE.TShape().get())->Tolerance(aTol);
|
||||||
|
}
|
||||||
|
if (aNewTol > 0.)
|
||||||
|
{
|
||||||
|
aC = BRep_Tool::CurveOnSurface(theE, theF, f, l);
|
||||||
|
aNewTol = CompTol(aC3D, aC, anS, fr, lr);
|
||||||
|
if (aNewTol < theMaxTol)
|
||||||
|
{
|
||||||
|
aBB.SameParameter(theE, Standard_True);
|
||||||
|
theTolReached = aNewTol;
|
||||||
|
UpdateTol(theE, theTolReached);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Projection
|
//Projection
|
||||||
@@ -508,7 +524,7 @@ void BRepLib::SetPCurve(const TopoDS_Edge& theE,
|
|||||||
void BRepLib::SetPCurve(const TopoDS_Edge& theE,
|
void BRepLib::SetPCurve(const TopoDS_Edge& theE,
|
||||||
const Handle(Geom2d_Curve)& theC1, const Handle(Geom2d_Curve)& theC2,
|
const Handle(Geom2d_Curve)& theC1, const Handle(Geom2d_Curve)& theC2,
|
||||||
const TopoDS_Face& theF,
|
const TopoDS_Face& theF,
|
||||||
const Standard_Real theMaxTol,
|
const Standard_Real theMaxTol, const Standard_Boolean theForceProj,
|
||||||
Standard_Real& theTolReached,
|
Standard_Real& theTolReached,
|
||||||
Handle(Geom2d_Curve)& theProjCurve1,
|
Handle(Geom2d_Curve)& theProjCurve1,
|
||||||
Handle(Geom2d_Curve)& theProjCurve2)
|
Handle(Geom2d_Curve)& theProjCurve2)
|
||||||
@@ -521,49 +537,64 @@ void BRepLib::SetPCurve(const TopoDS_Edge& theE,
|
|||||||
Handle(Geom2d_Curve) aC1 = theC1, aC2 = theC2;
|
Handle(Geom2d_Curve) aC1 = theC1, aC2 = theC2;
|
||||||
f = theC1->FirstParameter();
|
f = theC1->FirstParameter();
|
||||||
l = theC1->LastParameter();
|
l = theC1->LastParameter();
|
||||||
if (!(Precision::IsInfinite(f) || Precision::IsInfinite(l)))
|
Standard_Real aTol1 = RealLast();
|
||||||
{
|
Standard_Real aNewTol = -1.;
|
||||||
GeomLib::SameRange(aSMTol, theC1, f, l, fr, lr, aC1);
|
|
||||||
}
|
|
||||||
f = theC2->FirstParameter();
|
|
||||||
l = theC2->LastParameter();
|
|
||||||
if (!(Precision::IsInfinite(f) || Precision::IsInfinite(l)))
|
|
||||||
{
|
|
||||||
GeomLib::SameRange(aSMTol, theC2, f, l, fr, lr, aC2);
|
|
||||||
}
|
|
||||||
aBB.UpdateEdge(theE, aC1, aC2, theF, aTol);
|
|
||||||
Handle(Geom_Surface) anS = BRep_Tool::Surface(theF);
|
Handle(Geom_Surface) anS = BRep_Tool::Surface(theF);
|
||||||
Handle(Geom_Curve) aC3D = BRep_Tool::Curve(theE, f, l);
|
Handle(Geom_Curve) aC3D = BRep_Tool::Curve(theE, f, l);
|
||||||
Standard_Real aTol1 = CompTol(aC3D, aC1, anS, fr, lr);
|
if (!theForceProj)
|
||||||
aTol1 = Max(aTol1, CompTol(aC3D, aC2, anS, fr, lr));
|
|
||||||
if (aTol1 <= aTol)
|
|
||||||
{
|
{
|
||||||
theTolReached = aTol1;
|
if (!(Precision::IsInfinite(f) || Precision::IsInfinite(l)))
|
||||||
aBB.SameParameter(theE, Standard_True);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
aBB.SameParameter(theE, Standard_False);
|
|
||||||
Standard_Real aNewTol = -1;
|
|
||||||
BRepLib::SameParameter(theE, aTol, aNewTol, Standard_False);
|
|
||||||
if (aNewTol > 0)
|
|
||||||
{
|
|
||||||
//Set old tolerance for edge, which has been changed by sameparameter
|
|
||||||
static_cast<BRep_TEdge*>(theE.TShape().get())->Tolerance(aTol);
|
|
||||||
}
|
|
||||||
if (aNewTol > 0. && aNewTol < theMaxTol)
|
|
||||||
{
|
|
||||||
TopoDS_Vertex aV1, aV2;
|
|
||||||
TopExp::Vertices(theE, aV1, aV2);
|
|
||||||
if (!aV1.IsNull())
|
|
||||||
{
|
{
|
||||||
aBB.UpdateVertex(aV1, aNewTol);
|
GeomLib::SameRange(aSMTol, theC1, f, l, fr, lr, aC1);
|
||||||
}
|
}
|
||||||
if (!aV2.IsNull())
|
f = theC2->FirstParameter();
|
||||||
|
l = theC2->LastParameter();
|
||||||
|
if (!(Precision::IsInfinite(f) || Precision::IsInfinite(l)))
|
||||||
{
|
{
|
||||||
aBB.UpdateVertex(aV2, aNewTol);
|
GeomLib::SameRange(aSMTol, theC2, f, l, fr, lr, aC2);
|
||||||
|
}
|
||||||
|
aBB.UpdateEdge(theE, aC1, aC2, theF, aTol);
|
||||||
|
//
|
||||||
|
if (anS.IsNull())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
if (aC3D.IsNull())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
aTol1 = CompTol(aC3D, aC1, anS, fr, lr);
|
||||||
|
aTol1 = Max(aTol1, CompTol(aC3D, aC2, anS, fr, lr));
|
||||||
|
if (aTol1 <= aTol)
|
||||||
|
{
|
||||||
|
theTolReached = aTol1;
|
||||||
|
aBB.SameParameter(theE, Standard_True);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
aBB.SameParameter(theE, Standard_False);
|
||||||
|
BRepLib::SameParameter(theE, aTol, aNewTol, Standard_False);
|
||||||
|
if (aNewTol > 0)
|
||||||
|
{
|
||||||
|
//Set old tolerance for edge, which has been changed by sameparameter
|
||||||
|
static_cast<BRep_TEdge*>(theE.TShape().get())->Tolerance(aTol);
|
||||||
|
}
|
||||||
|
if (aNewTol > 0. && aNewTol < theMaxTol)
|
||||||
|
{
|
||||||
|
TopoDS_Vertex aV1, aV2;
|
||||||
|
TopExp::Vertices(theE, aV1, aV2);
|
||||||
|
if (!aV1.IsNull())
|
||||||
|
{
|
||||||
|
aBB.UpdateVertex(aV1, aNewTol);
|
||||||
|
}
|
||||||
|
if (!aV2.IsNull())
|
||||||
|
{
|
||||||
|
aBB.UpdateVertex(aV2, aNewTol);
|
||||||
|
}
|
||||||
|
theTolReached = aNewTol;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
theTolReached = aNewTol;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
//Projection
|
//Projection
|
||||||
Handle(BRepAdaptor_HSurface) aBAHS = new BRepAdaptor_HSurface(theF);
|
Handle(BRepAdaptor_HSurface) aBAHS = new BRepAdaptor_HSurface(theF);
|
||||||
|
@@ -125,11 +125,17 @@ static Standard_Integer setpcurve(Draw_Interpretor&, Standard_Integer n, const c
|
|||||||
if (n > 4) {
|
if (n > 4) {
|
||||||
tol = Draw::Atof(a[4]);
|
tol = Draw::Atof(a[4]);
|
||||||
}
|
}
|
||||||
|
Standard_Boolean ForceProj = Standard_False;
|
||||||
|
if (n > 5)
|
||||||
|
{
|
||||||
|
Standard_Integer i = Draw::Atoi(a[5]);
|
||||||
|
if (i > 0) ForceProj = Standard_True;
|
||||||
|
}
|
||||||
//BRep_Builder BB;
|
//BRep_Builder BB;
|
||||||
//BB.UpdateEdge(TopoDS::Edge(E), PC, TopoDS::Face(F), tol);
|
//BB.UpdateEdge(TopoDS::Edge(E), PC, TopoDS::Face(F), tol);
|
||||||
Standard_Real tolreached;
|
Standard_Real tolreached;
|
||||||
Handle(Geom2d_Curve) ProjC;
|
Handle(Geom2d_Curve) ProjC;
|
||||||
BRepLib::SetPCurve(TopoDS::Edge(E), PC, TopoDS::Face(F), tol,
|
BRepLib::SetPCurve(TopoDS::Edge(E), PC, TopoDS::Face(F), tol, ForceProj,
|
||||||
tolreached, ProjC);
|
tolreached, ProjC);
|
||||||
DBRep::Set(a[1], E);
|
DBRep::Set(a[1], E);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1427,7 +1433,7 @@ void BRepTest::BasicCommands(Draw_Interpretor& theCommands)
|
|||||||
__FILE__,
|
__FILE__,
|
||||||
addpcurve,g);
|
addpcurve,g);
|
||||||
theCommands.Add("setpcurve",
|
theCommands.Add("setpcurve",
|
||||||
"addpcurve edge 2dcurve face [tol (default 1.e-4)]",
|
"setpcurve edge 2dcurve face [tol (default 1.e-4)] [proj]",
|
||||||
__FILE__,
|
__FILE__,
|
||||||
setpcurve, g);
|
setpcurve, g);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user