X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FBlockFix_CheckTool.cxx;h=d80c6fd0dad75415c50ee46f2a56798a75ecfb82;hb=004197ec827d52331f0d529202eb4e52a1c4388f;hp=ba902ba5ab6edd47d314af5e5d70eb3babb03bcd;hpb=ca429d817a18d6acc571443f6a596575dee03c2f;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/BlockFix_CheckTool.cxx b/src/GEOMAlgo/BlockFix_CheckTool.cxx index ba902ba5a..d80c6fd0d 100644 --- a/src/GEOMAlgo/BlockFix_CheckTool.cxx +++ b/src/GEOMAlgo/BlockFix_CheckTool.cxx @@ -1,13 +1,36 @@ -// File: BlockFix_CheckTool.cxx -// Created: 17.12.04 11:15:25 -// Author: Sergey KUUL -// Copyright: Open CASCADE SA 2004 +// Copyright (C) 2007-2010 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 +// +// 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: BlockFix_CheckTool.cxx +// Created: 17.12.04 11:15:25 +// Author: Sergey KUUL +// #include +//#include +//#include + #include -#include -#include + #include #include #include @@ -54,36 +77,47 @@ void BlockFix_CheckTool::Perform() { myNbSolids=0; myNbBlocks=0; + myNbDegen=0; myNbUF=0; myNbUE=0; myNbUFUE=0; - TopExp_Explorer exps; - for(exps.Init(myShape, TopAbs_SOLID); exps.More(); exps.Next()) { + + TopExp_Explorer exps (myShape, TopAbs_SOLID); + TopTools_MapOfShape mapS; + for (; exps.More(); exps.Next()) { TopoDS_Solid aSolid = TopoDS::Solid(exps.Current()); + if (!mapS.Add(aSolid)) continue; myNbSolids++; Standard_Boolean IsBlock=Standard_True; Standard_Boolean MayBeUF=Standard_False; Standard_Boolean MayBeUE=Standard_False; Standard_Integer nf=0; - TopExp_Explorer expf; - for(expf.Init(aSolid, TopAbs_FACE); expf.More(); expf.Next()) nf++; + TopExp_Explorer expf (aSolid, TopAbs_FACE); + TopTools_MapOfShape mapF; + for (; expf.More(); expf.Next()) { + if (mapF.Add(expf.Current())) + nf++; + } - if(nf<6) { - IsBlock=Standard_False; + if (nf < 6) { + IsBlock = Standard_False; } - else if(nf>6) { - IsBlock=Standard_False; + else if (nf > 6) { + IsBlock = Standard_False; // check faces unification TopTools_SequenceOfShape faces; - for( expf.Init(aSolid, TopAbs_FACE); expf.More(); expf.Next()) { - TopoDS_Face aFace = TopoDS::Face(expf.Current()); - faces.Append(aFace); + mapF.Clear(); + for (expf.Init(aSolid, TopAbs_FACE); expf.More(); expf.Next()) { + if (mapF.Add(expf.Current())) { + TopoDS_Face aFace = TopoDS::Face(expf.Current()); + faces.Append(aFace); + } } Standard_Boolean HasFacesForUnification = Standard_False; - for(Standard_Integer i=1; i12) { - IsBlock=Standard_False; + Standard_Integer nbe=0; + TopTools_MapOfShape DegenEdges; + TopExp_Explorer expe (aSolid, TopAbs_EDGE); + TopTools_MapOfShape mapE; + for (; expe.More(); expe.Next()) { + TopoDS_Edge E = TopoDS::Edge(expe.Current()); + if (!mapE.Add(E)) continue; + if (BRep_Tool::Degenerated(E)) { + DegenEdges.Add(E); + } + else { + nbe++; + } + } + if (nbe == 12 && DegenEdges.Extent() > 0) { + IsBlock = Standard_False; + myNbDegen++; + myPossibleBlocks.Append(aSolid); + continue; + } + if (nbe < 12) + IsBlock = Standard_False; + if (nbe > 12) { + IsBlock = Standard_False; // check edges unification // creating map of edge faces TopTools_IndexedDataMapOfShapeListOfShape aMapEdgeFaces; TopExp::MapShapesAndAncestors(aSolid, TopAbs_EDGE, TopAbs_FACE, aMapEdgeFaces); - for(expf.Init(aSolid, TopAbs_FACE); expf.More(); expf.Next()) { + + mapF.Clear(); + for (expf.Init(aSolid, TopAbs_FACE); expf.More(); expf.Next()) { TopoDS_Face aFace = TopoDS::Face(expf.Current()); + if (!mapF.Add(aFace)) continue; TopTools_IndexedDataMapOfShapeListOfShape aMapFacesEdges; - for(expe.Init(aFace,TopAbs_EDGE); expe.More(); expe.Next()) { + + TopTools_MapOfShape mapEe; + for (expe.Init(aFace, TopAbs_EDGE); expe.More(); expe.Next()) { TopoDS_Edge edge = TopoDS::Edge(expe.Current()); - if(!aMapEdgeFaces.Contains(edge)) continue; + if (!mapEe.Add(edge)) continue; + if (!aMapEdgeFaces.Contains(edge)) continue; const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge); - TopTools_ListIteratorOfListOfShape anIter(aList); - for( ; anIter.More(); anIter.Next()) { + TopTools_ListIteratorOfListOfShape anIter (aList); + for (; anIter.More(); anIter.Next()) { TopoDS_Face face = TopoDS::Face(anIter.Value()); - if(face.IsSame(aFace)) continue; - if(aMapFacesEdges.Contains(face)) { + if (face.IsSame(aFace)) continue; + if (aMapFacesEdges.Contains(face)) { aMapFacesEdges.ChangeFromKey(face).Append(edge); } else { @@ -153,22 +209,21 @@ void BlockFix_CheckTool::Perform() } } - if(IsBlock) + if (IsBlock) myNbBlocks++; else { - if(MayBeUF) { + if (MayBeUF) { myPossibleBlocks.Append(aSolid); - if(MayBeUE) + if (MayBeUE) myNbUFUE++; else myNbUF++; } - else if(MayBeUE) { + else if (MayBeUE) { myNbUE++; myPossibleBlocks.Append(aSolid); } } - } myHasCheck = Standard_True; @@ -214,11 +269,11 @@ void BlockFix_CheckTool::DumpCheckResult(Standard_OStream& S) const S<<" total number of solids = "<