X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_CalculationCase.cxx;h=5259902971421651ee788c1b7b4e239a06091a21;hb=ad8562bab9992101430a6327aa7ca06c71f6d084;hp=7bfffe60bded1f0e97b42701513eaadf6925e29a;hpb=5b4f8c7000189059d1c32f1982e24ca998d994fe;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index 7bfffe60..52599029 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -11,6 +11,15 @@ #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" + #define PYTHON_CALCULATION_ID "KIND_CALCULATION" IMPLEMENT_STANDARD_HANDLE(HYDROData_CalculationCase, HYDROData_Entity) @@ -25,6 +34,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; @@ -92,6 +145,9 @@ void HYDROData_CalculationCase::SplitGeometryObjects() if ( aSplitedZones.isEmpty() ) return; + QString aRegsPref = CALCULATION_REGIONS_PREF; + QString aZonesPref = CALCULATION_ZONES_PREF; + // Create result regions for case, by default one zone for one region HYDROData_SplitToZonesTool::SplitDataListIterator anIter( aSplitedZones ); while( anIter.hasNext() ) @@ -101,13 +157,13 @@ void HYDROData_CalculationCase::SplitGeometryObjects() // Create new region Handle(HYDROData_Region) aRegion = addNewRegion(); - QString aRegionName = HYDROData_Tool::GenerateObjectName( aDocument, "Region" ); + QString aRegionName = HYDROData_Tool::GenerateObjectName( aDocument, aRegsPref ); aRegion->SetName( aRegionName ); // Add the zone for region Handle(HYDROData_Zone) aRegionZone = aRegion->addNewZone(); - QString aZoneName = HYDROData_Tool::GenerateObjectName( aDocument, "Zone" ); + QString aZoneName = HYDROData_Tool::GenerateObjectName( aDocument, aZonesPref ); aRegionZone->SetName( aZoneName ); aRegionZone->SetShape( aSplitData.Face() ); @@ -206,7 +262,9 @@ Handle(HYDROData_Region) HYDROData_CalculationCase::AddNewRegion( const Handle(H Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab ); if ( !aDocument.IsNull() ) { - QString aNewRegionName = HYDROData_Tool::GenerateObjectName( aDocument, "Region" ); + QString aRegsPref = CALCULATION_REGIONS_PREF; + + QString aNewRegionName = HYDROData_Tool::GenerateObjectName( aDocument, aRegsPref ); aNewRegion->SetName( aNewRegionName ); } @@ -248,6 +306,40 @@ HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetRegions() const return GetReferenceObjects( DataTag_Region ); } +void HYDROData_CalculationCase::UpdateRegionsOrder() +{ + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab ); + if ( aDocument.IsNull() ) + return; + + 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; + + aRegion->SetName( "" ); + } + + QString aRegsPref = CALCULATION_REGIONS_PREF; + + anIter.Init( aRegions ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(HYDROData_Region) aRegion = + Handle(HYDROData_Region)::DownCast( anIter.Value() ); + if ( aRegion.IsNull() ) + continue; + + QString aRegionName = HYDROData_Tool::GenerateObjectName( aDocument, aRegsPref ); + aRegion->SetName( aRegionName ); + } +} + void HYDROData_CalculationCase::RemoveRegion( const Handle(HYDROData_Region)& theRegion ) { if ( theRegion.IsNull() ) @@ -279,3 +371,99 @@ Handle(HYDROData_Region) HYDROData_CalculationCase::addNewRegion() return aNewRegion; } +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 ); + + // 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; +} + +