]> OCCT Git - occt-copy.git/commitdiff
fixed part of the regressions CR25654
authorink <ink@opencascade.com>
Mon, 23 Mar 2015 06:41:37 +0000 (09:41 +0300)
committerink <ink@opencascade.com>
Mon, 23 Mar 2015 06:48:00 +0000 (09:48 +0300)
src/ShapeFix/ShapeFix_IntersectionTool.cxx
src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cdl
src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cxx
src/TopoDSToStep/TopoDSToStep_MakeStepFace.cxx
src/TopoDSToStep/TopoDSToStep_MakeStepWire.cdl
src/TopoDSToStep/TopoDSToStep_MakeStepWire.cxx

index 7f366fd5ea0cf7e4359dc12f0381c2419f72e1d9..7d36701639070db12e796e0a1874eb857370451a 100644 (file)
@@ -961,24 +961,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 &&
@@ -1295,6 +1355,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;
@@ -1304,16 +1387,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;
@@ -1323,16 +1426,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;
@@ -1342,16 +1463,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;
@@ -1361,11 +1502,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;
@@ -1410,6 +1546,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);
index 606026be256274ee71bb07cbfc6a92e6dd55600f..666f4d9e2dea467578ce3a383a9b8261163ce064 100644 (file)
@@ -35,13 +35,15 @@ is
     
     Create(E  : Edge from TopoDS;
           T  : in out Tool from TopoDSToStep;
-          FP : FinderProcess from Transfer)
+          FP : FinderProcess from Transfer;
+       isNeedWritePcurve : in out Boolean from Standard)
          returns MakeStepEdge;
     
     Init(me : in out;
         E  : Edge from TopoDS;
         T  : in out Tool from TopoDSToStep;
-         FP : FinderProcess from Transfer);
+         FP : FinderProcess from Transfer;
+         isNeedWritePcurve : in out Boolean from Standard);
 
            
     Value (me) returns TopologicalRepresentationItem from StepShape
index 6bc1d104243855ecb258cb5a2a1b05fee20d5dd2..fdad184f2b64405ac31d5ff7d4af0daae9138127 100644 (file)
@@ -73,10 +73,11 @@ TopoDSToStep_MakeStepEdge::TopoDSToStep_MakeStepEdge()
 TopoDSToStep_MakeStepEdge::TopoDSToStep_MakeStepEdge
 (const TopoDS_Edge& E,
  TopoDSToStep_Tool& T,
- const Handle(Transfer_FinderProcess)& FP)
+ const Handle(Transfer_FinderProcess)& FP,
+ Standard_Boolean& isNeedWritePcurve)
 {
   done = Standard_False;
-  Init(E, T, FP);
+  Init(E, T, FP, isNeedWritePcurve);
 }
 
 // ----------------------------------------------------------------------------
