1 // Created by: Peter KURNEV
2 // Copyright (c) 2010-2012 OPEN CASCADE SAS
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
20 #include <BOPTest.ixx>
21 #include <TCollection_AsciiString.hxx>
25 #include <TopoDS_Shape.hxx>
26 #include <TopoDS_Compound.hxx>
27 #include <BRep_Builder.hxx>
31 #include <Geom_Geometry.hxx>
32 #include <Geom_CartesianPoint.hxx>
35 #include <DrawTrSurf.hxx>
36 #include <BOPAlgo_CheckerSI.hxx>
37 #include <BOPDS_VectorOfInterfVV.hxx>
38 #include <BOPDS_VectorOfInterfVE.hxx>
39 #include <BOPDS_VectorOfInterfEE.hxx>
40 #include <BOPDS_VectorOfInterfVF.hxx>
41 #include <BOPDS_VectorOfInterfEF.hxx>
42 #include <BOPDS_VectorOfInterfFF.hxx>
43 #include <BOPDS_DS.hxx>
45 #include <BOPCol_ListOfShape.hxx>
46 #include <BOPAlgo_ArgumentAnalyzer.hxx>
47 #include <BOPAlgo_CheckResult.hxx>
48 #include <BRepBuilderAPI_Copy.hxx>
51 Standard_Integer bopcheck (Draw_Interpretor&, Standard_Integer, const char** );
54 Standard_Integer bopargcheck (Draw_Interpretor&, Standard_Integer, const char** );
57 //=======================================================================
58 //function : CheckCommands
60 //=======================================================================
61 void BOPTest::CheckCommands(Draw_Interpretor& theCommands)
63 static Standard_Boolean done = Standard_False;
69 const char* g = "CCR commands";
71 theCommands.Add("bopcheck" , "Use >bopcheck Shape [level of check: 0(V/V) - 5(all)]", __FILE__, bopcheck, g);
72 theCommands.Add("bopargcheck" , "Use bopargcheck without parameters to get ", __FILE__, bopargcheck, g);
75 //=======================================================================
78 //=======================================================================
79 Standard_Integer bopcheck (Draw_Interpretor& di, Standard_Integer n, const char** a )
83 di << " Use >bopcheck Shape [level of check: 0 - 5" << "\n";
84 di << " The level of check defines which interferferences will be checked:\n";
85 di << " 0 - only V/V;\n";
86 di << " 1 - V/V and V/E;\n";
87 di << " 2 - V/V, V/E and E/E;\n";
88 di << " 3 - V/V, V/E, E/E and V/F;\n";
89 di << " 4 - V/V, V/E, E/E, V/F and E/F;\n";
90 di << " 5 - all interferences, default value.\n";
94 TopoDS_Shape aS1 = DBRep::Get(a[1]);
96 di << "null shapes are not allowed here!";
99 TopoDS_Shape aS = BRepBuilderAPI_Copy(aS1).Shape();
101 Standard_Integer iErr, aTypeInt, i, ind, j;
102 Standard_Integer nI1, nI2, theLevelOfCheck;
103 Standard_Boolean bSelfInt, bFFInt;
105 char type[6][4] = {"V/V", "V/E", "E/E","V/F", "E/F", "F/F"};
107 theLevelOfCheck = (n==3) ? Draw::Atoi(a[2]) : 5;
108 if (theLevelOfCheck >= 0 && theLevelOfCheck < 5) {
109 di << "Info:\nThe level of check is set to " << type[theLevelOfCheck]
110 << ", i.e. intersection(s)\n";
111 for (i=theLevelOfCheck+1; i<=5; ++i) {
117 di << " will not be checked.\n\n";
120 BOPAlgo_CheckerSI aChecker;
121 BOPCol_ListOfShape anArgs;
123 aChecker.SetArguments(anArgs);
124 aChecker.SetLevelOfCheck(theLevelOfCheck);
127 iErr = aChecker.ErrorStatus();
129 const BOPDS_PDS& theDS = aChecker.PDS();
130 BOPDS_VectorOfInterfVV& aVVs=theDS->InterfVV();
131 BOPDS_VectorOfInterfVE& aVEs=theDS->InterfVE();
132 BOPDS_VectorOfInterfEE& aEEs=theDS->InterfEE();
133 BOPDS_VectorOfInterfVF& aVFs=theDS->InterfVF();
134 BOPDS_VectorOfInterfEF& aEFs=theDS->InterfEF();
135 BOPDS_VectorOfInterfFF& aFFs=theDS->InterfFF();
137 Standard_Integer aNb[6] = {aVVs.Extent(), aVEs.Extent(), aEEs.Extent(),
138 aVFs.Extent(), aEFs.Extent(), aFFs.Extent()};
140 bSelfInt = Standard_False;
142 for (aTypeInt = 0; aTypeInt < 6; ++aTypeInt) {
143 for (i = 0; i < aNb[aTypeInt]; ++i) {
144 BOPDS_Interf* aInt = (aTypeInt==0) ? (BOPDS_Interf*)(&aVVs(i)) :
145 ((aTypeInt==1) ? (BOPDS_Interf*)(&aVEs(i)) :
146 ((aTypeInt==2) ? (BOPDS_Interf*)(&aEEs(i)) :
147 ((aTypeInt==3) ? (BOPDS_Interf*)(&aVFs(i)) :
148 ((aTypeInt==4) ? (BOPDS_Interf*)(&aEFs(i)) : (BOPDS_Interf*)(&aFFs(i))))));
150 nI1 = aInt->Index1();
151 nI2 = aInt->Index2();
157 BOPDS_InterfEF& aEF=aEFs(i);
158 if (aEF.CommonPart().Type()==TopAbs_SHAPE) {
163 const TopoDS_Shape& aS1 = theDS->Shape(nI1);
164 const TopoDS_Shape& aS2 = theDS->Shape(nI2);
167 bFFInt = Standard_False;
168 BOPDS_InterfFF& aFF = aFFs(i);
169 BOPDS_VectorOfPoint& aVP=aFF.ChangePoints();
170 Standard_Integer aNbP=aVP.Extent();
171 BOPDS_VectorOfCurve& aVC=aFF.ChangeCurves();
172 Standard_Integer aNbC=aVC.Extent();
173 if (!aNbP && !aNbC) {
176 for (j=0; j<aNbC; ++j) {
177 BOPDS_Curve& aNC=aVC(j);
178 BOPDS_ListOfPaveBlock& aLPBC=aNC.ChangePaveBlocks();
179 if (aLPBC.Extent()) {
180 bFFInt = Standard_True;
189 di << type[aTypeInt] << ":";
191 TCollection_AsciiString aBaseName("x");
192 TCollection_AsciiString anumbername(ind);
193 TCollection_AsciiString aXName = aBaseName + anumbername;
194 Standard_CString aname=aXName.ToCString();
195 DBRep::Set (aname, aS1);
197 TCollection_AsciiString anumbername1(ind);
198 TCollection_AsciiString aXName1 = aBaseName + anumbername1;
199 Standard_CString aname1=aXName1.ToCString();
200 DBRep::Set (aname1, aS2);
203 Sprintf(buf, "%s, %s \n", aname, aname1);
205 bSelfInt = Standard_True;
210 di << "There were errors during the operation, so the list may be incomplete." << "\n";
214 di << " This shape seems to be OK." << "\n";
220 static void MakeShapeForFullOutput(const TCollection_AsciiString & aBaseName,
221 const Standard_Integer aIndex,
222 const BOPCol_ListOfShape & aList,
223 Standard_Integer& aCount,
224 Draw_Interpretor& di)
226 TCollection_AsciiString aNum(aIndex);
227 TCollection_AsciiString aName = aBaseName + aNum;
228 Standard_CString name = aName.ToCString();
232 BB.MakeCompound(cmp);
234 BOPCol_ListIteratorOfListOfShape anIt(aList);
235 for(; anIt.More(); anIt.Next()) {
236 const TopoDS_Shape & aS = anIt.Value();
240 di << "Made faulty shape: " << name << "\n";
241 DBRep::Set(name, cmp);
245 Standard_Integer bopargcheck (Draw_Interpretor& di, Standard_Integer n, const char** a )
249 di << " Use >bopargcheck Shape1 [[Shape2] [-F/O/C/T/S/U] [/R|F|T|V|E|I|P]] [#BF]" << "\n" << "\n";
250 di << " -<Boolean Operation>" << "\n";
251 di << " F (fuse)" << "\n";
252 di << " O (common)" << "\n";
253 di << " C (cut)" << "\n";
254 di << " T (cut21)" << "\n";
255 di << " S (section)" << "\n";
256 di << " U (unknown)" << "\n";
257 di << " For example: \"bopargcheck s1 s2 -F\" enables checking for Fuse operation" << "\n";
258 di << " default - section" << "\n" << "\n";
259 di << " /<Test Options>" << "\n";
260 di << " R (disable small edges (shrank range) test)" << "\n";
261 di << " F (disable faces verification test)" << "\n";
262 di << " T (disable tangent faces searching test)" << "\n";
263 di << " V (disable test possibility to merge vertices)" << "\n";
264 di << " E (disable test possibility to merge edges)" << "\n";
265 di << " I (disable self-interference test)" << "\n";
266 di << " P (disable shape type test)" << "\n";
267 di << " For example: \"bopargcheck s1 s2 /RI\" disables small edge detection and self-intersection detection" << "\n";
268 di << " default - all options are enabled" << "\n" << "\n";
269 di << " #<Additional Test Options>" << "\n";
270 di << " B (stop test on first faulty found); default OFF" << "\n";
271 di << " F (full output for faulty shapes); default - output in a short format" << "\n" << "\n";
272 di << " NOTE: <Boolean Operation> and <Test Options> are used only for couple" << "\n";
273 di << " of argument shapes, except I and P options that are always used for" << "\n";
274 di << " couple of shapes as well as for single shape test." << "\n";
278 TopoDS_Shape aS11 = DBRep::Get(a[1]);
281 di << "Error: null shape not allowed!" << "\n";
282 di << "Type bopargcheck without arguments for more information" << "\n";
285 TopoDS_Shape aS1 = BRepBuilderAPI_Copy(aS11).Shape();
288 Standard_Boolean isBO = Standard_False;
289 Standard_Integer indxBO = 0;
290 Standard_Boolean isOP = Standard_False;
291 Standard_Integer indxOP = 0;
292 Standard_Boolean isAD = Standard_False;
293 Standard_Integer indxAD = 0;
294 Standard_Boolean isS2 = Standard_False;
295 Standard_Integer indxS2 = 0;
298 Standard_Integer iIndex = 0;
299 for(iIndex = 2; iIndex < n; iIndex++) {
300 if(a[iIndex][0] == '-')
302 isBO = Standard_True;
305 //else if(a[iIndex][0] == '+')
306 else if(a[iIndex][0] == '/')
308 isOP = Standard_True;
311 else if(a[iIndex][0] == '#')
313 isAD = Standard_True;
317 isS2 = Standard_True;
323 // set & test second shape
324 TopoDS_Shape aS22, aS2;
327 di << "Error: second shape should follow the first one!" << "\n";
328 di << "Type bopargcheck without arguments for more information" << "\n";
332 aS22 = DBRep::Get(a[2]);
334 di << "Error: second shape is null!" << "\n";
335 di << "Type bopargcheck without arguments for more information" << "\n";
342 BOPAlgo_ArgumentAnalyzer aChecker;
343 aChecker.SetShape1(aS1);
345 // set default options (always tested!) for single and couple shapes
346 aChecker.ArgumentTypeMode() = Standard_True;
347 aChecker.SelfInterMode() = Standard_True;
349 // test & set options and operation for two shapes
351 aS2 = BRepBuilderAPI_Copy(aS22).Shape();
352 aChecker.SetShape2(aS2);
353 // set operation (default - Section)
355 if(a[indxBO][1] == 'F' || a[indxBO][1] == 'f') {
356 aChecker.OperationType() = BOPAlgo_FUSE;
358 else if(a[indxBO][1] == 'O' || a[indxBO][1] == 'o') {
359 aChecker.OperationType() = BOPAlgo_COMMON;
361 else if(a[indxBO][1] == 'C' || a[indxBO][1] == 'c') {
362 aChecker.OperationType() = BOPAlgo_CUT;
364 else if(a[indxBO][1] == 'T' || a[indxBO][1] == 't') {
365 aChecker.OperationType() = BOPAlgo_CUT21;
367 else if(a[indxBO][1] == 'S' || a[indxBO][1] == 's') {
368 aChecker.OperationType() = BOPAlgo_SECTION;
370 else if(a[indxBO][1] == 'U' || a[indxBO][1] == 'u') {
371 aChecker.OperationType() = BOPAlgo_UNKNOWN;
374 di << "Error: invalid boolean operation type!" << "\n";
375 di << "Type bopargcheck without arguments for more information" << "\n";
380 aChecker.OperationType() = BOPAlgo_SECTION;
382 aChecker.SmallEdgeMode() = Standard_True;
383 aChecker.RebuildFaceMode() = Standard_True;
384 aChecker.TangentMode() = Standard_True;
385 aChecker.MergeVertexMode() = Standard_True;
386 aChecker.MergeEdgeMode() = Standard_True;
388 // set options (default - all ON)
390 Standard_Integer ind = 1;
391 while(a[indxOP][ind] != 0) {
392 if(a[indxOP][ind] == 'R' || a[indxOP][ind] == 'r') {
393 //aChecker.SmallEdgeMode() = Standard_True;
394 aChecker.SmallEdgeMode() = Standard_False;
396 else if(a[indxOP][ind] == 'F' || a[indxOP][ind] == 'f') {
397 //aChecker.RebuildFaceMode() = Standard_True;
398 aChecker.RebuildFaceMode() = Standard_False;
400 else if(a[indxOP][ind] == 'T' || a[indxOP][ind] == 't') {
401 //aChecker.TangentMode() = Standard_True;
402 aChecker.TangentMode() = Standard_False;
404 else if(a[indxOP][ind] == 'V' || a[indxOP][ind] == 'v') {
405 //aChecker.MergeVertexMode() = Standard_True;
406 aChecker.MergeVertexMode() = Standard_False;
408 else if(a[indxOP][ind] == 'E' || a[indxOP][ind] == 'e') {
409 //aChecker.MergeEdgeMode() = Standard_True;
410 aChecker.MergeEdgeMode() = Standard_False;
412 else if(a[indxOP][ind] == 'I' || a[indxOP][ind] == 'i') {
413 aChecker.SelfInterMode() = Standard_False;
415 else if(a[indxOP][ind] == 'P' || a[indxOP][ind] == 'p') {
416 aChecker.ArgumentTypeMode() = Standard_False;
419 di << "Error: invalid test option(s)!" << "\n";
420 di << "Type bopargcheck without arguments for more information" << "\n";
427 // default test mode (all - ON)
428 aChecker.SmallEdgeMode() = Standard_True;
429 aChecker.RebuildFaceMode() = Standard_True;
430 aChecker.TangentMode() = Standard_True;
431 aChecker.MergeVertexMode() = Standard_True;
432 aChecker.MergeEdgeMode() = Standard_True;
436 // check type and self-interference mode for single shape test
437 // also check small edges and check faces
438 aChecker.SmallEdgeMode() = Standard_True;
439 aChecker.RebuildFaceMode() = Standard_True;
442 Standard_Integer ind = 1;
443 while(a[indxOP][ind] != 0) {
444 if(a[indxOP][ind] == 'R' || a[indxOP][ind] == 'r') {
446 else if(a[indxOP][ind] == 'F' || a[indxOP][ind] == 'f') {
448 else if(a[indxOP][ind] == 'T' || a[indxOP][ind] == 't') {
450 else if(a[indxOP][ind] == 'V' || a[indxOP][ind] == 'v') {
452 else if(a[indxOP][ind] == 'E' || a[indxOP][ind] == 'e') {
454 else if(a[indxOP][ind] == 'I' || a[indxOP][ind] == 'i') {
455 aChecker.SelfInterMode() = Standard_False;
457 else if(a[indxOP][ind] == 'P' || a[indxOP][ind] == 'p') {
458 aChecker.ArgumentTypeMode() = Standard_False;
461 di << "Error: invalid test option(s)!" << "\n";
462 di << "Type bopargcheck without arguments for more information" << "\n";
470 // set additional options
471 Standard_Boolean fullOutput = Standard_False;
473 Standard_Integer ind = 1;
474 while(a[indxAD][ind] != 0) {
475 if(a[indxAD][ind] == 'B' || a[indxAD][ind] == 'b') {
476 aChecker.StopOnFirstFaulty() = Standard_True;
478 else if(a[indxAD][ind] == 'F' || a[indxAD][ind] == 'f') {
479 fullOutput = Standard_True;
482 di << "Error: invalid additional test option(s)!" << "\n";
483 di << "Type bopargcheck without arguments for more information" << "\n";
493 // process result of checking
494 if(!aChecker.HasFaulty()) {
495 di << "Shape(s) seem(s) to be valid for BOP." << "\n";
499 di << "Faulties, that can not be treated by BOP, are detected." << "\n";
502 const BOPAlgo_ListOfCheckResult& aResultList = aChecker.GetCheckResult();
503 BOPAlgo_ListIteratorOfListOfCheckResult anIt(aResultList);
505 Standard_Integer S1_BadType = 0, S1_SelfInt = 0, S1_SmalE = 0, S1_BadF = 0, S1_BadV = 0, S1_BadE = 0;
506 Standard_Integer S1_SelfIntAll = 0, S1_SmalEAll = 0, S1_BadFAll = 0, S1_BadVAll = 0, S1_BadEAll = 0;
507 Standard_Integer S2_BadType = 0, S2_SelfInt = 0, S2_SmalE = 0, S2_BadF = 0, S2_BadV = 0, S2_BadE = 0;
508 Standard_Integer S2_SelfIntAll = 0, S2_SmalEAll = 0, S2_BadFAll = 0, S2_BadVAll = 0, S2_BadEAll = 0;
509 Standard_Integer S1_OpAb = 0, S2_OpAb = 0;
510 Standard_Boolean hasUnknown = Standard_False;
512 TCollection_AsciiString aS1SIBaseName("s1si_");
513 TCollection_AsciiString aS1SEBaseName("s1se_");
514 TCollection_AsciiString aS1BFBaseName("s1bf_");
515 TCollection_AsciiString aS1BVBaseName("s1bv_");
516 TCollection_AsciiString aS1BEBaseName("s1be_");
517 TCollection_AsciiString aS2SIBaseName("s2si_");
518 TCollection_AsciiString aS2SEBaseName("s2se_");
519 TCollection_AsciiString aS2BFBaseName("s2bf_");
520 TCollection_AsciiString aS2BVBaseName("s2bv_");
521 TCollection_AsciiString aS2BEBaseName("s2be_");
523 for(; anIt.More(); anIt.Next()) {
524 const BOPAlgo_CheckResult& aResult = anIt.Value();
525 const TopoDS_Shape & aSS1 = aResult.GetShape1();
526 const TopoDS_Shape & aSS2 = aResult.GetShape2();
527 const BOPCol_ListOfShape & aLS1 = aResult.GetFaultyShapes1();
528 const BOPCol_ListOfShape & aLS2 = aResult.GetFaultyShapes2();
529 Standard_Boolean isL1 = !aLS1.IsEmpty();
530 Standard_Boolean isL2 = !aLS2.IsEmpty();
532 switch(aResult.GetCheckStatus()) {
533 case BOPAlgo_BadType: {
534 if(!aSS1.IsNull()) S1_BadType++;
535 if(!aSS2.IsNull()) S2_BadType++;
538 case BOPAlgo_SelfIntersect: {
542 MakeShapeForFullOutput(aS1SIBaseName, S1_SelfInt, aLS1, S1_SelfIntAll, di);
547 MakeShapeForFullOutput(aS2SIBaseName, S2_SelfInt, aLS2, S2_SelfIntAll, di);
551 case BOPAlgo_TooSmallEdge: {
555 MakeShapeForFullOutput(aS1SEBaseName, S1_SmalE, aLS1, S1_SmalEAll, di);
560 MakeShapeForFullOutput(aS2SEBaseName, S2_SmalE, aLS2, S2_SmalEAll, di);
564 case BOPAlgo_NonRecoverableFace: {
568 MakeShapeForFullOutput(aS1BFBaseName, S1_BadF, aLS1, S1_BadFAll, di);
573 MakeShapeForFullOutput(aS2BFBaseName, S2_BadF, aLS2, S2_BadFAll, di);
577 case BOPAlgo_IncompatibilityOfVertex: {
581 MakeShapeForFullOutput(aS1BVBaseName, S1_BadV, aLS1, S1_BadVAll, di);
587 MakeShapeForFullOutput(aS2BVBaseName, S2_BadV, aLS2, S2_BadVAll, di);
592 case BOPAlgo_IncompatibilityOfEdge: {
596 MakeShapeForFullOutput(aS1BEBaseName, S1_BadE, aLS1, S1_BadEAll, di);
602 MakeShapeForFullOutput(aS2BEBaseName, S2_BadE, aLS2, S2_BadEAll, di);
607 case BOPAlgo_IncompatibilityOfFace: {
608 // not yet implemented
611 case BOPAlgo_OperationAborted: {
612 if(!aSS1.IsNull()) S1_OpAb++;
613 if(!aSS2.IsNull()) S2_OpAb++;
616 case BOPAlgo_CheckUnknown:
618 hasUnknown = Standard_True;
624 Standard_Integer FS1 = S1_SelfInt + S1_SmalE + S1_BadF + S1_BadV + S1_BadE + S1_OpAb;
625 FS1 += (S1_BadType != 0) ? 1 : 0;
626 Standard_Integer FS2 = S2_SelfInt + S2_SmalE + S2_BadF + S2_BadV + S2_BadE + S2_OpAb;
627 FS2 += (S2_BadType != 0) ? 1 : 0;
629 // output for first shape
630 di << "Faulties for FIRST shape found : " << FS1 << "\n";
632 di << "---------------------------------" << "\n";
633 Standard_CString CString1;
638 di << "Shapes are not suppotrted by BOP: " << CString1 << "\n";
639 Standard_CString CString2;
644 di << "Self-Intersections : " << CString2;
646 di << " Cases(" << S1_SelfInt << ") Total shapes(" << S1_SelfIntAll << ")" << "\n";
649 Standard_CString CString13;
654 di << "Check for SI has been aborted : " << CString13 << "\n";
655 Standard_CString CString3;
660 di << "Too small edges : " << CString3;
662 di << " Cases(" << S1_SmalE << ") Total shapes(" << S1_SmalEAll << ")" << "\n";
665 Standard_CString CString4;
670 di << "Bad faces : " << CString4;
672 di << " Cases(" << S1_BadF << ") Total shapes(" << S1_BadFAll << ")" << "\n";
675 Standard_CString CString5;
680 di << "Too close vertices : " << CString5;
682 di << " Cases(" << S1_BadV << ") Total shapes(" << S1_BadVAll << ")" << "\n";
685 Standard_CString CString6;
690 di << "Too close edges : " << CString6;
692 di << " Cases(" << S1_BadE << ") Total shapes(" << S1_BadEAll << ")" << "\n";
697 // output for second shape
699 di << "Faulties for SECOND shape found : " << FS2 << "\n";
701 di << "---------------------------------" << "\n";
702 Standard_CString CString7;
707 di << "Shapes are not suppotrted by BOP: " << CString7 << "\n";
708 Standard_CString CString8;
713 di << "Self-Intersections : " << CString8;
715 di << " Cases(" << S2_SelfInt << ") Total shapes(" << S2_SelfIntAll << ")" << "\n";
719 Standard_CString CString14;
724 di << "Check for SI has been aborted : " << CString14 << "\n";
725 Standard_CString CString9;
730 di << "Too small edges : " << CString9;
732 di << " Cases(" << S2_SmalE << ") Total shapes(" << S2_SmalEAll << ")" << "\n";
735 Standard_CString CString10;
740 di << "Bad faces : " << CString10;
742 di << " Cases(" << S2_BadF << ") Total shapes(" << S2_BadFAll << ")" << "\n";
745 Standard_CString CString11;
750 di << "Too close vertices : " << CString11;
752 di << " Cases(" << S2_BadV << ") Total shapes(" << S2_BadVAll << ")" << "\n";
755 Standard_CString CString12;
760 di << "Too close edges : " << CString12;
762 di << " Cases(" << S2_BadE << ") Total shapes(" << S2_BadEAll << ")" << "\n";
769 di << "WARNING: The unexpected test break occurs!" << "\n";