2 #include "HYDROData_Polyline3D.h"
4 #include "HYDROData_Document.h"
5 #include "HYDROData_PolylineXY.h"
6 #include "HYDROData_ProfileUZ.h"
8 #include <gp_Pnt2d.hxx>
13 #include <TopoDS_Wire.hxx>
16 #include <QStringList>
18 #define PYTHON_POLYLINE_ID "KIND_POLYLINE"
20 IMPLEMENT_STANDARD_HANDLE(HYDROData_Polyline3D,HYDROData_Object)
21 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Polyline3D,HYDROData_Object)
24 HYDROData_Polyline3D::HYDROData_Polyline3D()
29 HYDROData_Polyline3D::~HYDROData_Polyline3D()
33 QStringList HYDROData_Polyline3D::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
37 Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
38 if ( aDocument.IsNull() )
41 QString aDocName = aDocument->GetDocPyName();
42 QString aPolylineName = GetName();
44 aResList << QString( "%1 = %2.CreateObject( %3 );" )
45 .arg( aPolylineName ).arg( aDocName ).arg( PYTHON_POLYLINE_ID );
46 aResList << QString( "%1.SetName( \"%1\" );" ).arg( aPolylineName );
47 aResList << QString( "" );
54 HYDROData_SequenceOfObjects HYDROData_Polyline3D::GetAllReferenceObjects() const
56 HYDROData_SequenceOfObjects aResSeq = HYDROData_Object::GetAllReferenceObjects();
58 Handle(HYDROData_PolylineXY) aPolylineXY = GetPolylineXY();
59 if ( !aPolylineXY.IsNull() )
60 aResSeq.Append( aPolylineXY );
62 Handle(HYDROData_ProfileUZ) aProfileUZ = GetProfileUZ();
63 if ( !aProfileUZ.IsNull() )
64 aResSeq.Append( aProfileUZ );
69 TopoDS_Shape HYDROData_Polyline3D::GetTopShape() const
74 TopoDS_Shape HYDROData_Polyline3D::GetShape3D() const
79 void HYDROData_Polyline3D::Update()
81 HYDROData_Object::Update();
83 Handle(HYDROData_PolylineXY) aPolylineXY = GetPolylineXY();
84 Handle(HYDROData_ProfileUZ) aProfileUZ = GetProfileUZ();
85 if ( aPolylineXY.IsNull() || aProfileUZ.IsNull() )
88 bool anIsSectionClosed = aPolylineXY->IsClosedSection( 0 );
89 HYDROData_IPolyline::SectionType aSectionType = aPolylineXY->GetSectionType( 0 );
90 HYDROData_IPolyline::PointsList aPolylinePoints = aPolylineXY->GetPoints( 0 );
91 HYDROData_IPolyline::PointsList aProfilePoints = aProfileUZ->GetPoints();
92 if ( aPolylinePoints.IsEmpty() || aProfilePoints.IsEmpty() )
95 const HYDROData_IPolyline::Point& aFirstPoint = aPolylinePoints.First();
96 const HYDROData_IPolyline::Point& aLastPoint = aPolylinePoints.Last();
98 const HYDROData_IPolyline::Point& aFirstParPoint = aProfilePoints.First();
99 const HYDROData_IPolyline::Point& aLastParPoint = aProfilePoints.Last();
101 double aPolylineCommonDist = aPolylineXY->GetDistance( 0, aPolylinePoints.Size() - 1 );
102 double aParCommonDist = gp_Pnt2d( aFirstParPoint.X(), 0 ).Distance( gp_Pnt2d( aLastParPoint.X(), 0 ) );
104 NCollection_Sequence<Polyline3DPoint> aResPoints;
106 // Add first point as is
107 aResPoints.Append( Polyline3DPoint( aFirstPoint.X(), aFirstPoint.Y(), aFirstParPoint.Y() ) );
109 for ( int i = 2, aNbPoints = aPolylinePoints.Size(); i < aNbPoints; ++i )
111 const HYDROData_IPolyline::Point& aPolylinePoint = aPolylinePoints.Value( i );
113 double aDistance = aPolylineXY->GetDistance( 0, i - 1 );
115 double aParLen = ( aDistance / aPolylineCommonDist ) * aParCommonDist;
116 double aDepth = aProfileUZ->GetDepthFromDistance( aParLen );
118 Polyline3DPoint aCompPoint( aPolylinePoint.X(), aPolylinePoint.Y(), aDepth );
119 aResPoints.Append( aCompPoint );
122 // Add last point as is
123 aResPoints.Append( Polyline3DPoint( aLastPoint.X(), aLastPoint.Y(), aLastParPoint.Y() ) );
125 TopoDS_Wire aResWire = HYDROData_PolylineXY::BuildWire( aSectionType, anIsSectionClosed, aResPoints );
126 SetTopShape( aResWire );
127 SetShape3D( aResWire );
130 QColor HYDROData_Polyline3D::DefaultFillingColor()
132 return QColor( Qt::transparent );
135 QColor HYDROData_Polyline3D::DefaultBorderColor()
137 return QColor( Qt::red );
140 QColor HYDROData_Polyline3D::getDefaultFillingColor() const
142 return DefaultFillingColor();
145 QColor HYDROData_Polyline3D::getDefaultBorderColor() const
147 return DefaultBorderColor();
150 bool HYDROData_Polyline3D::SetPolylineXY( const Handle(HYDROData_PolylineXY)& thePolyline )
152 if ( thePolyline.IsNull() )
155 Handle(HYDROData_PolylineXY) aPrevPolyline = GetPolylineXY();
156 if ( IsEqual( aPrevPolyline, thePolyline ) )
159 SetReferenceObject( thePolyline, DataTag_PolylineXY );
161 // Indicate model of the need to update the polyline presentation
167 Handle(HYDROData_PolylineXY) HYDROData_Polyline3D::GetPolylineXY() const
169 return Handle(HYDROData_PolylineXY)::DownCast(
170 GetReferenceObject( DataTag_PolylineXY ) );
173 void HYDROData_Polyline3D::RemovePolylineXY()
175 Handle(HYDROData_PolylineXY) aPrevPolyline = GetPolylineXY();
176 if ( aPrevPolyline.IsNull() )
179 ClearReferenceObjects( DataTag_PolylineXY );
181 // Indicate model of the need to update the polyline presentation
185 bool HYDROData_Polyline3D::SetProfileUZ( const Handle(HYDROData_ProfileUZ)& theProfile )
187 if ( theProfile.IsNull() )
190 Handle(HYDROData_ProfileUZ) aPrevProfile = GetProfileUZ();
191 if ( IsEqual( aPrevProfile, theProfile ) )
194 SetReferenceObject( theProfile, DataTag_ProfileUZ );
196 // Indicate model of the need to update the polyline presentation
202 Handle(HYDROData_ProfileUZ) HYDROData_Polyline3D::GetProfileUZ() const
204 return Handle(HYDROData_ProfileUZ)::DownCast(
205 GetReferenceObject( DataTag_ProfileUZ ) );
208 void HYDROData_Polyline3D::RemoveProfileUZ()
210 Handle(HYDROData_ProfileUZ) aPrevProfile = GetProfileUZ();
211 if ( aPrevProfile.IsNull() )
214 ClearReferenceObjects( DataTag_ProfileUZ );
216 // Indicate model of the need to update the polyline presentation