1 // Created on: 2004-09-02
2 // Copyright (c) 2004-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <BOPAlgo_ArgumentAnalyzer.hxx>
16 #include <BOPAlgo_BuilderFace.hxx>
17 #include <BOPAlgo_CheckerSI.hxx>
18 #include <BOPAlgo_Operation.hxx>
19 #include <BOPDS_DS.hxx>
20 #include <BOPDS_MapOfPair.hxx>
21 #include <BOPTools_AlgoTools.hxx>
22 #include <BOPTools_AlgoTools3D.hxx>
23 #include <BRep_Builder.hxx>
24 #include <BRep_TEdge.hxx>
25 #include <BRep_TFace.hxx>
26 #include <BRep_Tool.hxx>
27 #include <BRep_TVertex.hxx>
28 #include <BRepExtrema_DistShapeShape.hxx>
29 #include <Geom_Surface.hxx>
31 #include <IntTools_CommonPrt.hxx>
32 #include <IntTools_Context.hxx>
33 #include <IntTools_EdgeEdge.hxx>
34 #include <IntTools_Range.hxx>
35 #include <Standard_ErrorHandler.hxx>
36 #include <Standard_Failure.hxx>
37 #include <TColStd_Array2OfBoolean.hxx>
39 #include <TopExp_Explorer.hxx>
41 #include <TopoDS_Edge.hxx>
42 #include <TopoDS_Shape.hxx>
43 #include <TopoDS_Shell.hxx>
44 #include <TopoDS_Solid.hxx>
45 #include <TopoDS_Vertex.hxx>
46 #include <TopoDS_Wire.hxx>
47 #include <TopTools_IndexedMapOfShape.hxx>
48 #include <TopTools_ListOfShape.hxx>
49 #include <TopTools_MapOfShape.hxx>
50 #include <TopTools_SequenceOfShape.hxx>
52 // ================================================================================
53 // function: Constructor
55 // ================================================================================
56 BOPAlgo_ArgumentAnalyzer::BOPAlgo_ArgumentAnalyzer() :
58 myStopOnFirst(Standard_False),
59 myOperation(BOPAlgo_UNKNOWN),
60 myArgumentTypeMode(Standard_False),
61 mySelfInterMode(Standard_False),
62 mySmallEdgeMode(Standard_False),
63 myRebuildFaceMode(Standard_False),
64 myTangentMode(Standard_False),
65 myMergeVertexMode(Standard_False),
66 myMergeEdgeMode(Standard_False),
67 myContinuityMode(Standard_False),
68 myCurveOnSurfaceMode(Standard_False),
69 myEmpty1(Standard_False),
70 myEmpty2(Standard_False)
73 //=======================================================================
76 //=======================================================================
77 BOPAlgo_ArgumentAnalyzer::~BOPAlgo_ArgumentAnalyzer()
82 // ================================================================================
83 // function: SetShape1
85 // ================================================================================
86 void BOPAlgo_ArgumentAnalyzer::SetShape1(const TopoDS_Shape & TheShape)
91 // ================================================================================
92 // function: SetShape2
94 // ================================================================================
95 void BOPAlgo_ArgumentAnalyzer::SetShape2(const TopoDS_Shape & TheShape)
100 // ================================================================================
101 // function: GetShape1
103 // ================================================================================
104 const TopoDS_Shape & BOPAlgo_ArgumentAnalyzer::GetShape1() const
109 // ================================================================================
110 // function: GetShape2
112 // ================================================================================
113 const TopoDS_Shape & BOPAlgo_ArgumentAnalyzer::GetShape2() const
118 // ================================================================================
119 // function: OperationType
121 // ================================================================================
122 BOPAlgo_Operation& BOPAlgo_ArgumentAnalyzer::OperationType()
127 // ================================================================================
128 // function: StopOnFirstFaulty
130 // ================================================================================
131 Standard_Boolean & BOPAlgo_ArgumentAnalyzer::StopOnFirstFaulty()
133 return myStopOnFirst;
136 // ================================================================================
139 // ================================================================================
140 void BOPAlgo_ArgumentAnalyzer::Prepare()
142 Standard_Boolean isS1 = myShape1.IsNull(), isS2 = myShape2.IsNull();
144 myEmpty1 = BOPTools_AlgoTools3D::IsEmptyShape(myShape1);
147 myEmpty2 = BOPTools_AlgoTools3D::IsEmptyShape(myShape2);
150 // ================================================================================
153 // ================================================================================
154 void BOPAlgo_ArgumentAnalyzer::Perform()
168 if(myArgumentTypeMode) {
174 // 3. Test self-interference
175 if(mySelfInterMode) {
176 TestSelfInterferences();
181 // 4. Test small edges
182 if(mySmallEdgeMode) {
183 if(!(!myResult.IsEmpty() && myStopOnFirst))
189 // 5. Test possibility to rebuild faces
190 if(myRebuildFaceMode) {
191 if(!(!myResult.IsEmpty() && myStopOnFirst))
199 if(!(!myResult.IsEmpty() && myStopOnFirst))
205 // 7. Test merge vertices
206 if(myMergeVertexMode) {
207 if(!(!myResult.IsEmpty() && myStopOnFirst))
213 // 8. Test merge edges
214 if(myMergeEdgeMode) {
215 if(!(!myResult.IsEmpty() && myStopOnFirst))
221 // 9. Test shapes continuity
222 if(myContinuityMode) {
223 if(!(!myResult.IsEmpty() && myStopOnFirst))
229 // 10. Test validity of the curves on the surfaces
230 if(myCurveOnSurfaceMode) {
231 if(!(!myResult.IsEmpty() && myStopOnFirst))
232 TestCurveOnSurface();
235 catch(Standard_Failure const&) {
236 BOPAlgo_CheckResult aResult;
237 aResult.SetCheckStatus(BOPAlgo_CheckUnknown);
238 myResult.Append(aResult);
242 // ================================================================================
243 // function: HasFaulty
245 // ================================================================================
246 Standard_Boolean BOPAlgo_ArgumentAnalyzer::HasFaulty() const
248 return ( !myResult.IsEmpty());
251 // ================================================================================
252 // function: GetCheckResult
254 // ================================================================================
255 const BOPAlgo_ListOfCheckResult& BOPAlgo_ArgumentAnalyzer::GetCheckResult() const
260 // ================================================================================
261 // function: TestTypes
263 // ================================================================================
264 void BOPAlgo_ArgumentAnalyzer::TestTypes()
266 Standard_Boolean isS1 = myShape1.IsNull(), isS2 = myShape2.IsNull();
269 BOPAlgo_CheckResult aResult;
270 aResult.SetCheckStatus(BOPAlgo_BadType);
271 myResult.Append(aResult);
276 if((isS1 && !isS2) || (!isS1 && isS2)) {
277 Standard_Boolean bIsEmpty = (isS1) ? myEmpty2 : myEmpty1;
279 if(bIsEmpty || myOperation!=BOPAlgo_UNKNOWN) {
280 const TopoDS_Shape & aS = (isS1) ? myShape2 : myShape1;
281 BOPAlgo_CheckResult aResult;
282 aResult.SetShape1(aS);
283 aResult.SetCheckStatus(BOPAlgo_BadType);
284 myResult.Append(aResult);
288 // two shapes check (begin)
290 if(myEmpty1 || myEmpty2) {
291 BOPAlgo_CheckResult aResult;
292 if(myEmpty1 && myEmpty2) {
293 aResult.SetShape1(myShape1);
294 aResult.SetShape2(myShape2);
297 const TopoDS_Shape & aS = myEmpty1 ? myShape1 : myShape2;
299 aResult.SetShape1(aS);
301 aResult.SetShape2(aS);
303 aResult.SetCheckStatus(BOPAlgo_BadType);
304 myResult.Append(aResult);
308 Standard_Integer aDim1, aDim2;
309 Standard_Boolean bBadTypes = Standard_False;
311 aDim1 = BOPTools_AlgoTools::Dimension(myShape1);
312 aDim2 = BOPTools_AlgoTools::Dimension(myShape2);
314 if (myOperation == BOPAlgo_FUSE ||
315 myOperation == BOPAlgo_CUT21) {
316 bBadTypes = Standard_True;
319 else if (aDim1 > aDim2) {
320 if (myOperation == BOPAlgo_FUSE ||
321 myOperation == BOPAlgo_CUT) {
322 bBadTypes = Standard_True;
326 BOPAlgo_CheckResult aResult;
327 aResult.SetShape1(myShape1);
328 aResult.SetShape2(myShape2);
329 aResult.SetCheckStatus(BOPAlgo_BadType);
330 myResult.Append(aResult);
334 //=======================================================================
335 //function : TestSelfInterferences
337 //=======================================================================
338 void BOPAlgo_ArgumentAnalyzer::TestSelfInterferences()
342 for(ii = 0; ii < 2; ii++) {
343 const TopoDS_Shape& aS = (ii == 0) ? myShape1 : myShape2;
348 Standard_Boolean bIsEmpty = (ii == 0) ? myEmpty1 : myEmpty2;
353 Standard_Integer n1, n2;
354 BOPDS_MapIteratorOfMapOfPair aItMPK;
355 TopTools_ListOfShape anArgs;
356 BOPAlgo_CheckerSI aChecker;
359 aChecker.SetArguments(anArgs);
360 aChecker.SetNonDestructive(Standard_True);
361 aChecker.SetRunParallel(myRunParallel);
362 aChecker.SetFuzzyValue(myFuzzyValue);
363 aChecker.SetProgressIndicator(myProgressIndicator);
366 Standard_Boolean hasError = aChecker.HasErrors();
368 const BOPDS_DS& aDS=*(aChecker.PDS());
369 const BOPDS_MapOfPair& aMPK=aDS.Interferences();
371 aItMPK.Initialize(aMPK);
372 for (; aItMPK.More(); aItMPK.Next()) {
373 const BOPDS_Pair& aPK=aItMPK.Value();
375 if(aDS.IsNewShape(n1) || aDS.IsNewShape(n2)) {
379 const TopoDS_Shape& aS1=aDS.Shape(n1);
380 const TopoDS_Shape& aS2=aDS.Shape(n2);
382 BOPAlgo_CheckResult aResult;
384 aResult.SetShape1(myShape1);
385 aResult.AddFaultyShape1(aS1);
386 if (!aS1.IsSame(aS2))
387 aResult.AddFaultyShape1(aS2);
390 aResult.SetShape2(myShape2);
391 aResult.AddFaultyShape2(aS1);
392 if (!aS1.IsSame(aS2))
393 aResult.AddFaultyShape2(aS2);
395 aResult.SetCheckStatus(BOPAlgo_SelfIntersect);
396 myResult.Append(aResult);
400 BOPAlgo_CheckResult aResult;
402 aResult.SetShape1(myShape1);
403 aResult.AddFaultyShape1(myShape1);
406 aResult.SetShape2(myShape2);
407 aResult.AddFaultyShape2(myShape2);
409 aResult.SetCheckStatus(BOPAlgo_OperationAborted);
410 myResult.Append(aResult);
412 }// for(ii = 0; ii < 2; ii++) {
414 // ================================================================================
415 // function: TestSmallEdge
417 // ================================================================================
418 void BOPAlgo_ArgumentAnalyzer::TestSmallEdge()
420 Standard_Integer i = 0;
421 BRepExtrema_DistShapeShape aDist;
422 Handle(IntTools_Context) aCtx;
424 aCtx = new IntTools_Context;
426 for(i = 0; i < 2; i++) {
427 const TopoDS_Shape& aS = (i == 0) ? myShape1 : myShape2;
432 TopExp_Explorer anExp(aS, TopAbs_EDGE);
434 for(; anExp.More(); anExp.Next()) {
435 const TopoDS_Edge& anEdge = *(TopoDS_Edge*)&anExp.Current();
436 if (BRep_Tool::Degenerated(anEdge)) {
440 if(BOPTools_AlgoTools::IsMicroEdge(anEdge, aCtx)) {
441 Standard_Boolean bKeepResult = Standard_True;
443 if(myOperation == BOPAlgo_SECTION) {
444 const TopoDS_Shape& anOtherS = (i == 0) ? myShape2 : myShape1;
446 if(!anOtherS.IsNull()) {
447 aDist.LoadS2(anOtherS);
449 Standard_Boolean bVertexIsOnShape = Standard_False;
450 Standard_Integer ii = 0;
451 TopExp_Explorer anExpV(anEdge, TopAbs_VERTEX);
453 for(; anExpV.More(); anExpV.Next()) {
454 const TopoDS_Shape& aV = anExpV.Current();
461 for(ii = 1; ii <= aDist.NbSolution(); ii++) {
462 Standard_Real aTolerance = BRep_Tool::Tolerance(*(TopoDS_Vertex*)&aV);
463 const TopoDS_Shape& aSupportShape = aDist.SupportOnShape2(ii);
465 switch(aSupportShape.ShapeType()) {
466 case TopAbs_VERTEX: {
467 aTolerance += BRep_Tool::Tolerance(*(TopoDS_Vertex*)&(aSupportShape));
471 aTolerance += BRep_Tool::Tolerance(*(TopoDS_Edge*)&(aSupportShape));
475 aTolerance += BRep_Tool::Tolerance(*(TopoDS_Face*)&(aSupportShape));
482 if(aDist.Value() < aTolerance) {
483 bVertexIsOnShape = Standard_True;
490 if(!bVertexIsOnShape) {
491 bKeepResult = Standard_False;
497 BOPAlgo_CheckResult aResult;
500 aResult.SetShape1(myShape1);
501 aResult.AddFaultyShape1(anEdge);
504 aResult.SetShape2(myShape2);
505 aResult.AddFaultyShape2(anEdge);
508 aResult.SetCheckStatus(BOPAlgo_TooSmallEdge);
509 myResult.Append(aResult);
519 // ================================================================================
520 // function: TestRebuildFace
522 // ================================================================================
523 void BOPAlgo_ArgumentAnalyzer::TestRebuildFace()
525 if((myOperation == BOPAlgo_SECTION) ||
526 (myOperation == BOPAlgo_UNKNOWN))
528 Standard_Integer i = 0;
530 for(i = 0; i < 2; i++) {
531 const TopoDS_Shape& aS = (i == 0) ? myShape1 : myShape2;
536 TopExp_Explorer anExp(aS, TopAbs_FACE);
537 TopTools_ListOfShape aLS;
539 for(; anExp.More(); anExp.Next()) {
540 const TopoDS_Face& aFace = *(TopoDS_Face*)&(anExp.Current());
542 TopoDS_Face aFF = aFace;
543 aFF.Orientation(TopAbs_FORWARD);
544 TopExp_Explorer anExpE(aFF, TopAbs_EDGE);
545 Standard_Integer nbstartedges = 0;
548 for(; anExpE.More(); anExpE.Next()) {
549 const TopoDS_Edge& aE=(*(TopoDS_Edge*)(&anExpE.Current()));
550 TopAbs_Orientation anOriE=aE.Orientation();
552 if (anOriE==TopAbs_INTERNAL) {
554 aEE.Orientation(TopAbs_FORWARD);
556 aEE.Orientation(TopAbs_REVERSED);
564 BOPAlgo_BuilderFace aBF;
568 const TopTools_ListOfShape& aLF = aBF.Areas();
569 Standard_Boolean bBadFace = Standard_False;
571 if(aLF.Extent() != 1) {
572 bBadFace = Standard_True;
575 Standard_Integer nbedgeused = 0;
576 anExpE.Init(aLF.First(), TopAbs_EDGE);
578 for(; anExpE.More(); anExpE.Next(), nbedgeused++);
580 if(nbstartedges != nbedgeused) {
581 bBadFace = Standard_True;
586 BOPAlgo_CheckResult aResult;
589 aResult.SetShape1(myShape1);
590 aResult.AddFaultyShape1(aFace);
593 aResult.SetShape2(myShape2);
594 aResult.AddFaultyShape2(aFace);
597 aResult.SetCheckStatus(BOPAlgo_NonRecoverableFace);
598 myResult.Append(aResult);
608 // ================================================================================
609 // function: TestTangent
611 // ================================================================================
612 void BOPAlgo_ArgumentAnalyzer::TestTangent()
617 // ================================================================================
618 // function: TestMergeSubShapes
620 // ================================================================================
621 void BOPAlgo_ArgumentAnalyzer::TestMergeSubShapes(const TopAbs_ShapeEnum theType)
623 if(myShape1.IsNull() || myShape2.IsNull())
626 if (myEmpty1 || myEmpty2)
629 BOPAlgo_CheckStatus aStatus = BOPAlgo_CheckUnknown;
632 case TopAbs_VERTEX: {
633 aStatus = BOPAlgo_IncompatibilityOfVertex;
637 aStatus = BOPAlgo_IncompatibilityOfEdge;
641 aStatus = BOPAlgo_IncompatibilityOfFace;
647 TopExp_Explorer anExp1(myShape1, theType);
648 TopExp_Explorer anExp2(myShape2, theType);
649 TopTools_SequenceOfShape aSeq1, aSeq2;
650 TopTools_MapOfShape aMap1, aMap2;
652 for(; anExp1.More(); anExp1.Next()) {
653 const TopoDS_Shape& aS1 = anExp1.Current();
655 if(aMap1.Contains(aS1))
661 for(; anExp2.More(); anExp2.Next()) {
662 const TopoDS_Shape& aS2 = anExp2.Current();
663 if(aMap2.Contains(aS2))
669 TColStd_Array2OfBoolean anArrayOfFlag(1, aSeq1.Length(), 1, aSeq2.Length());
670 Standard_Integer i = 0, j = 0;
671 for(i = 1; i <= aSeq1.Length(); i++)
672 for(j = 1; j <= aSeq2.Length(); j++)
673 anArrayOfFlag.SetValue(i, j, Standard_False);
675 for(i = 1; i <= aSeq1.Length(); i++) {
676 const TopoDS_Shape& aS1 = aSeq1.Value(i);
677 TopTools_ListOfShape aListOfS2;
678 Standard_Integer nbs = 0;
680 for(j = 1; j <= aSeq2.Length(); j++) {
681 const TopoDS_Shape& aS2 = aSeq2.Value(j);
682 Standard_Boolean bIsEqual = Standard_False;
684 if(theType == TopAbs_VERTEX) {
686 const TopoDS_Vertex& aV1 = *(TopoDS_Vertex*)&(aS1);
687 const TopoDS_Vertex& aV2 = *(TopoDS_Vertex*)&(aS2);
688 gp_Pnt aP1 = BRep_Tool::Pnt(aV1);
689 gp_Pnt aP2 = BRep_Tool::Pnt(aV2);
690 Standard_Real aDist = aP1.Distance(aP2);
692 if(aDist <= (BRep_Tool::Tolerance(aV1) + BRep_Tool::Tolerance(aV2))) {
693 bIsEqual = Standard_True;
696 else if(theType == TopAbs_EDGE) {
697 const TopoDS_Edge& aE1 = *(TopoDS_Edge*)&(aS1);
698 const TopoDS_Edge& aE2 = *(TopoDS_Edge*)&(aS2);
700 IntTools_EdgeEdge aEE(aE1, aE2);
704 const IntTools_SequenceOfCommonPrts& aCPrts = aEE.CommonParts();
705 Standard_Integer ii = 0;
707 for (ii = 1; ii <= aCPrts.Length(); ii++) {
708 const IntTools_CommonPrt& aCPart = aCPrts(ii);
710 if (aCPart.Type() == TopAbs_EDGE) {
711 bIsEqual = Standard_True;
716 else if(theType == TopAbs_FACE) {
717 // not yet implemented!
721 anArrayOfFlag.SetValue(i, j, Standard_True );
722 aListOfS2.Append(aS2);
728 BOPAlgo_CheckResult aResult;
730 aResult.SetShape1(myShape1);
731 aResult.SetShape2(myShape2);
732 aResult.AddFaultyShape1(aS1);
733 TopTools_ListIteratorOfListOfShape anIt(aListOfS2);
735 for(; anIt.More(); anIt.Next()) {
736 aResult.AddFaultyShape2(anIt.Value());
739 aResult.SetCheckStatus(aStatus);
740 myResult.Append(aResult);
748 for(i = 1; i <= aSeq2.Length(); i++) {
749 const TopoDS_Shape& aS2 = aSeq2.Value(i);
750 TopTools_ListOfShape aListOfS1;
751 Standard_Integer nbs = 0;
753 for(j = 1; j <= aSeq1.Length(); j++) {
754 const TopoDS_Shape& aS1 = aSeq1.Value(j);
756 if(anArrayOfFlag.Value(j, i)) {
757 aListOfS1.Append(aS1);
763 BOPAlgo_CheckResult aResult;
765 aResult.SetShape1(myShape1);
766 aResult.SetShape2(myShape2);
767 TopTools_ListIteratorOfListOfShape anIt(aListOfS1);
769 for(; anIt.More(); anIt.Next()) {
770 aResult.AddFaultyShape1(anIt.Value());
772 aResult.AddFaultyShape2(aS2);
774 aResult.SetCheckStatus(aStatus);
775 myResult.Append(aResult);
784 // ================================================================================
785 // function: TestMergeVertex
787 // ================================================================================
788 void BOPAlgo_ArgumentAnalyzer::TestMergeVertex()
790 TestMergeSubShapes(TopAbs_VERTEX);
793 // ================================================================================
794 // function: TestMergeEdge
796 // ================================================================================
797 void BOPAlgo_ArgumentAnalyzer::TestMergeEdge()
799 TestMergeSubShapes(TopAbs_EDGE);
802 // ================================================================================
803 // function: TestContinuity
805 // ================================================================================
806 void BOPAlgo_ArgumentAnalyzer::TestContinuity()
808 Standard_Integer i, j, aNbS;
810 TopExp_Explorer aExp;
812 for (i = 0; i < 2; ++i) {
813 const TopoDS_Shape& aS = !i ? myShape1 : myShape2;
818 TopTools_IndexedMapOfShape aMS;
820 aExp.Init(aS, TopAbs_EDGE);
821 for (; aExp.More(); aExp.Next()) {
822 const TopoDS_Edge& aE = *(TopoDS_Edge*)&aExp.Current();
823 if (BRep_Tool::Degenerated(aE)) {
826 const Handle(Geom_Curve)& aC = BRep_Tool::Curve(aE, f, l);
827 if (aC->Continuity() == GeomAbs_C0) {
832 aExp.Init(aS, TopAbs_FACE);
833 for (; aExp.More(); aExp.Next()) {
834 const TopoDS_Face& aF = *(TopoDS_Face*)&aExp.Current();
835 Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aF);
836 if (aSurf->Continuity() == GeomAbs_C0) {
841 //add shapes with continuity C0 to result
843 for (j = 1; j <= aNbS; ++j) {
844 const TopoDS_Shape& aFS = aMS(j);
845 BOPAlgo_CheckResult aResult;
847 aResult.SetShape1(myShape1);
848 aResult.AddFaultyShape1(aFS);
850 aResult.SetShape2(myShape2);
851 aResult.AddFaultyShape2(aFS);
853 aResult.SetCheckStatus(BOPAlgo_GeomAbs_C0);
854 myResult.Append(aResult);
859 // ================================================================================
860 // function: TestCurveOnSurface
862 // ================================================================================
863 void BOPAlgo_ArgumentAnalyzer::TestCurveOnSurface()
866 Standard_Real aT, aD, aTolE;
867 TopExp_Explorer aExpF, aExpE;
869 for(i = 0; i < 2; i++) {
870 const TopoDS_Shape& aS = (i == 0) ? myShape1 : myShape2;
875 aExpF.Init(aS, TopAbs_FACE);
876 for (; aExpF.More(); aExpF.Next()) {
877 const TopoDS_Face& aF = *(TopoDS_Face*)&aExpF.Current();
879 aExpE.Init(aF, TopAbs_EDGE);
880 for (; aExpE.More(); aExpE.Next()) {
881 const TopoDS_Edge& aE = *(TopoDS_Edge*)&aExpE.Current();
883 if (BOPTools_AlgoTools::ComputeTolerance(aF, aE, aD, aT)) {
884 aTolE = BRep_Tool::Tolerance(aE);
886 BOPAlgo_CheckResult aResult;
887 aResult.SetCheckStatus(BOPAlgo_InvalidCurveOnSurface);
889 aResult.SetShape1(myShape1);
890 aResult.AddFaultyShape1(aE);
891 aResult.AddFaultyShape1(aF);
892 aResult.SetMaxDistance1(aD);
893 aResult.SetMaxParameter1(aT);
896 aResult.SetShape2(myShape2);
897 aResult.AddFaultyShape2(aE);
898 aResult.AddFaultyShape2(aF);
899 aResult.SetMaxDistance2(aD);
900 aResult.SetMaxParameter2(aT);
902 myResult.Append(aResult);