Salome HOME
Merge branch 'BR_v14_rc' into BR_quadtree
[modules/hydro.git] / src / HYDROData / HYDROData_CalculationCase.cxx
index ebf530ce1f340ae49a810ed40e12680d207d9513..2dd84bef4672b2a3a2f18bf2c900456278ebb7f7 100644 (file)
@@ -25,6 +25,8 @@
 #include "HYDROData_Iterator.h"
 #include "HYDROData_NaturalObject.h"
 #include "HYDROData_PolylineXY.h"
+#include "HYDROData_StricklerTable.h"
+#include "HYDROData_LandCover.h"
 #include "HYDROData_SplittedShapesGroup.h"
 #include "HYDROData_Region.h"
 #include "HYDROData_Tool.h"
@@ -352,7 +354,7 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume
   QMap<QString, Handle(HYDROData_Region)> aRegionsMap; //object name to region
   QMap<QString, QString> aRegionNameToObjNameMap;
   QString aZonesPref = CALCULATION_ZONES_PREF;
-  HYDROData_PriorityQueue aPr( this );
+  HYDROData_PriorityQueue aPr( this, DataTag_CustomRules );
 
   // 1. First we create a default region for each object included into the calculation case
   HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
@@ -375,7 +377,8 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume
   {
     const HYDROData_SplitToZonesTool::SplitData& aSplitData = anIter.next();
     HYDROData_Zone::MergeAltitudesType aMergeType;
-    Handle(HYDROData_Object) aRegObj = aPr.GetMostPriorityObject( aSplitData.ObjectNames, aMergeType );
+    Handle(HYDROData_Object) aRegObj =
+      Handle(HYDROData_Object)::DownCast( aPr.GetMostPriorityObject( aSplitData.ObjectNames, aMergeType ) );
     if( aRegObj.IsNull() )
       continue;
     Handle(HYDROData_Region) aRegion = aRegionsMap[aRegObj->GetName()];
@@ -566,6 +569,69 @@ void HYDROData_CalculationCase::RemoveBoundaryPolyline()
   SetToUpdate( !aPrevPolyline.IsNull() || IsMustBeUpdated() );
 }
 
+void HYDROData_CalculationCase::SetStricklerTable( const Handle(HYDROData_StricklerTable)& theStricklerTable )
+{
+  Handle(HYDROData_StricklerTable) aPrevStricklerTable = GetStricklerTable();
+
+  SetReferenceObject( theStricklerTable, DataTag_StricklerTable );
+
+  // Indicate model of the need to update land covers partition
+  SetToUpdate( !IsEqual( aPrevStricklerTable, theStricklerTable ) || IsMustBeUpdated() );
+}
+
+Handle(HYDROData_StricklerTable) HYDROData_CalculationCase::GetStricklerTable() const
+{
+  return Handle(HYDROData_StricklerTable)::DownCast( 
+           GetReferenceObject( DataTag_StricklerTable ) );
+}
+
+void HYDROData_CalculationCase::RemoveStricklerTable()
+{
+  Handle(HYDROData_StricklerTable) aPrevStricklerTable = GetStricklerTable();
+
+  ClearReferenceObjects( DataTag_StricklerTable );
+
+  // Indicate model of the need to update land covers partition
+  SetToUpdate( !aPrevStricklerTable.IsNull() || IsMustBeUpdated() );
+}
+
+bool HYDROData_CalculationCase::AddLandCover( const Handle(HYDROData_LandCover)& theLandCover )
+{
+  if ( HasReference( theLandCover, DataTag_LandCover ) )
+    return false; // Land cover is already in reference list
+
+  AddReferenceObject( theLandCover, DataTag_LandCover );
+  
+  // Indicate model of the need to update land covers partition
+  SetToUpdate( true );
+
+  return true;
+}
+
+HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetLandCovers() const
+{
+  return GetReferenceObjects( DataTag_LandCover );
+}
+
+void HYDROData_CalculationCase::RemoveLandCover( const Handle(HYDROData_LandCover)& theLandCover )
+{
+  if ( theLandCover.IsNull() )
+    return;
+
+  RemoveReferenceObject( theLandCover->Label(), DataTag_LandCover );
+
+  // Indicate model of the need to update land cover partition
+  SetToUpdate( true );
+}
+
+void HYDROData_CalculationCase::RemoveLandCovers()
+{
+  ClearReferenceObjects( DataTag_LandCover );
+
+  // Indicate model of the need to update land cover partition
+  SetToUpdate( true );
+}
+
 Handle(HYDROData_Region) HYDROData_CalculationCase::AddNewRegion( const Handle(HYDROData_Zone)& theZone )
 {
   Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
@@ -979,7 +1045,7 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var  theGeomEngine,
   {
     Handle(HYDROData_Region) aRegion =
       Handle(HYDROData_Region)::DownCast( aRegionIter.Value() );
-    if( aRegion.IsNull() )
+    if( aRegion.IsNull() || !aRegion->IsSubmersible() )
       continue;
 
     TopoDS_Shape aRegionShape = aRegion->GetShape( &aSeqOfGroupsDefs );
@@ -1047,7 +1113,7 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var
   // Publish the sewed shape
   QString aName = EXPORT_NAME;
   GEOM::GEOM_Object_ptr aMainShape = 
-    publishShapeInGEOM( theGeomEngine, theStudy, aSewedShape, aName, theGeomObjEntry );
+    HYDROData_GeomTool::publishShapeInGEOM( theGeomEngine, theStudy, aSewedShape, aName, theGeomObjEntry );
 
   if ( aMainShape->_is_nil() )  
     return false;
@@ -1144,55 +1210,10 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var
   return true;
 }
 
-GEOM::GEOM_Object_ptr HYDROData_CalculationCase::publishShapeInGEOM( 
-  GEOM::GEOM_Gen_var theGeomEngine, SALOMEDS::Study_ptr theStudy,
-  const TopoDS_Shape& theShape, const QString& theName,
-  QString& theGeomObjEntry ) const
-{
-  theGeomObjEntry = "";
-  GEOM::GEOM_Object_var aGeomObj;
-
-  if ( theGeomEngine->_is_nil() || theStudy->_is_nil() ||
-       theShape.IsNull() ) {
-    return aGeomObj._retn();
-  }
-
-  std::ostringstream aStreamShape;
-  // Write TopoDS_Shape in ASCII format to the stream
-  BRepTools::Write( theShape, aStreamShape );
-  // Returns the number of bytes that have been stored in the stream's buffer.
-  int aSize = aStreamShape.str().size();
-  // Allocate octect buffer of required size
-  CORBA::Octet* anOctetBuf = SALOMEDS::TMPFile::allocbuf( aSize );
-  // Copy ostrstream content to the octect buffer
-  memcpy( anOctetBuf, aStreamShape.str().c_str(), aSize );
-  // Create TMPFile
-  SALOMEDS::TMPFile_var aSeqFile = new SALOMEDS::TMPFile( aSize, aSize, anOctetBuf, 1 );
-
-  // Restore shape from the stream and get the GEOM object
-  GEOM::GEOM_IInsertOperations_var anInsOp = theGeomEngine->GetIInsertOperations( theStudy->StudyId() );
-  aGeomObj = anInsOp->RestoreShape( aSeqFile );
-  
-  // Puplish the GEOM object
-  if ( !aGeomObj->_is_nil() ) {
-    QString aName = HYDROData_GeomTool::GetFreeName( theStudy, theName );
-
-    SALOMEDS::SObject_var aResultSO = 
-      theGeomEngine->PublishInStudy( theStudy, SALOMEDS::SObject::_nil(), 
-                                     aGeomObj, qPrintable( aName ) );
-    if ( aResultSO->_is_nil() ) {
-      aGeomObj = GEOM::GEOM_Object::_nil();
-    }
-    else
-      theGeomObjEntry = aResultSO->GetID();
-  }
-
-  return aGeomObj._retn();
-}
-
-void HYDROData_CalculationCase::ClearRules( const bool theIsSetToUpdate )
+void HYDROData_CalculationCase::ClearRules( HYDROData_CalculationCase::DataTag theDataTag,
+                                            const bool theIsSetToUpdate )
 {
-  TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules );
+  TDF_Label aRulesLab = myLab.FindChild( theDataTag );
   HYDROData_PriorityQueue::ClearRules( aRulesLab );
 
   // Indicate model of the need to update splitting
@@ -1201,12 +1222,13 @@ void HYDROData_CalculationCase::ClearRules( const bool theIsSetToUpdate )
   }
 }
 
