X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FHYDROData%2FHYDROData_LandCover.cxx;h=c9199eb32a41479079569b24d651b5ef5431b305;hb=f86cf7ecf17dbae2a1d84e0ebbab07c732208c2f;hp=815bc3b58b5fdd37680b0f084003508716d6a167;hpb=55fe0d2de7e15a256965d71280dc61fd58863d7e;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_LandCover.cxx b/src/HYDROData/HYDROData_LandCover.cxx index 815bc3b5..c9199eb3 100644 --- a/src/HYDROData/HYDROData_LandCover.cxx +++ b/src/HYDROData/HYDROData_LandCover.cxx @@ -35,14 +35,17 @@ #include #include #include +#include +#include +#include #include #include -IMPLEMENT_STANDARD_HANDLE( HYDROData_LandCover, HYDROData_Entity ) IMPLEMENT_STANDARD_RTTIEXT( HYDROData_LandCover, HYDROData_Entity ) HYDROData_LandCover::HYDROData_LandCover() +: HYDROData_Entity( Geom_2d ) { } @@ -130,7 +133,7 @@ void HYDROData_LandCover::Update() void HYDROData_LandCover::SetPolylines( const HYDROData_SequenceOfObjects& thePolylines ) { SetReferenceObjects( thePolylines, DataTag_Polylines ); - SetToUpdate( true ); + Changed( Geom_2d ); } HYDROData_SequenceOfObjects HYDROData_LandCover::GetPolylines() const @@ -197,7 +200,7 @@ void HYDROData_LandCover::removeShape() aLabel.ForgetAllAttributes(); } } - + TopoDS_Shape HYDROData_LandCover::buildShape( const HYDROData_SequenceOfObjects& thePolylines, TCollection_AsciiString& theErrorMsg ) { @@ -261,27 +264,50 @@ TopoDS_Shape HYDROData_LandCover::buildShape( const HYDROData_SequenceOfObjects& if ( aClosedWires.Extent() == 1 ) { // make face - BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire( aClosedWires.First() ) ); + TopoDS_Wire aW = TopoDS::Wire( aClosedWires.First()); + BRepBuilderAPI_MakeFace aMakeFace( aW ); aMakeFace.Build(); - if( aMakeFace.IsDone() ) { - aResShape = aMakeFace.Face(); + 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 ); - for ( ; aWiresIter.More(); aWiresIter.Next() ) { - BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire( aWiresIter.Value() ) ); + 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() ) { - aBuilder.Add( aCompound, aMakeFace.Face() ); + 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"; + } } } - - aResShape = aCompound; + 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 ";