X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_Tools.cxx;h=65250c36468210ed0e1edaa46aaad7dd5079f197;hb=52a39bebf31f3f73230d6d6ac4ff127c8ca421dc;hp=452fc7a433b35f8e09c1a69b14929017b6e54f2f;hpb=6101c761432c310cdbc39f0a9715dcc343ac77fd;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_Tools.cxx b/src/GEOMAlgo/GEOMAlgo_Tools.cxx index 452fc7a43..65250c364 100644 --- a/src/GEOMAlgo/GEOMAlgo_Tools.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Tools.cxx @@ -1,3 +1,22 @@ +// 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. +// +// 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 @@ -6,9 +25,12 @@ #include #include +#include #include #include +#include +#include #include @@ -17,28 +39,77 @@ #include #include #include +#include #include #include #include #include -#include +#include #include #include #include -#include -#include +#include //qft +#include //qft + +static + void GetCount(const TopoDS_Shape& aS, + Standard_Integer& iCnt); + +//======================================================================= +//function : IsCompositeShape +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Tools::IsCompositeShape(const TopoDS_Shape& aS) +{ + Standard_Boolean bRet; + Standard_Integer iCnt; + TopoDS_Iterator aIt; + // + iCnt=0; + GetCount(aS, iCnt); + bRet=(iCnt>1); + // + return bRet; +} + +//======================================================================= +//function : GetCount +//purpose : +//======================================================================= +void GetCount(const TopoDS_Shape& aS, + Standard_Integer& iCnt) +{ + TopoDS_Iterator aIt; + TopAbs_ShapeEnum aTS; + // + aTS=aS.ShapeType(); + // + if (aTS==TopAbs_SHAPE) { + return; + } + if (aTS!=TopAbs_COMPOUND) { + ++iCnt; + return; + } + // + aIt.Initialize(aS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSx=aIt.Value(); + GetCount(aSx, iCnt); + } +} //======================================================================= //function : RefineSDShapes //purpose : //======================================================================= -Standard_Integer GEOMAlgo_Tools::RefineSDShapes(GEOMAlgo_IndexedDataMapOfPassKeyListOfShape &aMPKLE, - const Standard_Real aTol, - IntTools_Context& aCtx) + Standard_Integer GEOMAlgo_Tools::RefineSDShapes(GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape& aMPKLE, + const Standard_Real aTol, + IntTools_Context& aCtx) { Standard_Integer i, aNbE, iErr, j, aNbEE, aNbToAdd; TopTools_IndexedDataMapOfShapeListOfShape aMEE, aMSDE, aMEToAdd; @@ -48,8 +119,8 @@ Standard_Integer GEOMAlgo_Tools::RefineSDShapes(GEOMAlgo_IndexedDataMapOfPassKey aNbE=aMPKLE.Extent(); for (i=1; i<=aNbE; ++i) { TopTools_ListOfShape& aLSDE=aMPKLE.ChangeFromIndex(i); - aMEE.Clear(); // + aMEE.Clear(); iErr=GEOMAlgo_Tools::FindSDShapes(aLSDE, aTol, aMEE, aCtx); if (iErr) { return iErr; @@ -80,12 +151,15 @@ Standard_Integer GEOMAlgo_Tools::RefineSDShapes(GEOMAlgo_IndexedDataMapOfPassKey } // for (i=1; i<=aNbToAdd; ++i) { - GEOMAlgo_PassKey aPKE1; + GEOMAlgo_PassKeyShape aPKE1; // const TopoDS_Shape& aE1=aMEToAdd.FindKey(i); const TopTools_ListOfShape& aLE=aMEToAdd(i); // - aPKE1.SetIds(aE1); + //qf + //aPKE1.SetIds(aE1); + aPKE1.SetShapes(aE1); + //qt aMPKLE.Add(aPKE1, aLE); } // @@ -104,11 +178,17 @@ Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopTools_ListOfShape& aLE, TopTools_ListOfShape aLESD; TopTools_ListIteratorOfListOfShape aIt, aIt1; TopTools_IndexedMapOfShape aMProcessed; + TopAbs_ShapeEnum aType; // 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) { aNbEProcessed=aMProcessed.Extent(); @@ -119,10 +199,22 @@ Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopTools_ListOfShape& aLE, aIt.Initialize(aLE); for (; aIt.More(); aIt.Next()) { const TopoDS_Shape& aS=aIt.Value(); + // if (aMProcessed.Contains(aS)) { 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; + } + } + //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) { @@ -314,84 +406,55 @@ void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE, aC3D=BRep_Tool::Curve(aE, aT1, aT2); aC3D->D0(aT, aP3D); } -/* //======================================================================= -//function : FindSDEdges +//function : RefinePCurveForEdgeOnFace //purpose : //======================================================================= -Standard_Integer GEOMAlgo_Tools::FindSDEdges(const TopoDS_Edge& aE1, - const TopTools_ListOfShape& aLE, - const Standard_Real aTol, - TopTools_ListOfShape& aLESD, - IntTools_Context& aCtx) +void GEOMAlgo_Tools::RefinePCurveForEdgeOnFace(const TopoDS_Edge& aE, + const TopoDS_Face& aF, + const Standard_Real aUMin, + const Standard_Real aUMax) { - Standard_Boolean bIsDone; - Standard_Real aT2, aTol2, aD2; - gp_Pnt aP1, aP2; - TopTools_ListIteratorOfListOfShape aIt; + Standard_Real aT1, aT2, aTx, aUx, aTol, aTwoPI; + gp_Pnt2d aP2D; + Handle(Geom_Surface) aS; + Handle(Geom2d_Curve) aC2D; + BRep_Builder aBB; // - aTol2=aTol*aTol; + aTwoPI=PI+PI; // - GEOMAlgo_Tools::PointOnEdge(aE1, aP1); - aIt.Initialize(aLE); - for (; aIt.More(); aIt.Next()) { - const TopoDS_Edge& aE2=TopoDS::Edge(aIt.Value()); - if (aE2.IsSame(aE1)) { - aLESD.Append(aE2); + aC2D=BRep_Tool::CurveOnSurface(aE, aF, aT1, aT2); + if (!aC2D.IsNull()) { + if (BRep_Tool::IsClosed(aE, aF)) { + return; } - else { - bIsDone=aCtx.ProjectPointOnEdge(aP1, aE2, aT2); - if (!bIsDone) { - return 1; - } - GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2); - aD2=aP1.SquareDistance(aP2); - if(aD2D0(aTx, aP2D); + aUx=aP2D.X(); + if (aUx < aUMin || aUx > aUMax) { + // need to rebuild + Handle(Geom2d_Curve) aC2Dx; + // + aTol=BRep_Tool::Tolerance(aE); + aBB.UpdateEdge(aE, aC2Dx, aF, aTol); } } - return 0; } //======================================================================= -//function : FindSDFaces +//function : IsUPeriodic //purpose : //======================================================================= -Standard_Integer GEOMAlgo_Tools::FindSDFaces(const TopoDS_Face& aF1, - const TopTools_ListOfShape& aLF, - const Standard_Real aTol, - TopTools_ListOfShape& aLFSD, - IntTools_Context& aCtx) +Standard_Boolean GEOMAlgo_Tools::IsUPeriodic(const Handle(Geom_Surface) &aS) { - Standard_Boolean bIsDone; - Standard_Real aTol2, aD2; - gp_Pnt aP1, aP2; - TopTools_ListIteratorOfListOfShape aIt; + Standard_Boolean bRet; + GeomAbs_SurfaceType aType; + GeomAdaptor_Surface aGAS; // - aTol2=aTol*aTol; + aGAS.Load(aS); + aType=aGAS.GetType(); + bRet=(aType==GeomAbs_Cylinder|| + aType==GeomAbs_Cone || + aType==GeomAbs_Sphere); // - GEOMAlgo_Tools::PointOnFace(aF1, aP1); - aIt.Initialize(aLF); - for (; aIt.More(); aIt.Next()) { - const TopoDS_Face& aF2=TopoDS::Face(aIt.Value()); - if (aF2.IsSame(aF1)) { - aLFSD.Append(aF2); - } - else { - GeomAPI_ProjectPointOnSurf& aProj=aCtx.ProjPS(aF2); - aProj.Perform(aP1); - bIsDone=aProj.IsDone(); - if (!bIsDone) { - return 1; //?? - } - // - aP2=aProj.NearestPoint(); - aD2=aP1.SquareDistance(aP2); - if(aD2