0024275: Cppcheck warnings on uninitialized class members
[occt.git] / src / TopOpeBRepDS / TopOpeBRepDS_DataStructure.cxx
1 // Created on: 1993-06-23
2 // Created by: Jean Yves LEBEY
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22 #include <Standard_ProgramError.hxx>
23 #include <TopoDS.hxx>
24 #include <TopOpeBRepTool_ShapeTool.hxx>
25 #include <TopOpeBRepDS_SurfaceData.hxx>
26 #include <TopOpeBRepDS_CurveData.hxx>
27 #include <TopOpeBRepDS_PointData.hxx>
28 #include <TopOpeBRepDS_ShapeData.hxx>
29 #include <TopOpeBRepDS_DataStructure.ixx>
30 #include <TopTools_ListIteratorOfListOfShape.hxx>
31 #include <TopOpeBRepDS_define.hxx>
32
33 //modified by NIZNHY-PKV Tue Oct 30 09:21:39 2001 f
34 #include <Geom_Surface.hxx>
35 //modified by NIZNHY-PKV Tue Oct 30 09:21:44 2001 t
36
37 #ifdef DEB
38 extern Standard_Boolean TopOpeBRepDS_GettraceSPSX(const Standard_Integer);
39 #include <TCollection_AsciiString.hxx>
40 #include <TopOpeBRepDS.hxx>
41 #endif
42
43 //=======================================================================
44 //function : TopOpeBRepDS_DataStructure
45 //purpose  : 
46 //=======================================================================
47 TopOpeBRepDS_DataStructure::TopOpeBRepDS_DataStructure() :
48 myNbSurfaces(0),
49 myNbCurves(0),
50 myNbPoints(0),
51 myIsfafa(Standard_False),
52 myI(0)
53 {
54 }
55
56 //=======================================================================
57 //function : Init
58 //purpose  : 
59 //=======================================================================
60 void TopOpeBRepDS_DataStructure::Init()
61 {
62   myNbSurfaces = 0;
63   myNbCurves = 0;
64   myNbPoints = 0;
65   mySurfaces.Clear();
66   myCurves.Clear();
67   myPoints.Clear();
68   myShapes.Clear();
69   //Begin modified by NIZHNY-MZV  Tue Apr 18 16:33:26 2000
70   myMapOfShapeWithStateObj.Clear();
71   myMapOfShapeWithStateTool.Clear();
72   myMapOfRejectedShapesObj.Clear();
73   myMapOfRejectedShapesTool.Clear();
74   //End modified by NIZHNY-MZV  Tue Apr 18 16:33:32 2000
75   InitSectionEdges();
76 }
77
78
79 //=======================================================================
80 //function : AddSurface
81 //purpose  : 
82 //=======================================================================
83 Standard_Integer TopOpeBRepDS_DataStructure::AddSurface(const TopOpeBRepDS_Surface& S)
84 {
85   myNbSurfaces++;
86   //modified by NIZNHY-PKV Tue Oct 30 09:22:04 2001 f
87   TopOpeBRepDS_SurfaceData aSD(S);
88   mySurfaces.Bind(myNbSurfaces, aSD);
89   //mySurfaces.Bind(myNbSurfaces,S);
90   //modified by NIZNHY-PKV Tue Oct 30 09:22:20 2001 t
91   return myNbSurfaces;
92 }
93
94
95 //=======================================================================
96 //function : RemoveSurface
97 //purpose  : 
98 //=======================================================================
99 void TopOpeBRepDS_DataStructure::RemoveSurface(const Standard_Integer I)
100 {
101 #ifdef DEB
102 //  Standard_Boolean in =
103 #endif
104            mySurfaces.UnBind(I);
105 }
106
107 //=======================================================================
108 //function : KeepSurface
109 //purpose  : 
110 //=======================================================================
111 Standard_Boolean TopOpeBRepDS_DataStructure::KeepSurface(const Standard_Integer I) const
112 {
113   const TopOpeBRepDS_Surface& S = Surface(I);
114   Standard_Boolean b = S.Keep();
115   return b;
116 }
117
118 //=======================================================================
119 //function : KeepSurface
120 //purpose  : 
121 //=======================================================================
122 Standard_Boolean TopOpeBRepDS_DataStructure::KeepSurface(TopOpeBRepDS_Surface& S) const
123 {
124   Standard_Boolean b = S.Keep();
125   return b;
126 }
127
128 //=======================================================================
129 //function : ChangeKeepSurface
130 //purpose  : 
131 //=======================================================================
132 void TopOpeBRepDS_DataStructure::ChangeKeepSurface(const Standard_Integer I,const Standard_Boolean FindKeep)
133 {
134   TopOpeBRepDS_Surface& S = ChangeSurface(I);
135   S.ChangeKeep(FindKeep);
136 }
137
138 //=======================================================================
139 //function : ChangeKeepSurface
140 //purpose  : 
141 //=======================================================================
142 void TopOpeBRepDS_DataStructure::ChangeKeepSurface(TopOpeBRepDS_Surface& S,const Standard_Boolean FindKeep)
143 {
144   S.ChangeKeep(FindKeep);
145 }
146
147 //=======================================================================
148 //function : AddCurve
149 //purpose  : 
150 //=======================================================================
151 Standard_Integer TopOpeBRepDS_DataStructure::AddCurve(const TopOpeBRepDS_Curve& C)
152 {
153   myNbCurves++;
154
155   // NYI : modifier const & sur Curve dans le CDL NYI
156   TopOpeBRepDS_Curve* PC = (TopOpeBRepDS_Curve*)(void*)&C;
157   PC->ChangeDSIndex(myNbCurves);
158
159   TopOpeBRepDS_CurveData CD(C);
160   myCurves.Bind(myNbCurves,CD);
161
162 #ifdef DEB
163  // const TopOpeBRepDS_Curve& CCC = Curve(myNbCurves);
164 #endif
165
166   return myNbCurves;
167 }
168
169 //=======================================================================
170 //function : RemoveCurve
171 //purpose  : 
172 //=======================================================================
173 void TopOpeBRepDS_DataStructure::RemoveCurve(const Standard_Integer I)
174 {
175   TopOpeBRepDS_Curve& C = ChangeCurve(I);
176   
177   TopoDS_Shape S1,S2;      
178   C.GetShapes(S1,S2);
179   Handle(TopOpeBRepDS_Interference) I1,I2; 
180   C.GetSCI(I1,I2);
181   if ( ! I1.IsNull() ) RemoveShapeInterference(S1,I1);
182   if ( ! I2.IsNull() ) RemoveShapeInterference(S2,I2);
183   C.ChangeKeep(Standard_False);
184   
185   // NYI : nullify interferences I1,I2
186 }
187
188 //=======================================================================
189 //function : KeepCurve
190 //purpose  : 
191 //=======================================================================
192 Standard_Boolean TopOpeBRepDS_DataStructure::KeepCurve(const Standard_Integer I) const
193 {
194   const TopOpeBRepDS_Curve& C = Curve(I);
195   Standard_Boolean b = C.Keep();
196   return b;
197 }
198
199 //=======================================================================
200 //function : KeepCurve
201 //purpose  : 
202 //=======================================================================
203 Standard_Boolean TopOpeBRepDS_DataStructure::KeepCurve(const TopOpeBRepDS_Curve& C) const
204 {
205   Standard_Boolean b = C.Keep();
206   return b;
207 }
208
209 //=======================================================================
210 //function : ChangeKeepCurve
211 //purpose  : 
212 //=======================================================================
213 void TopOpeBRepDS_DataStructure::ChangeKeepCurve(const Standard_Integer I,const Standard_Boolean FindKeep)
214 {
215   TopOpeBRepDS_Curve& C = ChangeCurve(I);
216   C.ChangeKeep(FindKeep);
217 }
218
219 //=======================================================================
220 //function : ChangeKeepCurve
221 //purpose  : 
222 //=======================================================================
223 void TopOpeBRepDS_DataStructure::ChangeKeepCurve(TopOpeBRepDS_Curve& C,const Standard_Boolean FindKeep)
224 {
225   C.ChangeKeep(FindKeep);
226 }
227
228
229 //=======================================================================
230 //function : AddPoint
231 //purpose  : 
232 //=======================================================================
233 Standard_Integer TopOpeBRepDS_DataStructure::AddPoint(const TopOpeBRepDS_Point& PDS)
234 {
235   myNbPoints++;
236   myPoints.Bind(myNbPoints,PDS);
237   return myNbPoints;
238 }
239
240 //=======================================================================
241 //function : AddPointSS
242 //purpose  : 
243 //=======================================================================
244 Standard_Integer TopOpeBRepDS_DataStructure::AddPointSS(const TopOpeBRepDS_Point& PDS,
245                                                         const TopoDS_Shape& /*S1*/,
246                                                         const TopoDS_Shape& /*S2*/)
247 {
248   Standard_Integer i = AddPoint(PDS);
249   return i;
250 }
251
252
253 //=======================================================================
254 //function : RemovePoint
255 //purpose  : 
256 //=======================================================================
257 void TopOpeBRepDS_DataStructure::RemovePoint(const Standard_Integer I)
258 {
259   TopOpeBRepDS_Point& P = ChangePoint(I);
260   P.ChangeKeep(Standard_False);
261 }
262
263 //=======================================================================
264 //function : KeepPoint
265 //purpose  : 
266 //=======================================================================
267 Standard_Boolean TopOpeBRepDS_DataStructure::KeepPoint(const Standard_Integer I) const
268 {
269   const TopOpeBRepDS_Point& P = Point(I);
270   Standard_Boolean b = P.Keep();
271   return b;
272 }
273
274 //=======================================================================
275 //function : KeepPoint
276 //purpose  : 
277 //=======================================================================
278 Standard_Boolean TopOpeBRepDS_DataStructure::KeepPoint(const TopOpeBRepDS_Point& P) const
279 {
280   Standard_Boolean b = P.Keep();
281   return b;
282 }
283
284 //=======================================================================
285 //function : ChangeKeepPoint
286 //purpose  : 
287 //=======================================================================
288 void TopOpeBRepDS_DataStructure::ChangeKeepPoint(const Standard_Integer I,const Standard_Boolean FindKeep)
289 {
290   TopOpeBRepDS_Point& P = ChangePoint(I);
291   P.ChangeKeep(FindKeep);
292 }
293
294 //=======================================================================
295 //function : ChangeKeepPoint
296 //purpose  : 
297 //=======================================================================
298 void TopOpeBRepDS_DataStructure::ChangeKeepPoint(TopOpeBRepDS_Point& P,const Standard_Boolean FindKeep)
299 {
300   P.ChangeKeep(FindKeep);
301 }
302
303
304 //=======================================================================
305 //function : AddShape
306 //purpose  : 
307 //=======================================================================
308 Standard_Integer TopOpeBRepDS_DataStructure::AddShape(const TopoDS_Shape& S)
309 {
310   Standard_Integer iS = myShapes.FindIndex(S);
311   if (iS == 0) {
312     TopOpeBRepDS_ShapeData SD;
313     iS = myShapes.Add(S,SD);
314     // a shape is its own reference, oriented as itself
315 #ifdef DEB
316     Standard_Boolean b = TopOpeBRepDS_GettraceSPSX(iS);
317     if (b) {cout<<"DS : add ";TopOpeBRepDS::Print(S.ShapeType(),iS,cout);cout<<endl;}
318 #endif
319     SameDomainRef(iS,iS);
320     SameDomainOri(iS,TopOpeBRepDS_SAMEORIENTED);
321   }
322   return iS;
323 }
324
325 //=======================================================================
326 //function : AddShape
327 //purpose  : 
328 //=======================================================================
329 Standard_Integer TopOpeBRepDS_DataStructure::AddShape(const TopoDS_Shape& S,const Standard_Integer Ianc)
330 {
331   Standard_Integer iS = myShapes.FindIndex(S);
332   if (iS == 0) {
333     TopOpeBRepDS_ShapeData SD;
334     iS = myShapes.Add(S,SD);
335     // a shape is its own reference, oriented as itself
336 #ifdef DEB
337     Standard_Boolean b = TopOpeBRepDS_GettraceSPSX(iS);
338     if (b) {
339       cout<<"DS : add ";TopOpeBRepDS::Print(S.ShapeType(),iS,cout);
340       cout<<"("<<Ianc<<")";
341       cout<<endl;
342     }
343 #endif
344     SameDomainRef(iS,iS);
345     SameDomainOri(iS,TopOpeBRepDS_SAMEORIENTED);
346     AncestorRank(iS,Ianc);
347   }
348   return iS;
349 }
350
351 //=======================================================================
352 //function : KeepShape
353 //purpose  : 
354 //=======================================================================
355 Standard_Boolean TopOpeBRepDS_DataStructure::KeepShape(const Standard_Integer I,const Standard_Boolean FindKeep) const
356 {
357   Standard_Boolean b = Standard_False;
358   if (I >= 1 && I <= myShapes.Extent()) {
359     const TopoDS_Shape& S = myShapes.FindKey(I);
360     if(FindKeep)
361       b = KeepShape(S);
362     else
363       b = Standard_True;
364   }
365   return b;
366 }
367
368 //=======================================================================
369 //function : KeepShape
370 //purpose  : 
371 //=======================================================================
372 Standard_Boolean TopOpeBRepDS_DataStructure::KeepShape(const TopoDS_Shape& S,const Standard_Boolean FindKeep) const
373 {
374   Standard_Boolean b = Standard_False;
375   if ( (!myShapes.IsEmpty()) && (!S.IsNull()) && myShapes.Contains(S)) {
376     const TopOpeBRepDS_ShapeData& SD = myShapes.FindFromKey(S);
377     if(FindKeep)
378       b = SD.Keep();
379     else
380       b = Standard_True;
381   }
382   return b;
383 }
384
385 //=======================================================================
386 //function : ChangeKeepShape
387 //purpose  : 
388 //=======================================================================
389 void TopOpeBRepDS_DataStructure::ChangeKeepShape(const Standard_Integer I, const Standard_Boolean FindKeep)
390 {
391   if (I >= 1 && I <= myShapes.Extent()) {
392     const TopoDS_Shape& S = myShapes.FindKey(I);
393     ChangeKeepShape(S, FindKeep);
394   }
395 }
396
397 //=======================================================================
398 //function : ChangeKeepShape
399 //purpose  : 
400 //=======================================================================
401 void TopOpeBRepDS_DataStructure::ChangeKeepShape(const TopoDS_Shape& S,const Standard_Boolean FindKeep)
402 {
403   if(!S.IsNull() && myShapes.Contains(S)) {
404     TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromKey(S);
405     SD.ChangeKeep(FindKeep);
406   }
407 }
408
409 //=======================================================================
410 //function : InitSectionEdges
411 //purpose  : 
412 //=======================================================================
413 void TopOpeBRepDS_DataStructure::InitSectionEdges()
414 {
415   mySectionEdges.Clear();
416 }
417
418 //=======================================================================
419 //function : AddSectionEdge
420 //purpose  : 
421 //=======================================================================
422 Standard_Integer TopOpeBRepDS_DataStructure::AddSectionEdge(const TopoDS_Edge& E)
423 {
424   Standard_Integer iE = mySectionEdges.FindIndex(E);
425   if (iE == 0) iE = mySectionEdges.Add(E);
426   return iE;
427 }
428
429 //=======================================================================
430 //function : ChangeShapes
431 //purpose  : 
432 //=======================================================================
433 TopOpeBRepDS_MapOfShapeData& TopOpeBRepDS_DataStructure::ChangeShapes ()
434 {
435   return myShapes;
436 }
437
438
439 //=======================================================================
440 //function : SurfaceInterferences
441 //purpose  : 
442 //=======================================================================
443 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::SurfaceInterferences(const Standard_Integer I)const 
444 {
445
446   if ( !mySurfaces.IsBound(I) ) {
447     return myEmptyListOfInterference;
448   }
449   const TopOpeBRepDS_SurfaceData& SD = mySurfaces.Find(I);
450   const TopOpeBRepDS_ListOfInterference& LI = SD.Interferences();
451   return LI;
452 }
453
454
455 //=======================================================================
456 //function : ChangeSurfaceInterferences
457 //purpose  : 
458 //=======================================================================
459 TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::ChangeSurfaceInterferences(const Standard_Integer I)
460 {
461
462   if ( !mySurfaces.IsBound(I) ) {
463     return myEmptyListOfInterference;
464   }
465   TopOpeBRepDS_SurfaceData& SD = mySurfaces.ChangeFind(I);
466   TopOpeBRepDS_ListOfInterference& LI = SD.ChangeInterferences();
467   return LI;
468 }
469
470 //=======================================================================
471 //function : CurveInterferences
472 //purpose  : 
473 //=======================================================================
474 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::CurveInterferences(const Standard_Integer I)const 
475 {
476
477   if ( !myCurves.IsBound(I) ) {
478     return myEmptyListOfInterference;
479   }
480   const TopOpeBRepDS_CurveData& CD = myCurves.Find(I);
481   const TopOpeBRepDS_ListOfInterference& LI = CD.Interferences();
482   return LI;
483 }
484
485
486 //=======================================================================
487 //function : ChangeCurveInterferences
488 //purpose  : 
489 //=======================================================================
490 TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::ChangeCurveInterferences(const Standard_Integer I)
491 {
492
493   if ( !myCurves.IsBound(I) ) {
494     return myEmptyListOfInterference;
495   }
496   TopOpeBRepDS_CurveData& CD = myCurves.ChangeFind(I);
497   TopOpeBRepDS_ListOfInterference& LI = CD.ChangeInterferences();
498   return LI;
499 }
500
501
502 //=======================================================================
503 //function : PointInterferences
504 //purpose  : 
505 //=======================================================================
506 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::PointInterferences(const Standard_Integer I)const 
507 {
508
509   if ( !myPoints.IsBound(I) ) {
510     return myEmptyListOfInterference;
511   }
512   const TopOpeBRepDS_PointData& PD = myPoints.Find(I);
513   const TopOpeBRepDS_ListOfInterference& LI = PD.Interferences();
514   return LI;
515 }
516
517
518 //=======================================================================
519 //function : ChangePointInterferences
520 //purpose  : 
521 //=======================================================================
522 TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::ChangePointInterferences(const Standard_Integer I)
523 {
524   
525   if ( !myPoints.IsBound(I) ) {
526     return myEmptyListOfInterference;
527   }
528   TopOpeBRepDS_PointData& PD = myPoints.ChangeFind(I);
529   TopOpeBRepDS_ListOfInterference& LI = PD.ChangeInterferences();
530   return LI;
531 }
532
533
534 //=======================================================================
535 //function : ShapeInterferences
536 //purpose  : 
537 //=======================================================================
538 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::ShapeInterferences(const TopoDS_Shape& S,const Standard_Boolean FindKeep)const 
539 {
540   if(HasShape(S, FindKeep))
541     return myShapes.FindFromKey(S).myInterferences;
542   return myEmptyListOfInterference;
543 }
544
545
546 //=======================================================================
547 //function : ChangeShapeInterferences
548 //purpose  : 
549 //=======================================================================
550 TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::ChangeShapeInterferences(const TopoDS_Shape& S)
551 {
552   if(!HasShape(S))
553     return myEmptyListOfInterference;
554   TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromKey(S);
555   return SD.myInterferences;
556 }
557
558 //=======================================================================
559 //function : ShapeInterferences
560 //purpose  : 
561 //=======================================================================
562 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::ShapeInterferences(const Standard_Integer I,const Standard_Boolean FindKeep) const 
563 {
564   if(FindKeep && !KeepShape(I))
565     return myEmptyListOfInterference;
566   return myShapes.FindFromIndex(I).myInterferences;
567 }
568
569
570 //=======================================================================
571 //function : ChangeShapeInterferences
572 //purpose  : 
573 //=======================================================================
574 TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_DataStructure::ChangeShapeInterferences(const Standard_Integer I)
575 {
576   TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromIndex(I);
577   return SD.myInterferences;
578 }
579
580
581 //=======================================================================
582 //function : ShapeSameDomain
583 //purpose  : 
584 //=======================================================================
585 const TopTools_ListOfShape& TopOpeBRepDS_DataStructure::ShapeSameDomain(const TopoDS_Shape& S)const 
586 {
587   if(!S.IsNull())
588     if (myShapes.Contains(S)) {
589       const TopOpeBRepDS_ShapeData& SD = myShapes.FindFromKey(S);
590       const TopTools_ListOfShape& l = SD.mySameDomain;
591       return l;
592     }
593   return myEmptyListOfShape;
594 }
595
596
597 //=======================================================================
598 //function : ChangeShapeSameDomain
599 //purpose  : 
600 //=======================================================================
601 TopTools_ListOfShape& TopOpeBRepDS_DataStructure::ChangeShapeSameDomain(const TopoDS_Shape& S)
602 {
603   TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromKey(S);
604   return SD.mySameDomain;
605 }
606
607
608 //=======================================================================
609 //function : ShapeSameDomain
610 //purpose  : 
611 //=======================================================================
612 const TopTools_ListOfShape& TopOpeBRepDS_DataStructure::ShapeSameDomain(const Standard_Integer I)const 
613 {
614   if (I >= 1 && I <= myShapes.Extent()) {
615     const TopOpeBRepDS_ShapeData& SD = myShapes.FindFromIndex(I);
616     const TopTools_ListOfShape& l = SD.mySameDomain;
617     return l;
618   }
619   else {
620     return myEmptyListOfShape;
621   }
622 }
623
624
625 //=======================================================================
626 //function : ChangeShapeSameDomain
627 //purpose  : 
628 //=======================================================================
629 TopTools_ListOfShape& TopOpeBRepDS_DataStructure::ChangeShapeSameDomain(const Standard_Integer I)
630 {
631   TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromIndex(I);
632   return SD.mySameDomain;
633 }
634
635
636 //=======================================================================
637 //function : AddShapeSameDomain
638 //purpose  : 
639 //=======================================================================
640 void TopOpeBRepDS_DataStructure::AddShapeSameDomain(const TopoDS_Shape& S, const TopoDS_Shape& SSD)
641 {
642 #ifdef DEB
643 //  TopAbs_ShapeEnum t = SSD.ShapeType();
644 #endif
645   Standard_Boolean append = Standard_True;
646   {
647     TopTools_ListIteratorOfListOfShape it(ShapeSameDomain(S));
648     for (; it.More(); it.Next() ) {
649       const TopoDS_Shape& itS = it.Value();
650       if ( itS.IsSame(SSD) ) {
651         append = Standard_False;
652         break;
653       }
654     }
655   }  
656   if (append) {
657     ChangeShapeSameDomain(S).Append(SSD);
658   }
659 }
660
661 //=======================================================================
662 //function : RemoveShapeSameDomain
663 //purpose  : 
664 //=======================================================================
665 void TopOpeBRepDS_DataStructure::RemoveShapeSameDomain(const TopoDS_Shape& S, const TopoDS_Shape& SSD)
666 {
667 #ifdef DEB
668 //  TopAbs_ShapeEnum t = SSD.ShapeType();
669 #endif
670   TopTools_ListOfShape& L = ChangeShapeSameDomain(S);
671   TopTools_ListIteratorOfListOfShape it(L);
672   while (it.More()) {
673     const TopoDS_Shape& itS = it.Value();
674     Standard_Boolean remove = itS.IsSame(SSD);
675     if (remove) 
676       L.Remove(it);
677     else
678       it.Next();
679   }
680 }
681
682 //=======================================================================
683 //function : SameDomainRef
684 //purpose  : 
685 //=======================================================================
686 Standard_Integer TopOpeBRepDS_DataStructure::SameDomainRef(const Standard_Integer I)const 
687 {
688   if (I >= 1 && I <= myShapes.Extent()) {
689     return myShapes.FindFromIndex(I).mySameDomainRef;
690   }
691   return 0;
692 }
693
694 //=======================================================================
695 //function : SameDomainRef
696 //purpose  : 
697 //=======================================================================
698 Standard_Integer TopOpeBRepDS_DataStructure::SameDomainRef(const TopoDS_Shape& S) const 
699 {
700   if(S.IsNull()) return 0;
701   if (myShapes.Contains(S)) {
702     return myShapes.FindFromKey(S).mySameDomainRef;
703   }
704   return 0;
705 }
706
707 //=======================================================================
708 //function : SameDomainRef
709 //purpose  : 
710 //=======================================================================
711 void TopOpeBRepDS_DataStructure::SameDomainRef(const Standard_Integer I, const Standard_Integer Ref)
712 {
713   if (I >= 1 && I <= myShapes.Extent()) {
714     TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromIndex(I);
715     SD.mySameDomainRef = Ref;
716   }
717 }
718
719 //=======================================================================
720 //function : SameDomainRef
721 //purpose  : 
722 //=======================================================================
723 void TopOpeBRepDS_DataStructure::SameDomainRef(const TopoDS_Shape& S, const Standard_Integer Ref)
724 {
725   if(S.IsNull()) return;
726   if (myShapes.Contains(S)) {
727     TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromKey(S);
728     SD.mySameDomainRef = Ref;
729   }
730 }
731
732 //=======================================================================
733 //function : SameDomainOri
734 //purpose  : 
735 //=======================================================================
736 TopOpeBRepDS_Config TopOpeBRepDS_DataStructure::SameDomainOri(const Standard_Integer I)const 
737 {
738   if (I >= 1 && I <= myShapes.Extent()) {
739     return myShapes.FindFromIndex(I).mySameDomainOri;
740   }
741   return TopOpeBRepDS_UNSHGEOMETRY;
742 }
743
744 //=======================================================================
745 //function : SameDomainOri
746 //purpose  : 
747 //=======================================================================
748 TopOpeBRepDS_Config TopOpeBRepDS_DataStructure::SameDomainOri(const TopoDS_Shape& S) const 
749 {
750   if(!S.IsNull())
751     if (myShapes.Contains(S)) {
752       return myShapes.FindFromKey(S).mySameDomainOri;
753     }
754   return TopOpeBRepDS_UNSHGEOMETRY;
755 }
756
757 //=======================================================================
758 //function : SameDomainOri
759 //purpose  : 
760 //=======================================================================
761 void TopOpeBRepDS_DataStructure::SameDomainOri(const Standard_Integer I, const TopOpeBRepDS_Config Ori)
762 {
763   if (I >= 1 && I <= myShapes.Extent()) {
764     TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromIndex(I);
765     SD.mySameDomainOri = Ori;
766   }
767 }
768
769 //=======================================================================
770 //function : SameDomainOri
771 //purpose  : 
772 //=======================================================================
773 void TopOpeBRepDS_DataStructure::SameDomainOri(const TopoDS_Shape& S, const TopOpeBRepDS_Config Ori)
774 {
775   if(!S.IsNull())
776     if (myShapes.Contains(S)) {
777       TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromKey(S);
778       SD.mySameDomainOri = Ori;
779     }
780 }
781
782 //=======================================================================
783 //function : SameDomainInd
784 //purpose  : 
785 //=======================================================================
786 Standard_Integer TopOpeBRepDS_DataStructure::SameDomainInd(const Standard_Integer I)const 
787 {
788   if (I >= 1 && I <= myShapes.Extent()) {
789     return myShapes.FindFromIndex(I).mySameDomainInd;
790   }
791   return 0;
792 }
793
794 //=======================================================================
795 //function : SameDomainInd
796 //purpose  : 
797 //=======================================================================
798 Standard_Integer TopOpeBRepDS_DataStructure::SameDomainInd(const TopoDS_Shape& S) const 
799 {
800   if(!S.IsNull())
801     if (myShapes.Contains(S)) {
802       return myShapes.FindFromKey(S).mySameDomainInd;
803     }
804   return 0;
805 }
806
807 //=======================================================================
808 //function : SameDomainInd
809 //purpose  : 
810 //=======================================================================
811 void TopOpeBRepDS_DataStructure::SameDomainInd(const Standard_Integer I, const Standard_Integer Ind)
812 {
813   if (I >= 1 && I <= myShapes.Extent()) {
814     TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromIndex(I);
815     SD.mySameDomainInd = Ind;
816   }
817 }
818
819 //=======================================================================
820 //function : SameDomainInd
821 //purpose  : 
822 //=======================================================================
823 void TopOpeBRepDS_DataStructure::SameDomainInd(const TopoDS_Shape& S, const Standard_Integer Ind)
824 {
825   if(S.IsNull()) return;
826   if (myShapes.Contains(S)) {
827     TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromKey(S);
828     SD.mySameDomainInd = Ind;
829   }
830 }
831
832 //=======================================================================
833 //function : AncestorRank
834 //purpose  : 
835 //=======================================================================
836 Standard_Integer TopOpeBRepDS_DataStructure::AncestorRank(const Standard_Integer I)const 
837 {
838   if (I >= 1 && I <= myShapes.Extent()) {
839     return myShapes.FindFromIndex(I).myAncestorRank;
840   }
841   return 0;
842 }
843
844 //=======================================================================
845 //function : AncestorRank
846 //purpose  : 
847 //=======================================================================
848 Standard_Integer TopOpeBRepDS_DataStructure::AncestorRank(const TopoDS_Shape& S) const 
849 {
850   if(S.IsNull()) return 0;
851   if (myShapes.Contains(S)) {
852     return myShapes.FindFromKey(S).myAncestorRank;
853   }
854   return 0;
855 }
856
857 //=======================================================================
858 //function : AncestorRank
859 //purpose  : 
860 //=======================================================================
861 void TopOpeBRepDS_DataStructure::AncestorRank(const Standard_Integer I, const Standard_Integer Ianc)
862 {
863   if (I >= 1 && I <= myShapes.Extent()) {
864     TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromIndex(I);
865     SD.myAncestorRank = Ianc;
866   }
867 }
868
869 //=======================================================================
870 //function : AncestorRank
871 //purpose  : 
872 //=======================================================================
873 void TopOpeBRepDS_DataStructure::AncestorRank(const TopoDS_Shape& S, const Standard_Integer Ianc)
874 {
875   if(S.IsNull()) return;
876   if (myShapes.Contains(S)) {
877     TopOpeBRepDS_ShapeData& SD = myShapes.ChangeFromKey(S);
878     SD.myAncestorRank = Ianc;
879   }
880 }
881
882 //=======================================================================
883 //function : AddShapeInterference
884 //purpose  : 
885 //=======================================================================
886 void TopOpeBRepDS_DataStructure::AddShapeInterference(const TopoDS_Shape& S, const Handle(TopOpeBRepDS_Interference)& I)
887 {
888   ChangeShapeInterferences(S).Append(I);
889 }
890
891
892 //=======================================================================
893 //function : RemoveShapeInterference
894 //purpose  : 
895 //=======================================================================
896 void TopOpeBRepDS_DataStructure::RemoveShapeInterference(const TopoDS_Shape& S, const Handle(TopOpeBRepDS_Interference)& I)
897 {
898   TopOpeBRepDS_ListOfInterference& L = ChangeShapeInterferences(S);
899   TopOpeBRepDS_ListIteratorOfListOfInterference it(L);
900   Standard_Boolean b = FindInterference(it,I);
901   if (b) {
902     L.Remove(it);
903   }
904 }
905
906 //=======================================================================
907 //function : FillShapesSameDomain
908 //purpose  : 
909 //=======================================================================
910 void TopOpeBRepDS_DataStructure::FillShapesSameDomain(const TopoDS_Shape& S1,
911                                                       const TopoDS_Shape& S2,
912                                                       const Standard_Boolean refFirst)
913 {
914   TopAbs_Orientation o1 = S1.Orientation();
915   TopAbs_Orientation o2 = S2.Orientation();
916
917   Standard_Integer iS1 = AddShape(S1,1);
918   TopOpeBRepDS_ShapeData& SD1 = myShapes.ChangeFromIndex(iS1);
919   Standard_Boolean isdef1 = SD1.myOrientationDef;
920   Standard_Boolean todef1 = ( !isdef1 );
921   if ( isdef1 && SD1.mySameDomainOri == TopOpeBRepDS_UNSHGEOMETRY ) todef1 = Standard_True;   
922   if ( todef1 ) {
923     SD1.myOrientation = o1;
924     SD1.myOrientationDef = Standard_True;
925   }
926   
927   Standard_Integer iS2 = AddShape(S2,2);
928   TopOpeBRepDS_ShapeData& SD2 = myShapes.ChangeFromIndex(iS2);
929   Standard_Boolean isdef2 = SD2.myOrientationDef;
930   Standard_Boolean todef2 = ( !isdef2 );
931   if ( isdef2 && SD2.mySameDomainOri == TopOpeBRepDS_UNSHGEOMETRY ) todef2 = Standard_True;   
932   if ( todef2 ) {
933     SD2.myOrientation = o2;
934     SD2.myOrientationDef = Standard_True;
935   }
936
937   Standard_Integer n1 = ShapeSameDomain(S1).Extent();
938   Standard_Integer n2 = ShapeSameDomain(S2).Extent();
939
940   AddShapeSameDomain(S1,S2);
941   AddShapeSameDomain(S2,S1);
942
943   Standard_Integer n11 = ShapeSameDomain(S1).Extent();
944   Standard_Integer n22 = ShapeSameDomain(S2).Extent();
945
946   Standard_Boolean cond = ( n11 == n1 ) && (n22 == n2);
947   cond = cond && (!todef1) && (!todef2);
948   if ( cond ) {
949     // nothing changed in SameDomain data of S1 and S2 : return
950     return;
951   }
952
953   Standard_Integer r1 = SameDomainRef(S1);
954   Standard_Integer r2 = SameDomainRef(S2);
955   Standard_Integer r = 0;
956   // r1 == i1  r2 == i2 : shapes have no SameDomain ref : take S1 as reference
957   // r1 == i1  r2 != i2 : S2 has a SameDomain reference : give it to S1
958   // r1 != i1  r2 == i2 : S1 has a SameDomain reference : give it to S2
959   // r1 != i1  r2 != i2 : S1,S2 have SameDomain reference : check equality
960   if      ( r1 == iS1 && r2 == iS2 ) r = (refFirst? iS1 : iS2);
961   else if ( r1 == iS1 && r2 != iS2 ) r = r2; 
962   else if ( r1 != iS1 && r2 == iS2 ) r = r1;
963   else if ( r1 != iS1 && r2 != iS2 ) { 
964     if (r1 != r2) {
965       //      Standard_ProgramError::Raise("FacesFiller::Insert SD 1");
966 #ifdef DEB
967       cout<<"FacesFiller::Insert SD 1"<<endl;
968 #endif
969     }
970     r = (refFirst? r1 : r2);
971   }
972   
973   if (r == 0) {
974     Standard_ProgramError::Raise("FacesFiller::Insert SD 2");
975   }
976
977   TopoDS_Shape Sr = Shape(r);
978   const TopOpeBRepDS_ShapeData& SD = myShapes.FindFromKey(Sr);
979   TopAbs_Orientation oSr = SD.myOrientation;
980   Sr.Orientation(oSr);
981
982   if ( r != r1 || todef1) { // S1 gets a new reference r
983     TopOpeBRepDS_Config o = TopOpeBRepDS_SAMEORIENTED;
984     if ( r != iS1 || todef1) {
985       Standard_Boolean sso = TopOpeBRepTool_ShapeTool::ShapesSameOriented(S1,Sr);
986       if (!sso) o = TopOpeBRepDS_DIFFORIENTED;
987     }
988     SameDomainRef(iS1,r);
989     SameDomainOri(iS1,o);
990     }
991   
992   if ( r != r2 || todef2) { // S2 gets a new reference r
993     TopOpeBRepDS_Config o = TopOpeBRepDS_SAMEORIENTED;
994     if ( r != iS2 || todef2) {
995       Standard_Boolean sso = TopOpeBRepTool_ShapeTool::ShapesSameOriented(S2,Sr);
996       if (!sso) o = TopOpeBRepDS_DIFFORIENTED;
997     }
998     SameDomainRef(iS2,r);
999     SameDomainOri(iS2,o);
1000   }
1001
1002   // index 
1003   SameDomainInd(S1,1);
1004   SameDomainInd(S2,2);
1005 }
1006
1007 //=======================================================================
1008 //function : FillShapesSameDomain
1009 //purpose  : 
1010 //=======================================================================
1011 void TopOpeBRepDS_DataStructure::FillShapesSameDomain(const TopoDS_Shape& S1,
1012                                                       const TopoDS_Shape& S2,
1013                                                       const TopOpeBRepDS_Config c1,
1014                                                       const TopOpeBRepDS_Config c2,
1015                                                       const Standard_Boolean refFirst)
1016 {
1017   Standard_Integer iS1 = AddShape(S1,1);
1018   TopOpeBRepDS_ShapeData& SD1 = myShapes.ChangeFromIndex(iS1);
1019   Standard_Boolean isdef1 = SD1.myOrientationDef;
1020   Standard_Boolean todef1 = Standard_True;
1021   if (c1 == TopOpeBRepDS_UNSHGEOMETRY && isdef1) todef1 = Standard_False;
1022
1023   Standard_Integer iS2 = AddShape(S2,2);
1024   TopOpeBRepDS_ShapeData& SD2 = myShapes.ChangeFromIndex(iS2);
1025   Standard_Boolean isdef2 = SD2.myOrientationDef;
1026   Standard_Boolean todef2 = Standard_True;
1027   if (c2 == TopOpeBRepDS_UNSHGEOMETRY && isdef2) todef2 = Standard_False;
1028
1029   if (todef1 || todef2 ) {
1030     FillShapesSameDomain(S1,S2,refFirst);
1031   }
1032
1033   if (todef1 && c1 == TopOpeBRepDS_UNSHGEOMETRY)
1034     SameDomainOri(S1,TopOpeBRepDS_UNSHGEOMETRY);
1035   if (todef2 && c2 == TopOpeBRepDS_UNSHGEOMETRY)
1036     SameDomainOri(S2,TopOpeBRepDS_UNSHGEOMETRY);
1037 }
1038
1039 //=======================================================================
1040 //function : UnfillShapesSameDomain
1041 //purpose  : 
1042 //=======================================================================
1043 void TopOpeBRepDS_DataStructure::UnfillShapesSameDomain(const TopoDS_Shape& S1,const TopoDS_Shape& S2)
1044 {
1045 #ifdef DEB
1046 //  Standard_Integer iS1 = Shape(S1);
1047 //  Standard_Integer iS2 = Shape(S2);
1048 //  Standard_Integer n1 = ShapeSameDomain(S1).Extent();
1049 //  Standard_Integer n2 = ShapeSameDomain(S2).Extent();
1050 #endif
1051
1052   RemoveShapeSameDomain(S1,S2);
1053   RemoveShapeSameDomain(S2,S1);
1054
1055 #ifdef DEB
1056 //  Standard_Integer n11 = ShapeSameDomain(S1).Extent();
1057 //  Standard_Integer n22 = ShapeSameDomain(S2).Extent();
1058 #endif
1059 }
1060
1061 //=======================================================================
1062 //function : NbSurfaces
1063 //purpose  : 
1064 //=======================================================================
1065 Standard_Integer TopOpeBRepDS_DataStructure::NbSurfaces()const 
1066 {
1067   Standard_Integer n = myNbSurfaces;
1068   return n;
1069 }
1070
1071
1072 //=======================================================================
1073 //function : NbCurves
1074 //purpose  : 
1075 //=======================================================================
1076 Standard_Integer TopOpeBRepDS_DataStructure::NbCurves()const 
1077 {
1078   Standard_Integer n = myNbCurves;
1079   return n;
1080 }
1081
1082
1083 //=======================================================================
1084 //function : ChangeNbCurves
1085 //purpose  : 
1086 //=======================================================================
1087 void TopOpeBRepDS_DataStructure::ChangeNbCurves(const Standard_Integer n)
1088 {
1089   myNbCurves = n;
1090 }
1091
1092
1093 //=======================================================================
1094 //function : NbPoints
1095 //purpose  : 
1096 //=======================================================================
1097 Standard_Integer TopOpeBRepDS_DataStructure::NbPoints()const 
1098 {
1099   Standard_Integer n = myNbPoints;
1100   return n;
1101 }
1102
1103
1104 //=======================================================================
1105 //function : NbShapes
1106 //purpose  : 
1107 //=======================================================================
1108 Standard_Integer TopOpeBRepDS_DataStructure::NbShapes()const 
1109 {
1110   Standard_Integer n = myShapes.Extent();
1111   return n;
1112 }
1113
1114
1115 //=======================================================================
1116 //function : NbSectionEdges
1117 //purpose  : 
1118 //=======================================================================
1119 Standard_Integer TopOpeBRepDS_DataStructure::NbSectionEdges()const 
1120 {
1121   Standard_Integer n = mySectionEdges.Extent();
1122   return n;
1123 }
1124
1125
1126 //=======================================================================
1127 //function : Surface
1128 //purpose  : 
1129 //=======================================================================
1130 const TopOpeBRepDS_Surface& TopOpeBRepDS_DataStructure::Surface(const Standard_Integer I) const 
1131 {
1132   if ( mySurfaces.IsBound(I) )
1133     return mySurfaces(I).mySurface;
1134   else
1135     return myEmptySurface;
1136 }
1137
1138
1139 //=======================================================================
1140 //function : ChangeSurface
1141 //purpose  : 
1142 //=======================================================================
1143 TopOpeBRepDS_Surface& TopOpeBRepDS_DataStructure::ChangeSurface(const Standard_Integer I) 
1144 {
1145   if ( mySurfaces.IsBound(I) )
1146     return mySurfaces(I).mySurface;
1147   else
1148     return myEmptySurface;
1149 }
1150
1151
1152 //=======================================================================
1153 //function : Curve
1154 //purpose  : 
1155 //=======================================================================
1156 const TopOpeBRepDS_Curve& TopOpeBRepDS_DataStructure::Curve(const Standard_Integer I)const 
1157 {
1158   if ( myCurves.IsBound(I) ) {
1159     const TopOpeBRepDS_CurveData& CD = myCurves(I);
1160     const TopOpeBRepDS_Curve& C = CD.myCurve;
1161     return C;
1162   }
1163   else
1164     return myEmptyCurve;
1165 }
1166
1167 //=======================================================================
1168 //function : ChangeCurve
1169 //purpose  : 
1170 //=======================================================================
1171 TopOpeBRepDS_Curve& TopOpeBRepDS_DataStructure::ChangeCurve(const Standard_Integer I)
1172 {
1173   if ( myCurves.IsBound(I) ) {
1174     TopOpeBRepDS_CurveData& CD = myCurves.ChangeFind(I);
1175     TopOpeBRepDS_Curve& C = CD.myCurve;
1176     return C;
1177   }
1178   return myEmptyCurve;
1179 }
1180
1181 //=======================================================================
1182 //function : Point
1183 //purpose  : 
1184 //=======================================================================
1185 const TopOpeBRepDS_Point& TopOpeBRepDS_DataStructure::Point(const Standard_Integer I)const 
1186 {
1187   if ( I < 1 || I > myNbPoints ) {
1188 #ifdef DEB
1189     cout<<"acces au POINT "<<I<<" incorrect "<<myNbPoints<<" max"<<endl;
1190 #endif
1191     Standard_ProgramError::Raise("TopOpeBRepDS_DataStructure::Point");
1192   }
1193
1194   if ( myPoints.IsBound(I) ) 
1195     return myPoints(I).myPoint;
1196   else 
1197     return myEmptyPoint;
1198 }
1199
1200 //=======================================================================
1201 //function : ChangePoint
1202 //purpose  : 
1203 //=======================================================================
1204 TopOpeBRepDS_Point& TopOpeBRepDS_DataStructure::ChangePoint(const Standard_Integer I)
1205 {
1206   if ( I < 1 || I > myNbPoints ) {
1207 #ifdef DEB
1208     cout<<"acces au POINT "<<I<<" incorrect "<<myNbPoints<<" max"<<endl;
1209 #endif
1210     Standard_ProgramError::Raise("TopOpeBRepDS_DataStructure::Point");
1211   }
1212
1213   if ( myPoints.IsBound(I) ) 
1214     return myPoints(I).myPoint;
1215   else 
1216     return myEmptyPoint;
1217 }
1218
1219
1220 //=======================================================================
1221 //function : Shape
1222 //purpose  : 
1223 //=======================================================================
1224 const TopoDS_Shape& TopOpeBRepDS_DataStructure::Shape(const Standard_Integer I,const Standard_Boolean FindKeep) const 
1225 {
1226   if(KeepShape(I, FindKeep)) {
1227     const TopoDS_Shape& S = myShapes.FindKey(I);
1228     return S;
1229   }
1230   return myEmptyShape;
1231 }
1232
1233 //=======================================================================
1234 //function : Shape
1235 //purpose  : 
1236 //=======================================================================
1237 Standard_Integer TopOpeBRepDS_DataStructure::Shape(const TopoDS_Shape& S,const Standard_Boolean FindKeep)const 
1238 {
1239   Standard_Integer i = 0;
1240   Standard_Boolean hs = HasShape(S, FindKeep);
1241   if (hs) {
1242     i = myShapes.FindIndex(S);
1243   }
1244   return i;
1245 }
1246
1247
1248 //=======================================================================
1249 //function : SectionEdge
1250 //purpose  : 
1251 //=======================================================================
1252 const TopoDS_Edge& TopOpeBRepDS_DataStructure::SectionEdge(const Standard_Integer I,const Standard_Boolean FindKeep) const
1253 {
1254   const TopoDS_Shape& S = mySectionEdges.FindKey(I);
1255   if(HasShape(S, FindKeep))
1256     return TopoDS::Edge(S);
1257   return TopoDS::Edge(myEmptyShape);
1258 }
1259
1260 //=======================================================================
1261 //function : SectionEdge
1262 //purpose  : 
1263 //=======================================================================
1264 Standard_Integer TopOpeBRepDS_DataStructure::SectionEdge(const TopoDS_Edge& S,const Standard_Boolean FindKeep) const 
1265 {
1266   Standard_Integer i = 0;
1267   if(KeepShape(S, FindKeep))
1268     i = mySectionEdges.FindIndex(S);
1269   return i;
1270 }
1271
1272
1273 //=======================================================================
1274 //function : IsSectionEdge
1275 //purpose  : 
1276 //=======================================================================
1277 Standard_Boolean TopOpeBRepDS_DataStructure::IsSectionEdge(const TopoDS_Edge& S,const Standard_Boolean FindKeep) const 
1278 {
1279   Standard_Boolean b = KeepShape(S, FindKeep);
1280   if(b) {
1281     b = mySectionEdges.Contains(S);
1282   }
1283   return b;
1284 }
1285
1286
1287 //=======================================================================
1288 //function : HasGeometry
1289 //purpose  : 
1290 //=======================================================================
1291 Standard_Boolean TopOpeBRepDS_DataStructure::HasGeometry(const TopoDS_Shape& S)const 
1292 {
1293   Standard_Boolean has = HasShape(S);
1294   if ( has ) {
1295     has = ! ShapeInterferences(S).IsEmpty();
1296   }
1297   return has;
1298 }
1299
1300
1301 //=======================================================================
1302 //function : HasShape
1303 //purpose  : 
1304 //=======================================================================
1305 Standard_Boolean TopOpeBRepDS_DataStructure::HasShape(const TopoDS_Shape& S,const Standard_Boolean FindKeep)const 
1306 {
1307   Standard_Boolean res = KeepShape(S, FindKeep);
1308   return res;
1309 }
1310
1311 //=======================================================================
1312 //function : SetNewSurface
1313 //purpose  : 
1314 //=======================================================================
1315 void TopOpeBRepDS_DataStructure::SetNewSurface(const TopoDS_Shape& F, const Handle(Geom_Surface)& S)
1316 {
1317   myNewSurface.Bind(F,S);
1318 }
1319
1320 //=======================================================================
1321 //function : HasNewSurface
1322 //purpose  : 
1323 //=======================================================================
1324 Standard_Boolean TopOpeBRepDS_DataStructure::HasNewSurface(const TopoDS_Shape& F) const
1325 {
1326   Standard_Boolean b = myNewSurface.IsBound(F);
1327   return b;
1328 }
1329
1330 //=======================================================================
1331 //function : NewSurface
1332 //purpose  : 
1333 //=======================================================================
1334 const Handle(Geom_Surface)& TopOpeBRepDS_DataStructure::NewSurface(const TopoDS_Shape& F) const
1335 {
1336   if (HasNewSurface(F)) return myNewSurface.Find(F);
1337   return myEmptyGSurface;
1338 }
1339
1340 //=======================================================================
1341 //function : FindInterference
1342 //purpose  : 
1343 //=======================================================================
1344 Standard_Boolean TopOpeBRepDS_DataStructure::FindInterference(TopOpeBRepDS_ListIteratorOfListOfInterference& IT,const Handle(TopOpeBRepDS_Interference)& I) const
1345 {
1346   for( ; IT.More(); IT.Next()) if (IT.Value() == I ) return Standard_True;
1347   return Standard_False;
1348 }
1349
1350
1351 //=======================================================================
1352 //function : Isfafa
1353 //purpose  : 
1354 //=======================================================================
1355 void TopOpeBRepDS_DataStructure::Isfafa(const Standard_Boolean isfafa)
1356 {
1357   myIsfafa = isfafa;
1358 }
1359
1360 //=======================================================================
1361 //function : Isfafa
1362 //purpose  : 
1363 //=======================================================================
1364 Standard_Boolean TopOpeBRepDS_DataStructure::Isfafa() const 
1365 {
1366   return myIsfafa;
1367 }
1368
1369 //
1370 //=======================================================================
1371 //function :ChangeMapOfShapeWithStateObj
1372 //purpose  : 
1373 //=======================================================================
1374 TopOpeBRepDS_IndexedDataMapOfShapeWithState& TopOpeBRepDS_DataStructure::ChangeMapOfShapeWithStateObj()
1375 {
1376   return myMapOfShapeWithStateObj;
1377 }
1378
1379 //=======================================================================
1380 //function :ChangeMapOfShapeWithStateTool
1381 //purpose  : 
1382 //=======================================================================
1383 TopOpeBRepDS_IndexedDataMapOfShapeWithState& TopOpeBRepDS_DataStructure::ChangeMapOfShapeWithStateTool()
1384 {
1385   return myMapOfShapeWithStateTool;
1386 }
1387
1388 //=======================================================================
1389 //function :ChangeMapOfShapeWithState
1390 //purpose  : 
1391 //=======================================================================
1392 TopOpeBRepDS_IndexedDataMapOfShapeWithState& TopOpeBRepDS_DataStructure::ChangeMapOfShapeWithState
1393    (const TopoDS_Shape& aShape, Standard_Boolean& aFlag)
1394 {
1395   static TopOpeBRepDS_IndexedDataMapOfShapeWithState dummy;
1396   aFlag=Standard_True;
1397   
1398   if (myMapOfShapeWithStateObj.Contains(aShape)) 
1399     return myMapOfShapeWithStateObj;
1400   
1401   if (myMapOfShapeWithStateTool.Contains(aShape))
1402     return myMapOfShapeWithStateTool;
1403   
1404   aFlag=Standard_False;
1405   return dummy;
1406 }
1407
1408
1409 //=======================================================================
1410 //function :GetShapeWithState
1411 //purpose  : 
1412 //=======================================================================
1413 const TopOpeBRepDS_ShapeWithState& TopOpeBRepDS_DataStructure::GetShapeWithState(const TopoDS_Shape& aShape) const
1414 {
1415   static TopOpeBRepDS_ShapeWithState dummy;
1416   if(myMapOfShapeWithStateObj.Contains(aShape))
1417     return myMapOfShapeWithStateObj.FindFromKey(aShape);
1418   else if(myMapOfShapeWithStateTool.Contains(aShape))
1419     return myMapOfShapeWithStateTool.FindFromKey(aShape);
1420
1421   return dummy;
1422 }
1423
1424 //=======================================================================
1425 //function :ChangeMapOfRejectedShapesObj
1426 //purpose  : 
1427 //=======================================================================
1428 TopTools_IndexedMapOfShape& TopOpeBRepDS_DataStructure::ChangeMapOfRejectedShapesObj()
1429 {
1430   return myMapOfRejectedShapesObj;
1431 }
1432
1433 //=======================================================================
1434 //function :ChangeMapOfRejectedShapesTool
1435 //purpose  : 
1436 //=======================================================================
1437 TopTools_IndexedMapOfShape& TopOpeBRepDS_DataStructure::ChangeMapOfRejectedShapesTool()
1438 {
1439   return myMapOfRejectedShapesTool;
1440 }
1441
1442