Salome HOME
Merge remote-tracking branch 'origin/master' into BR_LAND_COVER_MAP
[modules/hydro.git] / src / HYDROData / HYDROData_Zone.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_Zone.h"
20
21 #include "HYDROData_ArtificialObject.h"
22 #include "HYDROData_IAltitudeObject.h"
23 #include "HYDROData_Document.h"
24 #include "HYDROData_NaturalObject.h"
25 #include "HYDROData_LandCover.h"
26 #include <QStringList>
27 #include <TDataStd_Integer.hxx>
28 #include <TopoDS_Shape.hxx>
29
30 IMPLEMENT_STANDARD_HANDLE(HYDROData_Zone, HYDROData_Entity)
31 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Zone, HYDROData_Entity)
32
33
34 HYDROData_Zone::HYDROData_Zone()
35 : HYDROData_Entity( Geom_2d )
36 {
37   myInterpolator = NULL;
38 }
39
40 HYDROData_Zone::~HYDROData_Zone()
41 {
42 }
43
44 bool HYDROData_Zone::CanBeUpdated() const
45 {
46   return false;
47 }
48
49 bool HYDROData_Zone::IsHas2dPrs() const
50 {
51   return true;
52 }
53
54 bool HYDROData_Zone::CanRemove()
55 {
56   return false;
57 }
58
59 HYDROData_SequenceOfObjects HYDROData_Zone::GetAllReferenceObjects() const
60 {
61   HYDROData_SequenceOfObjects aResSeq = HYDROData_Entity::GetAllReferenceObjects();
62
63   HYDROData_SequenceOfObjects aSeqOfObjects = GetObjects();
64   aResSeq.Append( aSeqOfObjects );
65
66   return aResSeq;
67 }
68
69 void HYDROData_Zone::SetShape( const TopoDS_Shape& theShape )
70 {
71   HYDROData_Entity::SetShape( DataTag_Shape, theShape );
72 }
73
74 TopoDS_Shape HYDROData_Zone::GetShape() const
75 {
76   return HYDROData_Entity::GetShape( DataTag_Shape );
77 }
78
79 bool HYDROData_Zone::IsMergingNeed() const
80 {
81   // Zones based on geometry objects (compare altitudes)
82   Handle(HYDROData_IAltitudeObject) aRefAltitude;
83
84   HYDROData_SequenceOfObjects anObjects = GetObjects();
85   HYDROData_SequenceOfObjects::Iterator anObjsIter( anObjects );
86   for ( ; anObjsIter.More(); anObjsIter.Next() )
87   {
88     Handle(HYDROData_Object) aRefGeomObj =
89       Handle(HYDROData_Object)::DownCast( anObjsIter.Value() );
90     if ( aRefGeomObj.IsNull() )
91       continue;
92
93     Handle(HYDROData_IAltitudeObject) anObjAltitude = aRefGeomObj->GetAltitudeObject();
94     if ( anObjAltitude.IsNull() )
95       continue;
96
97     if ( aRefAltitude.IsNull() )
98     {
99       aRefAltitude = anObjAltitude;
100       continue;
101     }
102
103     if ( !IsEqual( aRefAltitude, anObjAltitude ) )
104       return true;
105   }
106
107   // Zones based on land cover objects (compare Strickler types)
108   QString aRefStricklerType;
109
110   anObjsIter.Init( anObjects );
111   for ( ; anObjsIter.More(); anObjsIter.Next() )
112   {
113     Handle(HYDROData_LandCover) aRefLandCoverObj =
114       Handle(HYDROData_LandCover)::DownCast( anObjsIter.Value() );
115     if ( aRefLandCoverObj.IsNull() )
116       continue;
117
118     QString aStricklerType = aRefLandCoverObj->GetStricklerType();
119     
120     if ( aRefStricklerType.isNull() )
121     {
122       aRefStricklerType = aStricklerType;
123       continue;
124     }
125
126     if ( aRefStricklerType != aStricklerType )
127       return true;
128   }
129
130
131   return false;
132 }
133
134 void HYDROData_Zone::SetInterpolator( HYDROData_IInterpolator* theInter )
135 {
136   myInterpolator = theInter;
137 }
138
139 HYDROData_IInterpolator* HYDROData_Zone::GetInterpolator() const
140 {
141   return myInterpolator;
142 }
143
144 void HYDROData_Zone::SetMergeType( const MergeType& theType )
145 {
146   TDataStd_Integer::Set( myLab.FindChild( DataTag_MergeType ), (int)theType );
147 }
148
149 HYDROData_Zone::MergeType HYDROData_Zone::GetMergeType() const
150 {
151   MergeType aMergeType = Merge_UNKNOWN;
152   
153   TDF_Label aLabel = myLab.FindChild( DataTag_MergeType, false );
154   if ( !aLabel.IsNull() )
155   {
156     Handle(TDataStd_Integer) anInt;
157     if ( aLabel.FindAttribute( TDataStd_Integer::GetID(), anInt ) )
158       aMergeType = (MergeType)anInt->Get();
159   }
160
161   return aMergeType;
162 }
163
164 void HYDROData_Zone::SetMergeObject( const Handle(HYDROData_Entity)& theObject )
165 {
166   SetReferenceObject( theObject, DataTag_MergeObject );
167 }
168
169 Handle(HYDROData_Entity) HYDROData_Zone::GetMergeObject() const
170 {
171   return Handle(HYDROData_Entity)::DownCast( 
172            GetReferenceObject( DataTag_MergeObject ) );
173 }
174
175 void HYDROData_Zone::RemoveMergeObject()
176 {
177   ClearReferenceObjects( DataTag_MergeObject );
178 }
179
180 bool HYDROData_Zone::AddObject( const Handle(HYDROData_Entity)& theObject )
181 {
182   if ( theObject.IsNull() )
183     return false;
184   
185   if ( !theObject->IsKind( STANDARD_TYPE(HYDROData_ArtificialObject) ) &&
186        !theObject->IsKind( STANDARD_TYPE(HYDROData_NaturalObject) ) && 
187        !theObject->IsKind( STANDARD_TYPE(HYDROData_LandCover) ) )
188     return false; // Wrong type of object
189
190   if ( HasReference( theObject, DataTag_Object ) )
191     return false; // Object is already in reference list
192
193   AddReferenceObject( theObject, DataTag_Object );
194
195   return true;
196 }
197
198 HYDROData_SequenceOfObjects HYDROData_Zone::GetObjects() const
199 {
200   return GetReferenceObjects( DataTag_Object );
201 }
202
203 void HYDROData_Zone::RemoveObjects()
204 {
205   ClearReferenceObjects( DataTag_Object );
206 }
207
208 bool HYDROData_Zone::IsSubmersible() const
209 {
210   HYDROData_SequenceOfObjects anObjects = GetObjects();
211   HYDROData_SequenceOfObjects::Iterator anObjsIter( anObjects );
212   for ( ; anObjsIter.More(); anObjsIter.Next() )
213   {
214     Handle(HYDROData_Object) aRefGeomObj =
215       Handle(HYDROData_Object)::DownCast( anObjsIter.Value() );
216     if ( aRefGeomObj.IsNull() )
217       continue;
218
219     if( !aRefGeomObj->IsSubmersible() )
220       return false; //if one of geometry objects is not submersible the zone is considered as not submersible
221   }
222   return true;
223 }
224