#include "HYDROData_Bathymetry.h"
#include "HYDROData_Document.h"
+#include "HYDROData_ShapesGroup.h"
#include "HYDROData_PolylineXY.h"
+#include "HYDROData_Tool.h"
#include <BRepBuilderAPI_MakeFace.hxx>
#include <TopoDS_Compound.hxx>
#include <TopExp_Explorer.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
+
#include <BRep_Builder.hxx>
#include <BRepAlgo_FaceRestrictor.hxx>
#include <BRepCheck_Analyzer.hxx>
+
+#include <ShapeAnalysis.hxx>
+
#include <QColor>
#include <QStringList>
TopoDS_Shape aResShape = generateTopShape();
SetTopShape( aResShape );
+
+ createGroupObjects();
}
TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() const
}
}
} else {
- TopExp_Explorer anExp( aPolylineShape, TopAbs_WIRE );
- for ( ; anExp.More(); anExp.Next() ) {
- if(!anExp.Current().IsNull()) {
- const TopoDS_Wire& aWire = TopoDS::Wire( anExp.Current() );
- aWiresList.Append( aWire );
- }
- }
- if(aWiresList.IsEmpty())
- return aResShape;
- BRepAlgo_FaceRestrictor aFR;
- TopoDS_Face aRefFace;
- TopoDS_Shape aS = aWiresList.First();
- BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire(aWiresList.First()), Standard_True );
- aMakeFace.Build();
- if( aMakeFace.IsDone() ) {
- aRefFace = aMakeFace.Face();
- }
- if(aRefFace.IsNull())
- return aResShape;
- aFR.Init(aRefFace,Standard_False, Standard_True);
- TopTools_ListIteratorOfListOfShape anIt( aWiresList );
- for ( ; anIt.More(); anIt.Next() ) {
- TopoDS_Wire& aWire = TopoDS::Wire( anIt.Value() );
- if ( aWire.IsNull() )
- continue;
- aFR.Add(aWire);
- }
- aFR.Perform();
- if (aFR.IsDone()) {
- TopoDS_Compound aResult;
- BRep_Builder aBB;
- aBB.MakeCompound(aResult);
- for (; aFR.More(); aFR.Next()) {
- const TopoDS_Face& aFF = aFR.Current();
- aBB.Add(aResult,aFF);
- }
- BRepCheck_Analyzer aChecker(aResult);
- if(aChecker.IsValid())
- aResShape = aResult;
+ TopExp_Explorer anExp( aPolylineShape, TopAbs_WIRE );
+ for ( ; anExp.More(); anExp.Next() ) {
+ if(!anExp.Current().IsNull()) {
+ const TopoDS_Wire& aWire = TopoDS::Wire( anExp.Current() );
+ aWiresList.Append( aWire );
+ }
+ }
+ if(aWiresList.IsEmpty())
+ return aResShape;
+ BRepAlgo_FaceRestrictor aFR;
+ TopoDS_Face aRefFace;
+ TopoDS_Shape aS = aWiresList.First();
+ BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire(aWiresList.First()), Standard_True );
+ aMakeFace.Build();
+ if( aMakeFace.IsDone() ) {
+ aRefFace = aMakeFace.Face();
+ }
+ if(aRefFace.IsNull())
+ return aResShape;
+ aFR.Init(aRefFace,Standard_False, Standard_True);
+ TopTools_ListIteratorOfListOfShape anIt( aWiresList );
+ for ( ; anIt.More(); anIt.Next() ) {
+ TopoDS_Wire& aWire = TopoDS::Wire( anIt.Value() );
+ if ( aWire.IsNull() )
+ continue;
+ aFR.Add(aWire);
+ }
+ aFR.Perform();
+ if (aFR.IsDone()) {
+ TopoDS_Compound aResult;
+ BRep_Builder aBB;
+ aBB.MakeCompound(aResult);
+ for (; aFR.More(); aFR.Next()) {
+ const TopoDS_Face& aFF = aFR.Current();
+ aBB.Add(aResult,aFF);
+ }
+ BRepCheck_Analyzer aChecker(aResult);
+ if(aChecker.IsValid())
+ aResShape = aResult;
#ifdef HYDRODATA_IMZONE_DEB
- else {
- aResShape = aResult;
- }
+ else {
+ aResShape = aResult;
+ }
#endif
- }
- }
+ }
+ }
}
return aResShape;
}
+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 );
+
+ TopTools_SequenceOfShape anInnerEdges;
+
+ 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 anEdges;
+ HYDROData_Tool::ExploreShapeToShapes( aZoneWire, TopAbs_EDGE, anEdges );
+ anInnerEdges.Append( anEdges );
+ }
+
+ // Create outer edges group
+ QString anOutWiresGroupName = GetName() + "_Outer_Wire";
+
+ Handle(HYDROData_ShapesGroup) anOutWiresGroup = createGroupObject();
+ anOutWiresGroup->SetName( anOutWiresGroupName );
+
+ TopTools_SequenceOfShape anEdges;
+ HYDROData_Tool::ExploreShapeToShapes( aZoneOuterWire, TopAbs_EDGE, anEdges );
+ anOutWiresGroup->SetShapes( anEdges );
+
+ // Create group for inner edges only if edges is not empty
+ if ( !anInnerEdges.IsEmpty() )
+ {
+ QString anInWiresGroupName = GetName() + "_Inner_Wires";
+
+ Handle(HYDROData_ShapesGroup) anInWiresGroup = createGroupObject();
+ anInWiresGroup->SetName( anInWiresGroupName );
+
+ anInWiresGroup->SetShapes( anInnerEdges );
+ }
+}
+
TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const
{
return getTopShape();