From 6eba85f740667f200327f0a05a58494cd164ee88 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 19 Oct 2018 15:09:48 +0300 Subject: [PATCH] 23608: [EDF] HYDRO: crash when compute copied mesh 23609: [EDF] HYDRO: wrong warning appears 23607: [EDF] HYDRO: Copy mesh with geometry - problems of Copy elements --- src/SMESH_I/SMESH_Gen_i.cxx | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index ac694c4fe..86f9daa3b 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -2952,6 +2952,7 @@ namespace // utils for CopyMeshWithGeom() { typedef std::map< std::string, std::string > TStr2StrMap; typedef std::map< std::string, std::set< std::string > > TStr2StrSetMap; + //typedef std::map< std::set, int > TIdSet2IndexMap; //================================================================================ /*! @@ -2969,6 +2970,9 @@ namespace // utils for CopyMeshWithGeom() TStr2StrMap myOld2NewEntryMap; // map of study entries + //GEOM::ListOfGO_var mySubshapes; // sub-shapes existing in the new geometry + //TIdSet2IndexMap myIds2SubshapeIndex; // to find an existing sub-shape + bool myGIPMapDone; GEOM::ListOfListOfLong_var myGIPMap; // filled by GetInPlaceMap() @@ -3158,12 +3162,20 @@ namespace // utils for CopyMeshWithGeom() if ( 0 < oldID && oldID < (int)myGIPMap->length() ) { - if (( myGIPMap[ oldID ].length() == 1 ) || - ( myGIPMap[ oldID ].length() > 1 && - getShapeType( mySrcMesh_i, oldID ) == TopAbs_VERTEX )) + if ( myGIPMap[ oldID ].length() == 1 ) { newID = myGIPMap[ oldID ][ 0 ]; } + else if ( myGIPMap[ oldID ].length() > 1 && + getShapeType( mySrcMesh_i, oldID ) == TopAbs_VERTEX ) + { + // select a meshed VERTEX + SMESH_subMesh* newSM; + for ( CORBA::ULong i = 0; i < myGIPMap[ oldID ].length() && !newID; ++i ) + if (( newSM = myNewMesh_i->GetImpl().GetSubMeshContaining( myGIPMap[ oldID ][ i ] )) && + ( !newSM->IsEmpty() )) + newID = myGIPMap[ oldID ][ i ]; + } } return newID; } @@ -3392,7 +3404,7 @@ namespace // utils for CopyMeshWithGeom() seq[ seq->length() - 1 ] = item; } } -} +} // namespace // utils for CopyMeshWithGeom() //================================================================================ /*! @@ -3627,6 +3639,8 @@ throw ( SALOME::SALOME_Exception ) if ( SMESH_subMesh* newSM = newMesh_i->GetImpl().GetSubMeshContaining( newID )) newSM->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); } + + newMeshDS->Modified(); } @@ -3637,7 +3651,7 @@ throw ( SALOME::SALOME_Exception ) SALOME::GenericObj_wrap< SMESH::FilterManager > filterMgr = CreateFilterManager(); SMESH::ListOfGroups_var groups = theSourceMesh->GetGroups(); - CORBA::ULong nbGroups = groups->length(), nbAddedGroups = 0; + CORBA::ULong nbGroups = theToCopyGroups ? groups->length() : 0, nbAddedGroups = 0; for ( CORBA::ULong i = 0; i < nbGroups + nbAddedGroups; ++i ) { SMESH::SMESH_Group_var stdlGroup = SMESH::SMESH_Group::_narrow ( groups[ i ]); @@ -3792,6 +3806,8 @@ throw ( SALOME::SALOME_Exception ) } // loop on groups + newMeshDS->CompactMesh(); + // set mesh name if ( !theMeshName || !theMeshName[0] ) {