#include "HYDROData_Bathymetry.h"
#include "HYDROData_Document.h"
-#include "HYDROData_Polyline.h"
+#include "HYDROData_ShapesGroup.h"
+#include "HYDROData_PolylineXY.h"
+#include "HYDROData_ShapesTool.h"
#include <BRepBuilderAPI_MakeFace.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Wire.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>
#define PYTHON_IMMERSIBLE_ZONE_ID "KIND_IMMERSIBLE_ZONE"
+//#define HYDRODATA_IMZONE_DEB 1
IMPLEMENT_STANDARD_HANDLE(HYDROData_ImmersibleZone,HYDROData_NaturalObject)
IMPLEMENT_STANDARD_RTTIEXT(HYDROData_ImmersibleZone,HYDROData_NaturalObject)
{
QStringList aResList;
- Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this );
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
if ( aDocument.IsNull() )
return aResList;
aResList << QString( "%1.SetBorderColor( border_color );" ).arg( aZoneName );
aResList << QString( "" );
- aResList << QString( "" );
-
Handle(HYDROData_Bathymetry) aRefBathymetry = GetBathymetry();
setPythonReferenceObject( theTreatedObjects, aResList, aRefBathymetry, "SetBathymetry" );
- Handle(HYDROData_Polyline) aRefPolyline = GetPolyline();
+ Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline();
setPythonReferenceObject( theTreatedObjects, aResList, aRefPolyline, "SetPolyline" );
return aResList;
}
-TopoDS_Shape HYDROData_ImmersibleZone::GetTopShape() const
+HYDROData_SequenceOfObjects HYDROData_ImmersibleZone::GetAllReferenceObjects() const
{
- Handle(HYDROData_Polyline) aPolyline = GetPolyline();
- if( !aPolyline.IsNull() )
- {
- TopoDS_Wire aPolylineWire = TopoDS::Wire( aPolyline->GetTopShape() );
- if( !aPolylineWire.IsNull() )
- {
- BRepBuilderAPI_MakeFace aMakeFace( aPolylineWire, Standard_True );
- aMakeFace.Build();
- if( aMakeFace.IsDone() )
- return aMakeFace.Face();
- }
- }
- return TopoDS_Face();
+ HYDROData_SequenceOfObjects aResSeq = HYDROData_NaturalObject::GetAllReferenceObjects();
+
+ Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline();
+ if ( !aRefPolyline.IsNull() )
+ aResSeq.Append( aRefPolyline );
+
+ return aResSeq;
}
-TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const
+TopoDS_Shape HYDROData_ImmersibleZone::GetTopShape() const
{
- // TODO
return getTopShape();
}
-QColor HYDROData_ImmersibleZone::DefaultFillingColor()
+void HYDROData_ImmersibleZone::Update()
{
- return QColor( Qt::green );
+ HYDROData_NaturalObject::Update();
+
+ TopoDS_Shape aResShape = generateTopShape();
+ SetTopShape( aResShape );
+
+ createGroupObjects();
}
-void HYDROData_ImmersibleZone::SetFillingColor( const QColor& theColor )
+TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() const
{
- return SetColor( theColor, DataTag_FillingColor );
+ return generateTopShape( GetPolyline() );
}
-QColor HYDROData_ImmersibleZone::GetFillingColor() const
+TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape( const Handle(HYDROData_PolylineXY)& aPolyline )
{
- return GetColor( DefaultFillingColor(), DataTag_FillingColor );
+ TopoDS_Face aResultFace = TopoDS_Face();
+
+ if( !aPolyline.IsNull() )
+ {
+ TopoDS_Shape aPolylineShape = aPolyline->GetShape();
+ TopTools_ListOfShape aWiresList;
+
+ if ( !aPolylineShape.IsNull() &&
+ aPolylineShape.ShapeType() == TopAbs_WIRE ) {
+ const TopoDS_Wire& aPolylineWire = TopoDS::Wire( aPolylineShape );
+ if ( !aPolylineWire.IsNull() ) {
+ BRepBuilderAPI_MakeFace aMakeFace( aPolylineWire, Standard_True );
+ aMakeFace.Build();
+ if( aMakeFace.IsDone() ) {
+ return aMakeFace.Face();
+ }
+ }
+ } 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 aResultFace;
+
+ 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 aResultFace;
+
+ 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()) {
+ for (; aFR.More(); aFR.Next()) {
+ aResultFace = aFR.Current();
+ break;
+ }
+ }
+ }
+ }
+ BRepCheck_Analyzer anAnalyzer( aResultFace );
+ if( anAnalyzer.IsValid() && aResultFace.ShapeType()==TopAbs_FACE )
+ return aResultFace;
+ else
+ return TopoDS_Face();
}
-QColor HYDROData_ImmersibleZone::DefaultBorderColor()
+void HYDROData_ImmersibleZone::createGroupObjects()
{
- return QColor( Qt::transparent );
+ 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_ShapesTool::ExploreShapeToShapes( aZoneWire, TopAbs_EDGE, anEdges );
+ anInnerEdges.Append( anEdges );
+ }
+
+ // Create outer edges group
+ QString anOutWiresGroupName = GetName() + "_Outer";
+
+ Handle(HYDROData_ShapesGroup) anOutWiresGroup = createGroupObject();
+ anOutWiresGroup->SetName( anOutWiresGroupName );
+
+ TopTools_SequenceOfShape anEdges;
+ HYDROData_ShapesTool::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";
+
+ Handle(HYDROData_ShapesGroup) anInWiresGroup = createGroupObject();
+ anInWiresGroup->SetName( anInWiresGroupName );
+
+ anInWiresGroup->SetShapes( anInnerEdges );
+ }
}
-void HYDROData_ImmersibleZone::SetBorderColor( const QColor& theColor )
+TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const
{
- return SetColor( theColor, DataTag_BorderColor );
+ return getTopShape();
}
-QColor HYDROData_ImmersibleZone::GetBorderColor() const
+QColor HYDROData_ImmersibleZone::DefaultFillingColor()
{
- return GetColor( DefaultBorderColor(), DataTag_BorderColor );
+ return QColor( Qt::darkBlue );
}
-void HYDROData_ImmersibleZone::SetPolyline( const Handle(HYDROData_Polyline)& thePolyline )
+QColor HYDROData_ImmersibleZone::DefaultBorderColor()
{
- SetReferenceObject( thePolyline, DataTag_Polyline );
+ return QColor( Qt::transparent );
}
-Handle(HYDROData_Polyline) HYDROData_ImmersibleZone::GetPolyline() const
+QColor HYDROData_ImmersibleZone::getDefaultFillingColor() const
{
- return Handle(HYDROData_Polyline)::DownCast(
- GetReferenceObject( DataTag_Polyline ) );
+ return DefaultFillingColor();
}
-void HYDROData_ImmersibleZone::RemovePolyline()
+QColor HYDROData_ImmersibleZone::getDefaultBorderColor() const
{
- ClearReferenceObjects( DataTag_Polyline );
+ return DefaultBorderColor();
}
-void HYDROData_ImmersibleZone::SetBathymetry( const Handle(HYDROData_Bathymetry)& theBathymetry )
+void HYDROData_ImmersibleZone::SetPolyline( const Handle(HYDROData_PolylineXY)& thePolyline )
{
- SetReferenceObject( theBathymetry, DataTag_Bathymetry );
+ SetReferenceObject( thePolyline, DataTag_Polyline );
+ SetToUpdate( true );
}
-Handle(HYDROData_Bathymetry) HYDROData_ImmersibleZone::GetBathymetry() const
+Handle(HYDROData_PolylineXY) HYDROData_ImmersibleZone::GetPolyline() const
{
- return Handle(HYDROData_Bathymetry)::DownCast(
- GetReferenceObject( DataTag_Bathymetry ) );
+ return Handle(HYDROData_PolylineXY)::DownCast(
+ GetReferenceObject( DataTag_Polyline ) );
}
-void HYDROData_ImmersibleZone::RemoveBathymetry()
+void HYDROData_ImmersibleZone::RemovePolyline()
{
- ClearReferenceObjects( DataTag_Bathymetry );
+ ClearReferenceObjects( DataTag_Polyline );
+ SetToUpdate( true );
}