-// Copyright (C) 2007-2023 CEA, EDF, 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
#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 <SMESH_SequentialMesh_i.hxx>
+#include "SMESH_ParallelMesh_i.hxx"
#include "SMESH_PreMeshInfo.hxx"
#include "SMESH_PythonDump.hxx"
#include "SMESH_ControlsDef.hxx"
#include <SMESH_BoostTxtArchive.hxx>
#include <SMESH_SequentialMesh_i.hxx>
#include <SMESH_ParallelMesh_i.hxx>
+#include "SMESH_Meshio.h"
// to pass CORBA exception through SMESH_TRY
#define SMY_OWN_CATCH catch( SALOME::SALOME_Exception& se ) { throw se; }
*/
//=============================================================================
-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" );
SMESH_Mesh_i* meshServant = new SMESH_Mesh_i( GetPOA(), this );
// create a new mesh object
MESSAGE("myIsEmbeddedMode " << myIsEmbeddedMode);
- if(parallel) {
- meshServant->SetImpl( dynamic_cast<SMESH_Mesh*>(myGen.CreateParallelMesh( myIsEmbeddedMode )));
- }else{
- meshServant->SetImpl( dynamic_cast<SMESH_Mesh*>(myGen.CreateMesh( myIsEmbeddedMode )));
- }
+ SMESH_Mesh* myImpl = dynamic_cast<SMESH_Mesh*>(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() );
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<SMESH_Mesh*>(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
*/
//=============================================================================
-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<SMESH_Mesh_i*>( mesh );
+ SMESH_ParallelMesh_i* meshServant = SMESH::DownCast<SMESH_ParallelMesh_i*>( mesh );
ASSERT( meshServant );
meshServant->SetShape( theShapeObject );
aStudyBuilder->CommitCommand();
if ( !aSO->_is_nil() ) {
// Update Python script
- TPythonDump(this) << aSO << " = " << this << ".CreateMesh(" << theShapeObject << ")";
+ TPythonDump(this) << aSO << " = " << this << ".CreateParallelMesh(" << theShapeObject << ")";
}
}
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<SALOMEDS::SObject_wrap>& 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;
+ }
}
//=============================================================================
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<string> 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<SALOMEDS::SObject_wrap> 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<SMESH_Mesh_i*>(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();
+}
//=============================================================================
/*!
// Update Python script
TPythonDump(this) << "isDone = " << this << ".Compute( "
- << theMesh << ", " << theShapeObject << ")";
+ << theMesh << ", " << theShapeObject << ")";
+ TPythonDump(this) << this << ".CheckCompute( "
+ << theMesh << ")";
try {
// get mesh servant