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()
72 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
73 HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
74 if ( aHydAxis.IsNull() || aRefProfiles.IsEmpty() )
77 TopoDS_Shell a2dShell;
78 BRep_Builder a2dShellBuilder;
79 a2dShellBuilder.MakeShell( a2dShell );
81 bool anIsFirst = true;
82 gp_Pnt aPrevFirstPoint, aPrevLastPoint;
84 // Construct the top presentation
85 HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
86 for ( ; anIter.More(); anIter.Next() )
88 Handle(HYDROData_Profile) aProfile =
89 Handle(HYDROData_Profile)::DownCast( anIter.Value() );
90 if ( aProfile.IsNull() )
94 if ( !aProfile->GetFirstPoint( aPnt1 ) || !aProfile->GetLastPoint( aPnt2 ) )
97 gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 );
98 gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 );
102 aPrevFirstPoint = aCurFirstPoint;
103 aPrevLastPoint = aCurLastPoint;
108 BRepBuilderAPI_MakeEdge aFirstEdge( aPrevFirstPoint, aPrevLastPoint );
109 BRepBuilderAPI_MakeEdge aSecondEdge( aPrevLastPoint, aCurLastPoint );
110 BRepBuilderAPI_MakeEdge aThirdEdge( aCurLastPoint, aCurFirstPoint );
111 BRepBuilderAPI_MakeEdge aFourthEdge( aCurFirstPoint, aPrevFirstPoint );
113 BRepBuilderAPI_MakeWire aMakeWire( aFirstEdge.Edge(), aSecondEdge.Edge(),
114 aThirdEdge.Edge(), aFourthEdge.Edge() );
116 TopoDS_Wire aSectProfileWire = aMakeWire.Wire();
118 BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True );
120 if( aMakeFace.IsDone() )
122 a2dShellBuilder.Add( a2dShell, aMakeFace.Face() );
125 aPrevFirstPoint = aCurFirstPoint;
126 aPrevLastPoint = aCurLastPoint;
129 SetTopShape( a2dShell );
131 // Construct the 3D presentation
135 bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis )
137 Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis();
139 if ( theAxis.IsNull() )
141 RemoveHydraulicAxis();
142 return !aPrevAxis.IsNull();
145 if ( IsEqual( aPrevAxis, theAxis ) )
148 TopoDS_Wire aHydraulicWire = TopoDS::Wire( theAxis->GetShape() );
149 if ( aHydraulicWire.IsNull() )
150 return false; // The polyline must be a single wire
152 SetReferenceObject( theAxis, DataTag_HydraulicAxis );
154 // Update the order of profiles
155 updateProfilesOrder();
157 // Indicate model of the need to update the stream presentation
163 Handle(HYDROData_PolylineXY) HYDROData_Stream::GetHydraulicAxis() const
165 return Handle(HYDROData_PolylineXY)::DownCast(
166 GetReferenceObject( DataTag_HydraulicAxis ) );
169 void HYDROData_Stream::RemoveHydraulicAxis()
171 Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis();
172 if ( aPrevAxis.IsNull() )
175 ClearReferenceObjects( DataTag_HydraulicAxis );
177 // We remove the reference profiles
180 // Indicate model of the need to update the stream presentation
184 bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile ) const
186 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
187 if ( theProfile.IsNull() || aHydAxis.IsNull() )
190 TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
191 TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() );
192 if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
200 bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile )
202 if ( theProfile.IsNull() )
205 if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile ) )
206 return false; // Object is already in reference list or it has no intersection
208 insertProfileInToOrder( theProfile );
210 // Indicate model of the need to update the stream presentation
216 HYDROData_SequenceOfObjects HYDROData_Stream::GetProfiles() const
218 return GetReferenceObjects( DataTag_Profile );
221 bool HYDROData_Stream::RemoveProfile( const Handle(HYDROData_Profile)& theProfile )
223 if ( theProfile.IsNull() || !HasReference( theProfile, DataTag_Profile ) )
226 RemoveReferenceObject( theProfile->Label(), DataTag_Profile );
228 // Indicate model of the need to update the stream presentation
234 void HYDROData_Stream::RemoveProfiles()
236 bool anIsToUpdate = IsMustBeUpdated() || NbReferenceObjects( DataTag_Profile ) > 0;
238 ClearReferenceObjects( DataTag_Profile );
240 // Indicate model of the need to update the stream presentation
241 SetToUpdate( anIsToUpdate );
244 void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile )
246 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
247 if ( theProfile.IsNull() || aHydAxis.IsNull() )
250 TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
251 TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() );
252 if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
256 AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only
259 void HYDROData_Stream::updateProfilesOrder()
261 HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
262 if ( aRefProfiles.IsEmpty() )
265 // At first we remove all profiles from order
268 Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
269 if ( aHydAxis.IsNull() )
272 HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
273 for ( ; anIter.More(); anIter.Next() )
275 Handle(HYDROData_Profile) aProfile =
276 Handle(HYDROData_Profile)::DownCast( anIter.Value() );
277 if ( aProfile.IsNull() || !HasIntersection( aProfile ) )
280 insertProfileInToOrder( aProfile );