X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_Tools.cxx;h=296b6928b286e0b4e56249e9ee99c273be9bb968;hb=357991964c4929ef01edcf1d55eddd67f8512c29;hp=a265c785f28788af96f951437ef5f7060e5605fa;hpb=72d99f0d9031406e798abd00f41079533f3cf99f;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_Tools.cxx b/src/GEOMAlgo/GEOMAlgo_Tools.cxx index a265c785f..296b6928b 100644 --- a/src/GEOMAlgo/GEOMAlgo_Tools.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Tools.cxx @@ -1,40 +1,51 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 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 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. +// 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_Tools.cxx -// Created: Mon Dec 6 11:35:29 2004 -// Author: Peter KURNEV -// +// 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_Tools.cxx +// Created: Mon Dec 6 11:35:29 2004 +// Author: Peter KURNEV + #include +#include +#include + +#include + +#include #include #include +#include +#include -#include -#include #include +#include + +#include +#include + #include #include +#include #include @@ -54,16 +65,13 @@ #include #include -#include //qft -#include //qft - -static +static void GetCount(const TopoDS_Shape& aS, - Standard_Integer& iCnt); + Standard_Integer& iCnt); //======================================================================= //function : IsCompositeShape -//purpose : +//purpose : //======================================================================= Standard_Boolean GEOMAlgo_Tools::IsCompositeShape(const TopoDS_Shape& aS) { @@ -80,10 +88,10 @@ Standard_Boolean GEOMAlgo_Tools::IsCompositeShape(const TopoDS_Shape& aS) //======================================================================= //function : GetCount -//purpose : +//purpose : //======================================================================= void GetCount(const TopoDS_Shape& aS, - Standard_Integer& iCnt) + Standard_Integer& iCnt) { TopoDS_Iterator aIt; TopAbs_ShapeEnum aTS; @@ -101,17 +109,21 @@ void GetCount(const TopoDS_Shape& aS, aIt.Initialize(aS); for (; aIt.More(); aIt.Next()) { const TopoDS_Shape& aSx=aIt.Value(); - GetCount(aSx, iCnt); + GetCount(aSx, iCnt); } } //======================================================================= //function : RefineSDShapes -//purpose : +//purpose : //======================================================================= - Standard_Integer GEOMAlgo_Tools::RefineSDShapes(GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape& aMPKLE, - const Standard_Real aTol, - IntTools_Context& aCtx) +Standard_Integer GEOMAlgo_Tools::RefineSDShapes (GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape& aMPKLE, + const Standard_Real aTol, +#if OCC_VERSION_LARGE > 0x06050200 + const Handle(IntTools_Context)& aCtx) +#else + IntTools_Context& aCtx) +#endif { Standard_Integer i, aNbE, iErr, j, aNbEE, aNbToAdd; TopTools_IndexedDataMapOfShapeListOfShape aMEE, aMSDE, aMEToAdd; @@ -130,19 +142,19 @@ void GetCount(const TopoDS_Shape& aS, // aNbEE=aMEE.Extent(); if (aNbEE==1) { - continue; // nothing to do + continue; // nothing to do } // for (j=1; j<=aNbEE; ++j) { TopTools_ListOfShape& aLEE=aMEE.ChangeFromIndex(j); // if (j==1) { - aLSDE.Clear(); - aLSDE.Append(aLEE); + aLSDE.Clear(); + aLSDE.Append(aLEE); } else { - const TopoDS_Shape& aE1=aLEE.First(); - aMEToAdd.Add(aE1, aLEE); + const TopoDS_Shape& aE1=aLEE.First(); + aMEToAdd.Add(aE1, aLEE); } } } @@ -169,12 +181,16 @@ void GetCount(const TopoDS_Shape& aS, } //======================================================================= //function : FindSDShapes -//purpose : +//purpose : //======================================================================= -Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopTools_ListOfShape& aLE, - const Standard_Real aTol, - TopTools_IndexedDataMapOfShapeListOfShape& aMEE, - IntTools_Context& aCtx) +Standard_Integer GEOMAlgo_Tools::FindSDShapes (const TopTools_ListOfShape& aLE, + const Standard_Real aTol, + TopTools_IndexedDataMapOfShapeListOfShape& aMEE, +#if OCC_VERSION_LARGE > 0x06050200 + const Handle(IntTools_Context)& aCtx) +#else + IntTools_Context& aCtx) +#endif { Standard_Integer aNbE, aNbEProcessed, aNbESD, iErr; TopTools_ListOfShape aLESD; @@ -185,11 +201,11 @@ Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopTools_ListOfShape& aLE, aNbE=aLE.Extent(); if (!aNbE) { return 3; // Err - } + } //modified by NIZNHY-PKV Thu Dec 30 10:56:52 2004 f if (aNbE==1) { return 0; // Nothing to do - } + } //modified by NIZNHY-PKV Thu Dec 30 10:56:56 2004 t // while(1) { @@ -203,37 +219,37 @@ Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopTools_ListOfShape& aLE, const TopoDS_Shape& aS=aIt.Value(); // if (aMProcessed.Contains(aS)) { - continue; + continue; } // //modified by NIZNHY-PKV Thu Dec 30 10:57:01 2004 f aType=aS.ShapeType(); if (aType==TopAbs_EDGE) { - const TopoDS_Edge& aE=TopoDS::Edge(aS); - if (BRep_Tool::Degenerated(aE)) { - aMProcessed.Add(aE); - continue; - } + const TopoDS_Edge& aE=TopoDS::Edge(aS); + if (BRep_Tool::Degenerated(aE)) { + aMProcessed.Add(aE); + continue; + } } //modified by NIZNHY-PKV Thu Dec 30 10:57:03 2004 t // aLESD.Clear(); iErr=GEOMAlgo_Tools::FindSDShapes(aS, aLE, aTol, aLESD, aCtx); if (iErr) { - return 2; // Err + return 2; // Err } // aNbESD=aLESD.Extent(); if (!aNbESD) { - return 1; // Err + return 1; // Err } // aMEE.Add(aS, aLESD); // aIt1.Initialize(aLESD); for (; aIt1.More(); aIt1.Next()) { - const TopoDS_Shape& aE1=aIt1.Value(); - aMProcessed.Add(aE1); + const TopoDS_Shape& aE1=aIt1.Value(); + aMProcessed.Add(aE1); } } } @@ -241,13 +257,17 @@ Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopTools_ListOfShape& aLE, } //======================================================================= //function : FindSDShapes -//purpose : +//purpose : //======================================================================= Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopoDS_Shape& aE1, - const TopTools_ListOfShape& aLE, - const Standard_Real aTol, - TopTools_ListOfShape& aLESD, - IntTools_Context& aCtx) + const TopTools_ListOfShape& aLE, + const Standard_Real aTol, + TopTools_ListOfShape& aLESD, +#if OCC_VERSION_LARGE > 0x06050200 + const Handle(IntTools_Context)& aCtx) +#else + IntTools_Context& aCtx) +#endif { Standard_Boolean bIsDone; Standard_Real aTol2, aD2; @@ -266,12 +286,12 @@ Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopoDS_Shape& aE1, else { bIsDone=GEOMAlgo_Tools::ProjectPointOnShape(aP1, aE2, aP2, aCtx); if (!bIsDone) { - //return 1; - continue; // jfa BUG 20361 + //return 1; + continue; // jfa BUG 20361 } aD2=aP1.SquareDistance(aP2); if(aD2 0x06050200 + const Handle(IntTools_Context)& aCtx) +#else + IntTools_Context& aCtx) +#endif { Standard_Boolean bIsDone = Standard_False; Standard_Real aT2; @@ -307,7 +331,11 @@ Standard_Boolean GEOMAlgo_Tools::ProjectPointOnShape(const gp_Pnt& aP1, if (aC3D.IsNull()) { return Standard_True; } +#if OCC_VERSION_LARGE > 0x06050200 + bIsDone = aCtx->ProjectPointOnEdge(aP1, aE2, aT2); +#else bIsDone = aCtx.ProjectPointOnEdge(aP1, aE2, aT2); +#endif } if (!bIsDone) { return bIsDone; @@ -320,7 +348,11 @@ Standard_Boolean GEOMAlgo_Tools::ProjectPointOnShape(const gp_Pnt& aP1, case TopAbs_FACE: { const TopoDS_Face& aF2 = TopoDS::Face(aS); +#if OCC_VERSION_LARGE > 0x06050200 + GeomAPI_ProjectPointOnSurf& aProj = aCtx->ProjPS(aF2); +#else GeomAPI_ProjectPointOnSurf& aProj = aCtx.ProjPS(aF2); +#endif // aProj.Perform(aP1); bIsDone = aProj.IsDone(); @@ -328,10 +360,10 @@ Standard_Boolean GEOMAlgo_Tools::ProjectPointOnShape(const gp_Pnt& aP1, return bIsDone; } // - aP2 = aProj.NearestPoint(); + aP2 = aProj.NearestPoint(); } break; - // + // default: break; // Err } @@ -339,10 +371,10 @@ Standard_Boolean GEOMAlgo_Tools::ProjectPointOnShape(const gp_Pnt& aP1, } //======================================================================= //function : PointOnShape -//purpose : +//purpose : //======================================================================= void GEOMAlgo_Tools::PointOnShape(const TopoDS_Shape& aS, - gp_Pnt& aP3D) + gp_Pnt& aP3D) { TopAbs_ShapeEnum aType; // @@ -360,35 +392,35 @@ void GEOMAlgo_Tools::PointOnShape(const TopoDS_Shape& aS, GEOMAlgo_Tools::PointOnFace(aF, aP3D); } break; - // + // default: break; // Err } } //======================================================================= //function : PointOnFace -//purpose : +//purpose : //======================================================================= void GEOMAlgo_Tools::PointOnFace(const TopoDS_Face& aF, - gp_Pnt& aP3D) + gp_Pnt& aP3D) { Standard_Real aU, aV, aUMin, aUMax, aVMin, aVMax; // BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax); // - aU=BOPTools_Tools2D::IntermediatePoint(aUMin, aUMax); - aV=BOPTools_Tools2D::IntermediatePoint(aVMin, aVMax); + aU=BOPTools_Tools2D::IntermediatePoint(aUMin, aUMax); + aV=BOPTools_Tools2D::IntermediatePoint(aVMin, aVMax); // GEOMAlgo_Tools::PointOnFace(aF, aU, aV, aP3D); } //======================================================================= //function : PointOnFace -//purpose : +//purpose : //======================================================================= void GEOMAlgo_Tools::PointOnFace(const TopoDS_Face& aF, - const Standard_Real aU, - const Standard_Real aV, - gp_Pnt& aP3D) + const Standard_Real aU, + const Standard_Real aV, + gp_Pnt& aP3D) { Handle(Geom_Surface) aS; // @@ -397,10 +429,10 @@ void GEOMAlgo_Tools::PointOnFace(const TopoDS_Face& aF, } //======================================================================= //function : PointOnEdge -//purpose : +//purpose : //======================================================================= void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE, - gp_Pnt& aP3D) + gp_Pnt& aP3D) { Standard_Real aTx, aT1, aT2; // @@ -410,11 +442,11 @@ void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE, } //======================================================================= //function : PointOnEdge -//purpose : +//purpose : //======================================================================= void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE, - const Standard_Real aT, - gp_Pnt& aP3D) + const Standard_Real aT, + gp_Pnt& aP3D) { Standard_Real aT1, aT2; Handle(Geom_Curve) aC3D; @@ -424,21 +456,19 @@ void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE, } //======================================================================= //function : RefinePCurveForEdgeOnFace -//purpose : +//purpose : //======================================================================= void GEOMAlgo_Tools::RefinePCurveForEdgeOnFace(const TopoDS_Edge& aE, - const TopoDS_Face& aF, - const Standard_Real aUMin, - const Standard_Real aUMax) + const TopoDS_Face& aF, + const Standard_Real aUMin, + const Standard_Real aUMax) { - Standard_Real aT1, aT2, aTx, aUx, aTol, aTwoPI; + Standard_Real aT1, aT2, aTx, aUx, aTol; gp_Pnt2d aP2D; Handle(Geom_Surface) aS; Handle(Geom2d_Curve) aC2D; BRep_Builder aBB; // - aTwoPI=PI+PI; - // aC2D=BRep_Tool::CurveOnSurface(aE, aF, aT1, aT2); if (!aC2D.IsNull()) { if (BRep_Tool::IsClosed(aE, aF)) { @@ -452,13 +482,13 @@ void GEOMAlgo_Tools::RefinePCurveForEdgeOnFace(const TopoDS_Edge& aE, Handle(Geom2d_Curve) aC2Dx; // aTol=BRep_Tool::Tolerance(aE); - aBB.UpdateEdge(aE, aC2Dx, aF, aTol); + aBB.UpdateEdge(aE, aC2Dx, aF, aTol); } } } //======================================================================= //function : IsUPeriodic -//purpose : +//purpose : //======================================================================= Standard_Boolean GEOMAlgo_Tools::IsUPeriodic(const Handle(Geom_Surface) &aS) { @@ -469,8 +499,148 @@ Standard_Boolean GEOMAlgo_Tools::IsUPeriodic(const Handle(Geom_Surface) &aS) aGAS.Load(aS); aType=aGAS.GetType(); bRet=(aType==GeomAbs_Cylinder|| - aType==GeomAbs_Cone || - aType==GeomAbs_Sphere); + aType==GeomAbs_Cone || + aType==GeomAbs_Sphere); // return bRet; } + +//modified by NIZNHY-PKV Fri Feb 03 11:16:35 2012f +//======================================================================= +//function : BuildPCurveForEdgeOnFace +//purpose : +//======================================================================= +Standard_Integer + GEOMAlgo_Tools::BuildPCurveForEdgeOnFace(const TopoDS_Edge& aEold, + const TopoDS_Edge& aEnew, + const TopoDS_Face& aF, +#if OCC_VERSION_LARGE > 0x06050200 + const Handle(IntTools_Context)& aCtx) +#else + IntTools_Context& aCtx) +#endif +{ + Standard_Boolean bIsClosed, bUClosed, bHasOld; + Standard_Integer iRet, aNbPoints; + Standard_Real aTS, aTS1, aTS2, aT, aT1, aT2, aScPr, aTol; + Standard_Real aU, aV, aUS1, aVS1, aUS2, aVS2; + gp_Pnt aP; + gp_Pnt2d aP2DS1, aP2DS2, aP2D; + gp_Vec2d aV2DS1, aV2DS2; + Handle(Geom2d_Curve) aC2D, aC2DS1, aC2DS2; + Handle(Geom_Surface) aS; + TopoDS_Edge aES; + // + iRet=0; + // + bHasOld=BOPTools_Tools2D::HasCurveOnSurface(aEnew, aF, aC2D, aT1, aT2, aTol); + if (bHasOld) { + return iRet; + } + // + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aEnew, aF); + aC2D=BRep_Tool::CurveOnSurface(aEnew, aF, aT1, aT2); + if (aC2D.IsNull()){ + iRet=1; + return iRet; + } + // + bIsClosed=BRep_Tool::IsClosed(aEold, aF); + if (!bIsClosed) { + return iRet; + } + // + aTol=1.e-7; + // + // 1. bUClosed - direction of closeness + // + aES=aEold; + aES.Orientation(TopAbs_FORWARD); + aC2DS1=BRep_Tool::CurveOnSurface(aES, aF, aTS1, aTS2); + // + aES.Orientation(TopAbs_REVERSED); + aC2DS2=BRep_Tool::CurveOnSurface(aES, aF, aTS1, aTS2); + // + aTS=BOPTools_Tools2D::IntermediatePoint(aTS1, aTS2); + // + aC2DS1->D1(aTS, aP2DS1, aV2DS1); + aC2DS2->D1(aTS, aP2DS2, aV2DS2); + // + gp_Vec2d aV2DS12(aP2DS1, aP2DS2); + gp_Dir2d aD2DS12(aV2DS12); + const gp_Dir2d& aD2DX=gp::DX2d(); + // + aScPr=aD2DS12*aD2DX; + bUClosed=Standard_True; + if (fabs(aScPr) < aTol) { + bUClosed=!bUClosed; + } + // + // 2. aP2D - point on curve aC2D, that corresponds to aP2DS1 + aP2DS1.Coord(aUS1, aVS1); + aP2DS2.Coord(aUS2, aVS2); + // + aS=BRep_Tool::Surface(aF); + aS->D0(aUS1, aVS1, aP); + // +#if OCC_VERSION_LARGE > 0x06050200 + GeomAPI_ProjectPointOnCurve& aProjPC=aCtx->ProjPC(aEnew); +#else + GeomAPI_ProjectPointOnCurve& aProjPC=aCtx.ProjPC(aEnew); +#endif + // + aProjPC.Perform(aP); + aNbPoints=aProjPC.NbPoints(); + if (!aNbPoints) { + iRet=2; + return iRet; + } + // + aT=aProjPC.LowerDistanceParameter(); + + // + // 3. Build the second 2D curve + Standard_Boolean bRevOrder; + gp_Vec2d aV2DT, aV2D; + Handle(Geom2d_Curve) aC2Dnew; + Handle(Geom2d_TrimmedCurve) aC2DTnew; + BRep_Builder aBB; + // + aC2D->D1(aT, aP2D, aV2D); + aP2D.Coord(aU, aV); + // + aC2Dnew=Handle(Geom2d_Curve)::DownCast(aC2D->Copy()); + aC2DTnew = new Geom2d_TrimmedCurve(aC2Dnew, aT1, aT2); + // + aV2DT=aV2DS12; + if (!bUClosed) { // V Closed + if (fabs(aV-aVS2)Translate(aV2DT); + // + // 4 Order the 2D curves + bRevOrder=Standard_False; + aScPr=aV2D*aV2DS1; + if(aScPr<0.) { + bRevOrder=!bRevOrder; + } + // + // 5. Update the edge + aTol=BRep_Tool::Tolerance(aEnew); + if (!bRevOrder) { + aBB.UpdateEdge(aEnew, aC2D, aC2DTnew, aF, aTol); + } + else { + aBB.UpdateEdge(aEnew, aC2DTnew, aC2D , aF, aTol); + } + // + return iRet; +}