2 #include "HYDROData_CalculationCase.h"
4 #include "HYDROData_ArtificialObject.h"
5 #include "HYDROData_Document.h"
6 #include "HYDROData_Iterator.h"
7 #include "HYDROData_NaturalObject.h"
8 #include "HYDROData_SplitToZonesTool.h"
9 #include "HYDROData_Region.h"
10 #include "HYDROData_Tool.h"
11 #include "HYDROData_Zone.h"
13 #define PYTHON_CALCULATION_ID "KIND_CALCULATION"
15 IMPLEMENT_STANDARD_HANDLE(HYDROData_CalculationCase, HYDROData_Entity)
16 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_CalculationCase, HYDROData_Entity)
18 HYDROData_CalculationCase::HYDROData_CalculationCase()
23 HYDROData_CalculationCase::~HYDROData_CalculationCase()
27 QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
31 Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
32 if ( aDocument.IsNull() )
35 QString aDocName = aDocument->GetDocPyName();
36 QString aCalculName = GetName();
38 aResList << QString( "%1 = %2.CreateObject( %3 );" )
39 .arg( aCalculName ).arg( aDocName ).arg( PYTHON_CALCULATION_ID );
40 aResList << QString( "%1.SetName( \"%2\" );" )
41 .arg( aCalculName ).arg( aCalculName );
42 aResList << QString( "" );
44 HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
45 HYDROData_SequenceOfObjects::Iterator anIter( aGeomObjects );
46 for ( ; anIter.More(); anIter.Next() )
48 Handle(HYDROData_Object) aRefGeomObj =
49 Handle(HYDROData_Object)::DownCast( anIter.Value() );
50 if ( !aRefGeomObj.IsNull() )
51 setPythonReferenceObject( theTreatedObjects, aResList, aRefGeomObj, "AddGeometryObject" );
53 aResList << QString( "" );
55 aResList << QString( "%1.SplitGeometryObjects();" ).arg( aCalculName );
56 aResList << QString( "" );
58 // Now we restore the regions and zones order
59 HYDROData_SequenceOfObjects aRegions = GetRegions();
60 anIter.Init( aRegions );
61 for ( ; anIter.More(); anIter.Next() )
63 Handle(HYDROData_Region) aRegion =
64 Handle(HYDROData_Region)::DownCast( anIter.Value() );
65 if ( aRegion.IsNull() )
68 QString aRegionName = aRegion->GetName();
75 void HYDROData_CalculationCase::SplitGeometryObjects()
77 // At first we remove previously created regions
80 Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
81 if ( aDocument.IsNull() )
84 HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
85 if ( aGeomObjects.IsEmpty() )
88 HYDROData_SplitToZonesTool::SplitDataList aSplitedZones =
89 HYDROData_SplitToZonesTool::SplitToZones( aGeomObjects );
90 if ( aSplitedZones.isEmpty() )
93 // Create result regions for case, by default one zone for one region
94 HYDROData_SplitToZonesTool::SplitDataListIterator anIter( aSplitedZones );
95 while( anIter.hasNext() )
97 const HYDROData_SplitToZonesTool::SplitData& aSplitData = anIter.next();
100 Handle(HYDROData_Region) aRegion = addNewRegion();
102 QString aRegionName = HYDROData_Tool::GenerateObjectName( aDocument, "Region" );
103 aRegion->SetName( aRegionName );
105 // Add the zone for region
106 Handle(HYDROData_Zone) aRegionZone = aRegion->addNewZone();
108 QString aZoneName = HYDROData_Tool::GenerateObjectName( aDocument, "Zone" );
109 aRegionZone->SetName( aZoneName );
111 aRegionZone->SetShape( aSplitData.Face() );
113 // Add the reference object for zone
114 for ( int i = 0, n = aSplitData.ObjectNames.length(); i < n; ++i )
116 const QString& anObjName = aSplitData.ObjectNames.at( i );
118 Handle(HYDROData_Object) aRefObject = Handle(HYDROData_Object)::DownCast(
119 HYDROData_Tool::FindObjectByName( aDocument, anObjName ) );
120 if ( aRefObject.IsNull() )
123 aRegionZone->AddGeometryObject( aRefObject );
127 // The splitted data is up to date
128 SetToUpdate( false );
131 bool HYDROData_CalculationCase::AddGeometryObject( const Handle(HYDROData_Object)& theObject )
133 if ( theObject.IsNull() )
136 if ( !theObject->IsKind( STANDARD_TYPE(HYDROData_ArtificialObject) ) &&
137 !theObject->IsKind( STANDARD_TYPE(HYDROData_NaturalObject) ) )
138 return false; // Wrong type of object
140 if ( HasReference( theObject, DataTag_GeometryObject ) )
141 return false; // Object is already in reference list
143 AddReferenceObject( theObject, DataTag_GeometryObject );
145 // Indicate model of the need to update zones splitting
151 HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetGeometryObjects() const
153 return GetReferenceObjects( DataTag_GeometryObject );
156 void HYDROData_CalculationCase::RemoveGeometryObject( const Handle(HYDROData_Object)& theObject )
158 if ( theObject.IsNull() )
161 RemoveReferenceObject( theObject->Label(), DataTag_GeometryObject );
163 // Indicate model of the need to update zones splitting
167 void HYDROData_CalculationCase::RemoveGeometryObjects()
169 ClearReferenceObjects( DataTag_GeometryObject );
171 // Indicate model of the need to update zones splitting
175 Handle(HYDROData_Region) HYDROData_CalculationCase::AddNewRegion( const Handle(HYDROData_Zone)& theZone )
177 Handle(HYDROData_Region) aNewRegion = addNewRegion();
178 if ( aNewRegion.IsNull() )
181 // Generate new name for new region
182 Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
183 if ( !aDocument.IsNull() )
185 QString aNewRegionName = HYDROData_Tool::GenerateObjectName( aDocument, "Region" );
186 aNewRegion->SetName( aNewRegionName );
189 aNewRegion->AddZone( theZone );
194 bool HYDROData_CalculationCase::AddRegion( const Handle(HYDROData_Region)& theRegion )
196 if ( theRegion.IsNull() )
199 if ( HasReference( theRegion, DataTag_Region ) )
200 return false; // Object is already in reference list
202 // Move the region from other calculation
203 Handle(HYDROData_CalculationCase) aFatherCalc =
204 Handle(HYDROData_CalculationCase)::DownCast( theRegion->GetFatherObject() );
205 if ( !aFatherCalc.IsNull() && aFatherCalc->Label() != myLab )
207 Handle(HYDROData_Region) aNewRegion = addNewRegion();
208 theRegion->CopyTo( aNewRegion );
210 aFatherCalc->RemoveRegion( theRegion );
212 theRegion->SetLabel( aNewRegion->Label() );
216 AddReferenceObject( theRegion, DataTag_Region );
222 HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetRegions() const
224 return GetReferenceObjects( DataTag_Region );
227 void HYDROData_CalculationCase::RemoveRegion( const Handle(HYDROData_Region)& theRegion )
229 if ( theRegion.IsNull() )
232 RemoveReferenceObject( theRegion->Label(), DataTag_Region );
234 // Remove region from data model
235 Handle(HYDROData_CalculationCase) aFatherCalc =
236 Handle(HYDROData_CalculationCase)::DownCast( theRegion->GetFatherObject() );
237 if ( !aFatherCalc.IsNull() && aFatherCalc->Label() == myLab )
241 void HYDROData_CalculationCase::RemoveRegions()
243 ClearReferenceObjects( DataTag_Region );
244 myLab.FindChild( DataTag_ChildRegion ).ForgetAllAttributes( true );
247 Handle(HYDROData_Region) HYDROData_CalculationCase::addNewRegion()
249 TDF_Label aNewLab = myLab.FindChild( DataTag_ChildRegion ).NewChild();
251 Handle(HYDROData_Region) aNewRegion =
252 Handle(HYDROData_Region)::DownCast( HYDROData_Iterator::CreateObject( aNewLab, KIND_REGION ) );
253 AddRegion( aNewRegion );