mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
0029496: No intersection curve between faces if starting points are given
Now, bounded IntPatch_Points are found in case when starting points are used in intersection algorithm. Before the fix, these points were not looked for (even).
This commit is contained in:
@@ -931,21 +931,19 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)& theS1,
|
||||
// 3. ts1 == ts2 == 0 <Param-Param>
|
||||
|
||||
// Geom - Geom
|
||||
const Standard_Boolean RestrictLine = Standard_True;
|
||||
if(ts1 == ts2 && ts1 == 1)
|
||||
{
|
||||
IntSurf_ListOfPntOn2S ListOfPnts;
|
||||
ListOfPnts.Clear();
|
||||
if(isGeomInt)
|
||||
{
|
||||
GeomGeomPerfom( theS1, theD1, theS2, theD2, TolArc,
|
||||
TolTang, ListOfPnts, RestrictLine,
|
||||
typs1, typs2, theIsReqToKeepRLine);
|
||||
GeomGeomPerfom(theS1, theD1, theS2, theD2, TolArc, TolTang,
|
||||
ListOfPnts, typs1, typs2, theIsReqToKeepRLine);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParamParamPerfom(theS1, theD1, theS2, theD2,
|
||||
TolArc, TolTang, ListOfPnts, RestrictLine, typs1, typs2);
|
||||
TolArc, TolTang, ListOfPnts, typs1, typs2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -962,7 +960,7 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)& theS1,
|
||||
ListOfPnts.Clear();
|
||||
|
||||
ParamParamPerfom(theS1, theD1, theS2, theD2, TolArc,
|
||||
TolTang, ListOfPnts, RestrictLine, typs1, typs2);
|
||||
TolTang, ListOfPnts, typs1, typs2);
|
||||
}
|
||||
|
||||
if(!theIsReqToPostWLProc)
|
||||
@@ -979,7 +977,7 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)& theS1,
|
||||
continue;
|
||||
|
||||
Handle(IntPatch_WLine) aRW =
|
||||
IntPatch_WLineTool::ComputePurgedWLine(aWL, theS1, theS2, theD1, theD2, RestrictLine);
|
||||
IntPatch_WLineTool::ComputePurgedWLine(aWL, theS1, theS2, theD1, theD2);
|
||||
|
||||
if(aRW.IsNull())
|
||||
continue;
|
||||
@@ -1000,7 +998,6 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)& theS1,
|
||||
const Standard_Real TolArc,
|
||||
const Standard_Real TolTang,
|
||||
IntSurf_ListOfPntOn2S& ListOfPnts,
|
||||
const Standard_Boolean RestrictLine,
|
||||
const Standard_Boolean isGeomInt,
|
||||
const Standard_Boolean theIsReqToKeepRLine,
|
||||
const Standard_Boolean theIsReqToPostWLProc)
|
||||
@@ -1184,7 +1181,7 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)& theS1,
|
||||
if(!isGeomInt)
|
||||
{
|
||||
ParamParamPerfom(theS1, theD1, theS2, theD2,
|
||||
TolArc, TolTang, ListOfPnts, RestrictLine, typs1, typs2);
|
||||
TolArc, TolTang, ListOfPnts, typs1, typs2);
|
||||
}
|
||||
else if(ts1 != ts2)
|
||||
{
|
||||
@@ -1193,12 +1190,12 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)& theS1,
|
||||
else if (ts1 == 0)
|
||||
{
|
||||
ParamParamPerfom(theS1, theD1, theS2, theD2,
|
||||
TolArc, TolTang, ListOfPnts, RestrictLine, typs1, typs2);
|
||||
TolArc, TolTang, ListOfPnts, typs1, typs2);
|
||||
}
|
||||
else if(ts1 == 1)
|
||||
{
|
||||
GeomGeomPerfom(theS1, theD1, theS2, theD2, TolArc,
|
||||
TolTang, ListOfPnts, RestrictLine, typs1, typs2, theIsReqToKeepRLine);
|
||||
GeomGeomPerfom(theS1, theD1, theS2, theD2, TolArc, TolTang,
|
||||
ListOfPnts, typs1, typs2, theIsReqToKeepRLine);
|
||||
}
|
||||
|
||||
if(!theIsReqToPostWLProc)
|
||||
@@ -1215,7 +1212,7 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)& theS1,
|
||||
continue;
|
||||
|
||||
Handle(IntPatch_WLine) aRW =
|
||||
IntPatch_WLineTool::ComputePurgedWLine(aWL, theS1, theS2, theD1, theD2, RestrictLine);
|
||||
IntPatch_WLineTool::ComputePurgedWLine(aWL, theS1, theS2, theD1, theD2);
|
||||
|
||||
if(aRW.IsNull())
|
||||
continue;
|
||||
@@ -1236,7 +1233,6 @@ void IntPatch_Intersection::ParamParamPerfom(const Handle(Adaptor3d_HSurface)&
|
||||
const Standard_Real TolArc,
|
||||
const Standard_Real TolTang,
|
||||
IntSurf_ListOfPntOn2S& ListOfPnts,
|
||||
const Standard_Boolean RestrictLine,
|
||||
const GeomAbs_SurfaceType typs1,
|
||||
const GeomAbs_SurfaceType typs2)
|
||||
{
|
||||
@@ -1246,10 +1242,10 @@ void IntPatch_Intersection::ParamParamPerfom(const Handle(Adaptor3d_HSurface)&
|
||||
Standard_Boolean ClearFlag = Standard_True;
|
||||
if(!ListOfPnts.IsEmpty())
|
||||
{
|
||||
interpp.Perform(theS1,theD1,theS2,theD2,TolTang,TolArc,myFleche,myUVMaxStep, ListOfPnts, RestrictLine);
|
||||
interpp.Perform(theS1,theD1,theS2,theD2,TolTang,TolArc,myFleche,myUVMaxStep, ListOfPnts);
|
||||
ClearFlag = Standard_False;
|
||||
}
|
||||
interpp.Perform(theS1,theD1,theS2,theD2,TolTang,TolArc,myFleche,myUVMaxStep,ClearFlag); //double call!!!!!!!
|
||||
interpp.Perform(theS1,theD1,theS2,theD2,TolTang,TolArc,myFleche,myUVMaxStep,ClearFlag);
|
||||
}
|
||||
else if((theD1->DomainIsInfinite()) ^ (theD2->DomainIsInfinite()))
|
||||
{
|
||||
@@ -1346,7 +1342,6 @@ void IntPatch_Intersection::GeomGeomPerfom(const Handle(Adaptor3d_HSurface)& the
|
||||
const Standard_Real TolArc,
|
||||
const Standard_Real TolTang,
|
||||
IntSurf_ListOfPntOn2S& ListOfPnts,
|
||||
const Standard_Boolean RestrictLine,
|
||||
const GeomAbs_SurfaceType theTyps1,
|
||||
const GeomAbs_SurfaceType theTyps2,
|
||||
const Standard_Boolean theIsReqToKeepRLine)
|
||||
@@ -1358,7 +1353,7 @@ void IntPatch_Intersection::GeomGeomPerfom(const Handle(Adaptor3d_HSurface)& the
|
||||
{
|
||||
done = Standard_False;
|
||||
ParamParamPerfom(theS1, theD1, theS2, theD2,
|
||||
TolArc, TolTang, ListOfPnts, RestrictLine, theTyps1, theTyps2);
|
||||
TolArc, TolTang, ListOfPnts, theTyps1, theTyps2);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1605,7 +1600,7 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)& S1,
|
||||
continue;
|
||||
|
||||
Handle(IntPatch_WLine) aRW =
|
||||
IntPatch_WLineTool::ComputePurgedWLine(aWL, S1, S2, D1, D2, Standard_True);
|
||||
IntPatch_WLineTool::ComputePurgedWLine(aWL, S1, S2, D1, D2);
|
||||
|
||||
if(aRW.IsNull())
|
||||
continue;
|
||||
|
@@ -70,16 +70,16 @@ public:
|
||||
//!
|
||||
//! UVMaxStep is a parameter used in the walking
|
||||
//! algorithms to compute the distance between to
|
||||
//! points in their respective parametrtic spaces.
|
||||
//! points in their respective parametric spaces.
|
||||
Standard_EXPORT void SetTolerances (const Standard_Real TolArc, const Standard_Real TolTang, const Standard_Real UVMaxStep, const Standard_Real Fleche);
|
||||
|
||||
//! Flag theIsReqToKeepRLine has been enterred only for
|
||||
//! Flag theIsReqToKeepRLine has been entered only for
|
||||
//! compatibility with TopOpeBRep package. It shall be deleted
|
||||
//! after deleting TopOpeBRep.
|
||||
//! When intersection result returns IntPatch_RLine and another
|
||||
//! IntPatch_Line (not restriction) we (in case of theIsReqToKeepRLine==TRUE)
|
||||
//! will always keep both lines even if they are coincided.
|
||||
//! Flag theIsReqToPostWLProc has been enterred only for
|
||||
//! Flag theIsReqToPostWLProc has been entered only for
|
||||
//! compatibility with TopOpeBRep package. It shall be deleted
|
||||
//! after deleting TopOpeBRep.
|
||||
//! If theIsReqToPostWLProc == FALSE, then we will work with Walking-line
|
||||
@@ -88,18 +88,18 @@ public:
|
||||
|
||||
//! If isGeomInt == Standard_False, then method
|
||||
//! Param-Param intersection will be used.
|
||||
//! Flag theIsReqToKeepRLine has been enterred only for
|
||||
//! Flag theIsReqToKeepRLine has been entered only for
|
||||
//! compatibility with TopOpeBRep package. It shall be deleted
|
||||
//! after deleting TopOpeBRep.
|
||||
//! When intersection result returns IntPatch_RLine and another
|
||||
//! IntPatch_Line (not restriction) we (in case of theIsReqToKeepRLine==TRUE)
|
||||
//! will always keep both lines even if they are coincided.
|
||||
//! Flag theIsReqToPostWLProc has been enterred only for
|
||||
//! Flag theIsReqToPostWLProc has been entered only for
|
||||
//! compatibility with TopOpeBRep package. It shall be deleted
|
||||
//! after deleting TopOpeBRep.
|
||||
//! If theIsReqToPostWLProc == FALSE, then we will work with Walking-line
|
||||
//! obtained after intersection algorithm directly (wothout any post-processing).
|
||||
Standard_EXPORT void Perform (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_TopolTool)& D2, const Standard_Real TolArc, const Standard_Real TolTang, IntSurf_ListOfPntOn2S& LOfPnts, const Standard_Boolean RestrictLine = Standard_True, const Standard_Boolean isGeomInt = Standard_True, const Standard_Boolean theIsReqToKeepRLine = Standard_False, const Standard_Boolean theIsReqToPostWLProc = Standard_True);
|
||||
//! obtained after intersection algorithm directly (without any post-processing).
|
||||
Standard_EXPORT void Perform (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_TopolTool)& D2, const Standard_Real TolArc, const Standard_Real TolTang, IntSurf_ListOfPntOn2S& LOfPnts, const Standard_Boolean isGeomInt = Standard_True, const Standard_Boolean theIsReqToKeepRLine = Standard_False, const Standard_Boolean theIsReqToPostWLProc = Standard_True);
|
||||
|
||||
//! Perform with start point
|
||||
Standard_EXPORT void Perform (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_TopolTool)& D2, const Standard_Real U1, const Standard_Real V1, const Standard_Real U2, const Standard_Real V2, const Standard_Real TolArc, const Standard_Real TolTang);
|
||||
@@ -107,14 +107,14 @@ public:
|
||||
//! Uses for finding self-intersected surfaces.
|
||||
Standard_EXPORT void Perform (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Standard_Real TolArc, const Standard_Real TolTang);
|
||||
|
||||
//! Returns True if the calculus was succesfull.
|
||||
//! Returns True if the calculus was successful.
|
||||
Standard_Boolean IsDone() const;
|
||||
|
||||
//! Returns true if the is no intersection.
|
||||
Standard_Boolean IsEmpty() const;
|
||||
|
||||
//! Returns True if the two patches are considered as
|
||||
//! entierly tangent, i-e every restriction arc of one
|
||||
//! entirely tangent, i-e every restriction arc of one
|
||||
//! patch is inside the geometric base of the other patch.
|
||||
Standard_Boolean TangentFaces() const;
|
||||
|
||||
@@ -157,15 +157,15 @@ protected:
|
||||
private:
|
||||
|
||||
|
||||
Standard_EXPORT void ParamParamPerfom (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_TopolTool)& D2, const Standard_Real TolArc, const Standard_Real TolTang, IntSurf_ListOfPntOn2S& LOfPnts, const Standard_Boolean RestrictLine, const GeomAbs_SurfaceType typs1, const GeomAbs_SurfaceType typs2);
|
||||
Standard_EXPORT void ParamParamPerfom (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_TopolTool)& D2, const Standard_Real TolArc, const Standard_Real TolTang, IntSurf_ListOfPntOn2S& LOfPnts, const GeomAbs_SurfaceType typs1, const GeomAbs_SurfaceType typs2);
|
||||
|
||||
//! Flag theIsReqToKeepRLine has been enterred only for
|
||||
//! Flag theIsReqToKeepRLine has been entered only for
|
||||
//! compatibility with TopOpeBRep package. It shall be deleted
|
||||
//! after deleting TopOpeBRep.
|
||||
//! When intersection result returns IntPatch_RLine and another
|
||||
//! IntPatch_Line (not restriction) we (in case of theIsReqToKeepRLine==TRUE)
|
||||
//! will always keep both lines even if they are coincided.
|
||||
Standard_EXPORT void GeomGeomPerfom (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_TopolTool)& D2, const Standard_Real TolArc, const Standard_Real TolTang, IntSurf_ListOfPntOn2S& LOfPnts, const Standard_Boolean RestrictLine, const GeomAbs_SurfaceType typs1, const GeomAbs_SurfaceType typs2, const Standard_Boolean theIsReqToKeepRLine = Standard_False);
|
||||
Standard_EXPORT void GeomGeomPerfom (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_TopolTool)& D2, const Standard_Real TolArc, const Standard_Real TolTang, IntSurf_ListOfPntOn2S& LOfPnts, const GeomAbs_SurfaceType typs1, const GeomAbs_SurfaceType typs2, const Standard_Boolean theIsReqToKeepRLine);
|
||||
|
||||
Standard_EXPORT void GeomParamPerfom (const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_TopolTool)& D1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_TopolTool)& D2, const Standard_Boolean isNotAnalitical, const GeomAbs_SurfaceType typs1, const GeomAbs_SurfaceType typs2);
|
||||
|
||||
|
@@ -1551,8 +1551,7 @@ void IntPatch_PrmPrmIntersection::Perform (const Handle(Adaptor3d_HSurface)&
|
||||
const Standard_Real Epsilon,
|
||||
const Standard_Real Deflection,
|
||||
const Standard_Real Increment,
|
||||
IntSurf_ListOfPntOn2S& LOfPnts,
|
||||
const Standard_Boolean RestrictLine)
|
||||
IntSurf_ListOfPntOn2S& LOfPnts)
|
||||
{
|
||||
if (LOfPnts.IsEmpty()){
|
||||
done = Standard_True;
|
||||
@@ -1788,15 +1787,13 @@ void IntPatch_PrmPrmIntersection::Perform (const Handle(Adaptor3d_HSurface)&
|
||||
|
||||
Standard_Real TolTang = TolTangency;
|
||||
Handle(IntPatch_WLine) wline = new IntPatch_WLine(PW.Line(),Standard_False,trans1,trans2);
|
||||
if (RestrictLine){
|
||||
//the method PutVertexOnLine can reduce the number of points in <wline>
|
||||
IntPatch_RstInt::PutVertexOnLine(wline,Surf1,D1,Surf2,Standard_True,TolTang);
|
||||
if (wline->NbPnts() < 2)
|
||||
continue;
|
||||
IntPatch_RstInt::PutVertexOnLine(wline,Surf2,D2,Surf1,Standard_False,TolTang);
|
||||
if (wline->NbPnts() < 2)
|
||||
continue;
|
||||
}
|
||||
//the method PutVertexOnLine can reduce the number of points in <wline>
|
||||
IntPatch_RstInt::PutVertexOnLine(wline, Surf1, D1, Surf2, Standard_True, TolTang);
|
||||
if (wline->NbPnts() < 2)
|
||||
continue;
|
||||
IntPatch_RstInt::PutVertexOnLine(wline, Surf2, D2, Surf1, Standard_False, TolTang);
|
||||
if (wline->NbPnts() < 2)
|
||||
continue;
|
||||
|
||||
if(wline->NbVertex() == 0) {
|
||||
IntPatch_Point vtx;
|
||||
|
@@ -68,7 +68,7 @@ public:
|
||||
//! Performs the intersection between <Caro1> and
|
||||
//! <Caro2>. The method computes the polyhedron on
|
||||
//! each surface.
|
||||
Standard_EXPORT void Perform (const Handle(Adaptor3d_HSurface)& Caro1, const Handle(Adaptor3d_TopolTool)& Domain1, const Handle(Adaptor3d_HSurface)& Caro2, const Handle(Adaptor3d_TopolTool)& Domain2, const Standard_Real TolTangency, const Standard_Real Epsilon, const Standard_Real Deflection, const Standard_Real Increment, IntSurf_ListOfPntOn2S& ListOfPnts, const Standard_Boolean RestrictLine);
|
||||
Standard_EXPORT void Perform (const Handle(Adaptor3d_HSurface)& Caro1, const Handle(Adaptor3d_TopolTool)& Domain1, const Handle(Adaptor3d_HSurface)& Caro2, const Handle(Adaptor3d_TopolTool)& Domain2, const Standard_Real TolTangency, const Standard_Real Epsilon, const Standard_Real Deflection, const Standard_Real Increment, IntSurf_ListOfPntOn2S& ListOfPnts);
|
||||
|
||||
//! Performs the intersection between <Caro1> and
|
||||
//! <Caro2>. The method computes the polyhedron on
|
||||
|
@@ -1282,8 +1282,7 @@ Handle(IntPatch_WLine) IntPatch_WLineTool::
|
||||
const Handle(Adaptor3d_HSurface) &theS1,
|
||||
const Handle(Adaptor3d_HSurface) &theS2,
|
||||
const Handle(Adaptor3d_TopolTool) &theDom1,
|
||||
const Handle(Adaptor3d_TopolTool) &theDom2,
|
||||
const Standard_Boolean theRestrictLine)
|
||||
const Handle(Adaptor3d_TopolTool) &theDom2)
|
||||
{
|
||||
Standard_Integer i, k, v, nb, nbvtx;
|
||||
Handle(IntPatch_WLine) aResult;
|
||||
@@ -1386,11 +1385,8 @@ Handle(IntPatch_WLine) IntPatch_WLineTool::
|
||||
return aLocalWLine;
|
||||
}
|
||||
|
||||
if (theRestrictLine)
|
||||
{
|
||||
// II: Delete out of borders points.
|
||||
aLocalWLine = DeleteOuterPoints(aLocalWLine, theS1, theS2, theDom1, theDom2);
|
||||
}
|
||||
// II: Delete out of borders points.
|
||||
aLocalWLine = DeleteOuterPoints(aLocalWLine, theS1, theS2, theDom1, theDom2);
|
||||
|
||||
// III: Delete points by tube criteria.
|
||||
Handle(IntPatch_WLine) aLocalWLineTube =
|
||||
|
@@ -34,7 +34,6 @@ public:
|
||||
//!
|
||||
//! II
|
||||
//! Removes point out of borders in case of non periodic surfaces.
|
||||
//! This step is done only if theRestrictLine is true.
|
||||
//!
|
||||
//! III
|
||||
//! Removes exceed points using tube criteria:
|
||||
@@ -48,8 +47,7 @@ public:
|
||||
const Handle(Adaptor3d_HSurface) &theS1,
|
||||
const Handle(Adaptor3d_HSurface) &theS2,
|
||||
const Handle(Adaptor3d_TopolTool) &theDom1,
|
||||
const Handle(Adaptor3d_TopolTool) &theDom2,
|
||||
const Standard_Boolean theRestrictLine);
|
||||
const Handle(Adaptor3d_TopolTool) &theDom2);
|
||||
|
||||
//! Joins all WLines from theSlin to one if it is possible and records
|
||||
//! the result into theSlin again. Lines will be kept to be splitted if:
|
||||
|
Reference in New Issue
Block a user