X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_CalculationCase.cxx;h=198222ab62a76428d734c9c6163ba39374c9eb0f;hb=5617222a44e709aa05f81f868300462d8a6b30b2;hp=f8d25eb746999b52c0aaa5e42442cedb827d18a9;hpb=651e5d37742752679433fa0c15460402ce2c72f4;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index f8d25eb7..198222ab 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -2,20 +2,22 @@ #include "HYDROData_CalculationCase.h" #include "HYDROData_ArtificialObject.h" -#include "HYDROData_Bathymetry.h" +#include "HYDROData_IAltitudeObject.h" #include "HYDROData_Document.h" -#include "HYDROData_EdgesGroup.h" +#include "HYDROData_ShapesGroup.h" #include "HYDROData_Iterator.h" #include "HYDROData_NaturalObject.h" #include "HYDROData_PolylineXY.h" #include "HYDROData_SplitToZonesTool.h" -#include "HYDROData_SplittedEdgesGroup.h" +#include "HYDROData_SplittedShapesGroup.h" #include "HYDROData_Region.h" #include "HYDROData_Tool.h" #include "HYDROData_Zone.h" #include +#include + #include #include #include @@ -68,12 +70,7 @@ void HYDROData_CalculationCase::SetName( const QString& theName ) if ( aRegion.IsNull() ) continue; - QString aRegionName = aRegion->GetName(); - if ( aRegionName.startsWith( anOldCaseName ) ) - { - aRegionName.replace( anOldCaseName, theName ); - aRegion->SetName( aRegionName ); - } + HYDROData_Tool::UpdateChildObjectName( anOldCaseName, theName, aRegion ); HYDROData_SequenceOfObjects aZones = aRegion->GetZones(); HYDROData_SequenceOfObjects::Iterator anIter( aZones ); @@ -84,12 +81,7 @@ void HYDROData_CalculationCase::SetName( const QString& theName ) if ( aRegZone.IsNull() ) continue; - QString aRegionZoneName = aRegZone->GetName(); - if ( aRegionZoneName.startsWith( anOldCaseName ) ) - { - aRegionZoneName.replace( anOldCaseName, theName ); - aRegZone->SetName( aRegionZoneName ); - } + HYDROData_Tool::UpdateChildObjectName( anOldCaseName, theName, aRegZone ); } } @@ -98,17 +90,12 @@ void HYDROData_CalculationCase::SetName( const QString& theName ) anIter.Init( aGroups ); for ( ; anIter.More(); anIter.Next() ) { - Handle(HYDROData_SplittedEdgesGroup) aGroup = - Handle(HYDROData_SplittedEdgesGroup)::DownCast( anIter.Value() ); + Handle(HYDROData_SplittedShapesGroup) aGroup = + Handle(HYDROData_SplittedShapesGroup)::DownCast( anIter.Value() ); if ( aGroup.IsNull() ) continue; - QString aGroupName = aGroup->GetName(); - if ( aGroupName.startsWith( anOldCaseName ) ) - { - aGroupName.replace( anOldCaseName, theName ); - aGroup->SetName( aGroupName ); - } + HYDROData_Tool::UpdateChildObjectName( anOldCaseName, theName, aGroup ); } } @@ -204,7 +191,7 @@ void HYDROData_CalculationCase::Update() QString aRegsPref = CALCULATION_REGIONS_PREF; QString aZonesPref = CALCULATION_ZONES_PREF; - QMap aSplittedEdgesGroupsMap; + QMap aSplittedEdgesGroupsMap; // Create result regions for case, by default one zone for one region HYDROData_SplitToZonesTool::SplitDataListIterator anIter( aSplitedObjects ); @@ -244,15 +231,14 @@ void HYDROData_CalculationCase::Update() else if ( aSplitData.Type == HYDROData_SplitToZonesTool::SplitData::Data_Edge ) { // Create new edges group - if ( aSplitData.ObjectNames.isEmpty() || - aSplitData.Shape.IsNull() || aSplitData.Shape.ShapeType() != TopAbs_EDGE ) + if ( aSplitData.ObjectNames.isEmpty() || aSplitData.Shape.IsNull() ) continue; QString anObjName = aSplitData.ObjectNames.first(); if ( anObjName.isEmpty() ) continue; - Handle(HYDROData_SplittedEdgesGroup) aSplittedGroup; + Handle(HYDROData_SplittedShapesGroup) aSplittedGroup; if ( !aSplittedEdgesGroupsMap.contains( anObjName ) ) { aSplittedGroup = addNewSplittedGroup(); @@ -270,8 +256,7 @@ void HYDROData_CalculationCase::Update() if ( aSplittedGroup.IsNull() ) continue; - TopoDS_Edge anEdge = TopoDS::Edge( aSplitData.Shape ); - aSplittedGroup->AddEdge( anEdge ); + aSplittedGroup->AddShape( aSplitData.Shape ); } } } @@ -316,7 +301,7 @@ void HYDROData_CalculationCase::RemoveGeometryObjects() SetToUpdate( true ); } -bool HYDROData_CalculationCase::AddGeometryGroup( const Handle(HYDROData_EdgesGroup)& theGroup ) +bool HYDROData_CalculationCase::AddGeometryGroup( const Handle(HYDROData_ShapesGroup)& theGroup ) { if ( theGroup.IsNull() ) return false; @@ -337,7 +322,7 @@ HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetGeometryGroups() const return GetReferenceObjects( DataTag_GeometryGroup ); } -void HYDROData_CalculationCase::RemoveGeometryGroup( const Handle(HYDROData_EdgesGroup)& theGroup ) +void HYDROData_CalculationCase::RemoveGeometryGroup( const Handle(HYDROData_ShapesGroup)& theGroup ) { if ( theGroup.IsNull() ) return; @@ -499,146 +484,15 @@ 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(); + double aResAltitude = HYDROData_IAltitudeObject::GetInvalidAltitude(); Handle(HYDROData_Zone) aZone = GetZoneFromPoint( thePoint ); if ( aZone.IsNull() ) return aResAltitude; - HYDROData_Zone::MergeBathymetriesType aZoneMergeType = aZone->GetMergeType(); + HYDROData_Zone::MergeAltitudesType aZoneMergeType = aZone->GetMergeType(); if ( !aZone->IsMergingNeed() ) { aZoneMergeType = HYDROData_Zone::Merge_UNKNOWN; @@ -650,9 +504,9 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& thePoint ) c if ( aZoneMergeType == HYDROData_Zone::Merge_Object ) { - Handle(HYDROData_Bathymetry) aMergeBathymetry = aZone->GetMergeBathymetry(); - if ( !aMergeBathymetry.IsNull() ) - aResAltitude = aMergeBathymetry->GetAltitudeForPoint( thePoint ); + Handle(HYDROData_IAltitudeObject) aMergeAltitude = aZone->GetMergeAltitude(); + if ( !aMergeAltitude.IsNull() ) + aResAltitude = aMergeAltitude->GetAltitudeForPoint( thePoint ); } else { @@ -665,12 +519,12 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& thePoint ) c if ( aZoneObj.IsNull() ) continue; - Handle(HYDROData_Bathymetry) anObjBathymetry = aZoneObj->GetBathymetry(); - if ( anObjBathymetry.IsNull() ) + Handle(HYDROData_IAltitudeObject) anObjAltitude = aZoneObj->GetAltitudeObject(); + if ( anObjAltitude.IsNull() ) continue; - double aPointAltitude = anObjBathymetry->GetAltitudeForPoint( thePoint ); - if ( ValuesEquals( aPointAltitude, HYDROData_Bathymetry::GetInvalidAltitude() ) ) + double aPointAltitude = anObjAltitude->GetAltitudeForPoint( thePoint ); + if ( ValuesEquals( aPointAltitude, HYDROData_IAltitudeObject::GetInvalidAltitude() ) ) continue; if ( aZoneMergeType == HYDROData_Zone::Merge_UNKNOWN ) @@ -680,7 +534,7 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& thePoint ) c } else if ( aZoneMergeType == HYDROData_Zone::Merge_ZMIN ) { - if ( ValuesEquals( aResAltitude, HYDROData_Bathymetry::GetInvalidAltitude() ) || + if ( ValuesEquals( aResAltitude, HYDROData_IAltitudeObject::GetInvalidAltitude() ) || aResAltitude > aPointAltitude ) { aResAltitude = aPointAltitude; @@ -688,7 +542,7 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& thePoint ) c } else if ( aZoneMergeType == HYDROData_Zone::Merge_ZMAX ) { - if ( ValuesEquals( aResAltitude, HYDROData_Bathymetry::GetInvalidAltitude() ) || + if ( ValuesEquals( aResAltitude, HYDROData_IAltitudeObject::GetInvalidAltitude() ) || aResAltitude < aPointAltitude ) { aResAltitude = aPointAltitude; @@ -766,12 +620,12 @@ Handle(HYDROData_Region) HYDROData_CalculationCase::addNewRegion() return aNewRegion; } -Handle(HYDROData_SplittedEdgesGroup) HYDROData_CalculationCase::addNewSplittedGroup() +Handle(HYDROData_SplittedShapesGroup) HYDROData_CalculationCase::addNewSplittedGroup() { TDF_Label aNewLab = myLab.FindChild( DataTag_SplittedGroups ).NewChild(); - Handle(HYDROData_SplittedEdgesGroup) aNewGroup = - Handle(HYDROData_SplittedEdgesGroup)::DownCast( + Handle(HYDROData_SplittedShapesGroup) aNewGroup = + Handle(HYDROData_SplittedShapesGroup)::DownCast( HYDROData_Iterator::CreateObject( aNewLab, KIND_SPLITTED_GROUP ) ); AddReferenceObject( aNewGroup, DataTag_SplittedGroups ); @@ -782,12 +636,22 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, SALOMEDS::Study_ptr theStudy ) { // Get faces - // TODO TopTools_ListOfShape aFaces; + 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(); + aFaces.Append( aRegionShape ); + } // Get groups - // TODO - HYDROData_SequenceOfObjects aSplittedGroups; + HYDROData_SequenceOfObjects aSplittedGroups = GetSplittedGroups(); return Export( theGeomEngine, theStudy, aFaces, aSplittedGroups ); } @@ -797,11 +661,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() ) { @@ -809,7 +671,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 { @@ -817,7 +678,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 ); } } @@ -827,77 +687,78 @@ 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 - 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 ); + 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->GetShapes( 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 ); + } + } + + if ( !aGroupsData.isEmpty() ) { + GEOM::GEOM_IGroupOperations_var aGroupOp = + 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; + anIndexes->length( aGroupIndexes.count() ); + 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( aGroupName ), aMainShape ); + } + } } } @@ -910,8 +771,6 @@ GEOM::GEOM_Object_ptr HYDROData_CalculationCase::publishShapeInGEOM( { GEOM::GEOM_Object_var aGeomObj; - bool isNil = aGeomObj->_is_nil(); ///@MZN - if ( theGeomEngine->_is_nil() || theStudy->_is_nil() || theShape.IsNull() ) { return aGeomObj._retn(); @@ -939,11 +798,11 @@ GEOM::GEOM_Object_ptr HYDROData_CalculationCase::publishShapeInGEOM( SALOMEDS::SObject_var aResultSO = theGeomEngine->PublishInStudy( theStudy, SALOMEDS::SObject::_nil(), - aGeomObj, qPrintable( theName ) ); + aGeomObj, qPrintable( aName ) ); if ( aResultSO->_is_nil() ) { aGeomObj = GEOM::GEOM_Object::_nil(); } } return aGeomObj._retn(); - } \ No newline at end of file + }