1 // Created on: 1993-08-12
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
22 // PMN : Ajout de la commande smooth
23 // PMN : 11/07/97 Passage a GeomliteTest de bsmooth.
25 #include <Standard_Stream.hxx>
27 #include <GeomliteTest.hxx>
28 #include <DrawTrSurf.hxx>
30 #include <Draw_Appli.hxx>
31 #include <Draw_Interpretor.hxx>
32 #include <Precision.hxx>
33 #include <Draw_Marker3D.hxx>
34 #include <Draw_Marker2D.hxx>
35 #include <TColgp_HArray1OfPnt.hxx>
36 #include <TColgp_SequenceOfPnt.hxx>
37 #include <Geom_BSplineCurve.hxx>
38 #include <Geom_BezierCurve.hxx>
39 #include <TColgp_HArray1OfPnt2d.hxx>
40 #include <TColgp_SequenceOfPnt2d.hxx>
42 #include <Geom2d_BSplineCurve.hxx>
43 #include <Geom2d_BezierCurve.hxx>
44 #include <DrawTrSurf_BSplineCurve.hxx>
45 #include <DrawTrSurf_BezierCurve.hxx>
46 #include <DrawTrSurf_BSplineCurve2d.hxx>
47 #include <DrawTrSurf_BezierCurve2d.hxx>
48 #include <TColgp_HArray1OfPnt.hxx>
49 #include <TColgp_Array1OfPnt.hxx>
50 #include <TColgp_Array1OfPnt2d.hxx>
51 #include <TColgp_HArray1OfVec.hxx>
52 #include <TColgp_Array1OfVec.hxx>
53 #include <TColStd_Array1OfReal.hxx>
54 #include <TColStd_HArray1OfReal.hxx>
55 #include <TColStd_HArray1OfBoolean.hxx>
56 #include <Handle_TColStd_HArray1OfReal.hxx>
57 #include <Handle_TColStd_HArray1OfBoolean.hxx>
59 #include <AppParCurves_MultiBSpCurve.hxx>
60 #include <AppParCurves_MultiCurve.hxx>
61 #include <AppDef_MultiLine.hxx>
62 #include <AppDef_TheVariational.hxx>
63 #include <AppDef_Compute.hxx>
64 #include <AppParCurves_HArray1OfConstraintCouple.hxx>
65 #include <AppParCurves_ConstraintCouple.hxx>
66 #include <AppDef_HArray1OfMultiPointConstraint.hxx>
67 #include <AppDef_Array1OfMultiPointConstraint.hxx>
68 #include <math_Vector.hxx>
72 Standard_IMPORT Draw_Viewer dout;
75 //Draw_Color DrawTrSurf_CurveColor(const Draw_Color);
77 //=======================================================================
78 //function : NbConstraint
79 //=======================================================================
80 static Standard_Integer NbConstraint(const AppParCurves_Constraint C1,
81 const AppParCurves_Constraint C2)
83 Standard_Integer N =0;
85 case AppParCurves_PassPoint :
90 case AppParCurves_TangencyPoint :
95 case AppParCurves_CurvaturePoint :
105 case AppParCurves_PassPoint :
110 case AppParCurves_TangencyPoint :
115 case AppParCurves_CurvaturePoint :
125 //=======================================================================
126 //function : PointsByPick
127 //=======================================================================
128 static Standard_Integer PointsByPick
129 (Handle(AppDef_HArray1OfMultiPointConstraint)& MPC, Draw_Interpretor& di)
131 Standard_Integer id,XX,YY,b, i;
133 di << "Pick points "<< "\n";
134 dout.Select(id, XX, YY, b);
135 Standard_Real zoom = dout.Zoom(id);
136 if (b != 1) return 0;
137 if (id < 0) return 0;
141 //Standard_Boolean newcurve;
145 Handle(Draw_Marker3D) mark;
146 TColgp_SequenceOfPnt ThePoints;
147 P.SetCoord((Standard_Real)XX/zoom,(Standard_Real)YY/zoom, 0.0);
148 ThePoints.Append (P);
149 mark = new Draw_Marker3D(P, Draw_X, Draw_orange);
155 dout.Select(id,XX,YY,b, Standard_False);
158 P.SetCoord( (Standard_Real)XX/zoom,
159 (Standard_Real)YY/zoom, 0.0);
161 mark = new Draw_Marker3D(P, Draw_X, Draw_orange);
167 MPC = new (AppDef_HArray1OfMultiPointConstraint)(1, ThePoints.Length());
168 AppDef_MultiPointConstraint mpc(1,0);
169 MPC->ChangeArray1().Init(mpc);
170 for (i=1; i<=ThePoints.Length(); i++) {
171 AppDef_MultiPointConstraint mpc(1,0);
172 mpc.SetPoint(1, ThePoints.Value(i));
173 MPC->SetValue(i, mpc);
179 Handle(Draw_Marker2D) mark;
180 TColgp_SequenceOfPnt2d ThePoints;
181 P2d.SetCoord((Standard_Real)XX/zoom,(Standard_Real)YY/zoom);
182 ThePoints.Append(P2d);
183 mark = new Draw_Marker2D(P2d, Draw_X, Draw_orange);
189 dout.Select(id,XX,YY,b, Standard_False);
193 P2d.SetCoord( (Standard_Real)XX/zoom, (Standard_Real)YY/zoom );
194 ThePoints.Append (P2d);
195 mark = new Draw_Marker2D(P2d, Draw_X, Draw_orange);
201 MPC = new (AppDef_HArray1OfMultiPointConstraint)(1, ThePoints.Length());
202 for (i=1; i<=ThePoints.Length(); i++) {
203 AppDef_MultiPointConstraint mpc(0,1);
204 mpc.SetPoint2d(1, ThePoints.Value(i));
205 MPC->SetValue(i, mpc);
211 //=======================================================================
212 //function : PointsByFile
213 //=======================================================================
214 static void PointsByFile(Handle(AppDef_HArray1OfMultiPointConstraint)& MPC,
215 Handle(AppParCurves_HArray1OfConstraintCouple)& TABofCC,
217 Draw_Interpretor& di)
219 Standard_Integer nbp, i, nbc;
221 Standard_Real x, y, z;
227 if (!strcmp(dimen,"3d")) {
228 Handle(Draw_Marker3D) mark;
229 MPC = new (AppDef_HArray1OfMultiPointConstraint)(1, nbp);
231 for (i = 1; i <= nbp; i++) {
232 iFile >> x >> y >> z;
233 AppDef_MultiPointConstraint mpc(1,0);
234 mpc.SetPoint(1, gp_Pnt(x, y, z));
235 MPC->SetValue(i,mpc);
236 mark = new Draw_Marker3D(gp_Pnt(x, y, z), Draw_X, Draw_orange);
239 Standard_Boolean HasConstrainte = Standard_False;
241 if ( IsControl( (Standard_Character)c) ) {
242 if (iFile.get(c)) HasConstrainte = Standard_True;
244 else HasConstrainte = Standard_True;
247 if (HasConstrainte) {
248 Standard_Integer num, ordre;
250 if ((nbc < 1) || (nbc>nbp)) return; // Y a comme un probleme
251 AppParCurves_Constraint Constraint = AppParCurves_NoConstraint;
252 TABofCC = new AppParCurves_HArray1OfConstraintCouple(1, nbp);
253 for(i=1; i<=nbp; i++){
254 AppParCurves_ConstraintCouple ACC(i,Constraint);
255 TABofCC->SetValue(i,ACC);
257 for(i=1; i<=nbc; i++) {
258 iFile >> num >> ordre;
259 if ((num<1)||(num>nbp)) {
260 di << "Error on point Index in constrainte" << "\n";
263 Constraint = (AppParCurves_Constraint) (ordre+1);
264 TABofCC->ChangeValue(num).SetConstraint(Constraint);
265 if (Constraint >= AppParCurves_TangencyPoint) {
266 iFile >> x >> y >> z;
267 MPC->ChangeValue(num).SetTang(1, gp_Vec(x,y,z));
269 if (Constraint >= AppParCurves_CurvaturePoint) {
270 iFile >> x >> y >> z;
271 MPC->ChangeValue(num).SetCurv(1, gp_Vec(x,y,z));
277 else if (!strcmp(dimen,"2d")) {
278 Handle(Draw_Marker2D) mark;
279 MPC = new (AppDef_HArray1OfMultiPointConstraint)(1, nbp);
281 for (i = 1; i <= nbp; i++) {
283 AppDef_MultiPointConstraint mpc(0,1);
284 mpc.SetPoint2d(1, gp_Pnt2d(x, y));
285 MPC->SetValue(i, mpc);
286 mark = new Draw_Marker2D(gp_Pnt2d(x, y), Draw_X, Draw_orange);
290 Standard_Boolean HasConstrainte = Standard_False;
292 if ( IsControl( (Standard_Character)c) ) {
293 if (iFile.get(c)) HasConstrainte = Standard_True;
295 else HasConstrainte = Standard_True;
298 if (HasConstrainte) {
299 Standard_Integer num, ordre;
301 if ((nbc < 1) || (nbc>nbp)) return; // Y a comme un probleme
302 AppParCurves_Constraint Constraint = AppParCurves_NoConstraint;
303 TABofCC = new AppParCurves_HArray1OfConstraintCouple(1, nbp);
304 for(i=1; i<=nbp; i++){
305 AppParCurves_ConstraintCouple ACC(i,Constraint);
306 TABofCC->SetValue(i,ACC);
308 for(i=1; i<=nbc; i++) {
309 iFile >> num >> ordre;
310 if ((num<1)||(num>nbp)) {
311 di << "Error on point Index in constrainte" << "\n";
314 Constraint = (AppParCurves_Constraint) (ordre+1);
315 TABofCC->ChangeValue(num).SetConstraint(Constraint);
316 if (Constraint >= AppParCurves_TangencyPoint) {
318 MPC->ChangeValue(num).SetTang2d(1, gp_Vec2d(x,y));
320 if (Constraint >= AppParCurves_CurvaturePoint) {
322 MPC->ChangeValue(num).SetCurv2d(1, gp_Vec2d(x,y));
331 //==================================================================================
332 static Standard_Integer smoothing (Draw_Interpretor& di,Standard_Integer n, const char** a)
333 //==================================================================================
334 // Tolerance < 0 lissage "filtre"
335 // Tolerance > 0 lissage avec respect de l'erreur max
336 // Tolerance = 0 interpolation.
339 Standard_Real Tolerance=0;
341 AppParCurves_Constraint Constraint=AppParCurves_NoConstraint;
343 Handle(AppParCurves_HArray1OfConstraintCouple)TABofCC;
345 Handle(AppDef_HArray1OfMultiPointConstraint) Points;
346 Standard_Integer id = 0, DegMax = -1;
349 di <<"give a name to your curve !" << "\n";
353 di <<"give a tolerance to your curve !" << "\n";
357 Tolerance = Draw::Atof(a[2]);
358 if (Abs(Tolerance) < Precision::Confusion()*1.e-7) {
359 Constraint = AppParCurves_PassPoint;
362 Constraint = AppParCurves_NoConstraint;
364 // Designation Graphique ------------------------
365 id = PointsByPick(Points, di);
368 Standard_Integer ific = 3;
369 Tolerance = Draw::Atof(a[2]);
370 if (Abs(Tolerance) < Precision::Confusion()*1.e-7) {
371 Constraint = AppParCurves_PassPoint;
374 Constraint = AppParCurves_NoConstraint;
377 if (! strcmp(a[3],"-D")) {
378 DegMax = Draw::Atoi(a[4]);
383 // lecture du fichier.
384 // nbpoints, 2d ou 3d, puis valeurs.
385 const char* nomfic = a[ific];
386 ifstream iFile(nomfic, ios::in);
388 di << a[ific] <<"do not exist !" << "\n";
391 PointsByFile(Points, TABofCC, iFile, di);
394 // Designation Graphique
395 id = PointsByPick(Points, di);
399 AppDef_MultiLine AML(Points->Array1());
401 // Compute --------------
403 if (Points->Value(1).NbPoints()==0){
405 Handle(TColgp_HArray1OfPnt2d) ThePoints;
407 Standard_Integer NbPoints = Points->Length();
408 if (TABofCC.IsNull()) {
409 TABofCC = new AppParCurves_HArray1OfConstraintCouple(1, NbPoints);
410 for(i=1; i<=NbPoints; i++){
411 AppParCurves_ConstraintCouple ACC(i,Constraint);
412 TABofCC->SetValue(i,ACC);
416 AppDef_TheVariational Variation(AML,
421 if (DegMax < 3) Variation.SetContinuity(GeomAbs_C0);
422 else if (DegMax <5) Variation.SetContinuity(GeomAbs_C1);
423 Variation.SetMaxDegree(DegMax);
425 Variation.SetTolerance( Abs(Tolerance));
426 if (Tolerance>0) { Variation.SetWithMinMax(Standard_True);}
427 Variation.Approximate();
430 //Variation.Dump(cout);
431 Standard_SStream aSStream;
432 Variation.Dump(aSStream);
436 AppParCurves_MultiBSpCurve AnMuC = Variation.Value();
438 TColgp_Array1OfPnt2d ThePoles (1, AnMuC.NbPoles() );
439 AnMuC.Curve(1, ThePoles);
440 Handle(Geom2d_BSplineCurve) Cvliss = new (Geom2d_BSplineCurve)
443 AnMuC. Multiplicities(),
446 Handle(DrawTrSurf_BSplineCurve2d)
447 DC = new DrawTrSurf_BSplineCurve2d(Cvliss);
450 if (id!=0) dout.RepaintView(id);
453 Standard_Integer NbPoints = Points->Length();
454 if (TABofCC.IsNull()) {
455 TABofCC = new AppParCurves_HArray1OfConstraintCouple(1, NbPoints);
456 for(i=1; i<=NbPoints; i++){
457 AppParCurves_ConstraintCouple ACC(i,Constraint);
458 TABofCC->SetValue(i,ACC);
462 AppDef_TheVariational Variation(AML,
467 if (DegMax < 3) Variation.SetContinuity(GeomAbs_C0);
468 else if (DegMax <5) Variation.SetContinuity(GeomAbs_C1);
469 Variation.SetMaxDegree(DegMax);
471 Variation.SetTolerance( Abs(Tolerance));
472 if (Tolerance>0) { Variation.SetWithMinMax(Standard_True);}
473 Variation.Approximate();
475 //Variation.Dump(cout);
476 Standard_SStream aSStream;
477 Variation.Dump(aSStream);
481 AppParCurves_MultiBSpCurve AnMuC = Variation.Value();
483 TColgp_Array1OfPnt ThePoles (1, AnMuC.NbPoles() );
484 AnMuC.Curve(1, ThePoles);
485 Handle(Geom_BSplineCurve) Cvliss = new (Geom_BSplineCurve)
488 AnMuC. Multiplicities(),
491 Handle(DrawTrSurf_BSplineCurve)
492 DC = new DrawTrSurf_BSplineCurve(Cvliss);
495 if (id!=0) dout.RepaintView(id);
500 //=============================================================================
501 static Standard_Integer smoothingbybezier (Draw_Interpretor& di,
504 //============================================================================
506 Standard_Real Tolerance=0;
507 AppParCurves_Constraint Constraint = AppParCurves_NoConstraint;
508 Handle(AppParCurves_HArray1OfConstraintCouple)TABofCC;
509 Handle(AppDef_HArray1OfMultiPointConstraint) Points;
511 Standard_Integer id = 0;
512 Standard_Integer methode=0;
513 Standard_Integer Degree = 8;
516 di <<"give a name to your curve !" << "\n";
520 di <<"give a tolerance to your curve !" << "\n";
524 di <<"give a max degree!" << "\n";
529 di <<"give an option!" << "\n";
533 Tolerance = Draw::Atof(a[2]);
534 Degree = Draw::Atoi(a[3]);
535 if (! strcmp(a[4],"-GR")) {
538 else if (! strcmp(a[4],"-PR")) {
543 if (Abs(Tolerance) < Precision::Confusion()*1.e-7) {
544 Constraint = AppParCurves_PassPoint;
547 Constraint = AppParCurves_NoConstraint;
550 // Designation Graphique ------------------------
551 id = PointsByPick(Points, di);
553 // lecture du fichier.
554 // nbpoints, 2d ou 3d, puis valeurs.
555 const char* nomfic = a[5];
556 ifstream iFile(nomfic, ios::in);
558 di << a[6] <<"do not exist !" << "\n";
561 PointsByFile(Points, TABofCC, iFile, di);
565 AppDef_MultiLine AML(Points->Array1());
567 // Compute --------------
569 if (Points->Value(1).NbPoints()==0){
571 Handle(TColgp_HArray1OfPnt2d) ThePoints;
573 Standard_Integer NbPoints = Points->Length();
574 if (TABofCC.IsNull()) {
575 TABofCC = new AppParCurves_HArray1OfConstraintCouple(1, NbPoints);
576 for(i=1; i<=NbPoints; i++){
577 AppParCurves_ConstraintCouple ACC(i,Constraint);
578 TABofCC->SetValue(i,ACC);
581 AppParCurves_ConstraintCouple AC1(1, AppParCurves_PassPoint);
582 if (TABofCC->Value(1).Constraint()<AppParCurves_PassPoint)
583 TABofCC->SetValue(1, AC1);
585 AppParCurves_ConstraintCouple AC2(NbPoints, AppParCurves_PassPoint);
586 if (TABofCC->Value(NbPoints).Constraint()<AppParCurves_PassPoint)
587 TABofCC->SetValue(NbPoints, AC2);
591 Standard_Boolean mySquare = (methode == 2);
592 Standard_Integer degmin = 4;
593 Standard_Integer NbIteration = 5;
595 if (Degree < 4) degmin = Max(1, Degree -1);
596 degmin = Max(degmin, NbConstraint(TABofCC->Value(1).Constraint(),
597 TABofCC->Value(NbPoints).Constraint()) );
599 AppDef_Compute Appr(degmin, Degree,
600 Abs(Tolerance), Abs(Tolerance),
601 NbIteration, Standard_False,
602 Approx_ChordLength, mySquare);
604 Appr.SetConstraints(TABofCC->Value(1).Constraint(),
605 TABofCC->Value(NbPoints).Constraint());
609 if (! Appr.IsAllApproximated()) {
610 di << " No result" << "\n";
612 AppParCurves_MultiCurve AnMuC = Appr.Value();
613 ThePoints = new (TColgp_HArray1OfPnt2d) (1, AnMuC.NbPoles() );
614 AnMuC.Curve(1, ThePoints->ChangeArray1());
615 Standard_Real err, err2d;
616 Appr.Error(1, err, err2d);
617 di <<" Error2D is : " << err2d << "\n";
620 AppDef_TheVariational Varia(AML,
624 Varia.SetTolerance(Abs(Tolerance));
627 if (! Varia.IsDone()) {
628 di << " No result" << "\n";
631 AppParCurves_MultiBSpCurve AnMuC = Varia.Value();
632 di <<" Error2D is : " << Varia.MaxError() << "\n";
633 ThePoints = new (TColgp_HArray1OfPnt2d) (1, AnMuC.NbPoles() );
634 AnMuC.Curve(1, ThePoints->ChangeArray1());
637 Handle(Geom2d_BezierCurve) Cvliss =
638 new (Geom2d_BezierCurve)(ThePoints->Array1());
640 Handle(DrawTrSurf_BezierCurve2d) DC =
641 new (DrawTrSurf_BezierCurve2d) (Cvliss);
643 if (id!=0) dout.RepaintView(id);
647 Handle(TColgp_HArray1OfPnt) ThePoints;
648 Standard_Integer NbPoints = Points->Length();
649 if (TABofCC.IsNull()) {
650 TABofCC = new AppParCurves_HArray1OfConstraintCouple(1, NbPoints);
651 for(i=1; i<=NbPoints; i++){
652 AppParCurves_ConstraintCouple ACC(i,Constraint);
653 TABofCC->SetValue(i,ACC);
657 AppParCurves_ConstraintCouple AC1(1, AppParCurves_PassPoint);
658 if (TABofCC->Value(1).Constraint()<AppParCurves_PassPoint)
659 TABofCC->SetValue(1, AC1);
661 AppParCurves_ConstraintCouple AC2(NbPoints, AppParCurves_PassPoint);
662 if (TABofCC->Value(NbPoints).Constraint()<AppParCurves_PassPoint)
663 TABofCC->SetValue(NbPoints, AC2);
667 Standard_Boolean mySquare = (methode == 2);
668 Standard_Integer degmin = 4;
669 Standard_Integer NbIteration = 5;
670 if (Degree < 4) degmin = Max(1, Degree - 1);
671 degmin = Max(degmin, NbConstraint(TABofCC->Value(1).Constraint(),
672 TABofCC->Value(NbPoints).Constraint()) );
674 AppDef_Compute Appr(degmin, Degree,
675 Abs(Tolerance), Abs(Tolerance),
676 NbIteration, Standard_False,
677 Approx_ChordLength, mySquare);
679 Appr.SetConstraints(TABofCC->Value(1).Constraint(),
680 TABofCC->Value(NbPoints).Constraint());
684 if (! Appr.IsAllApproximated()) {
685 di << " No result" << "\n";
687 AppParCurves_MultiCurve AnMuC = Appr.Value();
688 ThePoints = new (TColgp_HArray1OfPnt) (1, AnMuC.NbPoles() );
689 AnMuC.Curve(1, ThePoints->ChangeArray1());
690 Standard_Real err, err2d;
691 Appr.Error(1, err, err2d);
692 di <<" Error3D is : " << err << "\n";
695 AppDef_TheVariational Varia(AML,
700 Varia.SetTolerance(Abs(Tolerance));
702 if (! Varia.IsDone()) {
703 di << " No result" << "\n";
706 AppParCurves_MultiBSpCurve AnMuC = Varia.Value();
707 di <<" Error3D is : " << Varia.MaxError() << "\n";
708 ThePoints = new (TColgp_HArray1OfPnt) (1, AnMuC.NbPoles() );
709 AnMuC.Curve(1, ThePoints->ChangeArray1());
712 Handle(Geom_BezierCurve) Cvliss =
713 new (Geom_BezierCurve)(ThePoints->Array1());
715 Handle(DrawTrSurf_BezierCurve)
716 DC = new DrawTrSurf_BezierCurve(Cvliss);
718 if (id!=0) dout.RepaintView(id);
723 //=======================================================================
724 //function : ConstraintCommands
726 //=======================================================================
729 void GeomliteTest::ApproxCommands(Draw_Interpretor& theCommands)
732 static Standard_Boolean loaded = Standard_False;
734 loaded = Standard_True;
736 DrawTrSurf::BasicCommands(theCommands);
739 // constrained constructs
740 g = "GEOMETRY Constraints";
743 theCommands.Add("bsmooth",
744 "bsmooth cname tol [-D degree] [fic]",
748 theCommands.Add("bzsmooth",
749 "bzsmooth cname tol degree option [fic]",
751 smoothingbybezier, g);