X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_LandCover.cxx;h=c9199eb32a41479079569b24d651b5ef5431b305;hb=f86cf7ecf17dbae2a1d84e0ebbab07c732208c2f;hp=180f640481f2297b78088bdf50be42e764296068;hpb=b67f5f24fd48cf975a3473cbe2f5a023c8238fc7;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_LandCover.cxx b/src/HYDROData/HYDROData_LandCover.cxx index 180f6404..c9199eb3 100644 --- a/src/HYDROData/HYDROData_LandCover.cxx +++ b/src/HYDROData/HYDROData_LandCover.cxx @@ -20,16 +20,32 @@ #include "HYDROData_PolylineXY.h" +#include +#include +#include #include #include +#include +#include #include +#include +#include +#include +#include +#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 ) { } @@ -108,7 +124,8 @@ void HYDROData_LandCover::Update() removeShape(); - TopoDS_Shape aResShape = buildShape(); + TCollection_AsciiString anErrorMsg; + TopoDS_Shape aResShape = buildShape( GetPolylines(), anErrorMsg ); setShape( aResShape ); } @@ -116,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 @@ -124,6 +141,52 @@ HYDROData_SequenceOfObjects HYDROData_LandCover::GetPolylines() const return GetReferenceObjects( DataTag_Polylines ); } +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; +} + +void HYDROData_LandCover::SetFillingColor( const QColor& theColor ) +{ + SetColor( theColor, DataTag_FillingColor ); +} + +QColor HYDROData_LandCover::GetFillingColor() const +{ + return GetColor( DefaultFillingColor(), DataTag_FillingColor ); +} + +void HYDROData_LandCover::SetBorderColor( const QColor& theColor ) +{ + SetColor( theColor, DataTag_BorderColor ); +} + +QColor HYDROData_LandCover::GetBorderColor() const +{ + return GetColor( DefaultBorderColor(), DataTag_BorderColor ); +} + +QColor HYDROData_LandCover::DefaultFillingColor() +{ + return QColor( Qt::magenta ); +} + +QColor HYDROData_LandCover::DefaultBorderColor() +{ + return QColor( Qt::transparent ); +} + void HYDROData_LandCover::setShape( const TopoDS_Shape& theShape ) { TNaming_Builder aBuilder( myLab.FindChild( DataTag_Shape ) ); @@ -137,12 +200,125 @@ 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; + HYDROData_SequenceOfObjects aRefPolylines = GetPolylines(); for ( int i = 1, n = aRefPolylines.Length(); i <= n; ++i ) { Handle(HYDROData_PolylineXY) aPolyline = @@ -152,10 +328,59 @@ TopoDS_Shape HYDROData_LandCover::buildShape() const continue; } - if ( aPolyline->IsClosed() ) { - aResShape = aPolyline->GetShape(); - break; + if ( !aPolyline->IsClosed() ) { + continue; + } + + TopoDS_Shape aPolyShape = aPolyline->GetShape(); + if ( aPolyShape.IsNull() || aPolyShape.ShapeType() != TopAbs_WIRE ) { + continue; + } + + const TopoDS_Wire& aPolylineWire = TopoDS::Wire( aPolyShape ); + if ( aPolylineWire.IsNull() ) { + continue; + } + + TopoDS_Face aResultFace = TopoDS_Face(); + BRepBuilderAPI_MakeFace aMakeFace( aPolylineWire, Standard_True ); + aMakeFace.Build(); + if( aMakeFace.IsDone() ) { + aResultFace = aMakeFace.Face(); + } + + if( aResultFace.IsNull() ) { + continue; + } + + if ( anArgShape.IsNull() ) { + anArgShape = aResultFace; + } else { + aToolShapes.Append( aResultFace ); + } + } + + aResShape = anArgShape; + + if ( !anArgShape.IsNull() && aToolShapes.Extent() > 0 ) { + Handle(NCollection_BaseAllocator)aAL=new NCollection_IncAllocator; + BOPAlgo_BOP aBOP(aAL); + + aBOP.AddArgument( anArgShape ); + + TopTools_ListIteratorOfListOfShape anIt(aToolShapes); + for( ; anIt.More(); anIt.Next() ) { + aBOP.AddTool( anIt.Value() ); + } + + aBOP.SetOperation( BOPAlgo_CUT ); + aBOP.Perform(); + + if ( !aBOP.Shape().IsNull() ) { + aResShape = aBOP.Shape(); } } + */ + return aResShape; } \ No newline at end of file