From 6e326140008102ee0405228ef542b1e425513e16 Mon Sep 17 00:00:00 2001 From: mzn Date: Tue, 17 Dec 2013 11:57:39 +0000 Subject: [PATCH] Feature #233: Export of groups. Further implementation of HYDROData_CalculationCase::Export() method. Remove HYDROData_CalculationCase::GetShell() method. --- src/HYDROData/HYDROData_CalculationCase.cxx | 261 +++++--------------- src/HYDROData/HYDROData_CalculationCase.h | 6 - 2 files changed, 63 insertions(+), 204 deletions(-) diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index 4439850a..1f74601d 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -16,6 +16,8 @@ #include +#include + #include #include #include @@ -497,137 +499,6 @@ void HYDROData_CalculationCase::RemoveSplittedGroups() myLab.FindChild( DataTag_SplittedGroups ).ForgetAllAttributes(); } -TopoDS_Shell HYDROData_CalculationCase::GetShell() -{ - TopoDS_Shell aShell; - - TopTools_ListOfShape aFacesList; - - // 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() ) { - if ( aRegionShape.ShapeType() == TopAbs_FACE ) { - TopoDS_Face aFace = TopoDS::Face( aRegionShape ); - if ( !aFace.IsNull() ) { - aFacesList.Append( aFace ); - aSewing.Add( aFace ); - } - } else { - TopExp_Explorer anExp( aRegionShape, TopAbs_FACE ); - for ( ; anExp.More(); anExp.Next() ) { - TopoDS_Face aFace = TopoDS::Face( anExp.Current() ); - if ( !aFace.IsNull() ) { - aFacesList.Append( aFace ); - aSewing.Add( aFace ); - } - } - } - } - } // regions iterator - - aSewing.Perform(); - TopoDS_Shape aSewedShape = aSewing.SewedShape(); - - if ( !aSewedShape.IsNull() ) - { - 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 ); - } - } - } - } - } - - if ( !aShell.IsNull() ) { - TopTools_IndexedMapOfShape aMapOfFaces; - TopExp::MapShapes( aShell, TopAbs_FACE, aMapOfFaces ); - if ( aMapOfFaces.Extent() != aFacesList.Extent() ) { - aShell.Nullify(); - BRep_Builder aBuilder; - aBuilder.MakeShell( aShell ); - - TopTools_ListIteratorOfListOfShape anIter( aFacesList ); - for ( ; anIter.More(); anIter.Next() ) { - TopoDS_Face aFace = TopoDS::Face( anIter.Value() ); - aBuilder.Add( aShell, aFace ); - } - } - } - -/* TODO: old version - // Make shell - BRep_Builder aBuilder; - aBuilder.MakeShell( aShell ); - - // Make shell containing all region shapes - 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(); - - // Add shape (face or shell) corresponding to the region into the shell - if( !aRegionShape.IsNull() ) { - 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 -*/ - - // Nullify shell if it is empty - if ( !aShell.IsNull() && !TopoDS_Iterator(aShell).More() ) { - aShell.Nullify(); - } - - return aShell; -} - double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& thePoint ) const { double aResAltitude = HYDROData_Bathymetry::GetInvalidAltitude(); @@ -795,11 +666,9 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, const TopTools_ListOfShape& theFaces, const HYDROData_SequenceOfObjects& theSplittedGroups ) { - // Make shell from the faces - TopoDS_Shell aShell; - TopTools_ListOfShape aFacesList; - + // Sew faces BRepBuilderAPI_Sewing aSewing( Precision::Confusion()*10.0 ); + aSewing.SetNonManifoldMode( Standard_True ); TopTools_ListIteratorOfListOfShape aFaceIter( theFaces ); for ( ; aFaceIter.More(); aFaceIter.Next() ) { @@ -807,7 +676,6 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, if ( !aShape.IsNull() && (aShape.ShapeType() == TopAbs_FACE) ) { TopoDS_Face aFace = TopoDS::Face( aShape ); if ( !aFace.IsNull() ) { - aFacesList.Append( aFace ); aSewing.Add( aFace ); } } else { @@ -815,7 +683,6 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, for ( ; anExp.More(); anExp.Next() ) { TopoDS_Face aFace = TopoDS::Face( anExp.Current() ); if ( !aFace.IsNull() ) { - aFacesList.Append( aFace ); aSewing.Add( aFace ); } } @@ -825,77 +692,75 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, aSewing.Perform(); TopoDS_Shape aSewedShape = aSewing.SewedShape(); - if ( !aSewedShape.IsNull() ) { - if ( aSewedShape.ShapeType() == TopAbs_FACE && theFaces.Extent() ==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 ); - } - } - } - } - } - - if ( !aShell.IsNull() ) { - TopTools_IndexedMapOfShape aMapOfFaces; - TopExp::MapShapes( aShell, TopAbs_FACE, aMapOfFaces ); - if ( aMapOfFaces.Extent() != aFacesList.Extent() ) { - aShell.Nullify(); - BRep_Builder aBuilder; - aBuilder.MakeShell( aShell ); - - TopTools_ListIteratorOfListOfShape anIter( aFacesList ); - for ( ; anIter.More(); anIter.Next() ) { - TopoDS_Face aFace = TopoDS::Face( anIter.Value() ); - aBuilder.Add( aShell, aFace ); - } - } - } - - // If the shell is empty - return false - if ( aShell.IsNull() || !TopoDS_Iterator(aShell).More() ) { + // If the sewed shape is empty - return false + if ( aSewedShape.IsNull() || !TopoDS_Iterator(aSewedShape).More() ) { return false; } - // Publish the shell + // Publish the sewed shape QString aName = EXPORT_NAME; - GEOM::GEOM_Object_ptr aPublishedObj = - publishShapeInGEOM( theGeomEngine, theStudy, aShell, aName ); + GEOM::GEOM_Object_ptr aMainShape = + publishShapeInGEOM( theGeomEngine, theStudy, aSewedShape, aName ); - if ( aPublishedObj->_is_nil() ) { + if ( aMainShape->_is_nil() ) { return false; } // Create groups + TopTools_IndexedMapOfShape aMapOfSubShapes; + TopExp::MapShapes( aSewedShape, aMapOfSubShapes ); + + QHash> aGroupsData; + + HYDROData_SequenceOfObjects::Iterator anIter( theSplittedGroups ); + for ( ; anIter.More(); anIter.Next() ) { + // Get shapes group + Handle(HYDROData_ShapesGroup) aGroup = + Handle(HYDROData_ShapesGroup)::DownCast( anIter.Value() ); + if ( aGroup.IsNull() ) { + continue; + } + + QSet anIndexes; + + // Get shapes of the group + TopTools_SequenceOfShape aShapes; + aGroup->GeShapes( aShapes ); + for( int i = 1, aNbShapes = aShapes.Length(); i <= aNbShapes; i++ ) { + const TopoDS_Shape& aShape = aShapes.Value( i ); + const TopoDS_Shape ModifiedShape = aSewing.Modified( aShape ); + if ( !ModifiedShape.IsNull() ) { + int anIndex = aMapOfSubShapes.FindIndex( ModifiedShape ); + if ( anIndex > 0 ) { + anIndexes << anIndex; + } + } + } + + if ( anIndexes.count() > 0 ) { + aGroupsData.insert( aGroup->GetName(), anIndexes ); + } + } + GEOM::GEOM_IGroupOperations_var aGroupOp = - theGeomEngine->GetIGroupOperations( theStudy->StudyId() ); - - GEOM::GEOM_Object_var aGroup = aGroupOp->CreateGroup( aPublishedObj, TopAbs_EDGE ); - if ( !CORBA::is_nil(aGroup) && aGroupOp->IsDone() ) { - GEOM::ListOfLong_var anIndexes = new GEOM::ListOfLong; - aGroupOp->UnionIDs( aGroup, anIndexes ); - if ( aGroupOp->IsDone() ) { - SALOMEDS::SObject_var aGroupSO = - theGeomEngine->AddInStudy( theStudy, aGroup, qPrintable( aName ), aPublishedObj ); + theGeomEngine->GetIGroupOperations( theStudy->StudyId() ); + + foreach ( const QString& aGroupName, aGroupsData.keys() ) { + QSet aGroupIndexes = aGroupsData.value( aGroupName ); + + GEOM::GEOM_Object_var aGroup = aGroupOp->CreateGroup( aMainShape, TopAbs_EDGE ); + if ( !CORBA::is_nil(aGroup) && aGroupOp->IsDone() ) { + GEOM::ListOfLong_var anIndexes = new GEOM::ListOfLong; + int aListIndex = 0; + foreach ( const int anIndex, aGroupIndexes ) { + anIndexes[aListIndex++] = anIndex; + } + + aGroupOp->UnionIDs( aGroup, anIndexes ); + if ( aGroupOp->IsDone() ) { + SALOMEDS::SObject_var aGroupSO = + theGeomEngine->AddInStudy( theStudy, aGroup, qPrintable( aName ), aMainShape ); + } } } diff --git a/src/HYDROData/HYDROData_CalculationCase.h b/src/HYDROData/HYDROData_CalculationCase.h index ed719a93..de3a6565 100644 --- a/src/HYDROData/HYDROData_CalculationCase.h +++ b/src/HYDROData/HYDROData_CalculationCase.h @@ -244,12 +244,6 @@ private: */ HYDRODATA_EXPORT virtual Handle(HYDROData_SplittedShapesGroup) addNewSplittedGroup(); - /** - * Returns shell containing faces which correspond to regions. - * \return shell as TopoDS_Shell - */ - HYDRODATA_EXPORT virtual TopoDS_Shell GetShell(); - /** * Exports the given faces as shell and the given groups to GEOM module. * \param theGeomEngine GEOM module engine -- 2.39.2