0025748: Parallel version of progress indicator
[occt.git] / src / GeomTools / GeomTools_CurveSet.cxx
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
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <Geom_BezierCurve.hxx>
19 #include <Geom_BSplineCurve.hxx>
20 #include <Geom_Circle.hxx>
21 #include <Geom_Curve.hxx>
22 #include <Geom_Ellipse.hxx>
23 #include <Geom_Hyperbola.hxx>
24 #include <Geom_Line.hxx>
25 #include <Geom_OffsetCurve.hxx>
26 #include <Geom_Parabola.hxx>
27 #include <Geom_TrimmedCurve.hxx>
28 #include <GeomTools.hxx>
29 #include <GeomTools_CurveSet.hxx>
30 #include <GeomTools_UndefinedTypeHandler.hxx>
31 #include <gp_Circ.hxx>
32 #include <gp_Elips.hxx>
33 #include <gp_Hypr.hxx>
34 #include <gp_Lin.hxx>
35 #include <gp_Parab.hxx>
36 #include <Message_ProgressScope.hxx>
37 #include <Standard_ErrorHandler.hxx>
38 #include <Standard_Failure.hxx>
39 #include <Standard_OutOfRange.hxx>
40 #include <Standard_Stream.hxx>
41 #include <TColgp_Array1OfPnt.hxx>
42 #include <TColStd_Array1OfInteger.hxx>
43 #include <TColStd_Array1OfReal.hxx>
44
45 #define LINE      1
46 #define CIRCLE    2
47 #define ELLIPSE   3
48 #define PARABOLA  4
49 #define HYPERBOLA 5
50 #define BEZIER    6
51 #define BSPLINE   7
52 #define TRIMMED   8
53 #define OFFSET    9
54
55 //=======================================================================
56 //function : GeomTools_CurveSet
57 //purpose  : 
58 //=======================================================================
59
60 GeomTools_CurveSet::GeomTools_CurveSet() 
61 {
62 }
63
64
65 //=======================================================================
66 //function : Clear
67 //purpose  : 
68 //=======================================================================
69
70 void  GeomTools_CurveSet::Clear()
71 {
72   myMap.Clear();
73 }
74
75
76 //=======================================================================
77 //function : Add
78 //purpose  : 
79 //=======================================================================
80
81 Standard_Integer  GeomTools_CurveSet::Add(const Handle(Geom_Curve)& C)
82 {
83   return  (C.IsNull()) ? 0 : myMap.Add(C);
84 }
85
86
87 //=======================================================================
88 //function : Curve
89 //purpose  : 
90 //=======================================================================
91
92 Handle(Geom_Curve)  GeomTools_CurveSet::Curve
93        (const Standard_Integer I)const 
94 {
95   if (I <= 0 || I > myMap.Extent())
96         return Handle(Geom_Curve)();
97   return Handle(Geom_Curve)::DownCast(myMap(I));
98 }
99
100
101 //=======================================================================
102 //function : Index
103 //purpose  : 
104 //=======================================================================
105
106 Standard_Integer  GeomTools_CurveSet::Index
107   (const Handle(Geom_Curve)& S)const 
108 {
109   return S.IsNull() ? 0 : myMap.FindIndex(S);
110 }
111
112
113 //=======================================================================
114 //function : Print
115 //purpose  : 
116 //=======================================================================
117
118 static void Print(const gp_Pnt P,
119                   Standard_OStream& OS,
120                   const Standard_Boolean compact)
121 {
122   OS << P.X();
123   if (!compact) OS << ",";
124   OS << " ";
125   OS << P.Y();
126   if (!compact) OS << ",";
127   OS << " ";
128   OS << P.Z();
129   OS << " ";
130 }
131
132 //=======================================================================
133 //function : Print
134 //purpose  : 
135 //=======================================================================
136
137 static void Print(const gp_Dir D,
138                   Standard_OStream& OS,
139                   const Standard_Boolean compact)
140 {
141   OS << D.X();
142   if (!compact) OS << ",";
143   OS << " ";
144   OS << D.Y();
145   if (!compact) OS << ",";
146   OS << " ";
147   OS << D.Z();
148   OS << " ";
149 }
150
151
152 //=======================================================================
153 //function : Print
154 //purpose  : 
155 //=======================================================================
156
157 static void Print(const Handle(Geom_Line)& L,
158                          Standard_OStream& OS,
159                          const Standard_Boolean compact)
160 {
161   if (compact)
162     OS << LINE << " ";
163   else
164     OS << "Line";
165
166   gp_Lin C = L->Lin();
167   if (!compact) OS << "\n  Origin :";
168   Print(C.Location(),OS,compact);
169   if (!compact) OS << "\n  Axis   :";
170   Print(C.Direction(),OS,compact);
171   if (!compact) OS << "\n";
172   OS << "\n";
173 }
174
175 //=======================================================================
176 //function : Print
177 //purpose  : 
178 //=======================================================================
179
180 static void Print(const Handle(Geom_Circle)& CC,
181                          Standard_OStream& OS,
182                          const Standard_Boolean compact)
183 {
184   if (compact)
185     OS << CIRCLE << " ";
186   else
187     OS << "Circle";
188
189   gp_Circ C = CC->Circ();
190   if (!compact) OS << "\n  Center :";
191   Print(C.Location(),OS,compact);
192   if (!compact) OS << "\n  Axis   :";
193   Print(C.Axis().Direction(),OS,compact);
194   if (!compact) OS << "\n  XAxis  :";
195   Print(C.XAxis().Direction(),OS,compact);
196   if (!compact) OS << "\n  YAxis  :";
197   Print(C.YAxis().Direction(),OS,compact);
198   if (!compact) OS << "\n  Radius :";
199   OS << C.Radius();
200   if (!compact) OS << "\n";
201   OS << "\n";
202 }
203
204 //=======================================================================
205 //function : Print
206 //purpose  : 
207 //=======================================================================
208
209 static void Print(const Handle(Geom_Ellipse)& E,
210                          Standard_OStream& OS,
211                          const Standard_Boolean compact)
212 {
213   if (compact)
214     OS << ELLIPSE << " ";
215   else
216     OS << "Ellipse";
217
218   gp_Elips C = E->Elips();
219   if (!compact) OS << "\n  Center :";
220   Print(C.Location(),OS,compact);
221   if (!compact) OS << "\n  Axis   :";
222   Print(C.Axis().Direction(),OS,compact);
223   if (!compact) OS << "\n  XAxis  :";
224   Print(C.XAxis().Direction(),OS,compact);
225   if (!compact) OS << "\n  YAxis  :";
226   Print(C.YAxis().Direction(),OS,compact);
227   if (!compact) OS << "\n  Radii  :";
228   OS << C.MajorRadius();
229   if (!compact) OS << ",";
230   OS << " ";
231   OS << C.MinorRadius();
232   if (!compact) OS << "\n";
233   OS << "\n";
234 }
235
236 //=======================================================================
237 //function : Print
238 //purpose  : 
239 //=======================================================================
240
241 static void Print(const Handle(Geom_Parabola)& P,
242                          Standard_OStream& OS,
243                          const Standard_Boolean compact)
244 {
245   if (compact)
246     OS << PARABOLA << " ";
247   else
248     OS << "Parabola";
249
250   gp_Parab C = P->Parab();
251   if (!compact) OS << "\n  Center :";
252   Print(C.Location(),OS,compact);
253   if (!compact) OS << "\n  Axis   :";
254   Print(C.Axis().Direction(),OS,compact);
255   if (!compact) OS << "\n  XAxis  :";
256   Print(C.XAxis().Direction(),OS,compact);
257   if (!compact) OS << "\n  YAxis  :";
258   Print(C.YAxis().Direction(),OS,compact);
259   if (!compact) OS << "\n  Focal  :";
260   OS << C.Focal();
261   if (!compact) OS << "\n";
262   OS << "\n";
263 }
264
265 //=======================================================================
266 //function : Print
267 //purpose  : 
268 //=======================================================================
269
270 static void Print(const Handle(Geom_Hyperbola)& H,
271                          Standard_OStream& OS,
272                          const Standard_Boolean compact)
273 {
274   if (compact)
275     OS << HYPERBOLA << " ";
276   else
277     OS << "Hyperbola";
278
279   gp_Hypr C = H->Hypr();
280   if (!compact) OS << "\n  Center :";
281   Print(C.Location(),OS,compact);
282   if (!compact) OS << "\n  Axis   :";
283   Print(C.Axis().Direction(),OS,compact);
284   if (!compact) OS << "\n  XAxis  :";
285   Print(C.XAxis().Direction(),OS,compact);
286   if (!compact) OS << "\n  YAxis  :";
287   Print(C.YAxis().Direction(),OS,compact);
288   if (!compact) OS << "\n  Radii  :";
289   OS << C.MajorRadius();
290   if (!compact) OS << ",";
291   OS << " ";
292   OS << C.MinorRadius();
293   if (!compact) OS << "\n";
294   OS << "\n";
295 }
296
297 //=======================================================================
298 //function : Print
299 //purpose  : 
300 //=======================================================================
301
302 static void Print(const Handle(Geom_BezierCurve)& B,
303                          Standard_OStream& OS,
304                          const Standard_Boolean compact)
305 {
306   if (compact)
307     OS << BEZIER << " ";
308   else
309     OS << "BezierCurve";
310
311   Standard_Boolean rational = B->IsRational();
312   if (compact)
313     OS << (rational ? 1 : 0) << " ";
314   else {
315     if (rational) 
316       OS << " rational";
317   }
318
319   // poles and weights
320   Standard_Integer i,degree = B->Degree();
321   if (!compact) OS << "\n  Degree :";
322   OS << degree << " ";
323   
324   for (i = 1; i <= degree+1; i++) {
325     if (!compact) OS << "\n  "<<std::setw(2)<<i<<" : ";
326     Print(B->Pole(i),OS,compact);
327     if (rational)
328       OS << " " << B->Weight(i);
329     if (compact)
330       OS << " ";
331   }
332   OS << "\n";
333   if (!compact) OS << "\n";
334 }
335
336 //=======================================================================
337 //function : Print
338 //purpose  : 
339 //=======================================================================
340
341 static void Print(const Handle(Geom_BSplineCurve)& B,
342                          Standard_OStream& OS,
343                          const Standard_Boolean compact)
344 {
345   if (compact)
346     OS << BSPLINE << " ";
347   else
348     OS << "BSplineCurve";
349
350
351   Standard_Boolean rational = B->IsRational();
352   if (compact)
353     OS << (rational ? 1 : 0) << " ";
354   else {
355     if (rational) 
356       OS << " rational";
357   }
358
359   Standard_Boolean periodic = B->IsPeriodic();
360   if (compact)
361     OS << (periodic ? 1 : 0)<< " ";
362   else {
363     if (periodic) 
364       OS << " periodic";
365   }
366
367   // poles and weights
368   Standard_Integer i,degree,nbpoles,nbknots;
369   degree = B->Degree();
370   nbpoles = B->NbPoles();
371   nbknots = B->NbKnots();
372   if (!compact) OS << "\n  Degree ";
373   else OS << " ";
374   OS << degree;
375   if (!compact) OS << ",";
376   OS << " ";
377   OS << nbpoles;
378   if (!compact) OS << " Poles,";
379   OS << " ";
380   OS << nbknots << " ";
381   if (!compact) OS << " Knots\n";
382   
383   if (!compact) OS << "Poles :\n";
384   for (i = 1; i <= nbpoles; i++) {
385     if (!compact) OS << "\n  "<<std::setw(2)<<i<<" : ";
386     else OS << " ";
387     Print(B->Pole(i),OS,compact);
388     if (rational)
389       OS << " " << B->Weight(i);
390   }
391   OS << "\n";
392
393   if (!compact) OS << "Knots :\n";
394   for (i = 1; i <= nbknots; i++) {
395     if (!compact) OS << "\n  "<<std::setw(2)<<i<<" : ";
396     OS << " " << B->Knot(i) << " " << B->Multiplicity(i);
397   }
398
399   OS << "\n";
400   if (!compact) OS << "\n";
401 }
402
403 //=======================================================================
404 //function : Print
405 //purpose  : 
406 //=======================================================================
407
408 static void Print(const Handle(Geom_TrimmedCurve)& C,
409                          Standard_OStream& OS,
410                          const Standard_Boolean compact)
411 {
412   if (compact)
413     OS << TRIMMED << " ";
414   else
415     OS << "Trimmed curve\n";
416   if (!compact) OS << "Parameters : ";
417   OS << C->FirstParameter() << " " << C->LastParameter() << "\n";
418   if (!compact) OS << "Basis curve :\n";
419   GeomTools_CurveSet::PrintCurve(C->BasisCurve(),OS,compact);
420 }
421
422 //=======================================================================
423 //function : Print
424 //purpose  : 
425 //=======================================================================
426
427 static void Print(const Handle(Geom_OffsetCurve)& C,
428                          Standard_OStream& OS,
429                          const Standard_Boolean compact)
430 {
431   if (compact)
432     OS << OFFSET << " ";
433   else
434     OS << "OffsetCurve";
435   if (!compact) OS << "Offset : ";
436   OS << C->Offset() <<  "\n";
437   if (!compact) OS << "Direction : ";
438   Print(C->Direction(),OS,compact);
439   OS << "\n";
440   if (!compact) OS << "Basis curve :\n";
441   GeomTools_CurveSet::PrintCurve(C->BasisCurve(),OS,compact);
442 }
443
444 //=======================================================================
445 //function : Print
446 //purpose  : 
447 //=======================================================================
448
449 void GeomTools_CurveSet::PrintCurve(const Handle(Geom_Curve)& C,
450                                     Standard_OStream& OS,
451                                     const Standard_Boolean compact)
452 {
453   Handle(Standard_Type) TheType = C->DynamicType();
454
455   if ( TheType ==STANDARD_TYPE(Geom_Line)) {
456     Print(Handle(Geom_Line)::DownCast(C),OS,compact);
457   }
458   else if ( TheType ==  STANDARD_TYPE(Geom_Circle)) {
459     Print(Handle(Geom_Circle)::DownCast(C),OS,compact);
460   }
461   else if ( TheType == STANDARD_TYPE(Geom_Ellipse)) {
462     Print(Handle(Geom_Ellipse)::DownCast(C),OS,compact);
463   }
464   else if ( TheType == STANDARD_TYPE(Geom_Parabola)) {
465     Print(Handle(Geom_Parabola)::DownCast(C),OS,compact);
466   }
467   else if ( TheType == STANDARD_TYPE(Geom_Hyperbola)) {
468     Print(Handle(Geom_Hyperbola)::DownCast(C),OS,compact);
469   }
470   else if ( TheType == STANDARD_TYPE(Geom_BezierCurve)) {
471     Print(Handle(Geom_BezierCurve)::DownCast(C),OS,compact);
472   }
473   else if ( TheType == STANDARD_TYPE(Geom_BSplineCurve)) {
474     Print(Handle(Geom_BSplineCurve)::DownCast(C),OS,compact);
475   }
476   else if ( TheType == STANDARD_TYPE(Geom_TrimmedCurve)) {
477     Print(Handle(Geom_TrimmedCurve)::DownCast(C),OS,compact);
478   }
479   else if ( TheType == STANDARD_TYPE(Geom_OffsetCurve)) {
480     Print(Handle(Geom_OffsetCurve)::DownCast(C),OS,compact);
481   }
482   else {
483     GeomTools::GetUndefinedTypeHandler()->PrintCurve(C,OS,compact);
484     //if (!compact)
485     //  OS << "****** UNKNOWN CURVE TYPE ******\n";
486     //else 
487     //  std::cout << "****** UNKNOWN CURVE TYPE ******" << std::endl;
488   }
489 }
490
491 //=======================================================================
492 //function : Dump
493 //purpose  : 
494 //=======================================================================
495
496 void  GeomTools_CurveSet::Dump(Standard_OStream& OS)const 
497 {
498   Standard_Integer i, nbsurf = myMap.Extent();
499   OS << "\n -------\n";
500   OS << "Dump of "<< nbsurf << " Curves ";
501   OS << "\n -------\n\n";
502
503   for (i = 1; i <= nbsurf; i++) {
504     OS << std::setw(4) << i << " : ";
505     PrintCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS,Standard_False);
506   }
507 }
508
509
510 //=======================================================================
511 //function : Write
512 //purpose  : 
513 //=======================================================================
514
515 void  GeomTools_CurveSet::Write(Standard_OStream& OS, const Message_ProgressRange& theProgress)const
516 {
517   std::streamsize  prec = OS.precision(17);
518
519   Standard_Integer i, nbcurve = myMap.Extent();
520   OS << "Curves "<< nbcurve << "\n";
521   Message_ProgressScope aPS(theProgress, "3D Curves", nbcurve);
522   for (i = 1; i <= nbcurve && aPS.More(); i++, aPS.Next()) {
523     PrintCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS,Standard_True);
524   }
525   OS.precision(prec);
526 }
527
528
529 //=======================================================================
530 //function : ReadPnt
531 //purpose  : 
532 //=======================================================================
533
534 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt& P)
535 {
536   Standard_Real X=0.,Y=0.,Z=0.;
537   GeomTools::GetReal(IS, X);
538   GeomTools::GetReal(IS, Y);
539   GeomTools::GetReal(IS, Z);
540   P.SetCoord(X,Y,Z);
541   return IS;
542 }
543
544 //=======================================================================
545 //function : ReadDir
546 //purpose  : 
547 //=======================================================================
548
549 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir& D)
550 {
551   Standard_Real X=0.,Y=0.,Z=0.;
552   GeomTools::GetReal(IS, X);
553   GeomTools::GetReal(IS, Y);
554   GeomTools::GetReal(IS, Z);
555   D.SetCoord(X,Y,Z);
556   return IS;
557 }
558
559
560 //=======================================================================
561 //function : ReadCurve
562 //purpose  : 
563 //=======================================================================
564
565 static Standard_IStream& operator>>(Standard_IStream& IS,
566                                     Handle(Geom_Line)& L)
567 {
568   gp_Pnt P(0.,0.,0.);
569   gp_Dir AX(1.,0.,0.);
570   IS >> P >> AX;
571   L = new Geom_Line(P,AX);
572   return IS;
573 }
574
575 //=======================================================================
576 //function : ReadCurve
577 //purpose  : 
578 //=======================================================================
579
580 static Standard_IStream& operator>>(Standard_IStream& IS,
581                                     Handle(Geom_Circle)& C)
582 {
583   gp_Pnt P(0.,0.,0.);
584   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
585   Standard_Real R=0.;
586   IS >> P >> A >> AX >> AY;
587   GeomTools::GetReal(IS, R);
588   C = new Geom_Circle(gp_Ax2(P,A,AX),R);
589   return IS;
590 }
591
592 //=======================================================================
593 //function : ReadCurve
594 //purpose  : 
595 //=======================================================================
596
597 static Standard_IStream& operator>>(Standard_IStream& IS,
598                                     Handle(Geom_Ellipse)& E)
599 {
600   gp_Pnt P(0.,0.,0.);
601   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
602   Standard_Real R1=0.,R2=0.;
603   IS >> P >> A >> AX >> AY;
604   GeomTools::GetReal(IS, R1);
605   GeomTools::GetReal(IS, R2);
606   E = new Geom_Ellipse(gp_Ax2(P,A,AX),R1,R2);
607   return IS;
608 }
609
610 //=======================================================================
611 //function : ReadCurve
612 //purpose  : 
613 //=======================================================================
614
615 static Standard_IStream& operator>>(Standard_IStream& IS,
616                                     Handle(Geom_Parabola)& C)
617 {
618   gp_Pnt P(0.,0.,0.);
619   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
620   Standard_Real R1=0.;
621   IS >> P >> A >> AX >> AY;
622   GeomTools::GetReal(IS, R1);
623   C = new Geom_Parabola(gp_Ax2(P,A,AX),R1);
624   return IS;
625 }
626
627 //=======================================================================
628 //function : ReadCurve
629 //purpose  : 
630 //=======================================================================
631
632 static Standard_IStream& operator>>(Standard_IStream& IS,
633                                     Handle(Geom_Hyperbola)& H)
634 {
635   gp_Pnt P(0.,0.,0.);
636   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
637   Standard_Real R1=0.,R2=0.;
638   IS >> P >> A >> AX >> AY;
639   GeomTools::GetReal(IS, R1);
640   GeomTools::GetReal(IS, R2);
641   H = new Geom_Hyperbola(gp_Ax2(P,A,AX),R1,R2);
642   return IS;
643 }
644
645 //=======================================================================
646 //function : ReadCurve
647 //purpose  : 
648 //=======================================================================
649
650 static Standard_IStream& operator>>(Standard_IStream& IS,
651                                     Handle(Geom_BezierCurve)& B)
652 {
653   Standard_Boolean rational=Standard_False;
654   IS >> rational;
655
656   // poles and weights
657   Standard_Integer i=0,degree=0;
658   IS >> degree;
659
660   TColgp_Array1OfPnt poles(1,degree+1);
661   TColStd_Array1OfReal weights(1,degree+1);
662   
663   for (i = 1; i <= degree+1; i++) {
664     IS >> poles(i);
665     if (rational)
666       GeomTools::GetReal(IS, weights(i));
667   }
668
669   if (rational)
670     B = new Geom_BezierCurve(poles,weights);
671   else
672     B = new Geom_BezierCurve(poles);
673
674   return IS;
675 }
676
677 //=======================================================================
678 //function : ReadCurve
679 //purpose  : 
680 //=======================================================================
681
682 static Standard_IStream& operator>>(Standard_IStream& IS,
683                                     Handle(Geom_BSplineCurve)& B)
684 {
685
686   Standard_Boolean rational=Standard_False,periodic=Standard_False;
687   IS >> rational >> periodic;
688
689   // poles and weights
690   Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;
691   IS >> degree >> nbpoles >> nbknots;
692
693   TColgp_Array1OfPnt poles(1,nbpoles);
694   TColStd_Array1OfReal weights(1,nbpoles);
695   
696   for (i = 1; i <= nbpoles; i++) {
697     IS >> poles(i);
698     if (rational)
699       GeomTools::GetReal(IS, weights(i));
700   }
701
702   TColStd_Array1OfReal knots(1,nbknots);
703   TColStd_Array1OfInteger mults(1,nbknots);
704
705   for (i = 1; i <= nbknots; i++) {
706     GeomTools::GetReal(IS, knots(i)); 
707     IS >> mults(i);
708   }
709
710   if (rational)
711     B = new Geom_BSplineCurve(poles,weights,knots,mults,degree,periodic);
712   else
713     B = new Geom_BSplineCurve(poles,knots,mults,degree,periodic);
714   
715   return IS;
716 }
717
718 //=======================================================================
719 //function : ReadCurve
720 //purpose  : 
721 //=======================================================================
722
723 static Standard_IStream& operator>>(Standard_IStream& IS,
724                                     Handle(Geom_TrimmedCurve)& C)
725 {
726   Standard_Real p1=0.,p2=0.;
727   GeomTools::GetReal(IS, p1);
728   GeomTools::GetReal(IS, p2);
729   Handle(Geom_Curve) BC = GeomTools_CurveSet::ReadCurve(IS);
730   C = new Geom_TrimmedCurve(BC,p1,p2);
731   return IS;
732 }
733
734 //=======================================================================
735 //function : ReadCurve
736 //purpose  : 
737 //=======================================================================
738
739 static Standard_IStream& operator>>(Standard_IStream& IS,
740                                     Handle(Geom_OffsetCurve)& C)
741 {
742   Standard_Real p=0.;
743   GeomTools::GetReal(IS, p);
744   gp_Dir D(1.,0.,0.);
745   IS >> D;
746   Handle(Geom_Curve) BC = GeomTools_CurveSet::ReadCurve(IS);
747   C = new Geom_OffsetCurve(BC,p,D);
748   return IS;
749 }
750
751 //=======================================================================
752 //function : ReadCurve
753 //purpose  : 
754 //=======================================================================
755
756 Handle(Geom_Curve) GeomTools_CurveSet::ReadCurve (Standard_IStream& IS)
757 {
758   Standard_Integer ctype;
759
760   Handle(Geom_Curve) C;
761   try {
762     OCC_CATCH_SIGNALS
763     IS >> ctype;
764     switch (ctype) {
765
766     case LINE :
767       {
768         Handle(Geom_Line) CC;
769         IS >> CC;
770         C = CC;
771       }
772       break;
773
774     case CIRCLE :
775       {
776         Handle(Geom_Circle) CC;
777         IS >> CC;
778         C = CC;
779       }
780       break;
781
782     case ELLIPSE :
783       {
784         Handle(Geom_Ellipse) CC;
785         IS >> CC;
786         C = CC;
787       }
788       break;
789
790     case PARABOLA :
791       {
792         Handle(Geom_Parabola) CC;
793         IS >> CC;
794         C = CC;
795       }
796       break;
797
798     case HYPERBOLA :
799       {
800         Handle(Geom_Hyperbola) CC;
801         IS >> CC;
802         C = CC;
803       }
804       break;
805
806     case BEZIER :
807       {
808         Handle(Geom_BezierCurve) CC;
809         IS >> CC;
810         C = CC;
811       }
812       break;
813
814     case BSPLINE :
815       {
816         Handle(Geom_BSplineCurve) CC;
817         IS >> CC;
818         C = CC;
819       }
820       break;
821
822     case TRIMMED :
823       {
824         Handle(Geom_TrimmedCurve) CC;
825         IS >> CC;
826         C = CC;
827       }
828       break;
829
830     case OFFSET :
831       {
832         Handle(Geom_OffsetCurve) CC;
833         IS >> CC;
834         C = CC;
835       }
836       break;
837       
838     default:
839       {
840         Handle(Geom_Curve) CC;
841         GeomTools::GetUndefinedTypeHandler()->ReadCurve(ctype,IS,CC);
842         C = CC;
843       }
844     }
845   }
846   catch(Standard_Failure const& anException) {
847 #ifdef OCCT_DEBUG
848     std::cout <<"EXCEPTION in GeomTools_CurveSet::ReadCurve(..)!!!" << std::endl;
849     std::cout << anException << std::endl;
850 #endif
851     (void)anException;
852   }
853   return C;
854 }
855
856 //=======================================================================
857 //function : Read
858 //purpose  : 
859 //=======================================================================
860
861 void  GeomTools_CurveSet::Read(Standard_IStream& IS, const Message_ProgressRange& theProgress)
862 {
863   char buffer[255];
864   IS >> buffer;
865   if (strcmp(buffer,"Curves")) {
866     std::cout << "Not a Curve table"<<std::endl;
867     return;
868   }
869
870   Standard_Integer i, nbcurve;
871   IS >> nbcurve;
872   Message_ProgressScope aPS(theProgress, "3D Curves", nbcurve);
873   for (i = 1; i <= nbcurve && aPS.More(); i++, aPS.Next()) {
874     Handle(Geom_Curve) C = GeomTools_CurveSet::ReadCurve (IS);
875     myMap.Add(C);
876   }
877 }