-void HYDROData_CalculationCase::AddRule( const Handle(HYDROData_Object)&    theObject1,
+void HYDROData_CalculationCase::AddRule( const Handle(HYDROData_Entity)&    theObject1,
                                          HYDROData_PriorityType             thePriority,
-                                         const Handle(HYDROData_Object)&    theObject2,
-                                         HYDROData_Zone::MergeAltitudesType theMergeType )
+                                         const Handle(HYDROData_Entity)&    theObject2,
+                                         HYDROData_Zone::MergeAltitudesType theMergeType,
+                                         HYDROData_CalculationCase::DataTag theDataTag )
 {
-  TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules );
+  TDF_Label aRulesLab = myLab.FindChild( theDataTag );
   HYDROData_PriorityQueue::AddRule( aRulesLab, theObject1, thePriority, theObject2, theMergeType );
 
   // Indicate model of the need to update splitting
@@ -1257,12 +1279,32 @@ void HYDROData_CalculationCase::SetWarning( HYDROData_WarningType theType, const
 }
 
 bool HYDROData_CalculationCase::GetRule( int theIndex, 
-                                         Handle(HYDROData_Object)&           theObject1,
+                                         Handle(HYDROData_Entity)&           theObject1,
                                          HYDROData_PriorityType&             thePriority,
-                                         Handle(HYDROData_Object)&           theObject2,
-                                         HYDROData_Zone::MergeAltitudesType& theMergeType ) const
+                                         Handle(HYDROData_Entity)&           theObject2,
+                                         HYDROData_Zone::MergeAltitudesType& theMergeType,
+                                         HYDROData_CalculationCase::DataTag& theDataTag) const
 {
-  TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules );
+  TDF_Label aRulesLab = myLab.FindChild( theDataTag );
   return HYDROData_PriorityQueue::GetRule( aRulesLab, theIndex,
     theObject1, thePriority, theObject2, theMergeType );
 }
+
+void HYDROData_CalculationCase::SetAssignmentLandCoverMode( AssignmentMode theMode )
+{
+  TDF_Label aModeLab = myLab.FindChild( DataTag_AssignmentLandCoverMode );
+  TDataStd_Integer::Set( aModeLab, ( int ) theMode );
+
+  // Indicate model of the need to update land covers partition
+  SetToUpdate( true );
+}
+
+HYDROData_CalculationCase::AssignmentMode HYDROData_CalculationCase::GetAssignmentLandCoverMode() const
+{
+  Handle(TDataStd_Integer) aModeAttr;
+  bool isOK = myLab.FindChild( DataTag_AssignmentLandCoverMode ).FindAttribute( TDataStd_Integer::GetID(), aModeAttr );
+  if( isOK )
+    return ( AssignmentMode ) aModeAttr->Get();
+  else
+    return MANUAL;
+}