Salome HOME
SIP: HYDROData_ProfileUZ is completed.
[modules/hydro.git] / src / HYDROData / HYDROData_Zone.cxx
1
2 #include "HYDROData_Zone.h"
3
4 #include "HYDROData_ArtificialObject.h"
5 #include "HYDROData_IAltitudeObject.h"
6 #include "HYDROData_Document.h"
7 #include "HYDROData_NaturalObject.h"
8
9 #include <TNaming_Builder.hxx>
10 #include <TNaming_NamedShape.hxx>
11
12 #include <TopoDS_Shape.hxx>
13
14 #include <QStringList>
15
16 #include <TDataStd_Integer.hxx>
17
18 #define PYTHON_ZONE_ID "KIND_ZONE"
19
20 IMPLEMENT_STANDARD_HANDLE(HYDROData_Zone, HYDROData_Entity)
21 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Zone, HYDROData_Entity)
22
23
24 HYDROData_Zone::HYDROData_Zone()
25 : HYDROData_Entity()
26 {
27 }
28
29 HYDROData_Zone::~HYDROData_Zone()
30 {
31 }
32
33 QStringList HYDROData_Zone::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
34 {
35   QStringList aResList;
36
37   Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
38   if ( aDocument.IsNull() )
39     return aResList;
40
41   QString aDocName = aDocument->GetDocPyName();
42   QString aZoneName = GetName();
43
44   aResList << QString( "%1 = %2.CreateObject( %3 );" )
45               .arg( aZoneName ).arg( aDocName ).arg( PYTHON_ZONE_ID );
46   aResList << QString( "%1.SetName( \"%2\" );" )
47               .arg( aZoneName ).arg( aZoneName );
48   aResList << QString( "" );
49
50   HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
51   HYDROData_SequenceOfObjects::Iterator aGeomObjsIter( aGeomObjects );
52   for ( ; aGeomObjsIter.More(); aGeomObjsIter.Next() )
53   {
54     Handle(HYDROData_Object) aRefGeomObj =
55       Handle(HYDROData_Object)::DownCast( aGeomObjsIter.Value() );
56     if ( !aRefGeomObj.IsNull() )
57       setPythonReferenceObject( theTreatedObjects, aResList, aRefGeomObj, "AddGeometryObject" );
58   }
59
60   // How can we get the shape? Mb Update() method to intersect the shapes of reference objects?
61   // TODO:  TopoDS_Shape aRefShape = GetShape();
62
63   return aResList;
64 }
65
66 bool HYDROData_Zone::CanBeUpdated() const
67 {
68   return false;
69 }
70
71 bool HYDROData_Zone::CanRemove()
72 {
73   return false;
74 }
75
76 HYDROData_SequenceOfObjects HYDROData_Zone::GetAllReferenceObjects() const
77 {
78   HYDROData_SequenceOfObjects aResSeq = HYDROData_Entity::GetAllReferenceObjects();
79
80   HYDROData_SequenceOfObjects aSeqOfGeomObjects = GetGeometryObjects();
81   aResSeq.Append( aSeqOfGeomObjects );
82
83   return aResSeq;
84 }
85
86 void HYDROData_Zone::SetShape( const TopoDS_Shape& theShape )
87 {
88   TNaming_Builder aBuilder( myLab.FindChild( DataTag_Shape ) );
89   aBuilder.Generated( theShape );
90 }
91
92 TopoDS_Shape HYDROData_Zone::GetShape() const
93 {
94   TDF_Label aLabel = myLab.FindChild( DataTag_Shape, false );
95   if ( !aLabel.IsNull() )
96   {
97     Handle(TNaming_NamedShape) aNamedShape;
98     if( aLabel.FindAttribute( TNaming_NamedShape::GetID(), aNamedShape ) )
99       return aNamedShape->Get();
100   }
101
102   return TopoDS_Shape();
103 }
104
105 bool HYDROData_Zone::IsMergingNeed() const
106 {
107   Handle(HYDROData_IAltitudeObject) aRefAltitude;
108
109   HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
110   HYDROData_SequenceOfObjects::Iterator aGeomObjsIter( aGeomObjects );
111   for ( ; aGeomObjsIter.More(); aGeomObjsIter.Next() )
112   {
113     Handle(HYDROData_Object) aRefGeomObj =
114       Handle(HYDROData_Object)::DownCast( aGeomObjsIter.Value() );
115     if ( aRefGeomObj.IsNull() )
116       continue;
117
118     Handle(HYDROData_IAltitudeObject) anObjAltitude = aRefGeomObj->GetAltitudeObject();
119     if ( anObjAltitude.IsNull() )
120       continue;
121
122     if ( aRefAltitude.IsNull() )
123     {
124       aRefAltitude = anObjAltitude;
125       continue;
126     }
127
128     if ( !IsEqual( aRefAltitude, anObjAltitude ) )
129       return true;
130   }
131
132   return false;
133 }
134
135 void HYDROData_Zone::SetMergeType( const MergeAltitudesType& theType )
136 {
137   Handle(TDataStd_Integer) anInt;
138   if ( myLab.FindChild( DataTag_MergeType ).FindAttribute( TDataStd_Integer::GetID(), anInt ) )
139   {
140     anInt->Set( (int)theType );
141   }
142   else
143   {
144     anInt = TDataStd_Integer::Set( myLab.FindChild( DataTag_MergeType ), (int)theType );
145   }
146 }
147
148 HYDROData_Zone::MergeAltitudesType HYDROData_Zone::GetMergeType() const
149 {
150   MergeAltitudesType aMergeType = Merge_UNKNOWN;
151   
152   TDF_Label aLabel = myLab.FindChild( DataTag_MergeType, false );
153   if ( !aLabel.IsNull() )
154   {
155     Handle(TDataStd_Integer) anInt;
156     if ( aLabel.FindAttribute( TDataStd_Integer::GetID(), anInt ) )
157       aMergeType = (MergeAltitudesType)anInt->Get();
158   }
159
160   return aMergeType;
161 }
162
163 void HYDROData_Zone::SetMergeAltitude( const Handle(HYDROData_IAltitudeObject)& theAltitude )
164 {
165   SetReferenceObject( theAltitude, DataTag_MergeAltitude );
166 }
167
168 Handle(HYDROData_IAltitudeObject) HYDROData_Zone::GetMergeAltitude() const
169 {
170   return Handle(HYDROData_IAltitudeObject)::DownCast( 
171            GetReferenceObject( DataTag_MergeAltitude ) );
172 }
173
174 void HYDROData_Zone::RemoveMergeAltitude()
175 {
176   ClearReferenceObjects( DataTag_MergeAltitude );
177 }
178
179 bool HYDROData_Zone::AddGeometryObject( const Handle(HYDROData_Object)& theObject )
180 {
181   if ( theObject.IsNull() )
182     return false;
183   
184   if ( !theObject->IsKind( STANDARD_TYPE(HYDROData_ArtificialObject) ) &&
185        !theObject->IsKind( STANDARD_TYPE(HYDROData_NaturalObject) ) )
186     return false; // Wrong type of object
187
188   if ( HasReference( theObject, DataTag_GeometryObject ) )
189     return false; // Object is already in reference list
190
191   AddReferenceObject( theObject, DataTag_GeometryObject );
192
193   return true;
194 }
195
196 HYDROData_SequenceOfObjects HYDROData_Zone::GetGeometryObjects() const
197 {
198   return GetReferenceObjects( DataTag_GeometryObject );
199 }
200
201 void HYDROData_Zone::RemoveGeometryObjects()
202 {
203   ClearReferenceObjects( DataTag_GeometryObject );
204 }
205
206
207