Salome HOME
Reference Bathymetry objects moved to base for geometry objects class.
[modules/hydro.git] / src / HYDROData / HYDROData_Zone.cxx
1
2 #include "HYDROData_Zone.h"
3
4 #include "HYDROData_ArtificialObject.h"
5 #include "HYDROData_Bathymetry.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   SetMergeType( Merge_ZMIN );
28 }
29
30 HYDROData_Zone::~HYDROData_Zone()
31 {
32 }
33
34 QStringList HYDROData_Zone::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
35 {
36   QStringList aResList;
37
38   Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this );
39   if ( aDocument.IsNull() )
40     return aResList;
41
42   QString aDocName = aDocument->GetDocPyName();
43   QString aZoneName = GetName();
44
45   aResList << QString( "%1 = %2.CreateObject( %3 );" )
46               .arg( aZoneName ).arg( aDocName ).arg( PYTHON_ZONE_ID );
47   aResList << QString( "%1.SetName( \"%2\" );" )
48               .arg( aZoneName ).arg( aZoneName );
49   aResList << QString( "" );
50
51   HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
52   HYDROData_SequenceOfObjects::Iterator aGeomObjsIter( aGeomObjects );
53   for ( ; aGeomObjsIter.More(); aGeomObjsIter.Next() )
54   {
55     Handle(HYDROData_Object) aRefGeomObj =
56       Handle(HYDROData_Object)::DownCast( aGeomObjsIter.Value() );
57     if ( !aRefGeomObj.IsNull() )
58       setPythonReferenceObject( theTreatedObjects, aResList, aRefGeomObj, "AddGeometryObject" );
59   }
60
61   // How can we get the shape? Mb Update() method to intersect the shapes of reference objects?
62   // TODO:  TopoDS_Shape aRefShape = GetShape();
63
64   return aResList;
65 }
66
67 void HYDROData_Zone::SetShape( const TopoDS_Shape& theShape )
68 {
69   TNaming_Builder aBuilder( myLab.FindChild( DataTag_Shape ) );
70   aBuilder.Generated( theShape );
71 }
72
73 TopoDS_Shape HYDROData_Zone::GetShape() const
74 {
75   Handle(TNaming_NamedShape) aNamedShape;
76   if( myLab.FindChild( DataTag_Shape ).FindAttribute( TNaming_NamedShape::GetID(), aNamedShape ) )
77     return aNamedShape->Get();
78   return TopoDS_Shape();
79 }
80
81 void HYDROData_Zone::SetMergeType( const MergeBathymetriesType& theType )
82 {
83   Handle(TDataStd_Integer) anInt;
84   if ( !myLab.FindChild( DataTag_MergeType ).FindAttribute( TDataStd_Integer::GetID(), anInt ) )
85     anInt = TDataStd_Integer::Set( myLab, 0 );
86   anInt->Set( (int)theType );
87 }
88
89 HYDROData_Zone::MergeBathymetriesType HYDROData_Zone::GetMergeType() const
90 {
91   MergeBathymetriesType aMergeType = Merge_ZMIN;
92   
93   Handle(TDataStd_Integer) anInt;
94   if ( myLab.FindChild( DataTag_MergeType ).FindAttribute( TDataStd_Integer::GetID(), anInt ) )
95     aMergeType = (MergeBathymetriesType)anInt->Get();
96
97   return aMergeType;
98 }
99
100 void HYDROData_Zone::SetMergeBathymetry( const Handle(HYDROData_Bathymetry)& theBathymetry )
101 {
102   SetReferenceObject( theBathymetry, DataTag_Bathymetry );
103 }
104
105 Handle(HYDROData_Bathymetry) HYDROData_Zone::GetMergeBathymetry() const
106 {
107   return Handle(HYDROData_Bathymetry)::DownCast( 
108            GetReferenceObject( DataTag_Bathymetry ) );
109 }
110
111 void HYDROData_Zone::RemoveMergeBathymetry()
112 {
113   ClearReferenceObjects( DataTag_Bathymetry );
114 }
115
116 bool HYDROData_Zone::AddGeometryObject( const Handle(HYDROData_Object)& theObject )
117 {
118   if ( theObject.IsNull() )
119     return false;
120   
121   if ( !theObject->IsKind( STANDARD_TYPE(HYDROData_ArtificialObject) ) &&
122        !theObject->IsKind( STANDARD_TYPE(HYDROData_NaturalObject) ) )
123     return false; // Wrong type of object
124
125   if ( HasReference( theObject, DataTag_GeometryObject ) )
126     return false; // Object is already in reference list
127
128   AddReferenceObject( theObject, DataTag_GeometryObject );
129   return true;
130 }
131
132 HYDROData_SequenceOfObjects HYDROData_Zone::GetGeometryObjects() const
133 {
134   return GetReferenceObjects( DataTag_GeometryObject );
135 }
136
137 void HYDROData_Zone::RemoveGeometryObjects()
138 {
139   ClearReferenceObjects( DataTag_GeometryObject );
140 }
141
142
143