#include <BRep_Tool.hxx>
#include <BRepTools.hxx>
#include <Geom_Curve.hxx>
-#include <BRepClass_FaceClassifier.hxx>
+#include <BRepTopAdaptor_FClass2d.hxx>
#include <gp_Pnt2d.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepAdaptor_HSurface.hxx>
else
{
// Exploration of points and classification
- BRepClass_FaceClassifier classifier;
- const Standard_Real Tol = BRep_Tool::Tolerance(F2);
+ const Standard_Real Tol = BRep_Tool::Tolerance (F2);
+ BRepTopAdaptor_FClass2d classifier (F2, Tol);
+
+ // If the underlying surface of the face is periodic
+ // Extrema should return the point within the period,
+ // so there is no point to adjust it in classifier.
+ Standard_Boolean isAdjustPeriodic = Standard_False;
+
Extrema_POnCurv P1;
Extrema_POnSurf P2;
myExtCS.Points(i, P1, P2);
P2.Parameter(U1, U2);
const gp_Pnt2d Puv(U1, U2);
- classifier.Perform(F2, Puv, Tol);
- const TopAbs_State state = classifier.State();
+ const TopAbs_State state = classifier.Perform (Puv, isAdjustPeriodic);
if (state == TopAbs_ON || state == TopAbs_IN)
{
mySqDist.Append(myExtCS.SquareDistance(i));
return 0;
}
+#include <BRepExtrema_ExtCF.hxx>
+//=======================================================================
+//function : OCC30880
+//purpose :
+//=======================================================================
+static Standard_Integer OCC30880 (Draw_Interpretor& theDI, Standard_Integer theArgc, const char** theArgv)
+{
+ if (theArgc != 3)
+ {
+ theDI.PrintHelp (theArgv[0]);
+ return 1;
+ }
+
+ TopoDS_Shape anEdge = DBRep::Get (theArgv[1]);
+ if (anEdge.IsNull() || anEdge.ShapeType() != TopAbs_EDGE)
+ {
+ theDI << theArgv[1] << " is not an edge.\n";
+ return 1;
+ }
+
+ TopoDS_Shape aFace = DBRep::Get (theArgv[2]);
+ if (aFace.IsNull() || aFace.ShapeType() != TopAbs_FACE)
+ {
+ theDI << theArgv[2] << " is not a face.\n";
+ return 1;
+ }
+
+ BRepExtrema_ExtCF anExtCF (TopoDS::Edge (anEdge),
+ TopoDS::Face (aFace));
+ if (!anExtCF.IsDone())
+ {
+ theDI << "Not done\n";
+ return 0;
+ }
+
+ if (!anExtCF.NbExt())
+ {
+ theDI << "No solutions\n";
+ return 0;
+ }
+
+ if (anExtCF.IsParallel())
+ {
+ theDI << "Infinite number of solutions, distance - " << Sqrt (anExtCF.SquareDistance (1)) << "\n";
+ return 0;
+ }
+
+ Standard_Real aDistMin = RealLast();
+ Standard_Integer aSolMin = -1;
+ // Look for the minimal solution
+ for (int i = 1; i <= anExtCF.NbExt(); ++i)
+ {
+ Standard_Real aDist = anExtCF.SquareDistance (i);
+ if (aDist < aDistMin)
+ {
+ aDistMin = aDist;
+ aSolMin = i;
+ }
+ }
+
+ if (aSolMin < 0)
+ {
+ theDI << "Failed\n";
+ return 0;
+ }
+
+ theDI << "Minimal distance - " << Sqrt (aDistMin) << "\n";
+ return 0;
+}
+
#include <BRepPrimAPI_MakeBox.hxx>
static Standard_Integer OCC30704(Draw_Interpretor& di, Standard_Integer, const char**)
{
"Usage: OCC30869 wire",
__FILE__, OCC30869, group);
+ theCommands.Add ("OCC30880", "Looks for extrema between edge and face.\n"
+ "Usage: OCC30880 edge face",
+ __FILE__, OCC30880, group);
+
theCommands.Add("OCC30704", "OCC30704", __FILE__, OCC30704, group);
theCommands.Add("OCC30704_1", "OCC30704_1", __FILE__, OCC30704_1, group);