X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_LandCover.cxx;h=d17b52430ac43d87f6a1f3e5be0e33cbeab25e31;hb=a95289fabbb6fbf6f32c06207422c65aafd5bd65;hp=815bc3b58b5fdd37680b0f084003508716d6a167;hpb=00d0017f5e951fb3dd965140d1f16d07d9a49daa;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_LandCover.cxx b/src/HYDROData/HYDROData_LandCover.cxx index 815bc3b5..d17b5243 100644 --- a/src/HYDROData/HYDROData_LandCover.cxx +++ b/src/HYDROData/HYDROData_LandCover.cxx @@ -35,6 +35,9 @@ #include #include #include +#include +#include +#include #include #include @@ -43,6 +46,7 @@ IMPLEMENT_STANDARD_HANDLE( HYDROData_LandCover, HYDROData_Entity ) IMPLEMENT_STANDARD_RTTIEXT( HYDROData_LandCover, HYDROData_Entity ) HYDROData_LandCover::HYDROData_LandCover() +: HYDROData_Entity( Geom_2d ) { } @@ -130,7 +134,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 +201,7 @@ void HYDROData_LandCover::removeShape() aLabel.ForgetAllAttributes(); } } - + TopoDS_Shape HYDROData_LandCover::buildShape( const HYDROData_SequenceOfObjects& thePolylines, TCollection_AsciiString& theErrorMsg ) { @@ -261,27 +265,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 ";