]> OCCT Git - occt.git/commitdiff
fixed part of the regressions
authorink <ink@opencascade.com>
Mon, 23 Mar 2015 06:41:37 +0000 (09:41 +0300)
committeraln <alukin@opencascade.com>
Sat, 16 Apr 2022 09:59:09 +0000 (12:59 +0300)
src/ShapeFix/ShapeFix_IntersectionTool.cxx

index e5f268724a2288b8939df29d454bb5b7fae6742f..385846e3bf219c7f0c5bf1032774861e3d45166d 100644 (file)
@@ -987,24 +987,84 @@ Standard_Boolean ShapeFix_IntersectionTool::FixSelfIntersectWire
                 break;
               }
             }
-            if( !ModifE1 && !ModifE2 ) {
+            if( ModifE1 == ModifE2 ) {
               gp_Pnt P0( (pi1.X()+pi2.X())/2, (pi1.Y()+pi2.Y())/2, (pi1.Z()+pi2.Z())/2 );
               tolV = Max( (pi1.Distance(pi2)/2)*1.00001, Precision::Confusion() );
               B.MakeVertex(V,P0,tolV);
               MaxTolVert = Max(MaxTolVert,tolV);
-              Standard_Boolean isEdgeSplit2 = SplitEdge1(sewd, face, num2, param2,
-                                                         V, tolV, boxes);
-              if(isEdgeSplit2) {
-                NbSplit++;
-                num2--;
+              if( !ModifE1 && !ModifE2 ) {
+                Standard_Boolean isEdgeSplit2 = SplitEdge1(sewd, face, num2, param2,
+                  V, tolV, boxes);
+                if(isEdgeSplit2) {
+                  NbSplit++;
+                  num2--;
+                }
+                if(SplitEdge1(sewd, face, num1, param1, V, tolV, boxes)) {
+                  NbSplit++;
+                  num1--;
+                  break;
+                }
+                if(isEdgeSplit2)
+                  continue;
               }
-              if(SplitEdge1(sewd, face, num1, param1, V, tolV, boxes)) {
-                NbSplit++;
-                num1--;
-                break;
+              else if (PVF1.Distance(PVF2) < MaxTolVert || PVF1.Distance(PVL2) < MaxTolVert ||
+                PVL1.Distance(PVF2) < MaxTolVert || PVL1.Distance(PVL2) < MaxTolVert)
+              {
+                ShapeBuild_Edge sbe;
+                ShapeAnalysis_Edge sae;
+                Standard_Real dist1 = pi1.Distance(PVF1);
+                Standard_Real dist2 = pi1.Distance(PVL1);
+                TopoDS_Edge NewE1, NewAjE1, edgeAj1;
+                Standard_Integer n;
+                if(dist1 < dist2)
+                {
+                  NewE1 = sbe.CopyReplaceVertices(edge1,V,VL1);
+                  n = num1 - 1;
+                  edgeAj1 = sewd->Edge(n);
+                  NewAjE1 = sbe.CopyReplaceVertices(edgeAj1,sae.FirstVertex(edgeAj1),V);
+                }
+                else
+                {
+                  NewE1 = sbe.CopyReplaceVertices(edge1,VF1,V);
+                  n = num1 + 1;
+                  edgeAj1 = sewd->Edge(n);
+                  NewAjE1 = sbe.CopyReplaceVertices(edgeAj1,V,sae.LastVertex(edgeAj1));
+                }
+                myContext->Replace(edge1,NewE1);
+                myContext->Replace(edgeAj1,NewAjE1);
+                sewd->Set(NewE1,num1);
+                sewd->Set(NewAjE1,n);
+                boxes.Bind(NewE1,B1);
+                Bnd_Box2d BAj1 = boxes.Find(edgeAj1);
+                boxes.Bind(NewAjE1,BAj1);
+                edge1 = NewE1;
+
+                dist1 = pi2.Distance(PVF2);
+                dist2 = pi2.Distance(PVL2);
+                TopoDS_Edge NewE2, NewAjE2, edgeAj2;
+                if(dist1 < dist2)
+                {
+                  NewE2 = sbe.CopyReplaceVertices(edge2,V,VL2);
+                  n = num2 - 1;
+                  edgeAj2 = sewd->Edge(n);
+                  NewAjE2 = sbe.CopyReplaceVertices(edgeAj2,sae.FirstVertex(edgeAj2),V);
+                }
+                else
+                {
+                  NewE2 = sbe.CopyReplaceVertices(edge2,VF2,V);
+                  n = (num2 + 1 > sewd->NbEdges())?(num2 + 1 - sewd->NbEdges()):(num2 + 1);
+                  edgeAj2 = sewd->Edge(n);
+                  NewAjE2 = sbe.CopyReplaceVertices(edgeAj2,V,sae.LastVertex(edgeAj2));
+                }
+                myContext->Replace(edge2,NewE2);
+                myContext->Replace(edgeAj2,NewAjE2);
+                sewd->Set(NewE2,num2);
+                sewd->Set(NewAjE2,n);
+                boxes.Bind(NewE2,B2);
+                Bnd_Box2d BAj2 = boxes.Find(edgeAj2);
+                boxes.Bind(NewAjE2,BAj2);
+                edge2 = NewE2;
               }
-              if(isEdgeSplit2)
-                continue;
             }
           }
           if( Tr1.PositionOnCurve() == IntRes2d_Middle &&
@@ -1321,6 +1381,29 @@ Standard_Boolean ShapeFix_IntersectionTool::FixSelfIntersectWire
                 if(P01.Distance(PV12)<tolV1) {
                   tolV1 += P01.Distance(PV12);
                   B.UpdateVertex(NewV1,tolV1);
+                  TopoDS_Edge NewE = sbe.CopyReplaceVertices(edge2,NewV1,V22);
+                  myContext->Replace(edge2,NewE);
+                  sewd->Set(NewE,num2+dnum1);
+                  boxes.Bind(NewE,B2); // update boxes
+                  edge2 = NewE;
+                  TopoDS_Edge eprev = sewd->Edge(num2+dnum1-1);                  
+                  if (sae.LastVertex(eprev).IsSame(V12))
+                  {
+                    TopoDS_Vertex VLprev = sae.LastVertex(eprev);
+                    TopoDS_Edge NewEprev = 
+                      sbe.CopyReplaceVertices(eprev,sae.FirstVertex(eprev),NewV1);
+                    myContext->Replace(eprev,NewEprev);
+                    sewd->Set(NewEprev,num2+dnum1-1);
+                    Bnd_Box2d Bprev = boxes.Find(eprev);
+                    boxes.Bind(NewEprev,Bprev); // update boxes
+
+                    if(VLprev.Orientation()==NewV1.Orientation()) {
+                      myContext->Replace(VLprev,NewV1);
+                    }
+                    else {
+                      myContext->Replace(VLprev,NewV1.Reversed());
+                    }
+                  }
                   if(V12.Orientation()==NewV1.Orientation()) {
                     myContext->Replace(V12,NewV1);
                     V12 = NewV1;
@@ -1330,16 +1413,36 @@ Standard_Boolean ShapeFix_IntersectionTool::FixSelfIntersectWire
                     V12 = TopoDS::Vertex(NewV1.Reversed());
                   }
                   nbReplaced++; //gka 06.09.04
-                  TopoDS_Edge NewE = sbe.CopyReplaceVertices(edge2,NewV1,V22);
-                  myContext->Replace(edge2,NewE);
-                  sewd->Set(NewE,num2+dnum1);
-                  boxes.Bind(NewE,B2); // update boxes
-                  edge2 = NewE;
                   akey1 = 1;
                 }
-                if(P01.Distance(PV22)<tolV1) {
+                if(P01.Distance(PV22)<tolV1) { 
                   tolV1 += P01.Distance(PV22);
                   B.UpdateVertex(NewV1,tolV1);
+                  TopoDS_Edge NewE = sbe.CopyReplaceVertices(edge2,V12,NewV1);
+                  myContext->Replace(edge2,NewE);
+                  sewd->Set(NewE,num2+dnum1);
+                  boxes.Bind(NewE,B2); // update boxes
+                  edge2 = NewE;
+                  Standard_Integer n = 
+                    (num2+dnum1+1 > sewd->NbEdges())?(num2+dnum1+1 - sewd->NbEdges()):(num2+dnum1+1);
+                  TopoDS_Edge enext = sewd->Edge(n);
+                  if (sae.FirstVertex(enext).IsSame(V22))
+                  {
+                    TopoDS_Vertex VFnext = sae.FirstVertex(enext);
+                    TopoDS_Edge NewEnext = 
+                      sbe.CopyReplaceVertices(enext,NewV1,sae.LastVertex(enext));
+                    myContext->Replace(enext,NewEnext);
+                    sewd->Set(NewEnext,n);
+                    Bnd_Box2d Bnext = boxes.Find(enext);
+                    boxes.Bind(NewEnext,Bnext); // update boxes
+
+                    if(VFnext.Orientation()==NewV1.Orientation()) {
+                      myContext->Replace(VFnext,NewV1);
+                    }
+                    else {
+                      myContext->Replace(VFnext,NewV1.Reversed());
+                    }
+                  }
                   if(V22.Orientation()==NewV1.Orientation()) {
                     myContext->Replace(V22,NewV1);
                     V22 = NewV1;
@@ -1349,16 +1452,34 @@ Standard_Boolean ShapeFix_IntersectionTool::FixSelfIntersectWire
                     V22 = TopoDS::Vertex(NewV1.Reversed());
                   }
                   nbReplaced++; //gka 06.09.04
-                  TopoDS_Edge NewE = sbe.CopyReplaceVertices(edge2,V12,NewV1);
-                  myContext->Replace(edge2,NewE);
-                  sewd->Set(NewE,num2+dnum1);
-                  boxes.Bind(NewE,B2); // update boxes
-                  edge2 = NewE;
                   akey1 = 2;
                 }
                 if(P02.Distance(PV12)<tolV2) {
                   tolV2 += P02.Distance(PV12);
                   B.UpdateVertex(NewV2,tolV2);
+                  TopoDS_Edge NewE = sbe.CopyReplaceVertices(edge2,NewV2,V22);
+                  myContext->Replace(edge2,NewE);
+                  sewd->Set(NewE,num2+dnum1);
+                  boxes.Bind(NewE,B2); // update boxes
+                  edge2 = NewE;
+                  TopoDS_Edge eprev = sewd->Edge(num2+dnum1-1);                  
+                  if (sae.LastVertex(eprev).IsSame(V12))
+                  {
+                    TopoDS_Vertex VLprev = sae.LastVertex(eprev);
+                    TopoDS_Edge NewEprev = 
+                      sbe.CopyReplaceVertices(eprev,sae.FirstVertex(eprev),NewV2);
+                    myContext->Replace(eprev,NewEprev);
+                    sewd->Set(NewEprev,num2+dnum1-1);
+                    Bnd_Box2d Bprev = boxes.Find(eprev);
+                    boxes.Bind(NewEprev,Bprev); // update boxes
+
+                    if(VLprev.Orientation()==NewV2.Orientation()) {
+                      myContext->Replace(VLprev,NewV2);
+                    }
+                    else {
+                      myContext->Replace(VLprev,NewV2.Reversed());
+                    }
+                  }
                   if(V12.Orientation()==NewV2.Orientation()) {
                     myContext->Replace(V12,NewV2);
                     V12 = NewV2;
@@ -1368,16 +1489,36 @@ Standard_Boolean ShapeFix_IntersectionTool::FixSelfIntersectWire
                     V12 = TopoDS::Vertex(NewV2.Reversed());
                   }
                   nbReplaced++; //gka 06.09.04
-                  TopoDS_Edge NewE = sbe.CopyReplaceVertices(edge2,NewV2,V22);
-                  myContext->Replace(edge2,NewE);
-                  sewd->Set(NewE,num2+dnum1);
-                  boxes.Bind(NewE,B2); // update boxes
-                  edge2 = NewE;
                   akey2 = 1;
                 }
                 if(P02.Distance(PV22)<tolV2) {
                   tolV2 += P02.Distance(PV22);
                   B.UpdateVertex(NewV2,tolV2);
+                  TopoDS_Edge NewE = sbe.CopyReplaceVertices(edge2,V12,NewV2);
+                  myContext->Replace(edge2,NewE);
+                  sewd->Set(NewE,num2+dnum1);
+                  boxes.Bind(NewE,B2); // update boxes
+                  edge2 = NewE;
+                  Standard_Integer n = 
+                    (num2+dnum1+1 > sewd->NbEdges())?(num2+dnum1+1 - sewd->NbEdges()):(num2+dnum1+1);
+                  TopoDS_Edge enext = sewd->Edge(n); 
+                  if (sae.FirstVertex(enext).IsSame(V22))
+                  {
+                    TopoDS_Vertex VFnext = sae.FirstVertex(enext);
+                    TopoDS_Edge NewEnext = 
+                      sbe.CopyReplaceVertices(enext,NewV2,sae.LastVertex(enext));
+                    myContext->Replace(enext,NewEnext);
+                    sewd->Set(NewEnext,n);
+                    Bnd_Box2d Bnext = boxes.Find(enext);
+                    boxes.Bind(NewEnext,Bnext); // update boxes
+
+                    if(VFnext.Orientation()==NewV2.Orientation()) {
+                      myContext->Replace(VFnext,NewV2);
+                    }
+                    else {
+                      myContext->Replace(VFnext,NewV2.Reversed());
+                    }
+                  }
                   if(V22.Orientation()==NewV2.Orientation()) {
                     myContext->Replace(V22,NewV2);
                     V22 = NewV2;
@@ -1387,11 +1528,6 @@ Standard_Boolean ShapeFix_IntersectionTool::FixSelfIntersectWire
                     V22 = TopoDS::Vertex(NewV2.Reversed());
                   }
                   nbReplaced++; //gka 06.09.04
-                  TopoDS_Edge NewE = sbe.CopyReplaceVertices(edge2,V12,NewV2);
-                  myContext->Replace(edge2,NewE);
-                  sewd->Set(NewE,num2+dnum1);
-                  boxes.Bind(NewE,B2); // update boxes
-                  edge2 = NewE;
                   akey2 = 2;
                 }
                 Standard_Integer dnum2=0, numseg2=num2+dnum1;
@@ -1436,6 +1572,11 @@ Standard_Boolean ShapeFix_IntersectionTool::FixSelfIntersectWire
                     }
                   }
                 }
+                if( akey1>0 || akey2>0 ) {
+                  if( UnionVertexes(sewd, edge1, edge2, num2+dnum1, boxes, B2) )
+                    nbReplaced ++;
+                }
+
                 // remove segment
                 sewd->Remove(numseg2);
                 sewd->Remove(numseg1);