// Created on: 1995-01-11 // Created by: Remi LEQUETTE // Copyright (c) 1995-1999 Matra Datavision // Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef _WIN32 Standard_IMPORT Draw_Viewer dout; #endif //======================================================================= //function : proj //purpose : //======================================================================= 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]; Handle(Geom2d_Curve) GC = DrawTrSurf::GetCurve2d(a[1]); if (GC.IsNull()) return 1; Geom2dAPI_ProjectPointOnCurve proj(P,GC,GC->FirstParameter(), GC->LastParameter()); for ( Standard_Integer i = 1; i <= proj.NbPoints(); i++) { gp_Pnt2d P1 = proj.Point(i); Handle(Geom2d_Line) L = new Geom2d_Line(P,gp_Vec2d(P,P1)); Handle(Geom2d_TrimmedCurve) CT = new Geom2d_TrimmedCurve(L, 0., P.Distance(P1)); Sprintf(name,"%s%d","ext_",i); char* temp = name; // portage WNT DrawTrSurf::Set(temp, CT); di << name << " "; } return 0; } //======================================================================= //function : appro //purpose : //======================================================================= static Standard_Integer appro(Draw_Interpretor& di, Standard_Integer n, const char** a) { // Approximation et interpolation 2d // 2dappro // - affiche la tolerance // 2dappro tol // - change la tolerance // 2dappro result nbpoint // - saisie interactive // 2dappro result nbpoint curve // - calcule des points sur la courbe // 2dappro result nbpoint x1 y1 x2 y2 .. // - tableau de points // 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) 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; TColgp_Array1OfPnt2d Points(1, Nb); TColStd_Array1OfReal YValues(1,Nb); Standard_Real X0=0,DX=0; Handle(Draw_Marker2D) mark; if (n == 3) { // saisie interactive Standard_Integer id,XX,YY,b; dout.Select(id,XX,YY,b); Standard_Real zoom = dout.Zoom(id); Points(1) = gp_Pnt2d( ((Standard_Real)XX)/zoom, ((Standard_Real)YY)/zoom ); mark = new Draw_Marker2D( Points(1), Draw_X, Draw_vert); dout << mark; for (Standard_Integer j = 2; j<=Nb; j++) { dout.Select(id,XX,YY,b); Points(j) = gp_Pnt2d( ((Standard_Real)XX)/zoom, ((Standard_Real)YY)/zoom ); mark = new Draw_Marker2D( Points(j), Draw_X, Draw_vert); dout << mark; } } else { if ( n == 4) { // points sur courbe Handle(Geom2d_Curve) GC = DrawTrSurf::GetCurve2d(a[3]); if ( GC.IsNull()) return 1; Standard_Real U, U1, U2; U1 = GC->FirstParameter(); U2 = GC->LastParameter(); Standard_Real Delta = ( U2 - U1) / (Nb-1); for ( i = 1 ; i <= Nb; i++) { U = U1 + (i-1) * Delta; Points(i) = GC->Value(U); } } else { // test points ou ordonnees hasPoints = Standard_False; Standard_Integer nc = n - 3; if (nc == 2 * Nb) { // points nc = 3; for (i = 1; i <= Nb; i++) { Points(i).SetCoord(Draw::Atof(a[nc]),Draw::Atof(a[nc+1])); nc += 2; } } else if (nc - 2 == Nb) { // YValues nc = 5; X0 = Draw::Atof(a[3]); DX = Draw::Atof(a[4]); for (i = 1; i <= Nb; i++) { YValues(i) = Draw::Atof(a[nc]); Points(i).SetCoord(X0+(i-1)*DX,YValues(i)); nc++; } } else return 1; } // display the points for ( i = 1 ; i <= Nb; i++) { mark = new Draw_Marker2D( Points(i), Draw_X, Draw_vert); dout << mark; } } dout.Flush(); Standard_Integer Dmin = 3; Standard_Integer Dmax = 8; Handle(Geom2d_BSplineCurve) TheCurve; if (hasPoints) TheCurve = Geom2dAPI_PointsToBSpline(Points,Dmin,Dmax,GeomAbs_C2,Tol2d); else TheCurve = Geom2dAPI_PointsToBSpline(YValues,X0,DX,Dmin,Dmax,GeomAbs_C2,Tol2d); DrawTrSurf::Set(a[1], TheCurve); di << a[1]; return 0; } //======================================================================= //function : intersect //purpose : //======================================================================= static Standard_Integer intersect(Draw_Interpretor& /*di*/, Standard_Integer n, const char** a) { if( n < 2) return 1; Handle(Geom2d_Curve) C1 = DrawTrSurf::GetCurve2d(a[1]); if ( C1.IsNull()) return 1; Standard_Real Tol = 0.001; Geom2dAPI_InterCurveCurve Intersector; Handle(Geom2d_Curve) C2; if ( n == 3) { C2 = DrawTrSurf::GetCurve2d(a[2]); if ( C2.IsNull()) return 1; Intersector.Init(C1,C2,Tol); } else { Intersector.Init(C1, Tol); } Standard_Integer i; for ( i = 1; i <= Intersector.NbPoints(); i++) { gp_Pnt2d P = Intersector.Point(i); Handle(Draw_Marker2D) mark = new Draw_Marker2D( P, Draw_X, Draw_vert); dout << mark; } dout.Flush(); Handle(Geom2d_Curve) S1,S2; Handle(DrawTrSurf_Curve2d) CD; if ( n == 3) { for ( i = 1; i <= Intersector.NbSegments(); i++) { Intersector.Segment(i,S1,S2); CD = new DrawTrSurf_Curve2d(S1, Draw_bleu, 30); dout << CD; CD = new DrawTrSurf_Curve2d(S2, Draw_violet, 30); dout << CD; } } dout.Flush(); return 0; } void GeometryTest::API2dCommands(Draw_Interpretor& theCommands) { static Standard_Boolean done = Standard_False; if (done) return; const char *g; done = Standard_True; g = "GEOMETRY curves and surfaces analysis"; theCommands.Add("2dproj", "proj curve x y",__FILE__, proj,g); g = "GEOMETRY approximations"; theCommands.Add("2dapprox", "2dapprox result nbpoint [curve] [[x] y [x] y...]",__FILE__, appro,g); theCommands.Add("2dinterpole", "2dinterpole result nbpoint [curve] [[x] y [x] y ...]",__FILE__, appro,g); g = "GEOMETRY curves and surfaces analysis"; g = "GEOMETRY intersections"; theCommands.Add("2dintersect", "intersect curve curve",__FILE__, intersect,g); }