X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_CalculationCase.cxx;h=27b5294e20ee979189e9cc1616381ccf573b870c;hb=cd6ea20d9a76665a24a533d0340385a335961f05;hp=1cfa75e3e70dea8a318d21fa55dc8d3202b0c64f;hpb=f17efc89ee19de46802d511d84cce537fcfa71a1;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index 1cfa75e3..27b5294e 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -1,3 +1,24 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "HYDROData_CalculationCase.h" @@ -11,6 +32,7 @@ #include "HYDROData_SplittedShapesGroup.h" #include "HYDROData_Region.h" #include "HYDROData_Tool.h" +#include "HYDROData_GeomTool.h" #include @@ -110,11 +132,12 @@ void HYDROData_CalculationCase::SetName( const QString& theName ) QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const { QStringList aResList = dumpObjectCreation( theTreatedObjects ); + aResList.prepend( "# Calculation case" ); QString aCalculName = GetObjPyName(); AssignmentMode aMode = GetAssignmentMode(); - QString aModeStr = aMode==MANUAL ? "MANUAL" : "AUTOMATIC"; + QString aModeStr = aMode==MANUAL ? "HYDROData_CalculationCase.MANUAL" : "HYDROData_CalculationCase.AUTOMATIC"; aResList << QString( "%0.SetAssignmentMode( %1 )" ).arg( aCalculName ).arg( aModeStr ); HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects(); @@ -149,18 +172,16 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre aResList << QString( "%1.AddGeometryGroup( %2 );" ).arg( aCalculName ).arg( aGroupName ); } - aResList << QString( "" ); Handle(HYDROData_PolylineXY) aBoundaryPolyline = GetBoundaryPolyline(); setPythonReferenceObject( theTreatedObjects, aResList, aBoundaryPolyline, "SetBoundaryPolyline" ); - aResList << QString( "" ); if( aMode==AUTOMATIC ) DumpRulesToPython( aCalculName, aResList ); aResList << QString( "" ); + aResList << "# Start the algorithm of the partition and assignment"; aResList << QString( "%1.Update();" ).arg( aCalculName ); - aResList << QString( "" ); if( aMode==MANUAL ) { @@ -174,26 +195,73 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre if ( aRegion.IsNull() ) continue; - QString aRegionName = aRegion->GetName(); - - HYDROData_SequenceOfObjects aZones = aRegion->GetZones(); - HYDROData_SequenceOfObjects::Iterator aZonesIter( aZones ); - for ( ; aZonesIter.More(); aZonesIter.Next() ) - { - Handle(HYDROData_Zone) aRegZone = - Handle(HYDROData_Zone)::DownCast( aZonesIter.Value() ); - if ( aRegZone.IsNull() ) - continue; - - // TODO - } + theTreatedObjects.insert( aRegion->GetName(), aRegion ); + QStringList aRegDump = aRegion->DumpToPython( theTreatedObjects ); + aResList << aRegDump; } } + // Export calculation case + aResList << QString( "" ); + aResList << "# Export of the calculation case"; + QString aStudyName = "theStudy"; + QString anEntryVar = aCalculName + "_entry"; + aResList << QString( "%1 = %2.Export( %3._get_StudyId() )" ).arg( anEntryVar ).arg( aCalculName ).arg( aStudyName ); + + // Get geometry object and print debug information + aResList << ""; + aResList << "# Get geometry shape and print debug information"; + aResList << "import GEOM"; + aResList << QString( "print \"Entry:\", %1" ).arg( anEntryVar ); + QString aGeomShapeName = aCalculName + "_geom"; + aResList << QString( "%1 = salome.IDToObject( str( %2 ) )" ).arg( aGeomShapeName ).arg( anEntryVar ); + aResList << QString( "print \"Geom shape:\", %1" ).arg( aGeomShapeName ); + aResList << QString( "print \"Geom shape name:\", %1.GetName()" ).arg( aGeomShapeName ); + + DumpSampleMeshing( aResList, aStudyName, aGeomShapeName, aCalculName+"_mesh" ); + aResList << QString( "" ); return aResList; } +void HYDROData_CalculationCase::DumpSampleMeshing( QStringList& theResList, + const QString& theStudyName, + const QString& theGeomShapeName, + const QString& theMeshName ) const +{ + theResList << ""; + theResList << "# Meshing"; + theResList << "import SMESH, SALOMEDS"; + theResList << "from salome.smesh import smeshBuilder"; + theResList << "from salome.geom import geomBuilder"; + + theResList << QString( "smesh = smeshBuilder.New( %1 )" ).arg( theStudyName ); + theResList << QString( "%1 = smesh.Mesh( %2 )" ).arg( theMeshName ).arg( theGeomShapeName ); + theResList << QString( "MEFISTO_2D = %1.Triangle( algo=smeshBuilder.MEFISTO )" ).arg( theMeshName ); + theResList << "Max_Element_Area_1 = MEFISTO_2D.MaxElementArea( 10 )"; + theResList << QString( "Regular_1D = %1.Segment()" ).arg( theMeshName ); + theResList << "Max_Size_1 = Regular_1D.MaxSize(10)"; + theResList << QString( "isDone = %1.Compute()" ).arg( theMeshName ); + + theResList << ""; + theResList << "# Set names of Mesh objects"; + theResList << "smesh.SetName( MEFISTO_2D.GetAlgorithm(), 'MEFISTO_2D' )"; + theResList << "smesh.SetName( Regular_1D.GetAlgorithm(), 'Regular_1D' )"; + theResList << "smesh.SetName( Max_Size_1, 'Max Size_1' )"; + theResList << "smesh.SetName( Max_Element_Area_1, 'Max. Element Area_1' )"; + theResList << QString( "smesh.SetName( %1.GetMesh(), '%1' )" ).arg( theMeshName ); + + theResList << ""; + theResList << "# Greate SMESH groups"; + theResList << QString( "geompy = geomBuilder.New( %1 )" ).arg( theStudyName ); + theResList << QString( "geom_groups = geompy.GetGroups( %1 )" ).arg( theGeomShapeName ); + theResList << QString( "for group in geom_groups:" ); + theResList << QString( " smesh_group = %1.GroupOnGeom(group, group.GetName(), SMESH.EDGE)" ) + .arg( theMeshName ); + theResList << QString( " smesh.SetName(smesh_group, group.GetName())" ); + theResList << QString( " print \"SMESH group '%s': %s\" % (smesh_group.GetName(), smesh_group)" ); +} + HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetAllReferenceObjects() const { HYDROData_SequenceOfObjects aResSeq = HYDROData_Entity::GetAllReferenceObjects(); @@ -211,6 +279,7 @@ HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetAllReferenceObjects() void HYDROData_CalculationCase::Update() { HYDROData_Entity::Update(); + SetWarning(); // At first we remove previously created objects RemoveRegions(); @@ -279,6 +348,7 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume const HYDROData_SplitToZonesTool::SplitDataList& theZones ) { QMap aRegionsMap; //object name to region + QMap aRegionNameToObjNameMap; QString aZonesPref = CALCULATION_ZONES_PREF; HYDROData_PriorityQueue aPr( this ); @@ -293,6 +363,7 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume QString aRegName = anObjName + "_reg"; Handle(HYDROData_Region) aRegion = addNewRegion( theDoc, aRegName, false ); aRegionsMap.insert( anObjName, aRegion ); + aRegionNameToObjNameMap.insert( aRegName, anObjName ); } // 2. Now for each zone it is necessary to determine the most priority object @@ -309,6 +380,12 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume if( aRegion.IsNull() ) continue; Handle(HYDROData_Zone) aRegionZone = aRegion->addNewZone( theDoc, aZonesPref, aSplitData.Face(), aSplitData.ObjectNames ); + + if( aSplitData.ObjectNames.count() > 1 && aMergeType==HYDROData_Zone::Merge_UNKNOWN ) + { + qDebug( "Error in algorithm: unresolved conflicts" ); + } + switch( aMergeType ) { case HYDROData_Zone::Merge_ZMIN: @@ -323,7 +400,25 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume } } - //TODO: inform if some regions remain empty + QStringList anObjectsWithEmptyRegions; + QMap::const_iterator + anIt = aRegionsMap.begin(), aLast = aRegionsMap.end(); + for( ; anIt!=aLast; anIt++ ) + { + Handle(HYDROData_Region) aRegion = anIt.value(); + if( aRegion->GetZones().IsEmpty() ) + { + QString aRegName = aRegion->GetName(); + QString anObjName = aRegionNameToObjNameMap[aRegName]; + anObjectsWithEmptyRegions.append( anObjName ); + } + } + + if( !anObjectsWithEmptyRegions.empty() ) + { + QString aData = anObjectsWithEmptyRegions.join( ", " ); + SetWarning( WARN_EMPTY_REGIONS, aData ); + } } void HYDROData_CalculationCase::CreateEdgeGroupsDef( const Handle(HYDROData_Document)& theDoc, @@ -800,6 +895,7 @@ Handle(HYDROData_Region) HYDROData_CalculationCase::addNewRegion( const Handle(H bool isPrefix ) { TDF_Label aNewLab = myLab.FindChild( DataTag_ChildRegion ).NewChild(); + int aTag = aNewLab.Tag(); Handle(HYDROData_Region) aNewRegion = Handle(HYDROData_Region)::DownCast( HYDROData_Iterator::CreateObject( aNewLab, KIND_REGION ) ); @@ -825,8 +921,19 @@ Handle(HYDROData_SplittedShapesGroup) HYDROData_CalculationCase::addNewSplittedG return aNewGroup; } +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 ); + return isOK ? aGeomObjEntry : QString(); +} + bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, - SALOMEDS::Study_ptr theStudy ) const + SALOMEDS::Study_ptr theStudy, + QString& theGeomObjEntry ) const { HYDROData_ShapesGroup::SeqOfGroupsDefs aSeqOfGroupsDefs; @@ -865,13 +972,14 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, aFaces.Append( aRegionShape ); } - return Export( theGeomEngine, theStudy, aFaces, aSeqOfGroupsDefs ); + return Export( theGeomEngine, theStudy, aFaces, aSeqOfGroupsDefs, theGeomObjEntry ); } bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, SALOMEDS::Study_ptr theStudy, const TopTools_ListOfShape& theFaces, - const HYDROData_ShapesGroup::SeqOfGroupsDefs& theGroupsDefs ) const + const HYDROData_ShapesGroup::SeqOfGroupsDefs& theGroupsDefs, + QString& theGeomObjEntry ) const { // Sew faces BRepBuilderAPI_Sewing aSewing( Precision::Confusion() * 10.0 ); @@ -925,7 +1033,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 ); + publishShapeInGEOM( theGeomEngine, theStudy, aSewedShape, aName, theGeomObjEntry ); if ( aMainShape->_is_nil() ) return false; @@ -1024,8 +1132,10 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var GEOM::GEOM_Object_ptr HYDROData_CalculationCase::publishShapeInGEOM( GEOM::GEOM_Gen_var theGeomEngine, SALOMEDS::Study_ptr theStudy, - const TopoDS_Shape& theShape, const QString& theName ) const + const TopoDS_Shape& theShape, const QString& theName, + QString& theGeomObjEntry ) const { + theGeomObjEntry = ""; GEOM::GEOM_Object_var aGeomObj; if ( theGeomEngine->_is_nil() || theStudy->_is_nil() || @@ -1051,7 +1161,7 @@ GEOM::GEOM_Object_ptr HYDROData_CalculationCase::publishShapeInGEOM( // Puplish the GEOM object if ( !aGeomObj->_is_nil() ) { - QString aName = GEOMBase::GetDefaultName( theName ); + QString aName = HYDROData_GeomTool::GetFreeName( theStudy, theName ); SALOMEDS::SObject_var aResultSO = theGeomEngine->PublishInStudy( theStudy, SALOMEDS::SObject::_nil(), @@ -1059,15 +1169,22 @@ GEOM::GEOM_Object_ptr HYDROData_CalculationCase::publishShapeInGEOM( if ( aResultSO->_is_nil() ) { aGeomObj = GEOM::GEOM_Object::_nil(); } + else + theGeomObjEntry = aResultSO->GetID(); } return aGeomObj._retn(); } -void HYDROData_CalculationCase::ClearRules() +void HYDROData_CalculationCase::ClearRules( const bool theIsSetToUpdate ) { TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules ); HYDROData_PriorityQueue::ClearRules( aRulesLab ); + + // Indicate model of the need to update splitting + if ( theIsSetToUpdate ) { + SetToUpdate( true ); + } } void HYDROData_CalculationCase::AddRule( const Handle(HYDROData_Object)& theObject1, @@ -1077,9 +1194,12 @@ void HYDROData_CalculationCase::AddRule( const Handle(HYDROData_Object)& theO { TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules ); HYDROData_PriorityQueue::AddRule( aRulesLab, theObject1, thePriority, theObject2, theMergeType ); + + // Indicate model of the need to update splitting + SetToUpdate( true ); } -QString HYDROData_CalculationCase::DumpRules() +QString HYDROData_CalculationCase::DumpRules() const { TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules ); return HYDROData_PriorityQueue::DumpRules( aRulesLab ); @@ -1089,6 +1209,9 @@ void HYDROData_CalculationCase::SetAssignmentMode( AssignmentMode theMode ) { TDF_Label aModeLab = myLab.FindChild( DataTag_AssignmentMode ); TDataStd_Integer::Set( aModeLab, ( int ) theMode ); + + // Indicate model of the need to update splitting + SetToUpdate( true ); } HYDROData_CalculationCase::AssignmentMode HYDROData_CalculationCase::GetAssignmentMode() const @@ -1107,3 +1230,25 @@ void HYDROData_CalculationCase::DumpRulesToPython( const QString& theCalcCaseNam TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules ); HYDROData_PriorityQueue::DumpRulesToPython( aRulesLab, theCalcCaseName, theScript ); } + +HYDROData_Warning HYDROData_CalculationCase::GetLastWarning() const +{ + return myLastWarning; +} + +void HYDROData_CalculationCase::SetWarning( HYDROData_WarningType theType, const QString& theData ) +{ + myLastWarning.Type = theType; + myLastWarning.Data = theData; +} + +bool HYDROData_CalculationCase::GetRule( int theIndex, + Handle(HYDROData_Object)& theObject1, + HYDROData_PriorityType& thePriority, + Handle(HYDROData_Object)& theObject2, + HYDROData_Zone::MergeAltitudesType& theMergeType ) const +{ + TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules ); + return HYDROData_PriorityQueue::GetRule( aRulesLab, theIndex, + theObject1, thePriority, theObject2, theMergeType ); +}