// 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. // modified : pmn 11/04/97 : mis dans GeomliteTest #include #include #include #include #include #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 (i = 2; i<=Nb; i++) { dout.Select(id,XX,YY,b); Points(i) = gp_Pnt2d( ((Standard_Real)XX)/zoom, ((Standard_Real)YY)/zoom ); mark = new Draw_Marker2D( Points(i), 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 : extrema //purpose : //======================================================================= 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; GC1 = DrawTrSurf::GetCurve2d(a[1]); if ( GC1.IsNull()) return 1; U1f = GC1->FirstParameter(); U1l = GC1->LastParameter(); GC2 = DrawTrSurf::GetCurve2d(a[2]); if ( GC2.IsNull()) return 1; U2f = GC2->FirstParameter(); U2l = GC2->LastParameter(); char name[100]; Geom2dAPI_ExtremaCurveCurve Ex(GC1,GC2,U1f,U1l,U2f,U2l); Standard_Boolean isInfinitySolutions = Ex.Extrema().IsParallel(); const Standard_Integer aNExtr = Ex.NbExtrema(); if (aNExtr == 0 || isInfinitySolutions) { // Infinity solutions flag may be set with 0 number of // solutions in analytic extrema Curve/Curve. if (isInfinitySolutions) di << "Infinite number of extremas, distance = " << Ex.LowerDistance() << "\n"; else di << "No solutions!\n"; } for (Standard_Integer i = 1; i <= aNExtr; i++) { gp_Pnt2d P1,P2; Ex.Points(i,P1,P2); di << "dist " << i << ": " << Ex.Distance(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; 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 DrawTrSurf::Set(temp, CT); di << name << "\n"; } } return 0; } //======================================================================= //function : intersect //purpose : //======================================================================= static Standard_Integer intersect(Draw_Interpretor& di, Standard_Integer n, const char** a) { if( n < 2) { cout<< "2dintersect curve curve [Tol]"<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); IntAna2d_AnaIntersection Intersector(aCir1->Circ2d(), aCir2->Circ2d()); Standard_Integer i; for ( i = 1; i <= Intersector.NbPoints(); i++) { gp_Pnt2d P = Intersector.Point(i).Value(); di<<"Intersection point "<