X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Polyline3D.cxx;h=d11aaf9348ed2d334017edeec9783dea8c97f520;hb=e744ba34fd38d6744d11b54cd15b6f86350695b2;hp=dfc002f17f4bb8313d6cbb2977e0766bb9aa581a;hpb=2cf9e838e652ae811d9b3931914771ad1836c6b8;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Polyline3D.cxx b/src/HYDROData/HYDROData_Polyline3D.cxx index dfc002f1..d11aaf93 100644 --- a/src/HYDROData/HYDROData_Polyline3D.cxx +++ b/src/HYDROData/HYDROData_Polyline3D.cxx @@ -23,15 +23,30 @@ #include "HYDROData_PolylineXY.h" #include "HYDROData_Profile.h" #include "HYDROData_ProfileUZ.h" +#include "HYDROData_ShapesTool.h" #include "HYDROData_Tool.h" +#include + +#include + #include #include #include +#include + #include +#include +#include #include +#include + +#include + +#include + #include #include @@ -40,7 +55,7 @@ IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Polyline3D,HYDROData_Object) HYDROData_Polyline3D::HYDROData_Polyline3D() -: HYDROData_Object() +: HYDROData_Object( Geom_3d ) { } @@ -122,16 +137,6 @@ HYDROData_SequenceOfObjects HYDROData_Polyline3D::GetAllReferenceObjects() const return aResSeq; } -TopoDS_Shape HYDROData_Polyline3D::GetTopShape() const -{ - return getTopShape(); -} - -TopoDS_Shape HYDROData_Polyline3D::GetShape3D() const -{ - return getShape3D(); -} - void HYDROData_Polyline3D::Update() { HYDROData_Object::Update(); @@ -194,26 +199,16 @@ void HYDROData_Polyline3D::Update() SetShape3D( aResWire ); } -QColor HYDROData_Polyline3D::DefaultFillingColor() +QColor HYDROData_Polyline3D::DefaultFillingColor() const { return QColor( Qt::transparent ); } -QColor HYDROData_Polyline3D::DefaultBorderColor() +QColor HYDROData_Polyline3D::DefaultBorderColor() const { return QColor( Qt::red ); } -QColor HYDROData_Polyline3D::getDefaultFillingColor() const -{ - return DefaultFillingColor(); -} - -QColor HYDROData_Polyline3D::getDefaultBorderColor() const -{ - return DefaultBorderColor(); -} - bool HYDROData_Polyline3D::SetPolylineXY( const Handle(HYDROData_PolylineXY)& thePolyline, const bool theIsUpdateProfile ) { @@ -231,7 +226,7 @@ bool HYDROData_Polyline3D::SetPolylineXY( const Handle(HYDROData_PolylineXY)& th updateChildProfilePoints(); // Indicate model of the need to update the polyline presentation - SetToUpdate( true ); + Changed( Geom_2d ); return true; } @@ -251,7 +246,7 @@ void HYDROData_Polyline3D::RemovePolylineXY() ClearReferenceObjects( DataTag_PolylineXY ); // Indicate model of the need to update the polyline presentation - SetToUpdate( true ); + Changed( Geom_2d ); } bool HYDROData_Polyline3D::SetProfileUZ( const Handle(HYDROData_ProfileUZ)& theProfile ) @@ -269,7 +264,7 @@ bool HYDROData_Polyline3D::SetProfileUZ( const Handle(HYDROData_ProfileUZ)& theP RemoveAltitudeObject(); // Indicate model of the need to update the polyline presentation - SetToUpdate( true ); + Changed( Geom_Z ); return true; } @@ -289,7 +284,7 @@ void HYDROData_Polyline3D::RemoveProfileUZ() ClearReferenceObjects( DataTag_ProfileUZ ); // Indicate model of the need to update the polyline presentation - SetToUpdate( true ); + Changed( Geom_Z ); } bool HYDROData_Polyline3D::SetAltitudeObject( @@ -421,4 +416,76 @@ void HYDROData_Polyline3D::removeChildProfileUZ() */ } +HYDROData_Polyline3D::Polyline3DPoints HYDROData_Polyline3D::GetPoints() const +{ + Polyline3DPoints aPoints; + + Handle(HYDROData_PolylineXY) aPolylineXY = GetPolylineXY(); + TopoDS_Wire aWire = TopoDS::Wire( GetShape3D() ); + if ( aPolylineXY.IsNull() || aWire.IsNull() ) { + return aPoints; + } + + // Explode polyline on edges + TopTools_SequenceOfShape anEdges; + HYDROData_ShapesTool::ExploreShapeToShapes( aWire, TopAbs_EDGE, anEdges ); + + // Get points + if ( !anEdges.IsEmpty() ) { + HYDROData_IPolyline::SectionType aSectionType = aPolylineXY->GetSectionType( 0 ); + + if ( aSectionType == HYDROData_IPolyline::SECTION_POLYLINE ) { + // Get points from wire + /* Seems that intermediate vertices are duplicated + TopExp_Explorer anExp( aWire, TopAbs_VERTEX ); + for ( ; anExp.More(); anExp.Next() ) { + TopoDS_Vertex aVertex = TopoDS::Vertex( anExp.Current() ); + if ( !aVertex.IsNull() ) { + gp_Pnt aPnt = BRep_Tool::Pnt( aVertex ); + aPoints.Append( aPnt.XYZ() ); + } + } + */ + TopExp_Explorer anExp( aWire, TopAbs_EDGE ); + bool isFirst = true; + for ( ; anExp.More(); anExp.Next() ) { + TopoDS_Edge anEdge = TopoDS::Edge( anExp.Current() ); + if ( !anEdge.IsNull() ) { + TopoDS_Vertex aV1, aV2; + TopExp::Vertices( anEdge, aV1, aV2 ); + if ( isFirst ) { + gp_Pnt aPnt1 = BRep_Tool::Pnt( aV1 ); + aPoints.Append( aPnt1.XYZ() ); + } + + gp_Pnt aPnt2 = BRep_Tool::Pnt( aV2 ); + aPoints.Append( aPnt2.XYZ() ); + + isFirst = false; + } + } + } else { + // Get points from spline curve + Standard_Real aStart, anEnd; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve( TopoDS::Edge( anEdges.First() ), aStart, anEnd ); + Handle(Geom_BSplineCurve) aGeomSpline = Handle(Geom_BSplineCurve)::DownCast( aCurve ); + + if ( !aGeomSpline.IsNull() ) { + int aNbKnots = aGeomSpline->NbKnots(); + + TColStd_Array1OfReal aSplineKnots( 1, aNbKnots ); + aGeomSpline->Knots( aSplineKnots ); + + for ( int i = 1; i <= aNbKnots; ++i ) { + const Standard_Real& aKnot = aSplineKnots.Value( i ); + gp_Pnt aPnt; + aGeomSpline->D0( aKnot, aPnt ); + aPoints.Append( aPnt.XYZ() ); + } + } + } + } + + return aPoints; +}