From: mzn Date: Wed, 20 Nov 2013 15:50:57 +0000 (+0000) Subject: Improve of retrieving shapes from region and case. X-Git-Tag: BR_hydro_v_0_3_1~33 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=aa24041c7f0529a27ebde5b1d5c0c201c5581c54;p=modules%2Fhydro.git Improve of retrieving shapes from region and case. --- diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index 39e5489e..301d043b 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -11,8 +11,11 @@ #include "HYDROData_Tool.h" #include "HYDROData_Zone.h" +#include #include #include +#include +#include #define CALCULATION_REGIONS_PREF GetName() + "_Reg" #define CALCULATION_ZONES_PREF GetName() + "_Zone" @@ -328,12 +331,60 @@ TopoDS_Shell HYDROData_CalculationCase::GetShell() { TopoDS_Shell aShell; + // Make shell containing all region shapes + BRepBuilderAPI_Sewing aSewing( Precision::Confusion()*10.0 ); + + HYDROData_SequenceOfObjects aCaseRegions = GetRegions(); + HYDROData_SequenceOfObjects::Iterator aRegionIter( aCaseRegions ); + for ( ; aRegionIter.More(); aRegionIter.Next() ) { + Handle(HYDROData_Region) aRegion = + Handle(HYDROData_Region)::DownCast( aRegionIter.Value() ); + if( aRegion.IsNull() ) { + continue; + } + + TopoDS_Shape aRegionShape = aRegion->GetShape(); + if( !aRegionShape.IsNull() ) { + aSewing.Add( aRegionShape ); + } + } // regions iterator + + aSewing.Perform(); + TopoDS_Shape aSewedShape = aSewing.SewedShape(); + + if ( aSewedShape.ShapeType() == TopAbs_FACE && aCaseRegions.Length() ==1 ) { + // create shell from one face + BRep_Builder aBuilder; + aBuilder.MakeShell( aShell ); + aBuilder.Add( aShell, aSewedShape); + } else { + TopExp_Explorer anExpShells( aSewedShape, TopAbs_SHELL ); + Standard_Integer aNbOfShells = 0; + for ( ; anExpShells.More(); anExpShells.Next() ) { + aShell = TopoDS::Shell( anExpShells.Current() ); + aNbOfShells++; + } + + if ( aNbOfShells != 1 ) { + aShell.Nullify(); + BRep_Builder aBuilder; + aBuilder.MakeShell( aShell ); + + TopExp_Explorer anExpFaces( aSewedShape, TopAbs_FACE ); + for ( ; anExpFaces.More(); anExpFaces.Next() ) { + TopoDS_Face aFace = TopoDS::Face( anExpFaces.Current() ); + if ( !aFace.IsNull() ) { + aBuilder.Add( aShell, aFace ); + } + } + } + } + +/* TODO: old version // Make shell BRep_Builder aBuilder; aBuilder.MakeShell( aShell ); - bool isShellEmpty = true; - // Make shell containing all region shapes HYDROData_SequenceOfObjects aCaseRegions = GetRegions(); HYDROData_SequenceOfObjects::Iterator aRegionIter( aCaseRegions ); @@ -348,13 +399,23 @@ TopoDS_Shell HYDROData_CalculationCase::GetShell() // Add shape (face or shell) corresponding to the region into the shell if( !aRegionShape.IsNull() ) { - aBuilder.Add( aShell, aRegionShape ); - isShellEmpty = false; + if ( aRegionShape.ShapeType() == TopAbs_FACE ) { + aBuilder.Add( aShell, aRegionShape ); + } else { + TopExp_Explorer anExp( aRegionShape, TopAbs_FACE ); + for( ; anExp.More(); anExp.Next() ) { + TopoDS_Face aFace = TopoDS::Face( anExp.Current() ); + if( !aFace.IsNull() ) { + aBuilder.Add( aShell, aFace ); + } + } + } } } // regions iterator +*/ - // Check if no shapes were added to the shell - if ( isShellEmpty ) { + // Nullify shell if it is empty + if ( !aShell.IsNull() && !TopoDS_Iterator(aShell).More() ) { aShell.Nullify(); } diff --git a/src/HYDROData/HYDROData_Region.cxx b/src/HYDROData/HYDROData_Region.cxx index 384b4bd2..090171f9 100644 --- a/src/HYDROData/HYDROData_Region.cxx +++ b/src/HYDROData/HYDROData_Region.cxx @@ -12,10 +12,11 @@ #include #include #include -#include -#include +#include +#include #include #include +#include #include @@ -196,19 +197,16 @@ TopoDS_Shape HYDROData_Region::GetShape() const } } // faces iterator + // Check the result of fuse operation if ( !aFuseShape.IsNull() ) { ShapeUpgrade_UnifySameDomain anUnifier( aFuseShape ); - anUnifier.UnifyFacesAndEdges(); anUnifier.Build(); TopoDS_Shape anUnitedShape = anUnifier.Shape(); - TopExp_Explorer anExp( anUnitedShape, TopAbs_FACE ); - if ( anExp.More() ) { - aRegionFace = TopoDS::Face( anExp.Current() ); - anExp.Next(); - if ( anExp.More() ) { - aRegionFace.Nullify(); - } + TopTools_IndexedMapOfShape aMapOfFaces; + TopExp::MapShapes( anUnitedShape, TopAbs_FACE, aMapOfFaces ); + if ( aMapOfFaces.Extent() == 1 ) { + aRegionFace = TopoDS::Face( aMapOfFaces(1) ); } } }