X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_CalculationCase.cxx;h=b0241aa91ba15b556d27f14eb7c47e5e85870665;hb=00d0017f5e951fb3dd965140d1f16d07d9a49daa;hp=e5fda65ca9a855783244b884b89c3d96685f060f;hpb=6b60d479d87151dc450c93a914bc60936dbcd5cc;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index e5fda65c..b0241aa9 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -60,6 +60,7 @@ #endif #define CALCULATION_REGIONS_PREF GetName() + "_Reg" #define CALCULATION_ZONES_PREF GetName() + "_Zone" +#define CALCULATION_LANDCOVER_ZONES_PREF GetName() + "_LandCoverZone" #define CALCULATION_GROUPS_PREF GetName() + "_" //#define DEB_CLASS2D 1 #ifdef DEB_CLASS2D @@ -115,10 +116,14 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre QString aCalculName = GetObjPyName(); - AssignmentMode aMode = GetAssignmentMode(); + AssignmentMode aMode = GetAssignmentMode(); QString aModeStr = aMode==MANUAL ? "HYDROData_CalculationCase.MANUAL" : "HYDROData_CalculationCase.AUTOMATIC"; aResList << QString( "%0.SetAssignmentMode( %1 )" ).arg( aCalculName ).arg( aModeStr ); + AssignmentMode aModeLC = GetAssignmentLandCoverMode(); + QString aModeLCStr = aModeLC==MANUAL ? "HYDROData_CalculationCase.MANUAL" : "HYDROData_CalculationCase.AUTOMATIC"; + aResList << QString( "%0.SetAssignmentLandCoverMode( %1 )" ).arg( aCalculName ).arg( aModeLCStr ); + HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects(); HYDROData_SequenceOfObjects::Iterator anIter( aGeomObjects ); for ( ; anIter.More(); anIter.Next() ) @@ -157,6 +162,8 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre if( aMode==AUTOMATIC ) DumpRulesToPython( aCalculName, aResList ); + if( aModeLC==AUTOMATIC ) + DumpLandCoverRulesToPython( aCalculName, aResList ); aResList << QString( "" ); aResList << "# Start the algorithm of the partition and assignment"; @@ -166,7 +173,12 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre { // Now we restore the // - regions and zones order - DumpRegionsToPython( aResList, theTreatedObjects, GetRegions( false ) ); + DumpRegionsToPython( aResList, theTreatedObjects, GetRegions( false ) ); + } + + if( aModeLC==MANUAL ) + { + // Now we restore the // - land cover regions and zones order DumpRegionsToPython( aResList, theTreatedObjects, GetRegions( true ) ); } @@ -307,14 +319,23 @@ void HYDROData_CalculationCase::Update() switch( GetAssignmentMode() ) { case MANUAL: - CreateRegionsDef( aDocument, aZonesList, false ); + CreateRegionsDef( aDocument, aZonesList, false ); + break; + case AUTOMATIC: + CreateRegionsAuto( aDocument, aZonesList, false ); + break; + } + + switch( GetAssignmentLandCoverMode() ) + { + case MANUAL: CreateRegionsDef( aDocument, aLandCoverZonesList, true ); break; case AUTOMATIC: - CreateRegionsAuto( aDocument, aZonesList, false ); CreateRegionsAuto( aDocument, aLandCoverZonesList, true ); break; } + CreateEdgeGroupsDef( aDocument, anEdgesList ); } @@ -324,7 +345,7 @@ void HYDROData_CalculationCase::CreateRegionsDef( const Handle(HYDROData_Documen { // Create result regions for case, by default one zone for one region QString aRegsPref = CALCULATION_REGIONS_PREF; - QString aZonesPref = CALCULATION_ZONES_PREF; + QString aZonesPref = theLandCover ? CALCULATION_LANDCOVER_ZONES_PREF : CALCULATION_ZONES_PREF; HYDROData_SplitToZonesTool::SplitDataListIterator anIter( theZones ); while( anIter.hasNext() ) @@ -344,8 +365,8 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume { QMap aRegionsMap; //object name to region QMap aRegionNameToObjNameMap; - QString aZonesPref = CALCULATION_ZONES_PREF; - HYDROData_PriorityQueue aPr( this, DataTag_CustomRules ); + QString aZonesPref = theLandCover ? CALCULATION_LANDCOVER_ZONES_PREF : CALCULATION_ZONES_PREF; + HYDROData_PriorityQueue aPr( this, theLandCover ? DataTag_CustomLandCoverRules : DataTag_CustomRules ); // 1. First we create a default region for each object included into the calculation case HYDROData_SequenceOfObjects anObjects = theLandCover ? GetLandCovers() : GetGeometryObjects(); @@ -367,9 +388,8 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume while( anIter.hasNext() ) { const HYDROData_SplitToZonesTool::SplitData& aSplitData = anIter.next(); - HYDROData_Zone::MergeAltitudesType aMergeType; - Handle(HYDROData_Object) aRegObj = - Handle(HYDROData_Object)::DownCast( aPr.GetMostPriorityObject( aSplitData.ObjectNames, aMergeType ) ); + HYDROData_Zone::MergeType aMergeType; + Handle(HYDROData_Entity) aRegObj = aPr.GetMostPriorityObject( aSplitData.ObjectNames, aMergeType ); if( aRegObj.IsNull() ) continue; Handle(HYDROData_Region) aRegion = aRegionsMap[aRegObj->GetName()]; @@ -382,6 +402,14 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume qDebug( "Error in algorithm: unresolved conflicts" ); } + Handle(HYDROData_Entity) aMergeEntity = aRegObj; + if ( !theLandCover ) { + Handle(HYDROData_Object) aMergeObject = Handle(HYDROData_Object)::DownCast( aMergeEntity ); + if ( !aMergeObject.IsNull() ) { + aMergeEntity = aMergeObject->GetAltitudeObject(); + } + } + switch( aMergeType ) { case HYDROData_Zone::Merge_ZMIN: @@ -390,8 +418,8 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume break; case HYDROData_Zone::Merge_Object: aRegionZone->SetMergeType( aMergeType ); - aRegionZone->RemoveMergeAltitude(); - aRegionZone->SetMergeAltitude( aRegObj->GetAltitudeObject() ); + aRegionZone->RemoveMergeObject(); + aRegionZone->SetMergeObject( aMergeEntity ); break; } } @@ -682,7 +710,8 @@ void HYDROData_CalculationCase::UpdateRegionsOrder() return; HYDROData_SequenceOfObjects aRegions = GetRegions( false ); - aRegions.Append( GetRegions( true ) ); + HYDROData_SequenceOfObjects aRegionsLC = GetRegions( true ); + aRegions.Append( aRegionsLC ); HYDROData_SequenceOfObjects::Iterator anIter( aRegions ); for ( ; anIter.More(); anIter.Next() ) @@ -771,7 +800,7 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& if ( theZone.IsNull() ) return aResAltitude; - HYDROData_Zone::MergeAltitudesType aZoneMergeType = theZone->GetMergeType(); + HYDROData_Zone::MergeType aZoneMergeType = theZone->GetMergeType(); if ( !theZone->IsMergingNeed() ) { aZoneMergeType = HYDROData_Zone::Merge_UNKNOWN; @@ -784,7 +813,8 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& HYDROData_IInterpolator* aZoneInterpolator = theZone->GetInterpolator(); if ( aZoneMergeType == HYDROData_Zone::Merge_Object ) { - Handle(HYDROData_IAltitudeObject) aMergeAltitude = theZone->GetMergeAltitude(); + Handle(HYDROData_IAltitudeObject) aMergeAltitude = + Handle(HYDROData_IAltitudeObject)::DownCast( theZone->GetMergeObject() ); if ( !aMergeAltitude.IsNull() ) { if ( aZoneInterpolator != NULL ) @@ -798,7 +828,7 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& } else { - HYDROData_SequenceOfObjects aZoneObjects = theZone->GetGeometryObjects(); + HYDROData_SequenceOfObjects aZoneObjects = theZone->GetObjects(); HYDROData_SequenceOfObjects::Iterator anIter( aZoneObjects ); for ( ; anIter.More(); anIter.Next() ) { @@ -884,6 +914,38 @@ NCollection_Sequence HYDROData_CalculationCase::GetAltitudesForPoints( return aResSeq; } +double HYDROData_CalculationCase::GetStricklerCoefficientForPoint( const gp_XY& thePoint ) const +{ + double aCoeff = 0; + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab ); + if ( !aDocument.IsNull() ) + aCoeff = aDocument->GetDefaultStricklerCoefficient(); + + Handle(HYDROData_LandCover) aLandCover; + Handle(HYDROData_Zone) aZone = GetZoneFromPoint( thePoint, Standard_True ); + if ( !aZone.IsNull() ) + { + HYDROData_SequenceOfObjects anObjList = aZone->GetObjects(); + if ( anObjList.Length() == 1 ) + aLandCover = Handle(HYDROData_LandCover)::DownCast( anObjList.First() ); + else + aLandCover = Handle(HYDROData_LandCover)::DownCast( aZone->GetMergeObject() ); + } + + if ( !aLandCover.IsNull() ) + { + QString aType = aLandCover->GetStricklerType(); + Handle(HYDROData_StricklerTable) aTable = GetStricklerTable(); + if ( !aTable.IsNull() ) + { + if ( aTable->GetTypes().contains( aType ) ) + aCoeff = aTable->Get( aType, aCoeff ); + } + } + + return aCoeff; +} + Handle(HYDROData_Region) HYDROData_CalculationCase::GetRegionFromPoint( const gp_XY& thePoint, const bool theLandCover ) const { @@ -997,14 +1059,15 @@ QString HYDROData_CalculationCase::Export( int theStudyId ) const GEOM::GEOM_Gen_var aGEOMEngine = HYDROData_GeomTool::GetGeomGen(); SALOMEDS::Study_var aDSStudy = HYDROData_GeomTool::GetStudyByID( theStudyId ); - QString aGeomObjEntry; - bool isOK = Export( aGEOMEngine, aDSStudy, aGeomObjEntry ); + QString aGeomObjEntry, anErrorMsg; + bool isOK = Export( aGEOMEngine, aDSStudy, aGeomObjEntry, anErrorMsg ); return isOK ? aGeomObjEntry : QString(); } bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, SALOMEDS::Study_ptr theStudy, - QString& theGeomObjEntry ) const + QString& theGeomObjEntry, + QString& theErrorMsg ) const { HYDROData_ShapesGroup::SeqOfGroupsDefs aSeqOfGroupsDefs; @@ -1029,6 +1092,7 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, } // Get faces + bool isAllNotSubmersible = true; TopTools_ListOfShape aFaces; HYDROData_SequenceOfObjects aCaseRegions = GetRegions( false ); HYDROData_SequenceOfObjects::Iterator aRegionIter( aCaseRegions ); @@ -1038,12 +1102,25 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, Handle(HYDROData_Region)::DownCast( aRegionIter.Value() ); if( aRegion.IsNull() || !aRegion->IsSubmersible() ) continue; + + if ( isAllNotSubmersible ) + isAllNotSubmersible = false; TopoDS_Shape aRegionShape = aRegion->GetShape( &aSeqOfGroupsDefs ); aFaces.Append( aRegionShape ); } - return Export( theGeomEngine, theStudy, aFaces, aSeqOfGroupsDefs, theGeomObjEntry ); + bool aRes = false; + + if ( aCaseRegions.IsEmpty() ) { + theErrorMsg = QString("the list of regions is empty."); + } else if ( isAllNotSubmersible ) { + theErrorMsg = QString("there are no submersible regions."); + } else { + aRes = Export( theGeomEngine, theStudy, aFaces, aSeqOfGroupsDefs, theGeomObjEntry );; + } + + return aRes; } bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, @@ -1104,7 +1181,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; @@ -1201,52 +1278,6 @@ 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( HYDROData_CalculationCase::DataTag theDataTag, const bool theIsSetToUpdate ) { @@ -1262,7 +1293,7 @@ void HYDROData_CalculationCase::ClearRules( HYDROData_CalculationCase::DataTag t void HYDROData_CalculationCase::AddRule( const Handle(HYDROData_Entity)& theObject1, HYDROData_PriorityType thePriority, const Handle(HYDROData_Entity)& theObject2, - HYDROData_Zone::MergeAltitudesType theMergeType, + HYDROData_Zone::MergeType theMergeType, HYDROData_CalculationCase::DataTag theDataTag ) { TDF_Label aRulesLab = myLab.FindChild( theDataTag ); @@ -1278,6 +1309,12 @@ QString HYDROData_CalculationCase::DumpRules() const return HYDROData_PriorityQueue::DumpRules( aRulesLab ); } +QString HYDROData_CalculationCase::DumpLandCoverRules() const +{ + TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomLandCoverRules ); + return HYDROData_PriorityQueue::DumpRules( aRulesLab ); +} + void HYDROData_CalculationCase::SetAssignmentMode( AssignmentMode theMode ) { TDF_Label aModeLab = myLab.FindChild( DataTag_AssignmentMode ); @@ -1304,6 +1341,13 @@ void HYDROData_CalculationCase::DumpRulesToPython( const QString& theCalcCaseNam HYDROData_PriorityQueue::DumpRulesToPython( aRulesLab, theCalcCaseName, theScript ); } +void HYDROData_CalculationCase::DumpLandCoverRulesToPython( const QString& theCalcCaseName, + QStringList& theScript ) const +{ + TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomLandCoverRules ); + HYDROData_PriorityQueue::DumpRulesToPython( aRulesLab, theCalcCaseName, theScript ); +} + HYDROData_Warning HYDROData_CalculationCase::GetLastWarning() const { return myLastWarning; @@ -1366,7 +1410,7 @@ bool HYDROData_CalculationCase::GetRule( int theIndex, Handle(HYDROData_Entity)& theObject1, HYDROData_PriorityType& thePriority, Handle(HYDROData_Entity)& theObject2, - HYDROData_Zone::MergeAltitudesType& theMergeType, + HYDROData_Zone::MergeType& theMergeType, HYDROData_CalculationCase::DataTag& theDataTag) const { TDF_Label aRulesLab = myLab.FindChild( theDataTag );