1 // Created on: 1993-07-19
2 // Created by: Remi LEQUETTE
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <Standard_Stream.hxx>
18 #include <GeomTools_CurveSet.ixx>
19 #include <GeomTools.hxx>
20 #include <GeomTools_UndefinedTypeHandler.hxx>
22 #include <Geom_Circle.hxx>
23 #include <Geom_Line.hxx>
24 #include <Geom_Ellipse.hxx>
25 #include <Geom_Parabola.hxx>
26 #include <Geom_Hyperbola.hxx>
27 #include <Geom_BezierCurve.hxx>
28 #include <Geom_BSplineCurve.hxx>
29 #include <Geom_TrimmedCurve.hxx>
30 #include <Geom_OffsetCurve.hxx>
33 #include <gp_Circ.hxx>
34 #include <gp_Elips.hxx>
35 #include <gp_Parab.hxx>
36 #include <gp_Hypr.hxx>
38 #include <TColStd_Array1OfReal.hxx>
39 #include <TColStd_Array1OfInteger.hxx>
40 #include <TColgp_Array1OfPnt.hxx>
41 #include <Standard_Failure.hxx>
42 #include <Standard_ErrorHandler.hxx>
43 #include <Message_ProgressSentry.hxx>
44 #include <Geom_Curve.hxx>
56 //=======================================================================
57 //function : GeomTools_CurveSet
59 //=======================================================================
61 GeomTools_CurveSet::GeomTools_CurveSet()
66 //=======================================================================
69 //=======================================================================
71 void GeomTools_CurveSet::Clear()
77 //=======================================================================
80 //=======================================================================
82 Standard_Integer GeomTools_CurveSet::Add(const Handle(Geom_Curve)& C)
84 return (C.IsNull()) ? 0 : myMap.Add(C);
88 //=======================================================================
91 //=======================================================================
93 Handle(Geom_Curve) GeomTools_CurveSet::Curve
94 (const Standard_Integer I)const
96 if (I <= 0 || I > myMap.Extent())
97 return Handle(Geom_Curve)();
98 return Handle(Geom_Curve)::DownCast(myMap(I));
102 //=======================================================================
105 //=======================================================================
107 Standard_Integer GeomTools_CurveSet::Index
108 (const Handle(Geom_Curve)& S)const
110 return S.IsNull() ? 0 : myMap.FindIndex(S);
114 //=======================================================================
117 //=======================================================================
119 static void Print(const gp_Pnt P,
120 Standard_OStream& OS,
121 const Standard_Boolean compact)
124 if (!compact) OS << ",";
127 if (!compact) OS << ",";
133 //=======================================================================
136 //=======================================================================
138 static void Print(const gp_Dir D,
139 Standard_OStream& OS,
140 const Standard_Boolean compact)
143 if (!compact) OS << ",";
146 if (!compact) OS << ",";
153 //=======================================================================
156 //=======================================================================
158 static void Print(const Handle(Geom_Line)& L,
159 Standard_OStream& OS,
160 const Standard_Boolean compact)
168 if (!compact) OS << "\n Origin :";
169 Print(C.Location(),OS,compact);
170 if (!compact) OS << "\n Axis :";
171 Print(C.Direction(),OS,compact);
172 if (!compact) OS << "\n";
176 //=======================================================================
179 //=======================================================================
181 static void Print(const Handle(Geom_Circle)& CC,
182 Standard_OStream& OS,
183 const Standard_Boolean compact)
190 gp_Circ C = CC->Circ();
191 if (!compact) OS << "\n Center :";
192 Print(C.Location(),OS,compact);
193 if (!compact) OS << "\n Axis :";
194 Print(C.Axis().Direction(),OS,compact);
195 if (!compact) OS << "\n XAxis :";
196 Print(C.XAxis().Direction(),OS,compact);
197 if (!compact) OS << "\n YAxis :";
198 Print(C.YAxis().Direction(),OS,compact);
199 if (!compact) OS << "\n Radius :";
201 if (!compact) OS << "\n";
205 //=======================================================================
208 //=======================================================================
210 static void Print(const Handle(Geom_Ellipse)& E,
211 Standard_OStream& OS,
212 const Standard_Boolean compact)
215 OS << ELLIPSE << " ";
219 gp_Elips C = E->Elips();
220 if (!compact) OS << "\n Center :";
221 Print(C.Location(),OS,compact);
222 if (!compact) OS << "\n Axis :";
223 Print(C.Axis().Direction(),OS,compact);
224 if (!compact) OS << "\n XAxis :";
225 Print(C.XAxis().Direction(),OS,compact);
226 if (!compact) OS << "\n YAxis :";
227 Print(C.YAxis().Direction(),OS,compact);
228 if (!compact) OS << "\n Radii :";
229 OS << C.MajorRadius();
230 if (!compact) OS << ",";
232 OS << C.MinorRadius();
233 if (!compact) OS << "\n";
237 //=======================================================================
240 //=======================================================================
242 static void Print(const Handle(Geom_Parabola)& P,
243 Standard_OStream& OS,
244 const Standard_Boolean compact)
247 OS << PARABOLA << " ";
251 gp_Parab C = P->Parab();
252 if (!compact) OS << "\n Center :";
253 Print(C.Location(),OS,compact);
254 if (!compact) OS << "\n Axis :";
255 Print(C.Axis().Direction(),OS,compact);
256 if (!compact) OS << "\n XAxis :";
257 Print(C.XAxis().Direction(),OS,compact);
258 if (!compact) OS << "\n YAxis :";
259 Print(C.YAxis().Direction(),OS,compact);
260 if (!compact) OS << "\n Focal :";
262 if (!compact) OS << "\n";
266 //=======================================================================
269 //=======================================================================
271 static void Print(const Handle(Geom_Hyperbola)& H,
272 Standard_OStream& OS,
273 const Standard_Boolean compact)
276 OS << HYPERBOLA << " ";
280 gp_Hypr C = H->Hypr();
281 if (!compact) OS << "\n Center :";
282 Print(C.Location(),OS,compact);
283 if (!compact) OS << "\n Axis :";
284 Print(C.Axis().Direction(),OS,compact);
285 if (!compact) OS << "\n XAxis :";
286 Print(C.XAxis().Direction(),OS,compact);
287 if (!compact) OS << "\n YAxis :";
288 Print(C.YAxis().Direction(),OS,compact);
289 if (!compact) OS << "\n Radii :";
290 OS << C.MajorRadius();
291 if (!compact) OS << ",";
293 OS << C.MinorRadius();
294 if (!compact) OS << "\n";
298 //=======================================================================
301 //=======================================================================
303 static void Print(const Handle(Geom_BezierCurve)& B,
304 Standard_OStream& OS,
305 const Standard_Boolean compact)
312 Standard_Boolean rational = B->IsRational();
314 OS << (rational ? 1 : 0) << " ";
321 Standard_Integer i,degree = B->Degree();
322 if (!compact) OS << "\n Degree :";
325 for (i = 1; i <= degree+1; i++) {
326 if (!compact) OS << "\n "<<setw(2)<<i<<" : ";
327 Print(B->Pole(i),OS,compact);
329 OS << " " << B->Weight(i);
334 if (!compact) OS << "\n";
337 //=======================================================================
340 //=======================================================================
342 static void Print(const Handle(Geom_BSplineCurve)& B,
343 Standard_OStream& OS,
344 const Standard_Boolean compact)
347 OS << BSPLINE << " ";
349 OS << "BSplineCurve";
352 Standard_Boolean rational = B->IsRational();
354 OS << (rational ? 1 : 0) << " ";
360 Standard_Boolean periodic = B->IsPeriodic();
362 OS << (periodic ? 1 : 0)<< " ";
369 Standard_Integer i,degree,nbpoles,nbknots;
370 degree = B->Degree();
371 nbpoles = B->NbPoles();
372 nbknots = B->NbKnots();
373 if (!compact) OS << "\n Degree ";
376 if (!compact) OS << ",";
379 if (!compact) OS << " Poles,";
381 OS << nbknots << " ";
382 if (!compact) OS << " Knots\n";
384 if (!compact) OS << "Poles :\n";
385 for (i = 1; i <= nbpoles; i++) {
386 if (!compact) OS << "\n "<<setw(2)<<i<<" : ";
388 Print(B->Pole(i),OS,compact);
390 OS << " " << B->Weight(i);
394 if (!compact) OS << "Knots :\n";
395 for (i = 1; i <= nbknots; i++) {
396 if (!compact) OS << "\n "<<setw(2)<<i<<" : ";
397 OS << " " << B->Knot(i) << " " << B->Multiplicity(i);
401 if (!compact) OS << "\n";
404 //=======================================================================
407 //=======================================================================
409 static void Print(const Handle(Geom_TrimmedCurve)& C,
410 Standard_OStream& OS,
411 const Standard_Boolean compact)
414 OS << TRIMMED << " ";
416 OS << "Trimmed curve\n";
417 if (!compact) OS << "Parameters : ";
418 OS << C->FirstParameter() << " " << C->LastParameter() << "\n";
419 if (!compact) OS << "Basis curve :\n";
420 GeomTools_CurveSet::PrintCurve(C->BasisCurve(),OS,compact);
423 //=======================================================================
426 //=======================================================================
428 static void Print(const Handle(Geom_OffsetCurve)& C,
429 Standard_OStream& OS,
430 const Standard_Boolean compact)
436 if (!compact) OS << "Offset : ";
437 OS << C->Offset() << "\n";
438 if (!compact) OS << "Direction : ";
439 Print(C->Direction(),OS,compact);
441 if (!compact) OS << "Basis curve :\n";
442 GeomTools_CurveSet::PrintCurve(C->BasisCurve(),OS,compact);
445 //=======================================================================
448 //=======================================================================
450 void GeomTools_CurveSet::PrintCurve(const Handle(Geom_Curve)& C,
451 Standard_OStream& OS,
452 const Standard_Boolean compact)
454 Handle(Standard_Type) TheType = C->DynamicType();
456 if ( TheType ==STANDARD_TYPE(Geom_Line)) {
457 Print(Handle(Geom_Line)::DownCast(C),OS,compact);
459 else if ( TheType == STANDARD_TYPE(Geom_Circle)) {
460 Print(Handle(Geom_Circle)::DownCast(C),OS,compact);
462 else if ( TheType == STANDARD_TYPE(Geom_Ellipse)) {
463 Print(Handle(Geom_Ellipse)::DownCast(C),OS,compact);
465 else if ( TheType == STANDARD_TYPE(Geom_Parabola)) {
466 Print(Handle(Geom_Parabola)::DownCast(C),OS,compact);
468 else if ( TheType == STANDARD_TYPE(Geom_Hyperbola)) {
469 Print(Handle(Geom_Hyperbola)::DownCast(C),OS,compact);
471 else if ( TheType == STANDARD_TYPE(Geom_BezierCurve)) {
472 Print(Handle(Geom_BezierCurve)::DownCast(C),OS,compact);
474 else if ( TheType == STANDARD_TYPE(Geom_BSplineCurve)) {
475 Print(Handle(Geom_BSplineCurve)::DownCast(C),OS,compact);
477 else if ( TheType == STANDARD_TYPE(Geom_TrimmedCurve)) {
478 Print(Handle(Geom_TrimmedCurve)::DownCast(C),OS,compact);
480 else if ( TheType == STANDARD_TYPE(Geom_OffsetCurve)) {
481 Print(Handle(Geom_OffsetCurve)::DownCast(C),OS,compact);
484 GeomTools::GetUndefinedTypeHandler()->PrintCurve(C,OS,compact);
486 // OS << "****** UNKNOWN CURVE TYPE ******\n";
488 // cout << "****** UNKNOWN CURVE TYPE ******" << endl;
492 //=======================================================================
495 //=======================================================================
497 void GeomTools_CurveSet::Dump(Standard_OStream& OS)const
499 Standard_Integer i, nbsurf = myMap.Extent();
500 OS << "\n -------\n";
501 OS << "Dump of "<< nbsurf << " Curves ";
502 OS << "\n -------\n\n";
504 for (i = 1; i <= nbsurf; i++) {
505 OS << setw(4) << i << " : ";
506 PrintCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS,Standard_False);
511 //=======================================================================
514 //=======================================================================
516 void GeomTools_CurveSet::Write(Standard_OStream& OS)const
518 std::streamsize prec = OS.precision(17);
520 Standard_Integer i, nbcurve = myMap.Extent();
521 OS << "Curves "<< nbcurve << "\n";
523 Handle(Message_ProgressIndicator) progress = GetProgress();
524 Message_ProgressSentry PS(progress, "3D Curves", 0, nbcurve, 1);
525 for (i = 1; i <= nbcurve && PS.More(); i++, PS.Next()) {
526 PrintCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS,Standard_True);
532 //=======================================================================
535 //=======================================================================
537 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt& P)
539 Standard_Real X=0.,Y=0.,Z=0.;
540 GeomTools::GetReal(IS, X);
541 GeomTools::GetReal(IS, Y);
542 GeomTools::GetReal(IS, Z);
547 //=======================================================================
550 //=======================================================================
552 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir& D)
554 Standard_Real X=0.,Y=0.,Z=0.;
555 GeomTools::GetReal(IS, X);
556 GeomTools::GetReal(IS, Y);
557 GeomTools::GetReal(IS, Z);
563 //=======================================================================
564 //function : ReadCurve
566 //=======================================================================
568 static Standard_IStream& operator>>(Standard_IStream& IS,
569 Handle(Geom_Line)& L)
574 L = new Geom_Line(P,AX);
578 //=======================================================================
579 //function : ReadCurve
581 //=======================================================================
583 static Standard_IStream& operator>>(Standard_IStream& IS,
584 Handle(Geom_Circle)& C)
587 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
589 IS >> P >> A >> AX >> AY;
590 GeomTools::GetReal(IS, R);
591 C = new Geom_Circle(gp_Ax2(P,A,AX),R);
595 //=======================================================================
596 //function : ReadCurve
598 //=======================================================================
600 static Standard_IStream& operator>>(Standard_IStream& IS,
601 Handle(Geom_Ellipse)& E)
604 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
605 Standard_Real R1=0.,R2=0.;
606 IS >> P >> A >> AX >> AY;
607 GeomTools::GetReal(IS, R1);
608 GeomTools::GetReal(IS, R2);
609 E = new Geom_Ellipse(gp_Ax2(P,A,AX),R1,R2);
613 //=======================================================================
614 //function : ReadCurve
616 //=======================================================================
618 static Standard_IStream& operator>>(Standard_IStream& IS,
619 Handle(Geom_Parabola)& C)
622 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
624 IS >> P >> A >> AX >> AY;
625 GeomTools::GetReal(IS, R1);
626 C = new Geom_Parabola(gp_Ax2(P,A,AX),R1);
630 //=======================================================================
631 //function : ReadCurve
633 //=======================================================================
635 static Standard_IStream& operator>>(Standard_IStream& IS,
636 Handle(Geom_Hyperbola)& H)
639 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
640 Standard_Real R1=0.,R2=0.;
641 IS >> P >> A >> AX >> AY;
642 GeomTools::GetReal(IS, R1);
643 GeomTools::GetReal(IS, R2);
644 H = new Geom_Hyperbola(gp_Ax2(P,A,AX),R1,R2);
648 //=======================================================================
649 //function : ReadCurve
651 //=======================================================================
653 static Standard_IStream& operator>>(Standard_IStream& IS,
654 Handle(Geom_BezierCurve)& B)
656 Standard_Boolean rational=Standard_False;
660 Standard_Integer i=0,degree=0;
663 TColgp_Array1OfPnt poles(1,degree+1);
664 TColStd_Array1OfReal weights(1,degree+1);
666 for (i = 1; i <= degree+1; i++) {
669 GeomTools::GetReal(IS, weights(i));
673 B = new Geom_BezierCurve(poles,weights);
675 B = new Geom_BezierCurve(poles);
680 //=======================================================================
681 //function : ReadCurve
683 //=======================================================================
685 static Standard_IStream& operator>>(Standard_IStream& IS,
686 Handle(Geom_BSplineCurve)& B)
689 Standard_Boolean rational=Standard_False,periodic=Standard_False;
690 IS >> rational >> periodic;
693 Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;
694 IS >> degree >> nbpoles >> nbknots;
696 TColgp_Array1OfPnt poles(1,nbpoles);
697 TColStd_Array1OfReal weights(1,nbpoles);
699 for (i = 1; i <= nbpoles; i++) {
702 GeomTools::GetReal(IS, weights(i));
705 TColStd_Array1OfReal knots(1,nbknots);
706 TColStd_Array1OfInteger mults(1,nbknots);
708 for (i = 1; i <= nbknots; i++) {
709 GeomTools::GetReal(IS, knots(i));
714 B = new Geom_BSplineCurve(poles,weights,knots,mults,degree,periodic);
716 B = new Geom_BSplineCurve(poles,knots,mults,degree,periodic);
721 //=======================================================================
722 //function : ReadCurve
724 //=======================================================================
726 static Standard_IStream& operator>>(Standard_IStream& IS,
727 Handle(Geom_TrimmedCurve)& C)
729 Standard_Real p1=0.,p2=0.;
730 GeomTools::GetReal(IS, p1);
731 GeomTools::GetReal(IS, p2);
732 Handle(Geom_Curve) BC;
733 GeomTools_CurveSet::ReadCurve(IS,BC);
734 C = new Geom_TrimmedCurve(BC,p1,p2);
738 //=======================================================================
739 //function : ReadCurve
741 //=======================================================================
743 static Standard_IStream& operator>>(Standard_IStream& IS,
744 Handle(Geom_OffsetCurve)& C)
747 GeomTools::GetReal(IS, p);
750 Handle(Geom_Curve) BC;
751 GeomTools_CurveSet::ReadCurve(IS,BC);
752 C = new Geom_OffsetCurve(BC,p,D);
756 //=======================================================================
757 //function : ReadCurve
759 //=======================================================================
761 Standard_IStream& GeomTools_CurveSet::ReadCurve(Standard_IStream& IS,
762 Handle(Geom_Curve)& C)
764 Standard_Integer ctype;
773 Handle(Geom_Line) CC;
781 Handle(Geom_Circle) CC;
789 Handle(Geom_Ellipse) CC;
797 Handle(Geom_Parabola) CC;
805 Handle(Geom_Hyperbola) CC;
813 Handle(Geom_BezierCurve) CC;
821 Handle(Geom_BSplineCurve) CC;
829 Handle(Geom_TrimmedCurve) CC;
837 Handle(Geom_OffsetCurve) CC;
845 Handle(Geom_Curve) CC;
846 GeomTools::GetUndefinedTypeHandler()->ReadCurve(ctype,IS,CC);
851 catch(Standard_Failure) {
853 Handle(Standard_Failure) anExc = Standard_Failure::Caught();
854 cout <<"EXCEPTION in GeomTools_CurveSet::ReadCurve(..)!!!" << endl;
855 cout << anExc << endl;
862 //=======================================================================
865 //=======================================================================
867 void GeomTools_CurveSet::Read(Standard_IStream& IS)
871 if (strcmp(buffer,"Curves")) {
872 cout << "Not a Curve table"<<endl;
876 Handle(Geom_Curve) C;
877 Standard_Integer i, nbcurve;
880 Handle(Message_ProgressIndicator) progress = GetProgress();
881 Message_ProgressSentry PS(progress, "3D Curves", 0, nbcurve, 1);
882 for (i = 1; i <= nbcurve && PS.More(); i++, PS.Next()) {
883 GeomTools_CurveSet::ReadCurve(IS,C);
888 //=======================================================================
889 //function : GetProgress
891 //=======================================================================
893 Handle(Message_ProgressIndicator) GeomTools_CurveSet::GetProgress() const
898 //=======================================================================
899 //function : SetProgress
901 //=======================================================================
903 void GeomTools_CurveSet::SetProgress(const Handle(Message_ProgressIndicator)& PR)