X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_WireSplitter.cxx;h=c90750cbb228c26586195084f6464a797482b683;hb=6aa979f7402fb06a6bf5f959726241541b83e839;hp=e4671d3a2c79410a80cc78dd37db604732c3ddbd;hpb=239f8109c64fa0c5a2e1d87a420bad5529b57f48;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx b/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx index e4671d3a2..c90750cbb 100755 --- a/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx +++ b/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx @@ -1,28 +1,30 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File: GEOMAlgo_WireSplitter.cxx -// Created: -// Author: Peter KURNEV -// - +// File: GEOMAlgo_WireSplitter.cxx +// Created: +// Author: Peter KURNEV +// +// #include #include @@ -72,15 +74,15 @@ static void Path (const GeomAdaptor_Surface& aGAS, - const TopoDS_Face& myFace, - const TopoDS_Vertex& aVa, - const TopoDS_Edge& aEOuta, - BOP_EdgeInfo& anEdgeInfo, - TopTools_SequenceOfShape& aLS, - TopTools_SequenceOfShape& aVertVa, - TColgp_SequenceOfPnt2d& aCoordVa, - BOPTColStd_ListOfListOfShape& myShapes, - BOP_IndexedDataMapOfVertexListEdgeInfo& mySmartMap); + const TopoDS_Face& myFace, + const TopoDS_Vertex& aVa, + const TopoDS_Edge& aEOuta, + BOP_EdgeInfo& anEdgeInfo, + TopTools_SequenceOfShape& aLS, + TopTools_SequenceOfShape& aVertVa, + TColgp_SequenceOfPnt2d& aCoordVa, + BOPTColStd_ListOfListOfShape& myShapes, + BOP_IndexedDataMapOfVertexListEdgeInfo& mySmartMap); static @@ -89,32 +91,32 @@ static static void GetNextVertex(const TopoDS_Vertex& aV, - const TopoDS_Edge& aE, - TopoDS_Vertex& aV1); + const TopoDS_Edge& aE, + TopoDS_Vertex& aV1); static Standard_Real ClockWiseAngle(const Standard_Real aAngleIn, - const Standard_Real aAngleOut); + const Standard_Real aAngleOut); static Standard_Real AngleIn(const TopoDS_Edge& aEIn, - const BOP_ListOfEdgeInfo& aLEInfo); + const BOP_ListOfEdgeInfo& aLEInfo); static Standard_Real Angle2D (const TopoDS_Vertex& aV, - const TopoDS_Edge& anEdge, - const TopoDS_Face& myFace, - const GeomAdaptor_Surface& aGAS, - const Standard_Boolean aFlag); + const TopoDS_Edge& anEdge, + const TopoDS_Face& myFace, + const GeomAdaptor_Surface& aGAS, + const Standard_Boolean aFlag); static gp_Pnt2d Coord2d (const TopoDS_Vertex& aV1, - const TopoDS_Edge& aE1, - const TopoDS_Face& aF); + const TopoDS_Edge& aE1, + const TopoDS_Face& aF); static gp_Pnt2d Coord2dVf (const TopoDS_Edge& aE, - const TopoDS_Face& aF); + const TopoDS_Face& aF); static Standard_Real Tolerance2D (const TopoDS_Vertex& aV, - const GeomAdaptor_Surface& aGAS); + const GeomAdaptor_Surface& aGAS); static Standard_Integer NbWaysOut(const BOP_ListOfEdgeInfo& ); @@ -230,7 +232,7 @@ static index = mySmartMap.FindIndex(aVertex); if (!index) { - index=mySmartMap.Add(aVertex, emptyInfo); + index=mySmartMap.Add(aVertex, emptyInfo); } BOP_ListOfEdgeInfo& aListOfEInfo=mySmartMap(index); @@ -241,11 +243,11 @@ static TopAbs_Orientation anOr=aVertex.Orientation(); if (anOr==TopAbs_FORWARD) { - aEInfo.SetInFlag(Standard_False); + aEInfo.SetInFlag(Standard_False); } else if (anOr==TopAbs_REVERSED) { - aEInfo.SetInFlag(Standard_True); + aEInfo.SetInFlag(Standard_True); } aListOfEInfo.Append(aEInfo); @@ -266,10 +268,10 @@ static const BOP_EdgeInfo& anEdgeInfo=anIt.Value(); anIsIn=anEdgeInfo.IsIn(); if (anIsIn) { - aCntIn++; + aCntIn++; } else { - aCntOut++; + aCntOut++; } } if (aCntIn!=1 || aCntOut!=1) { @@ -292,13 +294,13 @@ static const TopoDS_Shape& aE = anItList.Value(); if (!aMapEE.Contains(aE)) { - TopTools_ListOfShape aLEx; - aLEx.Append(aE); - aMapEE.Add(aE, aLEx); + TopTools_ListOfShape aLEx; + aLEx.Append(aE); + aMapEE.Add(aE, aLEx); } else { - TopTools_ListOfShape& aLEx=aMapEE.ChangeFromKey(aE); - aLEx.Append(aE); + TopTools_ListOfShape& aLEx=aMapEE.ChangeFromKey(aE); + aLEx.Append(aE); } } @@ -309,20 +311,20 @@ static const TopTools_ListOfShape& aLEx=aMapEE(i); aNbE=aLEx.Extent(); if (aNbE==1) { - // usual case - continue; + // usual case + continue; } else if (aNbE==2){ - const TopoDS_Shape& aE1=aLEx.First(); - const TopoDS_Shape& aE2=aLEx.Last(); - if (aE1.IsSame(aE2)) { - bFlag=Standard_False; - break; - } + const TopoDS_Shape& aE1=aLEx.First(); + const TopoDS_Shape& aE2=aLEx.Last(); + if (aE1.IsSame(aE2)) { + bFlag=Standard_False; + break; + } } else { - bFlag=Standard_False; - break; + bFlag=Standard_False; + break; } } myNothingToDo=myNothingToDo && bFlag; @@ -350,15 +352,15 @@ static // anIsIn=anEdgeInfo.IsIn(); if (anIsIn) { - // - aVV.Orientation(TopAbs_REVERSED); - anAngle=Angle2D (aVV, aE, myFace, aGAS, Standard_True); + // + aVV.Orientation(TopAbs_REVERSED); + anAngle=Angle2D (aVV, aE, myFace, aGAS, Standard_True); } // else { // OUT - // - aVV.Orientation(TopAbs_FORWARD); - anAngle=Angle2D (aVV, aE, myFace, aGAS, Standard_False); + // + aVV.Orientation(TopAbs_FORWARD); + anAngle=Angle2D (aVV, aE, myFace, aGAS, Standard_False); } anEdgeInfo.SetAngle(anAngle); @@ -387,13 +389,13 @@ static anIsNotPassed=!anEdgeInfo.Passed(); if (anIsOut && anIsNotPassed) { - // - aLS.Clear(); - aVertVa.Clear(); - aCoordVa.Clear(); - // - Path(aGAS, myFace, aVa, aEOuta, anEdgeInfo, aLS, - aVertVa, aCoordVa, myShapes, mySmartMap); + // + aLS.Clear(); + aVertVa.Clear(); + aCoordVa.Clear(); + // + Path(aGAS, myFace, aVa, aEOuta, anEdgeInfo, aLS, + aVertVa, aCoordVa, myShapes, mySmartMap); } } } @@ -409,16 +411,16 @@ static const TopTools_ListOfShape& aLE=anItW.Value(); TopTools_ListIteratorOfListOfShape anItE(aLE); for (; anItE.More(); anItE.Next()) { - const TopoDS_Edge& aE=TopoDS::Edge(anItE.Value()); - aME.Add(aE); - TopExp::Vertices(aE, aV1, aV2); - aMV.Add(aV1); - aMV.Add(aV2); + const TopoDS_Edge& aE=TopoDS::Edge(anItE.Value()); + aME.Add(aE); + TopExp::Vertices(aE, aV1, aV2); + aMV.Add(aV1); + aMV.Add(aV2); } aNbV=aMV.Extent(); aNbE=aME.Extent(); if (aNbV<=aNbE) { - aShapes.Append(aLE); + aShapes.Append(aLE); } } // @@ -437,16 +439,16 @@ static // purpose: //======================================================================= void Path (const GeomAdaptor_Surface& aGAS, - const TopoDS_Face& myFace, - const TopoDS_Vertex& aVa, - const TopoDS_Edge& aEOuta, - BOP_EdgeInfo& anEdgeInfo, - TopTools_SequenceOfShape& aLS, - TopTools_SequenceOfShape& aVertVa, - TColgp_SequenceOfPnt2d& aCoordVa, - BOPTColStd_ListOfListOfShape& myShapes, - BOP_IndexedDataMapOfVertexListEdgeInfo& mySmartMap) - + const TopoDS_Face& myFace, + const TopoDS_Vertex& aVa, + const TopoDS_Edge& aEOuta, + BOP_EdgeInfo& anEdgeInfo, + TopTools_SequenceOfShape& aLS, + TopTools_SequenceOfShape& aVertVa, + TColgp_SequenceOfPnt2d& aCoordVa, + BOPTColStd_ListOfListOfShape& myShapes, + BOP_IndexedDataMapOfVertexListEdgeInfo& mySmartMap) + { Standard_Integer i,j, aNb, aNbj; Standard_Real aTol, anAngleIn, anAngleOut, anAngle, aMinAngle; @@ -484,10 +486,10 @@ static gp_Pnt2d aPb=Coord2d(aVb, aEOuta, myFace); - const BOP_ListOfEdgeInfo& aLEInfoVb=mySmartMap.FindFromKey(aVb); + //const BOP_ListOfEdgeInfo& aLEInfoVb=mySmartMap.FindFromKey(aVb); // aTol=2.*Tolerance2D(aVb, aGAS); - aTol2=aTol*aTol; + aTol2=10.*aTol*aTol; // aNb=aLS.Length(); if (aNb>0) { @@ -505,51 +507,51 @@ static anIsSameV2d=Standard_False; if (anIsSameV) { - anIsSameV2d = Standard_True; - // - aD2=aPaPrev.SquareDistance(aPb); - anIsSameV2d =aD2 aTol2D2){ - continue; + continue; } // // @@ -606,9 +608,9 @@ static // anAngle=ClockWiseAngle(anAngleIn, anAngleOut); if (anAngle < aMinAngle) { - aMinAngle=anAngle; - pEdgeInfo=&anEI; - anIsFound=Standard_True; + aMinAngle=anAngle; + pEdgeInfo=&anEI; + anIsFound=Standard_True; } } } // for (; anIt.More(); anIt.Next()) @@ -621,14 +623,14 @@ static aEOutb=pEdgeInfo->Edge(); // Path (aGAS, myFace, aVb, aEOutb, *pEdgeInfo, aLS, - aVertVa, aCoordVa, myShapes, mySmartMap); + aVertVa, aCoordVa, myShapes, mySmartMap); } //======================================================================= // function: Coord2dVf // purpose: //======================================================================= gp_Pnt2d Coord2dVf (const TopoDS_Edge& aE, - const TopoDS_Face& aF) + const TopoDS_Face& aF) { Standard_Real aCoord=99.; gp_Pnt2d aP2D1(aCoord, aCoord); @@ -650,7 +652,7 @@ static // purpose: //======================================================================= Standard_Real Tolerance2D (const TopoDS_Vertex& aV, - const GeomAdaptor_Surface& aGAS) + const GeomAdaptor_Surface& aGAS) { Standard_Real aTol2D, anUr, aVr, aTolV3D; GeomAbs_SurfaceType aType; @@ -664,9 +666,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; } @@ -683,8 +683,8 @@ static // purpose: //======================================================================= gp_Pnt2d Coord2d (const TopoDS_Vertex& aV1, - const TopoDS_Edge& aE1, - const TopoDS_Face& aF) + const TopoDS_Edge& aE1, + const TopoDS_Face& aF) { Standard_Real aT, aFirst, aLast; Handle(Geom2d_Curve) aC2D; @@ -701,7 +701,7 @@ static // purpose: //======================================================================= Standard_Real AngleIn(const TopoDS_Edge& aEIn, - const BOP_ListOfEdgeInfo& aLEInfo) + const BOP_ListOfEdgeInfo& aLEInfo) { Standard_Real anAngleIn; Standard_Boolean anIsIn; @@ -726,7 +726,7 @@ static // purpose: //======================================================================= Standard_Real ClockWiseAngle(const Standard_Real aAngleIn, - const Standard_Real aAngleOut) + const Standard_Real aAngleOut) { Standard_Real aTwoPi=Standard_PI+Standard_PI; Standard_Real dA, A1, A2, AIn, AOut ; @@ -765,8 +765,8 @@ static // purpose: //======================================================================= void GetNextVertex(const TopoDS_Vertex& aV, - const TopoDS_Edge& aE, - TopoDS_Vertex& aV1) + const TopoDS_Edge& aE, + TopoDS_Vertex& aV1) { TopoDS_Iterator aIt; // @@ -785,29 +785,34 @@ static // purpose: //======================================================================= Standard_Real Angle2D (const TopoDS_Vertex& aV, - const TopoDS_Edge& anEdge, - const TopoDS_Face& myFace, - const GeomAdaptor_Surface& aGAS, - const Standard_Boolean aFlag) + const TopoDS_Edge& anEdge, + const TopoDS_Face& myFace, + 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; - - BOPTools_Tools2D::CurveOnSurface (anEdge, myFace, aC2D, - aFirst, aLast, aToler, Standard_True); - + // aTV=BRep_Tool::Parameter (aV, anEdge, myFace); - if (Precision::IsInfinite(aTV)) + if (Precision::IsInfinite(aTV)) { return 0.; - + } + // + BOPTools_Tools2D::CurveOnSurface (anEdge, myFace, aC2D, + aFirst, aLast, aToler, Standard_True); //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 +821,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; } //=======================================================================