From 985c3a718bacc05aaad407f59b3384322f1192b2 Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 18 Sep 2008 03:33:24 +0000 Subject: [PATCH] Fix problem with partition (merge fix of PKV from BR_QT4_Dev branch) --- src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx | 34 ++++++- src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx | 121 +++++++++++++++++++++++-- src/GEOMAlgo/GEOMAlgo_Builder_2.cxx | 20 ++++ src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx | 42 ++++----- 4 files changed, 185 insertions(+), 32 deletions(-) diff --git a/src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx b/src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx index 724e9c77f..664e3e878 100755 --- a/src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx +++ b/src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx @@ -251,6 +251,7 @@ static TopTools_MapIteratorOfMapOfOrientedShape aItM; TopTools_IndexedDataMapOfShapeListOfShape aVEMap; TopTools_MapOfOrientedShape aMAdded; + TopoDS_Iterator aItW; BRep_Builder aBB; GEOMAlgo_WireEdgeSet aWES; GEOMAlgo_WESCorrector aWESCor; @@ -278,6 +279,37 @@ static const TopoDS_Shape& aW=aIt.Value(); myLoops.Append(aW); } + //modified by NIZNHY-PKV Tue Aug 5 15:09:29 2008f + // Post Treatment + TopTools_MapOfOrientedShape aMEP; + // + // a. collect all edges that are in loops + aIt.Initialize (myLoops); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aW=aIt.Value(); + aItW.Initialize(aW); + for (; aItW.More(); aItW.Next()) { + const TopoDS_Shape& aE=aItW.Value(); + aMEP.Add(aE); + } + } + // + // b. collect all edges that are to avoid + aItM.Initialize(myShapesToAvoid); + for (; aItM.More(); aItM.Next()) { + const TopoDS_Shape& aE=aItM.Key(); + aMEP.Add(aE); + } + // + // c. add all edges that are not processed to myShapesToAvoid + aIt.Initialize (myShapes); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aE=aIt.Value(); + if (!aMEP.Contains(aE)) { + myShapesToAvoid.Add(aE); + } + } + //modified by NIZNHY-PKV Tue Aug 5 15:09:35 2008t // // 2. Internal Wires myLoopsInternal.Clear(); @@ -302,7 +334,7 @@ static aBB.MakeWire(aW); aBB.Add(aW, aEE); // - TopoDS_Iterator aItW (aW); + aItW.Initialize(aW); for (; aItW.More()&&bFlag; aItW.Next()) { const TopoDS_Edge& aE=TopoDS::Edge(aItW.Value()); // diff --git a/src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx b/src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx index 1701f3e38..c709705e7 100755 --- a/src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx +++ b/src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx @@ -93,7 +93,10 @@ static void MakeInternalShells(const TopTools_MapOfShape& , TopTools_ListOfShape& ); - +//modified by NIZNHY-PKV Tue Aug 5 15:06:50 2008f +static + Standard_Boolean IsClosedShell(const TopoDS_Shell& theShell); +//modified by NIZNHY-PKV Tue Aug 5 15:06:57 2008t //======================================================================= //function : @@ -228,6 +231,17 @@ static myShapesToAvoid.Add(aF2); } } + //DEB + else { + TopTools_ListIteratorOfListOfShape aItLF; + // + aItLF.Initialize (aLF); + for (; aItLF.More(); aItLF.Next()) { + const TopoDS_Shape& aFx=aItLF.Value(); + int a=0; + } + } + //DEB }// for (i=1; i<=aNbE; ++i) { // if (!bFound) { @@ -246,14 +260,16 @@ static // myLoops.Clear(); // - Standard_Integer aNbLF, aNbOff, aNbFP; + Standard_Integer aNbLF, aNbOff, aNbFP, aNbFA; TopAbs_Orientation anOr; TopoDS_Edge aEL; BRep_Builder aBB; NMTTools_CoupleOfShape aCSOff; - TopTools_MapOfOrientedShape AddedFacesMap; + TopTools_MapOfOrientedShape AddedFacesMap;//, aMFP; TopTools_IndexedDataMapOfShapeListOfShape aEFMap, aMEFP; - TopTools_ListIteratorOfListOfShape aItF; + TopTools_ListIteratorOfListOfShape aItF, aIt; + TopTools_MapIteratorOfMapOfOrientedShape aItM; + TopoDS_Iterator aItS; // //================================================= // @@ -366,17 +382,61 @@ static } } // for (; aEdgeExp.More(); aEdgeExp.Next()) { } //for (; aItAddedF.More(); aItAddedF.Next()) { - myLoops.Append(aShell); + //modified by NIZNHY-PKV Tue Aug 5 15:07:08 2008f + //myLoops.Append(aShell); + if (IsClosedShell(aShell)) { + myLoops.Append(aShell); + } + /* + else { + TopoDS_Iterator aItS; + aItS.Initialize(aShell); + for (; aItS.More(); aItS.Next()) { + const TopoDS_Shape& aFs=aItS.Value(); + aMFP.Add(aFs); + } + } + */ + //modified by NIZNHY-PKV Tue Aug 5 15:07:30 2008t } // for (; aItF.More(); aItF.Next()) { + //modified by NIZNHY-PKV Tue Aug 5 15:07:35 2008f + // + // Post Treatment + TopTools_MapOfOrientedShape aMP; + // + // a. collect all edges that are in loops + aIt.Initialize (myLoops); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + aItS.Initialize(aS); + for (; aItS.More(); aItS.Next()) { + const TopoDS_Shape& aF=aItS.Value(); + aMP.Add(aF); + } + } + // + // b. collect all edges that are to avoid + aItM.Initialize(myShapesToAvoid); + for (; aItM.More(); aItM.Next()) { + const TopoDS_Shape& aF=aItM.Key(); + aMP.Add(aF); + } + // + // c. add all edges that are not processed to myShapesToAvoid + aIt.Initialize (myShapes); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aF=aIt.Value(); + if (!aMP.Contains(aF)) { + myShapesToAvoid.Add(aF); + } + } + //modified by NIZNHY-PKV Tue Aug 5 15:07:44 2008t //================================================= // // 2.Internal Shells // myLoopsInternal.Clear(); // - Standard_Integer aNbFA; - TopTools_MapIteratorOfMapOfOrientedShape aItM; - // aEFMap.Clear(); AddedFacesMap.Clear(); // @@ -730,7 +790,50 @@ Standard_Boolean IsGrowthShell(const TopoDS_Shape& theShell, } return bRet; } - +//modified by NIZNHY-PKV Tue Aug 5 15:07:50 2008f +//======================================================================= +//function : IsClosedShell +//purpose : +//======================================================================= +Standard_Boolean IsClosedShell(const TopoDS_Shell& theShell) +{ + Standard_Integer aNbE; + Standard_Boolean bRet; + TopoDS_Iterator aIt; + TopExp_Explorer aExp; + TopTools_MapOfShape aM; + // + bRet=Standard_False; + aIt.Initialize(theShell); + for(; aIt.More(); aIt.Next()) { + const TopoDS_Face& aF=TopoDS::Face(aIt.Value()); + aExp.Init(aF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(aExp.Current()); + if (BRep_Tool::Degenerated(aE)) { + continue; + } + /* + if (BRep_Tool::IsClosed(aE, aF)) { + continue; + } + */ + if (aE.Orientation()==TopAbs_INTERNAL) { + continue; + } + if (!aM.Add(aE)) { + aM.Remove(aE); + } + } + } + // + aNbE=aM.Extent(); + if (!aNbE) { + bRet=!bRet; + } + return bRet; +} +//modified by NIZNHY-PKV Tue Aug 5 15:08:07 2008t //BRepTools::Write(aFF, "ff"); // // ErrorStatus : diff --git a/src/GEOMAlgo/GEOMAlgo_Builder_2.cxx b/src/GEOMAlgo/GEOMAlgo_Builder_2.cxx index 92e9e2cc8..2da08b5f6 100755 --- a/src/GEOMAlgo/GEOMAlgo_Builder_2.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Builder_2.cxx @@ -360,6 +360,26 @@ static aBF.SetFace(aFF); aBF.SetContext(aCtx); const TopTools_ListOfShape& aSE=aWES.StartElements(); + // + //DEB f + /* + { + TopoDS_Compound aCx; + BRep_Builder aBBx; + TopTools_ListIteratorOfListOfShape aItx; + // + aBBx.MakeCompound(aCx); + aBBx.Add(aCx, aFF); + aItx.Initialize(aSE); + for (; aItx.More(); aItx.Next()) { + TopoDS_Shape& aEx=aItx.Value(); + aBBx.Add(aCx, aEx); + } + int a=0; + } + */ + //DEB t + // aBF.SetShapes(aSE); // aBF.Perform(); diff --git a/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx b/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx index e4671d3a2..94f8a66d5 100755 --- a/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx +++ b/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx @@ -664,9 +664,7 @@ static // if (aType==GeomAbs_BSplineSurface|| aType==GeomAbs_Sphere|| - //modified by NIZNHY-PKV Wed Nov 29 10:18:50 2006f GeomAbs_SurfaceOfRevolution) { - //modified by NIZNHY-PKV Wed Nov 29 10:18:55 2006t if (aTol2D < aTolV3D) { aTol2D=aTolV3D; } @@ -790,24 +788,29 @@ static const GeomAdaptor_Surface& aGAS, const Standard_Boolean aFlag) { - Standard_Real aFirst, aLast, aToler, dt, aTV, aTV1, anAngle; - + Standard_Real aFirst, aLast, aToler, dt, aTV, aTV1, anAngle, aTX; + gp_Pnt2d aPV, aPV1; + gp_Vec2d aV2D; Handle(Geom2d_Curve) aC2D; - + // + aTV=BRep_Tool::Parameter (aV, anEdge, myFace); + if (Precision::IsInfinite(aTV)) { + return 0.; + } + // BOPTools_Tools2D::CurveOnSurface (anEdge, myFace, aC2D, aFirst, aLast, aToler, Standard_True); - - aTV=BRep_Tool::Parameter (aV, anEdge, myFace); - if (Precision::IsInfinite(aTV)) - return 0.; - //dt=1.e-7; - dt=Tolerance2D(aV, aGAS); - - if(dt > (aLast - aFirst) * 0.25) { + //modified by NIZNHY-PKV Wed Sep 10 14:06:04 2008f + //dt=Tolerance2D(aV, aGAS); + dt=2.*Tolerance2D(aV, aGAS); + //modified by NIZNHY-PKV Wed Sep 10 14:06:07 2008t + // + aTX=0.25*(aLast - aFirst); + if(dt > aTX) { // to save direction of the curve as much as it possible // in the case of big tolerances - dt = (aLast - aFirst) * 0.25; + dt = aTX; } // if (fabs (aTV-aFirst) < fabs(aTV - aLast)) { @@ -816,27 +819,22 @@ static else { aTV1=aTV - dt; } - - gp_Pnt2d aPV, aPV1; + // aC2D->D0 (aTV, aPV); aC2D->D0 (aTV1, aPV1); - - gp_Vec2d aV2D; // if (aFlag) {//IN gp_Vec2d aV2DIn(aPV1, aPV); - // aV2D=aV2DIn; } - else { gp_Vec2d aV2DOut(aPV, aPV1); aV2D=aV2DOut; } - + // gp_Dir2d aDir2D(aV2D); anAngle=Angle(aDir2D); - + // return anAngle; } //=======================================================================