+#ifdef ELLIPSOLID_WORKAROUND
+ // --------------------------------------------------------------------------
+ /*!
+ * \brief struct temporary replacing IntCurvesFace_Intersector until
+ * OCCT bug 0022809 is fixed
+ * http://tracker.dev.opencascade.org/view.php?id=22809
+ */
+ struct TMP_IntCurvesFace_Intersector
+ {
+ BRepAdaptor_Surface _surf;
+ double _tol;
+ BRepIntCurveSurface_Inter _intcs;
+ vector<IntCurveSurface_IntersectionPoint> _points;
+ BRepTopAdaptor_TopolTool _clsf;
+
+ TMP_IntCurvesFace_Intersector(const TopoDS_Face& face, const double tol)
+ :_surf( face ), _tol( tol ), _clsf( new BRepAdaptor_HSurface(_surf) ) {}
+ Bnd_Box Bounding() const { Bnd_Box b; BRepBndLib::Add (_surf.Face(), b); return b; }
+ void Perform( const gp_Lin& line, const double w0, const double w1 )
+ {
+ _points.clear();
+ for ( _intcs.Init( _surf.Face(), line, _tol ); _intcs.More(); _intcs.Next() )
+ if ( w0 <= _intcs.W() && _intcs.W() <= w1 )
+ _points.push_back( _intcs.Point() );
+ }
+ bool IsDone() const { return true; }
+ int NbPnt() const { return _points.size(); }
+ IntCurveSurface_TransitionOnCurve Transition( const int i ) const { return _points[ i-1 ].Transition(); }
+ double WParameter( const int i ) const { return _points[ i-1 ].W(); }
+ TopAbs_State ClassifyUVPoint(const gp_Pnt2d& p) { return _clsf.Classify( p, _tol ); }
+ };
+#define __IntCurvesFace_Intersector TMP_IntCurvesFace_Intersector
+#else
+#define __IntCurvesFace_Intersector IntCurvesFace_Intersector
+#endif