From: ink Date: Mon, 23 Mar 2015 06:41:37 +0000 (+0300) Subject: fixed part of the regressions X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=0af52d84ea78b77a44c3ad73749a61fb313db5d7;p=occt-copy.git fixed part of the regressions --- diff --git a/src/ShapeFix/ShapeFix_IntersectionTool.cxx b/src/ShapeFix/ShapeFix_IntersectionTool.cxx index 7f366fd5ea..7d36701639 100644 --- a/src/ShapeFix/ShapeFix_IntersectionTool.cxx +++ b/src/ShapeFix/ShapeFix_IntersectionTool.cxx @@ -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)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)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)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)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); diff --git a/src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cdl b/src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cdl index 606026be25..666f4d9e2d 100644 --- a/src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cdl +++ b/src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cdl @@ -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 diff --git a/src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cxx b/src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cxx index 6bc1d10424..fdad184f2b 100644 --- a/src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cxx +++ b/src/TopoDSToStep/TopoDSToStep_MakeStepEdge.cxx @@ -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); diff --git a/src/TopoDSToStep/TopoDSToStep_MakeStepFace.cxx b/src/TopoDSToStep/TopoDSToStep_MakeStepFace.cxx index a7a210c562..931a522e4d 100644 --- a/src/TopoDSToStep/TopoDSToStep_MakeStepFace.cxx +++ b/src/TopoDSToStep/TopoDSToStep_MakeStepFace.cxx @@ -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); diff --git a/src/TopoDSToStep/TopoDSToStep_MakeStepWire.cdl b/src/TopoDSToStep/TopoDSToStep_MakeStepWire.cdl index cdc5062584..2626a2e009 100644 --- a/src/TopoDSToStep/TopoDSToStep_MakeStepWire.cdl +++ b/src/TopoDSToStep/TopoDSToStep_MakeStepWire.cdl @@ -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 diff --git a/src/TopoDSToStep/TopoDSToStep_MakeStepWire.cxx b/src/TopoDSToStep/TopoDSToStep_MakeStepWire.cxx index 00874bf479..2ff9cdc5e5 100644 --- a/src/TopoDSToStep/TopoDSToStep_MakeStepWire.cxx +++ b/src/TopoDSToStep/TopoDSToStep_MakeStepWire.cxx @@ -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());