From 5d9b31eea0a255a3c1d9a35aa817be3fe434a7a8 Mon Sep 17 00:00:00 2001
From: Guillaume Cerutti <guillaume.cerutti@inria.fr>
Date: Thu, 28 Mar 2024 12:19:56 +0100
Subject: [PATCH] add cgal image building function

---
 CMakeLists.txt                                | 14 +++++-----
 cpp/CMakeLists.txt                            |  3 +++
 cpp/CgalLabelledImage.cpp                     | 26 +++++++++++++++++++
 cpp/CgalLabelledImage.h                       |  8 ++++++
 .../labelled_tetrahedral_mesh.py              |  9 ++++++-
 wrp/LabelledTetrahedralMeshWrapper.cpp        |  3 +++
 6 files changed, 54 insertions(+), 9 deletions(-)
 create mode 100644 cpp/CgalLabelledImage.cpp
 create mode 100644 cpp/CgalLabelledImage.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4148520..8567691 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -22,14 +22,12 @@ find_package(Eigen3 3.3 REQUIRED NO_MODULE)
 # make cache variables for install destinations
 include(GNUInstallDirs)
 
-if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
-    if (DEFINED ENV{CONDA_PREFIX})
-        set(CMAKE_INSTALL_LIBDIR "lib")
-        set(CMAKE_INSTALL_PREFIX "$ENV{CONDA_PREFIX}")
-    else()
-        set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install")
-    endif()
-endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+if (DEFINED ENV{CONDA_PREFIX})
+    set(CMAKE_INSTALL_LIBDIR "lib")
+    set(CMAKE_INSTALL_PREFIX "$ENV{CONDA_PREFIX}")
+else()
+    set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install")
+endif()
 
 add_subdirectory(cpp)
 add_subdirectory(wrp)
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 8c0ddac..80a241c 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -1,9 +1,12 @@
 project(_cpp)
 
 add_library(_cpp SHARED
+    CgalLabelledImage.h
     LabelledTetrahedralMesh.h
+    CgalLabelledImage.cpp
     LabelledTetrahedralMesh.cpp
 )
 target_link_libraries(_cpp PUBLIC Eigen3::Eigen)
+target_link_libraries(_cpp PUBLIC CGAL::CGAL)
 
 install(TARGETS _cpp DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
\ No newline at end of file
diff --git a/cpp/CgalLabelledImage.cpp b/cpp/CgalLabelledImage.cpp
new file mode 100644
index 0000000..aa7dd2b
--- /dev/null
+++ b/cpp/CgalLabelledImage.cpp
@@ -0,0 +1,26 @@
+#include <iostream>
+
+#include "CgalLabelledImage.h"
+
+
+int buildCgalImage(Eigen::Array<unsigned short, Eigen::Dynamic, 1> image_array, Eigen::Array<int, 3, 1> shape, Eigen::Array<double, 3, 1> voxelsize)
+{
+    _image* image = _createImage(
+        shape(0), shape(1), shape(2), 1,
+        voxelsize(0), voxelsize(1), voxelsize(2), 2,
+        WK_FIXED, SGN_UNSIGNED
+    );
+
+    auto it = image_array.begin();
+    for (int x=0; x<shape(0); x++) {
+        for (int y=0; y<shape(1); y++) {
+            for (int z=0; z<shape(2); z++) {
+                CGAL::IMAGEIO::static_evaluate<unsigned short>(image, x, y, z) = *it;
+                ++it;
+            }
+        }
+    }
+    CGAL::Image_3 cgal_image(image);
+
+    return 0;
+}
diff --git a/cpp/CgalLabelledImage.h b/cpp/CgalLabelledImage.h
new file mode 100644
index 0000000..8a8200d
--- /dev/null
+++ b/cpp/CgalLabelledImage.h
@@ -0,0 +1,8 @@
+#pragma once
+
+#include <CGAL/Image_3.h>
+
+#include <Eigen/Dense>
+
+
+int buildCgalImage(Eigen::Array<unsigned short, Eigen::Dynamic, 1> image_array, Eigen::Array<int, 3, 1> shape, Eigen::Array<double, 3, 1> voxelsize={1.0, 1.0, 1.0});
\ No newline at end of file
diff --git a/src/pybind_example/labelled_tetrahedral_mesh.py b/src/pybind_example/labelled_tetrahedral_mesh.py
index 7014b32..ce7b8b7 100644
--- a/src/pybind_example/labelled_tetrahedral_mesh.py
+++ b/src/pybind_example/labelled_tetrahedral_mesh.py
@@ -1 +1,8 @@
-from ._wrp import LabelledTetrahedralMesh, make_tetrahedron
\ No newline at end of file
+import numpy as np
+
+from ._wrp import LabelledTetrahedralMesh, make_tetrahedron
+from ._wrp import build_cgal_image as _build_cgal_image
+
+
+def build_cgal_image(img: np.ndarray) -> bool:
+    return _build_cgal_image(img.ravel().astype(np.uint16), img.shape, [1., 1., 1.])
diff --git a/wrp/LabelledTetrahedralMeshWrapper.cpp b/wrp/LabelledTetrahedralMeshWrapper.cpp
index 8fcc884..6c9a1a6 100644
--- a/wrp/LabelledTetrahedralMeshWrapper.cpp
+++ b/wrp/LabelledTetrahedralMeshWrapper.cpp
@@ -2,6 +2,7 @@
 #include <pybind11/stl.h> // This header is needed to work with STL containers like std::vector
 #include <pybind11/eigen.h>
 
+#include "CgalLabelledImage.h"
 #include "LabelledTetrahedralMesh.h"
 
 namespace py = pybind11;
@@ -16,4 +17,6 @@ PYBIND11_MODULE(_wrp, m) {
         .def("add_tetra", &LabelledTetrahedralMesh::addTetra, py::arg("tetra"), py::arg("label"));
 
     m.def("make_tetrahedron", &makeTetrahedron);
+
+    m.def("build_cgal_image", &buildCgalImage, py::arg("image_array"), py::arg("shape"), py::arg("voxelsize"));
 }
\ No newline at end of file
-- 
GitLab