2 #include "HYDROData_Stream.h"
4 #include "HYDROData_Document.h"
5 #include "HYDROData_PolylineXY.h"
6 #include "HYDROData_Profile.h"
8 #include <BRep_Builder.hxx>
9 #include <BRepBuilderAPI_MakeEdge.hxx>
10 #include <BRepBuilderAPI_MakeWire.hxx>
11 #include <BRepBuilderAPI_MakeFace.hxx>
14 #include <TopoDS_Wire.hxx>
15 #include <TopoDS_Shell.hxx>
16 #include <TopoDS_Face.hxx>
18 #include <QStringList>
20 #define PYTHON_STREAM_ID "KIND_STREAM"
22 IMPLEMENT_STANDARD_HANDLE(HYDROData_Stream,HYDROData_NaturalObject)
23 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Stream,HYDROData_NaturalObject)
26 HYDROData_Stream::HYDROData_Stream()
27 : HYDROData_NaturalObject()
31 HYDROData_Stream::~HYDROData_Stream()
35 QStringList HYDROData_Stream::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
39 Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
40 if ( aDocument.IsNull() )
43 QString aDocName = aDocument->GetDocPyName();
44 QString aStreamName = GetName();
46 aResList << QString( "%1 = %2.CreateObject( %3 );" )
47 .arg( aStreamName ).arg( aDocName ).arg( PYTHON_STREAM_ID );
48 aResList << QString( "%1.SetName( \"%2\" );" )
49 .arg( aStreamName ).arg( aStreamName );
50 aResList << QString( "" );
57 TopoDS_Shape HYDROData_Stream::GetTopShape() const
62 TopoDS_Shape HYDROData_Stream::GetShape3D() const
67 void HYDROData_Stream::Update()
69 HYDROData_NaturalObject::Update();
71 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
72 HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
73 if ( aHydAxis.IsNull() || aRefProfiles.IsEmpty() )
76 TopoDS_Shell a2dShell;
77 BRep_Builder a2dShellBuilder;
78 a2dShellBuilder.MakeShell( a2dShell );
80 bool anIsFirst = true;
81 gp_Pnt aPrevFirstPoint, aPrevLastPoint;
83 // Construct the top presentation
84 HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
85 for ( ; anIter.More(); anIter.Next() )
87 Handle(HYDROData_Profile) aProfile =
88 Handle(HYDROData_Profile)::DownCast( anIter.Value() );
89 if ( aProfile.IsNull() )
93 if ( !aProfile->GetFirstPoint( aPnt1 ) || !aProfile->GetLastPoint( aPnt2 ) )
96 gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 );
97 gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 );
101 aPrevFirstPoint = aCurFirstPoint;
102 aPrevLastPoint = aCurLastPoint;
107 BRepBuilderAPI_MakeEdge aFirstEdge( aPrevFirstPoint, aPrevLastPoint );
108 BRepBuilderAPI_MakeEdge aSecondEdge( aPrevLastPoint, aCurLastPoint );
109 BRepBuilderAPI_MakeEdge aThirdEdge( aCurLastPoint, aCurFirstPoint );
110 BRepBuilderAPI_MakeEdge aFourthEdge( aCurFirstPoint, aPrevFirstPoint );
112 BRepBuilderAPI_MakeWire aMakeWire( aFirstEdge.Edge(), aSecondEdge.Edge(),
113 aThirdEdge.Edge(), aFourthEdge.Edge() );
115 TopoDS_Wire aSectProfileWire = aMakeWire.Wire();
117 BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True );
119 if( aMakeFace.IsDone() )
121 a2dShellBuilder.Add( a2dShell, aMakeFace.Face() );
124 aPrevFirstPoint = aCurFirstPoint;
125 aPrevLastPoint = aCurLastPoint;
128 SetTopShape( a2dShell );
130 // Construct the 3D presentation
134 bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis )
136 Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis();
138 if ( theAxis.IsNull() )
140 RemoveHydraulicAxis();
141 return !aPrevAxis.IsNull();
144 if ( IsEqual( aPrevAxis, theAxis ) )
147 TopoDS_Wire aHydraulicWire = TopoDS::Wire( theAxis->GetShape() );
148 if ( aHydraulicWire.IsNull() )
149 return false; // The polyline must be a single wire
151 SetReferenceObject( theAxis, DataTag_HydraulicAxis );
153 // Update the order of profiles
154 updateProfilesOrder();
156 // Indicate model of the need to update the stream presentation
162 Handle(HYDROData_PolylineXY) HYDROData_Stream::GetHydraulicAxis() const
164 return Handle(HYDROData_PolylineXY)::DownCast(
165 GetReferenceObject( DataTag_HydraulicAxis ) );
168 void HYDROData_Stream::RemoveHydraulicAxis()
170 Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis();
171 if ( aPrevAxis.IsNull() )
174 ClearReferenceObjects( DataTag_HydraulicAxis );
176 // We remove the reference profiles
179 // Indicate model of the need to update the stream presentation
183 bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile ) const
185 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
186 if ( theProfile.IsNull() || aHydAxis.IsNull() )
189 TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
190 TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() );
191 if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
199 bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile )
201 if ( theProfile.IsNull() )
204 if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile ) )
205 return false; // Object is already in reference list or it has no intersection
207 insertProfileInToOrder( theProfile );
209 // Indicate model of the need to update the stream presentation
215 HYDROData_SequenceOfObjects HYDROData_Stream::GetProfiles() const
217 return GetReferenceObjects( DataTag_Profile );
220 bool HYDROData_Stream::RemoveProfile( const Handle(HYDROData_Profile)& theProfile )
222 if ( theProfile.IsNull() || !HasReference( theProfile, DataTag_Profile ) )
225 RemoveReferenceObject( theProfile->Label(), DataTag_Profile );
227 // Indicate model of the need to update the stream presentation
233 void HYDROData_Stream::RemoveProfiles()
235 bool anIsToUpdate = IsMustBeUpdated() || NbReferenceObjects( DataTag_Profile ) > 0;
237 ClearReferenceObjects( DataTag_Profile );
239 // Indicate model of the need to update the stream presentation
240 SetToUpdate( anIsToUpdate );
243 void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile )
245 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
246 if ( theProfile.IsNull() || aHydAxis.IsNull() )
249 TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
250 TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() );
251 if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
255 AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only
258 void HYDROData_Stream::updateProfilesOrder()
260 HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
261 if ( aRefProfiles.IsEmpty() )
264 // At first we remove all profiles from order
267 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
268 if ( aHydAxis.IsNull() )
271 HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
272 for ( ; anIter.More(); anIter.Next() )
274 Handle(HYDROData_Profile) aProfile =
275 Handle(HYDROData_Profile)::DownCast( anIter.Value() );
276 if ( aProfile.IsNull() || !HasIntersection( aProfile ) )
279 insertProfileInToOrder( aProfile );