@@ -86,7 +87,8 @@ TopoDSToStep_MakeStepEdge::TopoDSToStep_MakeStepEdge
 
 void TopoDSToStep_MakeStepEdge::Init(const TopoDS_Edge& aEdge, 
                                      TopoDSToStep_Tool& aTool,
-                                     const Handle(Transfer_FinderProcess)& FP)
+                                     const Handle(Transfer_FinderProcess)& FP,
+                                     Standard_Boolean& isNeedWritePcurve )
 {
   // ------------------------------------------------------------------
   // The edge is given with its relative orientation (i.e. in the wire)
@@ -252,7 +254,7 @@ void TopoDSToStep_MakeStepEdge::Init(const TopoDS_Edge& aEdge,
 
   //:abv 25.01.00 CAX-IF TRJ3
   // if PcurveMode is 1 (default), make surface_curve instead of simple 3d curve
-  if ( aTool.PCurveMode() != 0 ) {
+  if ( aTool.PCurveMode() != 0  || isNeedWritePcurve) {
   
     Handle(StepGeom_HArray1OfPcurveOrSurface) aGeom =
       new StepGeom_HArray1OfPcurveOrSurface(1,2);
index a7a210c562bc9a8f24fa4cc8cb3d69e249ca0de4..931a522e4d769435d49f6608b7f94d96abe81b04 100644 (file)
@@ -263,6 +263,7 @@ void TopoDSToStep_MakeStepFace::Init(const TopoDS_Face& aFace,
 
   // Initialize the Wire Explorer with the forward face
 
+  Standard_Boolean isNeedWritePcurve = Standard_False;
   TopExp_Explorer WireExp;
   for (WireExp.Init(ForwardFace,TopAbs_WIRE);WireExp.More();WireExp.Next()) {
 
@@ -274,7 +275,8 @@ void TopoDSToStep_MakeStepFace::Init(const TopoDS_Face& aFace,
       //const TopoDS_Wire ForwardWire = TopoDS::Wire(ssh);
 
       //MkWire.Init(ForwardWire, aTool, FP);
-      MkWire.Init(CurrentWire, aTool, FP);
+      MkWire.Init(CurrentWire, aTool, FP, isNeedWritePcurve);
+
       if (MkWire.IsDone()) Loop = Handle(StepShape_Loop)::DownCast(MkWire.Value());
       else {
 #ifdef OCCT_DEBUG
@@ -323,7 +325,7 @@ void TopoDSToStep_MakeStepFace::Init(const TopoDS_Face& aFace,
   // Translate the Edge 2D Geometry (pcurves)
   // ----------------------------------------
   
-  if ( ! aTool.Faceted() && aTool.PCurveMode() != 0 ) {
+  if ( ! aTool.Faceted() && (aTool.PCurveMode() != 0 || isNeedWritePcurve)) {
     
     TopExp_Explorer Ex(ForwardFace, TopAbs_EDGE);
 
@@ -358,6 +360,9 @@ void TopoDSToStep_MakeStepFace::Init(const TopoDS_Face& aFace,
       Handle(StepGeom_Curve) Cpms = 
        Handle(StepShape_EdgeCurve)::DownCast(aTool.Find(E))->EdgeGeometry();
       if ( Cpms.IsNull() ) continue;
+      Handle(StepGeom_SurfaceCurve) C1pms = 
+        Handle(StepGeom_SurfaceCurve)::DownCast(Cpms);
+      if (C1pms.IsNull()) continue;
       
       if ( !C2d.IsNull() && aTool.IsBound(E) ) {
        if (C2d->IsKind(STANDARD_TYPE(Geom2d_Hyperbola)) || 
@@ -416,9 +421,7 @@ void TopoDSToStep_MakeStepFace::Init(const TopoDS_Face& aFace,
 
        DRI->Init(aName, aItems, aContext);
        Pc->Init(aName, Spms, DRI );
-       Handle(StepGeom_SurfaceCurve) C1pms = 
-         Handle(StepGeom_SurfaceCurve)::DownCast(Cpms);
-       Handle(StepGeom_HArray1OfPcurveOrSurface) aGeom = C1pms->AssociatedGeometry();
+  Handle(StepGeom_HArray1OfPcurveOrSurface) aGeom = C1pms->AssociatedGeometry();
        if (aGeom.IsNull()) aGeom = new StepGeom_HArray1OfPcurveOrSurface(1,2);
        StepGeom_PcurveOrSurface PcOrSur;
        PcOrSur.SetValue(Pc);
index cdc5062584b8b4ee12cd3dc12616494a0ef2d458..2626a2e00935958123539ebd118ad7a60704a715 100644 (file)
@@ -35,14 +35,15 @@ is
     
     Create (W : Wire from TopoDS;
            T : in out Tool from TopoDSToStep;
-          FP : FinderProcess from Transfer)
+               FP : FinderProcess from Transfer;
+           isNeedWritePcurve : in out Boolean from Standard)
          returns MakeStepWire;
     
     Init(me : in out;
         W  : Wire from TopoDS;
          T  : in out Tool from TopoDSToStep;
-        FP : FinderProcess from Transfer);
-
+            FP : FinderProcess from Transfer;
+         isNeedWritePcurve : in out Boolean from Standard);
            
     Value (me) returns TopologicalRepresentationItem from StepShape
        raises NotDone
index 00874bf47997a42a1c06ffb300e2a7d79d3b4ddd..2ff9cdc5e53b3506060bbc6a98fd4f833b193371 100644 (file)
@@ -65,10 +65,11 @@ TopoDSToStep_MakeStepWire::TopoDSToStep_MakeStepWire()
 TopoDSToStep_MakeStepWire::TopoDSToStep_MakeStepWire
 (const TopoDS_Wire& W, 
  TopoDSToStep_Tool& T,
- const Handle(Transfer_FinderProcess)& FP)
+ const Handle(Transfer_FinderProcess)& FP,
+ Standard_Boolean& isNeedWritePcurve)
 {
   done = Standard_False;
-  Init(W, T, FP);
+  Init(W, T, FP, isNeedWritePcurve);
 }
 
 
@@ -79,7 +80,8 @@ TopoDSToStep_MakeStepWire::TopoDSToStep_MakeStepWire
 
 void TopoDSToStep_MakeStepWire::Init(const TopoDS_Wire& aWire, 
                                    TopoDSToStep_Tool& aTool,
-                                   const Handle(Transfer_FinderProcess)& FP)
+                                   const Handle(Transfer_FinderProcess)& FP,
+            Standard_Boolean& isNeedWritePcurve)
 {
 
   // ----------------------------------------------------------------
@@ -221,6 +223,10 @@ void TopoDSToStep_MakeStepWire::Init(const TopoDS_Wire& aWire,
     }
 
     nb = cwd->NbEdges();
+    if (nb < sbwd->NbEdges())
+    {
+      isNeedWritePcurve = Standard_True;
+    }
     if(nb%2 == 0 ) {
       for ( ie = 1; ie < nb; ie++) {
        if ( cwd->Edge(ie).IsSame(cwd->Edge(ie+1)) ) break;
@@ -283,7 +289,7 @@ void TopoDSToStep_MakeStepWire::Init(const TopoDS_Wire& aWire,
        //TopoDS_Shape ssh = CurrentEdge.Oriented(TopAbs_FORWARD);
        //const TopoDS_Edge ForwardEdge = TopoDS::Edge(ssh);
 
-       MkEdge.Init(CurrentEdge, aTool, FP);
+       MkEdge.Init(CurrentEdge, aTool, FP, isNeedWritePcurve);
        if (MkEdge.IsDone()) {
          OrientedEdge = new StepShape_OrientedEdge();
          Epms = Handle(StepShape_Edge)::DownCast(MkEdge.Value());