Subject: [PATCH 5/5] gnu: Update prusa-slicer to version 2.9.2

From: nomike <[email-masked]>
Date: Wed, 30 Apr 2025 02:15:07 +0200

Change-Id: Ibf59b2efb751c3ea0b555c2e4e914e5c095d5413
---
 gnu/packages/engineering.scm                  | 191 ++++++++++--------
 ...0-dont-force-link-to-wayland-and-x11.patch |  12 ++
 .../patches/prusa-slicer-2.8.1-cgal-6.0.patch | 191 ++++++++++++++++++
 .../patches/prusa-slicer-2.8.1-fstream.patch  |  42 ++++
 .../patches/prusa-slicer-fix-tests.patch      |  17 --
 5 files changed, 348 insertions(+), 105 deletions(-)
 create mode 100644 gnu/packages/patches/prusa-slicer-2.6.0-dont-force-link-to-wayland-and-x11.patch
 create mode 100644 gnu/packages/patches/prusa-slicer-2.8.1-cgal-6.0.patch
 create mode 100644 gnu/packages/patches/prusa-slicer-2.8.1-fstream.patch
 delete mode 100644 gnu/packages/patches/prusa-slicer-fix-tests.patch

diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index 440c075156..ce8ae4e347 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -42,6 +42,7 @@
 ;;; Copyright © 2024 Juliana Sims <[email-masked]>
 ;;; Copyright © 2024 Nguyễn Gia Phong <[email-masked]>
 ;;; Copyright © 2025 Frederick Muriuki Muriithi <[email-masked]>
