Salome HOME
some housekeeping on traces
[modules/hydro.git] / src / HYDROData / HYDROData_Object.cxx
1 // Copyright (C) 2014-2015  EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
6 //
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10 // Lesser General Public License for more details.
11 //
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
15 //
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
17 //
18
19 #include "HYDROData_Object.h"
20
21 #include "HYDROData_DummyObject3D.h"
22 #include "HYDROData_ShapesGroup.h"
23 #include "HYDROData_Tool.h"
24 #include "HYDROData_Iterator.h"
25 #include "HYDROData_IAltitudeObject.h"
26
27 #include <TNaming_Builder.hxx>
28 #include <TNaming_NamedShape.hxx>
29
30 #include <TopoDS_Shape.hxx>
31 #include <TDataStd_Integer.hxx>
32 #include <TDataStd_Real.hxx>
33
34 #include <QColor>
35
36 #define _DEVDEBUG_
37 #include "HYDRO_trace.hxx"
38
39 IMPLEMENT_STANDARD_HANDLE(HYDROData_Object,HYDROData_Entity)
40 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Object,HYDROData_Entity)
41
42 HYDROData_Object::HYDROData_Object()
43 : HYDROData_Entity()
44 {
45 }
46
47 HYDROData_Object::~HYDROData_Object()
48 {
49 }
50
51 void HYDROData_Object::SetName( const QString& theName )
52 {
53   QString anOldObjName = GetName();
54   if ( anOldObjName != theName )
55   {
56     HYDROData_SequenceOfObjects aGroups = GetGroups();
57     HYDROData_SequenceOfObjects::Iterator anIter( aGroups );
58     for ( ; anIter.More(); anIter.Next() )
59     {
60       Handle(HYDROData_ShapesGroup) aGroup =
61         Handle(HYDROData_ShapesGroup)::DownCast( anIter.Value() );
62       if ( aGroup.IsNull() )
63         continue;
64
65       HYDROData_Tool::UpdateChildObjectName( anOldObjName, theName, aGroup );
66     }
67
68     Handle(HYDROData_DummyObject3D) anObject3D = GetObject3D();
69     if ( !anObject3D.IsNull() )
70       HYDROData_Tool::UpdateChildObjectName( anOldObjName, theName, anObject3D );
71
72     Handle(HYDROData_IAltitudeObject) anAltitudeObj = getChildAltitudeObject();
73     if ( !anAltitudeObj.IsNull() )
74       HYDROData_Tool::UpdateChildObjectName( anOldObjName, theName, anAltitudeObj );
75   }
76
77   HYDROData_Entity::SetName( theName );
78 }
79
80 void HYDROData_Object::Update()
81 {
82   removeTopShape();
83   removeShape3D();
84   removeGroupObjects();
85   checkAndSetAltitudeObject();
86   HYDROData_Entity::Update();
87 }
88
89 HYDROData_SequenceOfObjects HYDROData_Object::GetAllReferenceObjects() const
90 {
91   HYDROData_SequenceOfObjects aResSeq = HYDROData_Entity::GetAllReferenceObjects();
92
93   Handle(HYDROData_IAltitudeObject) aRefAltitude = GetAltitudeObject();
94   if ( !aRefAltitude.IsNull() )
95     aResSeq.Append( aRefAltitude );
96
97   return aResSeq;
98 }
99
100 void HYDROData_Object::SetToUpdate( bool theFlag )
101 {
102   HYDROData_Entity::SetToUpdate( theFlag );
103
104   Handle(HYDROData_DummyObject3D) anObject3D = GetObject3D();
105   if ( !anObject3D.IsNull() )
106     anObject3D->SetToUpdate( theFlag );
107 }
108
109 void HYDROData_Object::SetTopShape( const TopoDS_Shape& theShape )
110 {
111   TNaming_Builder aBuilder( myLab.FindChild( DataTag_TopShape ) );
112   aBuilder.Generated( theShape );
113 }
114
115 void HYDROData_Object::SetShape3D( const TopoDS_Shape& theShape )
116 {
117   TNaming_Builder aBuilder( myLab.FindChild( DataTag_Shape3D ) );
118   aBuilder.Generated( theShape );
119   
120   // Check the object 3D existance
121   checkAndSetObject3D();
122 }
123
124 Standard_Boolean HYDROData_Object::GetMiddleZ( Standard_Real& theMiddleZ ) const
125 {
126   theMiddleZ = -9999;
127   TDF_Label aLabel = myLab.FindChild( DataTag_MiddleZ, false );
128   if ( !aLabel.IsNull() )
129   {
130     Handle(TDataStd_Real) aRealVal;
131     if ( aLabel.FindAttribute( TDataStd_Real::GetID(), aRealVal ) )
132     {
133       theMiddleZ = aRealVal->Get();
134       return Standard_True;
135     }
136   }
137
138   return Standard_False;
139
140 }
141
142 void HYDROData_Object::SetMiddleZ( const Standard_Real& theMiddleZ )
143 {
144   TDataStd_Real::Set( myLab.FindChild( DataTag_MiddleZ ), theMiddleZ );
145 }
146
147 Handle(HYDROData_DummyObject3D) HYDROData_Object::GetObject3D() const
148 {
149   Handle(HYDROData_DummyObject3D) anObject;
150   
151   TDF_Label aLabel = myLab.FindChild( DataTag_Object3D, false );
152   if ( !aLabel.IsNull() )
153   {
154     TDF_Label aChildLabel = aLabel.FindChild( 0, false );
155     if ( !aChildLabel.IsNull() )
156     {
157       anObject = Handle(HYDROData_DummyObject3D)::DownCast(
158         HYDROData_Iterator::Object( aChildLabel ) );
159     }
160   }
161
162   return anObject;
163 }
164
165 void HYDROData_Object::checkAndSetObject3D()
166 {
167   TDF_Label aLabel = myLab.FindChild( DataTag_Object3D, false );
168   if ( !aLabel.IsNull() )
169     return;
170
171   TDF_Label aChildLabel = myLab.FindChild( DataTag_Object3D ).FindChild( 0 );
172   HYDROData_Iterator::CreateObject( aChildLabel, KIND_DUMMY_3D );
173 }
174
175 HYDROData_SequenceOfObjects HYDROData_Object::GetGroups() const
176 {
177   return GetReferenceObjects( DataTag_EdgesGroup );
178 }
179
180 Handle(HYDROData_ShapesGroup) HYDROData_Object::GetGroup( const int theGroupId ) const
181 {
182   Handle(HYDROData_ShapesGroup) aResGroup;
183
184   HYDROData_SequenceOfObjects aGroups = GetGroups();
185   if ( theGroupId < 0 || theGroupId >= aGroups.Length() )
186     return aResGroup;
187
188   aResGroup = Handle(HYDROData_ShapesGroup)::DownCast( aGroups.Value( theGroupId + 1 ) );
189
190   return aResGroup;
191 }
192
193 int HYDROData_Object::GetGroupId( const Handle(HYDROData_ShapesGroup)& theGroup ) const
194 {
195   int aRes = -1;
196
197   HYDROData_SequenceOfObjects aGroups = GetGroups();
198   for ( int i = 1, n = aGroups.Length(); i <= n; ++i )
199   {
200     Handle(HYDROData_ShapesGroup) aGroup =
201       Handle(HYDROData_ShapesGroup)::DownCast( aGroups.Value( i ) );
202     if ( IsEqual( theGroup, aGroup ) )
203     {
204       aRes = i - 1;
205       break;
206     }
207   }
208
209   return aRes;
210 }
211
212 bool HYDROData_Object::SetAltitudeObject( 
213   const Handle(HYDROData_IAltitudeObject)& theAltitude )
214 {
215   if ( theAltitude.IsNull() )
216     return false;
217   
218   Handle(HYDROData_IAltitudeObject) aPrevAltitude = GetAltitudeObject();
219   if ( IsEqual( aPrevAltitude, theAltitude ) )
220     return true;
221
222   SetReferenceObject( theAltitude, DataTag_AltitudeObject );
223
224   // Indicate model of the need to update object
225   SetToUpdate( true );
226
227   return true;
228 }
229
230 Handle(HYDROData_IAltitudeObject) HYDROData_Object::GetAltitudeObject() const
231 {
232   return Handle(HYDROData_IAltitudeObject)::DownCast( 
233            GetReferenceObject( DataTag_AltitudeObject ) );
234 }
235
236 void HYDROData_Object::RemoveAltitudeObject()
237 {
238   Handle(HYDROData_IAltitudeObject) aPrevAltitude = GetAltitudeObject();
239   if ( aPrevAltitude.IsNull() )
240     return;
241
242   ClearReferenceObjects( DataTag_AltitudeObject );
243
244   // Indicate model of the need to update object
245   SetToUpdate( true );
246 }
247
248 void HYDROData_Object::SetFillingColor( const QColor& theColor )
249 {
250   SetColor( theColor, DataTag_FillingColor );
251 }
252
253 QColor HYDROData_Object::GetFillingColor() const
254 {
255   return GetColor( getDefaultFillingColor(), DataTag_FillingColor );
256 }
257
258 void HYDROData_Object::SetBorderColor( const QColor& theColor )
259 {
260   SetColor( theColor, DataTag_BorderColor );
261 }
262
263 QColor HYDROData_Object::GetBorderColor() const
264 {
265   return GetColor( getDefaultBorderColor(), DataTag_BorderColor );
266 }
267
268 QColor HYDROData_Object::getDefaultFillingColor() const
269 {
270   return QColor( Qt::yellow );
271 }
272
273 QColor HYDROData_Object::getDefaultBorderColor() const
274 {
275   return QColor( Qt::transparent );
276 }
277
278 QStringList HYDROData_Object::dumpObjectCreation( MapOfTreatedObjects& theTreatedObjects ) const
279 {
280   QStringList aResList = HYDROData_Entity::dumpObjectCreation( theTreatedObjects );
281   if ( aResList.isEmpty() )
282     return aResList; //Object was not created
283
284   QStringList aColorsDef;
285
286   QColor aFillingColor = GetFillingColor();
287   setPythonObjectColor( aColorsDef, aFillingColor, getDefaultFillingColor(), "SetFillingColor" );
288
289   QColor aBorderColor = GetBorderColor();
290   setPythonObjectColor( aColorsDef, aBorderColor, getDefaultBorderColor(), "SetBorderColor" );
291
292   if ( !aColorsDef.isEmpty() )
293   {
294     aResList << aColorsDef;
295     aResList << QString( "" );
296   }
297
298   return aResList;
299 }
300
301 ObjectKind HYDROData_Object::getAltitudeObjectType() const
302 {
303   return KIND_UNKNOWN;
304 }
305
306 Handle(HYDROData_IAltitudeObject) HYDROData_Object::getChildAltitudeObject() const
307 {
308   Handle(HYDROData_IAltitudeObject) anObject;
309   
310   TDF_Label aLabel = myLab.FindChild( DataTag_ChildAltitudeObject, false );
311   if ( !aLabel.IsNull() )
312   {
313     TDF_Label aChildLabel = aLabel.FindChild( 0, false );
314     if ( !aChildLabel.IsNull() )
315     {
316       anObject = Handle(HYDROData_IAltitudeObject)::DownCast(
317         HYDROData_Iterator::Object( aChildLabel ) );
318     }
319   }
320
321   return anObject;
322 }
323
324 void HYDROData_Object::checkAndSetAltitudeObject()
325 {
326   Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
327
328   ObjectKind anAltitudeObjectType = getAltitudeObjectType();
329   DEBTRACE("HYDROData_Object::checkAndSetAltitudeObject anAltitudeObjectType="<< anAltitudeObjectType);
330   if ( anAltitudeObjectType == KIND_UNKNOWN )
331     return; // No need to create altitude object
332
333   TDF_Label aLabel = myLab.FindChild( DataTag_ChildAltitudeObject, false );
334   if ( !aLabel.IsNull() )
335     return;
336
337   TDF_Label aChildLabel = myLab.FindChild( DataTag_ChildAltitudeObject ).FindChild( 0 );
338
339   Handle(HYDROData_IAltitudeObject) anAltitudeObject =
340     Handle(HYDROData_IAltitudeObject)::DownCast(
341       HYDROData_Iterator::CreateObject( aChildLabel, anAltitudeObjectType ) );
342
343   QString anAltitudePref = GetName() + "_Altitude";
344   DEBTRACE("anAltitudePref " << anAltitudePref.toStdString());
345   QString anAltitudeName = HYDROData_Tool::GenerateObjectName( aDocument, anAltitudePref );
346   anAltitudeObject->SetName( anAltitudeName );
347
348   SetAltitudeObject( anAltitudeObject );
349 }
350
351 Handle(HYDROData_ShapesGroup) HYDROData_Object::createGroupObject()
352 {
353   TDF_Label aNewLab = myLab.FindChild( DataTag_EdgesGroup ).NewChild();
354
355   Handle(HYDROData_ShapesGroup) aNewGroup =
356     Handle(HYDROData_ShapesGroup)::DownCast( HYDROData_Iterator::CreateObject( aNewLab, KIND_SHAPES_GROUP ) );
357   AddReferenceObject( aNewGroup, DataTag_EdgesGroup );
358
359   return aNewGroup;
360 }
361
362 void HYDROData_Object::removeGroupObjects()
363 {
364   TDF_Label aLabel = myLab.FindChild( DataTag_EdgesGroup, false );
365   if ( !aLabel.IsNull() )
366     aLabel.ForgetAllAttributes();
367 }
368
369 TopoDS_Shape HYDROData_Object::getTopShape() const
370 {
371   TDF_Label aLabel = myLab.FindChild( DataTag_TopShape, false );
372   if ( !aLabel.IsNull() )
373   {
374     Handle(TNaming_NamedShape) aNamedShape;
375     if( aLabel.FindAttribute( TNaming_NamedShape::GetID(), aNamedShape ) )
376       return aNamedShape->Get();
377   }
378
379   return TopoDS_Shape();
380 }
381
382 void HYDROData_Object::removeTopShape()
383 {
384   TDF_Label aLabel = myLab.FindChild( DataTag_TopShape, false );
385   if ( !aLabel.IsNull() )
386     aLabel.ForgetAllAttributes();
387 }
388
389 TopoDS_Shape HYDROData_Object::getShape3D() const
390 {
391   TDF_Label aLabel = myLab.FindChild( DataTag_Shape3D, false );
392   if ( !aLabel.IsNull() )
393   {
394     Handle(TNaming_NamedShape) aNamedShape;
395     if( aLabel.FindAttribute( TNaming_NamedShape::GetID(), aNamedShape ) )
396       return aNamedShape->Get();
397   }
398
399   return TopoDS_Shape();
400 }
401
402 void HYDROData_Object::removeShape3D()
403 {
404   TDF_Label aLabel = myLab.FindChild( DataTag_Shape3D, false );
405   if ( !aLabel.IsNull() )
406     aLabel.ForgetAllAttributes();
407 }
408
409 bool HYDROData_Object::IsSubmersible() const
410 {
411   Handle(TDataStd_Integer) aSubMersibleAttr;
412
413   bool isSubmersible = true; //default
414   if( myLab.FindAttribute(TDataStd_Integer::GetID(), aSubMersibleAttr ) )
415   {
416     int aValue = aSubMersibleAttr->Get();
417     isSubmersible = ( aValue != 0 );
418   }
419   return isSubmersible;
420 }
421
422 void HYDROData_Object::SetIsSubmersible( bool isSubmersible ) const
423 {
424   TDataStd_Integer::Set( myLab, isSubmersible ? 1 : 0 );
425 }