+
+ if( aResultFace.IsNull() )
+ return aResultFace;
+
+ BRepCheck_Analyzer anAnalyzer( aResultFace );
+ if( anAnalyzer.IsValid() && aResultFace.ShapeType()==TopAbs_FACE )
+ return aResultFace;
+ else
+ return TopoDS_Face();
+}
+
+void HYDROData_ImmersibleZone::createGroupObjects()
+{
+ TopoDS_Shape aZoneShape = GetTopShape();
+
+ // Temporary solution while the restriction for polylines is not implemented
+ // and shape for zone can be compound and not face only
+ if ( !aZoneShape.IsNull() && aZoneShape.ShapeType() != TopAbs_FACE )
+ {
+ TopExp_Explorer aZoneFaceExp( aZoneShape, TopAbs_FACE );
+ if ( aZoneFaceExp.More() )
+ aZoneShape = aZoneFaceExp.Current(); // Take only first face into account
+ }
+
+ if ( aZoneShape.IsNull() || aZoneShape.ShapeType() != TopAbs_FACE )
+ return;
+
+ TopoDS_Face aZoneFace = TopoDS::Face( aZoneShape );
+
+ TopoDS_Wire aZoneOuterWire = ShapeAnalysis::OuterWire( aZoneFace );
+
+ // Create outer edges group
+ QString anOutWiresGroupName = GetName() + "_Outer";
+
+ Handle(HYDROData_ShapesGroup) anOutWiresGroup = createGroupObject();
+ anOutWiresGroup->SetName( anOutWiresGroupName );
+
+ TopTools_SequenceOfShape anOuterEdges;
+ HYDROData_ShapesTool::ExploreShapeToShapes( aZoneOuterWire, TopAbs_EDGE, anOuterEdges );
+ anOutWiresGroup->SetShapes( anOuterEdges );
+
+ int anInnerCounter = 1;
+ TopExp_Explorer aZoneFaceExp( aZoneFace, TopAbs_WIRE );
+ for ( ; aZoneFaceExp.More(); aZoneFaceExp.Next() )
+ {
+ TopoDS_Wire aZoneWire = TopoDS::Wire( aZoneFaceExp.Current() );
+ if ( aZoneWire.IsEqual( aZoneOuterWire ) )
+ continue; // Skip the outer wire
+
+ TopTools_SequenceOfShape anInnerEdges;
+ HYDROData_ShapesTool::ExploreShapeToShapes( aZoneWire, TopAbs_EDGE, anInnerEdges );
+ if ( anInnerEdges.IsEmpty() )
+ continue;
+
+ QString anInWiresGroupName = GetName() + "_Inner_" + QString::number( anInnerCounter++ );
+
+ Handle(HYDROData_ShapesGroup) anInWiresGroup = createGroupObject();
+ anInWiresGroup->SetName( anInWiresGroupName );
+
+ anInWiresGroup->SetShapes( anInnerEdges );
+ }