#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>
#define CALCULATION_REGIONS_PREF GetName() + "_Reg"
#define CALCULATION_ZONES_PREF GetName() + "_Zone"
{
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 );
- bool isShellEmpty = true;
-
// Make shell containing all region shapes
HYDROData_SequenceOfObjects aCaseRegions = GetRegions();
HYDROData_SequenceOfObjects::Iterator aRegionIter( aCaseRegions );
// Add shape (face or shell) corresponding to the region into the shell
if( !aRegionShape.IsNull() ) {
- aBuilder.Add( aShell, aRegionShape );
- isShellEmpty = false;
+ 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
+*/
- // Check if no shapes were added to the shell
- if ( isShellEmpty ) {
+ // Nullify shell if it is empty
+ if ( !aShell.IsNull() && !TopoDS_Iterator(aShell).More() ) {
aShell.Nullify();
}
#include <TopoDS_Face.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopExp_Explorer.hxx>
-#include <ShapeUpgrade_UnifySameDomain.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopExp.hxx>
#include <BRep_Builder.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
+#include <ShapeUpgrade_UnifySameDomain.hxx>
#include <QStringList>
}
} // faces iterator
+ // Check the result of fuse operation
if ( !aFuseShape.IsNull() ) {
ShapeUpgrade_UnifySameDomain anUnifier( aFuseShape );
- anUnifier.UnifyFacesAndEdges();
anUnifier.Build();
TopoDS_Shape anUnitedShape = anUnifier.Shape();
- TopExp_Explorer anExp( anUnitedShape, TopAbs_FACE );
- if ( anExp.More() ) {
- aRegionFace = TopoDS::Face( anExp.Current() );
- anExp.Next();
- if ( anExp.More() ) {
- aRegionFace.Nullify();
- }
+ TopTools_IndexedMapOfShape aMapOfFaces;
+ TopExp::MapShapes( anUnitedShape, TopAbs_FACE, aMapOfFaces );
+ if ( aMapOfFaces.Extent() == 1 ) {
+ aRegionFace = TopoDS::Face( aMapOfFaces(1) );
}
}
}