X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_CalculationCase.cxx;h=c59b01e33b10330daba54564ca5771021774b3e9;hb=13dcd7edcf93135429fce003da064297775ac11d;hp=e5fda65ca9a855783244b884b89c3d96685f060f;hpb=6b60d479d87151dc450c93a914bc60936dbcd5cc;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index e5fda65c..c59b01e3 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -16,8 +16,11 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -#include "HYDROData_CalculationCase.h" +#ifdef WIN32 + #pragma warning ( disable: 4251 ) +#endif +#include "HYDROData_CalculationCase.h" #include "HYDROData_ArtificialObject.h" #include "HYDROData_IAltitudeObject.h" #include "HYDROData_Document.h" @@ -60,14 +63,25 @@ #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 #include #endif +#ifdef WIN32 + #pragma warning ( default: 4251 ) +#endif + #define EXPORT_NAME "HYDRO_" + GetName() +#include +#include + +#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" + IMPLEMENT_STANDARD_HANDLE(HYDROData_CalculationCase, HYDROData_Entity) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_CalculationCase, HYDROData_Entity) @@ -115,10 +129,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 +175,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 +186,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 +332,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 +358,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() ) @@ -342,10 +376,11 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume const HYDROData_SplitToZonesTool::SplitDataList& theZones, const bool theLandCover ) { + DEBTRACE("HYDROData_CalculationCase::CreateRegionsAuto"); 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 +402,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 +416,15 @@ 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() ) { + DEBTRACE("aMergeEntity " << aMergeEntity->GetName().toStdString()); + aMergeEntity = aMergeObject->GetAltitudeObject(); + } + } + switch( aMergeType ) { case HYDROData_Zone::Merge_ZMIN: @@ -390,8 +433,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 +725,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() ) @@ -756,10 +800,20 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& Handle(HYDROData_Zone) aZone = GetZoneFromPoint( thePoint, false ); if ( !aZone.IsNull() ) { + //DEBTRACE("GetAltitudeForPoint Region " << theRegion->GetName().toStdString() << " Zone " << aZone->GetName().toStdString()); Handle(HYDROData_Region) aRefRegion = Handle(HYDROData_Region)::DownCast( aZone->GetFatherObject() ); if ( IsEqual( aRefRegion, theRegion ) ) aResAltitude = GetAltitudeForPoint( thePoint, aZone ); + else + { + DEBTRACE("GetAltitudeForPoint Region " << aRefRegion->GetName().toStdString() << " Zone " << aZone->GetName().toStdString() << " ---------------------------"); + aResAltitude = GetAltitudeForPoint( thePoint, aZone ); + } } + else + { + DEBTRACE(" --- GetAltitudeForPoint No Zone ---"); + } return aResAltitude; } @@ -767,38 +821,51 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& thePoint, const Handle(HYDROData_Zone)& theZone ) const { + //DEBTRACE("GetAltitudeForPoint Zone " << theZone->GetName().toStdString()); double aResAltitude = HYDROData_IAltitudeObject::GetInvalidAltitude(); if ( theZone.IsNull() ) + { + DEBTRACE("Zone nulle"); return aResAltitude; + } - HYDROData_Zone::MergeAltitudesType aZoneMergeType = theZone->GetMergeType(); + HYDROData_Zone::MergeType aZoneMergeType = theZone->GetMergeType(); + DEBTRACE("aZoneMergeType " << aZoneMergeType); if ( !theZone->IsMergingNeed() ) { aZoneMergeType = HYDROData_Zone::Merge_UNKNOWN; + DEBTRACE("---"); } else if ( aZoneMergeType == HYDROData_Zone::Merge_UNKNOWN ) { + DEBTRACE("GetAltitudeForPoint Zone " << theZone->GetName().toStdString() << " Merge_UNKNOWN"); return aResAltitude; } 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 ) { + DEBTRACE("aZoneInterpolator != NULL"); aZoneInterpolator->SetAltitudeObject( aMergeAltitude ); aResAltitude = aZoneInterpolator->GetAltitudeForPoint( thePoint ); } else + { + DEBTRACE("aZoneInterpolator == NULL"); aResAltitude = aMergeAltitude->GetAltitudeForPoint( thePoint ); + } } } else { - HYDROData_SequenceOfObjects aZoneObjects = theZone->GetGeometryObjects(); + DEBTRACE("aZoneMergeType != HYDROData_Zone::Merge_Object"); + HYDROData_SequenceOfObjects aZoneObjects = theZone->GetObjects(); HYDROData_SequenceOfObjects::Iterator anIter( aZoneObjects ); for ( ; anIter.More(); anIter.Next() ) { @@ -814,11 +881,15 @@ double HYDROData_CalculationCase::GetAltitudeForPoint( const gp_XY& double aPointAltitude = 0.0; if ( aZoneInterpolator != NULL ) { + DEBTRACE("aZoneInterpolator != NULL"); aZoneInterpolator->SetAltitudeObject( anObjAltitude ); aPointAltitude = aZoneInterpolator->GetAltitudeForPoint( thePoint ); } else + { + DEBTRACE("aZoneInterpolator == NULL"); aPointAltitude = anObjAltitude->GetAltitudeForPoint( thePoint ); + } if ( ValuesEquals( aPointAltitude, HYDROData_IAltitudeObject::GetInvalidAltitude() ) ) continue; @@ -854,6 +925,7 @@ NCollection_Sequence HYDROData_CalculationCase::GetAltitudesForPoints( const NCollection_Sequence& thePoints, const Handle(HYDROData_Region)& theRegion ) const { + //DEBTRACE("HYDROData_CalculationCase::GetAltitudesForPoints " << theRegion->GetName().toStdString()); NCollection_Sequence aResSeq; for ( int i = 1, n = thePoints.Length(); i <= n; ++i ) @@ -884,6 +956,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 +1101,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 +1134,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 +1144,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 +1223,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 +1320,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 +1335,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 +1351,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 +1383,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 +1452,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 );