0024023: Revamp the OCCT Handle -- downcast (automatic)
[occt.git] / src / TopOpeBRepDS / TopOpeBRepDS_Check.cxx
1 // Created on: 1997-04-10
2 // Created by: Prestataire Mary FABIEN
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <TCollection_AsciiString.hxx>
18 #include <TopOpeBRepDS_Check.ixx>
19 #include <TopOpeBRepDS_Kind.hxx>
20 #include <TopOpeBRepDS_CheckStatus.hxx>
21 #include <TopOpeBRepDS_PointExplorer.hxx>
22 #include <TopOpeBRepDS.hxx>
23 #include <TopOpeBRepDS_Interference.hxx>
24 #include <TopOpeBRepDS_EdgeVertexInterference.hxx>
25 #include <TopOpeBRepDS_CurvePointInterference.hxx>
26 #include <TopOpeBRepDS_ListOfInterference.hxx>
27 #include <TopOpeBRepDS_ListIteratorOfListOfInterference.hxx>
28 #include <TopOpeBRepDS_InterferenceTool.hxx>
29 #include <TopTools_ListIteratorOfListOfShape.hxx>
30 #include <TopTools_ListOfShape.hxx>
31 #include <TopOpeBRepTool_ShapeTool.hxx>
32 #include <TColStd_IndexedMapOfInteger.hxx>
33 #include <BRep_Tool.hxx>
34 #include <TopoDS.hxx>
35 #include <TopoDS_Shape.hxx>
36 #include <TopoDS_Vertex.hxx>
37 #include <gp_Pnt.hxx>
38 #include <string.h>
39 #include <TopOpeBRepDS_DataMapOfCheckStatus.hxx>
40 #include <TopOpeBRepDS_DataMapIteratorOfDataMapOfCheckStatus.hxx>
41
42 //=======================================================================
43 //function : Create
44 //purpose  : 
45 //=======================================================================
46
47 TopOpeBRepDS_Check::TopOpeBRepDS_Check(const Handle(TopOpeBRepDS_HDataStructure)& HDS)
48 {
49   myHDS = HDS;
50   myMapSurfaceStatus.Clear();
51   myMapCurveStatus.Clear();
52   myMapPointStatus.Clear();
53   myMapShapeStatus.Clear();
54 }
55
56 //=======================================================================
57 //function : Create
58 //purpose  : 
59 //=======================================================================
60
61 TopOpeBRepDS_Check::TopOpeBRepDS_Check()
62 {
63     myMapSurfaceStatus.Clear();
64     myMapCurveStatus.Clear();
65     myMapPointStatus.Clear();
66     myMapShapeStatus.Clear();
67 }
68
69 //=======================================================================
70 //function : ChkIntg
71 //purpose  : Check Integrity
72 //=======================================================================
73 Standard_Boolean CheckEdgeParameter(const Handle(TopOpeBRepDS_HDataStructure)& myHDS);
74 Standard_Boolean TopOpeBRepDS_Check::ChkIntg()
75 {
76   const TopOpeBRepDS_DataStructure& DS = myHDS->DS();
77   Standard_Boolean bI=Standard_False;
78   // Check the integrity of the DS
79   Standard_Integer i,nshape = DS.NbShapes();
80   for (i = 1; i <= nshape; i++) {
81     // Integrity of Interferences : Check support and geometry
82     const TopOpeBRepDS_ListOfInterference& LI = DS.ShapeInterferences(i);
83     bI = ChkIntgInterf(LI);
84   }
85   Standard_Integer nsurface = DS.NbSurfaces();
86   for (i = 1; i <= nsurface; i++) {
87     // Integrity of Interferences : Check support and geometry
88     const TopOpeBRepDS_ListOfInterference& LI = DS.SurfaceInterferences(i);
89     bI = bI && ChkIntgInterf(LI);
90   }
91   
92   Standard_Integer ncurve = DS.NbCurves();
93   for (i = 1; i <= ncurve; i++) {
94     // Integrity of Interferences : Check support and geometry
95     const TopOpeBRepDS_ListOfInterference& LI = DS.CurveInterferences(i);
96     bI = bI && ChkIntgInterf(LI);
97   }
98   
99   Standard_Integer npoint = DS.NbPoints();
100   for (i = 1; i <= npoint; i++) {
101     // Integrity of Interferences : Check support and geometry
102     const TopOpeBRepDS_ListOfInterference& LI = DS.PointInterferences(i);
103     bI = bI && ChkIntgInterf(LI);
104   }
105   
106 #ifdef OCCT_DEBUG
107   PrintIntg(cout);
108 #endif
109 //  CheckEdgeParameter();
110   CheckEdgeParameter(myHDS);
111
112   return bI;
113 }
114
115 //=======================================================================
116 //function : ChkIntgInterf
117 //purpose  : 
118 //=======================================================================
119
120 Standard_Boolean TopOpeBRepDS_Check::ChkIntgInterf
121 (const TopOpeBRepDS_ListOfInterference& LI)
122 {
123   TopOpeBRepDS_ListIteratorOfListOfInterference it1;
124   it1.Initialize(LI);
125   Standard_Boolean IsOK = Standard_True;
126   while (it1.More() ) {
127     Handle(TopOpeBRepDS_Interference)& I1 = it1.Value();
128     IsOK = IsOK && CheckDS(I1->Support(), I1->SupportType());
129     IsOK = IsOK && CheckDS(I1->Geometry(), I1->GeometryType());
130     it1.Next();
131   }
132   return IsOK;
133
134
135 //=======================================================================
136 //function : CheckDS
137 //purpose  : 
138 //=======================================================================
139
140 Standard_Boolean TopOpeBRepDS_Check::CheckDS(const Standard_Integer I,
141                                              const TopOpeBRepDS_Kind K)
142 {
143   // geometry
144   switch(K) {
145   case TopOpeBRepDS_SURFACE :
146     {
147       if(myHDS->NbSurfaces() < I) {
148 #ifdef OCCT_DEBUG
149         cout<<"Surpassed index of TopOpeBRepDS_SURFACE. actual index : "<<I;
150         cout<<". Index max : "<<myHDS->NbSurfaces();
151 #endif
152         if(myMapSurfaceStatus.IsBound(I))
153           myMapSurfaceStatus.UnBind(I);
154         myMapSurfaceStatus.Bind(I, TopOpeBRepDS_NOK);
155         return Standard_False;
156       }
157       if(!myMapSurfaceStatus.IsBound(I))
158         myMapSurfaceStatus.Bind(I,TopOpeBRepDS_OK);
159       return Standard_True;
160     }
161   case TopOpeBRepDS_CURVE :
162     {
163       if(myHDS->NbCurves() < I) {
164 #ifdef OCCT_DEBUG
165         cout<<"Surpassed index of TopOpeBRepDS_CURVE. actual index : "<<I;
166         cout<<". Index max : "<<myHDS->NbCurves();
167 #endif
168         if(myMapCurveStatus.IsBound(I))
169           myMapCurveStatus.UnBind(I);
170         myMapCurveStatus.Bind(I, TopOpeBRepDS_NOK);
171         return Standard_False;
172       }
173       
174       if(!myMapCurveStatus.IsBound(I))
175         myMapCurveStatus.Bind(I,TopOpeBRepDS_OK);
176       return Standard_True;
177     }
178   case TopOpeBRepDS_POINT :
179     {
180       if(myHDS->NbPoints() < I) {
181 #ifdef OCCT_DEBUG
182         cout<<"Surpassed index of TopOpeBRepDS_POINT : actual index : "<<I;
183         cout<<". Index max : "<<myHDS->NbPoints()<<endl;
184 #endif
185         if(myMapPointStatus.IsBound(I))
186           myMapPointStatus.UnBind(I);
187         myMapPointStatus.Bind(I, TopOpeBRepDS_NOK);
188         return Standard_False;
189       }
190       if(!myMapPointStatus.IsBound(I))
191         myMapPointStatus.Bind(I,TopOpeBRepDS_OK);
192       return Standard_True;
193     }
194   default:
195     break ;
196   }
197   
198
199   // topology
200   if(myHDS->NbShapes() < I) {
201 #ifdef OCCT_DEBUG
202     cout<<"Surpassed index of TopOpeBRepDS_Shape_. actual index : "<<I;
203     cout<<". Index max : "<<myHDS->NbShapes();
204 #endif
205     if(myMapShapeStatus.IsBound(I))
206       myMapShapeStatus.UnBind(I);
207     myMapShapeStatus.Bind(I,TopOpeBRepDS_NOK);
208     return Standard_False;
209   }
210   const TopoDS_Shape& S =myHDS->Shape(I);
211
212   TopAbs_ShapeEnum se=TopAbs_COMPOUND;
213
214   switch (K) {
215   case TopOpeBRepDS_SOLID  : se = TopAbs_SOLID; break;
216   case TopOpeBRepDS_SHELL  : se = TopAbs_SHELL; break;
217   case TopOpeBRepDS_FACE   : se = TopAbs_FACE;  break;
218   case TopOpeBRepDS_WIRE   : se = TopAbs_WIRE;  break;
219   case TopOpeBRepDS_EDGE   : se = TopAbs_EDGE;  break;
220   case TopOpeBRepDS_VERTEX : se = TopAbs_VERTEX;break;
221   default:
222     break ;
223   }
224   if(S.ShapeType() != se) {
225 #ifdef OCCT_DEBUG
226     cout<<"Error :  Shape "<<I<<" is a ";
227     TopOpeBRepDS::Print(TopOpeBRepDS::ShapeToKind(S.ShapeType()), cout);
228     cout<<" and not a ";
229     TopOpeBRepDS::Print(K, cout);
230     cout<<endl;
231 #endif
232     if(myMapShapeStatus.IsBound(I))
233       myMapShapeStatus.UnBind(I);
234     myMapShapeStatus.Bind(I,TopOpeBRepDS_NOK);
235     return Standard_False;
236   }
237   if(!myMapShapeStatus.IsBound(I))
238     myMapShapeStatus.Bind(I,TopOpeBRepDS_OK);
239   return Standard_True;;
240 }
241
242 //=======================================================================
243 //function : ChkIntgSamDom
244 //purpose  : 
245 //=======================================================================
246
247 Standard_Boolean TopOpeBRepDS_Check::ChkIntgSamDom()
248 {
249   Standard_Boolean b = Standard_True, bb = Standard_False;
250   TopOpeBRepDS_DataStructure& BDS = myHDS->ChangeDS();
251   Standard_Integer NbSh = myHDS->NbShapes(), i, Curr, Loc;
252   for(i = 1;i <= NbSh; i++) {
253     // Verifie que les Shapes de mySameDomaine existe bien dans la DS
254     const TopoDS_Shape& Sind = myHDS->Shape(i);
255     const TopTools_ListOfShape& losi = BDS.ShapeSameDomain(Sind);
256     if(!CheckShapes(losi)) {
257 #ifdef OCCT_DEBUG
258       cout<<"Shape of ShapeSameDomain (n*n "<<i;
259       cout<<") is not defined in the DS"<<endl;
260 #endif
261       b = Standard_False;
262     }
263     
264     // Verification de SameDomaineRef
265     Curr = BDS.SameDomainRef(i);
266     Loc = BDS.SameDomainRef(Curr);
267     if(Curr && (Curr != Loc)) {
268 #ifdef OCCT_DEBUG
269       cout<<"SameDomaineRef of Shape "<<i<<" = "<<Curr;
270       cout<<". SameDomaineRef of Shape "<<Curr<<" = "<<Loc<<endl;
271 #endif
272       b = Standard_False;
273     }
274     
275     if(Curr) {
276       // Verification du type des differents Shapes SameDomain
277       const TopoDS_Shape& Sref = myHDS->Shape(Curr);
278       if(Sind.ShapeType() != Sref.ShapeType()) {
279 #ifdef OCCT_DEBUG
280         cout<<"Shapes n*n "<<i<<" and "<<Curr<<" are SameDomain."<<endl;
281         cout<<"Type of Shape n*n "<<i<<" = ";
282         PrintShape(Sind.ShapeType(),cout);
283         cout<<endl<<"Type of Shape n*n "<<Curr<<" = ";
284         PrintShape(Sref.ShapeType(),cout); cout<<endl;
285 #endif
286         b = Standard_False;
287       }
288
289       // Verifier que ShapeSameDomain(Sref) contient bien Sind
290       // sauf si Sind == Sref
291       if(i != Curr) {
292         const TopTools_ListOfShape& losr = BDS.ShapeSameDomain(Sref);
293         TopTools_ListIteratorOfListOfShape liolos;
294         liolos.Initialize(losr);
295         while (liolos.More() ) {
296           const TopoDS_Shape& Sh = liolos.Value();
297           Loc = myHDS->Shape(Sh);
298           if(Loc == i) {
299             bb = Standard_True;
300             break;
301           }
302           liolos.Next();
303         }
304         if(!bb) {
305 #ifdef OCCT_DEBUG
306           cout<<"Shapes n*n "<<i<<" and  "<<Curr<<" are SameDomain. ";
307           cout<<"The reference of "<<i<<", is "<<Curr<<"."<<endl;
308           cout<<"However, Shape n*n "<<i;
309           cout<<" is not in the list of Shape SameDomain of "<<Curr<<endl;
310 #endif
311           b = Standard_False;
312         }
313       }
314     }
315   }
316   return b;
317 }
318
319 //=======================================================================
320 //function : CheckShapes
321 //purpose  : 
322 //=======================================================================
323
324 Standard_Boolean TopOpeBRepDS_Check::CheckShapes
325 (const TopTools_ListOfShape& LS ) const
326 {
327   Standard_Integer index;
328   TopTools_ListIteratorOfListOfShape it(LS);
329   while (it.More()) {
330     const TopoDS_Shape& itS = it.Value();
331     index = myHDS->Shape(itS);
332     if (!index) return Standard_False;
333     it.Next();
334   }
335   return Standard_True;
336 }
337
338 //=======================================================================
339 //function : OneVertexOnPnt
340 //purpose  : 
341 //=======================================================================
342
343 Standard_Boolean TopOpeBRepDS_Check::OneVertexOnPnt(){
344   Standard_Boolean b = Standard_True;
345 //  Standard_Integer i, j, k;
346   Standard_Integer i, j;
347   Standard_Integer Curr1, Curr2, sdr1, sdr2;
348   Standard_Integer NbVe = 0, NbPo = myHDS->NbPoints();
349 //  Standard_Real tol, tol1, tol2, Dist;
350   Standard_Real tol1, tol2, Dist;
351   TColStd_IndexedMapOfInteger vert;
352   vert.Clear();
353   for(i = 1;i <= myHDS->NbShapes();i++) {
354     const TopoDS_Shape& S = myHDS->Shape(i);
355     if((S.ShapeType() == TopAbs_VERTEX) &&
356        myHDS->HasShape(S))
357       vert.Add(i);
358   }
359   NbVe = vert.Extent();
360   for(i = 1;i <= NbVe; i++) {
361     Curr1 = vert.FindKey(i);
362     const TopoDS_Shape& S1 = myHDS->Shape(Curr1);
363     sdr1 = myHDS->SameDomainReference(S1);
364     for(j = i+1;j <= NbVe; j++) {
365       Curr2 = vert.FindKey(j);
366       const TopoDS_Shape& S2 = myHDS->Shape(Curr2);
367       sdr2 = myHDS->SameDomainReference(S2);
368       tol1 = TopOpeBRepTool_ShapeTool::Tolerance(S1);
369       tol2 = TopOpeBRepTool_ShapeTool::Tolerance(S2);
370       const gp_Pnt& P1 = TopOpeBRepTool_ShapeTool::Pnt(S1);
371       const gp_Pnt& P2 = TopOpeBRepTool_ShapeTool::Pnt(S2);
372       Dist = P1.Distance(P2);
373       if(Dist <= tol1 + tol2) {
374         if(sdr1 != sdr2) {
375 #ifdef OCCT_DEBUG
376           cout<<"Pb Vertex n+n"<<Curr1<<" and n*n"<<Curr2;
377           cout<<" : same place, not SameDomain"<<endl;
378           cout<<"  Tol of Vertex n*n"<<Curr1<<" = "<<tol1<<endl;
379           cout<<"  Tol of Vertex n*n"<<Curr2<<" = "<<tol2<<endl;
380           cout<<"  Distance between two Vertexes = "<<Dist<<endl<<endl;
381 #endif
382           b = Standard_False;
383         }
384       }
385       else if(sdr1 == sdr2) {
386 #ifdef OCCT_DEBUG
387         cout<<"Pb Vertex "<<Curr1<<" and "<<Curr2;
388         cout<<" : SameDomain, not same place"<<endl;
389         cout<<"  Tol of Vertex n*n"<<Curr1<<" = "<<tol1<<endl;
390         cout<<"  Tol of Vertex n*n"<<Curr2<<" = "<<tol2<<endl;
391         cout<<" Distance between two Vertexes = "<<Dist<<endl<<endl;
392 #endif
393         b = Standard_False;
394       }
395     }
396     TopOpeBRepDS_PointExplorer PE(myHDS->DS());
397     for(;PE.More(); PE.Next()) {
398       const TopOpeBRepDS_Point& dsPnt = PE.Point();
399       const gp_Pnt& Pnt1 = dsPnt.Point();
400       tol1 = dsPnt.Tolerance();
401       tol2 = TopOpeBRepTool_ShapeTool::Tolerance(S1);
402       const gp_Pnt& Pnt2 = TopOpeBRepTool_ShapeTool::Pnt(S1);
403       Dist = Pnt1.Distance(Pnt2);
404       if(Dist <= tol1 + tol2) {
405 #ifdef OCCT_DEBUG
406         cout<<"Attention : Vertex "<<Curr1<<" and Point "<<PE.Index();
407         cout<<" are confused"<<endl;
408         cout<<"  Tol of Vertex n*n"<<Curr1<<" = "<<tol1<<endl;
409         cout<<"  Tol of Point  n*n"<<PE.Index()<<" = "<<tol2<<endl;
410         cout<<"  Distance between the two = "<<Dist<<endl<<endl;        
411 #endif
412         b = Standard_False;
413       }
414     }
415   }
416   for(i = 1;i <= NbPo; i++) {
417     TopOpeBRepDS_PointExplorer PE(myHDS->DS());
418     if(PE.IsPoint(i)) {
419       const TopOpeBRepDS_Point& dsPnt1 = myHDS->Point(i);
420       for(j = i+1;j < NbPo;j++) {
421         const TopOpeBRepDS_Point& dsPnt2 = myHDS->Point(j);
422         if(dsPnt1.IsEqual(dsPnt2)) {
423 #ifdef OCCT_DEBUG
424           cout<<"Attention : points "<<i<<" and "<<j<<" are confused"<<endl;
425           cout<<"  Tol of Point n*n"<<i<<" = "<<dsPnt1.Tolerance()<<endl;
426           cout<<"  Tol of Point n*n"<<j<<" = "<<dsPnt1.Tolerance()<<endl;
427           Dist = dsPnt1.Point().Distance(dsPnt2.Point());
428           cout<<"  Distance between the two = "<<Dist<<endl<<endl;      
429 #endif
430         }
431       }
432     }
433   }
434   
435   return b;
436 }
437
438 //=======================================================================
439 //function : CheckEdgeParameter
440 //purpose  : 
441 //=======================================================================
442
443 ///Standard_Boolean TopOpeBRepDS_Check::CheckEdgeParameter() const
444 Standard_Boolean CheckEdgeParameter(const Handle(TopOpeBRepDS_HDataStructure)& myHDS)
445 {
446   TopOpeBRepDS_ListIteratorOfListOfInterference it1;
447   const TopOpeBRepDS_DataStructure& DS = myHDS->DS();
448   Standard_Integer i,nshape = DS.NbShapes();
449   Standard_Boolean IsOK = Standard_True;
450   for (i = 1; i <= nshape; i++) {
451     // Integrity of Interferences : Check parameter of EdgeInterferences
452     const TopOpeBRepDS_ListOfInterference& LI = DS.ShapeInterferences(i);
453     it1.Initialize(LI);
454     while (it1.More() ) {
455       Handle(TopOpeBRepDS_Interference)& I1 = it1.Value();
456       Handle(TopOpeBRepDS_EdgeVertexInterference) EVI =
457         Handle(TopOpeBRepDS_EdgeVertexInterference)::DownCast(I1);
458       if(!EVI.IsNull()) {
459 //#ifdef OCCT_DEBUG
460 //      Standard_Integer Param = EVI->Parameter();
461 //#else
462         Standard_Integer Param = (Standard_Integer ) EVI->Parameter();
463 //#endif
464         if(Param > 1.e50) {
465           I1->Dump(cout,"!!**!!** WARNING : sur l'interference : \n",
466                    "parameter > 1.e50");
467           IsOK = Standard_False;
468         }
469       }
470       it1.Next();
471     }
472   }
473   
474   Standard_Integer ncurve = DS.NbCurves();
475   for (i = 1; i <= ncurve; i++) {
476     // Integrity of Interferences : Check parameter of CurvesInterferences
477     const TopOpeBRepDS_ListOfInterference& LI = DS.CurveInterferences(i);
478     it1.Initialize(LI);
479     while (it1.More() ) {
480       const Handle(TopOpeBRepDS_Interference)& I1 = it1.Value();
481       Handle(TopOpeBRepDS_CurvePointInterference) CPI (Handle(TopOpeBRepDS_CurvePointInterference)::DownCast(I1));
482       if(!CPI.IsNull()) {
483         Standard_Integer Param = 
484 //#ifdef OCCT_DEBUG
485 //        TopOpeBRepDS_InterferenceTool::Parameter(CPI);
486 //#else
487           (Standard_Integer ) TopOpeBRepDS_InterferenceTool::Parameter(CPI);
488 //#endif
489         if(Param > 1.e50) {
490           I1->Dump(cout,"!!**!!** WARNING : sur l'interference : \n",
491                    "parameter > 1.e50");
492           IsOK = Standard_False;
493         }
494       }
495       it1.Next();
496     }
497     
498   }
499   return IsOK;
500 }
501
502 //=======================================================================
503 //function : PrintIntg
504 //purpose  : 
505 //=======================================================================
506 Standard_OStream& TopOpeBRepDS_Check::PrintIntg(Standard_OStream& OS)
507 {
508   OS<<endl<<endl<<"************************************************"<<endl;
509   OS<<"state of the DS : (only the tested elements)"<<endl<<endl;
510   
511   //Display of the geometry
512   PrintMap(myMapSurfaceStatus, "Surface", OS);
513   PrintMap(myMapCurveStatus,   "Curve",   OS);
514   PrintMap(myMapPointStatus,   "Point",   OS);
515   
516   //display of the topology
517   TopOpeBRepDS_DataMapIteratorOfDataMapOfCheckStatus DMI(myMapShapeStatus);
518   TopOpeBRepDS_DataMapOfCheckStatus MapVertex, MapEdge, MapWire, MapFace, MapSolid;
519   Standard_Integer i;
520   // different Map keep their index of myMapShapeStatus
521   for(DMI.Reset();DMI.More();DMI.Next()) {
522     i = DMI.Key();
523     const TopoDS_Shape& S =myHDS->Shape(i);
524     switch(S.ShapeType()) {
525     case TopAbs_VERTEX: MapVertex.Bind(i, DMI.Value()); break;
526     case TopAbs_EDGE: MapEdge.Bind(i, DMI.Value()); break;
527     case TopAbs_WIRE: MapWire.Bind(i, DMI.Value()); break;
528     case TopAbs_FACE: MapFace.Bind(i, DMI.Value()); break;
529     case TopAbs_SOLID: MapSolid.Bind(i, DMI.Value()); break;
530     default:
531       break ;
532     }
533   }
534   
535   PrintMap(MapVertex, "Vertex", OS);
536   PrintMap(MapEdge, "Edge",   OS);
537   PrintMap(MapWire, "Wire",   OS);
538   PrintMap(MapFace, "Face",   OS);
539   PrintMap(MapSolid, "Solid",  OS);
540   
541   OS<<endl<<endl;
542   return OS;
543 }
544
545 //=======================================================================
546 //function : PrintMap
547 //purpose  : 
548 //=======================================================================
549
550 Standard_OStream& TopOpeBRepDS_Check::PrintMap(TopOpeBRepDS_DataMapOfCheckStatus& MapStat,
551                                                const Standard_CString eltstr,
552                                                Standard_OStream& OS)
553 {
554   TopOpeBRepDS_DataMapIteratorOfDataMapOfCheckStatus DMI(MapStat);
555   DMI.Initialize(MapStat);
556   if(DMI.More()) {
557     Standard_Boolean b = Standard_True;
558     OS<<" "<<eltstr<<"\t"<<"(/"<<MapStat.Extent()<<")\tnumber ";
559     
560     PrintElts(MapStat, TopOpeBRepDS_OK,  b, OS);
561     if(!b) OS<<" = OK"<<endl;
562     PrintElts(MapStat, TopOpeBRepDS_NOK, b, OS);
563     if(!b) OS<<" = NOK"<<endl;
564   }    
565   return OS;
566 }
567
568 //=======================================================================
569 //function : PrintElts
570 //purpose  : Print the elements in the state stat of MapStat
571 //=======================================================================
572 Standard_OStream& TopOpeBRepDS_Check::PrintElts(TopOpeBRepDS_DataMapOfCheckStatus& MapStat,
573                                                 const TopOpeBRepDS_CheckStatus Stat,
574                                                 Standard_Boolean& b,
575                                                 Standard_OStream& OS)
576 {
577   TopOpeBRepDS_DataMapIteratorOfDataMapOfCheckStatus DMI(MapStat);
578   Standard_Boolean bb = !b;
579   b = Standard_True;
580   Standard_Integer i;
581   TopOpeBRepDS_CheckStatus s;
582   for(DMI.Reset();DMI.More();DMI.Next()) {
583     s = DMI.Value();
584     i = DMI.Key();
585     if(s == Stat) {
586       if(b) b=!b; 
587       if(bb){OS<<"\t\tnumber ";bb=!bb;}
588       OS<<i<<" ";
589     }
590   }
591   return OS;
592 }
593
594 //=======================================================================
595 //function : Print
596 //purpose  : 
597 //=======================================================================
598 Standard_OStream& TopOpeBRepDS_Check::Print
599 (const TopOpeBRepDS_CheckStatus stat,
600  Standard_OStream& OS)
601 {
602   switch(stat) {
603   case TopOpeBRepDS_OK: OS<<"OK";break;
604   case TopOpeBRepDS_NOK: OS<<"NOK";break;
605   default : break;
606   }
607   return OS;
608 }
609
610 //=======================================================================
611 //function : PrintShape
612 //purpose  : 
613 //=======================================================================
614 Standard_OStream& TopOpeBRepDS_Check::PrintShape
615 (const TopAbs_ShapeEnum SE,
616  Standard_OStream& OS)
617 {
618   switch(SE) {
619   case TopAbs_SOLID   : OS<<"Solid ";   break;
620   case TopAbs_SHELL   : OS<<"Shell ";   break;
621   case TopAbs_FACE    : OS<<"Face  ";    break;
622   case TopAbs_WIRE    : OS<<"Wire  ";    break;
623   case TopAbs_EDGE    : OS<<"Edge  ";    break;
624   case TopAbs_VERTEX  : OS<<"Vertex";  break;
625   default:
626     break ;
627   }
628   return OS;
629 }
630
631 //=======================================================================
632 //function : PrintShape
633 //purpose  : 
634 //=======================================================================
635 Standard_OStream& TopOpeBRepDS_Check::PrintShape
636 (const Standard_Integer index,
637  Standard_OStream& OS)
638 {
639   if(myHDS->NbShapes() < index) { 
640     OS<<"**PB**IN**TopOpeBRepDS_Check::PrintShape** ";
641     return OS;
642   }
643   if(!myMapShapeStatus.IsBound(index)) {
644     OS<<"NO CHECK HAS PROCESSING"<<endl;
645     return OS;
646   }
647   OS<<" ";
648 #ifdef OCCT_DEBUG
649   const TopoDS_Shape& S =
650 #endif
651                           myHDS->Shape(index);
652   
653 #ifdef OCCT_DEBUG
654   PrintShape(S.ShapeType(),cout);
655   OS<<" "<<index<<" = ";
656   Print(myMapShapeStatus.Find(index), cout);
657 #endif
658   return OS;
659 }
660
661 //=======================================================================
662 //function : HDS
663 //purpose  : 
664 //=======================================================================
665
666 const Handle(TopOpeBRepDS_HDataStructure)&  TopOpeBRepDS_Check::HDS()const 
667 {
668   return myHDS;
669 }
670
671
672 //=======================================================================
673 //function : ChangeHDS
674 //purpose  : 
675 //=======================================================================
676
677 Handle(TopOpeBRepDS_HDataStructure)&  TopOpeBRepDS_Check::ChangeHDS()
678 {
679   return myHDS;
680 }