c680985a838be81e43de9c3a99f31ab674759cd9
[occt.git] / src / TopTools / TopTools_ShapeSet.cxx
1 // Created on: 1993-07-02
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 // Modified:    02 Nov 2000: BUC60769. JMB, PTV.  In order to be able to read BRep 
18 //              is run, we need the following modifications.
19 //              On Unix platforms:
20 //              ------------------
21 //                In method Read(Standard_IStream &IS), during the version 
22 //                authentification we cut last '\r' in the line (which will
23 //                be present if file is in DOS coding)
24
25 #include <Message_ProgressIndicator.hxx>
26 #include <Message_ProgressSentry.hxx>
27 #include <TCollection_AsciiString.hxx>
28 #include <TopoDS_Iterator.hxx>
29 #include <TopoDS_Shape.hxx>
30 #include <TopTools_LocationSet.hxx>
31 #include <TopTools_ShapeSet.hxx>
32
33 #include <locale.h>
34 #include <string.h>
35 static const char* Version  = "CASCADE Topology V1, (c) Matra-Datavision";
36 static const char* Version2 = "CASCADE Topology V2, (c) Matra-Datavision";
37
38 //=======================================================================
39 //function : TopTools_ShapeSet
40 //purpose  : 
41 //=======================================================================
42
43 TopTools_ShapeSet::TopTools_ShapeSet() : myFormatNb(1)
44 {
45 }
46
47 TopTools_ShapeSet::~TopTools_ShapeSet()
48 {}
49
50 //=======================================================================
51 //function : SetFormatNb
52 //purpose  : 
53 //=======================================================================
54 void TopTools_ShapeSet::SetFormatNb(const Standard_Integer theFormatNb)
55 {
56   myFormatNb = theFormatNb;
57 }
58
59 //=======================================================================
60 //function : FormatNb
61 //purpose  : 
62 //=======================================================================
63 Standard_Integer TopTools_ShapeSet::FormatNb() const
64 {
65   return myFormatNb;
66 }
67
68 //=======================================================================
69 //function : Clear
70 //purpose  : 
71 //=======================================================================
72
73 void  TopTools_ShapeSet::Clear()
74 {
75   myShapes.Clear();
76   myLocations.Clear();
77 }
78
79
80 //=======================================================================
81 //function : Add
82 //purpose  : 
83 //=======================================================================
84
85 Standard_Integer  TopTools_ShapeSet::Add(const TopoDS_Shape& S)
86 {
87   if (S.IsNull()) return 0;
88   myLocations.Add(S.Location());
89   TopoDS_Shape S2 = S;
90   S2.Location(TopLoc_Location());
91   Standard_Integer index = myShapes.FindIndex(S2);
92   if (index == 0) {
93     AddGeometry(S2);
94
95     for (TopoDS_Iterator its(S2,Standard_False,Standard_False);
96          its.More(); its.Next())
97       Add(its.Value());
98     index = myShapes.Add(S2);
99   }
100   return index;
101 }
102
103
104 //=======================================================================
105 //function : Shape
106 //purpose  : 
107 //=======================================================================
108
109 const TopoDS_Shape&  TopTools_ShapeSet::Shape(const Standard_Integer I)const 
110 {
111   return myShapes(I);
112 }
113
114 //=======================================================================
115 //function : Index
116 //purpose  : 
117 //=======================================================================
118
119 Standard_Integer TopTools_ShapeSet::Index(const TopoDS_Shape& S) const
120 {
121   return myShapes.FindIndex(S);
122 }
123
124 //=======================================================================
125 //function : Locations
126 //purpose  : 
127 //=======================================================================
128
129 const TopTools_LocationSet&  TopTools_ShapeSet::Locations()const 
130 {
131   return myLocations;
132 }
133
134
135 //=======================================================================
136 //function : ChangeLocations
137 //purpose  : 
138 //=======================================================================
139
140 TopTools_LocationSet&  TopTools_ShapeSet::ChangeLocations()
141 {
142   return myLocations;
143 }
144
145 //=======================================================================
146 //function : PrintShapeEnum
147 //purpose  : 
148 //=======================================================================
149
150 static void PrintShapeEnum(const TopAbs_ShapeEnum T, 
151                            Standard_OStream& S, 
152                            Standard_Boolean C)
153 {
154   switch(T) {
155     
156   case TopAbs_VERTEX :
157     if (C) S << "Ve"; else S << "VERTEX   ";
158     break;
159     
160   case TopAbs_EDGE :
161     if (C) S << "Ed"; else S << "EDGE     ";
162     break;
163     
164   case TopAbs_WIRE :
165     if (C) S << "Wi"; else S << "WIRE     ";
166     break;
167     
168   case TopAbs_FACE :
169     if (C) S << "Fa"; else S << "FACE     ";
170     break;
171     
172   case TopAbs_SHELL :
173     if (C) S << "Sh"; else S << "SHELL    ";
174     break;
175     
176   case TopAbs_SOLID :
177     if (C) S << "So"; else S << "SOLID    ";
178     break;
179     
180   case TopAbs_COMPSOLID :
181     if (C) S << "CS"; else S << "COMPSOLID";
182     break;
183     
184   case TopAbs_COMPOUND :
185     if (C) S << "Co"; else S << "COMPOUND ";
186     break;
187     
188   case TopAbs_SHAPE :
189     if (C) S << "Sp"; else S << "SHAPE";
190     break;
191   }
192 }
193
194 //=======================================================================
195 //function : PrintOrientation
196 //purpose  : 
197 //=======================================================================
198
199 static void PrintOrientation(const TopAbs_Orientation O, 
200                              Standard_OStream& S, 
201                              Standard_Boolean C)
202 {
203   switch(O) {
204     
205   case TopAbs_FORWARD :
206     if (C) S << "+"; else S << "FORWARD";
207     break;
208     
209   case TopAbs_REVERSED :
210     if (C) S << "-"; else S << "REVERSED";
211     break;
212     
213   case TopAbs_INTERNAL :
214     if (C) S << "i"; else S << "INTERNAL";
215     break;
216     
217   case TopAbs_EXTERNAL :
218     if (C) S << "e"; else S << "EXTERNAL";
219     break;
220   }
221 }
222
223 //=======================================================================
224 //function : DumpExtent 
225 //purpose  : Dump number of shapes.
226 //=======================================================================
227
228 Standard_OStream& TopTools_ShapeSet::DumpExtent(Standard_OStream& OS)const 
229 {
230
231  Standard_Integer nbVERTEX = 0;
232  Standard_Integer nbEDGE = 0;
233  Standard_Integer nbWIRE = 0;
234  Standard_Integer nbFACE = 0;
235  Standard_Integer nbSHELL = 0;
236  Standard_Integer nbSOLID = 0;
237  Standard_Integer nbCOMPSOLID = 0;
238  Standard_Integer nbCOMPOUND = 0;
239  Standard_Integer nbSHAPE = myShapes.Extent();
240
241  for (Standard_Integer i = 1; i <= nbSHAPE; i++) {
242
243    switch(myShapes(i).ShapeType()) {
244     
245    case TopAbs_VERTEX :
246      nbVERTEX++;
247      break;
248      
249    case TopAbs_EDGE :
250      nbEDGE++;
251      break;
252      
253    case TopAbs_WIRE :
254      nbWIRE++;
255      break;
256      
257    case TopAbs_FACE :
258      nbFACE++;
259      break;
260      
261    case TopAbs_SHELL :
262      nbSHELL++;
263      break;
264      
265    case TopAbs_SOLID :
266      nbSOLID++;
267      break;
268      
269    case TopAbs_COMPSOLID :
270      nbCOMPSOLID++;
271      break;
272      
273    case TopAbs_COMPOUND :
274      nbCOMPOUND++;
275      break;
276      
277    case TopAbs_SHAPE :
278      break;
279    }
280  }
281
282  
283  OS << " VERTEX    : " << nbVERTEX << "\n";
284  OS << " EDGE      : " << nbEDGE << "\n";
285  OS << " WIRE      : " << nbWIRE << "\n";
286  OS << " FACE      : " << nbFACE << "\n";
287  OS << " SHELL     : " << nbSHELL << "\n";
288  OS << " SOLID     : " << nbSOLID << "\n";
289  OS << " COMPSOLID : " << nbCOMPSOLID << "\n";
290  OS << " COMPOUND  : " << nbCOMPOUND << "\n";
291  OS << " SHAPE     : " << nbSHAPE << "\n";
292
293  return OS;
294 }
295
296 //=======================================================================
297 //function : DumpExtent 
298 //purpose  : Dump number of shapes.
299 //=======================================================================
300
301 void TopTools_ShapeSet::DumpExtent(TCollection_AsciiString& S)const 
302 {
303
304  Standard_Integer nbVERTEX = 0;
305  Standard_Integer nbEDGE = 0;
306  Standard_Integer nbWIRE = 0;
307  Standard_Integer nbFACE = 0;
308  Standard_Integer nbSHELL = 0;
309  Standard_Integer nbSOLID = 0;
310  Standard_Integer nbCOMPSOLID = 0;
311  Standard_Integer nbCOMPOUND = 0;
312  Standard_Integer nbSHAPE = myShapes.Extent();
313
314  for (Standard_Integer i = 1; i <= nbSHAPE; i++) {
315
316    switch(myShapes(i).ShapeType()) {
317     
318    case TopAbs_VERTEX :
319      nbVERTEX++;
320      break;
321      
322    case TopAbs_EDGE :
323      nbEDGE++;
324      break;
325      
326    case TopAbs_WIRE :
327      nbWIRE++;
328      break;
329      
330    case TopAbs_FACE :
331      nbFACE++;
332      break;
333      
334    case TopAbs_SHELL :
335      nbSHELL++;
336      break;
337      
338    case TopAbs_SOLID :
339      nbSOLID++;
340      break;
341      
342    case TopAbs_COMPSOLID :
343      nbCOMPSOLID++;
344      break;
345      
346    case TopAbs_COMPOUND :
347      nbCOMPOUND++;
348      break;
349      
350    case TopAbs_SHAPE :
351      break;
352    }
353  }
354
355  S = S + " VERTEX    : " + TCollection_AsciiString(nbVERTEX) + "\n";
356  S = S + " EDGE      : " + TCollection_AsciiString(nbEDGE) + "\n";
357  S = S + " WIRE      : " + TCollection_AsciiString(nbWIRE) + "\n";
358  S = S + " FACE      : " + TCollection_AsciiString(nbFACE) + "\n";
359  S = S + " SHELL     : " + TCollection_AsciiString(nbSHELL) + "\n";
360  S = S + " SOLID     : " + TCollection_AsciiString(nbSOLID) + "\n";
361  S = S + " COMPSOLID : " + TCollection_AsciiString(nbCOMPSOLID) + "\n";
362  S = S + " COMPOUND  : " + TCollection_AsciiString(nbCOMPOUND) + "\n";
363  S = S + " SHAPE     : " + TCollection_AsciiString(nbSHAPE) + "\n";
364 }
365
366
367 //=======================================================================
368 //function : Dump
369 //purpose  : 
370 //=======================================================================
371
372 void  TopTools_ShapeSet::Dump(Standard_OStream& OS)const 
373 {
374   //-----------------------------------------
375   // dump the shapes
376   //-----------------------------------------
377
378   Standard_Integer i, nbShapes = myShapes.Extent();
379   
380   OS << "\nDump of " << nbShapes << " TShapes";
381   OS << "\n\n-----------------\n\n";
382
383   OS << "Flags : Free, Modified, Checked, Orientable, Closed, Infinite, Convex, Locked";
384   OS << "\n\n";
385   
386   for (i = nbShapes; i >= 1; i--) {
387     
388     const TopoDS_Shape& S = myShapes(i);
389     OS << "TShape # " << nbShapes - i + 1 << " : ";
390     
391     // Type and flags
392
393     PrintShapeEnum(S.ShapeType(),OS,Standard_False);
394     OS << " ";
395     OS << (S.Free()       ? 1 : 0);
396     OS << (S.Modified()   ? 1 : 0);
397     OS << (S.Checked()    ? 1 : 0);
398     OS << (S.Orientable() ? 1 : 0);
399     OS << (S.Closed()     ? 1 : 0);
400     OS << (S.Infinite()   ? 1 : 0);
401     OS << (S.Convex()     ? 1 : 0);
402     OS << (S.Locked()     ? 1 : 0);
403     OS << " " << (void*) &(*S.TShape()) <<"\n";
404
405     // sub-shapes
406     OS << "    ";
407     TopoDS_Iterator its(S,Standard_False,Standard_False);
408     while (its.More()) {
409       const TopoDS_Shape& sub = its.Value();
410       PrintOrientation(sub.Orientation(),OS,Standard_True);
411       OS<<nbShapes - myShapes.FindIndex(sub.Located(TopLoc_Location())) + 1;
412       if (!sub.Location().IsIdentity()) 
413         OS << "(L" << myLocations.Index(sub.Location()) << ")";
414       OS << " ";
415       its.Next();
416     }
417     OS << "\n";
418
419     // Geometry
420
421     DumpGeometry(S,OS);
422   }
423     
424   
425   //-----------------------------------------
426   // dump the geometry
427   //-----------------------------------------
428
429   DumpGeometry(OS);
430
431   //-----------------------------------------
432   // dump the locations
433   //-----------------------------------------
434
435   myLocations.Dump(OS);
436
437   OS << "\n";
438 }
439
440
441 //=======================================================================
442 //function : Write
443 //purpose  : 
444 //=======================================================================
445
446 void  TopTools_ShapeSet::Write(Standard_OStream& OS)
447 {
448   // always use C locale for writing shapes
449   std::locale anOldLocale = OS.imbue (std::locale::classic());
450
451   // use 15-digit precision
452   std::streamsize prec = OS.precision(15);
453
454   // write the copyright
455   if (myFormatNb == 2)
456     OS << "\n" << Version2 << "\n";
457   else
458     OS << "\n" << Version << "\n";
459
460   //-----------------------------------------
461   // write the locations
462   //-----------------------------------------
463
464   if ( !myProgress.IsNull() ) 
465     myProgress->NewScope ( 10, "Locations" );
466   myLocations.SetProgress(myProgress);
467   myLocations.Write(OS);
468   if ( !myProgress.IsNull() ) {
469     myProgress->EndScope();
470     myProgress->Show();
471   }
472
473   if (!myProgress.IsNull() && myProgress->UserBreak()) {
474     OS << "Interrupted by the user\n";
475     OS.imbue (anOldLocale);
476     return;
477   }
478
479   //-----------------------------------------
480   // write the geometry
481   //-----------------------------------------
482
483   if ( !myProgress.IsNull() ) 
484     myProgress->NewScope ( 75, "Geometry" );
485   WriteGeometry(OS);
486   if ( !myProgress.IsNull() ) {
487     myProgress->EndScope();
488     myProgress->Show();
489   }
490
491   //-----------------------------------------
492   // write the shapes
493   //-----------------------------------------
494
495   Standard_Integer i, nbShapes = myShapes.Extent();
496   
497   OS << "\nTShapes " << nbShapes << "\n";
498
499   // subshapes are written first
500   //OCC19559
501   if ( !myProgress.IsNull() ) 
502     myProgress->NewScope ( 15, "Shapes" );
503   Message_ProgressSentry PS(myProgress, "Shapes", 0, nbShapes, 1);
504   for (i = 1; i <= nbShapes && PS.More(); i++, PS.Next()) {
505     const TopoDS_Shape& S = myShapes(i);
506     
507     // Type
508     PrintShapeEnum(S.ShapeType(),OS,Standard_True);
509     OS << "\n";
510
511     // Geometry
512     WriteGeometry(S,OS);
513
514     // Flags
515     OS << "\n";
516     OS << (S.Free()       ? 1 : 0);
517     OS << (S.Modified()   ? 1 : 0);
518     OS << (S.Checked()    ? 1 : 0);
519     OS << (S.Orientable() ? 1 : 0);
520     OS << (S.Closed()     ? 1 : 0);
521     OS << (S.Infinite()   ? 1 : 0);
522     OS << (S.Convex()     ? 1 : 0);
523     OS << "\n";
524
525     // sub-shapes
526
527     Standard_Integer l = 0;
528     TopoDS_Iterator its(S,Standard_False,Standard_False);
529     while (its.More()) {
530       Write(its.Value(),OS);
531       l++;
532       if (l == 10) {
533         OS << "\n";
534         l = 0;
535       }
536       its.Next();
537     }
538     Write(TopoDS_Shape(),OS); // Null shape to end the list
539     OS << "\n";
540   }
541   
542   OS << "\n";
543   OS.precision(prec);
544   OS.imbue (anOldLocale);
545
546   PS.Relieve();
547   if (!myProgress.IsNull()) {
548     myProgress->EndScope();
549     myProgress->Show();
550     if (myProgress->UserBreak())
551       OS << "Interrupted by the user\n";
552   }
553 }
554
555 //=======================================================================
556 //function : ReadShapeEnum
557 //purpose  : 
558 //=======================================================================
559
560 static TopAbs_ShapeEnum ReadShapeEnum(Standard_IStream& IS)
561 {
562   char buffer[255];
563   IS >> buffer;
564
565   switch (buffer[0]) {
566
567   case 'V' :
568     return TopAbs_VERTEX;
569
570   case 'E' :
571     return TopAbs_EDGE;
572
573   case 'W' :
574     return TopAbs_WIRE;
575
576   case 'F' :
577     return TopAbs_FACE;
578
579   case 'S' :
580     if (buffer[1] == 'h')
581       return TopAbs_SHELL;
582     else
583       return TopAbs_SOLID;
584
585   case 'C' :
586     if (buffer[1] == 'S')
587       return TopAbs_COMPSOLID;
588     else
589       return TopAbs_COMPOUND;
590
591   }
592   return TopAbs_COMPOUND;
593 }
594
595 //=======================================================================
596 //function : Read
597 //purpose  : 
598 //=======================================================================
599
600 void  TopTools_ShapeSet::Read(Standard_IStream& IS)
601 {
602   // always use C locale for reading shapes
603   std::locale anOldLocale = IS.imbue (std::locale::classic());
604
605   Clear();
606
607   // Check the version
608   char vers[101];
609   do {
610     IS.getline(vers,100,'\n');
611     // BUC60769 PTV 18.10.2000: remove possible '\r' at the end of the line
612     //Standard_Integer lv = strlen(vers);
613     //char *pm;
614     //if(pm = strchr(vers,'\r'))
615     //  *pm ='\0';
616     
617     Standard_Size lv = strlen(vers);
618     if (lv > 0) {
619       for (lv--; lv > 0 && (vers[lv] == '\r' || vers[lv] == '\n') ;lv--) 
620         vers[lv] = '\0';
621     }
622     
623   } while ( ! IS.fail() && strcmp(vers,Version) && strcmp(vers,Version2) );
624   if (IS.fail()) {
625     std::cout << "File was not written with this version of the topology"<<std::endl;
626     IS.imbue (anOldLocale);
627     return;
628   }
629   if (strcmp(vers,Version2) == 0) SetFormatNb(2);
630   else SetFormatNb(1);
631
632   //-----------------------------------------
633   // read the locations
634   //-----------------------------------------
635
636   //OCC19559
637   if (!myProgress.IsNull() && myProgress->UserBreak()) {
638     std::cout << "Interrupted by the user"<<std::endl;
639     // on remet le LC_NUMERIC a la precedente valeur
640     IS.imbue (anOldLocale);
641     return;
642   }
643   if ( !myProgress.IsNull() ) 
644     myProgress->NewScope ( 10, "Locations" );
645   myLocations.SetProgress(myProgress);
646   myLocations.Read(IS);
647   if ( !myProgress.IsNull() ) {
648     myProgress->EndScope();
649     myProgress->Show();
650   }
651   //OCC19559
652   if (!myProgress.IsNull() && myProgress->UserBreak()) {
653     std::cout << "Interrupted by the user"<<std::endl;
654     // on remet le LC_NUMERIC a la precedente valeur
655     IS.imbue (anOldLocale);
656     return;
657   }
658
659   //-----------------------------------------
660   // read the geometry
661   //-----------------------------------------
662   if ( !myProgress.IsNull() ) 
663     myProgress->NewScope ( 75, "Geometry" );
664   ReadGeometry(IS);
665   if ( !myProgress.IsNull() ) {
666     myProgress->EndScope();
667     myProgress->Show();
668   }
669
670   //-----------------------------------------
671   // read the shapes
672   //-----------------------------------------
673
674   char buffer[255];
675   IS >> buffer;
676   if (strcmp(buffer,"TShapes")) {
677     std::cout << "Not a TShape table"<<std::endl;
678     // on remet le LC_NUMERIC a la precedente valeur
679     IS.imbue (anOldLocale);
680     return;
681   }
682
683   Standard_Integer i, nbShapes;
684   IS >> nbShapes;
685
686   //OCC19559
687   if ( !myProgress.IsNull() ) 
688     myProgress->NewScope ( 15, "Shapes" );
689   Message_ProgressSentry PS(myProgress, "Shapes", 0, nbShapes, 1);
690   for (i = 1; i <= nbShapes && PS.More(); i++, PS.Next() ) {
691     TopoDS_Shape S;
692     
693     //Read type and create empty shape.
694
695     TopAbs_ShapeEnum T = ReadShapeEnum(IS);
696     ReadGeometry(T,IS,S);
697     
698     // Set the flags
699     IS >> buffer;
700
701     // sub-shapes
702     TopoDS_Shape SS;
703     do {
704       Read(SS,IS,nbShapes);
705       if (!SS.IsNull())
706         AddShapes(S,SS);
707     } while(!SS.IsNull());
708
709     S.Free      (buffer[0] == '1');
710     S.Modified  (buffer[1] == '1');
711
712     if (myFormatNb == 2)
713       S.Checked   (buffer[2] == '1');
714     else
715       S.Checked   (Standard_False);     // force check at reading.. 
716
717     S.Orientable(buffer[3] == '1');
718     S.Closed    (buffer[4] == '1');
719     S.Infinite  (buffer[5] == '1');
720     S.Convex    (buffer[6] == '1');
721
722     // check
723
724     if (myFormatNb == 1)
725       Check(T,S);
726
727     myShapes.Add(S);
728   }
729   if (!myProgress.IsNull()) {
730     myProgress->EndScope();
731     myProgress->Show();
732   }
733
734   // on remet le LC_NUMERIC a la precedente valeur
735   IS.imbue (anOldLocale);
736 }
737
738 //=======================================================================
739 //function : Dump
740 //purpose  : 
741 //=======================================================================
742
743 void  TopTools_ShapeSet::Dump(const TopoDS_Shape& S,
744                               Standard_OStream& OS)const 
745 {
746   if (S.IsNull()) OS << "Null shape\n";
747   OS << "Shape : " << myShapes.FindIndex(S.Located(TopLoc_Location()));
748   OS << ", ";
749   PrintOrientation(S.Orientation(),OS,Standard_False);
750   if (!S.Location().IsIdentity())
751     OS <<", location : " << myLocations.Index(S.Location());
752   OS << "\n";
753 }
754
755
756 //=======================================================================
757 //function : Write
758 //purpose  : 
759 //=======================================================================
760
761 void  TopTools_ShapeSet::Write(const TopoDS_Shape& S, 
762                                Standard_OStream& OS)const 
763 {
764   if (S.IsNull()) OS << "*";
765   else {
766     PrintOrientation(S.Orientation(),OS,Standard_True);
767     OS << myShapes.Extent() - myShapes.FindIndex(S.Located(TopLoc_Location())) + 1;
768     OS << " " << myLocations.Index(S.Location()) << " ";
769   }    
770 }
771
772 //=======================================================================
773 //function : Read
774 //purpose  : 
775 //=======================================================================
776
777 void  TopTools_ShapeSet::Read(TopoDS_Shape& S, 
778                               Standard_IStream& IS)const 
779 {
780   Read(S,IS,myShapes.Extent());
781 }
782
783 //=======================================================================
784 //function : Read
785 //purpose  : 
786 //=======================================================================
787
788 void  TopTools_ShapeSet::Read(TopoDS_Shape& S, 
789                               Standard_IStream& IS,
790                               const Standard_Integer nbshapes)const 
791 {
792   if(nbshapes < 1)
793   {
794     S = TopoDS_Shape();
795     return;
796   }
797   char buffer[255];
798   IS >> buffer;
799   if (buffer[0] == '*') 
800     S = TopoDS_Shape();
801   else {
802     S = myShapes(nbshapes - atoi(buffer+1) + 1);
803     switch (buffer[0]) {
804
805     case '+' :
806       S.Orientation(TopAbs_FORWARD);
807       break;
808
809     case '-' :
810       S.Orientation(TopAbs_REVERSED);
811       break;
812
813     case 'i' :
814       S.Orientation(TopAbs_INTERNAL);
815       break;
816
817     case 'e' :
818       S.Orientation(TopAbs_EXTERNAL);
819       break;
820     }
821
822     Standard_Integer l;
823     IS >> l;
824     S.Location(myLocations.Location(l));
825   }
826 }
827
828 //=======================================================================
829 //function : AddGeometry
830 //purpose  : 
831 //=======================================================================
832
833 void TopTools_ShapeSet::AddGeometry(const TopoDS_Shape&)
834 {
835 }
836
837 //=======================================================================
838 //function : DumpGeometry
839 //purpose  : 
840 //=======================================================================
841
842 void  TopTools_ShapeSet::DumpGeometry(Standard_OStream&) const 
843 {
844 }
845
846
847 //=======================================================================
848 //function : WriteGeometry
849 //purpose  : 
850 //=======================================================================
851
852 void  TopTools_ShapeSet::WriteGeometry(Standard_OStream&) 
853 {
854 }
855
856
857 //=======================================================================
858 //function : ReadGeometry
859 //purpose  : 
860 //=======================================================================
861
862 void  TopTools_ShapeSet::ReadGeometry(Standard_IStream&)
863 {
864 }
865
866
867 //=======================================================================
868 //function : DumpGeometry
869 //purpose  : 
870 //=======================================================================
871
872 void  TopTools_ShapeSet::DumpGeometry(const TopoDS_Shape&, 
873                                       Standard_OStream&)const 
874 {
875 }
876
877
878 //=======================================================================
879 //function : WriteGeometry
880 //purpose  : 
881 //=======================================================================
882
883 void  TopTools_ShapeSet::WriteGeometry(const TopoDS_Shape&, 
884                                        Standard_OStream&)const 
885 {
886 }
887
888
889 //=======================================================================
890 //function : ReadGeometry
891 //purpose  : 
892 //=======================================================================
893
894 void  TopTools_ShapeSet::ReadGeometry(const TopAbs_ShapeEnum,
895                                       Standard_IStream& ,
896                                       TopoDS_Shape&)
897 {
898 }
899
900
901
902
903 //=======================================================================
904 //function : AddShapes
905 //purpose  : 
906 //=======================================================================
907
908 void  TopTools_ShapeSet::AddShapes(TopoDS_Shape&,
909                                    const TopoDS_Shape&)
910 {
911 }
912
913
914
915 //=======================================================================
916 //function : Check
917 //purpose  : 
918 //=======================================================================
919
920 void  TopTools_ShapeSet::Check(const TopAbs_ShapeEnum,
921                                TopoDS_Shape&)
922 {
923 }
924
925 //=======================================================================
926 //function : NbShapes
927 //purpose  : 
928 //=======================================================================
929
930 Standard_Integer  TopTools_ShapeSet::NbShapes() const
931 {
932   return myShapes.Extent();
933 }
934
935 //=======================================================================
936 //function : GetProgress
937 //purpose  : 
938 //=======================================================================
939
940 Handle(Message_ProgressIndicator) TopTools_ShapeSet::GetProgress() const
941 {
942   return myProgress;
943 }
944
945 //=======================================================================
946 //function : SetProgress
947 //purpose  : 
948 //=======================================================================
949
950 void TopTools_ShapeSet::SetProgress(const Handle(Message_ProgressIndicator)& PR)
951 {
952   myProgress = PR;
953 }
954
955