2 #include "HYDROData_Channel.h"
4 #include "HYDROData_Document.h"
5 #include "HYDROData_Polyline3D.h"
6 #include "HYDROData_Profile.h"
7 #include "HYDROData_PolylineXY.h"
8 #include "HYDROData_Projection.h"
9 #include "HYDROData_ShapesGroup.h"
10 #include "HYDROData_ShapesTool.h"
11 #include "HYDROData_Pipes.h"
13 #include <BRepOffsetAPI_MakePipeShell.hxx>
14 #include <BRepOffsetAPI_MakePipe.hxx>
15 #include <BRepCheck_Analyzer.hxx>
16 #include <BRepTools.hxx>
21 #include <TopoDS_Wire.hxx>
22 #include <TopoDS_Vertex.hxx>
23 #include <TopoDS_Face.hxx>
25 //#define DEB_CHANNEL 1
27 #include <BRepTools.hxx>
31 #include <QStringList>
33 #define PYTHON_CHANNEL_ID "KIND_CHANNEL"
35 IMPLEMENT_STANDARD_HANDLE(HYDROData_Channel,HYDROData_ArtificialObject)
36 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Channel,HYDROData_ArtificialObject)
39 HYDROData_Channel::HYDROData_Channel()
40 : HYDROData_ArtificialObject()
44 HYDROData_Channel::~HYDROData_Channel()
48 QStringList HYDROData_Channel::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
52 Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
53 if ( aDocument.IsNull() )
56 QString aDocName = aDocument->GetDocPyName();
57 QString aChannelName = GetName();
59 aResList << QString( "%1 = %2.CreateObject( %3 );" )
60 .arg( aChannelName ).arg( aDocName ).arg( PYTHON_CHANNEL_ID );
61 aResList << QString( "%1.SetName( \"%2\" );" )
62 .arg( aChannelName ).arg( aChannelName );
63 aResList << QString( "" );
70 HYDROData_SequenceOfObjects HYDROData_Channel::GetAllReferenceObjects() const
72 HYDROData_SequenceOfObjects aResSeq = HYDROData_ArtificialObject::GetAllReferenceObjects();
74 Handle(HYDROData_Polyline3D) aGuideLine = GetGuideLine();
75 if ( !aGuideLine.IsNull() )
76 aResSeq.Append( aGuideLine );
78 Handle(HYDROData_Profile) aProfile = GetProfile();
79 if ( !aProfile.IsNull() )
80 aResSeq.Append( aProfile );
85 TopoDS_Shape HYDROData_Channel::GetTopShape() const
90 TopoDS_Shape HYDROData_Channel::GetShape3D() const
95 void HYDROData_Channel::Update()
97 HYDROData_ArtificialObject::Update();
99 Handle(HYDROData_Polyline3D) aGuideLine = GetGuideLine();
100 Handle(HYDROData_Profile) aProfile = GetProfile();
101 if ( aGuideLine.IsNull() || aProfile.IsNull() )
105 TopoDS_Wire aPathWire = TopoDS::Wire(aGuideLine->GetShape3D());
106 if(aPathWire.IsNull())
108 TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetShape3D() );
109 if(aProfileWire.IsNull())
112 //BRepTools::Write( aPathWire, "guideline.brep" );
113 //BRepTools::Write( aProfileWire, "profile.brep" );
115 HYDROData_Canal3dAnd2d aChannelConstructor( aProfileWire, aPathWire );
116 aChannelConstructor.Create3dPresentation();
117 aChannelConstructor.Create2dPresentation();
118 SetShape3D( aChannelConstructor.Get3dPresentation() );
119 SetTopShape( aChannelConstructor.Get2dPresentation() );
121 // Create groups for channel
122 TopoDS_Wire aLeftBank = aChannelConstructor.GetLeftBank();
123 TopoDS_Wire aRightBank = aChannelConstructor.GetRightBank();
124 TopoDS_Wire anInlet = aChannelConstructor.GetInlet();
125 TopoDS_Wire anOutlet = aChannelConstructor.GetOutlet();
127 TopTools_SequenceOfShape aLeftBankEdges;
128 HYDROData_ShapesTool::ExploreShapeToShapes( aLeftBank, TopAbs_EDGE, aLeftBankEdges );
130 TopTools_SequenceOfShape aRightBankEdges;
131 HYDROData_ShapesTool::ExploreShapeToShapes( aRightBank, TopAbs_EDGE, aRightBankEdges );
133 TopTools_SequenceOfShape anInletEdges;
134 HYDROData_ShapesTool::ExploreShapeToShapes( anInlet, TopAbs_EDGE, anInletEdges );
136 TopTools_SequenceOfShape anOutletEdges;
137 HYDROData_ShapesTool::ExploreShapeToShapes( anOutlet, TopAbs_EDGE, anOutletEdges );
139 QString aLeftGroupName = GetName() + "_Left_Bank";
141 Handle(HYDROData_ShapesGroup) aLeftGroup = createGroupObject();
142 aLeftGroup->SetName( aLeftGroupName );
143 aLeftGroup->SetShapes( aLeftBankEdges );
145 QString aRightGroupName = GetName() + "_Right_Bank";
147 Handle(HYDROData_ShapesGroup) aRightGroup = createGroupObject();
148 aRightGroup->SetName( aRightGroupName );
149 aRightGroup->SetShapes( aRightBankEdges );
151 QString anInGroupName = GetName() + "_Inlet";
153 Handle(HYDROData_ShapesGroup) anInGroup = createGroupObject();
154 anInGroup->SetName( anInGroupName );
155 anInGroup->SetShapes( anInletEdges );
157 QString anOutGroupName = GetName() + "_Outlet";
159 Handle(HYDROData_ShapesGroup) anOutGroup = createGroupObject();
160 anOutGroup->SetName( anOutGroupName );
161 anOutGroup->SetShapes( anOutletEdges );
164 QColor HYDROData_Channel::DefaultFillingColor()
166 return QColor( Qt::blue );
169 QColor HYDROData_Channel::DefaultBorderColor()
171 return QColor( Qt::transparent );
174 QColor HYDROData_Channel::getDefaultFillingColor() const
176 return DefaultFillingColor();
179 QColor HYDROData_Channel::getDefaultBorderColor() const
181 return DefaultBorderColor();
184 bool HYDROData_Channel::SetGuideLine( const Handle(HYDROData_Polyline3D)& theGuideLine )
186 Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
188 if ( theGuideLine.IsNull() )
191 return !aPrevGuideLine.IsNull();
194 if ( IsEqual( aPrevGuideLine, theGuideLine ) )
197 TopoDS_Wire aHydraulicWire = TopoDS::Wire( theGuideLine->GetTopShape() );
198 if ( aHydraulicWire.IsNull() )
199 return false; // The polyline must be a single wire
201 SetReferenceObject( theGuideLine, DataTag_GuideLine );
203 // Indicate model of the need to update the chanel presentation
209 Handle(HYDROData_Polyline3D) HYDROData_Channel::GetGuideLine() const
211 return Handle(HYDROData_Polyline3D)::DownCast(
212 GetReferenceObject( DataTag_GuideLine ) );
215 void HYDROData_Channel::RemoveGuideLine()
217 Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
218 if ( aPrevGuideLine.IsNull() )
221 ClearReferenceObjects( DataTag_GuideLine );
223 // Indicate model of the need to update the chanel presentation
227 bool HYDROData_Channel::SetProfile( const Handle(HYDROData_Profile)& theProfile )
229 Handle(HYDROData_Profile) aPrevProfile = GetProfile();
231 if ( theProfile.IsNull() )
234 return !aPrevProfile.IsNull();
237 if ( IsEqual( aPrevProfile, theProfile ) )
240 SetReferenceObject( theProfile, DataTag_Profile );
242 // Indicate model of the need to update the chanel presentation
248 Handle(HYDROData_Profile) HYDROData_Channel::GetProfile() const
250 return Handle(HYDROData_Profile)::DownCast(
251 GetReferenceObject( DataTag_Profile ) );
254 void HYDROData_Channel::RemoveProfile()
256 Handle(HYDROData_Profile) aPrevProfile = GetProfile();
257 if ( aPrevProfile.IsNull() )
260 ClearReferenceObjects( DataTag_Profile );
262 // Indicate model of the need to update the chanel presentation
266 ObjectKind HYDROData_Channel::getAltitudeObjectType() const
268 return KIND_OBSTACLE_ALTITUDE;