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() );
122 /*TODO: groups via new API
123 QString aLeftGroupName = GetName() + "_Left_Bank";
125 Handle(HYDROData_ShapesGroup) aLeftGroup = createGroupObject();
126 aLeftGroup->SetName( aLeftGroupName );
127 aLeftGroup->SetShapes( aProjLeftEdges );
129 QString aRightGroupName = GetName() + "_Right_Bank";
131 Handle(HYDROData_ShapesGroup) aRightGroup = createGroupObject();
132 aRightGroup->SetName( aRightGroupName );
133 aRightGroup->SetShapes( aProjRightEdges );
135 QString anInGroupName = GetName() + "_Inlet";
137 Handle(HYDROData_ShapesGroup) anInGroup = createGroupObject();
138 anInGroup->SetName( anInGroupName );
139 anInGroup->SetShapes( aProjInletEdges );
141 QString anOutGroupName = GetName() + "_Outlet";
143 Handle(HYDROData_ShapesGroup) anOutGroup = createGroupObject();
144 anOutGroup->SetName( anOutGroupName );
145 anOutGroup->SetShapes( aProjOutletEdges );
149 QColor HYDROData_Channel::DefaultFillingColor()
151 return QColor( Qt::blue );
154 QColor HYDROData_Channel::DefaultBorderColor()
156 return QColor( Qt::transparent );
159 QColor HYDROData_Channel::getDefaultFillingColor() const
161 return DefaultFillingColor();
164 QColor HYDROData_Channel::getDefaultBorderColor() const
166 return DefaultBorderColor();
169 bool HYDROData_Channel::SetGuideLine( const Handle(HYDROData_Polyline3D)& theGuideLine )
171 Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
173 if ( theGuideLine.IsNull() )
176 return !aPrevGuideLine.IsNull();
179 if ( IsEqual( aPrevGuideLine, theGuideLine ) )
182 TopoDS_Wire aHydraulicWire = TopoDS::Wire( theGuideLine->GetTopShape() );
183 if ( aHydraulicWire.IsNull() )
184 return false; // The polyline must be a single wire
186 SetReferenceObject( theGuideLine, DataTag_GuideLine );
188 // Indicate model of the need to update the chanel presentation
194 Handle(HYDROData_Polyline3D) HYDROData_Channel::GetGuideLine() const
196 return Handle(HYDROData_Polyline3D)::DownCast(
197 GetReferenceObject( DataTag_GuideLine ) );
200 void HYDROData_Channel::RemoveGuideLine()
202 Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
203 if ( aPrevGuideLine.IsNull() )
206 ClearReferenceObjects( DataTag_GuideLine );
208 // Indicate model of the need to update the chanel presentation
212 bool HYDROData_Channel::SetProfile( const Handle(HYDROData_Profile)& theProfile )
214 Handle(HYDROData_Profile) aPrevProfile = GetProfile();
216 if ( theProfile.IsNull() )
219 return !aPrevProfile.IsNull();
222 if ( IsEqual( aPrevProfile, theProfile ) )
225 SetReferenceObject( theProfile, DataTag_Profile );
227 // Indicate model of the need to update the chanel presentation
233 Handle(HYDROData_Profile) HYDROData_Channel::GetProfile() const
235 return Handle(HYDROData_Profile)::DownCast(
236 GetReferenceObject( DataTag_Profile ) );
239 void HYDROData_Channel::RemoveProfile()
241 Handle(HYDROData_Profile) aPrevProfile = GetProfile();
242 if ( aPrevProfile.IsNull() )
245 ClearReferenceObjects( DataTag_Profile );
247 // Indicate model of the need to update the chanel presentation
251 ObjectKind HYDROData_Channel::getAltitudeObjectType() const
253 return KIND_OBSTACLE_ALTITUDE;
256 void HYDROData_Channel::findEdges( const TopTools_SequenceOfShape& theInShapes,
257 const TopTools_ListOfShape& theEdges3D,
258 TopTools_SequenceOfShape& theOutShapes ) const
260 theOutShapes.Clear();
261 if ( theEdges3D.IsEmpty() || theInShapes.IsEmpty() )
264 const TopoDS_Shape& aFirstShape3D = theEdges3D.First();
265 const TopoDS_Shape& aLastShape3D = theEdges3D.Last();
267 TopoDS_Vertex aFirstVert, aLastVert, aDummyVert;
268 if ( !HYDROData_ShapesTool::Vertices( aFirstShape3D, aFirstVert, aDummyVert ) ||
269 !HYDROData_ShapesTool::Vertices( aLastShape3D, aDummyVert, aLastVert ) )
272 bool isStarted = false;
273 for ( int i = 1, n = theInShapes.Length(); i <= n; ++i )
275 const TopoDS_Shape& anInShape = theInShapes.Value( i );
277 TopoDS_Vertex aShapeFirstVert, aShapeLastVert;
278 if ( !HYDROData_ShapesTool::Vertices( anInShape, aShapeFirstVert, aShapeLastVert ) )
283 isStarted = HYDROData_ShapesTool::IsVerticesEquals( aFirstVert, aShapeFirstVert, true );
288 theOutShapes.Append( anInShape );
290 if ( HYDROData_ShapesTool::IsVerticesEquals( aLastVert, aShapeLastVert, true ) )
296 void HYDROData_Channel::findEdges( const TopTools_SequenceOfShape& theProjShapes,
297 const TopoDS_Shape& theEdge3D,
298 TopTools_SequenceOfShape& theOutShapes ) const
300 TopTools_ListOfShape aTmpList;
301 aTmpList.Append( theEdge3D );
302 findEdges( theProjShapes, aTmpList, theOutShapes );