Salome HOME
40d193b575b7cedd1e4050fa1d31caed30764211
[modules/hydro.git] / src / HYDROData / HYDROData_Region.cxx
1
2 #include "HYDROData_Region.h"
3
4 #include "HYDROData_Document.h"
5 #include "HYDROData_Iterator.h"
6 #include "HYDROData_Zone.h"
7
8 #include <QStringList>
9
10 #define PYTHON_REGION_ID "KIND_REGION"
11
12 IMPLEMENT_STANDARD_HANDLE(HYDROData_Region, HYDROData_Entity)
13 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Region, HYDROData_Entity)
14
15
16 HYDROData_Region::HYDROData_Region()
17  : HYDROData_Entity()
18 {
19 }
20
21 HYDROData_Region::~HYDROData_Region()
22 {
23 }
24
25 QStringList HYDROData_Region::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
26 {
27   QStringList aResList;
28
29   Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this );
30   if ( aDocument.IsNull() )
31     return aResList;
32
33   QString aDocName = aDocument->GetDocPyName();
34   QString aRegionName = GetName();
35
36   aResList << QString( "%1 = %2.CreateObject( %3 );" )
37               .arg( aRegionName ).arg( aDocName ).arg( PYTHON_REGION_ID );
38   aResList << QString( "%1.SetName( \"%2\" );" )
39               .arg( aRegionName ).arg( aRegionName );
40   aResList << QString( "" );
41
42   HYDROData_SequenceOfObjects aZones = GetZones();
43   HYDROData_SequenceOfObjects::Iterator anIter( aZones );
44   for ( ; anIter.More(); anIter.Next() )
45   {
46     Handle(HYDROData_Zone) aRefZone =
47       Handle(HYDROData_Zone)::DownCast( anIter.Value() );
48     if ( !aRefZone.IsNull() )
49       setPythonReferenceObject( theTreatedObjects, aResList, aRefZone, "AddZone" );
50   }
51   aResList << QString( "" );
52
53   return aResList;
54 }
55
56 bool HYDROData_Region::AddZone( const Handle(HYDROData_Zone)& theZone )
57 {
58   if ( theZone.IsNull() )
59     return false;
60   
61   if ( HasReference( theZone, DataTag_Zone ) )
62     return false; // Object is already in reference list
63
64   // Move the zone from other region
65   Handle(HYDROData_Region) aFatherRegion = 
66     Handle(HYDROData_Region)::DownCast( theZone->GetFatherObject() );
67   if ( !aFatherRegion.IsNull() && aFatherRegion->Label() != myLab )
68   {
69     Handle(HYDROData_Zone) aNewZone = addNewZone();
70     theZone->CopyTo( aNewZone );
71
72     aFatherRegion->RemoveZone( theZone );
73
74     theZone->SetLabel( aNewZone->Label() );
75   }
76
77   AddReferenceObject( theZone, DataTag_Zone );
78   return true;
79 }
80
81 HYDROData_SequenceOfObjects HYDROData_Region::GetZones() const
82 {
83   return GetReferenceObjects( DataTag_Zone );
84 }
85
86 void HYDROData_Region::RemoveZone( const Handle(HYDROData_Zone)& theZone )
87 {
88   if ( theZone.IsNull() )
89     return;
90
91   RemoveReferenceObject( theZone->Label(), DataTag_Zone );
92
93   // Remove zone from data model
94   Handle(HYDROData_Region) aFatherRegion = 
95     Handle(HYDROData_Region)::DownCast( theZone->GetFatherObject() );
96   if ( !aFatherRegion.IsNull() && aFatherRegion->Label() == myLab )
97     theZone->Remove();
98
99   // If the last zone has been removed from region we remove this region
100   HYDROData_SequenceOfObjects aRefZones = GetZones();
101   if ( aRefZones.IsEmpty() )
102     Remove();
103 }
104
105 void HYDROData_Region::RemoveZones()
106 {
107   ClearReferenceObjects( DataTag_Zone );
108   myLab.FindChild( DataTag_ChildZone ).ForgetAllAttributes( true );
109 }
110
111 Handle(HYDROData_Zone) HYDROData_Region::addNewZone()
112 {
113   TDF_Label aNewLab = myLab.FindChild( DataTag_ChildZone ).NewChild();
114
115   Handle(HYDROData_Zone) aNewZone =
116     Handle(HYDROData_Zone)::DownCast( HYDROData_Iterator::CreateObject( aNewLab, KIND_ZONE ) );
117   AddZone( aNewZone );
118
119   return aNewZone;
120 }
121