mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-27 18:00:34 +05:00
WASM binding v1
This commit is contained in:
parent
2bebe506c3
commit
8d229bbd1f
@ -64,10 +64,15 @@ IF(SALOME_BUILD_GUI)
|
|||||||
)
|
)
|
||||||
ENDIF(SALOME_BUILD_GUI)
|
ENDIF(SALOME_BUILD_GUI)
|
||||||
|
|
||||||
|
IF (DEFINED EMSCRIPTEN)
|
||||||
|
SET(SUBDIRS_WASM webassembly)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
SET(SUBDIRS
|
SET(SUBDIRS
|
||||||
${SUBDIRS_COMMON}
|
${SUBDIRS_COMMON}
|
||||||
${SUBDIRS_CGNS}
|
${SUBDIRS_CGNS}
|
||||||
${SUBDIRS_GUI}
|
${SUBDIRS_GUI}
|
||||||
|
${SUBDIRS_WASM}
|
||||||
)
|
)
|
||||||
|
|
||||||
FOREACH(dir ${SUBDIRS})
|
FOREACH(dir ${SUBDIRS})
|
||||||
|
@ -186,7 +186,6 @@ class SMESH_EXPORT SMESH_Mesh
|
|||||||
SMESH_Mesh* FindMesh( int meshId ) const;
|
SMESH_Mesh* FindMesh( int meshId ) const;
|
||||||
|
|
||||||
SMESHDS_Mesh * GetMeshDS() { return _meshDS; }
|
SMESHDS_Mesh * GetMeshDS() { return _meshDS; }
|
||||||
|
|
||||||
const SMESHDS_Mesh * GetMeshDS() const { return _meshDS; }
|
const SMESHDS_Mesh * GetMeshDS() const { return _meshDS; }
|
||||||
|
|
||||||
SMESH_Gen *GetGen() { return _gen; }
|
SMESH_Gen *GetGen() { return _gen; }
|
||||||
|
109
src/webassembly/Bindings.cxx
Normal file
109
src/webassembly/Bindings.cxx
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#include "GEOMImpl_Gen.hxx"
|
||||||
|
#include "SMESHDS_Mesh.hxx"
|
||||||
|
#include "SMESH_ControlsDef.hxx"
|
||||||
|
#include "SMESH_Gen.hxx"
|
||||||
|
#include "SMESH_Mesh.hxx"
|
||||||
|
#include "StdMeshers_Hexa_3D.hxx"
|
||||||
|
#include "StdMeshers_NumberOfSegments.hxx"
|
||||||
|
#include "StdMeshers_Quadrangle_2D.hxx"
|
||||||
|
#include "StdMeshers_Regular_1D.hxx"
|
||||||
|
|
||||||
|
#include <emscripten/bind.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the total volume of the mesh
|
||||||
|
*/
|
||||||
|
double getTotalVolume(SMESH::Controls::Volume &volControl, SMESH_Mesh *mesh) {
|
||||||
|
std::cout << "Getting total volume" << std::endl;
|
||||||
|
double vol = 0;
|
||||||
|
SMDS_Mesh* ds = static_cast<SMDS_Mesh*>(mesh->GetMeshDS());
|
||||||
|
std::cout << "DS has " << ds->NbElements() << " elements" << std::endl;
|
||||||
|
volControl.SetMesh(ds);
|
||||||
|
for (int elemID = 0; elemID <= ds->NbElements(); elemID++) {
|
||||||
|
vol += volControl.GetValue(elemID);
|
||||||
|
}
|
||||||
|
return vol;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string addHypothesis(SMESH_Mesh &mesh, TopoDS_Shape &shape, int id) {
|
||||||
|
std::string e;
|
||||||
|
mesh.AddHypothesis(shape, id, &e);
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool compute(SMESH_Gen& gen, SMESH_Mesh* mesh, TopoDS_Shape& shape) {
|
||||||
|
return gen.Compute(*mesh, shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Required wrapping because SMESH_Mesh::GetMeshDS has 2 overloads, one const
|
||||||
|
// and one not const, so the reference cannot decide which one to choose
|
||||||
|
// SMDS_Mesh *getMeshDS(SMESH_Mesh &mesh) {
|
||||||
|
// return static_cast<SMDS_Mesh *>(mesh.GetMeshDS());
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void setMesh(SMESH::Controls::Volume &vol, SMDS_Mesh* mesh) {
|
||||||
|
// vol.SetMesh(mesh);
|
||||||
|
// }
|
||||||
|
|
||||||
|
EMSCRIPTEN_BINDINGS(smesh) {
|
||||||
|
// OCCT bindings
|
||||||
|
emscripten::class_<TopoDS_Shape>("CAS_Shape").constructor<>();
|
||||||
|
|
||||||
|
// GEOM Bindings
|
||||||
|
emscripten::class_<GEOMImpl_Gen>("GEOM_Gen")
|
||||||
|
.constructor<>()
|
||||||
|
.function("GetI3DPrimOperations", &GEOMImpl_Gen::GetI3DPrimOperations,
|
||||||
|
emscripten::allow_raw_pointers());
|
||||||
|
|
||||||
|
// CAS Pointer
|
||||||
|
emscripten::class_<Handle_GEOM_Object>("Handle_GEOM_Object")
|
||||||
|
.function("get", &Handle_GEOM_Object::get,
|
||||||
|
emscripten::allow_raw_pointers());
|
||||||
|
|
||||||
|
emscripten::class_<GEOM_Object>("GEOM_Object")
|
||||||
|
.function("GetValue", &GEOM_Object::GetValue);
|
||||||
|
|
||||||
|
emscripten::class_<GEOMImpl_I3DPrimOperations>("GEOM_PrimOperations")
|
||||||
|
.function("MakeBoxDXDYDZ", &GEOMImpl_I3DPrimOperations::MakeBoxDXDYDZ);
|
||||||
|
|
||||||
|
// SMESH Bindings
|
||||||
|
emscripten::class_<SMESH_Gen>("SMESH_Gen")
|
||||||
|
.constructor<>()
|
||||||
|
.function("CreateMesh", &SMESH_Gen::CreateMesh,
|
||||||
|
emscripten::allow_raw_pointers())
|
||||||
|
.function("Compute", &compute,
|
||||||
|
emscripten::allow_raw_pointers());
|
||||||
|
|
||||||
|
emscripten::class_<SMESHDS_Mesh>("SMESH_DS_Mesh")
|
||||||
|
.function("NbElements", &SMESHDS_Mesh::NbElements);
|
||||||
|
emscripten::class_<SMDS_Mesh>("SMESH_SMDS_Mesh");
|
||||||
|
|
||||||
|
emscripten::class_<SMESH_Hypothesis>("SMESH_Hypothesis")
|
||||||
|
.class_function("IsStatusFatal", &SMESH_Hypothesis::IsStatusFatal);
|
||||||
|
|
||||||
|
emscripten::class_<SMESH_Mesh>("SMESH_Mesh")
|
||||||
|
.function("ShapeToMesh", &SMESH_Mesh::ShapeToMesh)
|
||||||
|
.function("AddHypothesis", &addHypothesis,
|
||||||
|
emscripten::allow_raw_pointers());
|
||||||
|
// .function("GetMeshDS", &getMeshDS, emscripten::allow_raw_pointers());
|
||||||
|
|
||||||
|
// Meshers
|
||||||
|
emscripten::class_<StdMeshers_Regular_1D>("SMESH_Meshers_Regular_1D")
|
||||||
|
.constructor<int, SMESH_Gen *>();
|
||||||
|
emscripten::class_<StdMeshers_NumberOfSegments>(
|
||||||
|
"SMESH_Meshers_NumberOfSegments")
|
||||||
|
.constructor<int, SMESH_Gen *>()
|
||||||
|
.function("SetNumberOfSegments",
|
||||||
|
&StdMeshers_NumberOfSegments::SetNumberOfSegments);
|
||||||
|
emscripten::class_<StdMeshers_Quadrangle_2D>("SMESH_Meshers_Quadrangle_2D")
|
||||||
|
.constructor<int, SMESH_Gen *>();
|
||||||
|
emscripten::class_<StdMeshers_Hexa_3D>("SMESH_Meshers_Hexa_3D")
|
||||||
|
.constructor<int, SMESH_Gen *>();
|
||||||
|
|
||||||
|
// Measurements
|
||||||
|
emscripten::class_<SMESH::Controls::Volume>("SMESH_Controls_Volume")
|
||||||
|
.constructor<>()
|
||||||
|
// .function("SetMesh", &setMesh, emscripten::allow_raw_pointers())
|
||||||
|
// .function("GetValue", &SMESH::Controls::Volume::GetValue)
|
||||||
|
.function("GetTotal", &getTotalVolume, emscripten::allow_raw_pointers());
|
||||||
|
}
|
39
src/webassembly/CMakeLists.txt
Normal file
39
src/webassembly/CMakeLists.txt
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
add_executable(smeshjs Bindings.cxx)
|
||||||
|
|
||||||
|
set_target_properties(smeshjs PROPERTIES
|
||||||
|
OUTPUT_NAME smesh
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(smeshjs PRIVATE SalomeIDLKernel GEOMImpl SMESHDS SMESHimpl StdMeshers SMESHEngine)
|
||||||
|
target_include_directories(smeshjs PRIVATE
|
||||||
|
${OpenCASCADE_INCLUDE_DIR}
|
||||||
|
${KERNEL_INCLUDE_DIRS}
|
||||||
|
${KERNEL_INCLUDE_DIRS}
|
||||||
|
${MEDFILE_INCLUDE_DIRS}
|
||||||
|
${MEDCOUPLING_INCLUDE_DIRS}
|
||||||
|
${PROJECT_SOURCE_DIR}/src/Controls
|
||||||
|
${PROJECT_SOURCE_DIR}/src/SMDS
|
||||||
|
${PROJECT_SOURCE_DIR}/src/SMESH
|
||||||
|
${PROJECT_SOURCE_DIR}/src/SMESHDS
|
||||||
|
${PROJECT_SOURCE_DIR}/src/StdMeshers
|
||||||
|
${PROJECT_SOURCE_DIR}/src/SMESHUtils
|
||||||
|
)
|
||||||
|
target_link_options(smeshjs PRIVATE
|
||||||
|
"$<IF:$<CONFIG:Release>,-Oz,-O0>"
|
||||||
|
"--bind"
|
||||||
|
"--closure 1"
|
||||||
|
"SHELL:-sEXPORT_NAME=smesh"
|
||||||
|
"SHELL:-sALLOW_MEMORY_GROWTH=1"
|
||||||
|
"SHELL:-sEMULATE_FUNCTION_POINTER_CASTS=0"
|
||||||
|
"SHELL:-sMODULARIZE=1"
|
||||||
|
"SHELL:-sWASM=1"
|
||||||
|
"SHELL:-sFORCE_FILESYSTEM"
|
||||||
|
"SHELL:-sEXPORTED_RUNTIME_METHODS=FS"
|
||||||
|
"SHELL:-sWASM_BIGINT"
|
||||||
|
"SHELL:-sNO_DISABLE_EXCEPTION_CATCHING"
|
||||||
|
)
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/app.html"
|
||||||
|
"${CMAKE_BINARY_DIR}/src/webassembly/index.html"
|
||||||
|
COPYONLY)
|
55
src/webassembly/app.html
Normal file
55
src/webassembly/app.html
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="theme-dark">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>SMESH Web</title>
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<section class="section">
|
||||||
|
</section>
|
||||||
|
<script type="text/javascript" src="smesh.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
smesh()
|
||||||
|
.then((Module) => {
|
||||||
|
// Create a Geometric box of size 10^3
|
||||||
|
Module.geom = new Module.GEOM_Gen();
|
||||||
|
Module.prim = Module.geom.GetI3DPrimOperations();
|
||||||
|
Module.box = Module.prim.MakeBoxDXDYDZ(10.0, 10.0, 10.0);
|
||||||
|
Module.shape = Module.box.get().GetValue();
|
||||||
|
|
||||||
|
// Create a mesh for this shape
|
||||||
|
Module.smesh = new Module.SMESH_Gen();
|
||||||
|
Module.mesh = Module.smesh.CreateMesh(false);
|
||||||
|
Module.mesh.ShapeToMesh(Module.shape);
|
||||||
|
|
||||||
|
// Define hypothesis in 1D, 2D, 3D
|
||||||
|
Module.seg = new Module.SMESH_Meshers_Regular_1D(0, Module.smesh);
|
||||||
|
var err = Module.mesh.AddHypothesis(Module.shape, 0);
|
||||||
|
|
||||||
|
Module.segs = new Module.SMESH_Meshers_NumberOfSegments(1, Module.smesh);
|
||||||
|
Module.segs.SetNumberOfSegments(5);
|
||||||
|
err = Module.mesh.AddHypothesis(Module.shape, 1);
|
||||||
|
|
||||||
|
Module.segs = new Module.SMESH_Meshers_Quadrangle_2D(2, Module.smesh);
|
||||||
|
err = Module.mesh.AddHypothesis(Module.shape, 2);
|
||||||
|
|
||||||
|
Module.segs = new Module.SMESH_Meshers_Hexa_3D(3, Module.smesh);
|
||||||
|
err = Module.mesh.AddHypothesis(Module.shape, 3);
|
||||||
|
|
||||||
|
// Compute volume
|
||||||
|
Module.smesh.Compute(Module.mesh, Module.shape);
|
||||||
|
Module.volume = new Module.SMESH_Controls_Volume();
|
||||||
|
const vol = Module.volume.GetTotal(Module.mesh);
|
||||||
|
console.log(`Volume is ${vol}`);
|
||||||
|
})
|
||||||
|
.catch(error => console.error("Internal exception: " + error));
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user