Reactivate Python

This commit is contained in:
Louis Gombert 2024-08-27 13:55:59 +00:00
parent ec25237027
commit 310f0d5f89
3 changed files with 105 additions and 95 deletions

View File

@ -115,12 +115,20 @@ MARK_AS_ADVANCED(SALOME_BUILD_GUI SALOME_SMESH_USE_CGNS SALOME_SMESH_USE_TBB SAL
# Python
FIND_PACKAGE(SalomePythonInterp REQUIRED)
FIND_PACKAGE(SalomePythonLibs REQUIRED)
IF (DEFINED EMSCRIPTEN)
FIND_PACKAGE(SalomePythonWasm REQUIRED)
SET(PYTHON_INCLUDE_DIRS ${PYTHONWASM_INCLUDE_DIR})
SET(PYTHON_LIBRARIES ${PYTHONWASM_LIB})
ELSE()
FIND_PACKAGE(SalomeBoost REQUIRED)
ENDIF()
# PThread
FIND_PACKAGE(SalomePThread REQUIRED)
# SWIG
FIND_PACKAGE(SalomeSWIG REQUIRED)
# Boost
# FIND_PACKAGE(SalomeBoost REQUIRED)
# CORBA
FIND_PACKAGE(SalomeOmniORB REQUIRED)
IF(DEFINED EMSCRIPTEN)

View File

@ -28,6 +28,7 @@ INCLUDE_DIRECTORIES(
${KERNEL_INCLUDE_DIRS}
${GUI_INCLUDE_DIRS}
${GEOM_INCLUDE_DIRS}
${PYTHON_INCLUDE_DIRS}
${MEDCOUPLING_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}/src/Controls
${PROJECT_SOURCE_DIR}/src/SMDS
@ -74,6 +75,7 @@ SET(_link_LIBRARIES
${KERNEL_SalomeKernelHelpers}
${KERNEL_SalomeDS}
${KERNEL_SalomeCatalog}
# ${PYTHON_LIBRARIES}
${OpenCASCADE_ApplicationFramework_LIBRARIES}
${OpenCASCADE_ModelingAlgorithms_LIBRARIES}
${GEOM_GEOMClient}
@ -127,7 +129,7 @@ SET(SMESHEngine_SOURCES
SMESH_Gen_i_1.cxx
SMESH_Gen_No_Session_i.cxx
SMESH_Gen_Session_i.cxx
# SMESH_PythonDump.cxx # EMscripten: duplicate symbol
# SMESH_PythonDump.cxx # Emscripten: duplicate symbol
SMESH_Mesh_i.cxx
SMESH_subMesh_i.cxx
SMESH_MeshEditor_i.cxx

View File

@ -50,8 +50,8 @@
#include <gp_Pnt.hxx>
// Have to be included before std headers
// #include <Python.h>
// #include <structmember.h>
#include <Python.h>
#include <structmember.h>
#ifdef WIN32
#include <windows.h>
@ -2899,122 +2899,122 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateDualMesh(SMESH::SMESH_IDSource_ptr mesh
const char* meshName,
CORBA::Boolean adapt_to_shape)
{
// Unexpect aCatch(SALOME_SalomeException);
Unexpect aCatch(SALOME_SalomeException);
// TPythonDump* pyDump = new TPythonDump(this); // prevent dump from CreateMesh()
// std::unique_ptr<TPythonDump> pyDumpDeleter( pyDump );
TPythonDump* pyDump = new TPythonDump(this); // prevent dump from CreateMesh()
std::unique_ptr<TPythonDump> pyDumpDeleter( pyDump );
// // 1. Get source mesh
// 1. Get source mesh
// if ( CORBA::is_nil( mesh ))
// THROW_SALOME_CORBA_EXCEPTION( "bad IDSource", SALOME::BAD_PARAM );
if ( CORBA::is_nil( mesh ))
THROW_SALOME_CORBA_EXCEPTION( "bad IDSource", SALOME::BAD_PARAM );
// SMESH::SMESH_Mesh_var srcMesh = mesh->GetMesh();
// SMESH_Mesh_i* srcMesh_i = SMESH::DownCast<SMESH_Mesh_i*>( srcMesh );
// if ( !srcMesh_i )
// THROW_SALOME_CORBA_EXCEPTION( "bad mesh of IDSource", SALOME::BAD_PARAM );
SMESH::SMESH_Mesh_var srcMesh = mesh->GetMesh();
SMESH_Mesh_i* srcMesh_i = SMESH::DownCast<SMESH_Mesh_i*>( srcMesh );
if ( !srcMesh_i )
THROW_SALOME_CORBA_EXCEPTION( "bad mesh of IDSource", SALOME::BAD_PARAM );
// CORBA::String_var mesh_var=GetORB()->object_to_string(mesh);
// std::string mesh_ior = mesh_var.in();
CORBA::String_var mesh_var=GetORB()->object_to_string(mesh);
std::string mesh_ior = mesh_var.in();
// //temporary folder for the generation of the med file
// fs::path tmp_folder = fs::temp_directory_path() / fs::unique_path(fs::path("dual_mesh-%%%%"));
// fs::create_directories(tmp_folder);
// fs::path dual_mesh_file = tmp_folder / fs::path("tmp_dual_mesh.med");
// std::string mesh_name(meshName);
// MESSAGE("Working in folder" + tmp_folder.string());
//temporary folder for the generation of the med file
fs::path tmp_folder = fs::temp_directory_path() / fs::unique_path(fs::path("dual_mesh-%%%%"));
fs::create_directories(tmp_folder);
fs::path dual_mesh_file = tmp_folder / fs::path("tmp_dual_mesh.med");
std::string mesh_name(meshName);
MESSAGE("Working in folder" + tmp_folder.string());
// // Running Python script
// assert(Py_IsInitialized());
// PyGILState_STATE gstate;
// gstate = PyGILState_Ensure();
// Running Python script
assert(Py_IsInitialized());
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
// std::string ats;
// if(adapt_to_shape)
// ats = "True";
// else
// ats = "False";
std::string ats;
if(adapt_to_shape)
ats = "True";
else
ats = "False";
// std::string cmd="import salome.smesh.smesh_tools as smt\n";
// cmd +="smt.smesh_create_dual_mesh(\"" + mesh_ior + "\", r\"" +
// dual_mesh_file.string() + "\", mesh_name=\"" + mesh_name + "\", adapt_to_shape=" + ats + ")";
// MESSAGE(cmd);
std::string cmd="import salome.smesh.smesh_tools as smt\n";
cmd +="smt.smesh_create_dual_mesh(\"" + mesh_ior + "\", r\"" +
dual_mesh_file.string() + "\", mesh_name=\"" + mesh_name + "\", adapt_to_shape=" + ats + ")";
MESSAGE(cmd);
// PyObject *py_main = PyImport_AddModule("__main__");
// PyObject *py_dict = PyModule_GetDict(py_main);
// PyObject *local_dict = PyDict_New();
PyObject *py_main = PyImport_AddModule("__main__");
PyObject *py_dict = PyModule_GetDict(py_main);
PyObject *local_dict = PyDict_New();
// PyRun_String(cmd.c_str(), Py_file_input, py_dict, local_dict);
PyRun_String(cmd.c_str(), Py_file_input, py_dict, local_dict);
// if (PyErr_Occurred()) {
// // Restrieving python error
// MESSAGE("Catching error");
// PyObject *errtype, *errvalue, *traceback;
// PyErr_Fetch(&errtype, &errvalue, &traceback);
// if(errvalue != NULL) {
// MESSAGE("Error has a value");
// PyObject *s = PyObject_Str(errvalue);
// Py_ssize_t size;
// std::string msg = PyUnicode_AsUTF8AndSize(s, &size);
// msg = "Issue with the execution of create_dual_mesh:\n"+msg;
// MESSAGE("throwing exception");
// // We need to deactivate the GIL before throwing the exception
// PyGILState_Release(gstate);
// THROW_SALOME_CORBA_EXCEPTION(msg.c_str(), SALOME::INTERNAL_ERROR );
// Py_DECREF(s);
// }
// Py_XDECREF(errvalue);
// Py_XDECREF(errtype);
// Py_XDECREF(traceback);
// }
if (PyErr_Occurred()) {
// Restrieving python error
MESSAGE("Catching error");
PyObject *errtype, *errvalue, *traceback;
PyErr_Fetch(&errtype, &errvalue, &traceback);
if(errvalue != NULL) {
MESSAGE("Error has a value");
PyObject *s = PyObject_Str(errvalue);
Py_ssize_t size;
std::string msg = PyUnicode_AsUTF8AndSize(s, &size);
msg = "Issue with the execution of create_dual_mesh:\n"+msg;
MESSAGE("throwing exception");
// We need to deactivate the GIL before throwing the exception
PyGILState_Release(gstate);
THROW_SALOME_CORBA_EXCEPTION(msg.c_str(), SALOME::INTERNAL_ERROR );
Py_DECREF(s);
}
Py_XDECREF(errvalue);
Py_XDECREF(errtype);
Py_XDECREF(traceback);
}
// PyGILState_Release(gstate);
PyGILState_Release(gstate);
// MESSAGE("Mesh created in " + dual_mesh_file.string());
MESSAGE("Mesh created in " + dual_mesh_file.string());
// // Import created MED
// SMESH::SMESH_Mesh_var newMesh = CreateMesh(GEOM::GEOM_Object::_nil());
// SMESH_Mesh_i* newMesh_i = SMESH::DownCast<SMESH_Mesh_i*>( newMesh );
// if ( !newMesh_i )
// THROW_SALOME_CORBA_EXCEPTION( "can't create a mesh", SALOME::INTERNAL_ERROR );
// SALOMEDS::SObject_wrap meshSO = ObjectToSObject( newMesh );
// if ( !meshSO->_is_nil() )
// {
// SetName( meshSO, meshName, meshName );
// SetPixMap( meshSO, "ICON_SMESH_TREE_MESH_IMPORTED");
// }
// int ret = newMesh_i->ImportMEDFile(dual_mesh_file.string().c_str(), meshName);
// if(ret)
// THROW_SALOME_CORBA_EXCEPTION( "Issue when importing mesh", SALOME::INTERNAL_ERROR );
// Import created MED
SMESH::SMESH_Mesh_var newMesh = CreateMesh(GEOM::GEOM_Object::_nil());
SMESH_Mesh_i* newMesh_i = SMESH::DownCast<SMESH_Mesh_i*>( newMesh );
if ( !newMesh_i )
THROW_SALOME_CORBA_EXCEPTION( "can't create a mesh", SALOME::INTERNAL_ERROR );
SALOMEDS::SObject_wrap meshSO = ObjectToSObject( newMesh );
if ( !meshSO->_is_nil() )
{
SetName( meshSO, meshName, meshName );
SetPixMap( meshSO, "ICON_SMESH_TREE_MESH_IMPORTED");
}
int ret = newMesh_i->ImportMEDFile(dual_mesh_file.string().c_str(), meshName);
if(ret)
THROW_SALOME_CORBA_EXCEPTION( "Issue when importing mesh", SALOME::INTERNAL_ERROR );
// /*
// SMESH_Mesh& newMesh2 = newMesh_i->GetImpl();
/*
SMESH_Mesh& newMesh2 = newMesh_i->GetImpl();
// MESSAGE("Loading file: " << dual_mesh_file.string() << " with mesh " << meshName);
// int ret = newMesh2.MEDToMesh(dual_mesh_file.c_str(), meshName);
// */
MESSAGE("Loading file: " << dual_mesh_file.string() << " with mesh " << meshName);
int ret = newMesh2.MEDToMesh(dual_mesh_file.c_str(), meshName);
*/
// newMesh_i->GetImpl().GetMeshDS()->Modified();
newMesh_i->GetImpl().GetMeshDS()->Modified();
// *pyDump << newMesh << " = " << this
// << ".CreateDualMesh("
// << mesh << ", "
// << "'" << mesh_name << "', "
// << ats << ") ";
*pyDump << newMesh << " = " << this
<< ".CreateDualMesh("
<< mesh << ", "
<< "'" << mesh_name << "', "
<< ats << ") ";
// pyDumpDeleter.reset(); // allow dump in GetGroups()
pyDumpDeleter.reset(); // allow dump in GetGroups()
// if ( srcMesh_i->GetImpl().GetGroupIds().size() > 0 ) // dump created groups
// MESSAGE("Dump of groups");
// SMESH::ListOfGroups_var groups = newMesh->GetGroups();
if ( srcMesh_i->GetImpl().GetGroupIds().size() > 0 ) // dump created groups
MESSAGE("Dump of groups");
SMESH::ListOfGroups_var groups = newMesh->GetGroups();
// #ifndef _DEBUG_
// fs::remove_all(tmp_folder);
// #endif
#ifndef _DEBUG_
fs::remove_all(tmp_folder);
#endif
// return newMesh._retn();
return newMesh._retn();
}
//================================================================================