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 HYDROData_SequenceOfObjects HYDROData_Stream::GetAllReferenceObjects() const
59 HYDROData_SequenceOfObjects aResSeq = HYDROData_Object::GetAllReferenceObjects();
61 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
62 if ( !aHydAxis.IsNull() )
63 aResSeq.Append( aHydAxis );
65 aResSeq.Append( GetProfiles() );
70 TopoDS_Shape HYDROData_Stream::GetTopShape() const
75 TopoDS_Shape HYDROData_Stream::GetShape3D() const
80 void HYDROData_Stream::Update()
82 HYDROData_NaturalObject::Update();
84 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
85 HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
86 if ( aHydAxis.IsNull() || aRefProfiles.IsEmpty() )
89 TopoDS_Shell a2dShell;
90 BRep_Builder a2dShellBuilder;
91 a2dShellBuilder.MakeShell( a2dShell );
93 bool anIsFirst = true;
94 gp_Pnt aPrevFirstPoint, aPrevLastPoint;
96 // Construct the top presentation
97 HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
98 for ( ; anIter.More(); anIter.Next() )
100 Handle(HYDROData_Profile) aProfile =
101 Handle(HYDROData_Profile)::DownCast( anIter.Value() );
102 if ( aProfile.IsNull() )
106 if ( !aProfile->GetFirstPoint( aPnt1 ) || !aProfile->GetLastPoint( aPnt2 ) )
109 gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 );
110 gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 );
114 aPrevFirstPoint = aCurFirstPoint;
115 aPrevLastPoint = aCurLastPoint;
120 BRepBuilderAPI_MakeEdge aFirstEdge( aPrevFirstPoint, aPrevLastPoint );
121 BRepBuilderAPI_MakeEdge aSecondEdge( aPrevLastPoint, aCurLastPoint );
122 BRepBuilderAPI_MakeEdge aThirdEdge( aCurLastPoint, aCurFirstPoint );
123 BRepBuilderAPI_MakeEdge aFourthEdge( aCurFirstPoint, aPrevFirstPoint );
125 BRepBuilderAPI_MakeWire aMakeWire( aFirstEdge.Edge(), aSecondEdge.Edge(),
126 aThirdEdge.Edge(), aFourthEdge.Edge() );
128 TopoDS_Wire aSectProfileWire = aMakeWire.Wire();
130 BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True );
132 if( aMakeFace.IsDone() )
134 a2dShellBuilder.Add( a2dShell, aMakeFace.Face() );
137 aPrevFirstPoint = aCurFirstPoint;
138 aPrevLastPoint = aCurLastPoint;
141 SetTopShape( a2dShell );
143 // Construct the 3D presentation
147 bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis )
149 Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis();
151 if ( theAxis.IsNull() )
153 RemoveHydraulicAxis();
154 return !aPrevAxis.IsNull();
157 if ( IsEqual( aPrevAxis, theAxis ) )
160 TopoDS_Wire aHydraulicWire = TopoDS::Wire( theAxis->GetShape() );
161 if ( aHydraulicWire.IsNull() )
162 return false; // The polyline must be a single wire
164 SetReferenceObject( theAxis, DataTag_HydraulicAxis );
166 // Update the order of profiles
167 updateProfilesOrder();
169 // Indicate model of the need to update the stream presentation
175 Handle(HYDROData_PolylineXY) HYDROData_Stream::GetHydraulicAxis() const
177 return Handle(HYDROData_PolylineXY)::DownCast(
178 GetReferenceObject( DataTag_HydraulicAxis ) );
181 void HYDROData_Stream::RemoveHydraulicAxis()
183 Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis();
184 if ( aPrevAxis.IsNull() )
187 ClearReferenceObjects( DataTag_HydraulicAxis );
189 // We remove the reference profiles
192 // Indicate model of the need to update the stream presentation
196 bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile ) const
198 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
199 if ( theProfile.IsNull() || aHydAxis.IsNull() )
202 TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
203 TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() );
204 if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
212 bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile )
214 if ( theProfile.IsNull() )
217 if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile ) )
218 return false; // Object is already in reference list or it has no intersection
220 insertProfileInToOrder( theProfile );
222 // Indicate model of the need to update the stream presentation
228 HYDROData_SequenceOfObjects HYDROData_Stream::GetProfiles() const
230 return GetReferenceObjects( DataTag_Profile );
233 bool HYDROData_Stream::RemoveProfile( const Handle(HYDROData_Profile)& theProfile )
235 if ( theProfile.IsNull() || !HasReference( theProfile, DataTag_Profile ) )
238 RemoveReferenceObject( theProfile->Label(), DataTag_Profile );
240 // Indicate model of the need to update the stream presentation
246 void HYDROData_Stream::RemoveProfiles()
248 bool anIsToUpdate = IsMustBeUpdated() || NbReferenceObjects( DataTag_Profile ) > 0;
250 ClearReferenceObjects( DataTag_Profile );
252 // Indicate model of the need to update the stream presentation
253 SetToUpdate( anIsToUpdate );
256 void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile )
258 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
259 if ( theProfile.IsNull() || aHydAxis.IsNull() )
262 TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
263 TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() );
264 if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
268 AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only
271 void HYDROData_Stream::updateProfilesOrder()
273 HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
274 if ( aRefProfiles.IsEmpty() )
277 // At first we remove all profiles from order
280 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
281 if ( aHydAxis.IsNull() )
284 HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
285 for ( ; anIter.More(); anIter.Next() )
287 Handle(HYDROData_Profile) aProfile =
288 Handle(HYDROData_Profile)::DownCast( anIter.Value() );
289 if ( aProfile.IsNull() || !HasIntersection( aProfile ) )
292 insertProfileInToOrder( aProfile );