Integration of OCCT 6.5.0 from SVN
[occt.git] / src / TopOpeBRepDS / TopOpeBRepDS_HDataStructure.cxx
1 // File :       TopOpeBRepDS_HDataStructure.cxx
2 // Created:     Thu Jun 17 19:18:54 1993
3 // Author:      Jean Yves LEBEY
4 //              <jyl@zerox>
5
6 #include <TopOpeBRepDS_HDataStructure.ixx>
7
8 #include <TopOpeBRepDS_EdgeInterferenceTool.hxx>
9 #include <BRep_Tool.hxx>
10 #include <TopoDS.hxx>
11 #include <TopoDS_Edge.hxx>
12 #include <TopExp_Explorer.hxx>
13 #include <TopTools_ListOfShape.hxx>
14 #include <TopOpeBRepDS_SurfaceCurveInterference.hxx>
15 #include <TopOpeBRepDS_Transition.hxx>
16 #include <TopAbs_ShapeEnum.hxx>
17 #include <TopOpeBRepDS.hxx>
18 #include <TopOpeBRepDS_Interference.hxx>
19 #include <TopOpeBRepDS_ListOfInterference.hxx>
20 #include <TopOpeBRepDS_ListIteratorOfListOfInterference.hxx>
21 #include <TopOpeBRepDS_Check.hxx>
22 #include <TopOpeBRepTool_ShapeExplorer.hxx>
23 #include <TopOpeBRepDS_Filter.hxx>
24 #include <TopOpeBRepDS_Reducer.hxx>
25 #include <TopOpeBRepDS_Dumper.hxx>
26 #include <Standard_ProgramError.hxx>
27 #include <TopOpeBRepDS_define.hxx>
28
29 #ifdef DEB
30 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettraceISTO();
31 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettraceEDSF(); 
32 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettraceDSF(); 
33 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettraceDSFD(); 
34 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettraceDEGEN(); 
35 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettracePCI();
36 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettracePI();
37 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettracePEI();
38 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettracePI();
39 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettraceSPSX(const Standard_Integer);
40
41 static Standard_Boolean traceSTORE()
42 {
43   Standard_Boolean trc = Standard_False;
44   trc = trc || TopOpeBRepDS_GettraceEDSF();
45   trc = trc || TopOpeBRepDS_GettraceDSF();
46   trc = trc || TopOpeBRepDS_GettraceDEGEN();
47   trc = trc || TopOpeBRepDS_GettraceISTO();
48   return trc;
49 }
50 #endif
51
52 static void FUN_HDS_data(const Handle(TopOpeBRepDS_Interference)& I,
53                          TopOpeBRepDS_Kind& GT1,Standard_Integer& G1,
54                          TopOpeBRepDS_Kind& ST1,Standard_Integer& S1)
55 {       
56   if (I.IsNull()) return;
57   GT1 = I->GeometryType(); G1 = I->Geometry();
58   ST1 = I->SupportType();  S1 = I->Support(); 
59 }
60
61
62 Standard_EXPORT Standard_Boolean FUN_HDS_FACESINTERFER
63 (const TopoDS_Shape& F1, const TopoDS_Shape& F2,
64  const Handle(TopOpeBRepDS_HDataStructure)& HDS)
65 {
66   Standard_Boolean yainterf = Standard_False;
67   const TopOpeBRepDS_DataStructure& DS = HDS->DS();
68   Standard_Boolean ya = DS.HasShape(F1);
69   if ( !ya ) return Standard_False;
70
71 //                         DS.Shape(F1);
72   Standard_Integer iF2 = DS.Shape(F2);
73
74   const TopOpeBRepDS_ListOfInterference& L1 = DS.ShapeInterferences(F1);
75   TopOpeBRepDS_ListIteratorOfListOfInterference itL1(L1);
76   for (;itL1.More(); itL1.Next()) {
77     const Handle(TopOpeBRepDS_Interference)& I = itL1.Value();
78     TopOpeBRepDS_Kind GT,ST;Standard_Integer G,S;
79     FUN_HDS_data(I,GT,G,ST,S);
80     // interference face1/edge/face2
81     Standard_Boolean fef = Standard_True;
82     fef = fef && (GT==TopOpeBRepDS_EDGE);
83     fef = fef && (ST==TopOpeBRepDS_FACE);
84     fef = fef && (S==iF2);
85     if (fef) {
86       yainterf = Standard_True;
87       break;
88     }
89   }
90   return yainterf;
91 }
92
93
94 //=======================================================================
95 //function : TopOpeBRepDS_HDataStructure
96 //purpose  : 
97 //=======================================================================
98 TopOpeBRepDS_HDataStructure::TopOpeBRepDS_HDataStructure()
99 {
100 }
101
102 //=======================================================================
103 //function : AddAncestors
104 //purpose  : 
105 //=======================================================================
106 void TopOpeBRepDS_HDataStructure::AddAncestors
107 (const TopoDS_Shape& S)
108 {
109   AddAncestors(S,TopAbs_WIRE,TopAbs_EDGE);
110   AddAncestors(S,TopAbs_FACE,TopAbs_WIRE);
111   AddAncestors(S,TopAbs_SHELL,TopAbs_FACE);
112   AddAncestors(S,TopAbs_SOLID,TopAbs_SHELL);
113 }
114
115 //=======================================================================
116 //function : AddAncestors
117 //purpose  : 
118 //=======================================================================
119 void TopOpeBRepDS_HDataStructure::AddAncestors
120 (const TopoDS_Shape& S,
121  const TopAbs_ShapeEnum T1,const TopAbs_ShapeEnum T2)
122 {
123   TopOpeBRepDS_DataStructure& BDS = ChangeDS();
124   Standard_Integer rankS = myDS.AncestorRank(S);
125   // find the shapes of type T1 containing HasShape() of type T2
126   for (TopOpeBRepTool_ShapeExplorer eT1(S,T1); eT1.More(); eT1.Next()) {
127     const TopoDS_Shape& ST1 = eT1.Current();
128     for (TopOpeBRepTool_ShapeExplorer eT2(ST1,T2); eT2.More(); eT2.Next()) {
129       const TopoDS_Shape& ST2 = eT2.Current();
130       if (BDS.HasShape(ST2)) {
131         BDS.AddShape(ST1,rankS);
132         break;
133       }
134     }
135   }
136 }
137
138 //=======================================================================
139 //function : ChkIntg
140 //purpose  : Check Integrity
141 //=======================================================================
142 void TopOpeBRepDS_HDataStructure::ChkIntg()
143 {
144   // Check the integrity of the DS
145   Handle(TopOpeBRepDS_Check) chk = new TopOpeBRepDS_Check(this);
146   chk->ChkIntg();
147 //  chk->PrintIntg(cout);
148 }
149
150 //=======================================================================
151 //function : DS
152 //purpose  : 
153 //=======================================================================
154 const TopOpeBRepDS_DataStructure&  TopOpeBRepDS_HDataStructure::DS()const 
155 {
156   return myDS;
157 }
158
159 //=======================================================================
160 //function : ChangeDS
161 //purpose  : 
162 //=======================================================================
163 TopOpeBRepDS_DataStructure&  TopOpeBRepDS_HDataStructure::ChangeDS()
164 {
165   return myDS;
166 }
167
168 //=======================================================================
169 //function : NbSurfaces
170 //purpose  : 
171 //=======================================================================
172 Standard_Integer  TopOpeBRepDS_HDataStructure::NbSurfaces()const 
173 {
174   return myDS.NbSurfaces();
175 }
176
177 //=======================================================================
178 //function : NbCurves
179 //purpose  : 
180 //=======================================================================
181 Standard_Integer  TopOpeBRepDS_HDataStructure::NbCurves()const 
182 {
183   return myDS.NbCurves();
184 }
185
186 //=======================================================================
187 //function : NbPoints
188 //purpose  : 
189 //=======================================================================
190 Standard_Integer  TopOpeBRepDS_HDataStructure::NbPoints()const 
191 {
192   return myDS.NbPoints();
193 }
194
195 //=======================================================================
196 //function : Surface
197 //purpose  : 
198 //=======================================================================
199 const TopOpeBRepDS_Surface&  TopOpeBRepDS_HDataStructure::Surface
200 (const Standard_Integer I)const 
201 {
202   return myDS.Surface(I);
203 }
204
205 //=======================================================================
206 //function : SurfaceCurves
207 //purpose  : 
208 //=======================================================================
209 TopOpeBRepDS_CurveIterator  TopOpeBRepDS_HDataStructure::SurfaceCurves
210 (const Standard_Integer I)const 
211 {
212   const TopOpeBRepDS_ListOfInterference& L = myDS.SurfaceInterferences(I);
213   return TopOpeBRepDS_CurveIterator(L);
214 }
215
216 //=======================================================================
217 //function : Curve
218 //purpose  : 
219 //=======================================================================
220 const TopOpeBRepDS_Curve&  TopOpeBRepDS_HDataStructure::Curve
221 (const Standard_Integer I)const
222 {
223   return myDS.Curve(I);
224 }
225
226 //=======================================================================
227 //function : ChangeCurve
228 //purpose  : 
229 //=======================================================================
230 TopOpeBRepDS_Curve&  TopOpeBRepDS_HDataStructure::ChangeCurve
231 (const Standard_Integer I)
232 {
233   return myDS.ChangeCurve(I);
234 }
235
236 //=======================================================================
237 //function : CurvePoints
238 //purpose  : 
239 //=======================================================================
240 TopOpeBRepDS_PointIterator  TopOpeBRepDS_HDataStructure::CurvePoints
241 (const Standard_Integer I)const 
242 {
243   const TopOpeBRepDS_ListOfInterference& L = myDS.CurveInterferences(I);
244   return TopOpeBRepDS_PointIterator(L);
245 }
246
247 //=======================================================================
248 //function : Point
249 //purpose  : 
250 //=======================================================================
251 const TopOpeBRepDS_Point&  TopOpeBRepDS_HDataStructure::Point
252 (const Standard_Integer I)const 
253 {
254   return myDS.Point(I);
255 }
256
257 //=======================================================================
258 //function : HasGeometry
259 //purpose  : 
260 //=======================================================================
261 Standard_Boolean  TopOpeBRepDS_HDataStructure::HasGeometry
262 (const TopoDS_Shape& S)const 
263 {
264   Standard_Boolean b = myDS.HasGeometry(S);
265   return b;
266 }
267
268 //=======================================================================
269 //function : HasShape
270 //purpose  : 
271 //=======================================================================
272 Standard_Boolean  TopOpeBRepDS_HDataStructure::HasShape
273 (const TopoDS_Shape& S,const Standard_Boolean FindKeep) const 
274 {
275   Standard_Boolean b = myDS.HasShape(S, FindKeep);
276   return b;
277 }
278
279 //=======================================================================
280 //function : HasSameDomain
281 //purpose  : 
282 //=======================================================================
283 Standard_Boolean  TopOpeBRepDS_HDataStructure::HasSameDomain
284 (const TopoDS_Shape& S,const Standard_Boolean FindKeep)const 
285 {
286   if ( ! HasShape(S, FindKeep) ) return Standard_False;
287   const TopTools_ListOfShape& l = myDS.ShapeSameDomain(S);
288   Standard_Boolean res = ! l.IsEmpty();
289   return res;
290 }
291
292 //=======================================================================
293 //function : SameDomain
294 //purpose  : 
295 //=======================================================================
296 TopTools_ListIteratorOfListOfShape TopOpeBRepDS_HDataStructure::SameDomain
297 (const TopoDS_Shape& S)const 
298 {
299   const TopTools_ListOfShape& L = myDS.ShapeSameDomain(S);
300   return TopTools_ListIteratorOfListOfShape(L);
301 }
302
303 //=======================================================================
304 //function : SameDomainOrientation
305 //purpose  : 
306 //=======================================================================
307 TopOpeBRepDS_Config  TopOpeBRepDS_HDataStructure::SameDomainOrientation
308 (const TopoDS_Shape& S)const 
309 {
310   if ( ! HasShape(S) ) return TopOpeBRepDS_UNSHGEOMETRY;
311   return myDS.SameDomainOri(S);
312 }
313
314 //=======================================================================
315 //function : SameDomainReference
316 //purpose  : 
317 //=======================================================================
318 Standard_Integer TopOpeBRepDS_HDataStructure::SameDomainReference
319 (const TopoDS_Shape& S)const 
320 {
321   if ( ! HasShape(S) ) return 0;
322   return myDS.SameDomainRef(S);
323 }
324
325 //=======================================================================
326 //function : NbShapes
327 //purpose  : 
328 //=======================================================================
329 Standard_Integer  TopOpeBRepDS_HDataStructure::NbShapes()const 
330 {
331   return myDS.NbShapes();
332 }
333
334 //=======================================================================
335 //function : Shape
336 //purpose  : 
337 //=======================================================================
338 const TopoDS_Shape&  TopOpeBRepDS_HDataStructure::Shape
339 (const Standard_Integer I,const Standard_Boolean FindKeep) const 
340 {
341   return myDS.Shape(I, FindKeep);
342 }
343
344 //=======================================================================
345 //function : Shape
346 //purpose  : 
347 //=======================================================================
348 Standard_Integer TopOpeBRepDS_HDataStructure::Shape
349 (const TopoDS_Shape& S,const Standard_Boolean FindKeep)const
350 {
351   return myDS.Shape(S, FindKeep);
352 }
353
354 //=======================================================================
355 //function : SolidSurfaces
356 //purpose  : 
357 //=======================================================================
358 TopOpeBRepDS_SurfaceIterator  TopOpeBRepDS_HDataStructure::SolidSurfaces
359 (const TopoDS_Shape& S) const 
360 {
361   const TopOpeBRepDS_ListOfInterference& L = myDS.ShapeInterferences(S);
362   return TopOpeBRepDS_SurfaceIterator(L);
363 }
364
365 //=======================================================================
366 //function : SolidSurfaces
367 //purpose  : 
368 //=======================================================================
369 TopOpeBRepDS_SurfaceIterator  TopOpeBRepDS_HDataStructure::SolidSurfaces
370 (const Standard_Integer I)const 
371 {
372   const TopOpeBRepDS_ListOfInterference& L = myDS.ShapeInterferences(I);
373   return TopOpeBRepDS_SurfaceIterator(L);
374 }
375
376 //=======================================================================
377 //function : FaceCurves
378 //purpose  : 
379 //=======================================================================
380 TopOpeBRepDS_CurveIterator  TopOpeBRepDS_HDataStructure::FaceCurves
381 (const TopoDS_Shape& F)const 
382 {
383   const TopOpeBRepDS_ListOfInterference& L = myDS.ShapeInterferences(F);
384   return TopOpeBRepDS_CurveIterator(L);
385 }
386
387 //=======================================================================
388 //function : FaceCurves
389 //purpose  : 
390 //=======================================================================
391 TopOpeBRepDS_CurveIterator  TopOpeBRepDS_HDataStructure::FaceCurves
392 (const Standard_Integer I)const 
393 {
394   const TopOpeBRepDS_ListOfInterference& L = myDS.ShapeInterferences(I);
395   return TopOpeBRepDS_CurveIterator(L);
396 }
397
398 //=======================================================================
399 //function : EdgePoints
400 //purpose  : 
401 //=======================================================================
402 TopOpeBRepDS_PointIterator  TopOpeBRepDS_HDataStructure::EdgePoints
403 (const TopoDS_Shape& E)const 
404 {
405   const TopOpeBRepDS_ListOfInterference& L = myDS.ShapeInterferences(E);
406   return TopOpeBRepDS_PointIterator(L);
407 }
408
409 //=======================================================================
410 //function : MakeCurve
411 //purpose  : 
412 //=======================================================================
413 Standard_Integer TopOpeBRepDS_HDataStructure::MakeCurve
414 (const TopOpeBRepDS_Curve& curC,TopOpeBRepDS_Curve& newC)
415 {
416   // SCI1, SCI2 = new surface/curve interf. build from 
417   // the surface/curve interf. of the curve curC
418   const Handle(TopOpeBRepDS_Interference)& I1 = curC.GetSCI1();
419   const Handle(TopOpeBRepDS_Interference)& I2 = curC.GetSCI2();
420   Handle(TopOpeBRepDS_SurfaceCurveInterference) SCI1,SCI2; 
421   if ( ! I1.IsNull() ) SCI1 = new TopOpeBRepDS_SurfaceCurveInterference(I1);
422   if ( ! I2.IsNull() ) SCI2 = new TopOpeBRepDS_SurfaceCurveInterference(I2);
423
424   const TopoDS_Shape& S1 = curC.Shape1();
425   const TopoDS_Shape& S2 = curC.Shape2();
426
427   // add the new SCIs in the lists of SCIs connected to the shapes
428   if ( ! SCI1.IsNull() ) myDS.AddShapeInterference(S1,SCI1);
429   if ( ! SCI2.IsNull() ) myDS.AddShapeInterference(S2,SCI2);
430
431   // the shapes of the new curve are the shapes of curve curC
432   newC.SetShapes(S1,S2);
433
434   // set surface/curve interferences of the new curve
435   newC.SetSCI(SCI1,SCI2);
436
437   // newC is a daughter of curC
438   newC.ChangeMother(curC.DSIndex());
439
440   // add the new curve in the DS
441   Standard_Integer inewC = myDS.AddCurve(newC);
442
443   // the geometry of the new surface/curve interf. is new curve inewC
444   if ( ! SCI1.IsNull() ) SCI1->Geometry(inewC);
445   if ( ! SCI2.IsNull() ) SCI2->Geometry(inewC);
446
447   return inewC;
448 }
449
450 //=======================================================================
451 //function : RemoveCurve
452 //purpose  : 
453 //=======================================================================
454 void TopOpeBRepDS_HDataStructure::RemoveCurve(const Standard_Integer icurC)
455 {
456   myDS.RemoveCurve(icurC);
457 }
458
459 //=======================================================================
460 //function : NbGeometry
461 //purpose  : 
462 //=======================================================================
463 Standard_Integer TopOpeBRepDS_HDataStructure::NbGeometry
464   (const TopOpeBRepDS_Kind K) const
465 {
466   if ( ! TopOpeBRepDS::IsGeometry(K)) return 0;
467
468   Standard_Integer n = 0;
469   switch(K) {
470   case TopOpeBRepDS_POINT : n = NbPoints(); break;
471   case TopOpeBRepDS_CURVE : n = NbCurves(); break;
472   case TopOpeBRepDS_SURFACE : n = NbSurfaces(); break;
473   default : n = 0; break;
474   }                     
475   return n;
476 }
477
478 //=======================================================================
479 //function : NbTopology
480 //purpose  : 
481 //=======================================================================
482 Standard_Integer TopOpeBRepDS_HDataStructure::NbTopology() const
483 {
484   Standard_Integer n = myDS.NbShapes();
485   return n;
486 }
487
488 //=======================================================================
489 //function : NbTopology
490 //purpose  : 
491 //=======================================================================
492 Standard_Integer TopOpeBRepDS_HDataStructure::NbTopology
493 (const TopOpeBRepDS_Kind K) const
494 {
495   if ( ! TopOpeBRepDS::IsTopology(K) ) return 0;
496   Standard_Integer res = 0;
497   const Standard_Boolean FindKeep = Standard_False;
498
499   TopAbs_ShapeEnum S = TopOpeBRepDS::KindToShape(K);
500   for (Standard_Integer i = 1; i <= NbTopology(); i++ )
501     if(myDS.KeepShape(i, FindKeep))
502       if (myDS.Shape(i, FindKeep).ShapeType() == S) res++;
503   return res;
504 }
505
506 //=======================================================================
507 //function : EdgesSameParameter
508 //purpose  : 
509 //=======================================================================
510
511 Standard_Boolean TopOpeBRepDS_HDataStructure::EdgesSameParameter() const
512 {
513   Standard_Integer i,n = myDS.NbShapes();
514   for (i = 1 ; i <= n; i++) {
515     const TopoDS_Shape& s = myDS.Shape(i);
516     if ( s.ShapeType() == TopAbs_EDGE ) {
517       const TopoDS_Edge& e = TopoDS::Edge(s);
518       if ( ! BRep_Tool::SameParameter(e) ) {
519         return Standard_False;
520       }
521     }
522   }
523   return Standard_True;
524 }
525
526 #include <TColStd_HArray1OfBoolean.hxx>
527 #include <TColStd_Array1OfBoolean.hxx>
528
529 Standard_EXPORT void FUN_TopOpeBRepDS_SortOnParameter
530 (const TopOpeBRepDS_ListOfInterference& List,
531  TopOpeBRepDS_ListOfInterference& SList)
532 {
533   // NYI : sort a list of Items, giving a sorting FUNCTION is impossible
534   // NYI : --> foobar method complexity n2.
535
536   Standard_Integer iIntf=0,nIntf = List.Extent();
537   if (nIntf == 0) return;
538
539   Handle(TColStd_HArray1OfBoolean) HT;
540   HT = new TColStd_HArray1OfBoolean(1,nIntf,Standard_False);
541   TColStd_Array1OfBoolean& T = HT->ChangeArray1();
542
543   Handle(TopOpeBRepDS_Interference) Intf;
544  
545   for (Standard_Integer i = 1; i <= nIntf; i++) { 
546     Standard_Real parmin = RealLast();
547     TopOpeBRepDS_PointIterator it(List);
548     for (Standard_Integer itest = 1; it.More(); it.Next(),itest++) {
549       if ( ! T(itest) ) {
550         Standard_Real par = it.Parameter();
551         if (par < parmin) {
552           parmin = par;
553           Intf = it.Value();
554           iIntf = itest;
555         }
556       }
557     }
558     SList.Append(Intf);
559     T(iIntf) = Standard_True;
560   }
561 }
562
563 //=======================================================================
564 //function : SortOnParameter
565 //purpose  : 
566 //=======================================================================
567 void TopOpeBRepDS_HDataStructure::SortOnParameter
568 (const TopOpeBRepDS_ListOfInterference& List,
569  TopOpeBRepDS_ListOfInterference& SList) const 
570 {
571   // NYI : sort a list of Items, giving a sorting FUNCTION is impossible
572   // NYI : --> foobar method complexity n2.
573
574   ::FUN_TopOpeBRepDS_SortOnParameter(List,SList);
575
576   // tete = interf FORWARD :
577   // modifier TopOpeBRepBuild_ParametrizedVertexSet ::SortParametrizedVertex()
578   Standard_Boolean found = Standard_False;
579   TopOpeBRepDS_ListIteratorOfListOfInterference it(SList);
580   TopOpeBRepDS_ListOfInterference L1,L2;
581
582   for (; it.More(); it.Next() ) {
583     Handle(TopOpeBRepDS_Interference) I = it.Value();
584     if ( ! found) {
585       TopAbs_Orientation o = I->Transition().Orientation(TopAbs_IN);
586       if (o == TopAbs_FORWARD) {
587         found = Standard_True;
588         L1.Append(I);
589       }
590       else L2.Append(I);
591     }
592     else L1.Append(I);
593   }
594
595   SList.Clear();
596   SList.Append(L1);
597   SList.Append(L2);
598 }
599
600 //=======================================================================
601 //function : SortOnParameter
602 //purpose  : 
603 //=======================================================================
604 void TopOpeBRepDS_HDataStructure::SortOnParameter
605 (TopOpeBRepDS_ListOfInterference& List) const 
606 {
607   TopOpeBRepDS_PointIterator it(List);
608   if (it.More()) {
609     TopOpeBRepDS_ListOfInterference SList;
610     SortOnParameter(List,SList);
611     List.Assign(SList);
612   }
613 }
614
615 //=======================================================================
616 //function : MinMaxOnParameter
617 //purpose  : 
618 //=======================================================================
619 void TopOpeBRepDS_HDataStructure::MinMaxOnParameter
620 (const TopOpeBRepDS_ListOfInterference& List,
621  Standard_Real& parmin,Standard_Real& parmax) const 
622 {
623   if ( ! List.IsEmpty() ) {
624     Standard_Real parline;
625     parmin = RealLast(); parmax = RealFirst();
626     TopOpeBRepDS_PointIterator it(List);
627     for ( ; it.More(); it.Next()) {
628       parline = it.Parameter();
629       parmin = Min(parmin,parline); 
630       parmax = Max(parmax,parline);
631     } 
632   }
633 }
634
635 //-----------------------------------------------------------------------
636 // Search, among a list of interferences accessed by the iterator <IT>,
637 // a geometry whose 3D point is identical yo the 3D point of a DS point <PDS>.
638 // return True if such an interference has been found, False else.
639 // if True, iterator <IT> points (by the Value() method) on the first 
640 // interference accessing an identical 3D point.
641 //-----------------------------------------------------------------------
642 //=======================================================================
643 //function : ScanInterfList
644 //purpose  : 
645 //=======================================================================
646 Standard_Boolean TopOpeBRepDS_HDataStructure::ScanInterfList
647 (TopOpeBRepDS_ListIteratorOfListOfInterference& IT,
648  const TopOpeBRepDS_Point& PDS) const
649 {
650   for ( ; IT.More(); IT.Next() ) {
651     TopOpeBRepDS_Kind GT = IT.Value()->GeometryType();
652     Standard_Integer  G  = IT.Value()->Geometry();
653     if ( GT == TopOpeBRepDS_POINT ) {
654       const TopOpeBRepDS_Point& OOPDS = myDS.Point(G);
655       Standard_Boolean iseq = PDS.IsEqual(OOPDS);
656       if (iseq) return iseq;
657     }
658     else if ( GT == TopOpeBRepDS_VERTEX ) {
659       TopOpeBRepDS_Point OOPDS(myDS.Shape(G));
660       Standard_Boolean iseq = PDS.IsEqual(OOPDS);
661       if (iseq) return iseq;
662     }
663   }
664   return Standard_False;
665 }
666
667 //=======================================================================
668 //function : GetGeometry
669 //purpose  : 
670 //=======================================================================
671
672 Standard_Boolean TopOpeBRepDS_HDataStructure::GetGeometry
673 (TopOpeBRepDS_ListIteratorOfListOfInterference& IT,
674  const TopOpeBRepDS_Point&                      PDS,
675  Standard_Integer&                              G,
676  TopOpeBRepDS_Kind&                             K) const 
677 {
678   Standard_Boolean found = ScanInterfList(IT,PDS);
679   if (found) {
680     G  = IT.Value()->Geometry();
681     K  = IT.Value()->GeometryType();
682   }
683   return found;
684 }
685
686 #ifdef DEB
687 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettraceSTRANGE();
688 Standard_IMPORT Standard_Boolean TopOpeBRepDS_GettraceSPSX(const Standard_Integer);
689 static Standard_Boolean TRC(const Standard_Integer SIX) {
690   Standard_Boolean b1 = TopOpeBRepDS_GettraceSTRANGE();
691   Standard_Boolean b2 = TopOpeBRepDS_GettraceSPSX(SIX);
692   return (b1 || b2);
693 }
694 void debstore(const Standard_Integer /*i*/) {}
695 #endif
696
697 //=======================================================================
698 //function : StoreInterference
699 //purpose  : Append an interference I to a list of interference LI
700 //           Append I to the interf. list connected to I Geometry()
701 //=======================================================================
702 void TopOpeBRepDS_HDataStructure::StoreInterference
703 (const Handle(TopOpeBRepDS_Interference)& I,TopOpeBRepDS_ListOfInterference& LI,
704 #ifdef DEB
705  const TCollection_AsciiString& str)
706 #else
707  const TCollection_AsciiString& )
708 #endif
709 {
710 #ifdef DEB
711   const TopOpeBRepDS_Transition& T = I->Transition();
712
713   TopAbs_ShapeEnum sb = T.ShapeBefore();
714   Standard_Integer ib = T.IndexBefore();
715   Standard_Boolean bok = Standard_True;
716   if (ib != 0) {
717     TopAbs_ShapeEnum sbds = myDS.Shape(ib).ShapeType();
718     bok = (sbds == sb);
719   }
720
721   TopAbs_ShapeEnum sa = T.ShapeAfter();
722   Standard_Integer ia = T.IndexAfter();
723   Standard_Boolean aok = Standard_True;
724   if (ia != 0) {
725     TopAbs_ShapeEnum sads = myDS.Shape(ia).ShapeType();
726     aok = (sads == sa);
727   }
728
729   TopOpeBRepDS_Kind ks = I->SupportType();
730   TopAbs_ShapeEnum ss = TopOpeBRepDS::KindToShape(ks);
731   Standard_Integer is = I->Support();
732   Standard_Boolean sok = Standard_True;
733   if ((is != 0) && (ks >= TopOpeBRepDS_EDGE)) {
734     TopAbs_ShapeEnum ssds = myDS.Shape(is).ShapeType();
735     sok = (ssds == ss);
736   }
737   
738   if (!aok) { 
739     if (TRC(ia)) cout<<"HDSstore ia,ib  is "<<ia<<","<<ib<<"  "<<is<<endl;
740     debstore(ia);
741   }
742   if (!bok ) {
743     if (TRC(ib)) cout<<"HDSstore ia,ib  is "<<ia<<","<<ib<<"  "<<is<<endl;
744     debstore(ib);
745   }
746   if (!sok ) {
747     if (TRC(is)) cout<<"HDSstore ia,ib  is "<<ia<<","<<ib<<"  "<<is<<endl;
748     debstore(is);
749   }
750 #endif
751
752   // append I to list LI
753   LI.Append(I);
754
755   Standard_Boolean appendtoG = Standard_False;
756   Standard_Integer G = I->Geometry();
757
758   // append I to list of interference connected to G = I->Geometry()
759   switch (I->GeometryType()) {
760
761   case TopOpeBRepDS_SOLID : case TopOpeBRepDS_FACE : 
762   case TopOpeBRepDS_EDGE : case TopOpeBRepDS_VERTEX :
763 //    appendtoG = Standard_True;
764 //    myDS.ChangeShapeInterferences(G).Append(I);
765     break;
766     
767   case TopOpeBRepDS_SURFACE :
768     appendtoG = Standard_True;
769     myDS.ChangeSurfaceInterferences(G).Append(I);
770     break;
771     
772   case TopOpeBRepDS_CURVE :
773     appendtoG = Standard_True;
774     myDS.ChangeCurveInterferences(G).Append(I);
775     break;
776     
777   case TopOpeBRepDS_POINT :
778 //    appendtoG = Standard_True;
779 //    myDS.ChangePointInterferences(G).Append(I);
780     break;
781   default:
782     break;
783   }
784
785 #ifdef DEB
786   Standard_Boolean trc = ::traceSTORE();
787   if (trc) {
788     cout<<str<<"append "; I->Dump(cout);
789     if (appendtoG) cout<<" and to G"<<G<<" list";
790     cout<<endl;
791   }
792 #endif
793 }
794
795 //=======================================================================
796 //function : StoreInterference
797 //purpose  : 
798 //=======================================================================
799 void TopOpeBRepDS_HDataStructure::StoreInterference
800 (const Handle(TopOpeBRepDS_Interference)& I,const TopoDS_Shape& S,
801 #ifdef DEB
802  const TCollection_AsciiString& str)
803 #else
804  const TCollection_AsciiString& )
805 #endif
806 {
807   Standard_Boolean h = myDS.HasShape(S);
808   if ( !h ) {
809     Standard_ProgramError::Raise("StoreInterference on shape out of DS");
810     return;
811   }
812
813 #ifdef DEB
814   Standard_Boolean trc = ::traceSTORE();
815   TopOpeBRepDS_Kind ks = TopOpeBRepDS::ShapeToKind(S.ShapeType());
816   Standard_Integer is = myDS.Shape(S);
817   if (trc) TopOpeBRepDS::Print(ks,is,cout,str," : ");
818 #endif
819
820   StoreInterference(I,myDS.ChangeShapeInterferences(S));
821 }
822
823 //=======================================================================
824 //function : StoreInterference
825 //purpose  : 
826 //=======================================================================
827
828 void TopOpeBRepDS_HDataStructure::StoreInterference
829 (const Handle(TopOpeBRepDS_Interference)& I,
830  const Standard_Integer IS,
831 #ifdef DEB
832  const TCollection_AsciiString& str)
833 #else
834  const TCollection_AsciiString& )
835 #endif
836 {
837   Standard_Integer n = myDS.NbShapes();
838   if ( IS < 1 || IS > n ) {
839     Standard_ProgramError::Raise("StoreInterference on index out of DS");
840     return;
841   }
842
843 #ifdef DEB
844   Standard_Boolean trc = ::traceSTORE();
845   const TopoDS_Shape& S = Shape(IS);
846   TopOpeBRepDS_Kind ks = TopOpeBRepDS::ShapeToKind(S.ShapeType());
847   if (trc) TopOpeBRepDS::Print(ks,IS,cout,str," : ");
848 #endif
849   
850   StoreInterference(I,myDS.ChangeShapeInterferences(IS));
851 }
852
853 //=======================================================================
854 //function : StoreInterference
855 //purpose  : 
856 //=======================================================================
857 void TopOpeBRepDS_HDataStructure::StoreInterferences
858 (const TopOpeBRepDS_ListOfInterference& LI,const Standard_Integer IS
859 // ,const TCollection_AsciiString& str)
860  ,const TCollection_AsciiString& )
861 {
862   TopOpeBRepDS_ListOfInterference& lids = myDS.ChangeShapeInterferences(IS);
863   TopOpeBRepDS_ListIteratorOfListOfInterference it(LI);
864   for (; it.More(); it.Next()){
865     const Handle(TopOpeBRepDS_Interference)& I = it.Value();
866     StoreInterference(I,lids);
867   }
868 }
869
870 //=======================================================================
871 //function : StoreInterferences
872 //purpose  : 
873 //=======================================================================
874 void TopOpeBRepDS_HDataStructure::StoreInterferences
875 (const TopOpeBRepDS_ListOfInterference& LI,const TopoDS_Shape& S
876 // ,const TCollection_AsciiString& str)
877  ,const TCollection_AsciiString& )
878 {
879   TopOpeBRepDS_ListOfInterference& lids = myDS.ChangeShapeInterferences(S);
880   TopOpeBRepDS_ListIteratorOfListOfInterference it(LI);
881   for (; it.More(); it.Next()){
882     const Handle(TopOpeBRepDS_Interference)& I = it.Value();
883     StoreInterference(I,lids);
884   }
885 }
886
887 //=======================================================================
888 //function : ClearStoreInterferences
889 //purpose  : 
890 //=======================================================================
891 void TopOpeBRepDS_HDataStructure::ClearStoreInterferences
892 (const TopOpeBRepDS_ListOfInterference& LI,const Standard_Integer IS
893 // ,const TCollection_AsciiString& str)
894  ,const TCollection_AsciiString& )
895 {
896   TopOpeBRepDS_ListOfInterference& lids = myDS.ChangeShapeInterferences(IS);
897   lids.Clear();
898   TopOpeBRepDS_ListIteratorOfListOfInterference it(LI);
899   for (; it.More(); it.Next()){
900     const Handle(TopOpeBRepDS_Interference)& I = it.Value();
901     StoreInterference(I,lids);
902   }
903 }
904
905 //=======================================================================
906 //function : ClearStoreInterferences
907 //purpose  : 
908 //=======================================================================
909 void TopOpeBRepDS_HDataStructure::ClearStoreInterferences
910 (const TopOpeBRepDS_ListOfInterference& LI,const TopoDS_Shape& S
911 // ,const TCollection_AsciiString& str)
912  ,const TCollection_AsciiString& )
913 {
914   TopOpeBRepDS_ListOfInterference& lids = myDS.ChangeShapeInterferences(S);
915   lids.Clear();
916   TopOpeBRepDS_ListIteratorOfListOfInterference it(LI);
917   for (; it.More(); it.Next()){
918     const Handle(TopOpeBRepDS_Interference)& I = it.Value();
919     StoreInterference(I,lids);
920   }
921 }