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