X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Region.cxx;h=090171f9e8b09619801de27ad7976baa15c1c306;hb=deed826b2d6c39ba2ed410108cdf54d64cded321;hp=6e0a0f1dee206324c3076569d210535444abbc5c;hpb=dadcea132a8b5df65f63168ecdc59b245c374b8b;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Region.cxx b/src/HYDROData/HYDROData_Region.cxx index 6e0a0f1d..090171f9 100644 --- a/src/HYDROData/HYDROData_Region.cxx +++ b/src/HYDROData/HYDROData_Region.cxx @@ -1,10 +1,23 @@ #include "HYDROData_Region.h" +#include "HYDROData_CalculationCase.h" #include "HYDROData_Document.h" #include "HYDROData_Iterator.h" #include "HYDROData_Zone.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #define PYTHON_REGION_ID "KIND_REGION" @@ -53,6 +66,17 @@ QStringList HYDROData_Region::DumpToPython( MapOfTreatedObjects& theTreatedObjec return aResList; } +void HYDROData_Region::Remove() +{ + Handle(HYDROData_CalculationCase) aFatherCalc = + Handle(HYDROData_CalculationCase)::DownCast( GetFatherObject() ); + + HYDROData_Entity::Remove(); + + if ( !aFatherCalc.IsNull() ) + aFatherCalc->UpdateRegionsOrder(); +} + bool HYDROData_Region::AddZone( const Handle(HYDROData_Zone)& theZone ) { if ( theZone.IsNull() ) @@ -122,3 +146,86 @@ Handle(HYDROData_Zone) HYDROData_Region::addNewZone() return aNewZone; } +TopoDS_Shape HYDROData_Region::GetShape() const +{ + TopoDS_Shape aResShape; + + // Unite the region zones (each zone is a face) into one face (united face) + // If the zones can't be united into the single face - unite them into shell + + // Collect the list of region faces + TopTools_ListOfShape aRegionFacesList; + + HYDROData_SequenceOfObjects aZones = GetZones(); + HYDROData_SequenceOfObjects::Iterator aZoneIter( aZones ); + for ( ; aZoneIter.More(); aZoneIter.Next() ) { + Handle(HYDROData_Zone) aZone = + Handle(HYDROData_Zone)::DownCast( aZoneIter.Value() ); + + if ( aZone.IsNull() ) { + continue; + } + + TopoDS_Face aFace = TopoDS::Face( aZone->GetShape() ); + if ( !aFace.IsNull() ) { + aRegionFacesList.Append( aFace ); + } + } // zones iterator + + // Check number of faces + int aNbFaces = aRegionFacesList.Extent(); + if ( aNbFaces > 0 ) { + // The unite region face + TopoDS_Face aRegionFace; + + if ( aNbFaces == 1 ) { + aRegionFace = TopoDS::Face( aRegionFacesList.First() ); + } else { + // Fuse faces into one + TopoDS_Shape aFuseShape; + TopTools_ListIteratorOfListOfShape aFaceIter( aRegionFacesList ); + for ( ; aFaceIter.More(); aFaceIter.Next() ) { + if ( aFuseShape.IsNull() ) { + aFuseShape = aFaceIter.Value(); + } else { + BRepAlgoAPI_Fuse aFuse(aFuseShape, aFaceIter.Value()); + if ( !aFuse.IsDone() ) { + aFuseShape.Nullify(); + break; + } + aFuseShape = aFuse.Shape(); + } + } // faces iterator + + // Check the result of fuse operation + if ( !aFuseShape.IsNull() ) { + ShapeUpgrade_UnifySameDomain anUnifier( aFuseShape ); + anUnifier.Build(); + TopoDS_Shape anUnitedShape = anUnifier.Shape(); + + TopTools_IndexedMapOfShape aMapOfFaces; + TopExp::MapShapes( anUnitedShape, TopAbs_FACE, aMapOfFaces ); + if ( aMapOfFaces.Extent() == 1 ) { + aRegionFace = TopoDS::Face( aMapOfFaces(1) ); + } + } + } + + if ( !aRegionFace.IsNull() ) { // result shape is a face + aResShape = aRegionFace; + } else { // result shape is a shell + TopoDS_Shell aShell; + BRep_Builder aBuilder; + aBuilder.MakeShell( aShell ); + + TopTools_ListIteratorOfListOfShape aFaceIter( aRegionFacesList ); + for ( ; aFaceIter.More(); aFaceIter.Next() ) { + aBuilder.Add( aShell, aFaceIter.Value() ); + } + + aResShape = aShell; + } + } + + return aResShape; +}