d4e0ef75e5ab29bb12987402062bef847d44cec8
[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   { 
1095   case 7  : epsG1 = Draw::Atof(a[6]);
1096     Standard_FALLTHROUGH
1097   case 6  : epsC0 = Draw::Atof(a[5]);
1098     Standard_FALLTHROUGH
1099   case 5  : epsnl = Draw::Atof(a[4]);
1100     Standard_FALLTHROUGH
1101   case 4  : break;
1102   default : return 1;
1103   }
1104
1105
1106   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
1107   Standard_Boolean isconti = Standard_True;
1108   Standard_Boolean isdone = Standard_True;
1109   pard1 = curv1->FirstParameter();
1110   parf1 = curv1->LastParameter();
1111   Standard_Real  MaxG0Value=0, MaxG1Angle=0; 
1112   U = Min( pard1,parf1);
1113   Uf = Max (pard1,parf1);
1114
1115   deltaU =  Abs(parf1- pard1)/nbeval;
1116       
1117   do  
1118      { if ( nb == nbeval) 
1119           { LocalAnalysis_SurfaceContinuity res(curv1, curv2, Uf,surf1, surf2,            GeomAbs_G1, epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen );
1120             isdone = res.IsDone();
1121            if ( isdone) { isconti = res.IsG1();
1122                              if (isconti) 
1123                               {if (res.C0Value()>MaxG0Value)  MaxG0Value = res.C0Value();
1124                                if (res.G1Angle ()>MaxG1Angle) MaxG1Angle = res.G1Angle();}}
1125             else isconti = Standard_False;}
1126                     
1127           else {LocalAnalysis_SurfaceContinuity res (curv1, curv2, (U+nb*deltaU                 ), surf1,surf2, GeomAbs_G1,epsnl,epsC0, epsC1, epsC2, epsG1,
1128                  percent,maxlen);
1129                  isdone = res.IsDone();
1130                  if ( isdone) { isconti = res.IsG1();
1131                                   if ( nb == 0) { MaxG0Value = res.C0Value();
1132                                                   MaxG1Angle = res.G1Angle();}
1133                                   if (res.C0Value()> MaxG0Value)  MaxG0Value = res.C0Value();
1134                                   if (res.G1Angle()> MaxG1Angle)  MaxG1Angle= res.G1Angle();;}
1135                                   
1136                  else isconti = Standard_False;}
1137        if (!isconti) ISG1=Standard_False;                             
1138        nb++;
1139        
1140      }
1141    while ((nb<nbeval)&& isdone );
1142
1143   //if (!isdone)  { cout<<" Problem in computation "<<endl; return 1;}
1144   //if (ISG1) 
1145   //    {cout<<" the continuity is G1 "<<endl;}
1146   //else { cout<<" the continuity is not G1  "<<endl;}
1147   //cout<<"MaxG0Value :"<< MaxG0Value << endl;
1148   //cout<<"MaxG1Angle:"<<  MaxG1Angle << endl;
1149   if (!isdone)  { di<<" Problem in computation \n"; return 1;}
1150   if (ISG1) 
1151       {di<<" the continuity is G1 \n";}
1152   else { di<<" the continuity is not G1  \n";}
1153   di<<"MaxG0Value :"<< MaxG0Value << "\n";
1154   di<<"MaxG1Angle:"<<  MaxG1Angle << "\n";
1155   return 0;
1156 }
1157 /*****************************************************************************/
1158 static Standard_Integer shapeG0continuity (Draw_Interpretor& di, Standard_Integer n, const char** a)
1159
1160 { Standard_Real epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen; 
1161   Standard_Integer nbeval;
1162   Standard_Boolean ISG0;
1163   InitEpsSurf(epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen  );
1164
1165   if (n<4) return 1;
1166   TopoDS_Face face1,face2;
1167   Standard_Real f1,f2,l1,l2;
1168   TopoDS_Shape shape = DBRep::Get(a[1],TopAbs_SHAPE);
1169   if (shape.IsNull()) return 1;
1170   TopoDS_Shape  edge  = DBRep::Get(a[2],TopAbs_EDGE);
1171   if (edge.IsNull()) return 1;
1172 // calcul des deux faces 
1173   TopTools_IndexedDataMapOfShapeListOfShape lface;
1174   TopExp::MapShapesAndAncestors(shape,TopAbs_EDGE,TopAbs_FACE,lface);
1175   const TopTools_ListOfShape& lfac = lface.FindFromKey(edge);
1176
1177   Standard_Integer nelem= lfac.Extent();
1178   if(nelem!=2) return 1; 
1179   TopTools_ListIteratorOfListOfShape It;
1180   It.Initialize(lfac);
1181   face1=TopoDS::Face(It.Value());
1182   It.Next();
1183   face2=TopoDS::Face(It.Value());
1184     
1185 // calcul des deux pcurves 
1186   const Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface
1187                                (TopoDS::Edge(edge),face1,f1,l1);
1188   if (c1.IsNull()) return 1;
1189   const  Handle(Geom2d_Curve) c2  = BRep_Tool::CurveOnSurface
1190                                (TopoDS::Edge(edge),face2,f2,l2);
1191   if (c2.IsNull()) return 1;
1192         
1193    Handle(Geom2d_Curve) curv1= new Geom2d_TrimmedCurve(c1,f1,l1);
1194    
1195    Handle(Geom2d_Curve) curv2= new Geom2d_TrimmedCurve(c2,f2,l2);  
1196    
1197 // calcul des deux surfaces 
1198   TopLoc_Location L1,L2; 
1199   TopoDS_Face aLocalFace = face1;
1200   const Handle(Geom_Surface)& s1 = BRep_Tool::Surface(aLocalFace,L1);
1201 //  const Handle(Geom_Surface)& s1 =
1202 //    BRep_Tool::Surface(TopoDS::Face(face1),L1);
1203   if (s1.IsNull()) return 1;
1204   aLocalFace = face2;
1205   const Handle(Geom_Surface)& s2 = BRep_Tool::Surface(aLocalFace,L2); 
1206 //  const Handle(Geom_Surface)& s2 =
1207 //    BRep_Tool::Surface(TopoDS::Face(face2),L2); 
1208   if (s2.IsNull()) return 1;     
1209
1210
1211    Handle(Geom_Surface) surf1 = Handle(Geom_Surface)::
1212                                  DownCast(s1->Transformed(L1.Transformation()));
1213    if (surf1.IsNull()) return 1;
1214    Handle(Geom_Surface) surf2 = Handle(Geom_Surface)::
1215                                 DownCast(s2->Transformed(L2.Transformation()));
1216    if (surf2.IsNull()) return 1;
1217    
1218  
1219
1220   nbeval = (Standard_Integer ) Draw::Atof( a[3]);
1221
1222   switch(n)
1223   { 
1224   case 6  : epsC0   = Draw::Atof(a[5]);
1225     Standard_FALLTHROUGH
1226   case 5  : epsnl    = Draw::Atof(a[4]);
1227     Standard_FALLTHROUGH
1228   case 4  : break;
1229   default : return 1;
1230   }
1231
1232   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
1233   Standard_Boolean isconti = Standard_True;
1234   Standard_Boolean isdone = Standard_True;
1235   pard1 = curv1->FirstParameter();
1236   parf1 = curv1->LastParameter();
1237   Standard_Real  MaxG0Value=0;
1238   U = Min( pard1,parf1);
1239   Uf = Max (pard1,parf1);
1240
1241   deltaU =  Abs(parf1- pard1)/nbeval;
1242   ISG0=Standard_True;    
1243   do  
1244      { if ( nb == nbeval) 
1245           { LocalAnalysis_SurfaceContinuity res (curv1, curv2, Uf,surf1, surf2, GeomAbs_C0,epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen  );
1246             isdone = res.IsDone();
1247             if ( isdone) { isconti = res.IsC0( );
1248                           if (isconti) 
1249                           if (res.C0Value()>MaxG0Value)  MaxG0Value= res.C0Value();}  
1250             else isconti = Standard_False;}
1251                     
1252        else {LocalAnalysis_SurfaceContinuity res (curv1, curv2, (U+nb*deltaU), surf1, surf2, GeomAbs_C0,epsnl,epsC0, epsC1, epsC2, epsG1, percent,maxlen );
1253              isdone = res.IsDone();
1254              if ( isdone) { isconti = res.IsC0() ;
1255                                   if ( nb == 0) { MaxG0Value = res.C0Value();}
1256                                   if (res.C0Value()> MaxG0Value)  MaxG0Value = res.C0Value();}
1257                                   
1258                  else isconti = Standard_False;}
1259                               
1260        nb++;
1261        if (!isconti) ISG0=Standard_False;
1262        
1263      }
1264    while ((nb<nbeval)&& isdone );
1265
1266   //f (!isdone)  { cout<<" Problem in computation "<<endl; return 1;}
1267   //if (ISG0) 
1268   //    {cout<<" the continuity is G0 "<<endl;}
1269
1270   //else { cout<<" the continuity is not G0  "<<endl;}
1271   //cout<<"MaxG0Value :"<< MaxG0Value << endl;
1272   if (!isdone)  { di<<" Problem in computation \n"; return 1;}
1273   if (ISG0) 
1274       {di<<" the continuity is G0 \n";}
1275
1276   else { di<<" the continuity is not G0  \n";}
1277   di<<"MaxG0Value :"<< MaxG0Value << "\n";
1278   return 0;
1279 }
1280 /*****************************************************************************************/
1281 static Standard_Integer shapeG2continuity (Draw_Interpretor& di, Standard_Integer n, const char** a)
1282
1283 { Standard_Real epsnl,epsC0, epsC1, epsC2, epsG1, percent,maxlen;
1284   Standard_Boolean ISG2=Standard_True;
1285   Standard_Integer nbeval;
1286   Standard_Real MaxG0Value=0,MaxG1Angle=0,MaxG2Curvature=0;
1287   InitEpsSurf(epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen );
1288
1289   if (n<4) return 1;
1290   TopoDS_Face face1,face2;
1291   Standard_Real f1,f2,l1,l2;
1292   TopoDS_Shape shape = DBRep::Get(a[1],TopAbs_SHAPE);
1293   if (shape.IsNull()) return 1;
1294   TopoDS_Shape  edge  = DBRep::Get(a[2],TopAbs_EDGE);
1295   if (edge.IsNull()) return 1;
1296 // calcul des deux faces 
1297   TopTools_IndexedDataMapOfShapeListOfShape lface;
1298   TopExp::MapShapesAndAncestors(shape,TopAbs_EDGE,TopAbs_FACE,lface);
1299   const TopTools_ListOfShape& lfac = lface.FindFromKey(edge);
1300
1301   Standard_Integer nelem= lfac.Extent();
1302   if(nelem!=2) return 1; 
1303   TopTools_ListIteratorOfListOfShape It;
1304   It.Initialize(lfac);
1305   face1=TopoDS::Face(It.Value());
1306   It.Next();
1307   face2=TopoDS::Face(It.Value());
1308 // calcul des deux pcurves 
1309   const Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface
1310                                (TopoDS::Edge(edge),face1,f1,l1);
1311   if (c1.IsNull()) return 1;
1312   const  Handle(Geom2d_Curve) c2  = BRep_Tool::CurveOnSurface
1313                                (TopoDS::Edge(edge),face2,f2,l2);
1314   if (c2.IsNull()) return 1;
1315         
1316    Handle(Geom2d_Curve) curv1= new Geom2d_TrimmedCurve(c1,f1,l1);
1317    
1318    Handle(Geom2d_Curve) curv2= new Geom2d_TrimmedCurve(c2,f2,l2);  
1319    
1320 // calcul des deux surfaces 
1321   TopLoc_Location L1,L2; 
1322   TopoDS_Face aLocalFace = face1;
1323   const Handle(Geom_Surface)& s1 = BRep_Tool::Surface(aLocalFace,L1);
1324 //  const Handle(Geom_Surface)& s1 = 
1325 //    BRep_Tool::Surface(TopoDS::Face(face1),L1);
1326   if (s1.IsNull()) return 1;
1327   aLocalFace = face2;
1328   const Handle(Geom_Surface)& s2 = BRep_Tool::Surface(aLocalFace,L2); 
1329 //  const Handle(Geom_Surface)& s2 =
1330 //    BRep_Tool::Surface(TopoDS::Face(face2),L2); 
1331   if (s2.IsNull()) return 1;     
1332
1333
1334    Handle(Geom_Surface) surf1 = Handle(Geom_Surface)::
1335                                  DownCast(s1->Transformed(L1.Transformation()));
1336    if (surf1.IsNull()) return 1;
1337    Handle(Geom_Surface) surf2 = Handle(Geom_Surface)::
1338                                 DownCast(s2->Transformed(L2.Transformation()));
1339    if (surf2.IsNull()) return 1;
1340    
1341  
1342
1343   nbeval = (Standard_Integer ) Draw::Atof( a[3]);
1344
1345   switch(n)
1346   { 
1347   case 9  :  maxlen = Draw::Atof(a[8]);
1348     Standard_FALLTHROUGH
1349   case 8   : percent = Draw::Atof(a[7]);      
1350     Standard_FALLTHROUGH
1351   case 7   : epsG1 = Draw::Atof(a[6]);
1352     Standard_FALLTHROUGH
1353   case 6  :  epsC0 = Draw::Atof(a[5]);
1354     Standard_FALLTHROUGH
1355   case 5  :  epsnl = Draw::Atof(a[4]);
1356     Standard_FALLTHROUGH
1357   case 4  : break;
1358   default : return 1;
1359   }
1360
1361
1362   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
1363   Standard_Boolean isconti = Standard_True;
1364   Standard_Boolean isdone = Standard_True;
1365   pard1 = curv1->FirstParameter();
1366   parf1 = curv1->LastParameter();
1367   U = Min( pard1,parf1);
1368   Uf = Max (pard1,parf1);
1369
1370   deltaU =  Abs(parf1- pard1)/nbeval;
1371       
1372   do  
1373      { if ( nb == nbeval) 
1374           { LocalAnalysis_SurfaceContinuity res (curv1, curv2, Uf,surf1, surf2,             GeomAbs_G2,epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen );
1375             isdone = res.IsDone();
1376             if (isdone){isconti = res.IsG2();
1377                         if (isconti) 
1378                         {if(res.C0Value()>MaxG0Value) MaxG0Value=res.C0Value();
1379                          if(res.G1Angle()>MaxG1Angle) MaxG1Angle=res.G1Angle();
1380                          if(res.G2CurvatureGap()>MaxG2Curvature) 
1381                            MaxG2Curvature=res.G2CurvatureGap();
1382                         }}
1383             else isconti = Standard_False;}
1384                     
1385        else { LocalAnalysis_SurfaceContinuity res (curv1, curv2, (U+nb*deltaU), surf1,surf2, GeomAbs_G2,epsnl,epsC0, epsC1, epsC2, epsG1,percent,maxlen );
1386              isdone = res.IsDone();
1387              if ( isdone) {isconti = res.IsG2();
1388                            if (nb==0){MaxG0Value=res.C0Value();
1389                                       MaxG1Angle=res.G1Angle();
1390                                       MaxG2Curvature=res.G2CurvatureGap();}
1391                            if(res.C0Value()>MaxG0Value) 
1392                                 MaxG0Value=res.C0Value();
1393                            if(res.G1Angle()>MaxG1Angle) 
1394                                 MaxG1Angle=res.G1Angle();
1395                            if(res.G2CurvatureGap()>MaxG2Curvature) 
1396                               MaxG2Curvature=res.G2CurvatureGap();}
1397                  else isconti = Standard_False;}
1398                               
1399        nb++;
1400        if (!isconti) ISG2=Standard_False;
1401        
1402      }
1403    while ((nb<nbeval)&& isdone );
1404
1405   //if (!isdone)  { cout<<" Problem in computation "<<endl; return 1;}
1406   //if (ISG2) 
1407   //cout<<" the continuity is G2 "<<endl;
1408   //else cout<<" the continuity is not G2  "<<endl;
1409   //cout<<"MaxG0Value :"<< MaxG0Value << endl;
1410   //cout<<"MaxG1Angle:"<<  MaxG1Angle << endl;
1411   //cout<<"MaxG2Curvature:"<<MaxG2Curvature<<endl;
1412   if (!isdone)  { di<<" Problem in computation \n"; return 1;}
1413   if (ISG2) 
1414   di<<" the continuity is G2 \n";
1415   else di<<" the continuity is not G2  \n";
1416   di<<"MaxG0Value :"<< MaxG0Value << "\n";
1417   di<<"MaxG1Angle:"<<  MaxG1Angle << "\n";
1418   di<<"MaxG2Curvature:"<<MaxG2Curvature<<"\n";
1419   return 0;
1420 }
1421
1422
1423 //=======================================================================
1424 //function : clintedge
1425 //purpose  : 
1426 //=======================================================================
1427 static Standard_Integer clintedge(Draw_Interpretor& di,
1428                                          Standard_Integer narg, const char** a)
1429 {
1430   char newname[255];
1431
1432   if (narg < 2) {
1433     //cout << "Usage: clintedge shape" << endl;
1434     di << "Usage: clintedge shape\n";
1435     return 1;
1436   }
1437   TopoDS_Shape S = DBRep::Get(a[1]);
1438
1439   TopTools_DataMapOfShapeListOfShape mymap;
1440   TopOpeBRepTool_PurgeInternalEdges mypurgealgo(S);
1441   Standard_Integer nbedges = mypurgealgo.NbEdges();
1442   if (nbedges > 0)
1443   {
1444     //cout<<nbedges<<" internal (or external) edges to be removed"<<endl;
1445     di<<nbedges<<" internal (or external) edges to be removed\n";
1446
1447     Standard_Integer i = 1;
1448     char* temp = newname;
1449
1450     Sprintf(newname,"%s_%d",a[1],i);
1451     DBRep::Set(temp,mypurgealgo.Shape());
1452     //cout<<newname<<" ";
1453     di<<newname<<" ";
1454
1455     //cout<<endl;
1456     di<<"\n";
1457   }
1458   else
1459     di << "no internal (or external) edges\n";
1460     //cout << "no internal (or external) edges"<<endl;
1461
1462   return 0;
1463 }
1464
1465
1466 //=======================================================================
1467 //function : facintedge
1468 //purpose  : 
1469 //=======================================================================
1470 static Standard_Integer facintedge(Draw_Interpretor& di,
1471                                          Standard_Integer narg, const char** a)
1472 {
1473   char newname[255];
1474
1475   if (narg < 2) {
1476     //cout << "Usage: facintedge shape" << endl;
1477     di << "Usage: facintedge shape\n";
1478     return 1;
1479   }
1480   TopoDS_Shape S = DBRep::Get(a[1]);
1481
1482   TopTools_DataMapOfShapeListOfShape mymap;
1483   TopOpeBRepTool_PurgeInternalEdges mypurgealgo(S);
1484   mypurgealgo.Faces(mymap);
1485
1486   Standard_Integer i = 1;
1487   char* temp = newname;
1488
1489   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itFacEdg;
1490   for (itFacEdg.Initialize(mymap); itFacEdg.More(); itFacEdg.Next()) {
1491       Sprintf(newname,"%s_%d",a[1],i);
1492       DBRep::Set(temp,itFacEdg.Key());
1493       //cout<<newname<<" ";
1494       di<<newname<<" ";
1495       i++;
1496     }
1497
1498   //cout<<endl;
1499   di<<"\n";
1500
1501   return 0;
1502 }
1503
1504 //=======================================================================
1505 //function : fuseedge
1506 //purpose  : 
1507 //=======================================================================
1508 static Standard_Integer fuseedge(Draw_Interpretor& di,
1509                                          Standard_Integer narg, const char** a)
1510 {
1511   char newname[255];
1512
1513   if (narg < 2) {
1514     //cout << "Usage: fuseedge shape" << endl;
1515     di << "Usage: fuseedge shape\n";
1516     return 1;
1517   }
1518   TopoDS_Shape S = DBRep::Get(a[1]);
1519
1520   TopTools_DataMapOfIntegerListOfShape mymap;
1521   //TopOpeBRepTool_FuseEdges myfusealgo(S);
1522   BRepLib_FuseEdges myfusealgo(S);
1523   myfusealgo.SetConcatBSpl();
1524   Standard_Integer nbvertices;
1525   nbvertices = myfusealgo.NbVertices();
1526
1527   if (nbvertices > 0) {
1528
1529     //cout<<nbvertices<<" vertices to be removed"<<endl;
1530     di<<nbvertices<<" vertices to be removed\n";
1531
1532     Standard_Integer i = 1;
1533     char* temp = newname;
1534
1535     Sprintf(newname,"%s_%d",a[1],i);
1536     DBRep::Set(temp,myfusealgo.Shape());
1537     //cout<<newname<<" ";
1538     di<<newname<<" ";
1539
1540     //cout<<endl;
1541     di<<"\n";
1542   }
1543   else
1544     di << "no vertices to remove\n";
1545     //cout << "no vertices to remove"<<endl;
1546
1547   return 0;
1548 }
1549
1550
1551 //=======================================================================
1552 //function : listfuseedge
1553 //purpose  : 
1554 //=======================================================================
1555 static Standard_Integer listfuseedge(Draw_Interpretor& di,
1556                                          Standard_Integer narg, const char** a)
1557 {
1558   char newname[255];
1559
1560   if (narg < 2) {
1561     //cout << "Usage: listfuseedge shape" << endl;
1562     di << "Usage: listfuseedge shape\n";
1563     return 1;
1564   }
1565   TopoDS_Shape S = DBRep::Get(a[1]);
1566
1567   TopTools_DataMapOfIntegerListOfShape mymap;
1568   BRepLib_FuseEdges myfusealgo(S);
1569   myfusealgo.Edges(mymap);
1570
1571   Standard_Integer i;
1572   char* temp = newname;
1573
1574   TopTools_DataMapIteratorOfDataMapOfIntegerListOfShape itLstEdg;
1575   for (itLstEdg.Initialize(mymap); itLstEdg.More(); itLstEdg.Next()) {
1576       const Standard_Integer& iLst = itLstEdg.Key();
1577       const TopTools_ListOfShape& LmapEdg = mymap.Find(iLst);
1578       TopTools_ListIteratorOfListOfShape itEdg; 
1579       i = 1;
1580       for (itEdg.Initialize(LmapEdg); itEdg.More(); itEdg.Next()) {
1581         Sprintf(newname,"%s_%d_%d",a[1],iLst,i);
1582         DBRep::Set(temp,itEdg.Value());
1583         //cout<<newname<<" ";
1584         di<<newname<<" ";
1585         i++;
1586       }
1587
1588     }
1589
1590   //cout<<endl;
1591   di<<"\n";
1592
1593   return 0;
1594 }
1595
1596 //=======================================================================
1597 //function : tolsphere
1598 //purpose  : 
1599 //=======================================================================
1600 static Standard_Integer tolsphere(Draw_Interpretor& di, Standard_Integer n, const char** a)
1601 {
1602   if (n != 2)
1603   {
1604     di << "use toolsphere shape\n";
1605     return 1;
1606   }
1607
1608   TopoDS_Shape aS = DBRep::Get(a[1]);
1609   if (aS.IsNull())
1610   {
1611     di << "No such shape " << a[1] << "\n";
1612     return 1;
1613   }
1614
1615   TopTools_IndexedMapOfShape aMapV;
1616   TopExp::MapShapes(aS, TopAbs_VERTEX, aMapV);
1617   for (Standard_Integer i = 1; i <= aMapV.Extent(); i++)
1618   {
1619     const TopoDS_Vertex& aV = TopoDS::Vertex(aMapV.FindKey(i));
1620     Standard_Real aRadius = BRep_Tool::Tolerance(aV);
1621     gp_Pnt aCenter = BRep_Tool::Pnt(aV);
1622     Handle(Geom_Surface) aSph = new Geom_SphericalSurface(gp_Ax2(aCenter,gp::DZ()), aRadius);
1623     TCollection_AsciiString aName(a[1]);
1624     aName = aName + "_v" + i;
1625     DrawTrSurf::Set(aName.ToCString(), aSph);
1626     di << aName << " ";
1627   }
1628   return 0;
1629 }
1630
1631 //=======================================================================
1632 //function : validrange
1633 //purpose  : 
1634 //=======================================================================
1635 static Standard_Integer validrange(Draw_Interpretor& di,
1636   Standard_Integer narg, const char** a)
1637 {
1638   if (narg < 2)
1639   {
1640     di << "usage: validrange edge [(out) u1 u2]";
1641     return 1;
1642   }
1643
1644   TopoDS_Edge aE = TopoDS::Edge(DBRep::Get(a[1],TopAbs_EDGE, true));
1645   if (aE.IsNull())
1646     return 1;
1647
1648   Standard_Real u1, u2;
1649   if (BRepLib::FindValidRange(aE, u1, u2))
1650   {
1651     if (narg > 3)
1652     {
1653       Draw::Set(a[2], u1);
1654       Draw::Set(a[3], u2);
1655     }
1656     else
1657     {
1658       di << u1 << " " << u2;
1659     }
1660   }
1661   else
1662     di << "edge has no valid range";
1663   return 0;
1664 }
1665
1666 //=======================================================================
1667 //function : CheckCommands
1668 //purpose  : 
1669 //=======================================================================
1670
1671 void BRepTest::CheckCommands(Draw_Interpretor& theCommands)
1672 {
1673   static Standard_Boolean done = Standard_False;
1674   if (done) return;
1675   done = Standard_True;
1676
1677   BRepTest_CheckCommands_SetFaultyName("faulty_");
1678   DBRep::BasicCommands(theCommands);
1679
1680   const char* g = "TOPOLOGY Check commands";
1681
1682 //  Modified by skv - Tue Apr 27 13:35:35 2004 Begin
1683   theCommands.Add("checkshape", 
1684                   "checkshape : no args to have help",
1685                   __FILE__,
1686                   checkshape,
1687                   g);
1688 //   theCommands.Add("checkshape", 
1689 //                "checks the validity of a shape : checkshape name,\n                      short description of check : checkshape name -short",
1690 //                __FILE__,
1691 //                CHK,
1692 //                g);
1693 //   theCommands.Add("checktopshape", 
1694 //                "checks the topological validity of a shape : checktopshape name",
1695 //                __FILE__,
1696 //                CHK,
1697 //                g);
1698 //  Modified by skv - Tue Apr 27 13:35:39 2004 End
1699
1700   theCommands.Add("checksection", 
1701                   "checks the closure of a section : checksection name",
1702                   __FILE__,
1703                   checksection,
1704                   g);
1705
1706   theCommands.Add("checkdiff", 
1707                   "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)]",
1708                   __FILE__,
1709                   checkdiff,
1710                   g);
1711
1712 g = "TOPOLOGY Analysis of shapes ";
1713
1714 theCommands.Add("shapeG0continuity",
1715                  "shapeG0continuity  shape  edge nbeval [epsnul [epsG0]]",
1716                   __FILE__,
1717                   shapeG0continuity, g);
1718
1719 theCommands.Add("shapeG1continuity",
1720                 "shapeG1continuity  shape  edge nbeval [epsnul [epsG0 [epsG1]]]",
1721                    __FILE__,
1722                 shapeG1continuity ,g);
1723 theCommands.Add("shapeG2continuity",
1724                   "shapeG2continuity shape  edge  nbeval [epsnul [epsG0 [epsG1 [maxlen [perce]]]]]",
1725                   __FILE__,
1726                   shapeG2continuity,g);
1727
1728 theCommands.Add("computetolerance",
1729                   "computetolerance shape",
1730                   __FILE__,
1731                   computetolerance,g);
1732
1733 theCommands.Add("clintedge",
1734                   "clintedge shape",
1735                   __FILE__,
1736                   clintedge,g);
1737
1738 theCommands.Add("facintedge",
1739                   "facintedge shape",
1740                   __FILE__,
1741                   facintedge,g);
1742
1743 theCommands.Add("fuseedge",
1744                   "fuseedge shape",
1745                   __FILE__,
1746                   fuseedge,g);
1747
1748 theCommands.Add("listfuseedge",
1749                   "listfuseedge shape",
1750                   __FILE__,
1751                   listfuseedge,g);
1752 theCommands.Add("tolsphere", "toolsphere shape\n"
1753                 "\t\tshows vertex tolerances by drawing spheres",
1754                 __FILE__, tolsphere, g);
1755 theCommands.Add("validrange",
1756                 "validrange edge [(out) u1 u2]\n"
1757                 "\t\tcomputes valid range of the edge, and\n"
1758                 "\t\tprints first and last values or sets the variables u1 and u2",
1759                 __FILE__, validrange, g);
1760 }
1761