]> SALOME platform Git repositories - modules/hydro.git/blob - src/HYDROData/HYDROData_Channel.cxx
Salome HOME
Coloring of objects (Bug #219).
[modules/hydro.git] / src / HYDROData / HYDROData_Channel.cxx
1
2 #include "HYDROData_Channel.h"
3
4 #include "HYDROData_Document.h"
5 #include "HYDROData_Polyline3D.h"
6 #include "HYDROData_Profile.h"
7
8 #include <TopoDS.hxx>
9 #include <TopoDS_Wire.hxx>
10 #include <BRepOffsetAPI_MakePipeShell.hxx>
11 #include <BRepCheck_Analyzer.hxx>
12 //#define DEB_CHANNEL 1
13 #ifdef DEB_CHANNEL
14 #include <BRepTools.hxx>
15 #endif
16
17 #include <QColor>
18 #include <QStringList>
19
20 #define PYTHON_CHANNEL_ID "KIND_CHANNEL"
21
22 IMPLEMENT_STANDARD_HANDLE(HYDROData_Channel,HYDROData_ArtificialObject)
23 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Channel,HYDROData_ArtificialObject)
24
25
26 HYDROData_Channel::HYDROData_Channel()
27 : HYDROData_ArtificialObject()
28 {
29 }
30
31 HYDROData_Channel::~HYDROData_Channel()
32 {
33 }
34
35 QStringList HYDROData_Channel::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
36 {
37   QStringList aResList;
38
39   Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
40   if ( aDocument.IsNull() )
41     return aResList;
42
43   QString aDocName = aDocument->GetDocPyName();
44   QString aChannelName = GetName();
45
46   aResList << QString( "%1 = %2.CreateObject( %3 );" )
47               .arg( aChannelName ).arg( aDocName ).arg( PYTHON_CHANNEL_ID );
48   aResList << QString( "%1.SetName( \"%2\" );" )
49               .arg( aChannelName ).arg( aChannelName );
50   aResList << QString( "" );
51
52   // TODO
53
54   return aResList;
55 }
56
57 HYDROData_SequenceOfObjects HYDROData_Channel::GetAllReferenceObjects() const
58 {
59   HYDROData_SequenceOfObjects aResSeq = HYDROData_ArtificialObject::GetAllReferenceObjects();
60
61   Handle(HYDROData_Polyline3D) aGuideLine = GetGuideLine();
62   if ( !aGuideLine.IsNull() )
63     aResSeq.Append( aGuideLine );
64
65   Handle(HYDROData_Profile) aProfile = GetProfile();
66   if ( !aProfile.IsNull() )
67     aResSeq.Append( aProfile );
68
69   return aResSeq;
70 }
71
72 TopoDS_Shape HYDROData_Channel::GetTopShape() const
73 {
74   return getTopShape();
75 }
76
77 TopoDS_Shape HYDROData_Channel::GetShape3D() const
78 {
79   return getShape3D();
80 }
81
82 void HYDROData_Channel::Update()
83 {
84   HYDROData_ArtificialObject::Update();
85
86   Handle(HYDROData_Polyline3D) aGuideLine = GetGuideLine();
87   Handle(HYDROData_Profile) aProfile = GetProfile();
88   if ( aGuideLine.IsNull() || aProfile.IsNull() )
89     return;
90
91   // TODO
92   TopoDS_Wire aPathWire = TopoDS::Wire(aGuideLine->GetShape3D());
93   if(aPathWire.IsNull())
94     return;
95   TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetShape3D() ); 
96   if(aProfileWire.IsNull())
97         return;
98
99   BRepOffsetAPI_MakePipeShell aMkSweep(aPathWire);
100   aMkSweep.Add(aProfileWire,Standard_True, Standard_True);
101   aMkSweep.SetTransitionMode(BRepBuilderAPI_RightCorner);
102   aMkSweep.SetMode(Standard_True);
103   aMkSweep.Build();
104   if(aMkSweep.IsDone())  { 
105         const TopoDS_Shape& aChannel = aMkSweep.Shape();
106     BRepCheck_Analyzer aCheck(aChannel);
107     if(aCheck.IsValid()) 
108         {
109       //BRepTools::Write(aChannel, "ChanV.brep");  
110       SetShape3D( aMkSweep.Shape());
111         } else {
112 #ifdef DEB_CHANNEL
113           cout <<"NOT VALID" <<endl;
114           BRepTools::Write(aChannel, "ChanNV.brep");  
115 #endif
116         }
117   }
118 }
119
120 QColor HYDROData_Channel::DefaultFillingColor()
121 {
122   return QColor( Qt::blue );
123 }
124
125 QColor HYDROData_Channel::DefaultBorderColor()
126 {
127   return QColor( Qt::transparent );
128 }
129
130 QColor HYDROData_Channel::getDefaultFillingColor() const
131 {
132   return DefaultFillingColor();
133 }
134
135 QColor HYDROData_Channel::getDefaultBorderColor() const
136 {
137   return DefaultBorderColor();
138 }
139
140 bool HYDROData_Channel::SetGuideLine( const Handle(HYDROData_Polyline3D)& theGuideLine )
141 {
142   Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
143
144   if ( theGuideLine.IsNull() )
145   {
146     RemoveGuideLine();
147     return !aPrevGuideLine.IsNull();
148   }
149
150   if ( IsEqual( aPrevGuideLine, theGuideLine ) )
151     return false;
152
153   TopoDS_Wire aHydraulicWire = TopoDS::Wire( theGuideLine->GetTopShape() );
154   if ( aHydraulicWire.IsNull() )
155     return false; // The polyline must be a single wire
156
157   SetReferenceObject( theGuideLine, DataTag_GuideLine );
158
159   // Indicate model of the need to update the chanel presentation
160   SetToUpdate( true );
161
162   return true;
163 }
164
165 Handle(HYDROData_Polyline3D) HYDROData_Channel::GetGuideLine() const
166 {
167   return Handle(HYDROData_Polyline3D)::DownCast( 
168            GetReferenceObject( DataTag_GuideLine ) );
169 }
170
171 void HYDROData_Channel::RemoveGuideLine()
172 {
173   Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
174   if ( aPrevGuideLine.IsNull() )
175     return;
176
177   ClearReferenceObjects( DataTag_GuideLine );
178
179   // Indicate model of the need to update the chanel presentation
180   SetToUpdate( true );
181 }
182
183 bool HYDROData_Channel::SetProfile( const Handle(HYDROData_Profile)& theProfile )
184 {
185   Handle(HYDROData_Profile) aPrevProfile = GetProfile();
186
187   if ( theProfile.IsNull() )
188   {
189     RemoveProfile();
190     return !aPrevProfile.IsNull();
191   }
192
193   if ( IsEqual( aPrevProfile, theProfile ) )
194     return false;
195
196   SetReferenceObject( theProfile, DataTag_Profile );
197
198   // Indicate model of the need to update the chanel presentation
199   SetToUpdate( true );
200
201   return true;
202 }
203
204 Handle(HYDROData_Profile) HYDROData_Channel::GetProfile() const
205 {
206   return Handle(HYDROData_Profile)::DownCast( 
207            GetReferenceObject( DataTag_Profile ) );
208 }
209
210 void HYDROData_Channel::RemoveProfile()
211 {
212   Handle(HYDROData_Profile) aPrevProfile = GetProfile();
213   if ( aPrevProfile.IsNull() )
214     return;
215
216   ClearReferenceObjects( DataTag_Profile );
217
218   // Indicate model of the need to update the chanel presentation
219   SetToUpdate( true );
220 }