#include <GeomliteTest.hxx>
#include <Geom2d_BSplineCurve.hxx>
-#include <Draw.hxx>
#include <Draw_Interpretor.hxx>
#include <DrawTrSurf.hxx>
#include <Draw_Appli.hxx>
#include <Geom2dAPI_InterCurveCurve.hxx>
#include <Geom2d_Line.hxx>
#include <Geom2d_TrimmedCurve.hxx>
+#include <GeomLib_Tool.hxx>
#include <TColgp_Array1OfPnt2d.hxx>
-#include <gp_Pnt.hxx>
#include <Draw_Marker2D.hxx>
#include <Draw_Color.hxx>
#include <Draw_MarkerShape.hxx>
#include <IntAna2d_IntPoint.hxx>
#include <IntAna2d_Conic.hxx>
#include <IntRes2d_IntersectionPoint.hxx>
-#include <Geom2dAdaptor_GHCurve.hxx>
-#include <memory>
+#include <Geom2dAdaptor_Curve.hxx>
+#include <Message.hxx>
+#include <NCollection_Shared.hxx>
+#include <memory>
#include <stdio.h>
#ifdef _WIN32
Standard_IMPORT Draw_Viewer dout;
static Standard_Integer proj (Draw_Interpretor& di, Standard_Integer n, const char** a)
{
- if ( n < 4) return 1;
-
- gp_Pnt2d P(Draw::Atof(a[2]),Draw::Atof(a[3]));
-
- char name[100];
+ if (n != 4)
+ {
+ di << "Syntax error: wrong number of arguments";
+ return 1;
+ }
Handle(Geom2d_Curve) GC = DrawTrSurf::GetCurve2d(a[1]);
-
if (GC.IsNull())
+ {
+ di << "Syntax error: '" << a[1] << "' is NULL";
return 1;
+ }
- Geom2dAPI_ProjectPointOnCurve proj(P,GC,GC->FirstParameter(),
- GC->LastParameter());
-
+ const gp_Pnt2d P (Draw::Atof (a[2]), Draw::Atof (a[3]));
+ Geom2dAPI_ProjectPointOnCurve proj(P,GC,GC->FirstParameter(), GC->LastParameter());
for (Standard_Integer i = 1; i <= proj.NbPoints(); i++)
{
gp_Pnt2d aP1 = proj.Point(i);
const Standard_Real aDist = P.Distance(aP1);
- Sprintf(name, "%s%d", "ext_", i);
-
+ const TCollection_AsciiString aName = TCollection_AsciiString ("ext_") + i;
if (aDist > Precision::PConfusion())
{
Handle(Geom2d_Line) L = new Geom2d_Line(P, gp_Dir2d(aP1.XY() - P.XY()));
Handle(Geom2d_TrimmedCurve) CT = new Geom2d_TrimmedCurve(L, 0., aDist);
- DrawTrSurf::Set(name, CT);
+ DrawTrSurf::Set (aName.ToCString(), CT);
}
else
{
- DrawTrSurf::Set(name, aP1);
+ DrawTrSurf::Set (aName.ToCString(), aP1);
}
- di << name << " ";
+ di << aName << " ";
}
return 0;
// 2dappro result nbpoint x1 dx y1 y2 ..
// - tableau de points (x1,y1) (x1+dx,y2) ... avec x = t
-
static Standard_Real Tol2d = 1.e-6;
-
- if (n < 3) {
- if (n == 2)
+ if (n < 3)
+ {
+ if (n == 2)
+ {
Tol2d = Draw::Atof(a[1]);
+ }
di << "Tolerance for 2d approx : "<< Tol2d << "\n";
return 0;
}
-
Standard_Integer i, Nb = Draw::Atoi(a[2]);
Standard_Boolean hasPoints = Standard_True;
}
TheCurve = anInterpol.Curve();
}
- else
+ else
{
Geom2dAPI_PointsToBSpline anApprox (Points, Dmin, Dmax, GeomAbs_C2, Tol2d);
if (!anApprox.IsDone())
DrawTrSurf::Set(a[1], TheCurve);
di << a[1];
-
return 0;
-
}
//=======================================================================
static Standard_Integer extrema(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
- if ( n<3) return 1;
-
- Handle(Geom2d_Curve) GC1, GC2;
-
- Standard_Real U1f,U1l,U2f,U2l;
+ if (n != 3)
+ {
+ di << "Syntax error: wrong number of arguments";
+ return 1;
+ }
- GC1 = DrawTrSurf::GetCurve2d(a[1]);
+ Handle(Geom2d_Curve) GC1 = DrawTrSurf::GetCurve2d (a[1]);
+ Handle(Geom2d_Curve) GC2 = DrawTrSurf::GetCurve2d (a[2]);
if ( GC1.IsNull())
+ {
+ di << "Syntax error: '" << a[1] << "' is NULL";
return 1;
- U1f = GC1->FirstParameter();
- U1l = GC1->LastParameter();
-
- GC2 = DrawTrSurf::GetCurve2d(a[2]);
+ }
if ( GC2.IsNull())
+ {
+ di << "Syntax error: '" << a[2] << "' is NULL";
return 1;
- U2f = GC2->FirstParameter();
- U2l = GC2->LastParameter();
+ }
- char name[100];
+ const Standard_Real U1f = GC1->FirstParameter();
+ const Standard_Real U1l = GC1->LastParameter();
+ const Standard_Real U2f = GC2->FirstParameter();
+ const Standard_Real U2l = GC2->LastParameter();
Geom2dAPI_ExtremaCurveCurve Ex(GC1,GC2,U1f,U1l,U2f,U2l);
Standard_Boolean isInfinitySolutions = Ex.Extrema().IsParallel();
gp_Pnt2d P1,P2;
Ex.Points(i,P1,P2);
di << "dist " << i << ": " << Ex.Distance(i) << " ";
+ const TCollection_AsciiString aName = TCollection_AsciiString("ext_") + i;
if (Ex.Distance(i) <= Precision::PConfusion())
{
Handle(Draw_Marker2D) mark = new Draw_Marker2D( P1, Draw_X, Draw_vert);
dout << mark;
dout.Flush();
- Sprintf(name,"%s%d","ext_",i);
- char* temp = name;
+ const char* temp = aName.ToCString();
DrawTrSurf::Set(temp, P1);
- di << name << "\n";
}
else
{
Handle(Geom2d_Line) L = new Geom2d_Line(P1,gp_Vec2d(P1,P2));
Handle(Geom2d_TrimmedCurve) CT = new Geom2d_TrimmedCurve(L, 0., P1.Distance(P2));
- Sprintf(name,"%s%d","ext_",i);
- char* temp = name; // portage WNT
+ const char* temp = aName.ToCString();
DrawTrSurf::Set(temp, CT);
- di << name << "\n";
}
+ di << aName << "\n";
}
return 0;
//=======================================================================
static Standard_Integer intersect(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
- if (n < 2)
- {
- di.PrintHelp(a[0]);
- return 1;
- }
-
- Handle(Geom2d_Curve) C1 = DrawTrSurf::GetCurve2d(a[1]);
- if (C1.IsNull())
- {
- di << "Curve " << a[1] << " is null\n";
- return 1;
- }
-
- Handle(Geom2d_Curve) C2;
+ Handle(Geom2d_Curve) C1, C2;
Standard_Real Tol = 0.001;
Standard_Boolean bPrintState = Standard_False;
// Retrieve other parameters if any
- for (Standard_Integer i = 2; i < n; ++i)
+ for (Standard_Integer i = 1; i < n; ++i)
{
if (!strcmp(a[i], "-tol"))
{
{
bPrintState = Standard_True;
}
- else
+ else if (C1.IsNull())
+ {
+ C1 = DrawTrSurf::GetCurve2d (a[i]);
+ if (C1.IsNull())
+ {
+ di << "Syntax error: curve '" << a[i] << "' is null";
+ return 1;
+ }
+ }
+ else if (C2.IsNull())
{
C2 = DrawTrSurf::GetCurve2d(a[i]);
if (C2.IsNull())
{
- di << "Curve " << a[i] << " is null\n";
+ di << "Syntax error: curve '" << a[i] << "' is null";
return 1;
}
}
+ else
+ {
+ di << "Syntax error at '" << a[i] << "'";
+ return 1;
+ }
+ }
+ if (C1.IsNull())
+ {
+ di << "Syntax error: wrong number of arguments";
+ return 1;
}
Geom2dAPI_InterCurveCurve Intersector;
-
if (!C2.IsNull())
+ {
// Curves intersection
Intersector.Init(C1, C2, Tol);
+ }
else
+ {
// Self-intersection of the curve
Intersector.Init(C1, Tol);
+ }
const Geom2dInt_GInter& anIntTool = Intersector.Intersector();
if (!anIntTool.IsDone())
}
if (anIntTool.IsEmpty())
+ {
return 0;
+ }
Standard_Integer aNbPoints = Intersector.NbPoints();
for (Standard_Integer i = 1; i <= aNbPoints; i++)
}
dout.Flush();
-
return 0;
}
static Standard_Integer intersect_ana(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
- if (n < 2)
+ if (n != 3)
{
- cout << "2dintana circle circle " << endl;
+ di << "Syntax error: wrong number of arguments";
return 1;
}
Handle(Geom2d_Curve) C1 = DrawTrSurf::GetCurve2d(a[1]);
- if (C1.IsNull() && !C1->IsKind(STANDARD_TYPE(Geom2d_Circle)))
- return 1;
-
Handle(Geom2d_Curve) C2 = DrawTrSurf::GetCurve2d(a[2]);
- if (C2.IsNull() && !C2->IsKind(STANDARD_TYPE(Geom2d_Circle)))
- return 1;
-
Handle(Geom2d_Circle) aCir1 = Handle(Geom2d_Circle)::DownCast(C1);
Handle(Geom2d_Circle) aCir2 = Handle(Geom2d_Circle)::DownCast(C2);
+ if (aCir1.IsNull() || aCir2.IsNull())
+ {
+ di << "Syntax error: '" << a[aCir1.IsNull() ? 1 : 2] << "' is not a circle";
+ return 1;
+ }
IntAna2d_AnaIntersection Intersector(aCir1->Circ2d(), aCir2->Circ2d());
-
- Standard_Integer i;
-
- for (i = 1; i <= Intersector.NbPoints(); i++) {
+ for (Standard_Integer i = 1; i <= Intersector.NbPoints(); i++)
+ {
gp_Pnt2d P = Intersector.Point(i).Value();
di << "Intersection point " << i << " : " << P.X() << " " << P.Y() << "\n";
di << "parameter on the fist: " << Intersector.Point(i).ParamOnFirst();
dout << mark;
}
dout.Flush();
-
return 0;
}
static Standard_Integer intconcon(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
- if( n < 2)
+ if (n != 3)
{
- cout<< "intconcon con1 con2 "<<endl;
+ di << "Syntax error: wrong number of arguments";
return 1;
}
Handle(Geom2d_Curve) C1 = DrawTrSurf::GetCurve2d(a[1]);
if (C1.IsNull())
{
- cout << a[1] << " is Null " << endl;
+ di << "Syntax error: '" << a[1] << "' is Null";
return 1;
}
Handle(Geom2d_Curve) C2 = DrawTrSurf::GetCurve2d(a[2]);
if (C2.IsNull())
{
- cout << a[2] << " is Null " << endl;
+ di << "Syntax error: '" << a[2] << "' is Null";
return 1;
}
Geom2dAdaptor_Curve AC1(C1), AC2(C2);
GeomAbs_CurveType T1 = AC1.GetType(), T2 = AC2.GetType();
-#if (defined(_MSC_VER) && (_MSC_VER < 1600))
- std::auto_ptr<IntAna2d_Conic> pCon;
-#else
- std::unique_ptr<IntAna2d_Conic> pCon;
-#endif
+ Handle(NCollection_Shared<IntAna2d_Conic>) pCon;
switch (T2)
{
- case GeomAbs_Line:
- {
- pCon.reset(new IntAna2d_Conic(AC2.Line()));
- break;
- }
- case GeomAbs_Circle:
- {
- pCon.reset(new IntAna2d_Conic(AC2.Circle()));
- break;
- }
- case GeomAbs_Ellipse:
- {
- pCon.reset(new IntAna2d_Conic(AC2.Ellipse()));
- break;
- }
- case GeomAbs_Hyperbola:
- {
- pCon.reset(new IntAna2d_Conic(AC2.Hyperbola()));
- break;
- }
- case GeomAbs_Parabola:
- {
- pCon.reset(new IntAna2d_Conic(AC2.Parabola()));
- break;
- }
- default:
- cout << a[2] << " is not conic " << endl;
- return 1;
+ case GeomAbs_Line:
+ {
+ pCon.reset (new NCollection_Shared<IntAna2d_Conic>(AC2.Line()));
+ break;
+ }
+ case GeomAbs_Circle:
+ {
+ pCon.reset (new NCollection_Shared<IntAna2d_Conic>(AC2.Circle()));
+ break;
+ }
+ case GeomAbs_Ellipse:
+ {
+ pCon.reset (new NCollection_Shared<IntAna2d_Conic>(AC2.Ellipse()));
+ break;
+ }
+ case GeomAbs_Hyperbola:
+ {
+ pCon.reset (new NCollection_Shared<IntAna2d_Conic>(AC2.Hyperbola()));
+ break;
+ }
+ case GeomAbs_Parabola:
+ {
+ pCon.reset (new NCollection_Shared<IntAna2d_Conic>(AC2.Parabola()));
+ break;
+ }
+ default:
+ {
+ di << "Syntax error: '" << a[2] << "' is not conic";
+ return 1;
+ }
}
IntAna2d_AnaIntersection Intersector;
Intersector.Perform(AC1.Parabola(), *pCon);
break;
default:
- cout << a[1] << " is not conic " << endl;
+ di << "Syntax error: '" << a[1] << "' is not conic";
return 1;
}
- Standard_Integer i;
- for ( i = 1; i <= Intersector.NbPoints(); i++) {
+ for (Standard_Integer i = 1; i <= Intersector.NbPoints(); i++)
+ {
gp_Pnt2d P = Intersector.Point(i).Value();
di<<"Intersection point "<<i<<" : "<<P.X()<<" "<<P.Y()<<"\n";
di << "parameter on the fist: " << Intersector.Point(i).ParamOnFirst();
dout << mark;
}
dout.Flush();
-
return 0;
}
+//=======================================================================
+//function : deviation
+//purpose :
+//=======================================================================
+static Standard_Integer deviation(Draw_Interpretor& theDI, Standard_Integer theNArg, const char** theArgv)
+{
+ if (theNArg < 3)
+ {
+ theDI << "Syntax error: wrong number of arguments";
+ return 1;
+ }
+
+ const Handle(Geom2d_Curve) aC = DrawTrSurf::GetCurve2d(theArgv[2]);
+
+ if (aC.IsNull())
+ {
+ theDI << "Error: " << theArgv[2] << " is not a 2D-curve.\n";
+ return 1;
+ }
+
+ Geom2dAdaptor_Curve anAC(aC);
+
+ Standard_Integer aNbInterv = 2;
+ Standard_Real aU0 = RealLast();
+ Standard_Integer aNbApprox = 10;
+ Standard_Integer aNbExact = 100;
+ Standard_Boolean anIsApproxOnly = Standard_False;
+
+
+ for (Standard_Integer aCurrArg = 3; aCurrArg < theNArg; aCurrArg++)
+ {
+ TCollection_AsciiString anArg(theArgv[aCurrArg]);
+ anArg.LowerCase();
+ if (anArg == "-i")
+ {
+ aU0 = Draw::Atof(theArgv[++aCurrArg]);
+ }
+ else if (anArg == "-d")
+ {
+ aNbInterv = Draw::Atoi(theArgv[++aCurrArg]);
+ }
+ else if (anArg == "-napprox")
+ {
+ aNbApprox = Draw::Atoi(theArgv[++aCurrArg]);
+ }
+ else if (anArg == "-nexact")
+ {
+ aNbExact = Draw::Atoi(theArgv[++aCurrArg]);
+ }
+ else if (anArg == "-approxonly")
+ {
+ anIsApproxOnly = Standard_True;
+ ++aCurrArg;
+ }
+ else
+ {
+ theDI << "Error: Wrong option " << theArgv[aCurrArg] << "\n";
+ return 1;
+ }
+ }
+
+ const Standard_Real aU1 = anAC.FirstParameter();
+ const Standard_Real aU2 = anAC.LastParameter();
+
+ Standard_Real aRetCurvParam = aU0;
+ gp_Pnt2d aPtOnCurv;
+ gp_Vec2d aRetVec;
+ gp_Lin2d aLinSegm;
+
+ Standard_Real aDefl = RealLast();
+
+ if (aU0 == RealLast() || anIsApproxOnly)
+ {
+ aDefl = GeomLib_Tool::ComputeDeviation(anAC, aU1, aU2,
+ aNbInterv, aNbApprox, &aU0);
+
+ if (aDefl < 0.0)
+ {
+ theDI << "Error: Cannot compute deviation on interval.\n";
+ return 0;
+ }
+ }
+ if (!anIsApproxOnly)
+ {
+ aDefl = GeomLib_Tool::ComputeDeviation(anAC, aU1, aU2, aU0, aNbExact,
+ &aRetCurvParam, &aPtOnCurv,
+ &aRetVec, &aLinSegm);
+ }
+ if (aDefl < 0.0)
+ {
+ theDI << "Error: Cannot compute a deviation!\n";
+ return 0;
+ }
+ theDI << "Computed value is: " << aDefl << "\n";
+ TCollection_AsciiString anArgString = theArgv[1];
+ TCollection_AsciiString aPntString = anArgString + "_pnt";
+ DrawTrSurf::Set(aPntString.ToCString(), aPtOnCurv);
+ theDI << "From point " << aPntString << " (with parameter " << aRetCurvParam << ") to ";
+
+ Handle(Geom2d_Curve) aLine = new Geom2d_Line(aLinSegm);
+ TCollection_AsciiString aLinString = anArgString + "_lin";
+ DrawTrSurf::Set(aLinString.ToCString(), aLine);
+ theDI << "the line " << aLinString << ".\n";
+
+ aLine = new Geom2d_Line(aPtOnCurv, aRetVec);
+ aLine = new Geom2d_TrimmedCurve(aLine, 0.0, aDefl);
+ TCollection_AsciiString aNormString = anArgString + "_norm";
+ DrawTrSurf::Set(aNormString.ToCString(), aLine);
+ theDI << "The deflection is measured along the line " << aNormString << ".\n";
+ return 0;
+}
void GeomliteTest::API2dCommands(Draw_Interpretor& theCommands)
{
" -state - allows printing the intersection state for each point.",
__FILE__, intersect, g);
- theCommands.Add("2dintanalytical", "intersect circle1 and circle2 using IntAna",__FILE__,
- intersect_ana,g);
- theCommands.Add("intconcon", "intersect conic curve1 and conic curve2 using IntAna", __FILE__,
- intconcon, g);
+ theCommands.Add("2dintanalytical", "2dintanalytical circle1 circle2"
+ "Intersect circle1 and circle2 using IntAna2d_AnaIntersection.",
+ __FILE__, intersect_ana, g);
+ theCommands.Add("intconcon", "intconcon curve1 curve2"
+ "Intersect conic curve1 and conic curve2 using IntAna2d_AnaIntersection",
+ __FILE__, intconcon, g);
+
+ theCommands.Add("2ddeviation", "2ddeviation result curve [-i U0] [-d N] [-Napprox N] [-Nexact N] [-approxOnly]\n"
+ "-i - sets an initial parameter for computation by iterative method;\n"
+ "-d - sets number of sub-intervals for searching. Default value is 2.\n"
+ "-Napprox - sets number of iteration for approx deviation computing,\n"
+ " defauilt value is 10"
+ "-Nexact - sets number of iteration for exact deviation computing,\n"
+ " defauilt value is 100"
+ "-approxOnly - to find deviation with approx method only,\n"
+ " the exact method is used if this parameter is not specified",
+ __FILE__, deviation, g);
+
}