#include <GEOMBase.h>
+#include <QSet>
+
#include <TopoDS.hxx>
#include <TopoDS_Shell.hxx>
#include <TopoDS_Edge.hxx>
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();
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() ) {
if ( !aShape.IsNull() && (aShape.ShapeType() == TopAbs_FACE) ) {
TopoDS_Face aFace = TopoDS::Face( aShape );
if ( !aFace.IsNull() ) {
- aFacesList.Append( aFace );
aSewing.Add( aFace );
}
} else {
for ( ; anExp.More(); anExp.Next() ) {
TopoDS_Face aFace = TopoDS::Face( anExp.Current() );
if ( !aFace.IsNull() ) {
- aFacesList.Append( aFace );
aSewing.Add( aFace );
}
}
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
+ TopTools_IndexedMapOfShape aMapOfSubShapes;
+ TopExp::MapShapes( aSewedShape, aMapOfSubShapes );
+
+ QHash<QString, QSet<int>> 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<int> anIndexes;
+
+ // Get shapes of the group
+ TopTools_SequenceOfShape aShapes;
+ aGroup->GeShapes( 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 );
+ }
+ }
+
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 );
+ theGeomEngine->GetIGroupOperations( theStudy->StudyId() );
+
+ foreach ( const QString& aGroupName, aGroupsData.keys() ) {
+ QSet<int> 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;
+ 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( aName ), aMainShape );
+ }
}
}