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