+;;; Copyright © 2025 nomike Postmann <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -169,6 +170,7 @@ (define-module (gnu packages engineering)
   #:use-module (gnu packages tree-sitter)
   #:use-module (gnu packages version-control)
   #:use-module (gnu packages web)
+  #:use-module (gnu packages webkit)
   #:use-module (gnu packages wxwidgets)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xiph)
@@ -4402,104 +4404,117 @@ (define-public prusa-libbgcode
 (define-public prusa-slicer
   (package
     (name "prusa-slicer")
-    (version "2.7.4")
+    (version "2.9.2")
     (source
      (origin
        (method git-fetch)
-       (uri
-        (git-reference
-         (url "https://github.com/prusa3d/PrusaSlicer")
-         (commit (string-append "version_" version))))
+       (uri (git-reference
+             (url "https://github.com/prusa3d/PrusaSlicer")
+             (commit (string-append "version_" version))))
        (file-name (git-file-name name version))
-       (sha256 (base32 "0s1cfvhfilyv0y98asr61c6rwlgyr1hf5v5hg8q9zwmzm2bkcql3"))
-       (patches (search-patches "prusa-slicer-fix-tests.patch"))
+       (sha256
+        (base32 "05zwwhqv3fjg9rx6a4ga55f4ic1136f6lwms0kb4kaq50w9dvxwg"))
+       (patches (search-patches
+                 "prusa-slicer-2.6.0-dont-force-link-to-wayland-and-x11.patch"
+                 "prusa-slicer-2.8.1-cgal-6.0.patch"
+                 "prusa-slicer-2.8.1-fstream.patch"))
        (modules '((guix build utils)))
-       (snippet
-        `(begin
-           ;; Prusa slicer bundles a lot of dependencies in src/ directory.
-           ;; Most of them contain prusa-specific modifications (e.g. avrdude),
-           ;; but others do not. Here we replace the latter with Guix packages.
-           ;; Remove bundled libraries that were not modified by Prusa Slicer developers.
-           (delete-file-recursively "src/hidapi")
-           (delete-file-recursively "src/eigen")
-           (delete-file-recursively "src/libigl/igl")
-           (substitute* "CMakeLists.txt"
-             (("add_library\\(libexpat INTERFACE\\)")
-              ""))
-           (substitute* "src/libigl/CMakeLists.txt"
-             (("target_link_libraries\\(libigl INTERFACE igl::core\\)") ""))
-           (substitute* "src/CMakeLists.txt"
-             (("add_subdirectory\\(hidapi\\)")
-              "pkg_check_modules(HIDAPI REQUIRED hidapi-hidraw)")
-             (("include_directories\\(hidapi/include\\)")
-              "include_directories()"))
-           (substitute* "src/slic3r/CMakeLists.txt"
-             (("add_library\\(libslic3r_gui.*" all)
-              (string-append
-               all
-               "\ntarget_include_directories(libslic3r_gui PUBLIC ${HIDAPI_INCLUDE_DIRS})\n"))
-             (("\\bhidapi\\b") "${HIDAPI_LIBRARIES}"))))))
+       (snippet `(begin
+                   ;; Prusa slicer bundles a lot of dependencies in src/ directory.
+                   ;; Most of them contain prusa-specific modifications (e.g. avrdude),
+                   ;; but others do not. Here we replace the latter with Guix packages.
+                   ;; Remove bundled libraries that were not modified by Prusa Slicer
+                   ;; developers.
+                   
+                   ;; un-bundling hidapi
+                   ;; https://github.com/prusa3d/PrusaSlicer/issues/14505
+                   (delete-file-recursively "bundled_deps/hidapi")
+                   (substitute* "bundled_deps/CMakeLists.txt"
+                     (("add_subdirectory\\(hidapi\\)")
+                      ""))
+                   (substitute* "src/slic3r/CMakeLists.txt"
+                     (("hidapi")
+                      "hidapi::hidapi")
+                     (("add_library\\(libslic3r_gui.*" all)
+                      (string-append all "\nfind_package(hidapi REQUIRED)\n")))
+
+                   ;; un-bundling libigl
+                   (delete-file-recursively "bundled_deps/libigl/igl")
+                   (substitute* "bundled_deps/libigl/CMakeLists.txt"
+                     (("target_link_libraries\\(libigl INTERFACE igl::core\\)")
+                      ""))
+                   ;; Fix libsoup double linking
+                   (substitute* "src/slic3r/CMakeLists.txt"
+                     ((" webkit2gtk-4.1")
+                      ""))))))
     (build-system cmake-build-system)
     (arguments
-     (list #:configure-flags
-           #~(list "-DSLIC3R_FHS=1" ;; Use The Filesystem Hierarchy Standard.
-                   "-DSLIC3R_GTK=3" ;; Use GTK+
-                   ;; Use wxWidgets 3.0.x.x to prevent GUI crashes when adding support enforcers.
-                   "-DSLIC3R_WX_STABLE=1"
-                   (format #f "-Dlibigl_DIR=~a"
-                           (search-input-directory %build-inputs
-                                                   "lib/cmake/igl/"))
-                   (format #f "-DCatch2_DIR=~a"
-                           (search-input-directory %build-inputs
-                                                   "lib/cmake/Catch2/")))
-           #:phases
-           #~(modify-phases %standard-phases
-               (add-after 'unpack 'fix-include-paths
-                 (lambda _
-                   (substitute* "tests/libslic3r/test_quadric_edge_collapse.cpp"
-                     (("#include <libigl/igl/qslim.h>")
-                      "#include <igl/qslim.h>")))))))
-    (native-inputs
-     (list pkg-config catch2))
-    (inputs
-     (list boost
-           cereal
-           cgal
-           curl
-           dbus
-           eigen
-           eudev
-           expat
-           glew
-           glib
-           gmp
-           gtk+
-           heatshrink
-           hidapi
-           ilmbase
-           libigl
-           libjpeg-turbo
-           libpng
-           mesa
-           mpfr
-           nanosvg
-           nlopt
-           opencascade-occt
-           openvdb
-           pango
-           prusa-libbgcode
-           ;; XXX: Using Prusa wxWidgets fork as PrusaSlicer segfaults when compiled
-           ;; with regular wxwidgets.
-           prusa-wxwidgets
-           qhull
-           tbb
-           zlib))
+     (list
+      #:configure-flags
+      #~(list "-DSLIC3R_FHS=1" ;Use The Filesystem Hierarchy Standard.
+              "-DSLIC3R_GTK=3" ;Use GTK+
+              ;; Use wxWidgets 3.0.x.x to prevent GUI crashes when adding support
+              ;; enforcers.
+              "-DSLIC3R_WX_STABLE=1"
+              (format #f "-Dlibigl_DIR=~a"
+                      (search-input-directory %build-inputs "lib/cmake/igl/"))
+              (format #f "-DCatch2_DIR=~a"
+                      (search-input-directory %build-inputs
+                                              "lib/cmake/Catch2/")))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'fix-include-paths
+            (lambda _
+              (substitute* "tests/libslic3r/test_quadric_edge_collapse.cpp"
+                (("#include <libigl/igl/qslim.h>")
+                 "#include <igl/qslim.h>"))
+              (substitute* "src/slic3r/GUI/Mouse3DController.hpp"
+                (("#include \"hidapi.h\"")
+                 "#include \"hidapi/hidapi.h\"")))))))
+    (native-inputs (list pkg-config catch2-3.8))
+    (inputs (list boost
+                  cereal
+                  catch2-3.8
+                  cgal
+                  curl
+                  dbus
+                  eigen
+                  eudev
+                  `(,expat "static")
+                  glew
+                  glib
+                  gmp
+                  gtk+
+                  heatshrink
+                  hidapi-cmake
+                  ilmbase
+                  libigl
+                  libjpeg-turbo
+                  libpng
+                  mesa
+                  mpfr
+                  nanosvg
+                  nlopt
+                  opencascade-occt-7.6.1
+                  openssl
+                  openvdb
+                  pango
+                  prusa-libbgcode
+                  ;; XXX: Using Prusa wxWidgets fork as PrusaSlicer
+                  ;; segfaults when compiled with regular wxwidgets.
+                  prusa-wxwidgets
+                  qhull
+                  tbb
+                  webkitgtk-with-libsoup2
+                  z3
+                  zlib))
     (home-page "https://www.prusa3d.com/prusaslicer/")
-    (synopsis "G-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)")
-    (description "PrusaSlicer takes 3D models (STL, OBJ, AMF) and converts them into
+    (synopsis
+     "G-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)")
+    (description
+     "PrusaSlicer takes 3D models (STL, OBJ, AMF) and converts them into
 G-code instructions for FFF printers or PNG layers for mSLA 3D printers.")
     (license license:agpl3)
-
     ;; Mark as tunable to take advantage of SIMD code in Eigen and in libigl.
     (properties '((tunable? . #t)))))
 
diff --git a/gnu/packages/patches/prusa-slicer-2.6.0-dont-force-link-to-wayland-and-x11.patch b/gnu/packages/patches/prusa-slicer-2.6.0-dont-force-link-to-wayland-and-x11.patch
new file mode 100644
index 0000000000..1d36fcbb7b
--- /dev/null
+++ b/gnu/packages/patches/prusa-slicer-2.6.0-dont-force-link-to-wayland-and-x11.patch
@@ -0,0 +1,12 @@
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -115,9 +115,6 @@ if (SLIC3R_GUI)
+     # libslic3r_gui will link to opengl anyway, so lets override wx
+     list(FILTER wxWidgets_LIBRARIES EXCLUDE REGEX OpenGL)
+     
+-    if (UNIX AND NOT APPLE)
+-        list(APPEND wxWidgets_LIBRARIES X11 wayland-client wayland-egl EGL)
+-    endif ()
+ #    list(REMOVE_ITEM wxWidgets_LIBRARIES oleacc)
+     message(STATUS "wx libs: ${wxWidgets_LIBRARIES}")
+ 
diff --git a/gnu/packages/patches/prusa-slicer-2.8.1-cgal-6.0.patch b/gnu/packages/patches/prusa-slicer-2.8.1-cgal-6.0.patch
new file mode 100644
index 0000000000..3aac479197
--- /dev/null
+++ b/gnu/packages/patches/prusa-slicer-2.8.1-cgal-6.0.patch
@@ -0,0 +1,191 @@
+From a9283c62cec2b802aa2133c92b7ff5bf320c0bb6 Mon Sep 17 00:00:00 2001
+From: Laurent Rineau <[email-masked]>
+Date: Sat, 13 Jul 2024 01:19:21 +0200
+Subject: [PATCH] compatibility with CGAL-6.0 (and 5.6.x)
+
+updated for 2.8.1
+
+--- a/src/libslic3r/CutSurface.cpp
++++ b/src/libslic3r/CutSurface.cpp
+@@ -4,6 +4,14 @@
+ ///|/
+ #include "CutSurface.hpp"
+ 
++template <typename T>
++auto access_pmap(std::optional<T> opt) -> T {
++    return opt.value();
++}
++
++template <typename Pair>
++auto access_pmap(Pair pair) { return pair.first; }
++
+ /// models_input.obj - Check transormation of model to each others
+ /// projection_center.obj - circle representing center of projection with correct distance
+ /// {M} .. model index
+@@ -31,6 +39,7 @@ using namespace Slic3r;
+ #include <CGAL/Exact_integer.h>
+ #include <CGAL/Surface_mesh.h>
+ #include <CGAL/Cartesian_converter.h>
++#include <CGAL/AABB_traits.h>
+ #include <oneapi/tbb/blocked_range.h>
+ #include <oneapi/tbb/parallel_for.h>
+ #include <boost/property_map/property_map.hpp>
+@@ -1021,8 +1030,8 @@ priv::CutMesh priv::to_cgal(const ExPolygons  &shapes,
+     if (shapes.empty()) return {};
+         
+     CutMesh result;
+-    EdgeShapeMap edge_shape_map = result.add_property_map<EI, IntersectingElement>(edge_shape_map_name).first;
+-    FaceShapeMap face_shape_map = result.add_property_map<FI, IntersectingElement>(face_shape_map_name).first;
++    EdgeShapeMap edge_shape_map  = access_pmap((result.add_property_map<EI, IntersectingElement>(edge_shape_map_name)));
++    FaceShapeMap face_shape_map  = access_pmap((result.add_property_map<FI, IntersectingElement>(face_shape_map_name)));
+ 
+     std::vector<VI> indices;
+     auto insert_contour = [&projection, &indices, &result, 
+@@ -1432,17 +1441,17 @@ priv::CutAOIs priv::cut_from_model(CutMesh                &cgal_model,
+                                    const ExPolygonsIndices &s2i)
+ {
+     // pointer to edge or face shape_map
+-    VertexShapeMap vert_shape_map = cgal_model.add_property_map<VI, const IntersectingElement*>(vert_shape_map_name, nullptr).first;
++    VertexShapeMap vert_shape_map  = access_pmap((cgal_model.add_property_map<VI, const IntersectingElement*>(vert_shape_map_name, nullptr)));
+     
+     // detect anomalities in visitor.
+     bool is_valid = true;
+     // NOTE: map are created when convert shapes to cgal model
+-    const EdgeShapeMap& edge_shape_map = cgal_shape.property_map<EI, IntersectingElement>(edge_shape_map_name).first;
+-    const FaceShapeMap& face_shape_map = cgal_shape.property_map<FI, IntersectingElement>(face_shape_map_name).first;
++    const EdgeShapeMap& edge_shape_map  = access_pmap((cgal_shape.property_map<EI, IntersectingElement>(edge_shape_map_name)));
++    const FaceShapeMap& face_shape_map  = access_pmap((cgal_shape.property_map<FI, IntersectingElement>(face_shape_map_name)));
+     Visitor visitor{cgal_model, cgal_shape, edge_shape_map, face_shape_map, vert_shape_map, &is_valid};
+ 
+     // a property map containing the constrained-or-not status of each edge
+-    EdgeBoolMap ecm = cgal_model.add_property_map<EI, bool>(is_constrained_edge_name, false).first;
++    EdgeBoolMap ecm  = access_pmap((cgal_model.add_property_map<EI, bool>(is_constrained_edge_name, false)));
+     const auto &p = CGAL::parameters::visitor(visitor)
+                         .edge_is_constrained_map(ecm)
+                         .throw_on_self_intersection(false);
+@@ -1451,7 +1460,7 @@ priv::CutAOIs priv::cut_from_model(CutMesh                &cgal_model,
+ 
+     if (!is_valid) return {};
+ 
+-    FaceTypeMap face_type_map = cgal_model.add_property_map<FI, FaceType>(face_type_map_name, FaceType::not_constrained).first;
++    FaceTypeMap face_type_map  = access_pmap((cgal_model.add_property_map<FI, FaceType>(face_type_map_name, FaceType::not_constrained)));
+ 
+     // Select inside and outside face in model
+     set_face_type(face_type_map, cgal_model, vert_shape_map, ecm, cgal_shape, s2i);
+@@ -1587,8 +1596,8 @@ void priv::collect_surface_data(std::queue<FI>  &process,
+ 
+ void priv::create_reduce_map(ReductionMap &reduction_map, const CutMesh &mesh)
+ {
+-    const VertexShapeMap &vert_shape_map = mesh.property_map<VI, const IntersectingElement*>(vert_shape_map_name).first;
+-    const EdgeBoolMap &ecm = mesh.property_map<EI, bool>(is_constrained_edge_name).first;
++    const VertexShapeMap &vert_shape_map  = access_pmap((mesh.property_map<VI, const IntersectingElement*>(vert_shape_map_name)));
++    const EdgeBoolMap &ecm  = access_pmap((mesh.property_map<EI, bool>(is_constrained_edge_name)));
+ 
+     // check if vertex was made by edge_2 which is diagonal of quad
+     auto is_reducible_vertex = [&vert_shape_map](VI reduction_from) -> bool {
+@@ -1773,10 +1782,10 @@ priv::VDistances priv::calc_distances(const SurfacePatches &patches,
+     for (const SurfacePatch &patch : patches) {
+         // map is created during intersection by corefine visitor
+         const VertexShapeMap &vert_shape_map = 
+-            models[patch.model_id].property_map<VI, const IntersectingElement *>(vert_shape_map_name).first;
++            access_pmap((models[patch.model_id].property_map<VI, const IntersectingElement *>(vert_shape_map_name)));
+         uint32_t patch_index = &patch - &patches.front();
+         // map is created during patch creation / dividing
+-        const CvtVI2VI& cvt = patch.mesh.property_map<VI, VI>(patch_source_name).first;
++        const CvtVI2VI& cvt  = access_pmap((patch.mesh.property_map<VI, VI>(patch_source_name)));
+         // for each point on outline
+         for (const Loop &loop : patch.loops) 
+         for (const VI &vi_patch : loop) {
+@@ -2666,7 +2675,7 @@ priv::SurfacePatch priv::create_surface_patch(const std::vector<FI> &fis,
+                                               /* const */ CutMesh   &mesh,
+                                               const ReductionMap    *rmap)
+ {
+-    auto is_counted = mesh.add_property_map<VI, bool>("v:is_counted").first;
++    auto is_counted  = access_pmap((mesh.add_property_map<VI, bool>("v:is_counted")));
+     uint32_t count_vertices = 0;
+     if (rmap == nullptr) {
+         for (FI fi : fis) 
+@@ -2696,7 +2705,7 @@ priv::SurfacePatch priv::create_surface_patch(const std::vector<FI> &fis,
+     cm.reserve(count_vertices, count_edges, count_faces);
+ 
+     // vertex conversion function from mesh VI to result VI
+-    CvtVI2VI mesh2result = mesh.add_property_map<VI,VI>("v:mesh2result").first;
++    CvtVI2VI mesh2result  = access_pmap((mesh.add_property_map<VI,VI>("v:mesh2result")));
+ 
+     if (rmap == nullptr) {
+         for (FI fi : fis) {
+@@ -2748,7 +2757,7 @@ priv::SurfacePatch priv::create_surface_patch(const std::vector<FI> &fis,
+     assert(count_edges >= cm.edges().size());
+     
+     // convert VI from this patch to source VI, when exist
+-    CvtVI2VI cvt = cm.add_property_map<VI, VI>(patch_source_name).first;
++    CvtVI2VI cvt  = access_pmap((cm.add_property_map<VI, VI>(patch_source_name)));
+     // vi_s .. VertexIndex into mesh (source)
+     // vi_d .. new VertexIndex in cm (destination)
+     for (VI vi_s : mesh.vertices()) { 
+@@ -2939,7 +2948,7 @@ bool priv::is_patch_inside_of_model(const SurfacePatch &patch,
+ uint32_t priv::get_shape_point_index(const CutAOI &cut, const CutMesh &model)
+ {
+     // map is created during intersection by corefine visitor
+-    const VertexShapeMap &vert_shape_map = model.property_map<VI, const IntersectingElement *>(vert_shape_map_name).first;
++    const VertexShapeMap &vert_shape_map  = access_pmap((model.property_map<VI, const IntersectingElement *>(vert_shape_map_name)));
+     // for each half edge of outline
+     for (HI hi : cut.second) {
+         VI vi = model.source(hi);
+@@ -2964,7 +2973,7 @@ priv::SurfacePatch priv::separate_patch(const std::vector<FI>& fis,
+     patch_new.model_id     = patch.model_id;
+     patch_new.shape_id     = patch.shape_id;
+     // fix cvt
+-    CvtVI2VI cvt = patch_new.mesh.property_map<VI, VI>(patch_source_name).first;
++    CvtVI2VI cvt  = access_pmap((patch_new.mesh.property_map<VI, VI>(patch_source_name)));
+     for (VI &vi : cvt) {
+         if (!vi.is_valid()) continue;
+         vi = cvt_from[vi];
+@@ -2982,9 +2991,9 @@ void priv::divide_patch(size_t i, SurfacePatchesEx &patches)
+     CutMesh& cm = patch.mesh;
+     assert(!cm.faces().empty());
+     std::string patch_number_name = "f:patch_number";
+-    CutMesh::Property_map<FI,bool> is_processed = cm.add_property_map<FI, bool>(patch_number_name, false).first;
++    CutMesh::Property_map<FI,bool> is_processed  = access_pmap((cm.add_property_map<FI, bool>(patch_number_name, false)));
+     
+-    const CvtVI2VI& cvt_from = patch.mesh.property_map<VI, VI>(patch_source_name).first;
++    const CvtVI2VI& cvt_from  = access_pmap((patch.mesh.property_map<VI, VI>(patch_source_name)));
+ 
+     std::vector<FI> fis;
+     fis.reserve(cm.faces().size());
+@@ -3085,7 +3094,7 @@ priv::SurfacePatches priv::diff_models(VCutAOIs            &cuts,
+         CutAOIs &model_cuts = cuts[model_index];
+         CutMesh &cut_model_ = cut_models[model_index];
+         const CutMesh &cut_model = cut_model_;
+-        ReductionMap vertex_reduction_map = cut_model_.add_property_map<VI, VI>(vertex_reduction_map_name).first;
++        ReductionMap vertex_reduction_map  = access_pmap((cut_model_.add_property_map<VI, VI>(vertex_reduction_map_name)));
+         create_reduce_map(vertex_reduction_map, cut_model);
+ 
+         for (size_t cut_index = 0; cut_index < model_cuts.size(); ++cut_index, ++index) {
+@@ -3171,7 +3180,7 @@ bool priv::is_over_whole_expoly(const CutAOI    &cutAOI,
+                                 const CutMesh   &mesh)
+ {
+     // NonInterupted contour is without other point and contain all from shape    
+-    const VertexShapeMap &vert_shape_map = mesh.property_map<VI, const IntersectingElement*>(vert_shape_map_name).first;
++    const VertexShapeMap &vert_shape_map  = access_pmap((mesh.property_map<VI, const IntersectingElement*>(vert_shape_map_name)));
+     for (HI hi : cutAOI.second) { 
+         const IntersectingElement *ie_s = vert_shape_map[mesh.source(hi)];
+         const IntersectingElement *ie_t = vert_shape_map[mesh.target(hi)];
+@@ -3708,7 +3717,7 @@ void priv::store(const CutMesh &mesh, const FaceTypeMap &face_type_map, const st
+     }
+ 
+     CutMesh &mesh_ = const_cast<CutMesh &>(mesh);
+-    auto face_colors = mesh_.add_property_map<priv::FI, CGAL::Color>("f:color").first;    
++    auto face_colors  = access_pmap((mesh_.add_property_map<priv::FI, CGAL::Color>("f:color")));    
+     for (FI fi : mesh.faces()) { 
+         auto &color = face_colors[fi];
+         switch (face_type_map[fi]) {
+@@ -3734,7 +3743,7 @@ void priv::store(const CutMesh &mesh, const ReductionMap &reduction_map, const s
+     std::string off_file = dir + "model" + std::to_string(reduction_order++) + ".off";
+ 
+     CutMesh &mesh_ = const_cast<CutMesh &>(mesh);
+-    auto vertex_colors = mesh_.add_property_map<priv::VI, CGAL::Color>("v:color").first;    
++    auto vertex_colors  = access_pmap((mesh_.add_property_map<priv::VI, CGAL::Color>("v:color")));    
+     // initialize to gray color
+     for (VI vi: mesh.vertices())
+         vertex_colors[vi] = CGAL::Color{127, 127, 127};
diff --git a/gnu/packages/patches/prusa-slicer-2.8.1-fstream.patch b/gnu/packages/patches/prusa-slicer-2.8.1-fstream.patch
new file mode 100644
index 0000000000..f550c53d3f
--- /dev/null
+++ b/gnu/packages/patches/prusa-slicer-2.8.1-fstream.patch
@@ -0,0 +1,42 @@
+--- a/src/slic3r/GUI/Gizmos/GLGizmoSVG.cpp
++++ b/src/slic3r/GUI/Gizmos/GLGizmoSVG.cpp
+@@ -1595,7 +1595,7 @@ void GLGizmoSVG::draw_filename(){
+             if (dlg.ShowModal() == wxID_OK ){
+                 last_used_directory = dlg.GetDirectory();
+                 std::string out_path_str(into_u8(dlg.GetPath()));
+-                boost::nowide::ofstream stream(out_path_str);
++                std::ofstream stream(out_path_str);
+                 if (stream.is_open()){
+                     stream << *svg.file_data;
+ 
+--- a/src/slic3r/GUI/PresetArchiveDatabase.cpp
++++ b/src/slic3r/GUI/PresetArchiveDatabase.cpp
+@@ -515,7 +515,7 @@ void PresetArchiveDatabase::load_app_manifest_json()
+ 	if (!fs::exists(path, ec) || ec) {
+ 		copy_initial_manifest();
+ 	}
+-	boost::nowide::ifstream file(path.string());
++	std::ifstream file(path.string());
+ 	std::string data;
+ 	if (file.is_open()) {
+ 		std::string line;
+@@ -682,7 +682,7 @@ void PresetArchiveDatabase::save_app_manifest_json() const
+ 	data += "]";
+ 
+ 	std::string path = get_stored_manifest_path().string();
+-	boost::nowide::ofstream file(path);
++	std::ofstream file(path);
+ 	if (file.is_open()) {
+ 		file << data;
+ 		file.close();
+--- a/src/slic3r/Utils/Http.cpp
++++ b/src/slic3r/Utils/Http.cpp
+@@ -302,7 +302,7 @@ void Http::priv::form_add_file(const char *name, const fs::path &path, const cha
+ //FIXME may throw! Is the caller aware of it?
+ void Http::priv::set_post_body(const fs::path &path)
+ {
+-	boost::nowide::ifstream file(path.string());
++	std::ifstream file(path.string());
+ 	std::string file_content { std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>() };
+ 	postfields = std::move(file_content);
+ }
diff --git a/gnu/packages/patches/prusa-slicer-fix-tests.patch b/gnu/packages/patches/prusa-slicer-fix-tests.patch
deleted file mode 100644
index da9a5307f9..0000000000
--- a/gnu/packages/patches/prusa-slicer-fix-tests.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-This patch comes from Gentoo:
- portage/media-gfx/prusaslicer/files/prusaslicer-2.5.0_rc1-fix-tests.patch
-
---- a/tests/fff_print/test_data.cpp
-+++ b/tests/fff_print/test_data.cpp
-@@ -4,10 +4,9 @@
- #include "libslic3r/GCodeReader.hpp"
- #include "libslic3r/Config.hpp"
- #include "libslic3r/Print.hpp"
--#include "libslic3r/Format/OBJ.hpp"
--#include "libslic3r/Format/STL.hpp"
-
- #include <cstdlib>
-+#include <fstream>
- #include <string>
-
- #include <boost/nowide/cstdio.hpp>
-- 
2.49.0