e35547afbb5ad6825bb37a9f2b22c593a7d53473
[occt.git] / src / BRepTest / BRepTest_CheckCommands.cxx
1 // Created on: 1996-02-23
2 // Created by: Jacques GOUSSARD
3 // Copyright (c) 1996-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 <BRepTest.hxx>
18 #include <BRepAlgo.hxx>
19 #include <BRepCheck_Analyzer.hxx>
20 #include <BRepCheck_Result.hxx>
21 #include <BRepCheck_ListIteratorOfListOfStatus.hxx>
22 #include <TopoDS_Iterator.hxx>
23 #include <TopExp_Explorer.hxx>
24 #include <TopTools_DataMapOfShapeListOfShape.hxx>
25 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
26 #include <TopTools_DataMapIteratorOfDataMapOfIntegerListOfShape.hxx>
27 #include <TopTools_ListOfShape.hxx>
28 #include <TopTools_ListIteratorOfListOfShape.hxx>
29 #include <DBRep_DrawableShape.hxx>
30 #include <Draw_SequenceOfDrawable3D.hxx>
31 #include <BRepCheck.hxx>
32 #include <BRepCheck_Edge.hxx>
33 #include <Draw_Interpretor.hxx>
34 #include <Draw_Appli.hxx>
35 #include <Draw.hxx>
36 #include <DBRep.hxx>
37 #include <BRepTest.hxx>
38 #include <GeometryTest.hxx>
39 #include <Precision.hxx>
40 #include <LocalAnalysis.hxx>
41 #include <LocalAnalysis_SurfaceContinuity.hxx>
42 #include <Geom_SphericalSurface.hxx>
43 #include <Geom_Surface.hxx>
44 #include <Geom_Curve.hxx>
45 #include <Geom2d_TrimmedCurve.hxx>
46 #include <Geom2d_Curve.hxx>
47 #include <DrawTrSurf.hxx>
48 #include <GeomAbs_Shape.hxx>
49 #include <TCollection_AsciiString.hxx>
50 #include <TopoDS.hxx>
51 #include <TopExp.hxx>
52 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
53 #include <TopTools_MapOfShape.hxx>
54 #include <TopTools_MapIteratorOfMapOfShape.hxx>
55 #include <TopoDS_Shape.hxx>
56 #include <TopoDS_Edge.hxx>
57 #include <TopoDS_Face.hxx>
58 #include <BRep_Tool.hxx>
59
60 #include <TopOpeBRepTool_PurgeInternalEdges.hxx>
61 //#include <TopOpeBRepTool_FuseEdges.hxx>
62 #include <BRepLib.hxx>
63 #include <BRepLib_FuseEdges.hxx>
64
65 #include <TopTools_HSequenceOfShape.hxx>
66 #include <BRep_Builder.hxx>
67 #include <TopoDS_Compound.hxx>
68 #include <TColStd_HArray1OfInteger.hxx>
69
70 #include <Standard_ErrorHandler.hxx>
71 #include <Standard_Failure.hxx>
72
73 #include <stdio.h>
74
75 //Number of BRepCheck_Statuses in BRepCheck_Status.hxx file
76 //(BRepCheck_NoError is not considered, i.e. general status 
77 //is smaller by one specified in file)
78 static const Standard_Integer NumberOfStatus = 36;
79
80 static char* checkfaultyname = NULL;
81 Standard_EXPORT void BRepTest_CheckCommands_SetFaultyName(const char* name)
82 {
83   if (checkfaultyname != NULL) {
84     free(checkfaultyname);
85     checkfaultyname = NULL;
86   }
87   if (name == NULL) {
88     checkfaultyname = (char*)malloc(strlen("faulty_")+1);
89     strcpy(checkfaultyname,"faulty_");
90   }
91   else {
92     checkfaultyname = (char*)malloc(strlen(name)+1);
93     strcpy(checkfaultyname,name);
94   }
95 }
96
97
98 static TopTools_DataMapOfShapeListOfShape theMap;
99 static Standard_Integer nbfaulty = 0;
100 static Draw_SequenceOfDrawable3D lfaulty;
101
102 Standard_IMPORT Standard_Integer BRepCheck_Trace(const Standard_Integer phase);
103
104 //=======================================================================
105 //function : FindNamed
106 //=======================================================================
107 static Standard_Boolean FindNamed(const TopoDS_Shape& S,
108                                   char*& Name)
109 {
110   for (Standard_Integer i = 1 ;i <= lfaulty.Length(); i++) {
111     Handle(DBRep_DrawableShape) DS = 
112       Handle(DBRep_DrawableShape)::DownCast(lfaulty(i));
113     if (DS->Shape().IsSame(S)) {
114       Name = (char*)DS->Name();
115       return Standard_True;
116     }
117   }
118   return Standard_False;
119 }
120
121
122 //=======================================================================
123 //function : Contains
124 //=======================================================================
125 static Standard_Boolean Contains(const TopTools_ListOfShape& L,
126                                  const TopoDS_Shape& S)
127 {
128   TopTools_ListIteratorOfListOfShape it;
129   for (it.Initialize(L); it.More(); it.Next()) {
130     if (it.Value().IsSame(S)) {
131       return Standard_True;
132     }
133   }
134   return Standard_False;
135 }
136
137
138
139 //=======================================================================
140 //function : PrintSub
141 //=======================================================================
142 static void PrintSub(Standard_OStream& OS,
143                      const BRepCheck_Analyzer& Ana,
144                      const TopoDS_Shape& S,
145                      const TopAbs_ShapeEnum Subtype)
146      
147 {
148   char* Name;
149   BRepCheck_ListIteratorOfListOfStatus itl;
150   TopExp_Explorer exp;
151   for (exp.Init(S,Subtype); exp.More(); exp.Next()) {
152     const Handle(BRepCheck_Result)& res = Ana.Result(exp.Current());
153     const TopoDS_Shape& sub = exp.Current();
154     for (res->InitContextIterator();
155          res->MoreShapeInContext(); 
156          res->NextShapeInContext()) {
157       if (res->ContextualShape().IsSame(S) && 
158           !Contains(theMap(sub),S)) {
159         theMap(sub).Append(S);
160         itl.Initialize(res->StatusOnShape());
161         if (itl.Value() != BRepCheck_NoError) {
162           if (!FindNamed(sub,Name)) {
163             nbfaulty++;
164             Name = (char*)malloc(18*sizeof(char));
165             Sprintf(Name,"%s%d",checkfaultyname,nbfaulty);
166             DBRep::Set(Name,sub);
167             lfaulty.Append(Draw::Get((Standard_CString&)Name));
168           }
169           OS << "Shape " << Name << " ";
170           if (!FindNamed(S,Name)) {
171             nbfaulty++;
172             Name = (char*)malloc(18*sizeof(char));
173             Sprintf(Name,"%s%d",checkfaultyname,nbfaulty);
174             DBRep::Set(Name,S);
175             lfaulty.Append(Draw::Get((Standard_CString&)Name));
176           }
177           OS << " on shape " << Name << " :\n";
178           for (;itl.More(); itl.Next()) {
179             BRepCheck::Print(itl.Value(),OS);
180           }
181         }
182         break;
183       }
184     }
185   }
186 }
187
188
189 //=======================================================================
190 //function : Print
191 //=======================================================================
192 static void Print(Standard_OStream& OS,
193                   const BRepCheck_Analyzer& Ana,
194                   const TopoDS_Shape& S)
195 {
196   for (TopoDS_Iterator iter(S); iter.More(); iter.Next()) {
197     Print(OS,Ana,iter.Value());
198   }
199
200   char* Name;
201   TopAbs_ShapeEnum styp = S.ShapeType();
202   BRepCheck_ListIteratorOfListOfStatus itl;
203   if (!Ana.Result(S).IsNull() && !theMap.IsBound(S)) {
204     itl.Initialize(Ana.Result(S)->Status());
205     if (itl.Value() != BRepCheck_NoError) {
206       if (!FindNamed(S,Name)) {
207         nbfaulty++;
208         Name = (char*)malloc(18*sizeof(char));
209         Sprintf(Name,"%s%d",checkfaultyname,nbfaulty);
210         DBRep::Set(Name,S);
211         lfaulty.Append(Draw::Get((Standard_CString&)Name));
212       }
213       OS << "On Shape " << Name << " :\n";
214         
215       for (;itl.More(); itl.Next()) {
216         if (itl.Value() != BRepCheck_NoError)
217         BRepCheck::Print(itl.Value(),OS);
218       }
219     }
220   }
221   if (!theMap.IsBound(S)) {
222     TopTools_ListOfShape thelist;
223     theMap.Bind(S, thelist);
224   }
225
226   switch (styp) {
227   case TopAbs_EDGE:
228     PrintSub(OS,Ana,S,TopAbs_VERTEX);
229     break;
230   case TopAbs_WIRE:
231     PrintSub(OS,Ana,S,TopAbs_EDGE);
232     PrintSub(OS,Ana,S,TopAbs_VERTEX);
233     break;
234   case TopAbs_FACE:
235     PrintSub(OS,Ana,S,TopAbs_WIRE);
236     PrintSub(OS,Ana,S,TopAbs_EDGE);
237     PrintSub(OS,Ana,S,TopAbs_VERTEX);
238     break;
239   case TopAbs_SHELL:
240 //    PrintSub(OS,Ana,S,TopAbs_FACE);
241     break;
242   case TopAbs_SOLID:
243 //    PrintSub(OS,Ana,S,TopAbs_EDGE);
244     PrintSub(OS,Ana,S,TopAbs_SHELL);
245     break;
246   default:
247     break;
248   }
249
250 }
251
252 //=======================================================================
253 //function : computetolerance
254 //purpose  : 
255 //=======================================================================
256 static Standard_Integer computetolerance(Draw_Interpretor& di,
257                                          Standard_Integer narg, const char** a)
258 {
259   if (narg < 2) {
260     //cout << "Usage: computetolerance shape" << endl;
261     di << "Usage: computetolerance shape\n";
262     return 1;
263   }
264   TopoDS_Shape S = DBRep::Get(a[1]);
265   Standard_Real tol;
266   if (S.ShapeType() == TopAbs_EDGE) {
267     BRepCheck_Edge bce(TopoDS::Edge(S));
268     tol=bce.Tolerance();
269     //cout<< "Tolerance de " << (void*) &(*S.TShape()) << " : " << tol << endl;
270     Standard_SStream aSStream1;
271     aSStream1<< "Tolerance de " << (void*) &(*S.TShape()) << " : " << tol << "\n";
272     di << aSStream1;
273   }
274   else {
275     TopTools_MapOfShape theEdges;
276     TopExp_Explorer exp;
277     for (exp.Init(S, TopAbs_EDGE); exp.More(); exp.Next()) {
278       if (theEdges.Add(exp.Current())) {
279         BRepCheck_Edge bce(TopoDS::Edge(exp.Current()));
280         tol=bce.Tolerance();
281         //cout<< "Tolerance de " << (void*) &(*exp.Current().TShape()) << " : " << tol << "\n";
282         Standard_SStream aSStream2;
283         aSStream2<< "Tolerance de " << (void*) &(*exp.Current().TShape()) << " : " << tol << "\n";
284         di << aSStream2;
285       }
286     }
287     //cout << endl;
288     di << "\n";
289   }
290   return 0;
291 }
292
293 //=======================================================================
294 //function : checksection
295 //purpose  : Checks the closure of a section line
296 //=======================================================================
297 static Standard_Integer checksection(Draw_Interpretor& di,
298                                      Standard_Integer narg, const char** a)
299 {
300   if (narg < 2) {
301     return 1;
302   }
303   TopoDS_Shape S = DBRep::Get(a[1]);
304   TopTools_MapOfShape theVertices;
305   TopExp_Explorer exp;
306   for (exp.Init(S, TopAbs_VERTEX); exp.More(); exp.Next()) {
307     if (!theVertices.Add(exp.Current())) 
308       theVertices.Remove(exp.Current());
309   }
310   //cout << " nb alone Vertices : " << theVertices.Extent() << endl;
311   di << " nb alone Vertices : " << theVertices.Extent() << "\n";
312   char Name[32];
313   Standard_Integer ipp=0;
314   TopTools_MapIteratorOfMapOfShape itvx;
315   for (itvx.Initialize(theVertices); itvx.More(); itvx.Next()) {
316     ipp++;
317     Sprintf(Name,"alone_%d",ipp);
318     DBRep::Set(Name, itvx.Key());
319     //cout << Name << " " ;
320     di << Name << " " ;
321   }
322   //cout << endl;
323   di << "\n";
324   return 0;
325 }
326 //=======================================================================
327
328 //=======================================================================
329 //function : checkdiff
330 //purpose  : Checks the differences beetween a result and his arguments
331 //=======================================================================
332 static Standard_Integer checkdiff(Draw_Interpretor& di,
333                                   Standard_Integer narg, const char** a)
334 {
335   const char* syntaxe = "checkdiff arg1 [arg2..argn] result [closedSolid (0/1)] [geomCtrl (1/0)]";
336   if (narg < 3) {
337     if (narg==2) {
338       Standard_Integer bcrtrace=Draw::Atoi(a[narg-1]);
339       bcrtrace=BRepCheck_Trace(bcrtrace);
340       //cout << "BRepCheck_Trace : " << bcrtrace << endl;
341       di << "BRepCheck_Trace : " << bcrtrace << "\n";
342       //cout << syntaxe << endl;
343       di << syntaxe << "\n";
344       return 0;
345     }
346     //cout << syntaxe << endl;
347     di << syntaxe << "\n";
348     return 1;
349   }
350
351   Standard_Integer lastArg=narg-2;
352   Standard_Boolean closedSolid = Standard_False;
353   Standard_Boolean geomCtrl = Standard_True;
354   TopoDS_Shape resu = DBRep::Get(a[narg-1]);
355   if (resu.IsNull()) {
356     if (narg < 4) {
357       //cout << syntaxe << endl;
358       di << syntaxe << "\n";
359       return 1;
360     }
361     closedSolid = Draw::Atoi(a[narg-1]) != 0;
362     resu = DBRep::Get(a[narg-2]);
363     lastArg=narg-3;
364     if (resu.IsNull()) {
365       if (narg < 5) {
366         //cout << syntaxe << endl;
367         di << syntaxe << "\n";
368         return 1;
369       }
370       geomCtrl=closedSolid;
371       closedSolid = Draw::Atoi(a[narg-2]) != 0;
372       resu = DBRep::Get(a[narg-3]);
373       lastArg=narg-4;
374       if (resu.IsNull()) {
375         //cout << syntaxe << endl;
376         di << syntaxe << "\n";
377         return 1;
378       }
379     }
380   }
381   
382   TopTools_ListOfShape lesArgs;
383   for (Standard_Integer id=1; id <=lastArg; id++) {
384     lesArgs.Append(DBRep::Get(a[id]));
385   }
386
387   if (BRepAlgo::IsValid(lesArgs, resu, closedSolid, geomCtrl)) {
388     //cout << "Difference is Valid." << endl;
389     di << "Difference is Valid.\n";
390   } else {
391     //cout << "error : Difference is Not Valid !" << endl;
392     di << "error : Difference is Not Valid !\n";
393   }
394
395   return 0;
396 }
397 //=======================================================================
398
399 //  Modified by skv - Tue Apr 27 13:38:44 2004 Begin
400 //=======================================================================
401 //function : CHK
402 //purpose  : Checks a shape
403 //=======================================================================
404
405 // static Standard_Integer CHK(Draw_Interpretor& theCommands,
406 //                          Standard_Integer narg, const char** a)
407 // {
408 //   if (narg < 2) {
409 //     return 1;
410 //   }
411
412 //   Standard_Boolean doprint = Standard_True;
413 //   if (narg == 3) { if (!strcmp(a[2],"-short")) doprint = Standard_False; }
414
415 //   TopoDS_Shape S = DBRep::Get(a[1]);
416 //   if (S.IsNull()) {
417 //     cout<<"not a topological shape"<<endl;
418 //     return 1;
419 //   }
420
421 //   Standard_Boolean GeomCtrl = Standard_True;
422 //   if (!strcasecmp(a[0],"CHECKTOPSHAPE")) {
423 //     GeomCtrl = Standard_False;
424 //   }
425
426 //   BRepCheck_Analyzer ana(S,GeomCtrl);
427 //   if (ana.IsValid()) {
428 //     theCommands<<"This shape seems to be valid";
429 //   }
430 //   else {
431 //     theMap.Clear();
432 //     nbfaulty = 0;
433 //     lfaulty.Clear();
434 //     theMap.Clear();
435 //     if (doprint) {
436 //       Print(cout,ana,S);
437 //       cout<<"\n";
438 //       theMap.Clear();
439 //       if (nbfaulty !=0)
440 //      cout<<"Faulty shapes in variables "<<checkfaultyname<<"1 to "<<checkfaultyname<<nbfaulty<<" \n";
441 //       cout<<endl;
442 //     }
443 //     else {
444 //       theCommands<<"This shape has faulty shapes";
445 //     }
446 //   }
447 //   return 0;
448 // }
449
450 //=======================================================================
451 //function : ContextualDump
452 //purpose  : Contextual (modeling) style of output.
453 //=======================================================================
454
455 //void ContextualDump(const BRepCheck_Analyzer &theAna,
456 //                  const TopoDS_Shape       &theShape)
457 void ContextualDump(Draw_Interpretor& theCommands,
458                     const BRepCheck_Analyzer &theAna,
459                     const TopoDS_Shape       &theShape)
460 {
461   theMap.Clear();
462   nbfaulty = 0;
463   lfaulty.Clear();
464
465   //Print(cout, theAna, theShape);
466   Standard_SStream aSStream;
467   Print(aSStream, theAna, theShape);
468   theCommands << aSStream;
469   //cout<<"\n";
470   theCommands<<"\n";
471   theMap.Clear();
472
473   if (nbfaulty !=0)
474     theCommands<<"Faulty shapes in variables "<<checkfaultyname<<"1 to "<<checkfaultyname<<nbfaulty<<" \n";
475     //cout<<"Faulty shapes in variables "<<checkfaultyname<<"1 to "<<checkfaultyname<<nbfaulty<<" \n";
476
477   //cout<<endl;
478   theCommands<<"\n";
479 }
480
481
482 //=======================================================================
483 //function : FillProblems
484 // purpose : auxilary for StructuralDump
485 //=======================================================================
486 static void FillProblems(const BRepCheck_Status stat,
487                          Handle(TColStd_HArray1OfInteger)& NbProblems)
488 {
489
490   const Standard_Integer anID = static_cast<Standard_Integer> (stat);
491
492   if((NbProblems->Upper() < anID) || (NbProblems->Lower() > anID))
493     return;
494
495   NbProblems->SetValue(anID, NbProblems->Value(anID)+1);
496
497 }
498
499
500 //=======================================================================
501 //function : GetProblemSub
502 // purpose : auxilary for StructuralDump
503 //=======================================================================
504 static void GetProblemSub(const BRepCheck_Analyzer& Ana,
505                           const TopoDS_Shape& Shape,
506                           Handle(TopTools_HSequenceOfShape)& sl,
507                           Handle(TColStd_HArray1OfInteger)& NbProblems,
508                           const TopAbs_ShapeEnum Subtype)
509 {
510   BRepCheck_ListIteratorOfListOfStatus itl;
511   TopExp_Explorer exp;
512   for (exp.Init(Shape,Subtype); exp.More(); exp.Next()) {
513     const Handle(BRepCheck_Result)& res = Ana.Result(exp.Current());
514
515     const TopoDS_Shape& sub = exp.Current();
516     for (res->InitContextIterator();
517          res->MoreShapeInContext(); 
518          res->NextShapeInContext()) {
519       if (res->ContextualShape().IsSame(Shape) && 
520           !Contains(theMap(sub),Shape)) {
521         theMap(sub).Append(Shape);
522         itl.Initialize(res->StatusOnShape());
523
524         if (itl.Value() != BRepCheck_NoError) {
525           Standard_Integer ii = 0;
526
527           for(ii=1; ii<=sl->Length(); ii++)
528             if(sl->Value(ii).IsSame(sub)) break;
529
530           if(ii>sl->Length()) {
531             sl->Append(sub);
532             FillProblems(itl.Value(),NbProblems);
533           }
534           for(ii=1; ii<=sl->Length(); ii++)
535             if(sl->Value(ii).IsSame(Shape)) break;
536           if(ii>sl->Length()) {
537             sl->Append(Shape);
538             FillProblems(itl.Value(),NbProblems);
539           }
540         }
541         break;
542       }
543     }
544   }
545 }
546
547
548 //=======================================================================
549 //function : GetProblemShapes
550 // purpose : auxilary for StructuralDump
551 //=======================================================================
552 static void GetProblemShapes(const BRepCheck_Analyzer& Ana,
553                              const TopoDS_Shape& Shape,
554                              Handle(TopTools_HSequenceOfShape)& sl,
555                              Handle(TColStd_HArray1OfInteger)& NbProblems)
556 {
557   for (TopoDS_Iterator iter(Shape); iter.More(); iter.Next()) {
558     GetProblemShapes(Ana,iter.Value(),sl, NbProblems);
559   }
560   TopAbs_ShapeEnum styp = Shape.ShapeType();
561   BRepCheck_ListIteratorOfListOfStatus itl;
562   if (!Ana.Result(Shape).IsNull() && !theMap.IsBound(Shape)) {
563     itl.Initialize(Ana.Result(Shape)->Status());
564
565     if (itl.Value() != BRepCheck_NoError) {
566       sl->Append(Shape);
567       FillProblems(itl.Value(),NbProblems);
568     }
569   }
570   if (!theMap.IsBound(Shape)) {
571     TopTools_ListOfShape thelist;
572     theMap.Bind(Shape, thelist);
573   }
574
575   switch (styp) {
576   case TopAbs_EDGE:
577     GetProblemSub(Ana, Shape, sl, NbProblems, TopAbs_VERTEX);
578     break;
579   case TopAbs_FACE:
580     GetProblemSub(Ana, Shape, sl, NbProblems, TopAbs_WIRE);
581     GetProblemSub(Ana, Shape, sl, NbProblems, TopAbs_EDGE);
582     GetProblemSub(Ana, Shape, sl, NbProblems, TopAbs_VERTEX);
583     break;
584   case TopAbs_SHELL:
585     break;
586   case TopAbs_SOLID:
587     GetProblemSub(Ana, Shape, sl, NbProblems, TopAbs_SHELL);
588     break;
589   default:
590     break;
591   }
592
593 }
594
595 //=======================================================================
596 //function : StructuralDump
597 //purpose  : Structural (data exchange) style of output.
598 //=======================================================================
599
600 //void StructuralDump(const BRepCheck_Analyzer &theAna,
601 //                    const Standard_CString   ShName,
602 //                    const Standard_CString   Pref,
603 //                  const TopoDS_Shape       &theShape)
604 void StructuralDump(Draw_Interpretor& theCommands,
605                     const BRepCheck_Analyzer &theAna,
606                     const Standard_CString   ShName,
607                     const Standard_CString   Pref,
608                     const TopoDS_Shape       &theShape)
609 {
610   Standard_Integer i;
611   //cout << "StructuralDump" << endl;
612   //cout << " -- The Shape " << ShName << " has problems :"<<endl;
613   //cout<<"  Check                                    Count"<<endl;
614   //cout<<" ------------------------------------------------"<<endl;
615   theCommands << " -- The Shape " << ShName << " has problems :\n";
616   theCommands<<"  Check                                    Count\n";
617   theCommands<<" ------------------------------------------------\n";
618
619   Handle(TColStd_HArray1OfInteger) NbProblems = new 
620                               TColStd_HArray1OfInteger(1,NumberOfStatus);
621   for(i=1; i<=NumberOfStatus; i++) NbProblems->SetValue(i,0);
622   Handle(TopTools_HSequenceOfShape) sl,slv,sle,slw,slf,sls,slo;
623   sl = new TopTools_HSequenceOfShape();
624   theMap.Clear();
625   GetProblemShapes(theAna, theShape, sl, NbProblems);
626   theMap.Clear();
627   
628   Standard_Integer aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidPointOnCurve);
629   if(NbProblems->Value(aProblemID) > 0)
630     theCommands<<"  Invalid Point on Curve ................... "<<NbProblems->Value(aProblemID)<<"\n";
631
632   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidPointOnCurveOnSurface);
633   if(NbProblems->Value(aProblemID)>0)
634     theCommands<<"  Invalid Point on CurveOnSurface .......... "<<NbProblems->Value(aProblemID)<<"\n";
635
636   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidPointOnSurface);
637   if(NbProblems->Value(aProblemID)>0)
638     theCommands<<"  Invalid Point on Surface ................. "<<NbProblems->Value(aProblemID)<<"\n";
639
640   aProblemID = static_cast<Standard_Integer>(BRepCheck_No3DCurve);
641   if(NbProblems->Value(aProblemID)>0)
642     theCommands<<"  No 3D Curve .............................. "<<NbProblems->Value(aProblemID)<<"\n";
643
644   aProblemID = static_cast<Standard_Integer>(BRepCheck_Multiple3DCurve);
645   if(NbProblems->Value(aProblemID)>0)
646     theCommands<<"  Multiple 3D Curve ........................ "<<NbProblems->Value(aProblemID)<<"\n";
647
648   aProblemID = static_cast<Standard_Integer>(BRepCheck_Invalid3DCurve);
649   if(NbProblems->Value(aProblemID)>0)
650     theCommands<<"  Invalid 3D Curve ......................... "<<NbProblems->Value(aProblemID)<<"\n";
651
652   aProblemID = static_cast<Standard_Integer>(BRepCheck_NoCurveOnSurface);
653   if(NbProblems->Value(aProblemID)>0)
654     theCommands<<"  No Curve on Surface ...................... "<<NbProblems->Value(aProblemID)<<"\n";
655
656   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidCurveOnSurface);
657   if(NbProblems->Value(aProblemID)>0)
658     theCommands<<"  Invalid Curve on Surface ................. "<<NbProblems->Value(aProblemID)<<"\n";
659
660   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidCurveOnClosedSurface);
661   if(NbProblems->Value(aProblemID)>0)
662     theCommands<<"  Invalid Curve on closed Surface .......... "<<NbProblems->Value(aProblemID)<<"\n";
663   
664   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidSameRangeFlag);
665   if(NbProblems->Value(aProblemID)>0)
666     theCommands<<"  Invalid SameRange Flag ................... "<<NbProblems->Value(aProblemID)<<"\n";
667   
668   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidSameParameterFlag);
669   if(NbProblems->Value(aProblemID)>0)
670     theCommands<<"  Invalid SameParameter Flag ............... "<<NbProblems->Value(aProblemID)<<"\n";
671   
672   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidDegeneratedFlag);
673   if(NbProblems->Value(aProblemID)>0)
674     theCommands<<"  Invalid Degenerated Flag ................. "<<NbProblems->Value(aProblemID)<<"\n";
675   
676   aProblemID = static_cast<Standard_Integer>(BRepCheck_FreeEdge);
677   if(NbProblems->Value(aProblemID)>0)
678     theCommands<<"  Free Edge ................................ "<<NbProblems->Value(aProblemID)<<"\n";
679   
680   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidMultiConnexity);
681   if(NbProblems->Value(aProblemID)>0)
682     theCommands<<"  Invalid MultiConnexity ................... "<<NbProblems->Value(aProblemID)<<"\n";
683   
684   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidRange);
685   if(NbProblems->Value(aProblemID)>0)
686     theCommands<<"  Invalid Range ............................ "<<NbProblems->Value(aProblemID)<<"\n";
687   
688   aProblemID = static_cast<Standard_Integer>(BRepCheck_EmptyWire);
689   if(NbProblems->Value(aProblemID)>0)
690     theCommands<<"  Empty Wire ............................... "<<NbProblems->Value(aProblemID)<<"\n";
691
692   aProblemID = static_cast<Standard_Integer>(BRepCheck_RedundantEdge);
693   if(NbProblems->Value(aProblemID)>0)
694     theCommands<<"  Redundant Edge ........................... "<<NbProblems->Value(aProblemID)<<"\n";
695
696   aProblemID = static_cast<Standard_Integer>(BRepCheck_SelfIntersectingWire);
697   if(NbProblems->Value(aProblemID)>0)
698     theCommands<<"  Self Intersecting Wire ................... "<<NbProblems->Value(aProblemID)<<"\n";
699
700   aProblemID = static_cast<Standard_Integer>(BRepCheck_NoSurface);
701   if(NbProblems->Value(aProblemID)>0)
702     theCommands<<"  No Surface ............................... "<<NbProblems->Value(aProblemID)<<"\n";
703
704   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidWire);
705   if(NbProblems->Value(aProblemID)>0)
706     theCommands<<"  Invalid Wire ............................. "<<NbProblems->Value(aProblemID)<<"\n";
707
708   aProblemID = static_cast<Standard_Integer>(BRepCheck_RedundantWire);
709   if(NbProblems->Value(aProblemID)>0)
710     theCommands<<"  Redundant Wire ........................... "<<NbProblems->Value(aProblemID)<<"\n";
711
712   aProblemID = static_cast<Standard_Integer>(BRepCheck_IntersectingWires);
713   if(NbProblems->Value(aProblemID)>0)
714     theCommands<<"  Intersecting Wires ....................... "<<NbProblems->Value(aProblemID)<<"\n";
715
716   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidImbricationOfWires);
717   if(NbProblems->Value(aProblemID)>0)
718     theCommands<<"  Invalid Imbrication of Wires ............. "<<NbProblems->Value(aProblemID)<<"\n";
719
720   aProblemID = static_cast<Standard_Integer>(BRepCheck_EmptyShell);
721   if(NbProblems->Value(aProblemID)>0)
722     theCommands<<"  Empty Shell .............................. "<<NbProblems->Value(aProblemID)<<"\n";
723
724   aProblemID = static_cast<Standard_Integer>(BRepCheck_RedundantFace);
725   if(NbProblems->Value(aProblemID)>0)
726     theCommands<<"  Redundant Face ........................... "<<NbProblems->Value(aProblemID)<<"\n";
727
728   aProblemID = static_cast<Standard_Integer>(BRepCheck_UnorientableShape);
729   if(NbProblems->Value(aProblemID)>0)
730     theCommands<<"  Unorientable Shape ....................... "<<NbProblems->Value(aProblemID)<<"\n";
731
732   aProblemID = static_cast<Standard_Integer>(BRepCheck_NotClosed);
733   if(NbProblems->Value(aProblemID)>0)
734     theCommands<<"  Not Closed ............................... "<<NbProblems->Value(aProblemID)<<"\n";
735
736   aProblemID = static_cast<Standard_Integer>(BRepCheck_NotConnected);
737   if(NbProblems->Value(aProblemID)>0)
738     theCommands<<"  Not Connected ............................ "<<NbProblems->Value(aProblemID)<<"\n";
739
740   aProblemID = static_cast<Standard_Integer>(BRepCheck_SubshapeNotInShape);
741   if(NbProblems->Value(aProblemID)>0)
742     theCommands<<"  Subshape not in Shape .................... "<<NbProblems->Value(aProblemID)<<"\n";
743
744   aProblemID = static_cast<Standard_Integer>(BRepCheck_BadOrientation);
745   if(NbProblems->Value(aProblemID)>0)
746     theCommands<<"  Bad Orientation .......................... "<<NbProblems->Value(aProblemID)<<"\n";
747
748   aProblemID = static_cast<Standard_Integer>(BRepCheck_BadOrientationOfSubshape);
749   if(NbProblems->Value(aProblemID)>0)
750     theCommands<<"  Bad Orientation of Subshape .............. "<<NbProblems->Value(aProblemID)<<"\n";
751
752   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidToleranceValue);
753   if(NbProblems->Value(aProblemID)>0)
754     theCommands<<"  Invalid tolerance value................... "<<NbProblems->Value(aProblemID)<<"\n";
755
756   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidPolygonOnTriangulation);
757   if(NbProblems->Value(aProblemID)>0)
758     theCommands<<"  Invalid polygon on triangulation.......... "<<NbProblems->Value(aProblemID)<<"\n";
759
760   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidImbricationOfShells);
761   if(NbProblems->Value(aProblemID)>0)
762     theCommands<<"  Invalid Imbrication of Shells............. "<<NbProblems->Value(aProblemID)<<"\n";
763  
764  aProblemID = static_cast<Standard_Integer>(BRepCheck_EnclosedRegion);
765   if(NbProblems->Value(aProblemID)>0)
766     theCommands<<"  Enclosed Region........................... "<<NbProblems->Value(aProblemID)<<"\n";
767
768   aProblemID = static_cast<Standard_Integer>(BRepCheck_CheckFail);
769   if(NbProblems->Value(aProblemID)>0)
770     theCommands<<"  checkshape failure........................ "<<NbProblems->Value(aProblemID)<<"\n";
771
772
773
774   theCommands<<" ------------------------------------------------\n";
775   theCommands<<"*** Shapes with problems : "<<sl->Length()<<"\n";
776
777   slv = new TopTools_HSequenceOfShape();
778   sle = new TopTools_HSequenceOfShape();
779   slw = new TopTools_HSequenceOfShape();
780   slf = new TopTools_HSequenceOfShape();
781   sls = new TopTools_HSequenceOfShape();
782   slo = new TopTools_HSequenceOfShape();
783
784   for(i=1; i<=sl->Length(); i++) {
785     TopoDS_Shape shi = sl->Value(i);
786     TopAbs_ShapeEnum sti = shi.ShapeType();
787     switch (sti) {
788       case TopAbs_VERTEX : slv->Append (shi); break;
789       case TopAbs_EDGE   : sle->Append (shi); break;
790       case TopAbs_WIRE   : slw->Append (shi); break;
791       case TopAbs_FACE   : slf->Append (shi); break;
792       case TopAbs_SHELL  : sls->Append (shi); break;
793       case TopAbs_SOLID  : slo->Append (shi); break;
794       default            : break;
795     }
796   }
797
798   BRep_Builder B;
799   if(slv->Length()>0) {
800     TopoDS_Compound comp;
801     B.MakeCompound(comp);
802     Standard_Integer nb = slv->Length();
803     for(i=1; i<=nb; i++)
804       B.Add(comp,slv->Value(i));
805     char aName[20];
806     Sprintf(aName,"%s_v",Pref);
807     DBRep::Set(aName,comp);
808     //cout<<"VERTEX     : "<<(nb > 9 ? "" : " ")<<nb<<" Items -> compound named "<<aName<<endl;
809     if (nb > 9)
810       theCommands<<"VERTEX      : "<<nb<<" Items -> compound named "<<aName<<"\n";
811     else
812       theCommands<<"VERTEX      :  "<<nb<<" Items -> compound named "<<aName<<"\n";
813   }
814   if(sle->Length()>0) {
815     TopoDS_Compound comp;
816     B.MakeCompound(comp);
817     Standard_Integer nb = sle->Length();
818     for(i=1; i<=nb; i++)
819       B.Add(comp,sle->Value(i));
820     char aName[20];
821     Sprintf(aName,"%s_e",Pref);
822     DBRep::Set(aName,comp);
823     //cout<<"EDGE       : "<<(nb > 9 ? "" : " ")<<nb<<" Items -> compound named "<<aName<<endl;
824     if (nb > 9)
825       theCommands<<"EDGE        : "<<nb<<" Items -> compound named "<<aName<<"\n";
826     else
827       theCommands<<"EDGE        :  "<<nb<<" Items -> compound named "<<aName<<"\n";
828   }
829   if(slw->Length()>0) {
830     TopoDS_Compound comp;
831     B.MakeCompound(comp);
832     Standard_Integer nb = slw->Length();
833     for(i=1; i<=nb; i++)
834       B.Add(comp,slw->Value(i));
835     char aName[20];
836     Sprintf(aName,"%s_w",Pref);
837     DBRep::Set(aName,comp);
838     //cout<<"WIRE       : "<<(nb > 9 ? "" : " ")<<nb<<" Items -> compound named "<<aName<<endl;
839     if (nb > 9)
840       theCommands<<"WIRE        : "<<nb<<" Items -> compound named "<<aName<<"\n";
841     else
842       theCommands<<"WIRE        :  "<<nb<<" Items -> compound named "<<aName<<"\n";
843   }
844   if(slf->Length()>0) {
845     TopoDS_Compound comp;
846     B.MakeCompound(comp);
847     Standard_Integer nb = slf->Length();
848     for(i=1; i<=nb; i++)
849       B.Add(comp,slf->Value(i));
850     char aName[20];
851     Sprintf(aName,"%s_f",Pref);
852     DBRep::Set(aName,comp);
853     //cout<<"FACE       : "<<(nb > 9 ? "" : " ")<<nb<<" Items -> compound named "<<aName<<endl;
854     if (nb > 9)
855       theCommands<<"FACE        : "<<nb<<" Items -> compound named "<<aName<<"\n";
856     else
857       theCommands<<"FACE        :  "<<nb<<" Items -> compound named "<<aName<<"\n";
858   }
859   if(sls->Length()>0) {
860     TopoDS_Compound comp;
861     B.MakeCompound(comp);
862     Standard_Integer nb = sls->Length();
863     for(i=1; i<=nb; i++)
864       B.Add(comp,sls->Value(i));
865     char aName[20];
866     Sprintf(aName,"%s_s",Pref);
867     DBRep::Set(aName,comp);
868     //cout<<"SHELL      : "<<(nb > 9 ? "" : " ")<<nb<<" Items -> compound named "<<aName<<endl;
869     if (nb > 9)
870       theCommands<<"SHELL       : "<<nb<<" Items -> compound named "<<aName<<"\n";
871     else
872       theCommands<<"SHELL       :  "<<nb<<" Items -> compound named "<<aName<<"\n";
873   }
874   if(slo->Length()>0) {
875     TopoDS_Compound comp;
876     B.MakeCompound(comp);
877     Standard_Integer nb = slo->Length();
878     for(i=1; i<=nb; i++)
879       B.Add(comp,slo->Value(i));
880     char aName[20];
881     Sprintf(aName,"%s_o",Pref);
882     DBRep::Set(aName,comp);
883     //cout<<"SOLID      : "<<(nb > 9 ? "" : " ")<<nb<<" Items -> compound named "<<aName<<endl;
884     if (nb > 9)
885       theCommands<<"SOLID       : "<<nb<<" Items -> compound named "<<aName<<"\n";
886     else
887       theCommands<<"SOLID       :  "<<nb<<" Items -> compound named "<<aName<<"\n";
888   }
889 }
890
891 //=======================================================================
892 //function : checkshape
893 //purpose  : Checks a shape
894 //=======================================================================
895
896 static Standard_Integer checkshape(Draw_Interpretor& theCommands,
897                                    Standard_Integer narg, const char** a)
898 {
899   if (narg == 1) {
900     //cout << endl;
901     //cout << "Usage : checkshape [-top] shape [result] [-short]" << endl;
902     //cout << endl;
903     //cout << "Where :" << endl;
904     //cout << "   -top   - check topology only." << endl;
905     //cout << "   shape  - the name of the shape to test." << endl;
906     //cout << "   result - the prefix of the output shape names. If it is used, structural" << endl;
907     //cout << "            output style will be used. Otherwise - contextual one." << endl;
908     //cout << "   -short - short description of check." << endl;
909     theCommands << "\n";
910     theCommands << "Usage : checkshape [-top] shape [result] [-short]\n";
911     theCommands << "\n";
912     theCommands << "Where :\n";
913     theCommands << "   -top   - check topology only.\n";
914     theCommands << "   shape  - the name of the shape to test.\n";
915     theCommands << "   result - the prefix of the output shape names. If it is used, structural\n";
916     theCommands << "            output style will be used. Otherwise - contextual one.\n";
917     theCommands << "   -short - short description of check.\n";
918
919     return 0;
920   }
921
922   if (narg > 5) {
923     //cout << "Invalid number of args!!!" << endl;
924     //cout << "No args to have help." << endl;
925     theCommands << "Invalid number of args!!!\n";
926     theCommands << "No args to have help.\n";
927
928     return 1;
929   }
930
931   Standard_Boolean aGeomCtrl = Standard_True;
932   Standard_Integer aCurInd  = 1;
933
934   if (!strcmp(a[1],"-top")) {
935     aGeomCtrl = Standard_False;
936     aCurInd++;
937   }
938
939   if (aCurInd > narg - 1) {
940     //cout << "Invalid number of args!!!" << endl;
941     //cout << "No args to have help." << endl;
942     theCommands << "Invalid number of args!!!\n";
943     theCommands << "No args to have help.\n";
944
945     return 1;
946   }
947
948   Standard_CString aShapeName = a[aCurInd];
949   TopoDS_Shape     aShape     = DBRep::Get(aShapeName);
950
951   if (aShape.IsNull()) {
952     //cout << a[aCurInd] << " is not a topological shape!!!" << endl;
953     theCommands << a[aCurInd] << " is not a topological shape!!!\n";
954
955     return 1;
956   }
957
958   Standard_Boolean IsShortDump   = Standard_False;
959   Standard_Boolean IsContextDump = Standard_True;
960   Standard_Integer aBackInd      = narg - 1;
961
962   if (aCurInd < aBackInd) {
963     if (!strcmp(a[aBackInd],"-short")) {
964       IsShortDump = Standard_True;
965       aBackInd--;
966     }
967   }
968
969   if (aCurInd < aBackInd - 1) {
970     //cout << "Invalid number of args!!!" << endl;
971     //cout << "No args to have help." << endl;
972     theCommands << "Invalid number of args!!!\n";
973     theCommands << "No args to have help.\n";
974
975     return 1;
976   } else if (aCurInd < aBackInd) {
977     IsContextDump = Standard_False;
978   }
979
980   try {
981     OCC_CATCH_SIGNALS
982     BRepCheck_Analyzer anAna(aShape,aGeomCtrl);
983     Standard_Boolean   isValid = anAna.IsValid();
984
985     if (isValid) {
986       if (IsContextDump) {
987         theCommands << "This shape seems to be valid";
988       } else {
989         theCommands << " -- The Shape " << aShapeName << " looks OK";
990       }
991     } else {
992       if (IsShortDump) {
993         theCommands<<"This shape has faulty shapes";
994       } else {
995         if (IsContextDump) {
996           //ContextualDump(anAna, aShape);
997           ContextualDump(theCommands, anAna, aShape);
998         } else {
999           Standard_CString aPref = a[aCurInd+1];
1000           //StructuralDump(anAna, aShapeName, aPref, aShape);
1001           StructuralDump(theCommands, anAna, aShapeName, aPref, aShape);
1002         }
1003       }
1004     }
1005   }
1006   catch(Standard_Failure const& anException) {
1007     theCommands<<"checkshape exception : ";
1008     theCommands << anException.GetMessageString();
1009     theCommands<<"\n";
1010     return 1;
1011   }
1012
1013   return 0;
1014 }
1015 //  Modified by skv - Tue Apr 27 13:38:24 2004 End
1016 /***************************************************************/
1017 static void InitEpsSurf(Standard_Real& epsnl,Standard_Real& epsdis, Standard_Real& epsangk1, 
1018                         Standard_Real& epsangk2, Standard_Real& epsangn1, 
1019                         Standard_Real& perce,Standard_Real& maxlen )
1020
1021   epsnl  = 0.001;
1022   epsdis = 0.001;
1023   epsangk1 = 0.001 ; 
1024   epsangk2 = 0.001;
1025   epsangn1 = 0.001 ; 
1026   perce = 0.01;
1027   maxlen = 10000 ;
1028 }
1029
1030 static Standard_Integer shapeG1continuity (Draw_Interpretor& di, Standard_Integer n, const char** a)
1031
1032 { Standard_Real epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen;
1033   Standard_Integer nbeval;  
1034   InitEpsSurf(epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen);
1035   Standard_Boolean ISG1=Standard_True;
1036   if (n<4) return 1;
1037   TopoDS_Face face1,face2;
1038   Standard_Real f1,f2,l1,l2;
1039   TopoDS_Shape shape = DBRep::Get(a[1],TopAbs_SHAPE);
1040   if (shape.IsNull()) return 1;
1041   TopoDS_Shape  edge  = DBRep::Get(a[2],TopAbs_EDGE);
1042   if (edge.IsNull()) return 1;
1043 // calcul des deux faces 
1044   TopTools_IndexedDataMapOfShapeListOfShape lface;
1045   TopExp::MapShapesAndAncestors(shape,TopAbs_EDGE,TopAbs_FACE,lface);
1046   const TopTools_ListOfShape& lfac = lface.FindFromKey(edge);
1047
1048   Standard_Integer nelem= lfac.Extent();
1049   if(nelem!=2) return 1; 
1050   TopTools_ListIteratorOfListOfShape It;
1051   It.Initialize(lfac);
1052   face1=TopoDS::Face(It.Value());
1053   It.Next();
1054   face2=TopoDS::Face(It.Value());
1055     
1056 // calcul des deux pcurves 
1057   const Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface
1058                                (TopoDS::Edge(edge),face1,f1,l1);
1059   if (c1.IsNull()) return 1;
1060   const  Handle(Geom2d_Curve) c2  = BRep_Tool::CurveOnSurface
1061                                (TopoDS::Edge(edge),face2,f2,l2);
1062   if (c2.IsNull()) return 1;
1063         
1064    Handle(Geom2d_Curve) curv1= new Geom2d_TrimmedCurve(c1,f1,l1);
1065    
1066    Handle(Geom2d_Curve) curv2= new Geom2d_TrimmedCurve(c2,f2,l2);  
1067    
1068 // calcul dees deux surfaces 
1069   TopLoc_Location L1,L2; 
1070   TopoDS_Face aLocalFace = face1;
1071   const Handle(Geom_Surface)& s1 = BRep_Tool::Surface(aLocalFace,L1);
1072 //  const Handle(Geom_Surface)& s1 =
1073 //    BRep_Tool::Surface(TopoDS::Face(face1),L1);
1074   if (s1.IsNull()) return 1;
1075   aLocalFace = face2;
1076   const Handle(Geom_Surface)& s2 = BRep_Tool::Surface(aLocalFace,L2);
1077 //  const Handle(Geom_Surface)& s2 =
1078 //    BRep_Tool::Surface(TopoDS::Face(face2),L2); 
1079   if (s2.IsNull()) return 1;     
1080
1081
1082    Handle(Geom_Surface) surf1 = Handle(Geom_Surface)::
1083                                  DownCast(s1->Transformed(L1.Transformation()));
1084    if (surf1.IsNull()) return 1;
1085    Handle(Geom_Surface) surf2 = Handle(Geom_Surface)::
1086                                 DownCast(s2->Transformed(L2.Transformation()));
1087    if (surf2.IsNull()) return 1;
1088    
1089  
1090
1091   nbeval = (Standard_Integer ) Draw::Atof( a[3]);
1092
1093   switch(n)
1094     { case 7  : epsG1 = Draw::Atof(a[6]);
1095       case 6  : epsC0   = Draw::Atof(a[5]);
1096       case 5  : epsnl    = Draw::Atof(a[4]);
1097       case 4  : {} break;
1098       default : return 1;
1099     }
1100
1101
1102   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
1103   Standard_Boolean isconti = Standard_True;
1104   Standard_Boolean isdone = Standard_True;
1105   pard1 = curv1->FirstParameter();
1106   parf1 = curv1->LastParameter();
1107   Standard_Real  MaxG0Value=0, MaxG1Angle=0; 
1108   U = Min( pard1,parf1);
1109   Uf = Max (pard1,parf1);
1110
1111   deltaU =  Abs(parf1- pard1)/nbeval;
1112       
1113   do  
1114      { if ( nb == nbeval) 
1115           { LocalAnalysis_SurfaceContinuity res(curv1, curv2, Uf,surf1, surf2,            GeomAbs_G1, epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen );
1116             isdone = res.IsDone();
1117            if ( isdone) { isconti = res.IsG1();
1118                              if (isconti) 
1119                               {if (res.C0Value()>MaxG0Value)  MaxG0Value = res.C0Value();
1120                                if (res.G1Angle ()>MaxG1Angle) MaxG1Angle = res.G1Angle();}}
1121             else isconti = Standard_False;}
1122                     
1123           else {LocalAnalysis_SurfaceContinuity res (curv1, curv2, (U+nb*deltaU                 ), surf1,surf2, GeomAbs_G1,epsnl,epsC0, epsC1, epsC2, epsG1,
1124                  percent,maxlen);
1125                  isdone = res.IsDone();
1126                  if ( isdone) { isconti = res.IsG1();
1127                                   if ( nb == 0) { MaxG0Value = res.C0Value();
1128                                                   MaxG1Angle = res.G1Angle();}
1129                                   if (res.C0Value()> MaxG0Value)  MaxG0Value = res.C0Value();
1130                                   if (res.G1Angle()> MaxG1Angle)  MaxG1Angle= res.G1Angle();;}
1131                                   
1132                  else isconti = Standard_False;}
1133        if (!isconti) ISG1=Standard_False;                             
1134        nb++;
1135        
1136      }
1137    while ((nb<nbeval)&& isdone );
1138
1139   //if (!isdone)  { cout<<" Problem in computation "<<endl; return 1;}
1140   //if (ISG1) 
1141   //    {cout<<" the continuity is G1 "<<endl;}
1142   //else { cout<<" the continuity is not G1  "<<endl;}
1143   //cout<<"MaxG0Value :"<< MaxG0Value << endl;
1144   //cout<<"MaxG1Angle:"<<  MaxG1Angle << endl;
1145   if (!isdone)  { di<<" Problem in computation \n"; return 1;}
1146   if (ISG1) 
1147       {di<<" the continuity is G1 \n";}
1148   else { di<<" the continuity is not G1  \n";}
1149   di<<"MaxG0Value :"<< MaxG0Value << "\n";
1150   di<<"MaxG1Angle:"<<  MaxG1Angle << "\n";
1151   return 0;
1152 }
1153 /*****************************************************************************/
1154 static Standard_Integer shapeG0continuity (Draw_Interpretor& di, Standard_Integer n, const char** a)
1155
1156 { Standard_Real epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen; 
1157   Standard_Integer nbeval;
1158   Standard_Boolean ISG0;
1159   InitEpsSurf(epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen  );
1160
1161   if (n<4) return 1;
1162   TopoDS_Face face1,face2;
1163   Standard_Real f1,f2,l1,l2;
1164   TopoDS_Shape shape = DBRep::Get(a[1],TopAbs_SHAPE);
1165   if (shape.IsNull()) return 1;
1166   TopoDS_Shape  edge  = DBRep::Get(a[2],TopAbs_EDGE);
1167   if (edge.IsNull()) return 1;
1168 // calcul des deux faces 
1169   TopTools_IndexedDataMapOfShapeListOfShape lface;
1170   TopExp::MapShapesAndAncestors(shape,TopAbs_EDGE,TopAbs_FACE,lface);
1171   const TopTools_ListOfShape& lfac = lface.FindFromKey(edge);
1172
1173   Standard_Integer nelem= lfac.Extent();
1174   if(nelem!=2) return 1; 
1175   TopTools_ListIteratorOfListOfShape It;
1176   It.Initialize(lfac);
1177   face1=TopoDS::Face(It.Value());
1178   It.Next();
1179   face2=TopoDS::Face(It.Value());
1180     
1181 // calcul des deux pcurves 
1182   const Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface
1183                                (TopoDS::Edge(edge),face1,f1,l1);
1184   if (c1.IsNull()) return 1;
1185   const  Handle(Geom2d_Curve) c2  = BRep_Tool::CurveOnSurface
1186                                (TopoDS::Edge(edge),face2,f2,l2);
1187   if (c2.IsNull()) return 1;
1188         
1189    Handle(Geom2d_Curve) curv1= new Geom2d_TrimmedCurve(c1,f1,l1);
1190    
1191    Handle(Geom2d_Curve) curv2= new Geom2d_TrimmedCurve(c2,f2,l2);  
1192    
1193 // calcul des deux surfaces 
1194   TopLoc_Location L1,L2; 
1195   TopoDS_Face aLocalFace = face1;
1196   const Handle(Geom_Surface)& s1 = BRep_Tool::Surface(aLocalFace,L1);
1197 //  const Handle(Geom_Surface)& s1 =
1198 //    BRep_Tool::Surface(TopoDS::Face(face1),L1);
1199   if (s1.IsNull()) return 1;
1200   aLocalFace = face2;
1201   const Handle(Geom_Surface)& s2 = BRep_Tool::Surface(aLocalFace,L2); 
1202 //  const Handle(Geom_Surface)& s2 =
1203 //    BRep_Tool::Surface(TopoDS::Face(face2),L2); 
1204   if (s2.IsNull()) return 1;     
1205
1206
1207    Handle(Geom_Surface) surf1 = Handle(Geom_Surface)::
1208                                  DownCast(s1->Transformed(L1.Transformation()));
1209    if (surf1.IsNull()) return 1;
1210    Handle(Geom_Surface) surf2 = Handle(Geom_Surface)::
1211                                 DownCast(s2->Transformed(L2.Transformation()));
1212    if (surf2.IsNull()) return 1;
1213    
1214  
1215
1216   nbeval = (Standard_Integer ) Draw::Atof( a[3]);
1217
1218   switch(n)
1219     { case 6  : epsC0   = Draw::Atof(a[5]);
1220       case 5  : epsnl    = Draw::Atof(a[4]);
1221       case 4  : {} break;
1222       default : return 1;
1223     }
1224
1225
1226   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
1227   Standard_Boolean isconti = Standard_True;
1228   Standard_Boolean isdone = Standard_True;
1229   pard1 = curv1->FirstParameter();
1230   parf1 = curv1->LastParameter();
1231   Standard_Real  MaxG0Value=0;
1232   U = Min( pard1,parf1);
1233   Uf = Max (pard1,parf1);
1234
1235   deltaU =  Abs(parf1- pard1)/nbeval;
1236   ISG0=Standard_True;    
1237   do  
1238      { if ( nb == nbeval) 
1239           { LocalAnalysis_SurfaceContinuity res (curv1, curv2, Uf,surf1, surf2, GeomAbs_C0,epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen  );
1240             isdone = res.IsDone();
1241             if ( isdone) { isconti = res.IsC0( );
1242                           if (isconti) 
1243                           if (res.C0Value()>MaxG0Value)  MaxG0Value= res.C0Value();}  
1244             else isconti = Standard_False;}
1245                     
1246        else {LocalAnalysis_SurfaceContinuity res (curv1, curv2, (U+nb*deltaU), surf1, surf2, GeomAbs_C0,epsnl,epsC0, epsC1, epsC2, epsG1, percent,maxlen );
1247              isdone = res.IsDone();
1248              if ( isdone) { isconti = res.IsC0() ;
1249                                   if ( nb == 0) { MaxG0Value = res.C0Value();}
1250                                   if (res.C0Value()> MaxG0Value)  MaxG0Value = res.C0Value();}
1251                                   
1252                  else isconti = Standard_False;}
1253                               
1254        nb++;
1255        if (!isconti) ISG0=Standard_False;
1256        
1257      }
1258    while ((nb<nbeval)&& isdone );
1259
1260   //f (!isdone)  { cout<<" Problem in computation "<<endl; return 1;}
1261   //if (ISG0) 
1262   //    {cout<<" the continuity is G0 "<<endl;}
1263
1264   //else { cout<<" the continuity is not G0  "<<endl;}
1265   //cout<<"MaxG0Value :"<< MaxG0Value << endl;
1266   if (!isdone)  { di<<" Problem in computation \n"; return 1;}
1267   if (ISG0) 
1268       {di<<" the continuity is G0 \n";}
1269
1270   else { di<<" the continuity is not G0  \n";}
1271   di<<"MaxG0Value :"<< MaxG0Value << "\n";
1272   return 0;
1273 }
1274 /*****************************************************************************************/
1275 static Standard_Integer shapeG2continuity (Draw_Interpretor& di, Standard_Integer n, const char** a)
1276
1277 { Standard_Real epsnl,epsC0, epsC1, epsC2, epsG1, percent,maxlen;
1278   Standard_Boolean ISG2=Standard_True;
1279   Standard_Integer nbeval;
1280   Standard_Real MaxG0Value=0,MaxG1Angle=0,MaxG2Curvature=0;
1281   InitEpsSurf(epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen );
1282
1283   if (n<4) return 1;
1284   TopoDS_Face face1,face2;
1285   Standard_Real f1,f2,l1,l2;
1286   TopoDS_Shape shape = DBRep::Get(a[1],TopAbs_SHAPE);
1287   if (shape.IsNull()) return 1;
1288   TopoDS_Shape  edge  = DBRep::Get(a[2],TopAbs_EDGE);
1289   if (edge.IsNull()) return 1;
1290 // calcul des deux faces 
1291   TopTools_IndexedDataMapOfShapeListOfShape lface;
1292   TopExp::MapShapesAndAncestors(shape,TopAbs_EDGE,TopAbs_FACE,lface);
1293   const TopTools_ListOfShape& lfac = lface.FindFromKey(edge);
1294
1295   Standard_Integer nelem= lfac.Extent();
1296   if(nelem!=2) return 1; 
1297   TopTools_ListIteratorOfListOfShape It;
1298   It.Initialize(lfac);
1299   face1=TopoDS::Face(It.Value());
1300   It.Next();
1301   face2=TopoDS::Face(It.Value());
1302 // calcul des deux pcurves 
1303   const Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface
1304                                (TopoDS::Edge(edge),face1,f1,l1);
1305   if (c1.IsNull()) return 1;
1306   const  Handle(Geom2d_Curve) c2  = BRep_Tool::CurveOnSurface
1307                                (TopoDS::Edge(edge),face2,f2,l2);
1308   if (c2.IsNull()) return 1;
1309         
1310    Handle(Geom2d_Curve) curv1= new Geom2d_TrimmedCurve(c1,f1,l1);
1311    
1312    Handle(Geom2d_Curve) curv2= new Geom2d_TrimmedCurve(c2,f2,l2);  
1313    
1314 // calcul des deux surfaces 
1315   TopLoc_Location L1,L2; 
1316   TopoDS_Face aLocalFace = face1;
1317   const Handle(Geom_Surface)& s1 = BRep_Tool::Surface(aLocalFace,L1);
1318 //  const Handle(Geom_Surface)& s1 = 
1319 //    BRep_Tool::Surface(TopoDS::Face(face1),L1);
1320   if (s1.IsNull()) return 1;
1321   aLocalFace = face2;
1322   const Handle(Geom_Surface)& s2 = BRep_Tool::Surface(aLocalFace,L2); 
1323 //  const Handle(Geom_Surface)& s2 =
1324 //    BRep_Tool::Surface(TopoDS::Face(face2),L2); 
1325   if (s2.IsNull()) return 1;     
1326
1327
1328    Handle(Geom_Surface) surf1 = Handle(Geom_Surface)::
1329                                  DownCast(s1->Transformed(L1.Transformation()));
1330    if (surf1.IsNull()) return 1;
1331    Handle(Geom_Surface) surf2 = Handle(Geom_Surface)::
1332                                 DownCast(s2->Transformed(L2.Transformation()));
1333    if (surf2.IsNull()) return 1;
1334    
1335  
1336
1337   nbeval = (Standard_Integer ) Draw::Atof( a[3]);
1338
1339   switch(n)
1340     { 
1341       case 9  :  maxlen   = Draw::Atof(a[8]);
1342       case 8   : percent   = Draw::Atof(a[7]);      
1343       case 7   : epsG1 = Draw::Atof(a[6]);
1344       case 6  :  epsC0   = Draw::Atof(a[5]);
1345       case 5  :  epsnl   = Draw::Atof(a[4]);
1346       case 4  : {} break;
1347       default : return 1;
1348     }
1349
1350
1351   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
1352   Standard_Boolean isconti = Standard_True;
1353   Standard_Boolean isdone = Standard_True;
1354   pard1 = curv1->FirstParameter();
1355   parf1 = curv1->LastParameter();
1356   U = Min( pard1,parf1);
1357   Uf = Max (pard1,parf1);
1358
1359   deltaU =  Abs(parf1- pard1)/nbeval;
1360       
1361   do  
1362      { if ( nb == nbeval) 
1363           { LocalAnalysis_SurfaceContinuity res (curv1, curv2, Uf,surf1, surf2,             GeomAbs_G2,epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen );
1364             isdone = res.IsDone();
1365             if (isdone){isconti = res.IsG2();
1366                         if (isconti) 
1367                         {if(res.C0Value()>MaxG0Value) MaxG0Value=res.C0Value();
1368                          if(res.G1Angle()>MaxG1Angle) MaxG1Angle=res.G1Angle();
1369                          if(res.G2CurvatureGap()>MaxG2Curvature) 
1370                            MaxG2Curvature=res.G2CurvatureGap();
1371                         }}
1372             else isconti = Standard_False;}
1373                     
1374        else { LocalAnalysis_SurfaceContinuity res (curv1, curv2, (U+nb*deltaU), surf1,surf2, GeomAbs_G2,epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen );
1375              isdone = res.IsDone();
1376              if ( isdone) {isconti = res.IsG2();
1377                            if (nb==0){MaxG0Value=res.C0Value();
1378                                       MaxG1Angle=res.G1Angle();
1379                                       MaxG2Curvature=res.G2CurvatureGap();}
1380                            if(res.C0Value()>MaxG0Value) 
1381                                 MaxG0Value=res.C0Value();
1382                            if(res.G1Angle()>MaxG1Angle) 
1383                                 MaxG1Angle=res.G1Angle();
1384                            if(res.G2CurvatureGap()>MaxG2Curvature) 
1385                               MaxG2Curvature=res.G2CurvatureGap();}
1386                  else isconti = Standard_False;}
1387                               
1388        nb++;
1389        if (!isconti) ISG2=Standard_False;
1390        
1391      }
1392    while ((nb<nbeval)&& isdone );
1393
1394   //if (!isdone)  { cout<<" Problem in computation "<<endl; return 1;}
1395   //if (ISG2) 
1396   //cout<<" the continuity is G2 "<<endl;
1397   //else cout<<" the continuity is not G2  "<<endl;
1398   //cout<<"MaxG0Value :"<< MaxG0Value << endl;
1399   //cout<<"MaxG1Angle:"<<  MaxG1Angle << endl;
1400   //cout<<"MaxG2Curvature:"<<MaxG2Curvature<<endl;
1401   if (!isdone)  { di<<" Problem in computation \n"; return 1;}
1402   if (ISG2) 
1403   di<<" the continuity is G2 \n";
1404   else di<<" the continuity is not G2  \n";
1405   di<<"MaxG0Value :"<< MaxG0Value << "\n";
1406   di<<"MaxG1Angle:"<<  MaxG1Angle << "\n";
1407   di<<"MaxG2Curvature:"<<MaxG2Curvature<<"\n";
1408   return 0;
1409 }
1410
1411
1412 //=======================================================================
1413 //function : clintedge
1414 //purpose  : 
1415 //=======================================================================
1416 static Standard_Integer clintedge(Draw_Interpretor& di,
1417                                          Standard_Integer narg, const char** a)
1418 {
1419   char newname[255];
1420
1421   if (narg < 2) {
1422     //cout << "Usage: clintedge shape" << endl;
1423     di << "Usage: clintedge shape\n";
1424     return 1;
1425   }
1426   TopoDS_Shape S = DBRep::Get(a[1]);
1427
1428   TopTools_DataMapOfShapeListOfShape mymap;
1429   TopOpeBRepTool_PurgeInternalEdges mypurgealgo(S);
1430   Standard_Integer nbedges = mypurgealgo.NbEdges();
1431   if (nbedges > 0)
1432   {
1433     //cout<<nbedges<<" internal (or external) edges to be removed"<<endl;
1434     di<<nbedges<<" internal (or external) edges to be removed\n";
1435
1436     Standard_Integer i = 1;
1437     char* temp = newname;
1438
1439     Sprintf(newname,"%s_%d",a[1],i);
1440     DBRep::Set(temp,mypurgealgo.Shape());
1441     //cout<<newname<<" ";
1442     di<<newname<<" ";
1443
1444     //cout<<endl;
1445     di<<"\n";
1446   }
1447   else
1448     di << "no internal (or external) edges\n";
1449     //cout << "no internal (or external) edges"<<endl;
1450
1451   return 0;
1452 }
1453
1454
1455 //=======================================================================
1456 //function : facintedge
1457 //purpose  : 
1458 //=======================================================================
1459 static Standard_Integer facintedge(Draw_Interpretor& di,
1460                                          Standard_Integer narg, const char** a)
1461 {
1462   char newname[255];
1463
1464   if (narg < 2) {
1465     //cout << "Usage: facintedge shape" << endl;
1466     di << "Usage: facintedge shape\n";
1467     return 1;
1468   }
1469   TopoDS_Shape S = DBRep::Get(a[1]);
1470
1471   TopTools_DataMapOfShapeListOfShape mymap;
1472   TopOpeBRepTool_PurgeInternalEdges mypurgealgo(S);
1473   mypurgealgo.Faces(mymap);
1474
1475   Standard_Integer i = 1;
1476   char* temp = newname;
1477
1478   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itFacEdg;
1479   for (itFacEdg.Initialize(mymap); itFacEdg.More(); itFacEdg.Next()) {
1480       Sprintf(newname,"%s_%d",a[1],i);
1481       DBRep::Set(temp,itFacEdg.Key());
1482       //cout<<newname<<" ";
1483       di<<newname<<" ";
1484       i++;
1485     }
1486
1487   //cout<<endl;
1488   di<<"\n";
1489
1490   return 0;
1491 }
1492
1493 //=======================================================================
1494 //function : fuseedge
1495 //purpose  : 
1496 //=======================================================================
1497 static Standard_Integer fuseedge(Draw_Interpretor& di,
1498                                          Standard_Integer narg, const char** a)
1499 {
1500   char newname[255];
1501
1502   if (narg < 2) {
1503     //cout << "Usage: fuseedge shape" << endl;
1504     di << "Usage: fuseedge shape\n";
1505     return 1;
1506   }
1507   TopoDS_Shape S = DBRep::Get(a[1]);
1508
1509   TopTools_DataMapOfIntegerListOfShape mymap;
1510   //TopOpeBRepTool_FuseEdges myfusealgo(S);
1511   BRepLib_FuseEdges myfusealgo(S);
1512   myfusealgo.SetConcatBSpl();
1513   Standard_Integer nbvertices;
1514   nbvertices = myfusealgo.NbVertices();
1515
1516   if (nbvertices > 0) {
1517
1518     //cout<<nbvertices<<" vertices to be removed"<<endl;
1519     di<<nbvertices<<" vertices to be removed\n";
1520
1521     Standard_Integer i = 1;
1522     char* temp = newname;
1523
1524     Sprintf(newname,"%s_%d",a[1],i);
1525     DBRep::Set(temp,myfusealgo.Shape());
1526     //cout<<newname<<" ";
1527     di<<newname<<" ";
1528
1529     //cout<<endl;
1530     di<<"\n";
1531   }
1532   else
1533     di << "no vertices to remove\n";
1534     //cout << "no vertices to remove"<<endl;
1535
1536   return 0;
1537 }
1538
1539
1540 //=======================================================================
1541 //function : listfuseedge
1542 //purpose  : 
1543 //=======================================================================
1544 static Standard_Integer listfuseedge(Draw_Interpretor& di,
1545                                          Standard_Integer narg, const char** a)
1546 {
1547   char newname[255];
1548
1549   if (narg < 2) {
1550     //cout << "Usage: listfuseedge shape" << endl;
1551     di << "Usage: listfuseedge shape\n";
1552     return 1;
1553   }
1554   TopoDS_Shape S = DBRep::Get(a[1]);
1555
1556   TopTools_DataMapOfIntegerListOfShape mymap;
1557   BRepLib_FuseEdges myfusealgo(S);
1558   myfusealgo.Edges(mymap);
1559
1560   Standard_Integer i;
1561   char* temp = newname;
1562
1563   TopTools_DataMapIteratorOfDataMapOfIntegerListOfShape itLstEdg;
1564   for (itLstEdg.Initialize(mymap); itLstEdg.More(); itLstEdg.Next()) {
1565       const Standard_Integer& iLst = itLstEdg.Key();
1566       const TopTools_ListOfShape& LmapEdg = mymap.Find(iLst);
1567       TopTools_ListIteratorOfListOfShape itEdg; 
1568       i = 1;
1569       for (itEdg.Initialize(LmapEdg); itEdg.More(); itEdg.Next()) {
1570         Sprintf(newname,"%s_%d_%d",a[1],iLst,i);
1571         DBRep::Set(temp,itEdg.Value());
1572         //cout<<newname<<" ";
1573         di<<newname<<" ";
1574         i++;
1575       }
1576
1577     }
1578
1579   //cout<<endl;
1580   di<<"\n";
1581
1582   return 0;
1583 }
1584
1585 //=======================================================================
1586 //function : tolsphere
1587 //purpose  : 
1588 //=======================================================================
1589 static Standard_Integer tolsphere(Draw_Interpretor& di, Standard_Integer n, const char** a)
1590 {
1591   if (n != 2)
1592   {
1593     di << "use toolsphere shape\n";
1594     return 1;
1595   }
1596
1597   TopoDS_Shape aS = DBRep::Get(a[1]);
1598   if (aS.IsNull())
1599   {
1600     di << "No such shape " << a[1] << "\n";
1601     return 1;
1602   }
1603
1604   TopTools_IndexedMapOfShape aMapV;
1605   TopExp::MapShapes(aS, TopAbs_VERTEX, aMapV);
1606   for (Standard_Integer i = 1; i <= aMapV.Extent(); i++)
1607   {
1608     const TopoDS_Vertex& aV = TopoDS::Vertex(aMapV.FindKey(i));
1609     Standard_Real aRadius = BRep_Tool::Tolerance(aV);
1610     gp_Pnt aCenter = BRep_Tool::Pnt(aV);
1611     Handle(Geom_Surface) aSph = new Geom_SphericalSurface(gp_Ax2(aCenter,gp::DZ()), aRadius);
1612     TCollection_AsciiString aName(a[1]);
1613     aName = aName + "_v" + i;
1614     DrawTrSurf::Set(aName.ToCString(), aSph);
1615     di << aName << " ";
1616   }
1617   return 0;
1618 }
1619
1620 //=======================================================================
1621 //function : validrange
1622 //purpose  : 
1623 //=======================================================================
1624 static Standard_Integer validrange(Draw_Interpretor& di,
1625   Standard_Integer narg, const char** a)
1626 {
1627   if (narg < 2)
1628   {
1629     di << "usage: validrange edge [(out) u1 u2]";
1630     return 1;
1631   }
1632
1633   TopoDS_Edge aE = TopoDS::Edge(DBRep::Get(a[1],TopAbs_EDGE, true));
1634   if (aE.IsNull())
1635     return 1;
1636
1637   Standard_Real u1, u2;
1638   if (BRepLib::FindValidRange(aE, u1, u2))
1639   {
1640     if (narg > 3)
1641     {
1642       Draw::Set(a[2], u1);
1643       Draw::Set(a[3], u2);
1644     }
1645     else
1646     {
1647       di << u1 << " " << u2;
1648     }
1649   }
1650   else
1651     di << "edge has no valid range";
1652   return 0;
1653 }
1654
1655 //=======================================================================
1656 //function : CheckCommands
1657 //purpose  : 
1658 //=======================================================================
1659
1660 void BRepTest::CheckCommands(Draw_Interpretor& theCommands)
1661 {
1662   static Standard_Boolean done = Standard_False;
1663   if (done) return;
1664   done = Standard_True;
1665
1666   BRepTest_CheckCommands_SetFaultyName("faulty_");
1667   DBRep::BasicCommands(theCommands);
1668
1669   const char* g = "TOPOLOGY Check commands";
1670
1671 //  Modified by skv - Tue Apr 27 13:35:35 2004 Begin
1672   theCommands.Add("checkshape", 
1673                   "checkshape : no args to have help",
1674                   __FILE__,
1675                   checkshape,
1676                   g);
1677 //   theCommands.Add("checkshape", 
1678 //                "checks the validity of a shape : checkshape name,\n                      short description of check : checkshape name -short",
1679 //                __FILE__,
1680 //                CHK,
1681 //                g);
1682 //   theCommands.Add("checktopshape", 
1683 //                "checks the topological validity of a shape : checktopshape name",
1684 //                __FILE__,
1685 //                CHK,
1686 //                g);
1687 //  Modified by skv - Tue Apr 27 13:35:39 2004 End
1688
1689   theCommands.Add("checksection", 
1690                   "checks the closure of a section : checksection name",
1691                   __FILE__,
1692                   checksection,
1693                   g);
1694
1695   theCommands.Add("checkdiff", 
1696                   "checks the validity of the diff beetween the shapes arg1..argn and result :\n checkdiff arg1 [arg2..argn] result [closedSolid (1/0)] [geomCtrl (1/0)]",
1697                   __FILE__,
1698                   checkdiff,
1699                   g);
1700
1701 g = "TOPOLOGY Analysis of shapes ";
1702
1703 theCommands.Add("shapeG0continuity",
1704                  "shapeG0continuity  shape  edge nbeval [epsnul [epsG0]]",
1705                   __FILE__,
1706                   shapeG0continuity, g);
1707
1708 theCommands.Add("shapeG1continuity",
1709                 "shapeG1continuity  shape  edge nbeval [epsnul [epsG0 [epsG1]]]",
1710                    __FILE__,
1711                 shapeG1continuity ,g);
1712 theCommands.Add("shapeG2continuity",
1713                   "shapeG2continuity shape  edge  nbeval [epsnul [epsG0 [epsG1 [maxlen [perce]]]]]",
1714                   __FILE__,
1715                   shapeG2continuity,g);
1716
1717 theCommands.Add("computetolerance",
1718                   "computetolerance shape",
1719                   __FILE__,
1720                   computetolerance,g);
1721
1722 theCommands.Add("clintedge",
1723                   "clintedge shape",
1724                   __FILE__,
1725                   clintedge,g);
1726
1727 theCommands.Add("facintedge",
1728                   "facintedge shape",
1729                   __FILE__,
1730                   facintedge,g);
1731
1732 theCommands.Add("fuseedge",
1733                   "fuseedge shape",
1734                   __FILE__,
1735                   fuseedge,g);
1736
1737 theCommands.Add("listfuseedge",
1738                   "listfuseedge shape",
1739                   __FILE__,
1740                   listfuseedge,g);
1741 theCommands.Add("tolsphere", "toolsphere shape\n"
1742                 "\t\tshows vertex tolerances by drawing spheres",
1743                 __FILE__, tolsphere, g);
1744 theCommands.Add("validrange",
1745                 "validrange edge [(out) u1 u2]\n"
1746                 "\t\tcomputes valid range of the edge, and\n"
1747                 "\t\tprints first and last values or sets the variables u1 and u2",
1748                 __FILE__, validrange, g);
1749 }
1750