X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_CalculationCase.cxx;h=9d6b58f460957305786c6056ca4d85439d3c886c;hb=424f8230c9003d00fb27499b2441c4b3a2a28292;hp=301d043bfc8b4a50e259544ffce0349f912a0a82;hpb=aa24041c7f0529a27ebde5b1d5c0c201c5581c54;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index 301d043b..9d6b58f4 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -5,7 +5,7 @@ #include "HYDROData_Document.h" #include "HYDROData_Iterator.h" #include "HYDROData_NaturalObject.h" -#include "HYDROData_Polyline.h" +#include "HYDROData_PolylineXY.h" #include "HYDROData_SplitToZonesTool.h" #include "HYDROData_Region.h" #include "HYDROData_Tool.h" @@ -16,6 +16,9 @@ #include #include #include +#include +#include +#include #define CALCULATION_REGIONS_PREF GetName() + "_Reg" #define CALCULATION_ZONES_PREF GetName() + "_Zone" @@ -34,6 +37,50 @@ HYDROData_CalculationCase::~HYDROData_CalculationCase() { } +void HYDROData_CalculationCase::SetName( const QString& theName ) +{ + QString anOldCaseName = GetName(); + if ( anOldCaseName != theName ) + { + HYDROData_SequenceOfObjects aRegions = GetRegions(); + + HYDROData_SequenceOfObjects::Iterator anIter( aRegions ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(HYDROData_Region) aRegion = + Handle(HYDROData_Region)::DownCast( anIter.Value() ); + if ( aRegion.IsNull() ) + continue; + + QString aRegionName = aRegion->GetName(); + if ( aRegionName.startsWith( anOldCaseName ) ) + { + aRegionName.replace( anOldCaseName, theName ); + aRegion->SetName( aRegionName ); + } + + HYDROData_SequenceOfObjects aZones = aRegion->GetZones(); + HYDROData_SequenceOfObjects::Iterator anIter( aZones ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(HYDROData_Zone) aRegZone = + Handle(HYDROData_Zone)::DownCast( anIter.Value() ); + if ( aRegZone.IsNull() ) + continue; + + QString aRegionZoneName = aRegZone->GetName(); + if ( aRegionZoneName.startsWith( anOldCaseName ) ) + { + aRegionZoneName.replace( anOldCaseName, theName ); + aRegZone->SetName( aRegionZoneName ); + } + } + } + } + + HYDROData_Entity::SetName( theName ); +} + QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const { QStringList aResList; @@ -82,8 +129,24 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre return aResList; } -void HYDROData_CalculationCase::SplitGeometryObjects() +HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetAllReferenceObjects() const { + HYDROData_SequenceOfObjects aResSeq = HYDROData_Entity::GetAllReferenceObjects(); + + Handle(HYDROData_PolylineXY) aBoundaryPolyline = GetBoundaryPolyline(); + if ( !aBoundaryPolyline.IsNull() ) + aResSeq.Append( aBoundaryPolyline ); + + HYDROData_SequenceOfObjects aSeqOfRegions = GetRegions(); + aResSeq.Append( aSeqOfRegions ); + + return aResSeq; +} + +void HYDROData_CalculationCase::Update() +{ + HYDROData_Entity::Update(); + // At first we remove previously created regions RemoveRegions(); @@ -91,7 +154,7 @@ void HYDROData_CalculationCase::SplitGeometryObjects() if ( aDocument.IsNull() ) return; - Handle(HYDROData_Polyline) aBoundaryPolyline = GetBoundaryPolyline(); + Handle(HYDROData_PolylineXY) aBoundaryPolyline = GetBoundaryPolyline(); HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects(); if ( aGeomObjects.IsEmpty() ) return; @@ -137,9 +200,6 @@ void HYDROData_CalculationCase::SplitGeometryObjects() aRegionZone->AddGeometryObject( aRefObject ); } } - - // The splitted data is up to date - SetToUpdate( false ); } bool HYDROData_CalculationCase::AddGeometryObject( const Handle(HYDROData_Object)& theObject ) @@ -182,9 +242,9 @@ void HYDROData_CalculationCase::RemoveGeometryObjects() SetToUpdate( true ); } -void HYDROData_CalculationCase::SetBoundaryPolyline( const Handle(HYDROData_Polyline)& thePolyline ) +void HYDROData_CalculationCase::SetBoundaryPolyline( const Handle(HYDROData_PolylineXY)& thePolyline ) { - Handle(HYDROData_Polyline) aPrevPolyline = GetBoundaryPolyline(); + Handle(HYDROData_PolylineXY) aPrevPolyline = GetBoundaryPolyline(); SetReferenceObject( thePolyline, DataTag_Polyline ); @@ -192,15 +252,15 @@ void HYDROData_CalculationCase::SetBoundaryPolyline( const Handle(HYDROData_Poly SetToUpdate( !IsEqual( aPrevPolyline, thePolyline ) || IsMustBeUpdated() ); } -Handle(HYDROData_Polyline) HYDROData_CalculationCase::GetBoundaryPolyline() const +Handle(HYDROData_PolylineXY) HYDROData_CalculationCase::GetBoundaryPolyline() const { - return Handle(HYDROData_Polyline)::DownCast( + return Handle(HYDROData_PolylineXY)::DownCast( GetReferenceObject( DataTag_Polyline ) ); } void HYDROData_CalculationCase::RemoveBoundaryPolyline() { - Handle(HYDROData_Polyline) aPrevPolyline = GetBoundaryPolyline(); + Handle(HYDROData_PolylineXY) aPrevPolyline = GetBoundaryPolyline(); ClearReferenceObjects( DataTag_Polyline ); @@ -331,6 +391,8 @@ TopoDS_Shell HYDROData_CalculationCase::GetShell() { TopoDS_Shell aShell; + TopTools_ListOfShape aFacesList; + // Make shell containing all region shapes BRepBuilderAPI_Sewing aSewing( Precision::Confusion()*10.0 ); @@ -345,37 +407,71 @@ TopoDS_Shell HYDROData_CalculationCase::GetShell() TopoDS_Shape aRegionShape = aRegion->GetShape(); if( !aRegionShape.IsNull() ) { - aSewing.Add( aRegionShape ); + 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.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 ( !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 ( aNbOfShells != 1 ) { + 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 ); - 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 ); - } + TopTools_ListIteratorOfListOfShape anIter( aFacesList ); + for ( ; anIter.More(); anIter.Next() ) { + TopoDS_Face aFace = TopoDS::Face( anIter.Value() ); + aBuilder.Add( aShell, aFace ); } } }