#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 <TopoDS.hxx>
+#include <TopoDS_Shell.hxx>
+#include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_Sewing.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopExp.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+
+#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)
{
}
+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;
if ( aDocument.IsNull() )
return;
- Handle(HYDROData_Polyline) aBoundaryPolyline = GetBoundaryPolyline();
+ Handle(HYDROData_PolylineXY) aBoundaryPolyline = GetBoundaryPolyline();
HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
if ( aGeomObjects.IsEmpty() )
return;
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() )
// 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() );
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 )
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 );
}
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() )
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;
+}
+
+