diff --git a/CMakeLists.txt b/CMakeLists.txt index d351a3f9d..157b9cc41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/src/SMESH_I/CMakeLists.txt b/src/SMESH_I/CMakeLists.txt index 03b4a2b16..ab59e7f2e 100644 --- a/src/SMESH_I/CMakeLists.txt +++ b/src/SMESH_I/CMakeLists.txt @@ -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 diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index e2341f65f..2c2bf5a9f 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -50,8 +50,8 @@ #include // Have to be included before std headers -// #include -// #include +#include +#include #ifdef WIN32 #include @@ -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 pyDumpDeleter( pyDump ); + TPythonDump* pyDump = new TPythonDump(this); // prevent dump from CreateMesh() + std::unique_ptr 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( 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( 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( 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( 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(); } //================================================================================