File orca-slicer-cgal6-compat.patch of Package orca-slicer
From 68458092dc0a8a5f1a5b61cee4470d9c4e4fa6d4 Mon Sep 17 00:00:00 2001
From: Oleg Girko <ol@infoserver.lv>
Date: Fri, 28 Mar 2025 23:43:45 +0000
Subject: [PATCH] Compatibility with CGAL-6.0 (and 5.6).
This change is adaptation of the following Prusa Slicer pull request:
https://github.com/prusa3d/PrusaSlicer/pull/13081
It adds compatibility with CGAL 6.0 while preserving compatibility
with CGAL 5.6.
Signed-off-by: Oleg Girko <ol@infoserver.lv>
---
src/libslic3r/CutSurface.cpp | 53 +++++++++++++++++++++---------------
1 file changed, 31 insertions(+), 22 deletions(-)
diff --git a/src/libslic3r/CutSurface.cpp b/src/libslic3r/CutSurface.cpp
index 01a5a8383..5f3c1c05e 100644
--- a/src/libslic3r/CutSurface.cpp
+++ b/src/libslic3r/CutSurface.cpp
@@ -1,5 +1,13 @@
#include "CutSurface.hpp"
+template <typename T>
+auto access_pmap(std::optional<T> opt) -> T {
+ return opt.value_or(T{});
+}
+
+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
@@ -29,6 +37,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 <tbb/parallel_for.h>
// libslic3r
@@ -993,8 +1002,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,
@@ -1404,17 +1413,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);
@@ -1423,7 +1432,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);
@@ -1559,8 +1568,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 {
@@ -1745,10 +1754,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) {
@@ -2636,7 +2645,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)
@@ -2718,7 +2727,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()) {
@@ -2909,7 +2918,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);
@@ -2934,7 +2943,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];
@@ -2952,9 +2961,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());
@@ -3055,7 +3064,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) {
@@ -3141,7 +3150,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)];
@@ -3529,7 +3538,7 @@ SurfaceCut priv::patch2cut(SurfacePatch &patch)
std::string convert_map_name = "v:convert";
CutMesh::Property_map<VI, SurfaceCut::Index> convert_map =
- mesh.add_property_map<VI, SurfaceCut::Index>(convert_map_name).first;
+ access_pmap(mesh.add_property_map<VI, SurfaceCut::Index>(convert_map_name));
size_t indices_size = mesh.faces().size();
size_t vertices_size = mesh.vertices().size();
@@ -3678,7 +3687,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]) {
@@ -3704,7 +3713,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};
--
2.49.0