X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_LandCover.cxx;h=98fadcf4755e40cf719e468bf2fccc7eaf89c0c4;hb=e744ba34fd38d6744d11b54cd15b6f86350695b2;hp=3680865ca4a39b611265412e37f81b1c11311233;hpb=c7fb1d87acef2fe3ea2f79094bf32b91bf262b79;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_LandCover.cxx b/src/HYDROData/HYDROData_LandCover.cxx index 3680865c..98fadcf4 100644 --- a/src/HYDROData/HYDROData_LandCover.cxx +++ b/src/HYDROData/HYDROData_LandCover.cxx @@ -20,18 +20,22 @@ #include "HYDROData_PolylineXY.h" +#include #include +#include #include -#include -#include #include #include #include #include +#include #include #include #include #include +#include +#include +#include #include #include @@ -40,6 +44,7 @@ IMPLEMENT_STANDARD_HANDLE( HYDROData_LandCover, HYDROData_Entity ) IMPLEMENT_STANDARD_RTTIEXT( HYDROData_LandCover, HYDROData_Entity ) HYDROData_LandCover::HYDROData_LandCover() +: HYDROData_Entity( Geom_2d ) { } @@ -118,15 +123,16 @@ void HYDROData_LandCover::Update() removeShape(); - TopoDS_Shape aResShape = buildShape(); + TCollection_AsciiString anErrorMsg; + TopoDS_Shape aResShape = buildShape( GetPolylines(), anErrorMsg ); - setShape( aResShape ); + SetShape( aResShape ); } void HYDROData_LandCover::SetPolylines( const HYDROData_SequenceOfObjects& thePolylines ) { SetReferenceObjects( thePolylines, DataTag_Polylines ); - SetToUpdate( true ); + Changed( Geom_2d ); } HYDROData_SequenceOfObjects HYDROData_LandCover::GetPolylines() const @@ -136,18 +142,7 @@ HYDROData_SequenceOfObjects HYDROData_LandCover::GetPolylines() const TopoDS_Shape HYDROData_LandCover::GetShape() const { - TopoDS_Shape aShape; - - TDF_Label aLabel = myLab.FindChild( DataTag_Shape, false ); - if ( !aLabel.IsNull() ) - { - Handle(TNaming_NamedShape) aNamedShape; - if( aLabel.FindAttribute( TNaming_NamedShape::GetID(), aNamedShape ) ) { - aShape = aNamedShape->Get(); - } - } - - return aShape; + return HYDROData_Entity::GetShape( DataTag_Shape ); } void HYDROData_LandCover::SetFillingColor( const QColor& theColor ) @@ -170,20 +165,19 @@ QColor HYDROData_LandCover::GetBorderColor() const return GetColor( DefaultBorderColor(), DataTag_BorderColor ); } -QColor HYDROData_LandCover::DefaultFillingColor() +QColor HYDROData_LandCover::DefaultFillingColor() const { return QColor( Qt::magenta ); } -QColor HYDROData_LandCover::DefaultBorderColor() +QColor HYDROData_LandCover::DefaultBorderColor() const { return QColor( Qt::transparent ); } -void HYDROData_LandCover::setShape( const TopoDS_Shape& theShape ) +void HYDROData_LandCover::SetShape( const TopoDS_Shape& theShape ) { - TNaming_Builder aBuilder( myLab.FindChild( DataTag_Shape ) ); - aBuilder.Generated( theShape ); + HYDROData_Entity::SetShape( DataTag_Shape, theShape ); } void HYDROData_LandCover::removeShape() @@ -193,12 +187,122 @@ void HYDROData_LandCover::removeShape() aLabel.ForgetAllAttributes(); } } - -TopoDS_Shape HYDROData_LandCover::buildShape() const + +TopoDS_Shape HYDROData_LandCover::buildShape( const HYDROData_SequenceOfObjects& thePolylines, + TCollection_AsciiString& theErrorMsg ) { + theErrorMsg.Clear(); TopoDS_Shape aResShape; + BRepBuilderAPI_MakeWire aMakeWire; + + TopTools_ListOfShape aClosedWires; + + int aNbPolylines = thePolylines.Length(); + for ( int i = 1; i <= aNbPolylines; ++i ) { + Handle(HYDROData_PolylineXY) aPolyline = + Handle(HYDROData_PolylineXY)::DownCast( thePolylines.Value( i ) ); + + if ( aPolyline.IsNull() ) { + continue; + } + + TopoDS_Shape aPolyShape = aPolyline->GetShape(); + if ( aPolyShape.IsNull() ) { + continue; + } + + // Extract polyline wire(s) + TopTools_ListOfShape aPolylineWires; + + if ( aPolyShape.ShapeType() == TopAbs_WIRE ) { + const TopoDS_Wire& aPolylineWire = TopoDS::Wire( aPolyShape ); + if ( !aPolylineWire.IsNull() ) { + aPolylineWires.Append( aPolylineWire ); + } + } else if ( aPolyShape.ShapeType() == TopAbs_COMPOUND ) { + TopExp_Explorer anExp( aPolyShape, TopAbs_WIRE ); + for (; anExp.More(); anExp.Next() ) { + if(!anExp.Current().IsNull()) { + const TopoDS_Wire& aWire = TopoDS::Wire( anExp.Current() ); + aPolylineWires.Append( aWire ); + } + } + } + + TopTools_ListIteratorOfListOfShape anIt( aPolylineWires ); + for ( ; anIt.More(); anIt.Next() ) { + TopoDS_Wire& aWire = TopoDS::Wire( anIt.Value() ); + + if ( aWire.Closed() ) { + aClosedWires.Append( aWire ); + } else { + aMakeWire.Add( aWire ); + aMakeWire.Build(); + if ( aMakeWire.IsDone() ) { + if ( aMakeWire.Wire().Closed() ) { + aClosedWires.Append( aMakeWire.Wire() ); + aMakeWire = BRepBuilderAPI_MakeWire(); + } + } + } + } + } + + if ( aClosedWires.Extent() == 1 ) { + // make face + TopoDS_Wire aW = TopoDS::Wire( aClosedWires.First()); + BRepBuilderAPI_MakeFace aMakeFace( aW ); + aMakeFace.Build(); + if( aMakeFace.IsDone() ) + { + Handle(ShapeAnalysis_Wire) aSAW = new ShapeAnalysis_Wire(aW, aMakeFace.Face(), Precision::Confusion()); + if (!aSAW->CheckSelfIntersection()) + aResShape = aMakeFace.Face(); + else + theErrorMsg = "Can't create landcover on the given polyline\nSelf-intersection of wire have been detected"; + } + } else if ( aClosedWires.Extent() > 1 ) { + // make compound + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound( aCompound ); + TopTools_SequenceOfShape aSeq; + TopTools_ListIteratorOfListOfShape aWiresIter( aClosedWires ); + bool anErrStat = false; + for ( ; aWiresIter.More() && !anErrStat; aWiresIter.Next() ) + { + TopoDS_Wire aW = TopoDS::Wire( aWiresIter.Value() ); + BRepBuilderAPI_MakeFace aMakeFace( aW ); + aMakeFace.Build(); + if( aMakeFace.IsDone() ) + { + Handle(ShapeAnalysis_Wire) aSAW = new ShapeAnalysis_Wire(aW, aMakeFace.Face(), Precision::Confusion()); + if (!aSAW->CheckSelfIntersection()) + aSeq.Append( aMakeFace.Face() ); + else + { + anErrStat = true; + theErrorMsg = "Can't create landcover on the given polyline\nSelf-intersection of wire(s) have been detected"; + } + } + } + if (!anErrStat) + { + for (int i = 1; i <= aSeq.Length(); i++) + aBuilder.Add( aCompound, aSeq(i) ); + aResShape = aCompound; + } + else + aResShape = TopoDS_Shape(); + } else if ( aNbPolylines > 0 ) { + TCollection_AsciiString aSourceName = aNbPolylines > 1 ? "polylines" : "polyline"; + theErrorMsg = "Can't build closed contour on the given "; + theErrorMsg += aSourceName; + } + ///< \TODO to be reimplemented + /* TopoDS_Shape anArgShape; TopTools_ListOfShape aToolShapes; @@ -263,6 +367,7 @@ TopoDS_Shape HYDROData_LandCover::buildShape() const aResShape = aBOP.Shape(); } } + */ return aResShape; } \ No newline at end of file