X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Gen_i.cxx;h=41588902e8581a29114a4f910021ce65efc9a301;hb=93ac2e89649b6c9fdeaa40f2e46aa3408a678d51;hp=ffab1b05646c38130011d64b642ac0fce86d2e11;hpb=6c8b26afa5259e7809faf52f488c5f9daae4d1bb;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index ffab1b056..41588902e 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2019 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 @@ -157,7 +157,7 @@ static int MYDEBUG = 0; #endif // Static variables definition -GEOM::GEOM_Gen_var SMESH_Gen_i::myGeomGen = GEOM::GEOM_Gen::_nil(); +GEOM::GEOM_Gen_var SMESH_Gen_i::myGeomGen; CORBA::ORB_var SMESH_Gen_i::myOrb; PortableServer::POA_var SMESH_Gen_i::myPoa; SALOME_NamingService* SMESH_Gen_i::myNS = NULL; @@ -258,14 +258,15 @@ SALOME_NamingService* SMESH_Gen_i::GetNS() * Get SALOME_LifeCycleCORBA object */ //============================================================================= -SALOME_LifeCycleCORBA* SMESH_Gen_i::GetLCC() { + +SALOME_LifeCycleCORBA* SMESH_Gen_i::GetLCC() +{ if ( myLCC == NULL ) { myLCC = new SALOME_LifeCycleCORBA( GetNS() ); } return myLCC; } - //============================================================================= /*! * GetGeomEngine [ static ] @@ -273,18 +274,33 @@ SALOME_LifeCycleCORBA* SMESH_Gen_i::GetLCC() { * Get GEOM::GEOM_Gen reference */ //============================================================================= -GEOM::GEOM_Gen_var SMESH_Gen_i::GetGeomEngine() { - //CCRT GEOM::GEOM_Gen_var aGeomEngine = - //CCRT GEOM::GEOM_Gen::_narrow( GetLCC()->FindOrLoad_Component("FactoryServer","GEOM") ); - //CCRT return aGeomEngine._retn(); - if(CORBA::is_nil(myGeomGen)) - { - Engines::EngineComponent_ptr temp=GetLCC()->FindOrLoad_Component("FactoryServer","GEOM"); - myGeomGen=GEOM::GEOM_Gen::_narrow(temp); - } + +GEOM::GEOM_Gen_var SMESH_Gen_i::GetGeomEngine( bool isShaper ) +{ + Engines::EngineComponent_ptr temp = + GetLCC()->FindOrLoad_Component( isShaper ? "FactoryServer" : "FactoryServer", + isShaper ? "SHAPERSTUDY" : "GEOM" ); + myGeomGen = GEOM::GEOM_Gen::_narrow( temp ); + return myGeomGen; } +//============================================================================= +/*! + * GetGeomEngine [ static ] + * + * Get GEOM::GEOM_Gen reference + */ +//============================================================================= + +GEOM::GEOM_Gen_var SMESH_Gen_i::GetGeomEngine( GEOM::GEOM_Object_ptr go ) +{ + GEOM::GEOM_Gen_ptr gen; + if ( !CORBA::is_nil( go )) + gen = go->GetGen(); + return gen; +} + //============================================================================= /*! * SMESH_Gen_i::SMESH_Gen_i @@ -462,9 +478,10 @@ GenericHypothesisCreator_i* SMESH_Gen_i::getHypothesisCreator(const char* theHyp // report any error, if occurred #ifndef WIN32 const char* anError = dlerror(); - throw(SALOME_Exception(anError)); + throw(SALOME_Exception( anError )); #else - throw(SALOME_Exception(LOCALIZED( "Can't load server meshers plugin library" ))); + throw(SALOME_Exception ( SMESH_Comment("Can't load meshers plugin library " ) + << aPlatformLibName)); #endif } @@ -474,7 +491,8 @@ GenericHypothesisCreator_i* SMESH_Gen_i::getHypothesisCreator(const char* theHyp (GetHypothesisCreator)GetProc( libHandle, "GetHypothesisCreator" ); if (!procHandle) { - throw(SALOME_Exception(LOCALIZED("bad hypothesis plugin library"))); + throw(SALOME_Exception(SMESH_Comment("bad hypothesis plugin library") + << aPlatformLibName )); UnLoadLib(libHandle); } @@ -483,7 +501,8 @@ GenericHypothesisCreator_i* SMESH_Gen_i::getHypothesisCreator(const char* theHyp aCreator = procHandle(theHypName); if (!aCreator) { - throw(SALOME_Exception(LOCALIZED("no such a hypothesis in this plugin"))); + throw(SALOME_Exception( SMESH_Comment( theHypName ) << " is missing from " + << aPlatformLibName)); } // map hypothesis creator to a hypothesis name myHypCreatorMap[string(theHypName)] = aCreator; @@ -684,11 +703,18 @@ void SMESH_Gen_i::UpdateStudy() myStudyContext = new StudyContext; SALOMEDS::Study_var aStudy = getStudyServant(); - if ( !CORBA::is_nil( aStudy ) ) { + if ( !CORBA::is_nil( aStudy ) ) + { SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::SComponent_wrap GEOM_var = aStudy->FindComponent( "GEOM" ); if( !GEOM_var->_is_nil() ) - aStudyBuilder->LoadWith( GEOM_var, GetGeomEngine() ); + aStudyBuilder->LoadWith( GEOM_var, GetGeomEngine( /*isShaper=*/false ) ); + + GEOM_var = aStudy->FindComponent( "SHAPERSTUDY" ); + if( !GEOM_var->_is_nil() ) + aStudyBuilder->LoadWith( GEOM_var, GetGeomEngine( /*isShaper=*/true ) ); + // NPAL16168, issue 0020210 // Let meshes update their data depending on GEOM groups that could change CORBA::String_var compDataType = ComponentDataType(); @@ -721,7 +747,7 @@ StudyContext* SMESH_Gen_i::GetStudyContext() /*! * SMESH_Gen_i::CreateHypothesis * - * Create hypothesis/algorothm of given type and publish it in the study + * Create hypothesis/algorithm of given type and publish it in the study */ //============================================================================= @@ -1993,14 +2019,16 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh, void SMESH_Gen_i::CancelCompute( SMESH::SMESH_Mesh_ptr theMesh, GEOM::GEOM_Object_ptr theShapeObject ) { - SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( theMesh ).in() ); - ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); - TopoDS_Shape myLocShape; - if(theMesh->HasShapeToMesh()) - myLocShape = GeomObjectToShape( theShapeObject ); - else - myLocShape = SMESH_Mesh::PseudoShape(); - myGen.CancelCompute( myLocMesh, myLocShape); + if ( SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( theMesh ).in() )) + { + ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); + TopoDS_Shape myLocShape; + if(theMesh->HasShapeToMesh()) + myLocShape = GeomObjectToShape( theShapeObject ); + else + myLocShape = SMESH_Mesh::PseudoShape(); + myGen.CancelCompute( myLocMesh, myLocShape); + } } //============================================================================= @@ -2300,7 +2328,7 @@ SMESH_Gen_i::GetGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, GEOM::GEOM_Object_wrap geom = FindGeometryByMeshElement(theMesh, theElementID); if ( !geom->_is_nil() ) { GEOM::GEOM_Object_var mainShape = theMesh->GetShapeToMesh(); - GEOM::GEOM_Gen_ptr geomGen = GetGeomEngine(); + GEOM::GEOM_Gen_var geomGen = GetGeomEngine( geom ); // try to find the corresponding SObject SALOMEDS::SObject_wrap SObj = ObjectToSObject( geom.in() ); @@ -2331,7 +2359,7 @@ SMESH_Gen_i::GetGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, } } } - if ( SObj->_is_nil() ) // publish a new subshape + if ( SObj->_is_nil() && !geomGen->_is_nil() ) // publish a new subshape SObj = geomGen->AddInStudy( geom, theGeomName, mainShape ); // return only published geometry @@ -2364,7 +2392,7 @@ SMESH_Gen_i::FindGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference", SALOME::BAD_PARAM ); GEOM::GEOM_Object_var mainShape = theMesh->GetShapeToMesh(); - GEOM::GEOM_Gen_ptr geomGen = GetGeomEngine(); + GEOM::GEOM_Gen_var geomGen = GetGeomEngine( mainShape ); // get a core mesh DS SMESH_Mesh_i* meshServant = SMESH::DownCast( theMesh ); @@ -2387,7 +2415,7 @@ SMESH_Gen_i::FindGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, } if ( !it->_is_nil() ) { for ( it->InitEx(true); it->More(); it->Next() ) { - SALOMEDS::SObject_wrap so = it->Value(); + SALOMEDS::SObject_wrap so = it->Value(); CORBA::Object_var obj = SObjectToObject( so ); GEOM::GEOM_Object_var subGeom = GEOM::GEOM_Object::_narrow( obj ); if ( !subGeom->_is_nil() ) { @@ -2431,14 +2459,16 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::ListOfIDSources& theMeshesArray, CORBA::Boolean theUniteIdenticalGroups, CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) + CORBA::Double theMergeTolerance, + SMESH::SMESH_Mesh_ptr theMeshToAppendTo) throw ( SALOME::SALOME_Exception ) { return ConcatenateCommon(theMeshesArray, theUniteIdenticalGroups, theMergeNodesAndElements, theMergeTolerance, - false); + false, + theMeshToAppendTo); } //================================================================================ @@ -2454,14 +2484,16 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::ConcatenateWithGroups(const SMESH::ListOfIDSources& theMeshesArray, CORBA::Boolean theUniteIdenticalGroups, CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) + CORBA::Double theMergeTolerance, + SMESH::SMESH_Mesh_ptr theMeshToAppendTo) throw ( SALOME::SALOME_Exception ) { return ConcatenateCommon(theMeshesArray, theUniteIdenticalGroups, theMergeNodesAndElements, theMergeTolerance, - true); + true, + theMeshToAppendTo); } //================================================================================ @@ -2477,16 +2509,22 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::ListOfIDSources& theMeshesArray, CORBA::Boolean theUniteIdenticalGroups, CORBA::Boolean theMergeNodesAndElements, CORBA::Double theMergeTolerance, - CORBA::Boolean theCommonGroups) + CORBA::Boolean theCommonGroups, + SMESH::SMESH_Mesh_ptr theMeshToAppendTo) throw ( SALOME::SALOME_Exception ) { std::unique_ptr< TPythonDump > pPythonDump( new TPythonDump ); TPythonDump& pythonDump = *pPythonDump; // prevent dump of called methods - // create mesh - SMESH::SMESH_Mesh_var newMesh = CreateEmptyMesh(); - SMESH_Mesh_i* newImpl = SMESH::DownCast( newMesh ); + // create mesh if theMeshToAppendTo not provided + SMESH::SMESH_Mesh_var newMesh; + if ( CORBA::is_nil( theMeshToAppendTo )) + newMesh = CreateEmptyMesh(); + else + newMesh = SMESH::SMESH_Mesh::_duplicate( theMeshToAppendTo ); + SMESH_Mesh_i* newImpl = SMESH::DownCast( newMesh ); if ( !newImpl ) return newMesh._retn(); + newImpl->Load(); ::SMESH_Mesh& locMesh = newImpl->GetImpl(); SMESHDS_Mesh* newMeshDS = locMesh.GetMeshDS(); @@ -2497,6 +2535,22 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::ListOfIDSources& theMeshesArray, TGroupsMap groupsMap; TListOfNewGroups listOfNewGroups; + if ( !CORBA::is_nil( theMeshToAppendTo )) + { + // fill groupsMap with existing groups + SMESH::ListOfGroups_var groups = theMeshToAppendTo->GetGroups(); + for ( CORBA::ULong i = 0; i < groups->length(); ++i ) + { + SMESH::SMESH_Group_var group = SMESH::SMESH_Group::_narrow( groups[ i ]); + if ( !group->_is_nil() ) + { + CORBA::String_var name = group->GetName(); + SMESH::ElementType type = group->GetType(); + groupsMap[ TNameAndType( name.in(), type ) ].push_back( group ); + } + } + } + ::SMESH_MeshEditor newEditor( &locMesh ); ::SMESH_MeshEditor::ElemFeatures elemType; @@ -2507,9 +2561,11 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::ListOfIDSources& theMeshesArray, SMESH::SMESH_Mesh_var initMesh = theMeshesArray[i]->GetMesh(); SMESH_Mesh_i* initImpl = SMESH::DownCast( initMesh ); if ( !initImpl ) continue; + if ( initMesh->_is_equivalent( theMeshToAppendTo )) + continue; initImpl->Load(); - // assure that IDs increments by one during iteration + // assure that IDs increment by one during iteration ::SMESH_Mesh& initLocMesh = initImpl->GetImpl(); SMESHDS_Mesh* initMeshDS = initLocMesh.GetMeshDS(); if ( initMeshDS->MaxNodeID() > initMeshDS->NbNodes() || @@ -2534,6 +2590,9 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::ListOfIDSources& theMeshesArray, // copy elements + SMESH::array_of_ElementType_var srcElemTypes = theMeshesArray[i]->GetTypes(); + if ( srcElemTypes->length() == 1 && srcElemTypes[0] == SMESH::NODE ) // group of nodes + continue; std::vector< const SMDS_MeshElement* > newElems( initMeshDS->NbElements() + 1, 0 ); elemIt = initImpl->GetElements( theMeshesArray[i], SMESH::ALL ); while ( elemIt->more() ) @@ -2693,11 +2752,12 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::ListOfIDSources& theMeshesArray, // Update Python script pythonDump << newMesh << " = " << this - << "." << ( theCommonGroups ? "ConcatenateWithGroups" : "Concatenate" ) << "(" + << "." << ( theCommonGroups ? "ConcatenateWithGroups" : "Concatenate" ) << "( " << theMeshesArray << ", " << theUniteIdenticalGroups << ", " << theMergeNodesAndElements << ", " - << TVar( theMergeTolerance ) << ")"; + << TVar( theMergeTolerance ) << ", " + << theMeshToAppendTo << " )"; pPythonDump.reset(); // enable python dump from GetGroups() @@ -2952,6 +3012,8 @@ 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; + typedef std::map< std::string, int > TName2IndexMap; //================================================================================ /*! @@ -2969,6 +3031,10 @@ 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 + TName2IndexMap myName2SubshapeIndex; // to find an existing sub-shape by name + bool myGIPMapDone; GEOM::ListOfListOfLong_var myGIPMap; // filled by GetInPlaceMap() @@ -3006,16 +3072,18 @@ namespace // utils for CopyMeshWithGeom() CORBA::String_var newEntry = newSO->GetID(); myOld2NewEntryMap.insert( std::make_pair( std::string( oldEntry.in() ), std::string( newEntry.in() ))); + std::string newMainEntry = newEntry.in(); SALOMEDS::Study_var study = myGen_i->getStudyServant(); - GEOM::GEOM_Gen_var geomGen = myGen_i->GetGeomEngine(); + GEOM::GEOM_Gen_var geomGen = myGen_i->GetGeomEngine( mainShapeNew ); GEOM::GEOM_IShapesOperations_wrap op = geomGen->GetIShapesOperations(); - GEOM::ListOfGO_var subShapes = op->GetExistingSubObjects( mainShapeNew, + mySubshapes = op->GetExistingSubObjects( mainShapeNew, /*groupsOnly=*/false ); - for ( CORBA::ULong i = 0; i < subShapes->length(); ++i ) + for ( CORBA::ULong i = 0; i < mySubshapes->length(); ++i ) { - newSO = myGen_i->ObjectToSObject( subShapes[ i ]); + newSO = myGen_i->ObjectToSObject( mySubshapes[ i ]); SALOMEDS::ChildIterator_wrap anIter = study->NewChildIterator( newSO ); + bool refFound = false; for ( ; anIter->More(); anIter->Next() ) { SALOMEDS::SObject_wrap so = anIter->Value(); @@ -3023,8 +3091,22 @@ namespace // utils for CopyMeshWithGeom() { oldEntry = oldSO->GetID(); newEntry = newSO->GetID(); - myOld2NewEntryMap.insert( std::make_pair( std::string( oldEntry.in() ), - std::string( newEntry.in() ))); + if (( refFound = ( newMainEntry != oldEntry.in() ))) + myOld2NewEntryMap.insert( std::make_pair( std::string( oldEntry.in() ), + std::string( newEntry.in() ))); + } + } + if ( !refFound ) + { + GEOM::GEOM_Object_var father = mySubshapes[ i ]->GetMainShape(); + if ( father->_is_equivalent( mainShapeNew )) + { + GEOM::ListOfLong_var ids = mySubshapes[ i ]->GetSubShapeIndices(); + std::set< int > idSet( &ids[0] , &ids[0] + ids->length() ); + myIds2SubshapeIndex.insert( std::make_pair( idSet, i )); + CORBA::String_var name = newSO->GetName(); + if ( name.in()[0] ) + myName2SubshapeIndex.insert( std::make_pair( name.in(), i )); } } } @@ -3048,9 +3130,9 @@ namespace // utils for CopyMeshWithGeom() return GEOM::GEOM_Object::_duplicate( oldShape ); // shape independent of the old shape GEOM::GEOM_Object_var mainShapeNew = myNewMesh_i->GetShapeToMesh(); - GEOM::GEOM_Gen_var geomGen = myGen_i->GetGeomEngine(); + GEOM::GEOM_Gen_var geomGen = myGen_i->GetGeomEngine( mainShapeNew ); - // try to find by entry + // try to find by entry or name if ( myToPublish ) { CORBA::String_var oldEntry = oldShape->GetStudyEntry(); @@ -3059,6 +3141,22 @@ namespace // utils for CopyMeshWithGeom() { newShape = getShapeByEntry( o2nID->second ); } + if ( newShape->_is_nil() ) + { + CORBA::String_var name = oldShape->GetName(); + TName2IndexMap::iterator n2ind = myName2SubshapeIndex.find( name.in() ); + if ( n2ind != myName2SubshapeIndex.end() ) + { + newShape = GEOM::GEOM_Object::_duplicate( mySubshapes[ n2ind->second ]); + GEOM::ListOfLong_var oldIndices = oldShape->GetSubShapeIndices(); + GEOM::ListOfLong_var newIndices = newShape->GetSubShapeIndices(); + if ( oldIndices->length() == 0 || + newIndices->length() == 0 || + getShapeType( myNewMesh_i, newIndices[0] ) != + getShapeType( mySrcMesh_i, oldIndices[0] )) + newShape = GEOM::GEOM_Object::_nil(); + } + } } if ( newShape->_is_nil() ) @@ -3071,32 +3169,45 @@ namespace // utils for CopyMeshWithGeom() { findNewIDs( oldIndices[i], newIndices ); } - if ( !newIndices.empty() ) + if ( newIndices.size() < oldIndices->length() ) // issue #17096 { - try - { - if ( newIndices.size() > 1 || oldShape->GetType() == GEOM_GROUP ) + newIndices.clear(); + newShape = getInPlace( oldShape ); + } + if ( !newIndices.empty() && newShape->_is_nil() ) + { + // search for a sub-shape with same ids + std::set< int > idSet( newIndices.begin(), newIndices.end() ); + TIdSet2IndexMap::iterator ids2ind = myIds2SubshapeIndex.find( idSet ); + if ( ids2ind != myIds2SubshapeIndex.end() ) { + newShape = GEOM::GEOM_Object::_duplicate( mySubshapes[ ids2ind->second ]); + } + if ( newShape->_is_nil() ) + try { - int groupType = getShapeType( myNewMesh_i, newIndices[0] ); + // create a new shape + if ( newIndices.size() > 1 || oldShape->GetType() == GEOM_GROUP ) + { + int groupType = getShapeType( myNewMesh_i, newIndices[0] ); - GEOM::GEOM_IGroupOperations_wrap grOp = geomGen->GetIGroupOperations(); - newShape = grOp->CreateGroup( mainShapeNew, groupType ); + GEOM::GEOM_IGroupOperations_ptr grOp = geomGen->GetIGroupOperations(); + newShape = grOp->CreateGroup( mainShapeNew, groupType ); - GEOM::ListOfLong_var newIndicesList = new GEOM::ListOfLong(); - newIndicesList->length( newIndices.size() ); - for ( size_t i = 0; i < newIndices.size(); ++i ) - newIndicesList[ i ] = newIndices[ i ]; - grOp->UnionIDs( newShape, newIndicesList ); + GEOM::ListOfLong_var newIndicesList = new GEOM::ListOfLong(); + newIndicesList->length( newIndices.size() ); + for ( size_t i = 0; i < newIndices.size(); ++i ) + newIndicesList[ i ] = newIndices[ i ]; + grOp->UnionIDs( newShape, newIndicesList ); + } + else + { + GEOM::GEOM_IShapesOperations_wrap shOp = geomGen->GetIShapesOperations(); + newShape = shOp->GetSubShape( mainShapeNew, newIndices[0] ); + } } - else + catch (...) { - GEOM::GEOM_IShapesOperations_wrap shOp = geomGen->GetIShapesOperations(); - newShape = shOp->GetSubShape( mainShapeNew, newIndices[0] ); } - } - catch (...) - { - } } } @@ -3159,7 +3270,19 @@ namespace // utils for CopyMeshWithGeom() if ( 0 < oldID && oldID < (int)myGIPMap->length() ) { 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; } @@ -3229,7 +3352,7 @@ namespace // utils for CopyMeshWithGeom() GEOM::GEOM_Object_var mainShapeNew = myNewMesh_i->GetShapeToMesh(); GEOM::GEOM_Object_var mainShapeOld = mySrcMesh_i->GetShapeToMesh(); - GEOM::GEOM_Gen_var geomGen = myGen_i->GetGeomEngine(); + GEOM::GEOM_Gen_var geomGen = myGen_i->GetGeomEngine( mainShapeNew ); GEOM::GEOM_IShapesOperations_wrap op = geomGen->GetIShapesOperations(); try { @@ -3242,6 +3365,27 @@ namespace // utils for CopyMeshWithGeom() } } + //================================================================================ + /*! + * \brief Get new sub-shape by calling GetInPlace() + */ + GEOM::GEOM_Object_ptr getInPlace( GEOM::GEOM_Object_ptr oldShape ) + { + GEOM::GEOM_Object_var newShape; + + GEOM::GEOM_Object_var mainShapeNew = myNewMesh_i->GetShapeToMesh(); + GEOM::GEOM_Gen_var geomGen = myGen_i->GetGeomEngine( mainShapeNew ); + GEOM::GEOM_IShapesOperations_wrap op = geomGen->GetIShapesOperations(); + try + { + newShape = op->GetInPlace( mainShapeNew, oldShape ); + } + catch( ... ) + { + } + return newShape._retn(); + } + //================================================================================ /*! * \brief Find a new sub-shape indices by an old one in myGIPMap. Return @@ -3388,7 +3532,7 @@ namespace // utils for CopyMeshWithGeom() seq[ seq->length() - 1 ] = item; } } -} +} // namespace // utils for CopyMeshWithGeom() //================================================================================ /*! @@ -3406,7 +3550,7 @@ namespace // utils for CopyMeshWithGeom() * \param [out] invalidEntries - return study entries of objects whose * counterparts are not found in the newGeometry, followed by entries * of mesh sub-objects that are invalid because they depend on a not found - * preceeding sub-shape + * preceding sub-shape * \return CORBA::Boolean - is a success */ //================================================================================ @@ -3450,6 +3594,7 @@ throw ( SALOME::SALOME_Exception ) SMESH_Mesh_i* srcMesh_i = SMESH::DownCast( theSourceMesh ); SMESH_Mesh_i* newMesh_i = SMESH::DownCast( theNewMesh ); + srcMesh_i->Load(); ShapeMapper shapeMapper( srcMesh_i, newMesh_i, this ); @@ -3563,9 +3708,9 @@ throw ( SALOME::SALOME_Exception ) // copy mesh elements, keeping IDs + SMESHDS_Mesh* newMeshDS = newMesh_i->GetImpl().GetMeshDS(); if ( theToCopyElements && theSourceMesh->NbNodes() > 0 ) { - SMESHDS_Mesh* newMeshDS = newMesh_i->GetImpl().GetMeshDS(); ::SMESH_MeshEditor editor( &newMesh_i->GetImpl() ); ::SMESH_MeshEditor::ElemFeatures elemData; @@ -3622,6 +3767,8 @@ throw ( SALOME::SALOME_Exception ) if ( SMESH_subMesh* newSM = newMesh_i->GetImpl().GetSubMeshContaining( newID )) newSM->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); } + + newMeshDS->Modified(); } @@ -3632,7 +3779,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 ]); @@ -3646,12 +3793,20 @@ throw ( SALOME::SALOME_Exception ) if ( !stdlGroup->_is_nil() ) { - if ( theToCopyElements ) + if ( newMeshDS->GetMeshInfo().NbElements( SMDSAbs_ElementType( elemType )) > 0 ) { SMESH::long_array_var elemIDs = stdlGroup->GetIDs(); - stdlGroup = theNewMesh->CreateGroup( elemType, name ); - stdlGroup->Add( elemIDs ); - newGroup = SMESH::SMESH_GroupBase::_narrow( stdlGroup ); + const bool isElem = ( elemType != SMESH::NODE ); + CORBA::ULong iE = 0; + for ( ; iE < elemIDs->length(); ++iE ) // check if any element has been copied + if ( newMeshDS->GetElementType( elemIDs[ iE ], isElem ) != SMDSAbs_All ) + break; + if ( iE < elemIDs->length() ) + { + stdlGroup = theNewMesh->CreateGroup( elemType, name ); + stdlGroup->Add( elemIDs ); + newGroup = SMESH::SMESH_GroupBase::_narrow( stdlGroup ); + } } } else if ( !geomGroup->_is_nil() ) @@ -3766,7 +3921,7 @@ throw ( SALOME::SALOME_Exception ) SALOMEDS::SObject_wrap newSO = ObjectToSObject( newGroup ); if ( !srcSO->_is_nil() ) { - CORBA::String_var srcID, newID; + CORBA::String_var srcID, newID(""); srcID = srcSO->GetID(); if ( !newSO->_is_nil() ) newID = newSO->GetID(); @@ -3779,6 +3934,8 @@ throw ( SALOME::SALOME_Exception ) } // loop on groups + newMeshDS->CompactMesh(); + // set mesh name if ( !theMeshName || !theMeshName[0] ) { @@ -3900,6 +4057,9 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, const char* theURL, bool isMultiFile ) { + // localizing + Kernel_Utils::Localizer loc; + if (!myStudyContext) UpdateStudy(); @@ -3953,6 +4113,9 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, cmd+="\" \""; cmd+=meshfile; cmd+="\""; +#ifdef WIN32 + cmd+=" 2>NUL"; +#endif system(cmd.ToCString()); // MED writer to be used by storage process @@ -3982,7 +4145,7 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, CORBA::String_var objStr = GetORB()->object_to_string( grImpl->_this() ); int anId = myStudyContext->findId( string( objStr.in() ) ); char grpName[ 30 ]; - sprintf( grpName, "Group %d", anId ); + sprintf( grpName, "Group %d %d", anId, grImpl->GetLocalID() ); SMESHDS_GroupBase* aGrpBaseDS = grImpl->GetGroupDS(); aGrpBaseDS->SetStoreName( grpName ); } @@ -4206,6 +4369,14 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, aDataset->WriteOnDisk( &meshPersistentId ); aDataset->CloseOnDisk(); + // Store SMESH_Mesh_i::_mainShapeTick + int shapeTick = myImpl->MainShapeTick(); + aSize[ 0 ] = 1; + aDataset = new HDFdataset( "shapeTick", aTopGroup, HDF_INT32, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( &shapeTick ); + aDataset->CloseOnDisk(); + // write reference on a shape if exists SALOMEDS::SObject_wrap myRef; bool shapeRefFound = false; @@ -4881,23 +5052,6 @@ SALOMEDS::TMPFile* SMESH_Gen_i::SaveASCII( SALOMEDS::SComponent_ptr theComponent return anAsciiStreamFile._retn(); } -//============================================================================= -/*! - * SMESH_Gen_i::loadGeomData - * - * Load GEOM module data - */ -//============================================================================= - -void SMESH_Gen_i::loadGeomData( SALOMEDS::SComponent_ptr theCompRoot ) -{ - if ( theCompRoot->_is_nil() ) - return; - - SALOMEDS::StudyBuilder_var aStudyBuilder = getStudyServant()->NewBuilder(); - aStudyBuilder->LoadWith( theCompRoot, GetGeomEngine() ); -} - //============================================================================= /*! * SMESH_Gen_i::Load @@ -4911,14 +5065,10 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, const char* theURL, bool isMultiFile ) { - //if (!myStudyContext) - UpdateStudy(); + UpdateStudy(); // load geom data + Kernel_Utils::Localizer loc; + SALOMEDS::Study_var aStudy = getStudyServant(); - /* if( !theComponent->_is_nil() ) - { - if( !aStudy->FindComponent( "GEOM" )->_is_nil() ) - loadGeomData( aStudy->FindComponent( "GEOM" ) ); - }*/ // Get temporary files location TCollection_AsciiString tmpDir = @@ -5155,6 +5305,10 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, try { // protect persistence mechanism against exceptions myHyp = this->createHypothesis( hypname.c_str(), libname.c_str() ); } + catch( SALOME::SALOME_Exception& ex ) + { + INFOS( "Exception during hypothesis creation: " << ex.details.text ); + } catch (...) { INFOS( "Exception during hypothesis creation" ); } @@ -5236,11 +5390,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, aDataset->CloseOnDisk(); if ( strlen( refFromFile ) > 0 ) { SALOMEDS::SObject_wrap shapeSO = aStudy->FindObjectID( refFromFile ); - - // Make sure GEOM data are loaded first - //loadGeomData( shapeSO->GetFatherComponent() ); - - CORBA::Object_var shapeObject = SObjectToObject( shapeSO ); + CORBA::Object_var shapeObject = SObjectToObject( shapeSO ); if ( !CORBA::is_nil( shapeObject ) ) { aShapeObject = GEOM::GEOM_Object::_narrow( shapeObject ); if ( !aShapeObject->_is_nil() ) @@ -5251,7 +5401,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, } // issue 20918. Restore Persistent Id of SMESHDS_Mesh - if( aTopGroup->ExistInternalObject( "meshPersistentId" ) ) + if ( aTopGroup->ExistInternalObject( "meshPersistentId" ) ) { aDataset = new HDFdataset( "meshPersistentId", aTopGroup ); aDataset->OpenOnDisk(); @@ -5263,6 +5413,16 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, delete [] meshPersistentId; } + // Restore SMESH_Mesh_i::_mainShapeTick + if ( aTopGroup->ExistInternalObject( "shapeTick" )) + { + aDataset = new HDFdataset( "shapeTick", aTopGroup ); + aDataset->OpenOnDisk(); + int* shapeTick = & myNewMeshImpl->MainShapeTick(); + aDataset->ReadFromDisk( shapeTick ); + aDataset->CloseOnDisk(); + } + // Restore file info if ( aTopGroup->ExistInternalObject( "file info" )) { @@ -5305,7 +5465,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, // get mesh old id CORBA::String_var iorString = GetORB()->object_to_string( myNewMeshImpl->_this() ); int newId = myStudyContext->findId( iorString.in() ); - int id = myStudyContext->getOldId( newId ); + int meshOldId = myStudyContext->getOldId( newId ); // try to find mesh data dataset if ( aTopGroup->ExistInternalObject( "Has data" ) ) { @@ -5317,10 +5477,6 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, aDataset->ReadFromDisk( strHasData ); aDataset->CloseOnDisk(); if ( strcmp( strHasData, "1") == 0 ) { - // read mesh data from MED file - // myReader.SetMesh( mySMESHDSMesh ); - // myReader.SetMeshId( id ); - // myReader.Perform(); hasData = true; } delete [] strHasData; @@ -5587,9 +5743,13 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, // check if it is a group if ( name_dataset.substr( 0, 5 ) == "Group" ) { // --> get group id - int subid = atoi( name_dataset.substr( 5 ).c_str() ); + char * endptr; + int subid = strtol( name_dataset.data() + 5, &endptr, 10 ); if ( subid <= 0 ) continue; + int groupID = -1; // group local ID (also persistent) + if ( *endptr ) + groupID = atoi( endptr + 1 ); aDataset = new HDFdataset( name_dataset.c_str(), aGroup ); aDataset->OpenOnDisk(); @@ -5646,7 +5806,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, // Create group servant SMESH::ElementType type = (SMESH::ElementType)(ii - GetNodeGroupsTag() + 1); SMESH::SMESH_GroupBase_var aNewGroup = SMESH::SMESH_GroupBase::_duplicate - ( myNewMeshImpl->createGroup( type, nameFromFile, aShape, predicate ) ); + ( myNewMeshImpl->createGroup( type, nameFromFile, groupID, aShape, predicate ) ); delete [] nameFromFile; // Obtain a SMESHDS_Group object if ( aNewGroup->_is_nil() ) @@ -5695,10 +5855,10 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, } // reading GROUPs // instead of reading mesh data, we read only brief information of all - // objects: mesh, groups, sub-meshes (issue 0021208 ) + // objects: mesh, groups, sub-meshes (issue 0021208) if ( hasData ) { - SMESH_PreMeshInfo::LoadFromFile( myNewMeshImpl, id, + SMESH_PreMeshInfo::LoadFromFile( myNewMeshImpl, meshOldId, meshfile.ToCString(), filename.ToCString(), !isMultiFile ); } @@ -6049,7 +6209,8 @@ CORBA::Boolean SMESH_Gen_i::IsApplicable ( const char* theAlgoType, if (aCreator) { TopoDS_Shape shape = GeomObjectToShape( theGeomObject ); - return shape.IsNull() || aCreator->IsApplicable( shape, toCheckAll ); + const SMESH_Algo::Features& feat = SMESH_Algo::GetFeatures( theAlgoType ); + return shape.IsNull() || aCreator->IsApplicable( shape, toCheckAll, feat._dim ); } else {