X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_CalculationCase.cxx;h=509c2c5fb0bb63ffbd4ca5dd173f9d7aa5d15aa0;hb=81c9f5cdf82909d0aebd2c491c50fa7516cc80b7;hp=198222ab62a76428d734c9c6163ba39374c9eb0f;hpb=133cc997adbd3968a1acf9022a9755b48a836b7a;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index 198222ab..509c2c5f 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -34,12 +34,18 @@ #include #include - +//#define DEB_CALCULATION 1 +#ifdef DEB_CALCULATION +#include +#include +#endif #define CALCULATION_REGIONS_PREF GetName() + "_Reg" #define CALCULATION_ZONES_PREF GetName() + "_Zone" #define CALCULATION_GROUPS_PREF GetName() + "_" - -#define PYTHON_CALCULATION_ID "KIND_CALCULATION" +//#define DEB_CLASS2D 1 +#ifdef DEB_CLASS2D +#include +#endif #define EXPORT_NAME "HYDRO_" + GetName() @@ -85,7 +91,7 @@ void HYDROData_CalculationCase::SetName( const QString& theName ) } } - HYDROData_SequenceOfObjects aGroups = GetGeometryGroups(); + HYDROData_SequenceOfObjects aGroups = GetSplittedGroups(); anIter.Init( aGroups ); for ( ; anIter.More(); anIter.Next() ) @@ -104,20 +110,9 @@ void HYDROData_CalculationCase::SetName( const QString& theName ) QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const { - QStringList aResList; + QStringList aResList = dumpObjectCreation( theTreatedObjects ); - Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab ); - if ( aDocument.IsNull() ) - return aResList; - - QString aDocName = aDocument->GetDocPyName(); - QString aCalculName = GetName(); - - aResList << QString( "%1 = %2.CreateObject( %3 );" ) - .arg( aCalculName ).arg( aDocName ).arg( PYTHON_CALCULATION_ID ); - aResList << QString( "%1.SetName( \"%2\" );" ) - .arg( aCalculName ).arg( aCalculName ); - aResList << QString( "" ); + QString aCalculName = GetObjPyName(); HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects(); HYDROData_SequenceOfObjects::Iterator anIter( aGeomObjects ); @@ -125,12 +120,39 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre { Handle(HYDROData_Object) aRefGeomObj = Handle(HYDROData_Object)::DownCast( anIter.Value() ); - if ( !aRefGeomObj.IsNull() ) - setPythonReferenceObject( theTreatedObjects, aResList, aRefGeomObj, "AddGeometryObject" ); + setPythonReferenceObject( theTreatedObjects, aResList, aRefGeomObj, "AddGeometryObject" ); } aResList << QString( "" ); - aResList << QString( "%1.SplitGeometryObjects();" ).arg( aCalculName ); + QString aGroupName = HYDROData_Tool::GenerateNameForPython( theTreatedObjects, "case_geom_group" ); + + HYDROData_SequenceOfObjects aGeomGroups = GetGeometryGroups(); + anIter.Init( aGeomGroups ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(HYDROData_ShapesGroup) aGeomGroup = + Handle(HYDROData_ShapesGroup)::DownCast( anIter.Value() ); + if ( aGeomGroup.IsNull() ) + continue; + + Handle(HYDROData_Object) aFatherGeom = + Handle(HYDROData_Object)::DownCast( aGeomGroup->GetFatherObject() ); + if ( aFatherGeom.IsNull() ) + continue; + + int aGroupId = aFatherGeom->GetGroupId( aGeomGroup ); + aResList << QString( "%1 = %2.GetGroup( %3 );" ) + .arg( aGroupName ).arg( aFatherGeom->GetObjPyName() ).arg( aGroupId ); + + aResList << QString( "%1.AddGeometryGroup( %2 );" ).arg( aCalculName ).arg( aGroupName ); + } + aResList << QString( "" ); + + Handle(HYDROData_PolylineXY) aBoundaryPolyline = GetBoundaryPolyline(); + setPythonReferenceObject( theTreatedObjects, aResList, aBoundaryPolyline, "SetBoundaryPolyline" ); + aResList << QString( "" ); + + aResList << QString( "%1.Update();" ).arg( aCalculName ); aResList << QString( "" ); // Now we restore the regions and zones order @@ -144,8 +166,20 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre continue; QString aRegionName = aRegion->GetName(); - // TODO + + 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 + } } + aResList << QString( "" ); return aResList; } @@ -220,8 +254,8 @@ void HYDROData_CalculationCase::Update() { const QString& anObjName = aSplitData.ObjectNames.at( i ); - Handle(HYDROData_Object) aRefObject = Handle(HYDROData_Object)::DownCast( - HYDROData_Tool::FindObjectByName( aDocument, anObjName ) ); + Handle(HYDROData_Object) aRefObject = + Handle(HYDROData_Object)::DownCast( aDocument->FindObjectByName( anObjName ) ); if ( aRefObject.IsNull() ) continue; @@ -237,7 +271,10 @@ void HYDROData_CalculationCase::Update() QString anObjName = aSplitData.ObjectNames.first(); if ( anObjName.isEmpty() ) continue; - +#ifdef DEB_CALCULATION + QString aStr = aSplitData.ObjectNames.join(" "); + cout << " CCase: Names = "<GetName().toLatin1().constData(); + aGroup->GetShapes( aGroupDef.Shapes ); + + aSeqOfGroupsDefs.Append( aGroupDef ); + } + // Get faces TopTools_ListOfShape aFaces; HYDROData_SequenceOfObjects aCaseRegions = GetRegions(); HYDROData_SequenceOfObjects::Iterator aRegionIter( aCaseRegions ); - for ( ; aRegionIter.More(); aRegionIter.Next() ) { + for ( ; aRegionIter.More(); aRegionIter.Next() ) + { Handle(HYDROData_Region) aRegion = Handle(HYDROData_Region)::DownCast( aRegionIter.Value() ); - if( aRegion.IsNull() ) { + if( aRegion.IsNull() ) continue; - } - TopoDS_Shape aRegionShape = aRegion->GetShape(); + TopoDS_Shape aRegionShape = aRegion->GetShape( &aSeqOfGroupsDefs ); aFaces.Append( aRegionShape ); } - // Get groups - HYDROData_SequenceOfObjects aSplittedGroups = GetSplittedGroups(); - - return Export( theGeomEngine, theStudy, aFaces, aSplittedGroups ); + return Export( theGeomEngine, theStudy, aFaces, aSeqOfGroupsDefs ); } -bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, - SALOMEDS::Study_ptr theStudy, - const TopTools_ListOfShape& theFaces, - const HYDROData_SequenceOfObjects& theSplittedGroups ) +bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, + SALOMEDS::Study_ptr theStudy, + const TopTools_ListOfShape& theFaces, + const HYDROData_ShapesGroup::SeqOfGroupsDefs& theGroupsDefs ) const { // Sew faces - BRepBuilderAPI_Sewing aSewing( Precision::Confusion()*10.0 ); - aSewing.SetNonManifoldMode( Standard_True ); - + BRepBuilderAPI_Sewing aSewing( Precision::Confusion() * 10.0 ); + aSewing.SetNonManifoldMode( Standard_False ); +#ifdef DEB_CALCULATION + TCollection_AsciiString aNam("Sh_"); + int i=1; +#endif TopTools_ListIteratorOfListOfShape aFaceIter( theFaces ); - for ( ; aFaceIter.More(); aFaceIter.Next() ) { + for ( ; aFaceIter.More(); aFaceIter.Next() ) + { TopoDS_Shape aShape = aFaceIter.Value(); - if ( !aShape.IsNull() && (aShape.ShapeType() == TopAbs_FACE) ) { - TopoDS_Face aFace = TopoDS::Face( aShape ); - if ( !aFace.IsNull() ) { - aSewing.Add( aFace ); - } - } else { + if ( aShape.IsNull() ) + continue; + + if ( aShape.ShapeType() == TopAbs_FACE ) + { + aSewing.Add( aShape ); +#ifdef DEB_CALCULATION + TCollection_AsciiString aName = aNam + ++i + ".brep"; + BRepTools::Write(aShape ,aName.ToCString()); +#endif + } + else + { +#ifdef DEB_CALCULATION + int j = 1; +#endif TopExp_Explorer anExp( aShape, TopAbs_FACE ); - for ( ; anExp.More(); anExp.Next() ) { - TopoDS_Face aFace = TopoDS::Face( anExp.Current() ); - if ( !aFace.IsNull() ) { - aSewing.Add( aFace ); - } + for (; anExp.More(); anExp.Next() ) { + aSewing.Add( anExp.Current() ); +#ifdef DEB_CALCULATION + + TCollection_AsciiString aName = aNam + i + "_" + ++j + ".brep"; + BRepTools::Write(anExp.Current() ,aName.ToCString()); +#endif } } } // faces iterator @@ -688,76 +851,105 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, TopoDS_Shape aSewedShape = aSewing.SewedShape(); // If the sewed shape is empty - return false - if ( aSewedShape.IsNull() || !TopoDS_Iterator(aSewedShape).More() ) { + if ( aSewedShape.IsNull() || !TopoDS_Iterator( aSewedShape ).More() ) return false; - } +#ifdef DEB_CALCULATION + BRepTools::Write(aSewedShape ,"Sew.brep"); +#endif // Publish the sewed shape QString aName = EXPORT_NAME; GEOM::GEOM_Object_ptr aMainShape = publishShapeInGEOM( theGeomEngine, theStudy, aSewedShape, aName ); - if ( aMainShape->_is_nil() ) { + if ( aMainShape->_is_nil() ) return false; - } + + if ( theGroupsDefs.IsEmpty() ) + return true; // Create groups TopTools_IndexedMapOfShape aMapOfSubShapes; TopExp::MapShapes( aSewedShape, aMapOfSubShapes ); - QHash > aGroupsData; + NCollection_DataMap< TCollection_AsciiString, NCollection_Sequence > aGroupsData; - HYDROData_SequenceOfObjects::Iterator anIter( theSplittedGroups ); - for ( ; anIter.More(); anIter.Next() ) { - // Get shapes group - Handle(HYDROData_ShapesGroup) aGroup = - Handle(HYDROData_ShapesGroup)::DownCast( anIter.Value() ); - if ( aGroup.IsNull() ) { - continue; - } + for ( int aGrId = 1, nbGroups = theGroupsDefs.Length(); aGrId <= nbGroups; ++aGrId ) + { + const HYDROData_ShapesGroup::GroupDefinition& aGroupDef = theGroupsDefs.Value( aGrId ); - QSet anIndexes; - - // Get shapes of the group - TopTools_SequenceOfShape aShapes; - aGroup->GetShapes( aShapes ); - for( int i = 1, aNbShapes = aShapes.Length(); i <= aNbShapes; i++ ) { - const TopoDS_Shape& aShape = aShapes.Value( i ); - const TopoDS_Shape ModifiedShape = aSewing.Modified( aShape ); - if ( !ModifiedShape.IsNull() ) { - int anIndex = aMapOfSubShapes.FindIndex( ModifiedShape ); - if ( anIndex > 0 ) { - anIndexes << anIndex; + NCollection_Sequence aGroupIndexes; + for( int i = 1, n = aGroupDef.Shapes.Length(); i <= n; i++ ) + { + const TopoDS_Shape& aShape = aGroupDef.Shapes.Value( i ); +#ifdef DEB_CALCULATION + cout << "\nOld shape(" << i << ") = " << aShape.TShape() < 0 ) { - aGroupsData.insert( aGroup->GetName(), anIndexes ); - } + if ( !aGroupIndexes.IsEmpty() ) + aGroupsData.Bind( aGroupDef.Name, aGroupIndexes ); } - - if ( !aGroupsData.isEmpty() ) { + + if ( !aGroupsData.IsEmpty() ) + { GEOM::GEOM_IGroupOperations_var aGroupOp = theGeomEngine->GetIGroupOperations( theStudy->StudyId() ); - foreach ( const QString& aGroupName, aGroupsData.keys() ) { - QSet aGroupIndexes = aGroupsData.value( aGroupName ); + NCollection_DataMap< TCollection_AsciiString, NCollection_Sequence >::Iterator aMapIt( aGroupsData ); + for ( ; aMapIt.More(); aMapIt.Next() ) + { + const TCollection_AsciiString& aGroupName = aMapIt.Key(); + const NCollection_Sequence& aGroupIndexes = aMapIt.Value(); - GEOM::GEOM_Object_var aGroup = aGroupOp->CreateGroup( aMainShape, TopAbs_EDGE ); - if ( !CORBA::is_nil(aGroup) && aGroupOp->IsDone() ) { - GEOM::ListOfLong_var anIndexes = new GEOM::ListOfLong; - anIndexes->length( aGroupIndexes.count() ); - int aListIndex = 0; - foreach ( const int anIndex, aGroupIndexes ) { - anIndexes[aListIndex++] = anIndex; - } + GEOM::GEOM_Object_var aGeomGroup = aGroupOp->CreateGroup( aMainShape, TopAbs_EDGE ); + if ( CORBA::is_nil( aGeomGroup ) || !aGroupOp->IsDone() ) + continue; - aGroupOp->UnionIDs( aGroup, anIndexes ); - if ( aGroupOp->IsDone() ) { - SALOMEDS::SObject_var aGroupSO = - theGeomEngine->AddInStudy( theStudy, aGroup, qPrintable( aGroupName ), aMainShape ); - } + GEOM::ListOfLong_var aGeomIndexes = new GEOM::ListOfLong; + aGeomIndexes->length( aGroupIndexes.Length() ); + + for( int i = 1, n = aGroupIndexes.Length(); i <= n; i++ ) + aGeomIndexes[ i - 1 ] = aGroupIndexes.Value( i ); + + aGroupOp->UnionIDs( aGeomGroup, aGeomIndexes ); + if ( aGroupOp->IsDone() ) + { + SALOMEDS::SObject_var aGroupSO = + theGeomEngine->AddInStudy( theStudy, aGeomGroup, aGroupName.ToCString(), aMainShape ); } } } @@ -767,7 +959,7 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var theGeomEngine, GEOM::GEOM_Object_ptr HYDROData_CalculationCase::publishShapeInGEOM( GEOM::GEOM_Gen_var theGeomEngine, SALOMEDS::Study_ptr theStudy, - const TopoDS_Shape& theShape, const QString& theName ) + const TopoDS_Shape& theShape, const QString& theName ) const { GEOM::GEOM_Object_var aGeomObj;