1 // File: DrawTrSurf_3.cxx
2 // Created: Thu Aug 12 19:33:52 1993
3 // Author: Bruno DUMORTIER
5 // JPI : Commande smooth transferee dans GeomliteTest
6 // PMN : Ajout de la commande smooth
7 // JCT : Correction d'un trap dans la commande gcarc
9 #include <Standard_Stream.hxx>
11 #include <GeometryTest.hxx>
12 #include <DrawTrSurf.hxx>
14 #include <Draw_Appli.hxx>
15 #include <Draw_Interpretor.hxx>
16 #include <Geom2dGcc_Circ2d2TanRad.hxx>
17 #include <Geom2dGcc_Circ2d3Tan.hxx>
18 #include <Geom2dGcc_Circ2d2TanOn.hxx>
19 #include <Geom2dGcc_Circ2dTanOnRad.hxx>
20 #include <Geom2dGcc_Circ2dTanCen.hxx>
21 #include <Geom2dGcc_Lin2d2Tan.hxx>
22 #include <Geom2dGcc_Lin2dTanObl.hxx>
23 #include <Geom2dGcc.hxx>
24 #include <Geom2dGcc_QualifiedCurve.hxx>
25 #include <Geom2d_CartesianPoint.hxx>
26 #include <Geom2d_Circle.hxx>
27 #include <Geom2d_Line.hxx>
28 #include <Precision.hxx>
29 #include <GeomAPI_Interpolate.hxx>
30 #include <Draw_Marker3D.hxx>
31 #include <Geom2dAPI_Interpolate.hxx>
32 #include <Draw_Marker2D.hxx>
33 #include <TColgp_HArray1OfPnt.hxx>
34 #include <Geom_BSplineCurve.hxx>
35 #include <TColgp_HArray1OfPnt2d.hxx>
36 #include <Geom2d_BSplineCurve.hxx>
37 #include <DrawTrSurf_BSplineCurve.hxx>
38 #include <DrawTrSurf_BSplineCurve2d.hxx>
39 #include <TColgp_HArray1OfPnt.hxx>
40 #include <TColgp_Array1OfPnt.hxx>
41 #include <TColgp_Array1OfPnt2d.hxx>
42 #include <TColgp_HArray1OfVec.hxx>
43 #include <TColgp_Array1OfVec.hxx>
44 #include <TColStd_Array1OfReal.hxx>
45 #include <TColStd_HArray1OfReal.hxx>
46 #include <TColStd_HArray1OfBoolean.hxx>
47 #include <Handle_TColStd_HArray1OfReal.hxx>
48 #include <Handle_TColStd_HArray1OfBoolean.hxx>
49 #include <AppParCurves_MultiBSpCurve.hxx>
50 #include <AppDef_MultiLine.hxx>
51 #include <AppDef_TheVariational.hxx>
52 #include <AppParCurves_HArray1OfConstraintCouple.hxx>
53 #include <AppParCurves_ConstraintCouple.hxx>
54 #include <GC_MakeSegment.hxx>
55 #include <GC_MakeArcOfCircle.hxx>
60 Standard_IMPORT Draw_Viewer dout;
62 Standard_IMPORT Draw_Color DrawTrSurf_CurveColor(const Draw_Color);
65 static Standard_Integer solutions(Draw_Interpretor& di,
66 Geom2dGcc_Circ2d2TanRad& ct3, const char* name)
70 Draw_Color col = DrawTrSurf_CurveColor(Draw_Color(Draw_vert));
71 DrawTrSurf_CurveColor(col);
74 for (Standard_Integer i = 1 ; i <= ct3.NbSolutions() ; i++) {
75 Handle(Geom2d_Circle) C = new Geom2d_Circle(ct3.ThisSolution(i));
76 sprintf(solname,"%s_%d",name,i);
77 char* temp = solname; // pour portage WNT
78 DrawTrSurf::Set(temp,C);
84 di << "Circ2d2TanRad Not done";
89 static Standard_Integer solutions(Draw_Interpretor& di,
90 Geom2dGcc_Circ2d3Tan& ct3, const char* name)
94 Draw_Color col = DrawTrSurf_CurveColor(Draw_Color(Draw_vert));
95 DrawTrSurf_CurveColor(col);
98 for (Standard_Integer i = 1 ; i <= ct3.NbSolutions() ; i++) {
99 Handle(Geom2d_Circle) C = new Geom2d_Circle(ct3.ThisSolution(i));
100 sprintf(solname,"%s_%d",name,i);
101 char* temp = solname; // pour portage WNT
102 DrawTrSurf::Set(temp,C);
103 di << solname << " ";
108 di << "Circ2d3Tan Not done";
113 //=======================================================================
116 //=======================================================================
118 static Standard_Integer cirtang (Draw_Interpretor& di,Standard_Integer n, const char** a)
122 Handle(Geom2d_Curve) C1 = DrawTrSurf::GetCurve2d(a[2]);
123 Handle(Geom2d_Curve) C2 = DrawTrSurf::GetCurve2d(a[3]);
124 Handle(Geom2d_Curve) C3 = DrawTrSurf::GetCurve2d(a[4]);
126 Standard_Boolean ip1 = DrawTrSurf::GetPoint2d(a[2],P1);
127 Standard_Boolean ip2 = DrawTrSurf::GetPoint2d(a[3],P2);
128 Standard_Boolean ip3 = DrawTrSurf::GetPoint2d(a[4],P3);
130 Standard_Real tol = Precision::Confusion();
131 if (n > 5) tol = atof(a[5]);
140 Geom2dGcc_Circ2d3Tan ct3(Geom2dGcc::Unqualified(C1),
141 Geom2dGcc::Unqualified(C2),
142 Geom2dGcc::Unqualified(C3),
144 return solutions(di,ct3,a[1]);
149 Geom2dGcc_Circ2d3Tan ct3(Geom2dGcc::Unqualified(C1),
150 Geom2dGcc::Unqualified(C2),
151 new Geom2d_CartesianPoint(P3),
153 return solutions(di,ct3,a[1]);
158 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C1),
159 Geom2dGcc::Unqualified(C2),
161 return solutions(di,ct3,a[1]);
168 Geom2dGcc_Circ2d3Tan ct3(Geom2dGcc::Unqualified(C1),
169 Geom2dGcc::Unqualified(C3),
170 new Geom2d_CartesianPoint(P2),
172 return solutions(di,ct3,a[1]);
177 Geom2dGcc_Circ2d3Tan ct3(Geom2dGcc::Unqualified(C1),
178 new Geom2d_CartesianPoint(P2),
179 new Geom2d_CartesianPoint(P3),
181 return solutions(di,ct3,a[1]);
186 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C1),
187 new Geom2d_CartesianPoint(P2),
189 return solutions(di,ct3,a[1]);
197 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C1),
198 Geom2dGcc::Unqualified(C3),
201 return solutions(di,ct3,a[1]);
206 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C1),
207 new Geom2d_CartesianPoint(P3),
210 return solutions(di,ct3,a[1]);
215 di << "Curve, radius, radius ???"<<"\n";
227 Geom2dGcc_Circ2d3Tan ct3(Geom2dGcc::Unqualified(C2),
228 Geom2dGcc::Unqualified(C3),
229 new Geom2d_CartesianPoint(P1),
231 return solutions(di,ct3,a[1]);
236 Geom2dGcc_Circ2d3Tan ct3(Geom2dGcc::Unqualified(C2),
237 new Geom2d_CartesianPoint(P1),
238 new Geom2d_CartesianPoint(P3),
240 return solutions(di,ct3,a[1]);
245 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C2),
246 new Geom2d_CartesianPoint(P1),
248 return solutions(di,ct3,a[1]);
255 Geom2dGcc_Circ2d3Tan ct3(Geom2dGcc::Unqualified(C3),
256 new Geom2d_CartesianPoint(P1),
257 new Geom2d_CartesianPoint(P2),
259 return solutions(di,ct3,a[1]);
264 Geom2dGcc_Circ2d3Tan ct3(new Geom2d_CartesianPoint(P1),
265 new Geom2d_CartesianPoint(P2),
266 new Geom2d_CartesianPoint(P3),
268 return solutions(di,ct3,a[1]);
273 Geom2dGcc_Circ2d2TanRad ct3(new Geom2d_CartesianPoint(P1),
274 new Geom2d_CartesianPoint(P2),
276 return solutions(di,ct3,a[1]);
284 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C3),
285 new Geom2d_CartesianPoint(P1),
288 return solutions(di,ct3,a[1]);
293 Geom2dGcc_Circ2d2TanRad ct3(new Geom2d_CartesianPoint(P1),
294 new Geom2d_CartesianPoint(P3),
297 return solutions(di,ct3,a[1]);
302 di << "Point, radius, radius ???"<<"\n";
314 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C2),
315 Geom2dGcc::Unqualified(C3),
318 return solutions(di,ct3,a[1]);
323 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C2),
324 new Geom2d_CartesianPoint(P3),
327 return solutions(di,ct3,a[1]);
332 di << "Radius - Curve - Radius ??"<<"\n";
340 Geom2dGcc_Circ2d2TanRad ct3(Geom2dGcc::Unqualified(C3),
341 new Geom2d_CartesianPoint(P2),
344 return solutions(di,ct3,a[1]);
349 Geom2dGcc_Circ2d2TanRad ct3(new Geom2d_CartesianPoint(P2),
350 new Geom2d_CartesianPoint(P3),
353 return solutions(di,ct3,a[1]);
358 di << "Radius - Point - Radius ??"<<"\n";
365 di << "radius, radius ???"<<"\n";
373 //=======================================================================
376 //=======================================================================
378 static Standard_Integer lintang (Draw_Interpretor& di,Standard_Integer n, const char** a)
382 Handle(Geom2d_Curve) C1 = DrawTrSurf::GetCurve2d(a[2]);
383 Handle(Geom2d_Curve) C2 = DrawTrSurf::GetCurve2d(a[3]);
387 if (C1.IsNull() || C2.IsNull())
390 Draw_Color col = DrawTrSurf_CurveColor(Draw_Color(Draw_vert));
393 Handle(Geom2d_Line) L = Handle(Geom2d_Line)::DownCast(C2);
395 di << "Second argument must be a line";
398 Standard_Real ang = atof(a[4]) * (M_PI / 180.0);
399 Geom2dGcc_Lin2dTanObl ct3(Geom2dGcc::Unqualified(C1),
401 Precision::Angular(),
402 (C1->FirstParameter()+C1->LastParameter())/2.,
405 for (Standard_Integer i = 1 ; i <= ct3.NbSolutions() ; i++) {
406 Handle(Geom2d_Line) LS = new Geom2d_Line(ct3.ThisSolution(i));
407 sprintf(solname,"%s_%d",a[1],i);
408 char* temp = solname; // pour portage WNT
409 DrawTrSurf::Set(temp,LS);
410 di << solname << " ";
414 di << "Lin2dTanObl Not done" << "\n";
417 Geom2dGcc_Lin2d2Tan ct3(Geom2dGcc::Unqualified(C1),
418 Geom2dGcc::Unqualified(C2),
419 Precision::Angular(),
420 (C1->FirstParameter()+C1->LastParameter())/2.,
421 (C2->FirstParameter()+C2->LastParameter())/2.);
423 for (Standard_Integer i = 1 ; i <= ct3.NbSolutions() ; i++) {
424 Handle(Geom2d_Line) LS = new Geom2d_Line(ct3.ThisSolution(i));
425 sprintf(solname,"%s_%d",a[1],i);
426 char* temp = solname; // pour portage WNT
427 DrawTrSurf::Set(temp,LS);
428 di << solname << " ";
432 di << "Lin2d2Tan Not done" << "\n";
435 DrawTrSurf_CurveColor(col);
440 //==================================================================================
441 static Standard_Integer interpol (Draw_Interpretor& di,Standard_Integer n, const char** a)
442 //==================================================================================
445 di <<"give a name to your curve !" << "\n";
449 Standard_Integer id,XX,YY,b, i, j;
450 di << "Pick points "<< "\n";
451 dout.Select(id, XX, YY, b);
452 Standard_Real zoom = dout.Zoom(id);
453 if (b != 1) return 0;
454 if (id < 0) return 0;
457 Standard_Boolean newcurve;
460 Handle(Draw_Marker3D) mark;
461 Handle(TColgp_HArray1OfPnt) Points = new TColgp_HArray1OfPnt(1, 1);
462 P.SetCoord((Standard_Real)XX/zoom,(Standard_Real)YY/zoom, 0.0);
463 Points->SetValue(1 , P);
464 Handle(TColgp_HArray1OfPnt) ThePoints = new TColgp_HArray1OfPnt(1, 2);
465 ThePoints->SetValue(1 , P);
466 mark = new Draw_Marker3D(Points->Value(1), Draw_X, Draw_vert);
469 Handle(Geom_BSplineCurve) C;
473 dout.Select(id,XX,YY,b, Standard_False);
474 P.SetCoord((Standard_Real)XX/zoom,(Standard_Real)YY/zoom, 0.0);
475 ThePoints->SetValue(i+1, P);
476 newcurve = Standard_False;
477 if (!(ThePoints->Value(i)).IsEqual(ThePoints->Value(i+1), 1.e-06)) {
480 mark = new Draw_Marker3D(ThePoints->Value(i), Draw_X, Draw_vert);
484 new TColgp_HArray1OfPnt(ThePoints->Lower(),ThePoints->Upper());
485 Points->ChangeArray1() = ThePoints->Array1();
486 newcurve = Standard_True;
488 GeomAPI_Interpolate anInterpolator(ThePoints,
491 anInterpolator.Perform() ;
492 if (anInterpolator.IsDone()) {
493 C = anInterpolator.Curve() ;
494 Handle(DrawTrSurf_BSplineCurve)
495 DC = new DrawTrSurf_BSplineCurve(C);
499 dout.RepaintView(id);
502 ThePoints = new TColgp_HArray1OfPnt(1, i+1);
503 for (j = 1; j <= i; j++) ThePoints->SetValue(j, Points->Value(j));
507 GeomAPI_Interpolate anInterpolator(ThePoints,
510 anInterpolator.Perform() ;
511 if (anInterpolator.IsDone()) {
512 C = anInterpolator.Curve() ;
513 DrawTrSurf::Set(a[1], C);
514 dout.RepaintView(id);
518 Handle(Draw_Marker2D) mark;
519 Handle(TColgp_HArray1OfPnt2d) Points = new TColgp_HArray1OfPnt2d(1, 1);
520 P2d.SetCoord((Standard_Real)XX/zoom,(Standard_Real)YY/zoom);
521 Points->SetValue(1 , P2d);
522 Handle(TColgp_HArray1OfPnt2d) ThePoints = new TColgp_HArray1OfPnt2d(1, 2);
523 ThePoints->SetValue(1, P2d);
524 mark = new Draw_Marker2D(P2d, Draw_X, Draw_vert);
527 Handle(Geom2d_BSplineCurve) C;
531 dout.Select(id,XX,YY,b, Standard_False);
532 P2d.SetCoord((Standard_Real)XX/zoom,(Standard_Real)YY/zoom);
533 ThePoints->SetValue(i+1, P2d);
534 newcurve = Standard_False;
535 if (!(ThePoints->Value(i)).IsEqual(ThePoints->Value(i+1), 1.e-06)) {
538 mark = new Draw_Marker2D(P2d, Draw_X, Draw_vert);
542 new TColgp_HArray1OfPnt2d(ThePoints->Lower(),ThePoints->Upper());
543 Points->ChangeArray1() = ThePoints->Array1();
544 newcurve = Standard_True;
546 Geom2dAPI_Interpolate a2dInterpolator(ThePoints,
549 a2dInterpolator.Perform() ;
550 if (a2dInterpolator.IsDone()) {
551 C = a2dInterpolator.Curve() ;
553 Handle(DrawTrSurf_BSplineCurve2d)
554 DC = new DrawTrSurf_BSplineCurve2d(C);
558 dout.RepaintView(id);
562 ThePoints = new TColgp_HArray1OfPnt2d(1, i+1);
563 for (j = 1; j <= i; j++) ThePoints->SetValue(j, Points->Value(j));
567 Geom2dAPI_Interpolate a2dInterpolator(Points,
570 a2dInterpolator.Perform() ;
571 if (a2dInterpolator.IsDone()) {
572 C = a2dInterpolator.Curve() ;
574 DrawTrSurf::Set(a[1], C);
575 dout.RepaintView(id);
581 // lecture du fichier.
582 // nbpoints, 2d ou 3d, puis valeurs.
583 const char* nomfic = a[2];
584 ifstream iFile(nomfic, ios::in);
585 if (!iFile) return 1;
586 Standard_Integer nbp, i;
587 Standard_Real x, y, z;
591 if (!strcmp(dimen,"3d")) {
592 Handle_TColgp_HArray1OfPnt Point =
593 new TColgp_HArray1OfPnt(1, nbp);
594 for (i = 1; i <= nbp; i++) {
595 iFile >> x >> y >> z;
596 Point->SetValue(i, gp_Pnt(x, y, z));
598 GeomAPI_Interpolate anInterpolator(Point,
601 anInterpolator.Perform() ;
602 if (anInterpolator.IsDone()) {
603 Handle(Geom_BSplineCurve) C =
604 anInterpolator.Curve();
605 DrawTrSurf::Set(a[1], C);
608 else if (!strcmp(dimen,"2d")) {
609 Handle(TColgp_HArray1OfPnt2d) PointPtr =
610 new TColgp_HArray1OfPnt2d(1, nbp);
611 for (i = 1; i <= nbp; i++) {
613 PointPtr->SetValue(i, gp_Pnt2d(x, y));
615 Geom2dAPI_Interpolate a2dInterpolator(PointPtr,
618 a2dInterpolator.Perform() ;
619 if (a2dInterpolator.IsDone()) {
620 Handle(Geom2d_BSplineCurve) C = a2dInterpolator.Curve() ;
621 DrawTrSurf::Set(a[1], C);
628 static Standard_Integer tanginterpol (Draw_Interpretor& di,
653 Standard_Boolean periodic_flag = Standard_False ;
661 Handle(Geom_BSplineCurve) NewCurvePtr ;
667 if (strcmp(a[num_read],"p") == 0) {
668 periodic_flag = Standard_True ;
671 num_parameters = atoi(a[num_read]) ;
673 if (num_parameters < 2) {
676 if ( n < num_parameters * 3 + num_read) {
679 Handle_TColgp_HArray1OfPnt PointsArrayPtr=
680 new TColgp_HArray1OfPnt(1,num_parameters) ;
682 num_tangents = ((n - num_read) / 3) - num_parameters ;
683 num_tangents = Max (0,num_tangents) ;
684 num_tangents = Min (num_parameters, num_tangents) ;
686 num_start = num_read ;
688 while (num_read <= num_parameters * 3 + num_start ) {
689 for (jj = 1 ; jj <= 3 ; jj++) {
690 a_point.SetCoord(jj,atof(a[num_read])) ;
693 PointsArrayPtr->SetValue(ii,a_point) ;
696 GeomAPI_Interpolate anInterpolator(PointsArrayPtr,
700 if (num_tangents > 0) {
701 TColgp_Array1OfVec TangentsArray(1,num_parameters) ;
702 Handle_TColStd_HArray1OfBoolean
704 new TColStd_HArray1OfBoolean(1,num_parameters) ;
706 for (ii = 1 ; ii <= num_tangents ; ii++) {
707 TangentFlagsPtr->SetValue(ii,Standard_True) ;
709 for (ii = num_tangents + 1 ; ii <= num_parameters ; ii++) {
710 TangentFlagsPtr->SetValue(ii,Standard_False) ;
713 while (ii <= num_tangents) {
714 for (jj = 1 ; jj <= 3 ; jj++) {
715 a_vector.SetCoord(jj,atof(a[num_read])) ;
718 TangentsArray.SetValue(ii,a_vector) ;
723 anInterpolator.Load(TangentsArray,
726 anInterpolator.Perform() ;
727 if (anInterpolator.IsDone()) {
729 anInterpolator.Curve() ;
731 DrawTrSurf::Set(a[1],
739 //==================================================================================
740 static Standard_Integer gcarc (Draw_Interpretor& di,Standard_Integer n, const char** a)
741 //==================================================================================
745 if (!strcmp(a[2], "seg")) {
746 if (DrawTrSurf::GetPoint(a[3], P1)) {
747 if (DrawTrSurf::GetPoint(a[4], P2)) {
748 Handle(Geom_Curve) theline = GC_MakeSegment(P1,P2).Value();
749 DrawTrSurf::Set(a[1], theline);
754 else if (!strcmp(a[2], "cir")) {
755 if (DrawTrSurf::GetPoint(a[3], P1)) {
756 if (DrawTrSurf::GetPoint(a[4], P2)) {
757 if (DrawTrSurf::GetPoint(a[5], P3)) {
758 // if (DrawTrSurf::GetPoint(a[6], P4)) {
761 Standard_Boolean ip4 =
763 DrawTrSurf::GetPoint(a[6], P4);
764 gp_Vec V1 = gp_Vec(P2,P3);
765 Handle(Geom_Curve)thearc = GC_MakeArcOfCircle(P1,V1,P4).Value();
766 DrawTrSurf::Set(a[1], thearc);
770 Handle(Geom_Curve)thearc = GC_MakeArcOfCircle(P1,P2,P3).Value();
771 DrawTrSurf::Set(a[1], thearc);
779 di <<"give a name for arc and the type seg or cir then" << "\n";
780 di <<"give passing points p1 p2 for seg p1 p2 p3 or p1 p2 p3 p4 for cir (p2 p3 is a tgtvec)!" << "\n";
784 //=======================================================================
785 //function : ConstraintCommands
787 //=======================================================================
790 void GeometryTest::ConstraintCommands(Draw_Interpretor& theCommands)
793 static Standard_Boolean loaded = Standard_False;
795 loaded = Standard_True;
797 DrawTrSurf::BasicCommands(theCommands);
800 // constrained constructs
801 g = "GEOMETRY Constraints";
803 theCommands.Add("cirtang",
804 "cirtang cname curve/point/radius curve/point/radius curve/point/radius",
808 theCommands.Add("lintan",
809 "lintan lname curve1 curve2 [angle]",
814 theCommands.Add("interpol",
815 "interpol cname [fic]",
818 theCommands.Add("tanginterpol",
819 "tanginterpol curve [p] num_points points [tangents] modifier p = periodic",
823 theCommands.Add("gcarc",
824 "gcarc name seg/cir p1 p2 p3 p4",