From cbd47bd9f6785e406c6d2ee15458c8b10e397828 Mon Sep 17 00:00:00 2001 From: atereshi Date: Tue, 29 Nov 2022 12:27:13 +0300 Subject: [PATCH] 0031805: Data Exchange, XT - Invalid shape on file translation --- src/GeomInt/GeomInt_IntSS.hxx | 3 + src/GeomInt/GeomInt_IntSS.lxx | 9 ++ src/IntAna/IntAna_QuadQuadGeo.cxx | 126 +++++++++++++----- src/IntAna/IntAna_QuadQuadGeo.hxx | 6 +- src/IntPatch/IntPatch_ImpImpIntersection.hxx | 7 +- src/IntPatch/IntPatch_ImpImpIntersection.lxx | 6 + .../IntPatch_ImpImpIntersection_1.gxx | 4 +- .../IntPatch_ImpImpIntersection_2.gxx | 5 +- .../IntPatch_ImpImpIntersection_5.gxx | 7 +- src/IntPatch/IntPatch_Intersection.cxx | 24 +++- src/IntPatch/IntPatch_Intersection.hxx | 5 +- 11 files changed, 157 insertions(+), 45 deletions(-) diff --git a/src/GeomInt/GeomInt_IntSS.hxx b/src/GeomInt/GeomInt_IntSS.hxx index 943a59bf27..ed9531ea6a 100644 --- a/src/GeomInt/GeomInt_IntSS.hxx +++ b/src/GeomInt/GeomInt_IntSS.hxx @@ -90,6 +90,9 @@ public: Standard_EXPORT void TolFixTangents (Standard_Real& aTolCheck, Standard_Real& aTolAngCheck); + //! Set angular tolerance + Standard_EXPORT void SetAngularTolerance (Standard_Real theAngularTolerance); + //! converts RLine to Geom(2d)_Curve. Standard_EXPORT static void TreatRLine (const Handle(IntPatch_RLine)& theRL, const Handle(GeomAdaptor_Surface)& theHS1, const Handle(GeomAdaptor_Surface)& theHS2, Handle(Geom_Curve)& theC3d, Handle(Geom2d_Curve)& theC2d1, Handle(Geom2d_Curve)& theC2d2, Standard_Real& theTolReached); diff --git a/src/GeomInt/GeomInt_IntSS.lxx b/src/GeomInt/GeomInt_IntSS.lxx index bb80020e69..4455cad1dd 100644 --- a/src/GeomInt/GeomInt_IntSS.lxx +++ b/src/GeomInt/GeomInt_IntSS.lxx @@ -146,3 +146,12 @@ inline GeomInt_IntSS::GeomInt_IntSS () { return myIntersector.Point(Index).Value(); } + +//======================================================================= +//function : SetAngularTolerance +//purpose : +//======================================================================= +inline void GeomInt_IntSS::SetAngularTolerance (Standard_Real theAngularTolerance) +{ + myIntersector.SetAngularTolerance(theAngularTolerance); +} diff --git a/src/IntAna/IntAna_QuadQuadGeo.cxx b/src/IntAna/IntAna_QuadQuadGeo.cxx index 3ab50bcd85..24ede661e3 100644 --- a/src/IntAna/IntAna_QuadQuadGeo.cxx +++ b/src/IntAna/IntAna_QuadQuadGeo.cxx @@ -254,24 +254,53 @@ gp_Ax2 DirToAx2(const gp_Pnt& P,const gp_Dir& D) //purpose : Empty constructor //======================================================================= IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(void) - : done(Standard_False), - nbint(0), - typeres(IntAna_Empty), - pt1(0,0,0), - pt2(0,0,0), - pt3(0,0,0), - pt4(0,0,0), - param1(0), - param2(0), - param3(0), - param4(0), - param1bis(0), - param2bis(0), - myCommonGen(Standard_False), - myPChar(0,0,0) +: done(Standard_False), + nbint(0), + typeres(IntAna_Empty), + pt1(0,0,0), + pt2(0,0,0), + pt3(0,0,0), + pt4(0,0,0), + param1(0), + param2(0), + param3(0), + param4(0), + param1bis(0), + param2bis(0), + myCommonGen(Standard_False), + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); } + +//======================================================================= +//function : IntAna_QuadQuadGeo +//purpose : Constructor with angular tolerance +//======================================================================= +IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(Standard_Real theAngularTolerance, Standard_Boolean theUseAngularTolerance) +: done(Standard_False), + nbint(0), + typeres(IntAna_Empty), + pt1(0,0,0), + pt2(0,0,0), + pt3(0,0,0), + pt4(0,0,0), + param1(0), + param2(0), + param3(0), + param4(0), + param1bis(0), + param2bis(0), + myCommonGen(Standard_False), + myPChar(0,0,0), + myAngularTolerance(theAngularTolerance), + myUseAngularTolerance(theUseAngularTolerance) +{ + InitTolerances(); +} + //======================================================================= //function : InitTolerances //purpose : @@ -279,12 +308,20 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(void) void IntAna_QuadQuadGeo::InitTolerances() { myEPSILON_DISTANCE = 1.0e-14; - myEPSILON_ANGLE_CONE = Precision::Angular(); + if (myUseAngularTolerance) + { + myEPSILON_ANGLE_CONE = myAngularTolerance; + } + else + { + myEPSILON_ANGLE_CONE = Precision::Angular(); + } myEPSILON_MINI_CIRCLE_RADIUS = 0.01*Precision::Confusion(); myEPSILON_CYLINDER_DELTA_RADIUS = 1.0e-13; myEPSILON_CYLINDER_DELTA_DISTANCE= Precision::Confusion(); myEPSILON_AXES_PARA = Precision::Angular(); } + //======================================================================= //function : IntAna_QuadQuadGeo //purpose : Pln Pln @@ -307,7 +344,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Pln& P1, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(P1,P2,TolAng,Tol); @@ -652,7 +691,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo( const gp_Pln& P param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(P,Co,Tolang,Tol); @@ -868,7 +909,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Pln& P, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(P,S); @@ -937,7 +980,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Cylinder& Cyl1, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Cyl1,Cyl2,Tol); @@ -1222,7 +1267,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Cylinder& Cyl, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Cyl,Con,Tol); @@ -1278,7 +1325,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Cylinder& Cyl, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Cyl,Sph,Tol); @@ -1344,7 +1393,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Cylinder& Cyl, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Con1,Con2,Tol); @@ -1800,7 +1851,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Cylinder& Cyl, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Sph,Con,Tol); @@ -1912,7 +1965,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Cylinder& Cyl, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Sph1,Sph2,Tol); @@ -2026,7 +2081,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Pln& Pln, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Pln,Tor,Tol); @@ -2138,7 +2195,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Cylinder& Cyl, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Cyl,Tor,Tol); @@ -2221,7 +2280,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Cone& Con, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Con,Tor,Tol); @@ -2359,7 +2420,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Sphere& Sph, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Sph,Tor,Tol); @@ -2456,7 +2519,9 @@ IntAna_QuadQuadGeo::IntAna_QuadQuadGeo(const gp_Torus& Tor1, param1bis(0), param2bis(0), myCommonGen(Standard_False), - myPChar(0,0,0) + myPChar(0,0,0), + myAngularTolerance(0.0), + myUseAngularTolerance(Standard_False) { InitTolerances(); Perform(Tor1,Tor2,Tol); @@ -2692,6 +2757,7 @@ const gp_Pnt& IntAna_QuadQuadGeo::PChar() const { return myPChar; } + //======================================================================= //function : RefineDir //purpose : diff --git a/src/IntAna/IntAna_QuadQuadGeo.hxx b/src/IntAna/IntAna_QuadQuadGeo.hxx index 534a8ca5a6..55b4bfa1ac 100644 --- a/src/IntAna/IntAna_QuadQuadGeo.hxx +++ b/src/IntAna/IntAna_QuadQuadGeo.hxx @@ -61,6 +61,9 @@ public: //! Empty constructor. Standard_EXPORT IntAna_QuadQuadGeo(); + //! Constructor with angular tolerance + Standard_EXPORT IntAna_QuadQuadGeo(Standard_Real theAngularTolerance, Standard_Boolean theUseAngularTolerance); + //! Creates the intersection between two planes. //! TolAng is the angular tolerance used to determine //! if the planes are parallel. @@ -261,7 +264,8 @@ protected: Standard_Real myEPSILON_AXES_PARA; Standard_Boolean myCommonGen; gp_Pnt myPChar; - + Standard_Real myAngularTolerance; + Standard_Boolean myUseAngularTolerance; private: diff --git a/src/IntPatch/IntPatch_ImpImpIntersection.hxx b/src/IntPatch/IntPatch_ImpImpIntersection.hxx index 4954470cf9..c6c7c65d1c 100644 --- a/src/IntPatch/IntPatch_ImpImpIntersection.hxx +++ b/src/IntPatch/IntPatch_ImpImpIntersection.hxx @@ -108,8 +108,8 @@ public: //! An exception is raised if Index<=0 or Index>NbLine. const Handle(IntPatch_Line)& Line (const Standard_Integer Index) const; - - + //! Sets the angular tolerance + void SetAngularTolerance (Standard_Real theAngularTolerance); protected: @@ -128,7 +128,8 @@ private: IntPatch_SequenceOfPoint spnt; IntPatch_SequenceOfLine slin; IntPatch_TheSOnBounds solrst; - + Standard_Real myAngularTolerance; + Standard_Boolean myUseAngularTolerance; }; diff --git a/src/IntPatch/IntPatch_ImpImpIntersection.lxx b/src/IntPatch/IntPatch_ImpImpIntersection.lxx index b43026b681..5c2a5ec20f 100644 --- a/src/IntPatch/IntPatch_ImpImpIntersection.lxx +++ b/src/IntPatch/IntPatch_ImpImpIntersection.lxx @@ -71,3 +71,9 @@ inline const Handle(IntPatch_Line)& IntPatch_ImpImpIntersection::Line (const Sta if (!IsDone ()) { throw StdFail_NotDone(); } return slin(Index); } + +inline void IntPatch_ImpImpIntersection::SetAngularTolerance (Standard_Real theAngularTolerance) +{ + myAngularTolerance = theAngularTolerance; + myUseAngularTolerance = Standard_True; +} diff --git a/src/IntPatch/IntPatch_ImpImpIntersection_1.gxx b/src/IntPatch/IntPatch_ImpImpIntersection_1.gxx index 9ab3fd04c2..a27c86c1aa 100644 --- a/src/IntPatch/IntPatch_ImpImpIntersection_1.gxx +++ b/src/IntPatch/IntPatch_ImpImpIntersection_1.gxx @@ -125,7 +125,9 @@ static Standard_Boolean IntCoCo(const IntSurf_Quadric&, Standard_Boolean&, Standard_Boolean&, IntPatch_SequenceOfLine&, - IntPatch_SequenceOfPoint&); + IntPatch_SequenceOfPoint&, + Standard_Boolean theUseAngularTolerance = Standard_False, + Standard_Real theAngularTolerance = 0.0); //torus static Standard_Boolean IntPTo(const IntSurf_Quadric&, diff --git a/src/IntPatch/IntPatch_ImpImpIntersection_2.gxx b/src/IntPatch/IntPatch_ImpImpIntersection_2.gxx index d2f25895cd..ddf122884b 100644 --- a/src/IntPatch/IntPatch_ImpImpIntersection_2.gxx +++ b/src/IntPatch/IntPatch_ImpImpIntersection_2.gxx @@ -29,7 +29,8 @@ IntPatch_ImpImpIntersection::IntPatch_ImpImpIntersection (): myDone(IntStatus_Fail), empt(Standard_True), tgte(Standard_False), -oppo(Standard_False) +oppo(Standard_False), +myUseAngularTolerance(Standard_False) { } //======================================================================= @@ -231,7 +232,7 @@ void IntPatch_ImpImpIntersection::Perform(const Handle(Adaptor3d_Surface)& S1, } // case 33: { // Cone/Cone - if (!IntCoCo(quad1, quad2, TolTang, empt, SameSurf, multpoint, slin, spnt)) { + if (!IntCoCo(quad1, quad2, TolTang, empt, SameSurf, multpoint, slin, spnt, myUseAngularTolerance, myAngularTolerance)) { return; } bEmpty = empt; diff --git a/src/IntPatch/IntPatch_ImpImpIntersection_5.gxx b/src/IntPatch/IntPatch_ImpImpIntersection_5.gxx index bdbe126434..36a9e75321 100644 --- a/src/IntPatch/IntPatch_ImpImpIntersection_5.gxx +++ b/src/IntPatch/IntPatch_ImpImpIntersection_5.gxx @@ -27,7 +27,9 @@ Standard_Boolean IntCoCo(const IntSurf_Quadric& Quad1, Standard_Boolean& Same, Standard_Boolean& Multpoint, IntPatch_SequenceOfLine& slin, - IntPatch_SequenceOfPoint& spnt) + IntPatch_SequenceOfPoint& spnt, + Standard_Boolean theUseAngularTolerance, + Standard_Real theAngularTolerance) { Standard_Integer i, NbSol; @@ -38,7 +40,8 @@ Standard_Boolean IntCoCo(const IntSurf_Quadric& Quad1, gp_Cone Co1(Quad1.Cone()); gp_Cone Co2(Quad2.Cone()); // - IntAna_QuadQuadGeo inter(Co1,Co2,Tol); + IntAna_QuadQuadGeo inter(theAngularTolerance, theUseAngularTolerance); + inter.Perform(Co1,Co2,Tol); if (!inter.IsDone()) { return Standard_False; } diff --git a/src/IntPatch/IntPatch_Intersection.cxx b/src/IntPatch/IntPatch_Intersection.cxx index b06c8513d1..c243787514 100644 --- a/src/IntPatch/IntPatch_Intersection.cxx +++ b/src/IntPatch/IntPatch_Intersection.cxx @@ -53,7 +53,8 @@ IntPatch_Intersection::IntPatch_Intersection () myU1Start(0.0), myV1Start(0.0), myU2Start(0.0), - myV2Start(0.0) + myV2Start(0.0), + myUseAngularTolerance(Standard_False) { } @@ -76,7 +77,8 @@ IntPatch_Intersection::IntPatch_Intersection(const Handle(Adaptor3d_Surface)& S myU1Start(0.0), myV1Start(0.0), myU2Start(0.0), - myV2Start(0.0) + myV2Start(0.0), + myUseAngularTolerance(Standard_False) { if(myTolArc<1e-8) myTolArc=1e-8; if(myTolTang<1e-8) myTolTang=1e-8; @@ -102,7 +104,8 @@ IntPatch_Intersection::IntPatch_Intersection(const Handle(Adaptor3d_Surface)& S myU1Start(0.0), myV1Start(0.0), myU2Start(0.0), - myV2Start(0.0) + myV2Start(0.0), + myUseAngularTolerance(Standard_False) { Perform(S1,D1,TolArc,TolTang); } @@ -129,6 +132,12 @@ void IntPatch_Intersection::SetTolerances(const Standard_Real TolArc, if(myUVMaxStep>0.5) myUVMaxStep=0.5; } +void IntPatch_Intersection::SetAngularTolerance (Standard_Real theAngularTolerance) +{ + myAngularTolerance = theAngularTolerance; + myUseAngularTolerance = Standard_True; +} + //====================================================================== // function: Perform //====================================================================== @@ -1354,8 +1363,13 @@ void IntPatch_Intersection::GeomGeomPerfom(const Handle(Adaptor3d_Surface)& theS const GeomAbs_SurfaceType theTyps2, const Standard_Boolean theIsReqToKeepRLine) { - IntPatch_ImpImpIntersection interii(theS1,theD1,theS2,theD2, - myTolArc,myTolTang, theIsReqToKeepRLine); + IntPatch_ImpImpIntersection interii; + + if (myUseAngularTolerance) + { + interii.SetAngularTolerance(myAngularTolerance); + } + interii.Perform(theS1, theD1, theS2, theD2, myTolArc, myTolTang, theIsReqToKeepRLine); if (!interii.IsDone()) { diff --git a/src/IntPatch/IntPatch_Intersection.hxx b/src/IntPatch/IntPatch_Intersection.hxx index aeb80faf7b..5a59f0e295 100644 --- a/src/IntPatch/IntPatch_Intersection.hxx +++ b/src/IntPatch/IntPatch_Intersection.hxx @@ -62,6 +62,8 @@ public: //! 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); + Standard_EXPORT void SetAngularTolerance (Standard_Real theAngularTolerance); + //! Flag theIsReqToKeepRLine has been entered only for //! compatibility with TopOpeBRep package. It shall be deleted //! after deleting TopOpeBRep. @@ -197,7 +199,8 @@ private: Standard_Real myV1Start; Standard_Real myU2Start; Standard_Real myV2Start; - + Standard_Real myAngularTolerance; + Standard_Boolean myUseAngularTolerance; };