X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_PriorityQueue.cxx;h=95e167bd2c7fa8440230efd9d7b8f9c2c4c1c126;hb=1c46311dfa50e3077f13290dbe935205c1edb8a1;hp=fd72c219ea6de35d279920a5a8685f387f77e63e;hpb=e989e0f3cdd230307b28ed0128a49978b27096ef;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_PriorityQueue.cxx b/src/HYDROData/HYDROData_PriorityQueue.cxx index fd72c219..95e167bd 100644 --- a/src/HYDROData/HYDROData_PriorityQueue.cxx +++ b/src/HYDROData/HYDROData_PriorityQueue.cxx @@ -29,19 +29,38 @@ HYDROData_PriorityQueue::~HYDROData_PriorityQueue() Handle(HYDROData_Object) HYDROData_PriorityQueue::GetMostPriorityObject( const QStringList& theZoneObjects, HYDROData_Zone::MergeAltitudesType& theMergeType ) const { + QStringList aSortedZoneObjects; + for( int i=myGeomObjects.Lower(), n=myGeomObjects.Upper(); i<=n; i++ ) + { + QString aName = myGeomObjects.Value( i )->GetName(); + if( theZoneObjects.contains( aName ) ) + aSortedZoneObjects.append( aName ); + } + Handle(HYDROData_Object) aMostPriorityObj; - theMergeType = HYDROData_Zone::Merge_Object; - QStringList::const_iterator anIt = theZoneObjects.begin(), aLast = theZoneObjects.end(); + theMergeType = HYDROData_Zone::Merge_UNKNOWN; + QStringList::const_iterator anIt = aSortedZoneObjects.begin(), aLast = aSortedZoneObjects.end(); for( ; anIt!=aLast; anIt++ ) { HYDROData_Zone::MergeAltitudesType aLocalMerge = HYDROData_Zone::Merge_UNKNOWN; Handle(HYDROData_Object) anObj = myNames[*anIt]; if( !anObj.IsNull() ) - if( aMostPriorityObj.IsNull() || IsMorePriority( anObj, aMostPriorityObj, aLocalMerge ) ) + { + if( aMostPriorityObj.IsNull() ) { aMostPriorityObj = anObj; - theMergeType = aLocalMerge; + continue; } + + bool isMorePriority = IsMorePriority( anObj, aMostPriorityObj, aLocalMerge ); + + if( isMorePriority ) + aMostPriorityObj = anObj; + + if( aLocalMerge != HYDROData_Zone::Merge_UNKNOWN && + ( theMergeType==HYDROData_Zone::Merge_UNKNOWN || isMorePriority ) ) + theMergeType = aLocalMerge; + } } return aMostPriorityObj; } @@ -180,3 +199,67 @@ QString HYDROData_PriorityQueue::DumpRules( const TDF_Label& theRulesLab ) } return aDump; } + +void HYDROData_PriorityQueue::DumpRulesToPython( const TDF_Label& theRulesLab, + const QString& theCalcCaseName, + QStringList& theScript ) +{ + HYDROData_ListOfRules aRules = GetRules( theRulesLab ); + HYDROData_ListOfRules::const_iterator anIt = aRules.begin(), aLast = aRules.end(); + for( ; anIt!=aLast; anIt++ ) + { + QString anObj1 = anIt->Object1->GetObjPyName(); + QString anObj2 = anIt->Object2->GetObjPyName(); + QString aPriority = anIt->Priority == LESS ? "LESS" : "GREATER"; + QString aMergeType; + + switch( anIt->MergeType ) + { + case HYDROData_Zone::Merge_UNKNOWN: + aMergeType = "HYDROData_Zone.Merge_UNKNOWN"; + break; + case HYDROData_Zone::Merge_ZMIN: + aMergeType = "HYDROData_Zone.Merge_ZMIN"; + break; + case HYDROData_Zone::Merge_ZMAX: + aMergeType = "HYDROData_Zone.Merge_ZMAX"; + break; + case HYDROData_Zone::Merge_Object: + aMergeType = "HYDROData_Zone.Merge_Object"; + break; + } + + QString aRule = QString( "%0.AddRule( %1, %2, %3, %4 )" ). + arg( theCalcCaseName ).arg( anObj1 ).arg( aPriority ).arg( anObj2 ).arg( aMergeType ); + + theScript << aRule; + } +} + +bool HYDROData_PriorityQueue::GetRule( const TDF_Label& theRulesLab, + int theIndex, + Handle(HYDROData_Object)& theObject1, + HYDROData_PriorityType& thePriority, + Handle(HYDROData_Object)& theObject2, + HYDROData_Zone::MergeAltitudesType& theMergeType ) +{ + TDF_Label aRuleLabel = theRulesLab.FindChild( theIndex ); + + Handle(TDataStd_ReferenceList) aRefs1, aRefs2; + Handle(TDataStd_Integer) aPriorityAttr, aMergeAttr; + + bool isObj1OK = aRuleLabel.FindChild ( Object1_Tag ). FindAttribute( TDataStd_ReferenceList::GetID(), aRefs1 ); + bool isPriorityOK = aRuleLabel.FindChild( Priority_Tag ).FindAttribute( TDataStd_Integer::GetID(), aPriorityAttr ); + bool isObj2OK = aRuleLabel.FindChild ( Object2_Tag ). FindAttribute( TDataStd_ReferenceList::GetID(), aRefs2 ); + bool isMergeOK = aRuleLabel.FindChild ( Merge_Tag ). FindAttribute( TDataStd_Integer::GetID(), aMergeAttr ); + + bool isOK = isObj1OK && isPriorityOK && isObj2OK && isMergeOK; + if( isOK ) + { + theObject1 = Handle_HYDROData_Object::DownCast( HYDROData_Iterator::Object( aRefs1->First() ) ); + thePriority = ( HYDROData_PriorityType ) aPriorityAttr->Get(); + theObject2 = Handle_HYDROData_Object::DownCast( HYDROData_Iterator::Object( aRefs2->First() ) ); + theMergeType = ( HYDROData_Zone::MergeAltitudesType ) aMergeAttr->Get(); + } + return isOK; +}