X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_CalculationCase.cxx;h=3441d309b83d1d5a41c56415ee27cff13b20274c;hb=84ec5b92ea05194a9d4d413b9bc896cf68d2e3ca;hp=16f25745525c773a714e01df16afa2bc2794b6e7;hpb=dc3fa6d57266c37e75871074112b0e738d608110;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index 16f25745..3441d309 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -5,12 +5,24 @@ #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" #include "HYDROData_Zone.h" +#include +#include +#include +#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 +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,7 +138,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; @@ -92,6 +148,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 +160,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() ); @@ -170,20 +229,30 @@ 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_PolylineXY) aPrevPolyline = GetBoundaryPolyline(); + SetReferenceObject( thePolyline, DataTag_Polyline ); + + // Indicate model of the need to update zones splitting + 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_PolylineXY) aPrevPolyline = GetBoundaryPolyline(); + ClearReferenceObjects( DataTag_Polyline ); + + // Indicate model of the need to update zones splitting + SetToUpdate( !aPrevPolyline.IsNull() || IsMustBeUpdated() ); } Handle(HYDROData_Region) HYDROData_CalculationCase::AddNewRegion( const Handle(HYDROData_Zone)& theZone ) @@ -196,7 +265,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 ); } @@ -238,6 +309,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() ) @@ -269,3 +374,132 @@ Handle(HYDROData_Region) HYDROData_CalculationCase::addNewRegion() return aNewRegion; } +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.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; +} + +