X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Gen_i.cxx;h=107a1ef4f81a425c3fc2a7ac6877e5500ba580f1;hp=0bf885f358646514d07c98d008a06ca944a979aa;hb=HEAD;hpb=51540539e509f5e21439ddef0d88dba6a45a6679 diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 0bf885f35..1c78a2526 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2022 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -101,14 +101,18 @@ #include "SMESH_Hypothesis.hxx" #include "SMESH_Hypothesis_i.hxx" #include "SMESH_Mesh.hxx" +#include "SMESH_ParallelMesh.hxx" #include "SMESH_MeshEditor.hxx" #include "SMESH_Mesh_i.hxx" +#include +#include "SMESH_ParallelMesh_i.hxx" #include "SMESH_PreMeshInfo.hxx" #include "SMESH_PythonDump.hxx" #include "SMESH_ControlsDef.hxx" #include #include #include +#include "SMESH_Meshio.h" // to pass CORBA exception through SMESH_TRY #define SMY_OWN_CATCH catch( SALOME::SALOME_Exception& se ) { throw se; } @@ -562,7 +566,7 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName */ //============================================================================= -SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh(bool parallel /*=false*/) +SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh() { Unexpect aCatch(SALOME_SalomeException); MESSAGE( "SMESH_Gen_i::createMesh" ); @@ -573,11 +577,10 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh(bool parallel /*=false*/) SMESH_Mesh_i* meshServant = new SMESH_Mesh_i( GetPOA(), this ); // create a new mesh object MESSAGE("myIsEmbeddedMode " << myIsEmbeddedMode); - if(parallel) { - meshServant->SetImpl( dynamic_cast(myGen.CreateParallelMesh( myIsEmbeddedMode ))); - }else{ - meshServant->SetImpl( dynamic_cast(myGen.CreateMesh( myIsEmbeddedMode ))); - } + SMESH_Mesh* myImpl = dynamic_cast(myGen.CreateMesh( myIsEmbeddedMode )); + if(myImpl == NULL ) + THROW_SALOME_CORBA_EXCEPTION( "Could not cast SequentialMesh as Mesh", SALOME::INTERNAL_ERROR ); + meshServant->SetImpl(myImpl); // activate the CORBA servant of Mesh SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( meshServant->_this() ); @@ -592,6 +595,42 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh(bool parallel /*=false*/) return SMESH::SMESH_Mesh::_nil(); } +//============================================================================= +/*! + * SMESH_Gen_i::createParallelMesh + * + * Create empty parallel mesh on shape + */ +//============================================================================= +SMESH::SMESH_ParallelMesh_ptr SMESH_Gen_i::createParallelMesh() +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "SMESH_Gen_i::createParallelMesh" ); + + // Get or create the GEOM_Client instance + try { + // create a new mesh object servant, store it in a map in study context + SMESH_ParallelMesh_i* meshServant = new SMESH_ParallelMesh_i( GetPOA(), this ); + // create a new mesh object + MESSAGE("myIsEmbeddedMode " << myIsEmbeddedMode); + SMESH_Mesh* myImpl = dynamic_cast(myGen.CreateParallelMesh( myIsEmbeddedMode )); + if(myImpl == NULL ) + THROW_SALOME_CORBA_EXCEPTION( "Could not cast ParallelMesh as Mesh", SALOME::INTERNAL_ERROR ); + meshServant->SetImpl(myImpl); + + // activate the CORBA servant of Mesh + SMESH::SMESH_ParallelMesh_var mesh = SMESH::SMESH_ParallelMesh::_narrow( meshServant->_this() ); + int nextId = RegisterObject( mesh ); + MESSAGE( "Add mesh to map with id = "<< nextId); + + return mesh._retn(); + } + catch (SALOME_Exception& S_ex) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM ); + } + return SMESH::SMESH_ParallelMesh::_nil(); +} + //============================================================================= /*! * SMESH_Gen_i::GetShapeReader @@ -1235,14 +1274,14 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMesh( GEOM::GEOM_Object_ptr theShapeObj */ //============================================================================= -SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateParallelMesh( GEOM::GEOM_Object_ptr theShapeObject ) +SMESH::SMESH_ParallelMesh_ptr SMESH_Gen_i::CreateParallelMesh( GEOM::GEOM_Object_ptr theShapeObject ) { Unexpect aCatch(SALOME_SalomeException); MESSAGE( "SMESH_Gen_i::CreateParallelMesh" ); // create mesh - SMESH::SMESH_Mesh_var mesh = this->createMesh(true); + SMESH::SMESH_ParallelMesh_var mesh = this->createParallelMesh(); // set shape - SMESH_Mesh_i* meshServant = SMESH::DownCast( mesh ); + SMESH_ParallelMesh_i* meshServant = SMESH::DownCast( mesh ); ASSERT( meshServant ); meshServant->SetShape( theShapeObject ); @@ -1254,7 +1293,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateParallelMesh( GEOM::GEOM_Object_ptr the aStudyBuilder->CommitCommand(); if ( !aSO->_is_nil() ) { // Update Python script - TPythonDump(this) << aSO << " = " << this << ".CreateMesh(" << theShapeObject << ")"; + TPythonDump(this) << aSO << " = " << this << ".CreateParallelMesh(" << theShapeObject << ")"; } } @@ -1312,6 +1351,39 @@ namespace SALOME::BAD_PARAM ); } } + + //================================================================================ + /*! + * \brief Makes a python dump for a function by iterating the given SObjects + */ + //================================================================================ + + void functionToPythonDump( + SMESH_Gen_i* smesh, const std::string& functionName, std::vector& sobjects) + { + TPythonDump aPythonDump(smesh); + aPythonDump << "(["; + + int i = 0; + for (const SALOMEDS::SObject_wrap& so : sobjects) + { + if (i > 0) + { + aPythonDump << ", "; + } + + if (!so->_is_nil()) + { + aPythonDump << so; + } + else + { + aPythonDump << "mesh_" << i; + } + } + + aPythonDump << "], status) = " << smesh << functionName; + } } //============================================================================= @@ -1611,6 +1683,91 @@ SMESH_Gen_i::CreateMeshesFromGMF( const char* theFileName, return aMesh._retn(); } +//================================================================================ +/*! + * \brief Create a mesh and import data from any file supported by meshio library + */ +//================================================================================ + +SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMESHIO(const char* theFileName, + SMESH::DriverMED_ReadStatus& theStatus) +{ + Unexpect aCatch(SALOME_SalomeException); + checkFileReadable(theFileName); + + MESSAGE("Import part with meshio through an intermediate MED file"); + + // Create an object that holds a temp file name and + // removes the file when goes out of scope. + SMESH_Meshio meshio; + const QString tempFileName = meshio.CreateTempFileName(theFileName); + + // Convert temp file into a target one with meshio command + meshio.Convert(theFileName, tempFileName); + + // We don't need a python dump from SMESH_Gen_i::CreateMeshesFromMED(), so + // we can't use this method as is here. The followed code is an edited part of + // copy pasted CreateMeshesFromMED(). + + // Retrieve mesh names from the file + DriverMED_R_SMESHDS_Mesh myReader; + myReader.SetFile(tempFileName.toStdString()); + myReader.SetMeshId(-1); + Driver_Mesh::Status aStatus; + list aNames = myReader.GetMeshNames(aStatus); + SMESH::mesh_array_var aResult = new SMESH::mesh_array(); + theStatus = (SMESH::DriverMED_ReadStatus)aStatus; + + if (theStatus == SMESH::DRS_OK) + { + SALOMEDS::StudyBuilder_var aStudyBuilder; + aStudyBuilder = getStudyServant()->NewBuilder(); + aStudyBuilder->NewCommand(); // There is a transaction + + aResult->length(aNames.size()); + std::vector sobjects; + int i = 0; + + // Iterate through all meshes and create mesh objects + for (const std::string& meshName : aNames) + { + // create mesh + SMESH::SMESH_Mesh_var mesh = createMesh(); + + // publish mesh in the study + SALOMEDS::SObject_wrap aSO; + if (CanPublishInStudy(mesh)) + aSO = PublishMesh(mesh.in(), meshName.c_str()); + + // Save SO to use in a python dump + sobjects.emplace_back(aSO); + + // Read mesh data (groups are published automatically by ImportMEDFile()) + SMESH_Mesh_i* meshServant = dynamic_cast(GetServant(mesh).in()); + ASSERT(meshServant); + SMESH::DriverMED_ReadStatus status1 = + meshServant->ImportMEDFile(tempFileName.toUtf8().data(), meshName.c_str()); + if (status1 > theStatus) + theStatus = status1; + + aResult[i++] = SMESH::SMESH_Mesh::_duplicate(mesh); + meshServant->GetImpl().GetMeshDS()->Modified(); + } + + if (!aStudyBuilder->_is_nil()) + aStudyBuilder->CommitCommand(); + + // Python dump + const std::string functionName = std::string(".CreateMeshesFromMESHIO(r'") + theFileName + "')"; + functionToPythonDump(this, functionName, sobjects); + } + + // Dump creation of groups + for (CORBA::ULong i = 0; i < aResult->length(); ++i) + SMESH::ListOfGroups_var groups = aResult[i]->GetGroups(); + + return aResult._retn(); +} //============================================================================= /*! @@ -2040,7 +2197,9 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh, // Update Python script TPythonDump(this) << "isDone = " << this << ".Compute( " - << theMesh << ", " << theShapeObject << ")"; + << theMesh << ", " << theShapeObject << ")"; + TPythonDump(this) << this << ".CheckCompute( " + << theMesh << ")"; try { // get mesh servant