From a994933ccbc957496522775a94aac3a83b19839f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 30 Jun 2022 11:44:09 +0100 Subject: [PATCH 01/65] Nef_3: Fix conversion to a FaceGraph --- .../include/CGAL/Nef_3/SNC_const_decorator.h | 10 +++++ .../convert_nef_polyhedron_to_polygon_mesh.h | 20 +++++---- Nef_3/test/Nef_3/issue_6423.cpp | 44 +++++++++++++++++++ 3 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 Nef_3/test/Nef_3/issue_6423.cpp diff --git a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h index a8b0123f3df2..910ba280e2fa 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h @@ -535,6 +535,16 @@ visit_shell_objects(typename Traits::SFace_handle f, Visitor& V) const } Halffacet_handle f = ec->twin()->facet(); if ( Done[f] ) continue; + Halffacet_handle tf = f->twin(); + if ((f->incident_volume() == tf->incident_volume()) && Done[tf]) { + continue; // for example when we have to do with the unbounded volume and a surface with boundaries + } + Volume_const_iterator unbounded = volumes_begin(); + Volume_const_iterator fit = f->incident_volume(); + Volume_const_iterator tfit = tf->incident_volume(); + if ((fit == unbounded) && (tfit != unbounded)) { + continue; // because we will later report it from the bounded side + } FacetCandidates.push_back(f); Done[f] = true; } } else if (fc.is_svertex() ) { diff --git a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h index a5e5e6191207..f2a880c8872c 100644 --- a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h +++ b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h @@ -351,18 +351,22 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, typedef Cartesian_converter Converter; typename Nef_polyhedron::Volume_const_iterator vol_it = nef.volumes_begin(), vol_end = nef.volumes_end(); - if ( Nef_polyhedron::Infi_box::extended_kernel() ) ++vol_it; // skip Infi_box + + if (Nef_polyhedron::Infi_box::extended_kernel()) { + ++vol_it; // skip Infi_box + } + CGAL_assertion ( vol_it != vol_end ); - ++vol_it; // skip unbounded volume Converter to_output; for (;vol_it!=vol_end;++vol_it) - nef_to_pm::collect_polygon_mesh_info(points, - polygons, - nef, - vol_it->shells_begin(), - to_output, - triangulate_all_faces); + for(auto sit = vol_it->shells_begin(); sit != vol_it->shells_end(); ++sit) + nef_to_pm::collect_polygon_mesh_info(points, + polygons, + nef, + sit, + to_output, + triangulate_all_faces); } template diff --git a/Nef_3/test/Nef_3/issue_6423.cpp b/Nef_3/test/Nef_3/issue_6423.cpp new file mode 100644 index 000000000000..0ffad5bf0e1a --- /dev/null +++ b/Nef_3/test/Nef_3/issue_6423.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SurfaceMesh; +typedef CGAL::Nef_polyhedron_3 NefPolyhedron; + + +int main(int argc, char* argv[]) +{ + SurfaceMesh surfaceMesh; + SurfaceMesh::Vertex_index v0 = surfaceMesh.add_vertex(Point_3(-1, 0, 0)); + SurfaceMesh::Vertex_index v1 = surfaceMesh.add_vertex(Point_3(1, 0, 0)); + SurfaceMesh::Vertex_index v2 = surfaceMesh.add_vertex(Point_3(0, 1, 0)); + + SurfaceMesh::Vertex_index v3 = surfaceMesh.add_vertex(Point_3(-1, 0, 1)); + SurfaceMesh::Vertex_index v4 = surfaceMesh.add_vertex(Point_3(1, 0, 1)); + SurfaceMesh::Vertex_index v5 = surfaceMesh.add_vertex(Point_3(0, 1, 1)); + + surfaceMesh.add_face(v0, v1, v2); + surfaceMesh.add_face(v3, v4, v5); + + make_tetrahedron(Point_3(-1, 0, 10), + Point_3(1, 0, 10), + Point_3(0, 1, 10), + Point_3(-1, 0, 11), + surfaceMesh); + + std::cout << "Before conversion, number_of_faces: " << surfaceMesh.number_of_faces() << std::endl; + + NefPolyhedron nefPoly(surfaceMesh); + std::cout << "NefPolyhedron, number_of_faces: " << nefPoly.number_of_facets() << std::endl; + std::cout << nefPoly << std::endl; + SurfaceMesh convertedSurfaceMesh; + CGAL::convert_nef_polyhedron_to_polygon_mesh(nefPoly, convertedSurfaceMesh, true); + std::cout << "After conversion, number_of_faces: " << convertedSurfaceMesh.number_of_faces() << std::endl; + std::cout << convertedSurfaceMesh << std::endl; + return EXIT_SUCCESS; +} From 07b04366a0e01015f0ccf2f9f49a43d4a7331dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 6 Jul 2022 17:09:55 +0200 Subject: [PATCH 02/65] WIP --- Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h | 6 ------ .../graph/convert_nef_polyhedron_to_polygon_mesh.h | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h index 910ba280e2fa..c2c622a181e1 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h @@ -539,12 +539,6 @@ visit_shell_objects(typename Traits::SFace_handle f, Visitor& V) const if ((f->incident_volume() == tf->incident_volume()) && Done[tf]) { continue; // for example when we have to do with the unbounded volume and a surface with boundaries } - Volume_const_iterator unbounded = volumes_begin(); - Volume_const_iterator fit = f->incident_volume(); - Volume_const_iterator tfit = tf->incident_volume(); - if ((fit == unbounded) && (tfit != unbounded)) { - continue; // because we will later report it from the bounded side - } FacetCandidates.push_back(f); Done[f] = true; } } else if (fc.is_svertex() ) { diff --git a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h index f2a880c8872c..bb11c0daacef 100644 --- a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h +++ b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h @@ -359,14 +359,28 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, CGAL_assertion ( vol_it != vol_end ); Converter to_output; + bool handling_unbounded_volume = true; + + auto shell_is_closed = [](typename Nef_polyhedron::SFace_const_handle sfh) + { + typename Nef_polyhedron::Halffacet_handle f = sfh; + return f->incident_volume()!=f->twin()->incident_volume(); + }; + for (;vol_it!=vol_end;++vol_it) + { for(auto sit = vol_it->shells_begin(); sit != vol_it->shells_end(); ++sit) + { + if ( (handling_unbounded_volume || sit!=vol_it->shells_begin()) && shell_is_closed(sit)) continue; nef_to_pm::collect_polygon_mesh_info(points, polygons, nef, sit, to_output, triangulate_all_faces); + } + handling_unbounded_volume = false; + } } template From 69c4af61a9a3aae06c00e79cada527659439f81f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 7 Jul 2022 09:21:10 +0200 Subject: [PATCH 03/65] fix types, still not valid --- .../CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h index bb11c0daacef..98fb89d7192d 100644 --- a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h +++ b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h @@ -361,9 +361,9 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, Converter to_output; bool handling_unbounded_volume = true; - auto shell_is_closed = [](typename Nef_polyhedron::SFace_const_handle sfh) + auto shell_is_closed = [](typename Nef_polyhedron::Shell_entry_const_iterator sfh) { - typename Nef_polyhedron::Halffacet_handle f = sfh; + typename Nef_polyhedron::Halffacet_const_handle f = sfh; return f->incident_volume()!=f->twin()->incident_volume(); }; From 744a9643722d2d8a17685b41b0bf6b29f1ca8e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 7 Jul 2022 09:36:39 +0200 Subject: [PATCH 04/65] fix compilation errors --- .../boost/graph/convert_nef_polyhedron_to_polygon_mesh.h | 8 ++++++-- Nef_3/test/Nef_3/issue_6423.cpp | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h index 98fb89d7192d..c055798f877a 100644 --- a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h +++ b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h @@ -363,8 +363,12 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, auto shell_is_closed = [](typename Nef_polyhedron::Shell_entry_const_iterator sfh) { - typename Nef_polyhedron::Halffacet_const_handle f = sfh; - return f->incident_volume()!=f->twin()->incident_volume(); + typename Nef_polyhedron::Halffacet_const_handle f; + + if (CGAL::assign(f,*sfh)) + return f->incident_volume()!=f->twin()->incident_volume(); + else + return false; }; for (;vol_it!=vol_end;++vol_it) diff --git a/Nef_3/test/Nef_3/issue_6423.cpp b/Nef_3/test/Nef_3/issue_6423.cpp index 0ffad5bf0e1a..5eeb664f23b2 100644 --- a/Nef_3/test/Nef_3/issue_6423.cpp +++ b/Nef_3/test/Nef_3/issue_6423.cpp @@ -11,7 +11,7 @@ typedef CGAL::Surface_mesh SurfaceMesh; typedef CGAL::Nef_polyhedron_3 NefPolyhedron; -int main(int argc, char* argv[]) +int main() { SurfaceMesh surfaceMesh; SurfaceMesh::Vertex_index v0 = surfaceMesh.add_vertex(Point_3(-1, 0, 0)); From 31868332680d0219bbe94500ea460f9bdbe1fef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 7 Jul 2022 10:16:18 +0200 Subject: [PATCH 05/65] WIP working with simple soup example --- .../convert_nef_polyhedron_to_polygon_mesh.h | 80 +++++++++++++++++-- 1 file changed, 75 insertions(+), 5 deletions(-) diff --git a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h index c055798f877a..218e7210866e 100644 --- a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h +++ b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h @@ -363,12 +363,82 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, auto shell_is_closed = [](typename Nef_polyhedron::Shell_entry_const_iterator sfh) { - typename Nef_polyhedron::Halffacet_const_handle f; + typename Nef_polyhedron::SFace_const_handle sf = sfh; - if (CGAL::assign(f,*sfh)) - return f->incident_volume()!=f->twin()->incident_volume(); - else - return false; + typename Nef_polyhedron::SFace_cycle_const_iterator fc; + for(fc = sf->sface_cycles_begin(); fc != sf->sface_cycles_end(); ++fc) + { + if (fc.is_shalfedge() ) { + typename Nef_polyhedron::SHalfedge_const_handle e(fc); + typename Nef_polyhedron::SHalfedge_around_sface_const_circulator ec(e),ee(e); + CGAL_For_all(ec,ee) + { + typename Nef_polyhedron::SVertex_const_handle vv = ec->twin()->source(); + //~ if ( !SD.is_isolated(vv) && !Done[vv] ) { + //~ V.visit(vv); // report edge + //~ Done[vv] = Done[vv->twin()] = true; + //~ } + typename Nef_polyhedron::Halffacet_const_handle f = ec->twin()->facet(); + return f->incident_volume()!=f->twin()->incident_volume(); + //~ if ( Done[f] ) continue; + //~ Halffacet_handle tf = f->twin(); + //~ } + //~ FacetCandidates.push_back(f); Done[f] = true; + } + } + +#if 0 + else if (fc.is_svertex() ) { + SVertex_handle v(fc); + if ( Done[v] ) continue; + V.visit(v); // report edge + V.visit(v->twin()); + Done[v] = Done[v->twin()] = true; + CGAL_assertion(SD.is_isolated(v)); + SFaceCandidates.push_back(v->twin()->incident_sface()); + Done[v->twin()->incident_sface()]=true; + // note that v is isolated, thus twin(v) is isolated too + // SM_const_decorator SD; + // SFace_const_handle fo; + // fo = v->twin()->incident_sface(); + /* + if(SD.is_isolated(v)) + fo = v->source()->sfaces_begin(); + else + fo = v->twin()->incident_sface(); + */ + } else if (fc.is_shalfloop() ) { + SHalfloop_handle l(fc); + V.visit(l); + Halffacet_handle f = l->twin()->facet(); + if ( Done[f] ) continue; + FacetCandidates.push_back(f); Done[f] = true; + } else CGAL_error_msg("Damn wrong handle."); +#endif + } + + return false; + + //~ typename Nef_polyhedron::SHalfedge_const_handle e(sf); + //~ typename Nef_polyhedron::SHalffacet_const_handle f = e->facet(); + //~ e->facet() + //~ SHalfedge_around_sface_circulator ec(e),ee(e); + //~ CGAL_For_all(ec,ee) { + //~ SVertex_handle vv = ec->twin()->source(); + //~ if ( !SD.is_isolated(vv) && !Done[vv] ) { + //~ V.visit(vv); // report edge + //~ Done[vv] = Done[vv->twin()] = true; + //~ } + //~ Halffacet_handle f = ec->twin()->facet(); + //~ if ( Done[f] ) continue; + + //~ if (CGAL::assign(f,*sfh)) + //~ { + //~ std::cout << "COUCOU\n"; + //~ return f->incident_volume()!=f->twin()->incident_volume(); + //~ } + //~ else + //~ return false; }; for (;vol_it!=vol_end;++vol_it) From 37eb0eaa173499227e109cb1cf46cdb08d0dd273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 6 Aug 2024 10:33:14 +0200 Subject: [PATCH 06/65] Tentative fix for L3R3 do_intersect --- .../Intersections_3/internal/Line_3_Ray_3_do_intersect.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Ray_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Ray_3_do_intersect.h index e6e125107f0a..4659dda8c452 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Ray_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Ray_3_do_intersect.h @@ -38,11 +38,8 @@ do_intersect(const typename K::Line_3& l, if(p0p1s == COLLINEAR) return true; - CGAL::Orientation stp0 = pred(r.source(), r.second_point(), l.point(0)); - if(stp0 == COLLINEAR) - return Ray_3_has_on_collinear_Point_3(r,l.point(0),k); - - return (p0p1s != stp0); + typename K::Point_3 lst = l.point(0) + (r.point(1) - r.point(0)); + return (pred(l.point(0), l.point(1), r.point(0), lst) != CGAL::POSITIVE); } template From c1e5926e707bebe5e17da489ba2e9f757ddee57a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 6 Aug 2024 10:26:10 +0200 Subject: [PATCH 07/65] Add new Intersection_3 test cases --- .../Intersections_3/test_intersections_Line_3.cpp | 4 ++++ .../Intersections_3/test_intersections_Ray_3.cpp | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp index 6fe55a406546..936e077e018e 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp @@ -232,6 +232,10 @@ struct Line_3_intersection_tester check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(3,0,1),p(6,0,1))); check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(0,2,0),p(0,4,0))); check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(6,2,0),p(5,4,0))); + check_no_intersection(L(p(0,0,0),p(0,1,0)), R(p(1,-1,0),p(1,0,0))); + check_no_intersection(L(p(0,-10,0),p(0,-9,0)), R(p(1,-1,0),p(2,0,0))); + check_no_intersection(L(p(0,-10,0),p(0,0,0)), R(p(1,-1,0),p(2,0,0))); + check_no_intersection(L(p(0,0,0),p(0,1,0)), R(p(1,-1,0),p(2,0,0))); // Point intersection check_intersection (L(p(0,0,0),p(1,0,0)), R(p(3,0,0),p(6,4,0)), diff --git a/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp index e1d603d4a5e7..777c514bd493 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp @@ -74,6 +74,14 @@ struct Ray_3_intersection_tester check_no_intersection (R(p(0,0,0), p(1,0,0)), R(p(0,1,0), p(0,2,0))); check_no_intersection (R(p(0,0,0), p(1,0,0)), R(p(-1,0,0), p(-1,-1,0))); + check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,0,0))); + check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,-1,0))); + check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,-2,0))); + check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(0,-1,0), p(1,-1,0))); + check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(-1,-3,0),p(2,0,0))); + check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(-2,-4,0),p(-1,-3,0))); + check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(1,-1,0), p(2,0,0))); + // Point check_intersection (R(p(0,0,0), p(1,0,0)), R(p(0,0,0), p(-1,0,0)), p(0,0,0)); @@ -88,6 +96,10 @@ struct Ray_3_intersection_tester check_intersection (R(p(0,0,0), p(1,0,0)), R(p(1,-2,0), p(1,-1,0)), p(1,0,0)); + check_intersection (R(p(0,0,0), p(1,0,0)), R(p(1,-2,0), p(1,-1,0)), + p(1,0,0)); + + // Segment check_intersection (R(p(0,0,0), p(1,0,0)), R(p(2,0,0), p(-3,0,0)), S(p(0,0,0), p(2,0,0)), false); From bf10f945a96208e487c438eb742bb476239d60fa Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 7 Aug 2024 10:00:59 +0200 Subject: [PATCH 08/65] Remove deprecated Qt version checks and unused code --- .../CurveInputMethods.cpp | 13 ---------- GraphicsView/include/CGAL/Qt/qglviewer.h | 9 ------- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 24 ------------------- Lab/demo/Lab/CGAL_Lab.cpp | 5 ---- Lab/demo/Lab/MainWindow.cpp | 9 ------- 5 files changed, 60 deletions(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp index 91a64dad22e9..82e7958b2ab7 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp @@ -109,15 +109,6 @@ void CurveInputMethod::beginInput_() for (auto& item : items) this->getScene()->addItem(item); } -static inline void clearPainterPath(QPainterPath& ppath) -{ -#if (QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)) - ppath.clear(); -#else - ppath = {}; -#endif -} - void CurveInputMethod::reset() { this->resetInput(); @@ -193,7 +184,6 @@ PolylineInputMethod::PolylineInputMethod() : void PolylineInputMethod::beginInput() { - clearPainterPath(this->painterPath); this->polylineGuide.setPath(this->painterPath); this->lastLine.setLine(0, 0, 0, 0); QPen pen = this->polylineGuide.pen(); @@ -356,8 +346,6 @@ BezierInputMethod::BezierInputMethod() : CurveInputMethod(CurveType::Bezier, -1) void BezierInputMethod::beginInput() { - clearPainterPath(this->painterOldPath); - clearPainterPath(this->painterPath); this->bezierGuide.setPath(this->painterPath); this->bezierOldGuide.setPath(this->painterOldPath); @@ -407,7 +395,6 @@ static void updateBezierPainterPath( const std::vector& controlPoints, std::vector& cache, const QTransform& worldTransform, QPainterPath& painterPath) { - clearPainterPath(painterPath); if (controlPoints.size() < 2) return; float pixel_len = approx_pixel_length(controlPoints, worldTransform); diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 8ee3b4135f29..5c0726d5344c 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -478,15 +478,6 @@ public Q_SLOTS: qreal bufferTextureMaxU() const { return bufferTextureMaxU_; } /*! Same as bufferTextureMaxU(), but for the v texture coordinate. */ qreal bufferTextureMaxV() const { return bufferTextureMaxV_; } -#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) - // These methods are part of the QGLWidget public API. - // As of version 2.7.0, the use of QOpenGLWidget instead means that they have - // to be provided for backward compatibility. - void renderText(int x, int y, const QString &str, - const QFont &font = QFont()); - void renderText(double x, double y, double z, const QString &str, - const QFont &font = QFont()); -#endif public Q_SLOTS: void copyBufferToTexture(GLint, GLenum = GL_NONE); diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 7387b1f48745..dc25f1d8675e 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -720,30 +720,6 @@ CGAL_INLINE_FUNCTION void CGAL::QGLViewer::drawLight(GLenum, qreal ) const { } -#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) -CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::renderText(int x, int y, const QString &str, - const QFont &font) { - QColor fontColor = QColor(0, 0, - 0, 255); - - // Render text - QPainter painter(this); - painter.setPen(fontColor); - painter.setFont(font); - painter.drawText(x, y, str); - painter.end(); -} - -CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::renderText(double x, double y, double z, const QString &str, - const QFont &font) { - using CGAL::qglviewer::Vec; - const Vec proj = camera_->projectedCoordinatesOf(Vec(x, y, z)); - renderText(int(proj.x), int(proj.y), str, font); -} -#endif - /*! Draws \p text at position \p x, \p y (expressed in screen coordinates pixels, origin in the upper left corner of the widget). diff --git a/Lab/demo/Lab/CGAL_Lab.cpp b/Lab/demo/Lab/CGAL_Lab.cpp index 6f1504ab668a..d54813edda90 100644 --- a/Lab/demo/Lab/CGAL_Lab.cpp +++ b/Lab/demo/Lab/CGAL_Lab.cpp @@ -27,11 +27,6 @@ int& code_to_call_before_creation_of_QCoreApplication(int& i) { fmt.setOption(QSurfaceFormat::DebugContext); QSurfaceFormat::setDefaultFormat(fmt); - //for windows -#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL); -#endif - return i; } diff --git a/Lab/demo/Lab/MainWindow.cpp b/Lab/demo/Lab/MainWindow.cpp index 2269b4a28398..7eff95e0b3dd 100644 --- a/Lab/demo/Lab/MainWindow.cpp +++ b/Lab/demo/Lab/MainWindow.cpp @@ -663,15 +663,6 @@ void MainWindow::loadPlugins() } } QString env_path = qgetenv("LAB_DEMO_PLUGINS_PATH"); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - QChar separator = QDir::listSeparator(); -#else -#if defined(_WIN32) - QChar separator = ';'; -#else - QChar separator = ':'; -#endif -#endif if(!env_path.isEmpty()) { #if defined(_WIN32) QString path = qgetenv("PATH"); From f8de6e72b8a887aa4a429ab5d67441d90f60c8d1 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 8 Aug 2024 15:26:59 +0200 Subject: [PATCH 09/65] take min_size into account inside Mesh_edge_criteria_3 --- Mesh_3/include/CGAL/Mesh_edge_criteria_3.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h index 8d6215cd512f..f743eb3f0fa3 100644 --- a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h @@ -177,7 +177,13 @@ class Mesh_edge_criteria_3 /// Returns size of tuple (p,dim,index) FT sizing_field(const Point_3& p, const int dim, const Index& index) const - { return (*p_size_)(p,dim,index); } + { + const FT s = (*p_size_)(p, dim, index); + if (min_length_bound_ == FT(0)) + return s; + else + return (std::max)(s, min_length_bound_); + } FT distance_field(const Point_3& p, const int dim, const Index& index) const { From 0bc365889363ae47988a1b89113909b2fe34c34f Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 8 Aug 2024 15:28:09 +0200 Subject: [PATCH 10/65] use the 5 parameters version to avoid re-calling locate(p) and locate(q) --- Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 61eb0682d831..ddb1ba1109f6 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -252,8 +252,8 @@ class Polyline : (- negative_distance); } else { return (pit <= qit) - ? curve_segment_length(p, q, CGAL::POSITIVE) - : ( - curve_segment_length(p, q, CGAL::NEGATIVE) ); + ? curve_segment_length(p, q, CGAL::POSITIVE, pit, qit) + : ( - curve_segment_length(p, q, CGAL::NEGATIVE, pit, qit) ); } } From 4d38aa566ecba7e5bb164e7c1af7b61a10649994 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 8 Aug 2024 17:30:22 +0200 Subject: [PATCH 11/65] improve Mesh_3 log in demo --- Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h b/Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h index 68c8300f9eea..ec38a369ea01 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h +++ b/Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h @@ -171,8 +171,10 @@ log() const .arg(detect_connected_components); res << QString("use weights: %1").arg(weights_ptr != nullptr); } - res << QString("use aabb tree: %1").arg(use_sizing_field_with_aabb_tree); - res << QString("manifold: %1").arg(manifold); + if(use_sizing_field_with_aabb_tree) + res << QString("use sizing field with aabb tree: %1").arg(use_sizing_field_with_aabb_tree); + if(manifold) + res << QString("manifold: %1").arg(manifold); return res; } From fa97ae8612db76041bf88bf05e1fca7fccf0b757 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 8 Aug 2024 17:31:14 +0200 Subject: [PATCH 12/65] add missing not-nullptr check --- Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp b/Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp index d84bd9fc6f6a..2aadc7619572 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -750,7 +750,9 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, } } - if(mesh_type != Mesh_type::SURFACE_ONLY && !material_ids_valid) + if(mesh_type != Mesh_type::SURFACE_ONLY + && !material_ids_valid + && bounding_sm_item != nullptr) { sm_items.removeAll(make_not_null(bounding_sm_item)); } From fd498e398aafd12a6661ac796b7b3ae4ae5d153d Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Fri, 9 Aug 2024 15:45:24 +0200 Subject: [PATCH 13/65] fix approx_is_too_large(edge) that needs the corresponding curve_index to be valid use minimal_size instead of 0 fix 5e64bced8e37ce076f26317e9ea7638a14c9696c fix approx_is_too_large(edge) that needs the corresponding curve_index to be valid and fix the default edge_min_size --- .../CGAL/Mesh_3/Protect_edges_sizing_field.h | 71 +++++++++---------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index 4a0e3f131dee..366f1b3a91e8 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -152,7 +152,7 @@ class Protect_edges_sizing_field Protect_edges_sizing_field(C3T3& c3t3, const MeshDomain& domain, SizingFunction size=SizingFunction(), - const FT minimal_size = FT(-1), + const FT minimal_size = FT(0), const Distance_Function edge_distance = Distance_Function(), const std::size_t maximal_number_of_vertices = 0, Mesh_error_code* error_code = 0 @@ -273,8 +273,7 @@ class Protect_edges_sizing_field /// Returns `true` if the edge `(va,vb)` is a not good enough approximation /// of its feature. - bool approx_is_too_large(const Vertex_handle& va, - const Vertex_handle& vb, + bool approx_is_too_large(const Edge& e, const bool is_edge_in_complex) const; /// Returns `true` if the balls of `va` and `vb` intersect. @@ -458,10 +457,12 @@ class Protect_edges_sizing_field dim = -1 - dim; const FT s = field(p, dim, index); - if(s <= FT(0)) { + if(s < minimal_size_) + { std::stringstream msg; msg.precision(17); - msg << "Error: the field is null at "; + msg << "Error: the field is smaller than minimal size (" + << minimal_size_ << ") at "; if(dim == 0) msg << "corner ("; else msg << "point ("; msg << p << ")"; @@ -493,7 +494,7 @@ class Protect_edges_sizing_field bool use_minimal_size() const { - return minimal_size_ != FT(-1); + return minimal_size_ != FT(0); } Weight minimal_weight() const { @@ -645,7 +646,10 @@ insert_corners() #endif // Get weight (the ball radius is given by the 'query_size' function) - FT w = CGAL::square(query_size(p, 0, p_index)); + const FT query_weight = CGAL::square(query_size(p, 0, p_index)); + FT w = use_minimal_size() + ? (std::min)(minimal_weight_, query_weight) + : query_weight; #if CGAL_MESH_3_PROTECTION_DEBUG & 1 std::cerr << "Weight from sizing field: " << w << std::endl; @@ -1178,12 +1182,12 @@ insert_balls(const Vertex_handle& vp, const Weighted_point& vp_wp = c3t3_.triangulation().point(vp); #if ! defined(CGAL_NO_PRECONDITIONS) - if(sp <= 0) { - std::stringstream msg;; + if(sp <= minimal_size_) { + std::stringstream msg; msg.precision(17); - msg << "Error: the mesh sizing field is null at point ("; - msg << cp(vp_wp) << ")!"; - CGAL_precondition_msg(sp > 0, msg.str().c_str()); + msg << "Error: the mesh sizing field is smaller than minimal size "; + msg << " at point (" << cp(vp_wp) << ")!"; + CGAL_precondition_msg(sp > minimal_size_, msg.str().c_str()); } #endif // ! CGAL_NO_PRECONDITIONS @@ -1428,7 +1432,7 @@ refine_balls() if( // topology condition non_adjacent_but_intersect(va, vb, is_edge_in_complex) // approximation condition - || (use_distance_field() && approx_is_too_large(va, vb, is_edge_in_complex))) + || (use_distance_field() && approx_is_too_large(*eit, is_edge_in_complex))) { using CGAL::Mesh_3::internal::distance_divisor; @@ -1557,34 +1561,29 @@ do_balls_intersect(const Vertex_handle& va, const Vertex_handle& vb) const template bool Protect_edges_sizing_field:: -approx_is_too_large(const Vertex_handle& va, const Vertex_handle& vb, const bool is_edge_in_complex) const +approx_is_too_large(const Edge& e, const bool is_edge_in_complex) const { if ( ! is_edge_in_complex ) - { return false; - } - typedef typename Kernel::Point_3 Point_3; - Curve_index curve_index = domain_.curve_index((va->in_dimension() < vb->in_dimension()) ? vb->index() : va->index()); + const auto& [va, vb] = c3t3_.triangulation().vertices(e); - const Point_3& pa = va->point().point(); - const Point_3& pb = vb->point().point(); - const Point_3& segment_middle = CGAL::midpoint(pa, pb); - // Obtain the geodesic middle point - FT signed_geodesic_distance = domain_.signed_geodesic_distance(pa, pb, curve_index); - Point_3 geodesic_middle; - if (signed_geodesic_distance >= FT(0)) - { - geodesic_middle = domain_.construct_point_on_curve(pa, curve_index, signed_geodesic_distance / 2); - } - else - { - geodesic_middle = domain_.construct_point_on_curve(pb, curve_index, -signed_geodesic_distance / 2); - } - // Compare distance to the parameter's distance - FT squared_evaluated_distance = CGAL::squared_distance(segment_middle, geodesic_middle); - FT segment_middle_edge_distance = query_distance(segment_middle, 1, curve_index); - return squared_evaluated_distance > CGAL::square(segment_middle_edge_distance); + const Bare_point& pa = va->point().point(); + const Bare_point& pb = vb->point().point(); + + // Construct the geodesic middle point + const Curve_index curve_index = c3t3_.curve_index(e); + const FT signed_geodesic_distance = domain_.signed_geodesic_distance(pa, pb, curve_index); + const Bare_point geodesic_middle = (signed_geodesic_distance >= FT(0)) + ? domain_.construct_point_on_curve(pa, curve_index, signed_geodesic_distance / 2) + : domain_.construct_point_on_curve(pb, curve_index, -signed_geodesic_distance / 2); + + const Bare_point edge_middle = CGAL::midpoint(pa, pb); + const FT squared_evaluated_distance = CGAL::squared_distance(edge_middle, geodesic_middle); + + // Compare distance to the distance field from criteria + const FT max_distance_to_curve = query_distance(edge_middle, 1, curve_index); + return squared_evaluated_distance > CGAL::square(max_distance_to_curve); } template From 403ec19f8a07f5e3a1a0e5f0477bbada3429574b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Aug 2024 18:18:26 +0200 Subject: [PATCH 14/65] clean up and move skip test to export header --- .../include/CGAL/Nef_3/SNC_const_decorator.h | 4 - .../convert_nef_polyhedron_to_polygon_mesh.h | 81 ++++--------------- Nef_3/test/Nef_3/issue_6423.cpp | 1 + 3 files changed, 18 insertions(+), 68 deletions(-) diff --git a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h index c2c622a181e1..a8b0123f3df2 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h @@ -535,10 +535,6 @@ visit_shell_objects(typename Traits::SFace_handle f, Visitor& V) const } Halffacet_handle f = ec->twin()->facet(); if ( Done[f] ) continue; - Halffacet_handle tf = f->twin(); - if ((f->incident_volume() == tf->incident_volume()) && Done[tf]) { - continue; // for example when we have to do with the unbounded volume and a surface with boundaries - } FacetCandidates.push_back(f); Done[f] = true; } } else if (fc.is_svertex() ) { diff --git a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h index 218e7210866e..8b03c7555074 100644 --- a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h +++ b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -81,6 +82,7 @@ struct Shell_polygons_visitor Vertex_index_map& vertex_indices; PolygonRange& polygons; bool triangulate_all_faces; + CGAL::Generic_handle_map Done; Shell_polygons_visitor(Vertex_index_map& vertex_indices, PolygonRange& polygons, @@ -88,6 +90,7 @@ struct Shell_polygons_visitor : vertex_indices( vertex_indices ) , polygons(polygons) , triangulate_all_faces(triangulate_all_faces) + , Done(false) {} std::size_t get_cycle_length( typename Nef_polyhedron::Halffacet_cycle_const_iterator hfc) const @@ -103,6 +106,14 @@ struct Shell_polygons_visitor void visit(typename Nef_polyhedron::Halffacet_const_handle opposite_facet) { + typename Nef_polyhedron::Halffacet_const_handle twin_facet = opposite_facet->twin(); + + // skip when we have to do with the unbounded volume and a surface with boundaries + if ((twin_facet->incident_volume() == opposite_facet->incident_volume()) && Done[twin_facet]) + return; + + Done[opposite_facet] = true; + bool is_marked=opposite_facet->incident_volume()->mark(); CGAL_assertion(Nef_polyhedron::Infi_box::is_standard(opposite_facet->plane())); @@ -352,11 +363,9 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, typename Nef_polyhedron::Volume_const_iterator vol_it = nef.volumes_begin(), vol_end = nef.volumes_end(); - if (Nef_polyhedron::Infi_box::extended_kernel()) { - ++vol_it; // skip Infi_box - } + if (Nef_polyhedron::Infi_box::extended_kernel()) ++vol_it; // skip Infi_box - CGAL_assertion ( vol_it != vol_end ); + if ( vol_it == vol_end ) return; Converter to_output; bool handling_unbounded_volume = true; @@ -374,71 +383,15 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, CGAL_For_all(ec,ee) { typename Nef_polyhedron::SVertex_const_handle vv = ec->twin()->source(); - //~ if ( !SD.is_isolated(vv) && !Done[vv] ) { - //~ V.visit(vv); // report edge - //~ Done[vv] = Done[vv->twin()] = true; - //~ } + typename Nef_polyhedron::Halffacet_const_handle f = ec->twin()->facet(); - return f->incident_volume()!=f->twin()->incident_volume(); - //~ if ( Done[f] ) continue; - //~ Halffacet_handle tf = f->twin(); - //~ } - //~ FacetCandidates.push_back(f); Done[f] = true; + if (f->incident_volume()==f->twin()->incident_volume()) + return false; } } - -#if 0 - else if (fc.is_svertex() ) { - SVertex_handle v(fc); - if ( Done[v] ) continue; - V.visit(v); // report edge - V.visit(v->twin()); - Done[v] = Done[v->twin()] = true; - CGAL_assertion(SD.is_isolated(v)); - SFaceCandidates.push_back(v->twin()->incident_sface()); - Done[v->twin()->incident_sface()]=true; - // note that v is isolated, thus twin(v) is isolated too - // SM_const_decorator SD; - // SFace_const_handle fo; - // fo = v->twin()->incident_sface(); - /* - if(SD.is_isolated(v)) - fo = v->source()->sfaces_begin(); - else - fo = v->twin()->incident_sface(); - */ - } else if (fc.is_shalfloop() ) { - SHalfloop_handle l(fc); - V.visit(l); - Halffacet_handle f = l->twin()->facet(); - if ( Done[f] ) continue; - FacetCandidates.push_back(f); Done[f] = true; - } else CGAL_error_msg("Damn wrong handle."); -#endif } - return false; - - //~ typename Nef_polyhedron::SHalfedge_const_handle e(sf); - //~ typename Nef_polyhedron::SHalffacet_const_handle f = e->facet(); - //~ e->facet() - //~ SHalfedge_around_sface_circulator ec(e),ee(e); - //~ CGAL_For_all(ec,ee) { - //~ SVertex_handle vv = ec->twin()->source(); - //~ if ( !SD.is_isolated(vv) && !Done[vv] ) { - //~ V.visit(vv); // report edge - //~ Done[vv] = Done[vv->twin()] = true; - //~ } - //~ Halffacet_handle f = ec->twin()->facet(); - //~ if ( Done[f] ) continue; - - //~ if (CGAL::assign(f,*sfh)) - //~ { - //~ std::cout << "COUCOU\n"; - //~ return f->incident_volume()!=f->twin()->incident_volume(); - //~ } - //~ else - //~ return false; + return true; }; for (;vol_it!=vol_end;++vol_it) diff --git a/Nef_3/test/Nef_3/issue_6423.cpp b/Nef_3/test/Nef_3/issue_6423.cpp index 5eeb664f23b2..87e7f7dff618 100644 --- a/Nef_3/test/Nef_3/issue_6423.cpp +++ b/Nef_3/test/Nef_3/issue_6423.cpp @@ -40,5 +40,6 @@ int main() CGAL::convert_nef_polyhedron_to_polygon_mesh(nefPoly, convertedSurfaceMesh, true); std::cout << "After conversion, number_of_faces: " << convertedSurfaceMesh.number_of_faces() << std::endl; std::cout << convertedSurfaceMesh << std::endl; + std::ofstream("out.off") << convertedSurfaceMesh; return EXIT_SUCCESS; } From 30fc15064bc66a8f6bcf4222878139b201272d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Aug 2024 18:22:04 +0200 Subject: [PATCH 15/65] add assertions --- Nef_3/test/Nef_3/issue_6423.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nef_3/test/Nef_3/issue_6423.cpp b/Nef_3/test/Nef_3/issue_6423.cpp index 87e7f7dff618..441dd0b7939d 100644 --- a/Nef_3/test/Nef_3/issue_6423.cpp +++ b/Nef_3/test/Nef_3/issue_6423.cpp @@ -35,11 +35,11 @@ int main() NefPolyhedron nefPoly(surfaceMesh); std::cout << "NefPolyhedron, number_of_faces: " << nefPoly.number_of_facets() << std::endl; - std::cout << nefPoly << std::endl; SurfaceMesh convertedSurfaceMesh; CGAL::convert_nef_polyhedron_to_polygon_mesh(nefPoly, convertedSurfaceMesh, true); std::cout << "After conversion, number_of_faces: " << convertedSurfaceMesh.number_of_faces() << std::endl; - std::cout << convertedSurfaceMesh << std::endl; std::ofstream("out.off") << convertedSurfaceMesh; + assert(vertices(convertedSurfaceMesh).size()==10); + assert(faces(convertedSurfaceMesh).size()==6); return EXIT_SUCCESS; } From d20cef2f911a2e9773e6394708a14e5d3544222d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 19 Aug 2024 09:02:24 +0200 Subject: [PATCH 16/65] remove unused variable --- .../CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h index 8b03c7555074..3ecd0e1b8053 100644 --- a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h +++ b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h @@ -382,8 +382,6 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, typename Nef_polyhedron::SHalfedge_around_sface_const_circulator ec(e),ee(e); CGAL_For_all(ec,ee) { - typename Nef_polyhedron::SVertex_const_handle vv = ec->twin()->source(); - typename Nef_polyhedron::Halffacet_const_handle f = ec->twin()->facet(); if (f->incident_volume()==f->twin()->incident_volume()) return false; From 926dab060e12fe23da736c6c1ee822c7d68bd74c Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 19 Aug 2024 09:43:55 +0200 Subject: [PATCH 17/65] Reintroduce QPainterPath reset logic --- .../Arrangement_on_surface_2/CurveInputMethods.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp index 82e7958b2ab7..87908978b60a 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp @@ -109,6 +109,12 @@ void CurveInputMethod::beginInput_() for (auto& item : items) this->getScene()->addItem(item); } +static inline void clearPainterPath(QPainterPath& ppath) +{ + ppath = {}; +} + + void CurveInputMethod::reset() { this->resetInput(); @@ -184,6 +190,7 @@ PolylineInputMethod::PolylineInputMethod() : void PolylineInputMethod::beginInput() { + clearPainterPath(this->painterPath); this->polylineGuide.setPath(this->painterPath); this->lastLine.setLine(0, 0, 0, 0); QPen pen = this->polylineGuide.pen(); @@ -346,6 +353,8 @@ BezierInputMethod::BezierInputMethod() : CurveInputMethod(CurveType::Bezier, -1) void BezierInputMethod::beginInput() { + clearPainterPath(this->painterOldPath); + clearPainterPath(this->painterPath); this->bezierGuide.setPath(this->painterPath); this->bezierOldGuide.setPath(this->painterOldPath); @@ -395,6 +404,7 @@ static void updateBezierPainterPath( const std::vector& controlPoints, std::vector& cache, const QTransform& worldTransform, QPainterPath& painterPath) { + clearPainterPath(painterPath); if (controlPoints.size() < 2) return; float pixel_len = approx_pixel_length(controlPoints, worldTransform); From 1286d8b6366201a5df3f5c1bbc3a6310a0d4e1f8 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 19 Aug 2024 12:02:19 +0200 Subject: [PATCH 18/65] Remove deprecated Qt version checks --- .../GridGraphicsItem.cpp | 4 ---- GraphicsView/include/CGAL/Qt/qglviewer.h | 7 ++++++ GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 22 +++++++++++++++++++ Lab/demo/Lab/CGAL_Lab.cpp | 3 +++ Lab/demo/Lab/MainWindow.cpp | 6 +++++ 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GridGraphicsItem.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GridGraphicsItem.cpp index 535f46849759..01723db026eb 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GridGraphicsItem.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GridGraphicsItem.cpp @@ -67,11 +67,7 @@ void GridGraphicsItem::setSpacing(int spacing_) static inline qreal horizontalAdvance(const QFontMetrics& fm, const QString& text) { -#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) return fm.horizontalAdvance(text); -#else - return fm.boundingRect(text).width(); -#endif } void GridGraphicsItem::paint( diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 5c0726d5344c..e24a5fcd6d7f 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -478,6 +478,13 @@ public Q_SLOTS: qreal bufferTextureMaxU() const { return bufferTextureMaxU_; } /*! Same as bufferTextureMaxU(), but for the v texture coordinate. */ qreal bufferTextureMaxV() const { return bufferTextureMaxV_; } + // These methods are part of the QGLWidget public API. + // As of version 2.7.0, the use of QOpenGLWidget instead means that they have + // to be provided for backward compatibility. + void renderText(int x, int y, const QString &str, + const QFont &font = QFont()); + void renderText(double x, double y, double z, const QString &str, + const QFont &font = QFont()); public Q_SLOTS: void copyBufferToTexture(GLint, GLenum = GL_NONE); diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index dc25f1d8675e..508444710add 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -720,6 +720,28 @@ CGAL_INLINE_FUNCTION void CGAL::QGLViewer::drawLight(GLenum, qreal ) const { } +CGAL_INLINE_FUNCTION +void CGAL::QGLViewer::renderText(int x, int y, const QString &str, + const QFont &font) { + QColor fontColor = QColor(0, 0, + 0, 255); + + // Render text + QPainter painter(this); + painter.setPen(fontColor); + painter.setFont(font); + painter.drawText(x, y, str); + painter.end(); +} + +CGAL_INLINE_FUNCTION +void CGAL::QGLViewer::renderText(double x, double y, double z, const QString &str, + const QFont &font) { + using CGAL::qglviewer::Vec; + const Vec proj = camera_->projectedCoordinatesOf(Vec(x, y, z)); + renderText(int(proj.x), int(proj.y), str, font); +} + /*! Draws \p text at position \p x, \p y (expressed in screen coordinates pixels, origin in the upper left corner of the widget). diff --git a/Lab/demo/Lab/CGAL_Lab.cpp b/Lab/demo/Lab/CGAL_Lab.cpp index d54813edda90..85880fb8addd 100644 --- a/Lab/demo/Lab/CGAL_Lab.cpp +++ b/Lab/demo/Lab/CGAL_Lab.cpp @@ -27,6 +27,9 @@ int& code_to_call_before_creation_of_QCoreApplication(int& i) { fmt.setOption(QSurfaceFormat::DebugContext); QSurfaceFormat::setDefaultFormat(fmt); + // for windows + QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL); + return i; } diff --git a/Lab/demo/Lab/MainWindow.cpp b/Lab/demo/Lab/MainWindow.cpp index 7eff95e0b3dd..806f8b912cb0 100644 --- a/Lab/demo/Lab/MainWindow.cpp +++ b/Lab/demo/Lab/MainWindow.cpp @@ -663,6 +663,12 @@ void MainWindow::loadPlugins() } } QString env_path = qgetenv("LAB_DEMO_PLUGINS_PATH"); + QChar separator = QDir::listSeparator(); + #if defined(_WIN32) + QChar separator = ';'; + #else + QChar separator = ':'; + #endif if(!env_path.isEmpty()) { #if defined(_WIN32) QString path = qgetenv("PATH"); From 14a9db6d00af5aae18c2266d7f4af571e42ba7b8 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 19 Aug 2024 12:23:32 +0200 Subject: [PATCH 19/65] weight_modifier was likely to make the weight too small let's keep the minimal weight as given in meshing criteria --- Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index 366f1b3a91e8..7f9fface33e5 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -720,7 +720,10 @@ insert_point(const Bare_point& p, const Weight& w, int dim, const Index& index, typename GT::Construct_weighted_point_3 cwp = c3t3_.triangulation().geom_traits().construct_weighted_point_3_object(); - const Weighted_point wp = cwp(p,w*weight_modifier); + const FT wwm = use_minimal_size() + ? (std::max)(w * weight_modifier, minimal_weight()) + : w * weight_modifier; + const Weighted_point wp = cwp(p, wwm); typename Tr::Locate_type lt; int li, lj; @@ -1182,7 +1185,7 @@ insert_balls(const Vertex_handle& vp, const Weighted_point& vp_wp = c3t3_.triangulation().point(vp); #if ! defined(CGAL_NO_PRECONDITIONS) - if(sp <= minimal_size_) { + if(sp < minimal_size_) { std::stringstream msg; msg.precision(17); msg << "Error: the mesh sizing field is smaller than minimal size "; From 481de41e2f980dbf75cb2175e2133cc17647292f Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 19 Aug 2024 12:24:32 +0200 Subject: [PATCH 20/65] use c++11 for loops --- .../CGAL/Mesh_3/Protect_edges_sizing_field.h | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index 7f9fface33e5..a1cd7aca8bc5 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -867,13 +867,11 @@ smart_insert_point(const Bare_point& p, Weight w, int dim, const Index& index, std::back_inserter(cells_in_conflicts), CGAL::Emptyset_iterator()); - for(typename std::vector::const_iterator - it = cells_in_conflicts.begin(), - end = cells_in_conflicts.end(); it != end; ++it) + for(Cell_handle cit : cells_in_conflicts) { for(int i=0, d=tr.dimension(); i<=d; ++i) { - const Vertex_handle v = (*it)->vertex(i); + const Vertex_handle v = cit->vertex(i); if(c3t3_.triangulation().is_infinite(v)) continue; if(!vertices_in_conflict_zone_set.insert(v).second) @@ -1030,21 +1028,20 @@ insert_balls_on_edges() domain_.get_curves(std::back_inserter(input_features)); // Iterate on edges - for ( typename Input_features::iterator fit = input_features.begin(), - end = input_features.end() ; fit != end ; ++fit ) + for (const Feature_tuple& ft : input_features) { if(forced_stop()) break; - const Curve_index& curve_index = std::get<0>(*fit); + const Curve_index& curve_index = std::get<0>(ft); if ( ! is_treated(curve_index) ) { #if CGAL_MESH_3_PROTECTION_DEBUG & 1 std::cerr << "\n** treat curve #" << curve_index << std::endl; #endif - const Bare_point& p = std::get<1>(*fit).first; - const Bare_point& q = std::get<2>(*fit).first; + const Bare_point& p = std::get<1>(ft).first; + const Bare_point& q = std::get<2>(ft).first; - const Index& p_index = std::get<1>(*fit).second; - const Index& q_index = std::get<2>(*fit).second; + const Index& p_index = std::get<1>(ft).second; + const Index& q_index = std::get<2>(ft).second; Vertex_handle vp,vq; if ( ! domain_.is_loop(curve_index) ) @@ -1487,14 +1484,11 @@ refine_balls() new_sizes.clear(); // Update size of balls - for ( typename std::vector >::iterator - it = new_sizes_copy.begin(), - end = new_sizes_copy.end(); - it != end ; ++it ) + for (const std::pair& it : new_sizes_copy) { if(forced_stop()) break; - const Vertex_handle v = it->first; - const FT new_size = it->second; + const Vertex_handle v = it.first; + const FT new_size = it.second; // Set size of the ball to new value if(use_minimal_size() && new_size < minimal_size_) { if(!is_special(v)) { From 4a35823f1f8bd9a7231e31a55fa5ea40951781e5 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 19 Aug 2024 12:24:59 +0200 Subject: [PATCH 21/65] ease dump code reading --- Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index a1cd7aca8bc5..918d48f83245 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -741,7 +741,7 @@ insert_point(const Bare_point& p, const Weight& w, int dim, const Index& index, std::cerr << "SPECIAL "; std::cerr << "protecting ball "; if(v == Vertex_handle()) - std::cerr << cwp(p,w*weight_modifier); + std::cerr << cwp(p, wwm); else std::cerr << disp_vert(v); From ac9a7013420ba0eadaae15549d48e1d62eebd732 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Mon, 19 Aug 2024 12:53:37 +0200 Subject: [PATCH 22/65] remove leftover --- Lab/demo/Lab/MainWindow.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Lab/demo/Lab/MainWindow.cpp b/Lab/demo/Lab/MainWindow.cpp index 806f8b912cb0..909a130e46d5 100644 --- a/Lab/demo/Lab/MainWindow.cpp +++ b/Lab/demo/Lab/MainWindow.cpp @@ -664,11 +664,6 @@ void MainWindow::loadPlugins() } QString env_path = qgetenv("LAB_DEMO_PLUGINS_PATH"); QChar separator = QDir::listSeparator(); - #if defined(_WIN32) - QChar separator = ';'; - #else - QChar separator = ':'; - #endif if(!env_path.isEmpty()) { #if defined(_WIN32) QString path = qgetenv("PATH"); From 2bc86f90ca6726a0ad89b3711c4d74ee8475ad36 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Mon, 19 Aug 2024 12:54:46 +0200 Subject: [PATCH 23/65] keep correct variant --- .../demo/Arrangement_on_surface_2/CurveInputMethods.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp index 87908978b60a..06ebae10a207 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp @@ -111,7 +111,7 @@ void CurveInputMethod::beginInput_() static inline void clearPainterPath(QPainterPath& ppath) { - ppath = {}; + ppath.clear(); } From a1a7b652752bf79e92b6f0167a2ea86e139f542d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 19 Aug 2024 13:01:09 +0200 Subject: [PATCH 24/65] remove remaining QT_VERSION_CHECK --- Lab/demo/Lab/MainWindow.cpp | 7 ------- Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp | 12 ------------ Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp | 4 ---- .../Plugins/Surface_mesh/Parameterization_plugin.cpp | 4 ---- Lab/demo/Lab/Viewer.cpp | 8 +------- Three/include/CGAL/Three/TextRenderer.h | 5 ----- Three/include/CGAL/Three/Three.h | 4 ---- 7 files changed, 1 insertion(+), 43 deletions(-) diff --git a/Lab/demo/Lab/MainWindow.cpp b/Lab/demo/Lab/MainWindow.cpp index 909a130e46d5..dd133dbf44f9 100644 --- a/Lab/demo/Lab/MainWindow.cpp +++ b/Lab/demo/Lab/MainWindow.cpp @@ -2644,17 +2644,10 @@ void MainWindow::resetHeader() sceneView->header()->setSectionResizeMode(Scene::RenderingModeColumn, QHeaderView::ResizeToContents); sceneView->header()->setSectionResizeMode(Scene::ABColumn, QHeaderView::Fixed); sceneView->header()->setSectionResizeMode(Scene::VisibleColumn, QHeaderView::Fixed); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) sceneView->header()->resizeSection(Scene::ColorColumn, sceneView->header()->fontMetrics().horizontalAdvance("_#_")); sceneView->resizeColumnToContents(Scene::RenderingModeColumn); sceneView->header()->resizeSection(Scene::ABColumn, sceneView->header()->fontMetrics().horizontalAdvance(QString("_AB_"))); sceneView->header()->resizeSection(Scene::VisibleColumn, sceneView->header()->fontMetrics().horizontalAdvance(QString("_View_"))); -#else - sceneView->header()->resizeSection(Scene::ColorColumn, sceneView->header()->fontMetrics().width("_#_")); - sceneView->resizeColumnToContents(Scene::RenderingModeColumn); - sceneView->header()->resizeSection(Scene::ABColumn, sceneView->header()->fontMetrics().width(QString("_AB_"))); - sceneView->header()->resizeSection(Scene::VisibleColumn, sceneView->header()->fontMetrics().width(QString("_View_"))); -#endif } void MainWindow::reset_default_loaders() diff --git a/Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp b/Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp index 4720d8aa35bd..780511846aa8 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp @@ -705,11 +705,7 @@ public Q_SLOTS: // Find the right width for the label to accommodate at least 9999 QFontMetrics metric = x_cubeLabel->fontMetrics(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) x_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999."))); -#else - x_cubeLabel->setFixedWidth(metric.width(QString(".9999."))); -#endif x_cubeLabel->setText("0"); x_cubeLabel->setValidator(validator); @@ -735,11 +731,7 @@ public Q_SLOTS: // Find the right width for the label to accommodate at least 9999 QFontMetrics metric = y_cubeLabel->fontMetrics(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) y_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999."))); -#else - y_cubeLabel->setFixedWidth(metric.width(QString(".9999."))); -#endif y_cubeLabel->setText("0"); y_cubeLabel->setValidator(validator); y_slider = new QSlider(mw); @@ -764,11 +756,7 @@ public Q_SLOTS: // Find the right width for the label to accommodate at least 9999 QFontMetrics metric = z_cubeLabel->fontMetrics(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) z_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999."))); -#else - z_cubeLabel->setFixedWidth(metric.width(QString(".9999."))); -#endif z_cubeLabel->setText("0"); z_cubeLabel->setValidator(validator); z_slider = new QSlider(mw); diff --git a/Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp b/Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp index 27a3ba46f0df..1adc2ae81ea1 100644 --- a/Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp +++ b/Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp @@ -250,11 +250,7 @@ class Navigation : public CGAL::Qt::GraphicsViewNavigation } case QEvent::Wheel: { QWheelEvent* event = static_cast(ev); -#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) - QPoint pos = event->pos(); -#else QPointF pos = event->position(); -#endif QPointF old_pos = v->mapToScene(pos.x(), pos.y()); if(event->angleDelta().y() <0) v->scale(1.2, 1.2); diff --git a/Lab/demo/Lab/Plugins/Surface_mesh/Parameterization_plugin.cpp b/Lab/demo/Lab/Plugins/Surface_mesh/Parameterization_plugin.cpp index d9ec9149133a..38d593c2b402 100644 --- a/Lab/demo/Lab/Plugins/Surface_mesh/Parameterization_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Surface_mesh/Parameterization_plugin.cpp @@ -142,11 +142,7 @@ class Navigation : public CGAL::Qt::GraphicsViewNavigation } case QEvent::Wheel: { QWheelEvent* event = static_cast(ev); -#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) - QPoint pos = event->pos(); -#else QPointF pos = event->position(); -#endif QPointF old_pos = v->mapToScene(pos.x(), pos.y()); if(event->angleDelta().y() <0) v->scale(1.2, 1.2); diff --git a/Lab/demo/Lab/Viewer.cpp b/Lab/demo/Lab/Viewer.cpp index 70c2b60e8385..b93cb2cb7b1c 100644 --- a/Lab/demo/Lab/Viewer.cpp +++ b/Lab/demo/Lab/Viewer.cpp @@ -1152,13 +1152,7 @@ void Viewer::drawVisualHints() //Prints the displayMessage QFont font = QFont(); QFontMetrics fm(font); - TextItem *message_text = new TextItem(float(10 + - #if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) - fm.horizontalAdvance(d->message)/2) - #else - fm.width(d->message)/2) - #endif - , + TextItem *message_text = new TextItem(float(10 + fm.horizontalAdvance(d->message)/2), float(height()-20), 0, d->message, false, QFont(), Qt::gray ); diff --git a/Three/include/CGAL/Three/TextRenderer.h b/Three/include/CGAL/Three/TextRenderer.h index c5c729ec0329..f04535841f7c 100644 --- a/Three/include/CGAL/Three/TextRenderer.h +++ b/Three/include/CGAL/Three/TextRenderer.h @@ -52,12 +52,7 @@ public : :x(p_x), y(p_y), z(p_z),_3D(p_3D), _is_always_visible(always_visible), m_text(p_text), m_font(font), m_color(p_color) { QFontMetrics fm(m_font); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) _width = float(fm.horizontalAdvance(m_text)+2); -#else - _width = float(fm.width(m_text)+2); -#endif - _height = float(fm.height()); } //!\brief Accessor for the string diff --git a/Three/include/CGAL/Three/Three.h b/Three/include/CGAL/Three/Three.h index 3dac95792a3e..e3e6366d5b6a 100644 --- a/Three/include/CGAL/Three/Three.h +++ b/Three/include/CGAL/Three/Three.h @@ -31,11 +31,7 @@ # define THREE_EXPORT Q_DECL_IMPORT #endif -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) -#define CGAL_QT_SKIP_EMPTY_PARTS QString::SkipEmptyParts -#else #define CGAL_QT_SKIP_EMPTY_PARTS ::Qt::SkipEmptyParts -#endif namespace CGAL{ namespace Three{ From ca2907fbfc0cbfcdf093d73774826a0e858a15ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Aug 2024 10:09:23 +0200 Subject: [PATCH 25/65] avoid creating degenerate planes --- .../test/Intersections_3/test_intersections_Ray_3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp index e1d603d4a5e7..6a3dd24bcea0 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp @@ -161,6 +161,8 @@ struct Ray_3_intersection_tester for(int i=0; i Date: Tue, 20 Aug 2024 10:58:38 +0200 Subject: [PATCH 26/65] vertices(edge) is not available in P3T3 --- Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index 918d48f83245..e84e7dd933fe 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -1563,10 +1563,8 @@ approx_is_too_large(const Edge& e, const bool is_edge_in_complex) const if ( ! is_edge_in_complex ) return false; - const auto& [va, vb] = c3t3_.triangulation().vertices(e); - - const Bare_point& pa = va->point().point(); - const Bare_point& pb = vb->point().point(); + const Bare_point& pa = e.first->vertex(e.second)->point().point(); + const Bare_point& pb = e.first->vertex(e.third)->point().point(); // Construct the geodesic middle point const Curve_index curve_index = c3t3_.curve_index(e); From d5e411648547e7f5ec6d005737d29b6ad2e6425e Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 20 Aug 2024 15:46:21 +0200 Subject: [PATCH 27/65] bug fixes to adapt to the new cgal.geometryfactory.com machine --- .../cgal.geometryfactory.com/bin/cgal_release.py | 2 +- Maintenance/test_handling/create_testresult_page | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py index a835da2c812f..daa87aa614a0 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py @@ -19,7 +19,7 @@ def command(self): """return the command to create and publish the release""" return ( f"PATH=/home/lrineau/bin-cmake3:/bin:/usr/bin:/home/lrineau/bin; cd {self.cwd} &&" - + " /usr/bin/time scl enable rh-git29 -- " + + " /usr/bin/time -v bash -x " + f"$HOME/bin/create_release {self.repo}{self.extra_options} --do-it" ) diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index ca62a5928286..a2825253e703 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -103,13 +103,13 @@ sub write_select() print OUTPUTV '\n"; my %results; foreach $_ (glob("results-*.shtml")) { - my $ctime = (stat($_))[10]; - $results{$_} = $ctime; + my $mtime = (stat($_))[9]; + $results{$_} = $mtime; } foreach $_ (sort { $results{$b} <=> $results{$a} } keys %results) { $_ =~ /results-${pattern}(\.\d+)?(-.*|)\.shtml/ || next; - my $ctime = (stat($_))[10]; - my $date = time2str('%a %Y/%m/%d', $ctime); + my $mtime = (stat($_))[9]; + my $date = time2str('%a %Y/%m/%d', $mtime); print OUTPUTV '\n", $filename, $date; From 286be1cfd05d0fe5ce742c44013f1b0ad333792b Mon Sep 17 00:00:00 2001 From: Donghao Chu <799017701@qq.com> Date: Wed, 21 Aug 2024 14:38:16 +0800 Subject: [PATCH 28/65] Pass random instance to GeneratorOnObject in Generic_random_point_generator for consistency --- .../CGAL/Generator/internal/Generic_random_point_generator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Generator/include/CGAL/Generator/internal/Generic_random_point_generator.h b/Generator/include/CGAL/Generator/internal/Generic_random_point_generator.h index 958915aa6356..2c6bfaf40e6a 100644 --- a/Generator/include/CGAL/Generator/internal/Generic_random_point_generator.h +++ b/Generator/include/CGAL/Generator/internal/Generic_random_point_generator.h @@ -105,7 +105,7 @@ void Generic_random_point_generator: ); // generate the points - GeneratorOnObject pointCreator(object_from_id_map(ids[target])); + GeneratorOnObject pointCreator(object_from_id_map(ids[target]), random); this->d_item = *pointCreator; } From 35b5c086afbc8132c22cdadfda9d824e65d204f0 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 21 Aug 2024 16:13:38 +0200 Subject: [PATCH 29/65] Add condition to check if CXXFLAGS variable is empty --- Maintenance/test_handling/to_zipped_format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maintenance/test_handling/to_zipped_format b/Maintenance/test_handling/to_zipped_format index fdf62712b021..9131d1000650 100755 --- a/Maintenance/test_handling/to_zipped_format +++ b/Maintenance/test_handling/to_zipped_format @@ -117,7 +117,7 @@ sub reformat_results($) # if (/BOOST_BIMAP_VERSION = '([^']+)'/) { # $BOOST="$BOOST+bimap"; # } - if (/USING +CXXFLAGS = '([^']*)'/) { + if (/USING +CXXFLAGS = '([^']*)'/ && !$CXXFLAGS) { $CXXFLAGS="$CXXFLAGS $1"; } if (/USING +LDFLAGS = '([^']*)'/) { From 13b5f3676a2a7d5ce8df2ce4cac18535e983bc05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 23 Aug 2024 10:09:10 +0200 Subject: [PATCH 30/65] remove extra wording --- .../doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt index e8d94344cfc1..49823e27292d 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt @@ -156,7 +156,7 @@ setting the named parameter `remesh_boundaries` to `false`. It is also possible to define the polyline features as the ones stored as complex edges in a `Mesh_complex_3_in_triangulation_3` -(e.g., generated by the \ref PkgMesh3 package mesh generation algorithms). +(e.g., generated by the \ref PkgMesh3 package). \cgalExample{Tetrahedral_remeshing/mesh_and_remesh_c3t3.cpp } From 483d43cdf2c0ab390f5b862860d38bc2e41dbff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 23 Aug 2024 11:12:01 +0200 Subject: [PATCH 31/65] use default that is fine for most of the packages --- Scripts/developer_scripts/cgal_create_package_dir.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Scripts/developer_scripts/cgal_create_package_dir.py b/Scripts/developer_scripts/cgal_create_package_dir.py index 90900b1304d3..e2445915d5b0 100755 --- a/Scripts/developer_scripts/cgal_create_package_dir.py +++ b/Scripts/developer_scripts/cgal_create_package_dir.py @@ -26,9 +26,8 @@ doxystring = \ r"""@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} + PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Put title of project here" -INPUT = ${CMAKE_SOURCE_DIR}/PACKAGENAME/doc/PACKAGENAME/ \ - ${CMAKE_SOURCE_DIR}/PACKAGENAME/include """ descrstring = \ From 02a38472a14dd731ae399276bed877d446a87d55 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 23 Aug 2024 15:43:53 +0200 Subject: [PATCH 32/65] reformat the REUSE.toml file (readability), add natvis files --- Installation/REUSE.toml | 35 +++++++++++++++++++++++++++++++++-- REUSE.toml | 41 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/Installation/REUSE.toml b/Installation/REUSE.toml index 4ceda7b22792..34a4baee4359 100644 --- a/Installation/REUSE.toml +++ b/Installation/REUSE.toml @@ -4,13 +4,44 @@ SPDX-PackageSupplier = "CGAL Editorial Board " SPDX-PackageDownloadLocation = "https://github.com/CGAL/cgal" [[annotations]] -path = ["**.cmake", "**.md", "doc/**", "doc_html/**", "scripts/**", "developer_scripts/**", "package_info/**", "demo/**", "examples/**", "src/**", "test/**", "benchmarks/**", "benchmark/**", "data/**", "cmake/**"] +path = [ + "**.cmake", + "**.md", + "doc/**", + "doc_html/**", + "scripts/**", + "developer_scripts/**", + "package_info/**", + "demo/**", + "examples/**", + "src/**", + "test/**", + "benchmarks/**", + "benchmark/**", + "data/**", + "cmake/**", + "**/*.natvis", +] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" [[annotations]] -path = ["REUSE.toml", "lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in", "include/CGAL/Qt/ImageInterface.ui", "include/CGAL/Qt/resources/qglviewer-icon.xpm", "AUTHORS", "CMakeLists.txt", "README", "auxiliary/cgal_create_cmake_script.1", "auxiliary/gmp/README", "include/CGAL/license/gpl_package_list.txt", "auxiliary/cgal_app.icns", "copyright", "VERSION"] +path = [ + "REUSE.toml", + "lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in", + "include/CGAL/Qt/ImageInterface.ui", + "include/CGAL/Qt/resources/qglviewer-icon.xpm", + "AUTHORS", + "CMakeLists.txt", + "README", + "auxiliary/cgal_create_cmake_script.1", + "auxiliary/gmp/README", + "include/CGAL/license/gpl_package_list.txt", + "auxiliary/cgal_app.icns", + "copyright", + "VERSION", +] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" diff --git a/REUSE.toml b/REUSE.toml index a36f899b03c7..5cca2b91384e 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -4,13 +4,50 @@ SPDX-PackageSupplier = "CGAL Editorial Board " SPDX-PackageDownloadLocation = "https://github.com/CGAL/cgal" [[annotations]] -path = [".**", "**.cmake", "**.md", ".github/**", "Maintenance/**", "**/TODO", "**/doc/**", "**/deb/**", "**/applications/**", "**/doc_html/**", "**/scripts/**", "**/developer_scripts/**", "**/demo/**", "**/examples/**", "**/src/**", "**/test/**", "**/benchmarks/**", "**/benchmark/**", "**/package_info/**", "**/data/**", "**/cmake/**"] +path = [ + ".**", + "**.cmake", + "**.md", + ".github/**", + "Maintenance/**", + "**/TODO", + "**/doc/**", + "**/deb/**", + "**/applications/**", + "**/doc_html/**", + "**/scripts/**", + "**/developer_scripts/**", + "**/demo/**", + "**/examples/**", + "**/src/**", + "**/test/**", + "**/benchmarks/**", + "**/benchmark/**", + "**/package_info/**", + "**/data/**", + "**/cmake/**", + "**/*.natvis", +] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" [[annotations]] -path = ["REUSE.toml", "CMakeLists.txt", "cmake_uninstall.cmake.in", "GraphicsView/include/CGAL/Qt/ImageInterface.ui", "GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm", "Installation/AUTHORS", "Installation/CMakeLists.txt", "Installation/README", "Installation/auxiliary/cgal_create_cmake_script.1", "Installation/auxiliary/gmp/README", "Installation/include/CGAL/license/gpl_package_list.txt", "MacOSX/auxiliary/cgal_app.icns", "copyright"] +path = [ + "REUSE.toml", + "CMakeLists.txt", + "cmake_uninstall.cmake.in", + "GraphicsView/include/CGAL/Qt/ImageInterface.ui", + "GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm", + "Installation/AUTHORS", + "Installation/CMakeLists.txt", + "Installation/README", + "Installation/auxiliary/cgal_create_cmake_script.1", + "Installation/auxiliary/gmp/README", + "Installation/include/CGAL/license/gpl_package_list.txt", + "MacOSX/auxiliary/cgal_app.icns", + "copyright", +] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" From ac46e562361650d6613549deecb0f5c9afd0cd66 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 23 Aug 2024 15:49:20 +0200 Subject: [PATCH 33/65] fix SELinux contexts so that the web server can offer the files --- Scripts/developer_scripts/run_doxygen_testsuite | 1 + 1 file changed, 1 insertion(+) diff --git a/Scripts/developer_scripts/run_doxygen_testsuite b/Scripts/developer_scripts/run_doxygen_testsuite index ec3a58556203..271fb9699aa7 100755 --- a/Scripts/developer_scripts/run_doxygen_testsuite +++ b/Scripts/developer_scripts/run_doxygen_testsuite @@ -65,6 +65,7 @@ bash -$- ./process_doc.sh /home/cgal-testsuite/bin/doxygen_1_8_13 /home/cgal-tes if head -2 ../../.scm-branch | grep -q cgal/master; then rsync -a --delete "/srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID}/output2/" /srv/CGAL/www/doc/master/ fi +restorecon -R /srv/CGAL/www/doc/master/ /srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID} rm -rf "${CGAL_DOC_BUILD}" # Then gzip the log file, to save space exec From 7838b95b948fadfb25b4d49ad1ae46b1d04e2362 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 23 Aug 2024 15:55:55 +0200 Subject: [PATCH 34/65] generate review of the code --- .../developer_scripts/run_doxygen_testsuite | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Scripts/developer_scripts/run_doxygen_testsuite b/Scripts/developer_scripts/run_doxygen_testsuite index 271fb9699aa7..22d9aab978ff 100755 --- a/Scripts/developer_scripts/run_doxygen_testsuite +++ b/Scripts/developer_scripts/run_doxygen_testsuite @@ -6,7 +6,7 @@ cd /home/cgal-testsuite # Rotate log files on one month: the logfile name contains the number of # the day -LOGFILE=$PWD/doxygen_testsuite-`date '+%d'`.log +LOGFILE=$PWD/doxygen_testsuite-$(date '+%d').log exec > "$LOGFILE" @@ -31,8 +31,8 @@ if [ -r "${CGAL_DOC_BUILD}" ]; then rm -rf "${CGAL_DOC_BUILD}" fi -mkdir ${CGAL_DOC_BUILD} -cd ${CGAL_DOC_BUILD} +mkdir "${CGAL_DOC_BUILD}" +cd "${CGAL_DOC_BUILD}" if [ -r "LATEST" ]; then rm -rf LATEST @@ -44,12 +44,12 @@ if [ ! -f "LATEST" ]; then error "COULD NOT DOWNLOAD LATEST!" fi -for i in `cat LATEST` +for i in $(cat LATEST) do CGAL_LOCATION="${CGAL_URL}/${i}"; CGAL_ZIPFILE="${i}"; done -CGAL_RELEASE_ID=`echo $CGAL_ZIPFILE | sed "s/.tar.gz//"` +CGAL_RELEASE_ID=$(echo "$CGAL_ZIPFILE" | sed "s/.tar.gz//") curl ${CURL_OPTS} "${CGAL_LOCATION}" tar xvzf "${CGAL_ZIPFILE}" && rm "${CGAL_ZIPFILE}" @@ -60,12 +60,16 @@ cd "${CGAL_RELEASE_ID}" PATH=/home/cgal-testsuite/local/bin:$PATH export PATH -cd "$PWD/doc/scripts" +cd "${PWD}/doc/scripts" bash -$- ./process_doc.sh /home/cgal-testsuite/bin/doxygen_1_8_13 /home/cgal-testsuite/bin/doxygen_1_9_6 /srv/CGAL/www/Members/Manual_doxygen_test if head -2 ../../.scm-branch | grep -q cgal/master; then rsync -a --delete "/srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID}/output2/" /srv/CGAL/www/doc/master/ fi -restorecon -R /srv/CGAL/www/doc/master/ /srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID} +if sestatus &>/dev/null && [ -d "/srv/CGAL/www/doc/master/" ] && [ -d "/srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID}" ]; then + restorecon -R /srv/CGAL/www/doc/master/ /srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID} || error "restorecon command failed" +else + error "SELinux is not enabled or the paths do not exist" +fi rm -rf "${CGAL_DOC_BUILD}" # Then gzip the log file, to save space exec From 9d2670f017601dacf08181c165ee9cf919c27d4e Mon Sep 17 00:00:00 2001 From: Giles Bathgate Date: Sun, 25 Aug 2024 18:58:24 +0100 Subject: [PATCH 35/65] Remove commented out code --- .../External_structure_builder.h | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h index 8c4c546590d4..7bbf805248b5 100644 --- a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h +++ b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h @@ -77,51 +77,7 @@ class External_structure_builder : public Modifier_base sedge2sface; - /* - SFace_iterator sfi; - CGAL_forall_sfaces(sfi, *sncp) { - SFace_cycle_iterator sfc; - for(sfc = sfi->sface_cycles_begin(); sfc != sfi->sface_cycles_end(); ++sfc) { - if(sfc.is_shalfedge()){ - SHalfedge_around_sface_circulator eaf(sfc), end(eaf); - CGAL_For_all(eaf,end) { - SHalfedge_handle se(eaf); - sedge2sface[eaf] = sfi; - } - } - } - } - - // CGAL::SNC_io_parser O0(std::cerr, *sncp, false); - // O0.print(); - - SHalfedge_iterator sei; - CGAL_forall_shalfedges(sei, *sncp) { - SHalfedge_handle se(sei); - if(sedge2sface[se] == SFace_handle()) { - SM_decorator SD(&*sei->source()->source()); - SFace_handle sf_new = SD.new_sface(); - sf_new->mark() = sei->incident_sface()->mark(); - - CGAL_NEF_TRACEN("new entry sedge " << sei->source()->point() - << "->" << sei->twin()->source()->point() - << " at " << sei->source()->source()->point()); - - SD.link_as_face_cycle(sei, sf_new); - - SHalfedge_around_sface_circulator eaf(se), end(eaf); - CGAL_For_all(eaf,end) { - SHalfedge_handle se(eaf); - sedge2sface[eaf] = sf_new; - } - - // TODO: relink inner sface cycles - } - } - */ SNC_point_locator* old_pl = pl; pl = pl->clone(); sncpl.pl = pl; @@ -129,9 +85,6 @@ class External_structure_builder : public Modifier_base Ox(std::cerr, *sncp, false); - // Ox.print(); } }; From 44b92c11dbe57e5cc12b1ede80e295d8c248caee Mon Sep 17 00:00:00 2001 From: Giles Bathgate Date: Sun, 25 Aug 2024 18:58:55 +0100 Subject: [PATCH 36/65] Move the delete to the end of the function --- .../CGAL/Convex_decomposition_3/External_structure_builder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h index 7bbf805248b5..f43609baafdb 100644 --- a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h +++ b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h @@ -81,10 +81,10 @@ class External_structure_builder : public Modifier_baseclone(); sncpl.pl = pl; - delete old_pl; SNC_external_structure C(*sncp,pl); C.clear_external_structure(); C.build_external_structure(); + delete old_pl; } }; From cf30f4dfab94a732c93f1cff3a5a9d5584343132 Mon Sep 17 00:00:00 2001 From: Giles Bathgate Date: Mon, 26 Aug 2024 09:29:21 +0100 Subject: [PATCH 37/65] Remove unused hashmap --- .../CGAL/Convex_decomposition_3/External_structure_builder.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h index f43609baafdb..c6ecee86c0b6 100644 --- a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h +++ b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h @@ -76,8 +76,6 @@ class External_structure_builder : public Modifier_base sedge2sface; SNC_point_locator* old_pl = pl; pl = pl->clone(); sncpl.pl = pl; From 62cb850d5bcd70ac7871deed9f7c1bad92870fb6 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 26 Aug 2024 15:38:45 +0200 Subject: [PATCH 38/65] create_new_release with SELinux: call restorecon --- Scripts/developer_scripts/create_new_release | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Scripts/developer_scripts/create_new_release b/Scripts/developer_scripts/create_new_release index 692ed94e7fa4..2b0e0f2ff2b6 100755 --- a/Scripts/developer_scripts/create_new_release +++ b/Scripts/developer_scripts/create_new_release @@ -323,6 +323,9 @@ if [ -n "$DO_PUBLIC" ]; then zip -q -r ${public_release_name}-library.zip ${public_release_name} mv ${public_release_name}*.tar.xz "${HTML_DIR}/${release_name}-public/" mv ${public_release_name}*.zip "${HTML_DIR}/${release_name}-public/" + if command -v sestatus >/dev/null 2>&1; then + sestatus && restorecon -R "${HTML_DIR}/${release_name}-public" + fi rm -f "$HTML_DIR/CGAL-last-public" ln -s "${release_name}-public" "$HTML_DIR/CGAL-last-public" fi From 261bf3aa81b003fdbe31ac1bae3aacc4740f3fe9 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 27 Aug 2024 17:53:22 +0200 Subject: [PATCH 39/65] try to create bug-fixes releases --- .../bin/create_internal_release_of_the_day.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py index f2a97610321a..ab1b640f42a9 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py @@ -13,8 +13,8 @@ # Define a dictionary that maps day of the week to an action actions = { "Monday": integration, - "Tuesday": integration, - "Wednesday": integration, + "Tuesday": release("5.5"), #integration, + "Wednesday": release("5.6"), #integration, "Thursday": integration, "Friday": release("5.5"), "Saturday": release("5.6"), From 4eb51f79d0c7dad473dfe77f7b6ca3f765529e11 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 28 Aug 2024 10:46:59 +0200 Subject: [PATCH 40/65] fixed saving paths --- .../polyfit_example_model_complexty_control.cpp | 6 +++--- .../polyfit_example_user_provided_planes.cpp | 2 +- .../polyfit_example_with_region_growing.cpp | 2 +- .../polyfit_example_without_input_planes.cpp | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_model_complexty_control.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_model_complexty_control.cpp index 64fd9a9784ae..e132d62975df 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_model_complexty_control.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_model_complexty_control.cpp @@ -90,7 +90,7 @@ int main() return EXIT_FAILURE; } else { - const std::string& output_file = "data/building_result-0.05.off"; + const std::string& output_file = "building_result-0.05.off"; if (CGAL::IO::write_OFF(output_file, model)) { std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; } @@ -108,7 +108,7 @@ int main() return EXIT_FAILURE; } else { - const std::string& output_file = "data/building_result-0.5.off"; + const std::string& output_file = "building_result-0.5.off"; if (CGAL::IO::write_OFF(output_file, model)) std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; else { @@ -125,7 +125,7 @@ int main() return EXIT_FAILURE; } else { - const std::string& output_file = "data/building_result-0.7.off"; + const std::string& output_file = "building_result-0.7.off"; if (CGAL::IO::write_OFF(output_file, model)){ std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; } diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_user_provided_planes.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_user_provided_planes.cpp index 733f01137492..2f2ed2df2c97 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_user_provided_planes.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_user_provided_planes.cpp @@ -89,7 +89,7 @@ int main() } // Saves the mesh model - const std::string& output_file("data/ball_result.off"); + const std::string& output_file("user_provided_planes_result.off"); if (CGAL::IO::write_OFF(output_file, model)) std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; else { diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_with_region_growing.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_with_region_growing.cpp index 8dc81bd3c1ed..493c8c138aa9 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_with_region_growing.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_with_region_growing.cpp @@ -172,7 +172,7 @@ int main() std::cout << "Saving..."; t.reset(); - const std::string& output_file("data/cube_result.off"); + const std::string& output_file("with_region_growing_result.off"); if (CGAL::IO::write_OFF(output_file, model)) std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; else { diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp index 85e474d99d7d..b04ba46dd0be 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp @@ -138,7 +138,7 @@ int main() // Also stores the candidate faces as a surface mesh to a file Surface_mesh candidate_faces; algo.output_candidate_faces(candidate_faces); - const std::string& candidate_faces_file("data/cube_candidate_faces.off"); + const std::string& candidate_faces_file("without_input_planes_result.off"); std::ofstream candidate_stream(candidate_faces_file.c_str()); if (CGAL::IO::write_OFF(candidate_stream, candidate_faces)) std::cout << "Candidate faces saved to " << candidate_faces_file << "." << std::endl; From 860f60b090c05b83378885d81cc81598e14fa996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 28 Aug 2024 11:23:06 +0200 Subject: [PATCH 41/65] need c++17 --- Triangulation_3/test/Triangulation_3/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Triangulation_3/test/Triangulation_3/CMakeLists.txt b/Triangulation_3/test/Triangulation_3/CMakeLists.txt index d5156f0d1e63..2da2b2aeecc2 100644 --- a/Triangulation_3/test/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/test/Triangulation_3/CMakeLists.txt @@ -23,10 +23,11 @@ create_single_source_cgal_program( "test_RT_cell_base_with_weighted_circumcenter_3.cpp") create_single_source_cgal_program("test_robust_weighted_circumcenter.cpp") create_single_source_cgal_program("test_simplex_3.cpp") -create_single_source_cgal_program( "test_simplex_iterator_3.cpp" ) -create_single_source_cgal_program( "test_segment_cell_traverser_3.cpp" ) create_single_source_cgal_program( "test_segment_simplex_traverser_3.cpp" ) if(cxx_std_17 IN_LIST CMAKE_CXX_COMPILE_FEATURES) + create_single_source_cgal_program( "test_simplex_iterator_3.cpp" ) + create_single_source_cgal_program( "test_segment_cell_traverser_3.cpp" ) + target_compile_features(test_simplex_iterator_3 PRIVATE cxx_std_17) target_compile_features(test_segment_simplex_traverser_3 PRIVATE cxx_std_17) else() message( From 377e2f11bcdf71ec0126ef244c4f160bda27bc28 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 26 Aug 2024 15:38:45 +0200 Subject: [PATCH 42/65] create_new_release with SELinux: call restorecon --- Scripts/developer_scripts/create_new_release | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Scripts/developer_scripts/create_new_release b/Scripts/developer_scripts/create_new_release index 692ed94e7fa4..2b0e0f2ff2b6 100755 --- a/Scripts/developer_scripts/create_new_release +++ b/Scripts/developer_scripts/create_new_release @@ -323,6 +323,9 @@ if [ -n "$DO_PUBLIC" ]; then zip -q -r ${public_release_name}-library.zip ${public_release_name} mv ${public_release_name}*.tar.xz "${HTML_DIR}/${release_name}-public/" mv ${public_release_name}*.zip "${HTML_DIR}/${release_name}-public/" + if command -v sestatus >/dev/null 2>&1; then + sestatus && restorecon -R "${HTML_DIR}/${release_name}-public" + fi rm -f "$HTML_DIR/CGAL-last-public" ln -s "${release_name}-public" "$HTML_DIR/CGAL-last-public" fi From 706c5f12ae1b12d5ed952733a5e43e4224da891e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 28 Aug 2024 11:49:05 +0200 Subject: [PATCH 43/65] backport of https://github.com/CGAL/cgal/pull/7499 --- .../CGAL/OSQP_quadratic_program_traits.h | 126 ++++++++---------- .../CGAL/SCIP_mixed_integer_program_traits.h | 5 + 2 files changed, 60 insertions(+), 71 deletions(-) diff --git a/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h b/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h index 002b6acba839..261c4c514b03 100644 --- a/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h +++ b/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h @@ -44,9 +44,9 @@ namespace CGAL { number type that `FieldNumberType` \note The `FT` type is provided for convenience. Internally, this FT type is converted - to `c_float` type that can be set either to `float` or `double`. By default, the `double` - type is used. After the optimization is complete, the `c_float` type is converted back to `FT`. - See more about `c_float` here. + to `OSQPFloat` type that can be set either to `float` or `double`. By default, the `double` + type is used. After the optimization is complete, the `OSQPFloat` type is converted back to `FT`. + See more about `OSQPFloat` here. \cgalModels `QuadraticProgramTraits` */ @@ -192,27 +192,27 @@ class OSQP_quadratic_program_traits CGAL_precondition(q_vec.size() == n); CGAL_precondition(l_vec.size() == m && l_vec.size() == m); - const c_int P_nnz = static_cast(P_vec.size()); - auto P_x = std::make_unique(P_nnz); - auto P_i = std::make_unique(P_nnz); - auto P_p = std::make_unique(n + 1); + const OSQPInt P_nnz = static_cast(P_vec.size()); + auto P_x = std::make_unique(P_nnz); + auto P_i = std::make_unique(P_nnz); + auto P_p = std::make_unique(n + 1); set_matrix_from_triplets("P", P_vec, P_x.get(), P_i.get(), P_p.get()); if(verbose) std::cout << "P_nnz: " << P_nnz << std::endl; - const c_int A_nnz = static_cast(A_vec.size()); - auto A_x = std::make_unique(A_nnz); - auto A_i = std::make_unique(A_nnz); - auto A_p = std::make_unique(n + 1); + const OSQPInt A_nnz = static_cast(A_vec.size()); + auto A_x = std::make_unique(A_nnz); + auto A_i = std::make_unique(A_nnz); + auto A_p = std::make_unique(n + 1); set_matrix_from_triplets("A", A_vec, A_x.get(), A_i.get(), A_p.get()); if(verbose) std::cout << "A_nnz: " << A_nnz << std::endl; - const c_int q_size = static_cast(q_vec.size()); - const c_int l_size = static_cast(l_vec.size()); - const c_int u_size = static_cast(u_vec.size()); + const OSQPInt q_size = static_cast(q_vec.size()); + const OSQPInt l_size = static_cast(l_vec.size()); + const OSQPInt u_size = static_cast(u_vec.size()); - auto q_x = std::make_unique(q_size); - auto l_x = std::make_unique(l_size); - auto u_x = std::make_unique(u_size); + auto q_x = std::make_unique(q_size); + auto l_x = std::make_unique(l_size); + auto u_x = std::make_unique(u_size); set_qlu_data(q_x.get(), l_x.get(), u_x.get()); // Problem settings. @@ -220,22 +220,11 @@ class OSQP_quadratic_program_traits CGAL_assertion(settings); // Structures. - OSQPWorkspace *work; - OSQPData *data = (OSQPData *) malloc(sizeof(OSQPData)); - CGAL_assertion(data); + OSQPCscMatrix* P = static_cast(malloc(sizeof(OSQPCscMatrix))); + OSQPCscMatrix* A = static_cast(malloc(sizeof(OSQPCscMatrix))); - // Populate data. - data->n = static_cast(n); - data->m = static_cast(m); - data->P = csc_matrix(data->n, data->n, P_nnz, P_x.get(), P_i.get(), P_p.get()); - CGAL_assertion(data->P); - - data->q = q_x.get(); - data->A = csc_matrix(data->m, data->n, A_nnz, A_x.get(), A_i.get(), A_p.get()); - CGAL_assertion(data->A); - - data->l = l_x.get(); - data->u = u_x.get(); + csc_set_data(A, m, n, A_nnz, A_x.get(), A_i.get(), A_p.get()); + csc_set_data(P, n, n, P_nnz, P_x.get(), P_i.get(), P_p.get()); // Set solver settings. osqp_set_default_settings(settings); @@ -243,38 +232,33 @@ class OSQP_quadratic_program_traits settings->eps_rel = eps_rel; settings->verbose = verbose; - // Set workspace. - osqp_setup(&work, data, settings); + OSQPSolver* solver = NULL; + OSQPInt exitflag = osqp_setup(&solver, P, q_x.get(), A, l_x.get(), u_x.get(), m, n, settings); - // Solve problem. - c_int exitflag = -1; try { - exitflag = osqp_solve(work); + if (!exitflag) + exitflag = osqp_solve(solver); + + const OSQPFloat* x = solver->solution->x; + for (std::size_t i = 0; i < n; ++i) + { + const FT value{ x[i] }; + *(++solution) = value; + } } - catch(std::exception& e) + catch (std::exception& e) { std::cerr << "ERROR: OSQP solver has thrown an exception!" << std::endl; std::cerr << e.what() << std::endl; } - const bool success = (exitflag == 0); - - // Create solution. - const c_float *x = work->solution->x; - for(std::size_t i=0; iA); - c_free(data->P); - c_free(data); - c_free(settings); + osqp_cleanup(solver); + if (A) free(A); + if (P) free(P); + if (settings) free(settings); - return success; + return (exitflag == 0); } /// \endcond @@ -282,9 +266,9 @@ class OSQP_quadratic_program_traits // Based on the code in scipy, function coo_tocsr() void set_matrix_from_triplets(const std::string /* name */, const std::vector& triplets, - c_float *M_x, - c_int *M_i, - c_int *M_p) const + OSQPFloat *M_x, + OSQPInt *M_i, + OSQPInt *M_p) const { const std::size_t nnz = triplets.size(); @@ -296,10 +280,10 @@ class OSQP_quadratic_program_traits } // Fill M_p - c_int cumsum = 0; + OSQPInt cumsum = 0; for(std::size_t j=0; j(std::get<1>(triplets[k])); - const c_int dest = M_p[col]; + const OSQPInt col = static_cast(std::get<1>(triplets[k])); + const OSQPInt dest = M_p[col]; - M_i[dest] = static_cast(std::get<0>(triplets[k])); - M_x[dest] = c_float(CGAL::to_double(std::get<2>(triplets[k]))); + M_i[dest] = static_cast(std::get<0>(triplets[k])); + M_x[dest] = OSQPFloat(CGAL::to_double(std::get<2>(triplets[k]))); M_p[col]++; } - c_int last = 0; + OSQPInt last = 0; for(std::size_t j=0; j<=n; ++j) { - const c_int tmp = M_p[j]; + const OSQPInt tmp = M_p[j]; M_p[j] = last; last = tmp; } @@ -341,19 +325,19 @@ class OSQP_quadratic_program_traits // std::cout << std::endl; } - void set_qlu_data(c_float *q_x, - c_float *l_x, - c_float *u_x) const + void set_qlu_data(OSQPFloat *q_x, + OSQPFloat *l_x, + OSQPFloat *u_x) const { for(std::size_t i=0; i Date: Wed, 28 Aug 2024 11:58:03 +0200 Subject: [PATCH 44/65] backport of https://github.com/CGAL/cgal/pull/7382 --- BGL/test/BGL/CMakeLists.txt | 4 ++-- Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt | 2 +- Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index da8baf25ccbd..4f76ac1664ef 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -130,9 +130,9 @@ if (VTK_FOUND) if(VTK_LIBRARIES) target_link_libraries(test_bgl_read_write PRIVATE ${VTK_LIBRARIES}) - target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK) + target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK -DNOMINMAX) target_link_libraries(test_deprecated_io PRIVATE ${VTK_LIBRARIES}) - target_compile_definitions(test_deprecated_io PRIVATE -DCGAL_USE_VTK) + target_compile_definitions(test_deprecated_io PRIVATE -DCGAL_USE_VTK -DNOMINMAX) else() message(STATUS "Tests that use VTK will not be compiled.") endif() diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt index d7ed3ec6bb8b..bfe4bee7b745 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt @@ -66,7 +66,7 @@ if(VTK_FOUND) polyhedron_demo_plugin(vtk_plugin VTK_io_plugin KEYWORDS Viewer Mesh_3) target_link_libraries(vtk_plugin PUBLIC scene_surface_mesh_item scene_polylines_item scene_c3t3_item scene_points_with_normal_item ${VTK_LIBRARIES}) - target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK) + target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) else() message( STATUS diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt index 89d05476c462..d60aeb2f6d0c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt @@ -73,7 +73,7 @@ if(Boost_FILESYSTEM_FOUND) KEYWORDS Viewer Mesh_3) target_link_libraries(io_image_plugin PUBLIC scene_image_item ${VTK_LIBRARIES} CGAL::CGAL_ImageIO) if(VTK_LIBRARIES) - target_compile_definitions(io_image_plugin PRIVATE CGAL_USE_VTK) + target_compile_definitions(io_image_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) endif() if(TARGET Boost::filesystem) target_link_libraries(io_image_plugin PUBLIC Boost::filesystem From af8e134aa6d26da08eab18e1436ac693066c33ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 28 Aug 2024 14:04:57 +0200 Subject: [PATCH 45/65] doc boost mp as gmp replacement --- .../doc/Documentation/Third_party.txt | 31 +++++++++++++------ Documentation/doc/Documentation/Usage.txt | 2 +- Documentation/doc/Documentation/windows.txt | 2 +- Installation/CHANGES.md | 2 ++ 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index d2eeb5d9b7e5..eaafe426bddc 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -72,23 +72,34 @@ As there is no canonical directory for where to find \boost on Windows, we recommend that you define the environment variable `BOOST_ROOT` and set it to where you have installed \boost, e.g., `C:\boost\boost_1_70_0`. -\subsection thirdpartyMPFR GNU Multiple Precision Arithmetic (GMP) and GNU Multiple Precision Floating-Point Reliably (MPFR) Libraries -GMP Version 5.0.1 or later, MPFR Version 3.0.0 or later +\subsection thirdpartyMP Multi Precision Number Type Library -The components \cgal, `CGAL_Core`, and `CGAL_Qt6` require -\gmp and \mpfr which are libraries for multi precision integers and rational numbers, -and for multi precision floating point numbers. - -\cgal combines floating point arithmetic with exact arithmetic -in order to be efficient and reliable. \cgal has a built-in -number type for that, but \gmp and \mpfr provide a faster -solution, and we recommend using them. +GNU Multiple Precision Arithmetic (GMP) and GNU Multiple Precision Floating-Point Reliably (MPFR) Libraries +are libraries for multi precision integers and rational numbers, and for multi precision floating point numbers. These libraries can be obtained from `https://gmplib.org/` and `https://www.mpfr.org/`. Since Visual \cpp is not properly supported by the \gmp and \mpfr projects, we provide precompiled versions of \gmp and \mpfr, which can be downloaded from the assets of a release. +Version supported are GMP Version 5.0.1 or later, MPFR Version 3.0.0 or later. + +The \boost library also provides a module for multi precision integers and rational numbers: +\boost multiprecision. +Versions supported are \boost Version 1.72 or later. + +The components \cgal, and `CGAL_Qt6` require either \gmp and \mpfr, or \boost multiprecision +for multi precision numbers. `CGAL_Core` requires \boost multiprecision. + +\cgal combines floating point arithmetic with exact arithmetic +in order to be efficient and reliable. \cgal has a built-in +number type for that, but previous alternatives are faster +solutions, and we recommend using one of them. + +The CMake variable `CGAL_CMAKE_EXACT_NT_BACKEND` can be used to select +the library that will be used internally for multi precision number types. +The variable `CGAL_CMAKE_EXACT_NT_BACKEND-STRINGS` contains all the possible +values. \section secoptional3rdpartysoftware Optional Third Party Libraries diff --git a/Documentation/doc/Documentation/Usage.txt b/Documentation/doc/Documentation/Usage.txt index 68a3ae850018..8547affb6918 100644 --- a/Documentation/doc/Documentation/Usage.txt +++ b/Documentation/doc/Documentation/Usage.txt @@ -36,7 +36,7 @@ Using \cgal requires a few core components to be previously installed:
  • a supported compiler (see Section \ref seccompilers),
  • \ref seccmake,
  • \ref thirdpartyBoost,
  • -
  • \ref thirdpartyMPFR.
  • +
  • a \ref thirdpartyMP.
  • Optional third-party software might be required to build examples and demos shipped with \cgal, diff --git a/Documentation/doc/Documentation/windows.txt b/Documentation/doc/Documentation/windows.txt index c7d613e5c3ae..b0b8875c2eeb 100644 --- a/Documentation/doc/Documentation/windows.txt +++ b/Documentation/doc/Documentation/windows.txt @@ -6,7 +6,7 @@ 15.9, 16.0, 17.0 (\visualstudio 2017, 2019, and 2022). \cgal is a library that has mandatory dependencies that must be first installed: -\ref thirdpartyBoost and \ref thirdpartyMPFR. +\ref thirdpartyBoost and a \ref thirdpartyMP. You have two options to install \cgal and its dependencies: you can either use the *Vcpkg library manager*, which will automatically install an appropriate version of diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index a8ddd38c1a1c..6526c913414c 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -13,6 +13,8 @@ Release date: June 2024 - LLVM Clang version 15.0.7 or later (on Linux) - Apple Clang compiler versions 10.0.1, 12.0.5, and 15.0.0 (on macOS) - The minimal supported version of Boost is now 1.72.0. +- GMP/MPFR are no longer mandatory to use CGAL, [Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html). + can be used instead. - The CGAL `Core` library is no longer based on GMP, but on [Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html). Either GMP backend or Boost backend can be used. From 6917edd6973b181a892b11caea9622c0ab55334d Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 28 Aug 2024 16:16:25 +0200 Subject: [PATCH 46/65] added test for formerly unused OutputIteratorValueType --- .../test/Stream_support/data/simple_ascii.ply | 16 ++++++ .../test/Stream_support/issue8155.cpp | 50 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 Stream_support/test/Stream_support/data/simple_ascii.ply create mode 100644 Stream_support/test/Stream_support/issue8155.cpp diff --git a/Stream_support/test/Stream_support/data/simple_ascii.ply b/Stream_support/test/Stream_support/data/simple_ascii.ply new file mode 100644 index 000000000000..5bc4a19d34f2 --- /dev/null +++ b/Stream_support/test/Stream_support/data/simple_ascii.ply @@ -0,0 +1,16 @@ +ply +format ascii 1.0 +comment VCGLIB generated +element vertex 3 +property float x +property float y +property float z +property float nx +property float ny +property float nz +element face 0 +property list uchar int vertex_indices +end_header +1 1 1 2 2 2 +3 3 3 4 4 4 +5 5 5 6 6 6 diff --git a/Stream_support/test/Stream_support/issue8155.cpp b/Stream_support/test/Stream_support/issue8155.cpp new file mode 100644 index 000000000000..f92bf9cca843 --- /dev/null +++ b/Stream_support/test/Stream_support/issue8155.cpp @@ -0,0 +1,50 @@ +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::FT FT; +typedef Kernel::Point_3 Point_3; +typedef Kernel::Vector_3 Vector_3; +typedef std::pair PointVectorPair; +typedef CGAL::First_of_pair_property_map Point_map; +typedef CGAL::Second_of_pair_property_map Normal_map; + +int main() +{ + std::vector pv_pairs; + const std::function lambda = + [&](const PointVectorPair& p) { + FT len = p.second.squared_length(); + if (len > 0 || len != 1.0) { + Vector_3 n = p.second * (1.0 / CGAL::sqrt(len)); + pv_pairs.push_back(std::make_pair(p.first, n)); + } + else pv_pairs.push_back(p); + }; + + pv_pairs.clear(); + std::ifstream file("data/simple_ascii.ply"); + CGAL::IO::read_PLY_with_properties(file, boost::function_output_iterator(lambda), + CGAL::make_ply_point_reader(Point_map()), + CGAL::make_ply_normal_reader(Normal_map())); + + assert(pv_pairs[0].first == Point_3(1, 1, 1)); + assert(pv_pairs[1].first == Point_3(3, 3, 3)); + assert(pv_pairs[2].first == Point_3(5, 5, 5)); + + for (std::size_t i = 0; i < pv_pairs.size(); i++) { + FT dev = CGAL::abs(1.0 - pv_pairs[i].second.squared_length()); + assert(dev < 0.01); + } + + return 0; +} From fdd8f7f3749493daafd94bc8bb9e67aa5f7f7497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Aug 2024 09:08:14 +0200 Subject: [PATCH 47/65] data dir does not exist --- .../polyfit_example_without_input_planes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp index b04ba46dd0be..c676fd83bbfc 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp @@ -125,7 +125,7 @@ int main() return EXIT_FAILURE; } - const std::string& output_file("data/cube_result.off"); + const std::string& output_file("cube_result.off"); if (CGAL::IO::write_OFF(output_file, model)) std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; else { From abd99b68eb30fd4c7d13362091680e7720d19700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Aug 2024 10:10:20 +0200 Subject: [PATCH 48/65] handle nested holes in convex decomposition --- .../cd_nested_holes_test.cpp | 53 ++++++ .../test/Convex_decomposition_3/data/in1.off | 117 ++++++++++++ .../test/Convex_decomposition_3/data/in2.off | 144 ++++++++++++++ .../test/Convex_decomposition_3/data/in3.off | 180 ++++++++++++++++++ .../test/Convex_decomposition_3/data/in4.off | 180 ++++++++++++++++++ Nef_3/include/CGAL/Nef_polyhedron_3.h | 98 +++++++++- 6 files changed, 764 insertions(+), 8 deletions(-) create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/data/in1.off create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/data/in2.off create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/data/in3.off create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/data/in4.off diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp b/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp new file mode 100644 index 000000000000..3c69b2a5339e --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; +typedef CGAL::Polyhedron_3 Polyhedron_3; +typedef CGAL::Nef_polyhedron_3 Nef_polyhedron_3; +typedef Nef_polyhedron_3::Volume_const_iterator Volume_const_iterator; + +std::size_t run(std::string path) +{ + Polyhedron_3 input; + std::ifstream(path) >> input; + + Nef_polyhedron_3 N(input); + + CGAL::convex_decomposition_3(N); + std::list convex_parts; + + Volume_const_iterator ci = ++N.volumes_begin(); + for( ; ci != N.volumes_end(); ++ci) { + if(ci->mark()) { + Polyhedron_3 P; + N.convert_inner_shell_to_polyhedron(ci->shells_begin(), P); + convex_parts.push_back(P); + } + } + +// int i=0; + for (const Polyhedron_3& P : convex_parts) + { +// std::ofstream("out_"+std::to_string(i++)+".off") << std::setprecision(17) << P; + CGAL_assertion(P.size_of_vertices()!=0); + } + + return convex_parts.size(); +} + +int main() +{ + std::size_t val = run("data/in1.off"); + assert(val==9); + val = run("data/in2.off"); + assert(val==10); + val = run("data/in3.off"); + assert(val==13); + val = run("data/in4.off"); + assert(val==17); +} diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/data/in1.off b/Convex_decomposition_3/test/Convex_decomposition_3/data/in1.off new file mode 100644 index 000000000000..dabda4d9d3eb --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/data/in1.off @@ -0,0 +1,117 @@ +OFF 40 76 0 +5 -5 4 +5 -5 2 +5 5 2 +5 5 4 +5 -5 -2 +5 -5 -4 +5 5 -4 +5 5 -2 +-5 5 4 +-5 -5 4 +-4 -4 4 +-4 4 4 +4 4 4 +4 -4 4 +-5 -5 -4 +-5 5 -4 +-4 4 -4 +-4 -4 -4 +4 -4 -4 +4 4 -4 +-5 5 2 +-5 -5 2 +-5 -5 -2 +-5 5 -2 +4 4 2 +4 -4 2 +4 -4 -2 +4 4 -2 +-4 4 2 +-4 -4 2 +-4 4 -2 +-4 -4 -2 +6 -6 2 +6 -6 -2 +6 6 -2 +6 6 2 +-6 6 2 +-6 -6 2 +-6 -6 -2 +-6 6 -2 +3 0 2 3 +3 2 0 1 +3 4 6 7 +3 6 4 5 +3 3 12 0 +3 3 11 12 +3 11 8 10 +3 8 11 3 +3 13 0 12 +3 10 0 13 +3 10 9 0 +3 9 10 8 +3 5 18 6 +3 5 17 18 +3 17 14 16 +3 14 17 5 +3 19 6 18 +3 16 6 19 +3 16 15 6 +3 15 16 14 +3 21 8 20 +3 8 21 9 +3 14 23 15 +3 23 14 22 +3 2 8 3 +3 8 2 20 +3 6 23 7 +3 23 6 15 +3 21 0 9 +3 0 21 1 +3 14 4 22 +3 4 14 5 +3 25 12 24 +3 12 25 13 +3 18 27 19 +3 27 18 26 +3 10 28 11 +3 28 10 29 +3 31 16 30 +3 16 31 17 +3 28 12 11 +3 12 28 24 +3 16 27 30 +3 27 16 19 +3 25 10 13 +3 10 25 29 +3 18 31 26 +3 31 18 17 +3 32 34 35 +3 34 32 33 +3 35 2 32 +3 35 20 2 +3 20 36 21 +3 36 20 35 +3 1 32 2 +3 21 32 1 +3 21 37 32 +3 37 21 36 +3 28 25 24 +3 25 28 29 +3 33 4 34 +3 33 22 4 +3 22 38 23 +3 38 22 33 +3 7 34 4 +3 23 34 7 +3 23 39 34 +3 39 23 38 +3 31 27 26 +3 27 31 30 +3 38 36 39 +3 36 38 37 +3 34 36 35 +3 36 34 39 +3 38 32 37 +3 32 38 33 diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/data/in2.off b/Convex_decomposition_3/test/Convex_decomposition_3/data/in2.off new file mode 100644 index 000000000000..d09ff781d581 --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/data/in2.off @@ -0,0 +1,144 @@ +OFF +48 92 0 + +2 2 2 +2 -2 2 +-2 2 2 +-2 -2 2 +-2 2 4 +2 2 4 +-2 -2 4 +2 -2 4 +5 -5 4 +-4 4 4 +5 5 4 +4 -4 4 +-5 -5 4 +-4 -4 -4 +5 -5 -4 +4 4 -4 +-5 5 -4 +-5 5 4 +5 5 -4 +-5 -5 -4 +4 4 4 +4 -4 -2 +-4 -4 4 +-4 4 -2 +-4 4 -4 +4 4 -2 +4 -4 -4 +6 -6 2 +5 5 2 +-5 5 2 +6 6 2 +5 -5 2 +-5 -5 2 +-6 -6 2 +5 -5 -2 +-5 -5 -2 +6 -6 -2 +5 5 -2 +-5 5 -2 +-6 6 -2 +-4 -4 -2 +-6 6 2 +6 6 -2 +-6 -6 -2 +-4 -4 2 +-4 4 2 +4 4 2 +4 -4 2 +3 2 4 5 +3 7 6 3 +3 5 7 1 +3 6 7 5 +3 3 6 4 +3 5 0 2 +3 3 1 7 +3 1 0 5 +3 5 4 6 +3 4 2 3 +3 8 28 10 +3 28 8 31 +3 34 18 37 +3 18 34 14 +3 10 20 8 +3 10 9 20 +3 9 17 22 +3 17 9 10 +3 11 8 20 +3 22 8 11 +3 22 12 8 +3 12 22 17 +3 14 26 18 +3 14 13 26 +3 13 19 24 +3 19 13 14 +3 15 18 26 +3 24 18 15 +3 24 16 18 +3 16 24 19 +3 32 17 29 +3 17 32 12 +3 19 38 16 +3 38 19 35 +3 28 17 10 +3 17 28 29 +3 18 38 37 +3 38 18 16 +3 32 8 12 +3 8 32 31 +3 19 34 35 +3 34 19 14 +3 47 20 46 +3 20 47 11 +3 26 25 15 +3 25 26 21 +3 22 45 9 +3 45 22 44 +3 40 24 23 +3 24 40 13 +3 45 20 9 +3 20 45 46 +3 24 25 23 +3 25 24 15 +3 47 22 11 +3 22 47 44 +3 26 40 21 +3 40 26 13 +3 27 42 30 +3 42 27 36 +3 30 28 27 +3 30 29 28 +3 29 41 32 +3 41 29 30 +3 31 27 28 +3 32 27 31 +3 32 33 27 +3 33 32 41 +3 2 0 45 +3 1 44 47 +3 36 34 42 +3 36 35 34 +3 35 43 38 +3 43 35 36 +3 37 42 34 +3 38 42 37 +3 38 39 42 +3 39 38 43 +3 40 25 21 +3 25 40 23 +3 43 41 39 +3 41 43 33 +3 42 41 30 +3 41 42 39 +3 43 27 33 +3 27 43 36 +3 44 1 3 +3 44 3 45 +3 45 3 2 +3 46 45 0 +3 46 0 47 +3 47 0 1 + diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/data/in3.off b/Convex_decomposition_3/test/Convex_decomposition_3/data/in3.off new file mode 100644 index 000000000000..7685150981d6 --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/data/in3.off @@ -0,0 +1,180 @@ +OFF +60 116 0 + +1 1 4 +1 0.33333333333333337 4 +1 -1 4 +0.33333333333333337 -1 4 +-1 -1 4 +-1 0.33333333333333337 4 +-1 1 4 +0.33333333333333337 1 4 +-2 2 2 +5 -5 4 +-4 4 4 +5 5 4 +4 -4 4 +-5 -5 4 +-4 -4 -4 +5 -5 -4 +4 4 -4 +-5 5 -4 +-5 5 4 +5 5 -4 +-5 -5 -4 +4 4 4 +4 -4 -2 +-4 -4 4 +-4 4 -2 +-4 4 -4 +4 4 -2 +4 -4 -4 +6 -6 2 +5 5 2 +-5 5 2 +6 6 2 +5 -5 2 +-5 -5 2 +-6 -6 2 +5 -5 -2 +-5 -5 -2 +6 -6 -2 +5 5 -2 +-5 5 -2 +-6 6 -2 +-4 -4 -2 +-6 6 2 +6 6 -2 +-6 -6 -2 +-2 -2 2 +-4 -4 2 +-4 4 2 +4 4 2 +4 -4 2 +2 -2 2 +2 2 2 +-2 2 4 +2 2 4 +2 -2 4 +-2 -2 4 +1 1 2 +1 -1 2 +-1 -1 2 +-1 1 2 +3 8 52 53 +3 54 55 45 +3 53 54 50 +3 0 1 53 +3 45 55 52 +3 53 51 8 +3 45 50 54 +3 50 51 53 +3 4 5 55 +3 52 8 45 +3 9 29 11 +3 29 9 32 +3 35 19 38 +3 19 35 15 +3 11 21 9 +3 11 10 21 +3 10 18 23 +3 18 10 11 +3 12 9 21 +3 23 9 12 +3 23 13 9 +3 13 23 18 +3 15 27 19 +3 15 14 27 +3 14 20 25 +3 20 14 15 +3 16 19 27 +3 25 19 16 +3 25 17 19 +3 17 25 20 +3 33 18 30 +3 18 33 13 +3 20 39 17 +3 39 20 36 +3 29 18 11 +3 18 29 30 +3 19 39 38 +3 39 19 17 +3 33 9 13 +3 9 33 32 +3 20 35 36 +3 35 20 15 +3 49 21 48 +3 21 49 12 +3 27 26 16 +3 26 27 22 +3 23 47 10 +3 47 23 46 +3 41 25 24 +3 25 41 14 +3 47 21 10 +3 21 47 48 +3 25 26 24 +3 26 25 16 +3 49 23 12 +3 23 49 46 +3 27 41 22 +3 41 27 14 +3 28 43 31 +3 43 28 37 +3 31 29 28 +3 31 30 29 +3 30 42 33 +3 42 30 31 +3 32 28 29 +3 33 28 32 +3 33 34 28 +3 34 33 42 +3 8 51 47 +3 50 46 49 +3 37 35 43 +3 37 36 35 +3 36 44 39 +3 44 36 37 +3 38 43 35 +3 39 43 38 +3 39 40 43 +3 40 39 44 +3 41 26 22 +3 26 41 24 +3 44 42 40 +3 42 44 34 +3 43 42 31 +3 42 43 40 +3 44 28 34 +3 28 44 37 +3 46 50 45 +3 46 45 47 +3 47 45 8 +3 48 47 51 +3 48 51 49 +3 49 51 50 +3 52 55 5 +3 52 7 53 +3 52 5 6 +3 53 7 0 +3 52 6 7 +3 54 53 1 +3 54 2 3 +3 54 1 2 +3 55 54 3 +3 55 3 4 +3 58 57 56 +3 59 56 7 +3 2 57 3 +3 0 56 1 +3 5 59 6 +3 56 59 58 +3 57 1 56 +3 57 2 1 +3 58 5 4 +3 7 56 0 +3 58 3 57 +3 4 3 58 +3 59 5 58 +3 7 6 59 + diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/data/in4.off b/Convex_decomposition_3/test/Convex_decomposition_3/data/in4.off new file mode 100644 index 000000000000..1a7bbd1ba82e --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/data/in4.off @@ -0,0 +1,180 @@ +OFF +60 116 0 + +1 1 4 +1 0.5 4 +1 -1 4 +0.5 -1 4 +-1 -1 4 +-1 0.5 4 +-1 1 4 +0.5 1 4 +-2 2 2 +5 -5 4 +-4 4 4 +5 5 4 +4 -4 4 +-5 -5 4 +-4 -4 -4 +5 -5 -4 +4 4 -4 +-5 5 -4 +-5 5 4 +5 5 -4 +-5 -5 -4 +4 4 4 +4 -4 -2 +-4 -4 4 +-4 4 -2 +-4 4 -4 +4 4 -2 +4 -4 -4 +6 -6 2 +5 5 2 +-5 5 2 +6 6 2 +5 -5 2 +-5 -5 2 +-6 -6 2 +5 -5 -2 +-5 -5 -2 +6 -6 -2 +5 5 -2 +-5 5 -2 +-6 6 -2 +-4 -4 -2 +-6 6 2 +6 6 -2 +-6 -6 -2 +-2 -2 2 +-4 -4 2 +-4 4 2 +4 4 2 +4 -4 2 +2 -2 2 +2 2 2 +-2 2 4 +2 2 4 +2 -2 4 +-2 -2 4 +1 1 1 +1 -1 1 +-1 -1 1 +-1 1 1 +3 8 52 53 +3 54 55 45 +3 53 54 50 +3 0 1 53 +3 45 55 52 +3 53 51 8 +3 45 50 54 +3 50 51 53 +3 4 5 55 +3 52 8 45 +3 9 29 11 +3 29 9 32 +3 35 19 38 +3 19 35 15 +3 11 21 9 +3 11 10 21 +3 10 18 23 +3 18 10 11 +3 12 9 21 +3 23 9 12 +3 23 13 9 +3 13 23 18 +3 15 27 19 +3 15 14 27 +3 14 20 25 +3 20 14 15 +3 16 19 27 +3 25 19 16 +3 25 17 19 +3 17 25 20 +3 33 18 30 +3 18 33 13 +3 20 39 17 +3 39 20 36 +3 29 18 11 +3 18 29 30 +3 19 39 38 +3 39 19 17 +3 33 9 13 +3 9 33 32 +3 20 35 36 +3 35 20 15 +3 49 21 48 +3 21 49 12 +3 27 26 16 +3 26 27 22 +3 23 47 10 +3 47 23 46 +3 41 25 24 +3 25 41 14 +3 47 21 10 +3 21 47 48 +3 25 26 24 +3 26 25 16 +3 49 23 12 +3 23 49 46 +3 27 41 22 +3 41 27 14 +3 28 43 31 +3 43 28 37 +3 31 29 28 +3 31 30 29 +3 30 42 33 +3 42 30 31 +3 32 28 29 +3 33 28 32 +3 33 34 28 +3 34 33 42 +3 8 51 47 +3 50 46 49 +3 37 35 43 +3 37 36 35 +3 36 44 39 +3 44 36 37 +3 38 43 35 +3 39 43 38 +3 39 40 43 +3 40 39 44 +3 41 26 22 +3 26 41 24 +3 44 42 40 +3 42 44 34 +3 43 42 31 +3 42 43 40 +3 44 28 34 +3 28 44 37 +3 46 50 45 +3 46 45 47 +3 47 45 8 +3 48 47 51 +3 48 51 49 +3 49 51 50 +3 52 55 5 +3 52 7 53 +3 52 5 6 +3 53 7 0 +3 52 6 7 +3 54 53 1 +3 54 2 3 +3 54 1 2 +3 55 54 3 +3 55 3 4 +3 58 57 56 +3 59 56 7 +3 2 57 3 +3 0 56 1 +3 5 59 6 +3 56 59 58 +3 57 1 56 +3 57 2 1 +3 58 5 4 +3 7 56 0 +3 58 3 57 +3 4 3 58 +3 59 5 58 +3 7 6 59 + diff --git a/Nef_3/include/CGAL/Nef_polyhedron_3.h b/Nef_3/include/CGAL/Nef_polyhedron_3.h index 05ef4dea9234..7b129f9dda28 100644 --- a/Nef_3/include/CGAL/Nef_polyhedron_3.h +++ b/Nef_3/include/CGAL/Nef_polyhedron_3.h @@ -904,10 +904,11 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_rep& omit_vertex; int nov, nof; + bool hh; public: Find_holes(Unique_hash_map& omit_vertex_) - : omit_vertex(omit_vertex_), nov(0), nof(0) {} + : omit_vertex(omit_vertex_), nov(0), nof(0), hh(false) {} void visit(Halffacet_const_handle f) { ++nof; @@ -920,10 +921,11 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_repsource()->source()] = true; --nov; + hh=true; } } else if(fc.is_shalfloop()) { SHalfloop_const_handle sl(fc); - omit_vertex[sl->incident_sface()->center_vertex()]; + omit_vertex[sl->incident_sface()->center_vertex()] = true; --nov; } else CGAL_error_msg( "wrong handle type"); @@ -943,6 +945,63 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_rep& omit_vertex; + int norv, nof; + + public: + Nested_holes(Unique_hash_map& omit_vertex_) + : omit_vertex(omit_vertex_), norv(0), nof(0) {} + + void visit(Halffacet_const_handle f) { + Halffacet_cycle_const_iterator fc = f->facet_cycles_begin(); + CGAL_assertion(fc.is_shalfedge()); + + SHalfedge_around_facet_const_circulator sfc(fc), send(sfc); + bool all_in=true; + bool all_out=true; + CGAL_For_all(sfc, send) { + if (omit_vertex[sfc->source()->source()]) + all_in=false; + else + all_out=false; + } + if (!all_in && !all_out) + { + SHalfedge_around_facet_const_circulator sfc(fc), send(sfc); + ++nof; + CGAL_For_all(sfc, send) { + if (!omit_vertex[sfc->source()->source()]) + { + omit_vertex[sfc->source()->source()]=true; + ++norv; + } + } + } + if (all_in) + ++nof; + } + + void visit(Vertex_const_handle) {} + void visit(SFace_const_handle) {} + void visit(Halfedge_const_handle) {} + void visit(SHalfedge_const_handle) {} + void visit(SHalfloop_const_handle) {} + + int number_of_removed_vertices() const { + return norv; + } + + int number_of_facets() const { + return nof; + } }; class Add_vertices { @@ -1001,14 +1060,19 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_repsource()->source()]) return; - B.begin_facet(); + SHalfedge_around_facet_const_circulator hc_start(se); SHalfedge_around_facet_const_circulator hc_end(hc_start); + std::vector vids; CGAL_For_all(hc_start,hc_end) { - CGAL_NEF_TRACEN(" add vertex " << hc_start->source()->center_vertex()->point()); - B.add_vertex_to_facet(VI[hc_start->source()->center_vertex()]); + if (omit_vertex[hc_start->source()->center_vertex()]) + { + std::cout << "issue with " << se->source()->source()->point() << "\n"; + return; + } + vids.push_back(VI[hc_start->source()->center_vertex()]); } - B.end_facet(); + B.add_facet (vids.begin(), vids.end()); } void visit(SFace_const_handle) {} @@ -1033,11 +1097,29 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_rep B(hds, true); + // first mark vertices of holes of each halffacet as omitted. Find_holes F(omit_vertex); scd.visit_shell_objects(sf, F); + std::size_t nb_v = F.number_of_vertices(); + std::size_t nb_f = F.number_of_facets(); + + // then if a halffacet contains a vertex marked as omitted, all its vertices + // must be marked as such + if (F.holes_detected()) + { + while(true) + { + Nested_holes F2(omit_vertex); + scd.visit_shell_objects(sf, F2); + if (F2.number_of_removed_vertices()==0) break; + nb_v-=F2.number_of_removed_vertices(); + nb_f=F2.number_of_facets(); + } + } + - B.begin_surface(F.number_of_vertices(), - F.number_of_facets(), + B.begin_surface(nb_v, + nb_f, F.number_of_vertices()+F.number_of_facets()-2); Add_vertices A(B,omit_vertex, VI); From a82fb5088b4ad48cd01237b74a84cc6e230da6a6 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Fri, 30 Aug 2024 10:14:36 +0200 Subject: [PATCH 49/65] allow use of Rapidlasso Laslib as alternative to CGALs fork --- .../cmake/modules/CGAL_LASLIB_support.cmake | 4 +- .../Point_set_processing_3/CMakeLists.txt | 2 + .../write_las_example.cpp | 45 +++++++++ .../include/CGAL/IO/read_las_points.h | 6 +- .../include/CGAL/IO/write_las_points.h | 95 ++++++++++++------ .../test/Stream_support/CMakeLists.txt | 14 ++- .../Stream_support/data/colored_points.las | Bin 0 -> 397 bytes .../test/Stream_support/test_LAS.cpp | 63 ++++++++++++ 8 files changed, 196 insertions(+), 33 deletions(-) create mode 100644 Point_set_processing_3/examples/Point_set_processing_3/write_las_example.cpp create mode 100644 Stream_support/test/Stream_support/data/colored_points.las create mode 100644 Stream_support/test/Stream_support/test_LAS.cpp diff --git a/Installation/cmake/modules/CGAL_LASLIB_support.cmake b/Installation/cmake/modules/CGAL_LASLIB_support.cmake index 7c65da9ebf04..e541326fdd83 100644 --- a/Installation/cmake/modules/CGAL_LASLIB_support.cmake +++ b/Installation/cmake/modules/CGAL_LASLIB_support.cmake @@ -2,7 +2,7 @@ if(LASLIB_FOUND AND NOT TARGET CGAL::LASLIB_support) add_library(CGAL::LASLIB_support INTERFACE IMPORTED) set_target_properties(CGAL::LASLIB_support PROPERTIES INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB" - INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR};${LASZIP_INCLUDE_DIR}" - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR};${LASZIP_INCLUDE_DIR}" + INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "${LASLIB_LIBRARIES}") endif() diff --git a/Point_set_processing_3/examples/Point_set_processing_3/CMakeLists.txt b/Point_set_processing_3/examples/Point_set_processing_3/CMakeLists.txt index 0e684584b131..de0b1a236930 100644 --- a/Point_set_processing_3/examples/Point_set_processing_3/CMakeLists.txt +++ b/Point_set_processing_3/examples/Point_set_processing_3/CMakeLists.txt @@ -71,7 +71,9 @@ find_package(LASLIB) include(CGAL_LASLIB_support) if(TARGET CGAL::LASLIB_support) create_single_source_cgal_program("read_las_example.cpp") + create_single_source_cgal_program("write_las_example.cpp") target_link_libraries(read_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(write_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) else() message( STATUS diff --git a/Point_set_processing_3/examples/Point_set_processing_3/write_las_example.cpp b/Point_set_processing_3/examples/Point_set_processing_3/write_las_example.cpp new file mode 100644 index 000000000000..200d31cc7e48 --- /dev/null +++ b/Point_set_processing_3/examples/Point_set_processing_3/write_las_example.cpp @@ -0,0 +1,45 @@ +#include + +#include +#include +#include + +#include +#include +#include + +// types +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::FT FT; +typedef Kernel::Point_3 Point; +typedef std::array Color; +typedef std::pair PointWithColor; + +int main(int argc, char*argv[]) +{ + const char* fname = "colored_points.las"; + + std::ofstream os(fname, std::ios::binary); + + std::vector points; // store points + points.push_back(std::make_pair(Point(0, 0, 0), Color{ 65535, 0, 0, 0 })); + points.push_back(std::make_pair(Point(1, 0, 0), Color{ 0, 65535, 0, 0 })); + points.push_back(std::make_pair(Point(0, 1, 0), Color{ 0, 0, 65535, 0 })); + points.push_back(std::make_pair(Point(1, 1, 0), Color{ 0, 65535, 65535, 0 })); + points.push_back(std::make_pair(Point(1, 1, 1), Color{ 65535, 65535, 0, 0 })); + + // Writes a .las point set file with colors + if(!CGAL::IO::write_LAS_with_properties(os, points, + CGAL::IO::make_las_point_writer(CGAL::First_of_pair_property_map()), + std::make_tuple(CGAL::Second_of_pair_property_map(), + CGAL::IO::LAS_property::R(), + CGAL::IO::LAS_property::G(), + CGAL::IO::LAS_property::B(), + CGAL::IO::LAS_property::I()))) + { + std::cerr << "Error: cannot write file " << fname << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/Point_set_processing_3/include/CGAL/IO/read_las_points.h b/Point_set_processing_3/include/CGAL/IO/read_las_points.h index beb35f44355f..e7d70470ff13 100644 --- a/Point_set_processing_3/include/CGAL/IO/read_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/read_las_points.h @@ -44,7 +44,7 @@ # pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif -#define USE_AS_DLL +#define USE_AS_DLL 1 #include #undef USE_AS_DLL @@ -385,7 +385,11 @@ bool read_LAS_with_properties(std::istream& is, if(!is) return false; +#if LAS_TOOLS_VERSION <= 170805 LASreaderLAS lasreader; +#else + LASreaderLAS lasreader(nullptr); +#endif lasreader.open(is); while(lasreader.read_point()) diff --git a/Point_set_processing_3/include/CGAL/IO/write_las_points.h b/Point_set_processing_3/include/CGAL/IO/write_las_points.h index aa153ec4c443..661bdf86977d 100644 --- a/Point_set_processing_3/include/CGAL/IO/write_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/write_las_points.h @@ -84,41 +84,41 @@ make_las_point_writer(PointMap point_map) namespace internal { namespace LAS { - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::Intensity&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::Intensity&) { r.set_intensity(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Return_number&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Return_number&) { r.set_return_number(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Number_of_returns&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Number_of_returns&) { r.set_number_of_returns(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Scan_direction_flag&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Scan_direction_flag&) { r.set_scan_direction_flag(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Edge_of_flight_line&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Edge_of_flight_line&) { r.set_edge_of_flight_line(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Classification&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Classification&) { r.set_classification(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Synthetic_flag&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Synthetic_flag&) { r.set_synthetic_flag(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Keypoint_flag&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Keypoint_flag&) { r.set_keypoint_flag(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Withheld_flag&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Withheld_flag&) { r.set_withheld_flag(v); } - inline void output_value(LASpoint& r, const float& v, LAS_property::Scan_angle&) + inline void output_value(LASpoint& r, const float& v, const LAS_property::Scan_angle&) { r.set_scan_angle_rank(char(v)); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::User_data&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::User_data&) { r.set_user_data(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::Point_source_ID&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::Point_source_ID&) { r.set_point_source_ID(v); } - inline void output_value(LASpoint& r, const unsigned int& v, LAS_property::Deleted_flag&) + inline void output_value(LASpoint& r, const unsigned int& v, const LAS_property::Deleted_flag&) { r.set_deleted_flag(v); } - inline void output_value(LASpoint& r, const double& v, LAS_property::GPS_time&) + inline void output_value(LASpoint& r, const double& v, const LAS_property::GPS_time&) { r.set_gps_time(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::R&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::R&) { r.set_R(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::G&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::G&) { r.set_G(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::B&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::B&) { r.set_B(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::I&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::I&) { r.set_I(v); } template @@ -134,20 +134,57 @@ namespace LAS { output_value (point, get(current.first, *it), current.second); } + template + void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence) { + output_value(point, std::get(v), std::get(t)); + } + + template + void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence) { + output_value(point, std::get(v), std::get(t)); + output_tuple(point, v, t, std::index_sequence()); + } + template + typename PropertyMap, + typename ... T> void output_properties(LASpoint& point, - ForwardIterator it, - std::pair&& current, - NextPropertyHandler&& next, - PropertyHandler&& ... properties) + ForwardIterator it, + std::tuple&& current) { - output_value (point, get(current.first, *it), current.second); - output_properties (point, it, std::forward(next), - std::forward(properties)...); + output_tuple(point, get(std::get<0>(current), *it), std::tuple(), std::index_sequence_for{}); + } + + template + void output_properties(LASpoint& point, + ForwardIterator it, + std::pair&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) + { + output_value(point, get(current.first, *it), current.second); + output_properties(point, it, std::forward(next), + std::forward(properties)...); + } + + template + void output_properties(LASpoint& point, + ForwardIterator it, + std::tuple&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) + { + output_tuple(point, get(std::get<0>(current), *it), std::tuple(), std::index_sequence_for{}); + output_properties(point, it, std::forward(next), + std::forward(properties)...); } } // namespace LAS diff --git a/Stream_support/test/Stream_support/CMakeLists.txt b/Stream_support/test/Stream_support/CMakeLists.txt index ade4d2c88f8c..9c41b5b2dac3 100644 --- a/Stream_support/test/Stream_support/CMakeLists.txt +++ b/Stream_support/test/Stream_support/CMakeLists.txt @@ -13,6 +13,9 @@ find_library( NAMES 3MF DOC "Path to the lib3MF library") +find_package(LASLIB QUIET) +include(CGAL_LASLIB_support) + # create a target per cppfile file( GLOB cppfiles @@ -33,6 +36,15 @@ foreach(cppfile ${cppfiles}) ) endif() else() - create_single_source_cgal_program("${cppfile}") + if("${cppfile}" STREQUAL "test_LAS.cpp") + if(TARGET CGAL::LASLIB_support) + create_single_source_cgal_program("test_LAS.cpp") + target_link_libraries(test_LAS PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + else() + message(STATUS "NOTICE: Some tests require the LASlib library, and will not be compiled.") + endif() + else() + create_single_source_cgal_program("${cppfile}") + endif() endif() endforeach() diff --git a/Stream_support/test/Stream_support/data/colored_points.las b/Stream_support/test/Stream_support/data/colored_points.las new file mode 100644 index 0000000000000000000000000000000000000000..102aee9443e3685f2351986e4b253a9f6da7a3cd GIT binary patch literal 397 zcmeZq40dC{0vMUF2$C%HnBg&053>>jE077o=wRwKwHMraf_CUMx;hwtVSm~G|Nr0H z6U&FGgV3BP-2eYU-2W$MStEo|RRCqdYLHc-s{pA1nSn3|T?J4ct^%S8RRu_zfdK$t C+dcmP literal 0 HcmV?d00001 diff --git a/Stream_support/test/Stream_support/test_LAS.cpp b/Stream_support/test/Stream_support/test_LAS.cpp new file mode 100644 index 000000000000..555e80f533ab --- /dev/null +++ b/Stream_support/test/Stream_support/test_LAS.cpp @@ -0,0 +1,63 @@ +#include + +#include +#include + +#include +#include +#include + +// types +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::FT FT; +typedef Kernel::Point_3 Point; +typedef std::array Color; +typedef std::pair PointWithColor; + +int main(int argc, char* argv[]) +{ + std::ifstream is("data/colored_points.las"); + + // Reads a .las point set file with normal vectors and colors + std::vector points; // store points + if (!CGAL::IO::read_LAS_with_properties(is, std::back_inserter(points), + CGAL::IO::make_las_point_reader(CGAL::First_of_pair_property_map()), + std::make_tuple(CGAL::Second_of_pair_property_map(), + CGAL::Construct_array(), + CGAL::IO::LAS_property::R(), + CGAL::IO::LAS_property::G(), + CGAL::IO::LAS_property::B(), + CGAL::IO::LAS_property::I()))) + { + std::cerr << "Error: cannot read file data/colored_points.las" << std::endl; + return EXIT_FAILURE; + } + + CGAL_assertion(points.size() == 5); + CGAL_assertion(points[0].second[0] == 65535); + CGAL_assertion(points[0].second[1] == 0); + CGAL_assertion(points[0].second[2] == 0); + CGAL_assertion(points[0].second[3] == 0); + + CGAL_assertion(points[1].second[0] == 0); + CGAL_assertion(points[1].second[1] == 65535); + CGAL_assertion(points[1].second[2] == 0); + CGAL_assertion(points[1].second[3] == 0); + + CGAL_assertion(points[2].second[0] == 0); + CGAL_assertion(points[2].second[1] == 0); + CGAL_assertion(points[2].second[2] == 65535); + CGAL_assertion(points[2].second[3] == 0); + + CGAL_assertion(points[3].second[0] == 0); + CGAL_assertion(points[3].second[1] == 65535); + CGAL_assertion(points[3].second[2] == 65535); + CGAL_assertion(points[3].second[3] == 0); + + CGAL_assertion(points[4].second[0] == 65535); + CGAL_assertion(points[4].second[1] == 65535); + CGAL_assertion(points[4].second[2] == 0); + CGAL_assertion(points[4].second[3] == 0); + + return EXIT_SUCCESS; +} From ee4dbad0b3102d71db165b13712ac07a461c2508 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 28 Aug 2024 17:06:05 +0200 Subject: [PATCH 50/65] doc fix --- Ridges_3/doc/Ridges_3/Ridges_3.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Ridges_3/doc/Ridges_3/Ridges_3.txt b/Ridges_3/doc/Ridges_3/Ridges_3.txt index e6ef0d7877d0..3eacadc8a7a6 100644 --- a/Ridges_3/doc/Ridges_3/Ridges_3.txt +++ b/Ridges_3/doc/Ridges_3/Ridges_3.txt @@ -44,8 +44,8 @@ functions of the package are provided in Section \ref Ridges_3Examples. For a detailed introduction to ridges and related topics, the reader may consult -\cgalCite{cgal:hgygm-ttdpf-99},cgal:p-gd-01, as well as -the following survey article \cgalCite{cgal:cp-ssulc-05}. +\cgalCite{cgal:hgygm-ttdpf-99}, as well as +the survey article \cgalCite{cgal:cp-ssulc-05}. In the sequel, we just introduce the basic notions so as to explain our algorithms. Consider a smooth embedded surface, and denote \f$ k_1\f$ and \f$ k_2\f$ the principal curvatures, with \f$ k_1\geq k_2\f$. Umbilics are @@ -399,7 +399,7 @@ neighborhood. \subsection Ridges_3Exampleprogram Example Program The following program computes ridges and umbilics from an off -file.\cgalFootnote{Model data may be downloaded via ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/Ridges_3_datafiles.tgz . The mechanical part model has been provided courtesy of Dassault System to produce \cgalFigureRef{figmechanical_crest_filteredintro}, due to copyright issues the available model is not the same, it is provided by the AIM\@SHAPE Shape Repository.} It uses the package \ref PkgJetFitting3 to estimate the differential +file. It uses the package \ref PkgJetFitting3 to estimate the differential quantities. The default output file gives rough data for visualization purpose, a verbose output file may also be asked for. Parameters are @@ -536,7 +536,7 @@ Ridges on the ellipsoid, normals pointing outward. Color coding : of crest ridges on a mechanical model, and has been computed as follows: \code{.cpp} -./Compute_Ridges_Umbilics -f data/mecanic.off -d 4 -m 4 -a 4 -t 4 +./Compute_Ridges_Umbilics -f data/rocker-arm.off -d 4 -m 4 -a 4 -t 4 \endcode \cgalFigureBegin{figmechanical_crest_filteredintro,mecanic-sub1_crest-jpg.png} From 24ca2df2b38dc88e7c832a93b011ca02b728a64c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 15:35:47 +0200 Subject: [PATCH 51/65] do not mention data that does not exist --- Ridges_3/doc/Ridges_3/Ridges_3.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Ridges_3/doc/Ridges_3/Ridges_3.txt b/Ridges_3/doc/Ridges_3/Ridges_3.txt index 3eacadc8a7a6..90854893a013 100644 --- a/Ridges_3/doc/Ridges_3/Ridges_3.txt +++ b/Ridges_3/doc/Ridges_3/Ridges_3.txt @@ -533,11 +533,7 @@ Ridges on the ellipsoid, normals pointing outward. Color coding : \subsection Ridges_3ExampleFilteringofCrestRidgesona Example: Filtering of Crest Ridges on a Mechanical Part \cgalFigureRef{figmechanical_crest_filteredintro} illustrates the filtering -of crest ridges on a mechanical model, and has been computed as follows: - -\code{.cpp} -./Compute_Ridges_Umbilics -f data/rocker-arm.off -d 4 -m 4 -a 4 -t 4 -\endcode +of crest ridges on a mechanical model. \cgalFigureBegin{figmechanical_crest_filteredintro,mecanic-sub1_crest-jpg.png} Mechanical part (37k pts). Left: All crest lines. Middle: crests filtered From 04e90b7eb43d8457784df46ce956b4f2f6879397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 15:58:57 +0200 Subject: [PATCH 52/65] do not use empty variable --- Stream_support/test/Stream_support/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Stream_support/test/Stream_support/CMakeLists.txt b/Stream_support/test/Stream_support/CMakeLists.txt index 9c41b5b2dac3..a58a12410cc1 100644 --- a/Stream_support/test/Stream_support/CMakeLists.txt +++ b/Stream_support/test/Stream_support/CMakeLists.txt @@ -39,7 +39,7 @@ foreach(cppfile ${cppfiles}) if("${cppfile}" STREQUAL "test_LAS.cpp") if(TARGET CGAL::LASLIB_support) create_single_source_cgal_program("test_LAS.cpp") - target_link_libraries(test_LAS PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(test_LAS PRIVATE CGAL::LASLIB_support) else() message(STATUS "NOTICE: Some tests require the LASlib library, and will not be compiled.") endif() From 21f0f805c7a55a6908b8dec13d4c3feb6286b1aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 16:17:38 +0200 Subject: [PATCH 53/65] fix condition --- .../test/Point_set_processing_3/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt b/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt index 895fae529074..733ce26de22a 100644 --- a/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt +++ b/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt @@ -39,7 +39,7 @@ create_single_source_cgal_program( "structuring_test.cpp" ) #Use LAS #disable if MSVC 2017 -if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1910)) +if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910) find_package(LASLIB) include(CGAL_LASLIB_support) if (TARGET CGAL::LASLIB_support) From ce3e8ae0dea37bb15d285a47f5c4976cd494dfe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 16:23:27 +0200 Subject: [PATCH 54/65] update macro --- Point_set_processing_3/include/CGAL/IO/write_las_points.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Point_set_processing_3/include/CGAL/IO/write_las_points.h b/Point_set_processing_3/include/CGAL/IO/write_las_points.h index 661bdf86977d..22e93b232b98 100644 --- a/Point_set_processing_3/include/CGAL/IO/write_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/write_las_points.h @@ -38,7 +38,7 @@ # pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif -#define USE_AS_DLL +#define USE_AS_DLL 1 #include #include #include From b67bb2529dd093e714abc4a400bd0746c1e90473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Sep 2024 09:03:30 +0200 Subject: [PATCH 55/65] use assert in test --- .../test/Convex_decomposition_3/cd_nested_holes_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp b/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp index 3c69b2a5339e..37a3c68264fe 100644 --- a/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp +++ b/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp @@ -34,7 +34,7 @@ std::size_t run(std::string path) for (const Polyhedron_3& P : convex_parts) { // std::ofstream("out_"+std::to_string(i++)+".off") << std::setprecision(17) << P; - CGAL_assertion(P.size_of_vertices()!=0); + assert(P.size_of_vertices()!=0); } return convex_parts.size(); From 37218301bbfd6d9179a9eccf7a34a22a7331f2bf Mon Sep 17 00:00:00 2001 From: albert-github Date: Mon, 2 Sep 2024 12:32:30 +0200 Subject: [PATCH 56/65] Spelling corrections Spelling corrections --- .../include/CGAL/Test/_test_algebraic_structure.h | 2 +- .../Arrangement_on_surface_2/data/circle_segments/intersect | 2 +- Documentation/doc/biblio/geom.bib | 2 +- .../Square_border_parameterizer_3.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h index 56c421eee1f4..08412f96ea48 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h @@ -426,7 +426,7 @@ void test_algebraic_structure_intern( //commutative assert(a+b+c==c+b+a); assert(a*b*c==c*b*a); - //distributiv + //distributive assert((a-b)*c==a*c-b*c); assert((a+b)*c==a*c+b*c); //binom diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/circle_segments/intersect b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/circle_segments/intersect index b0e0bbe6a460..6a3783c9cfc6 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/circle_segments/intersect +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/circle_segments/intersect @@ -1,6 +1,6 @@ # Input is based on the curves and points indexes from intersect.pt # intersect.xcv. The first two numbers are the numbers of the input curves -# to be intersected. After that there is the number of intesections and +# to be intersected. After that there is the number of intersections and # 2-3 numbers representing each intersection. Meaning, the input is of the form: # intersect \ # [ \ diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index d6b9488ec1f6..ab364082bf86 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -92400,7 +92400,7 @@ @article{kd-pamm-82 @inproceedings{kn-afrmt-97 , author = "Yoshiyuki Kusakari and Takao Nishizeki" -, title = "An Algorithm for Finding a Region with the Minimum Total {$L_1$}-Distance from Prescibed Terminals" +, title = "An Algorithm for Finding a Region with the Minimum Total {$L_1$}-Distance from Prescribed Terminals" , booktitle = "Proc. 8th Annu. Internat. Sympos. Algorithms Comput." , nickname = "ISAAC '97" , site = "Singapore" diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h index cb97d65430ab..35c16dae10aa 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h @@ -234,7 +234,7 @@ class Square_border_parameterizer_3 // If the target is a corner vertex, we have the complete length of a side in 'len' // and we must "normalize" the previous entries if(get(vpmap, vt)) { - // If both extremeties of a segment are corners, offsets are already correct + // If both extremities of a segment are corners, offsets are already correct if(!get(vpmap, vs)) { CGAL_assertion(len != 0.0); double ld = 1.0 / len; From 93dd87c3ccb293235635ff043d0cf9b8fbbdfbfe Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 2 Sep 2024 17:51:06 +0200 Subject: [PATCH 57/65] simple fix to remove the segfault with Qt>=6.7 --- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 508444710add..01e8a68433d4 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -354,7 +354,6 @@ camera is manipulated) : main drawing method. Should be overloaded. \arg postDraw() : display of visual hints (world axis, FPS...) */ CGAL_INLINE_FUNCTION void CGAL::QGLViewer::paintGL() { - makeCurrent(); // Clears screen, set model view matrix... preDraw(); // Used defined method. Default calls draw() @@ -364,7 +363,6 @@ void CGAL::QGLViewer::paintGL() { draw(); // Add visual hints: axis, camera, grid... postDraw(); - doneCurrent(); Q_EMIT drawFinished(true); } From e791122b35571b00bbed673b70552615e2b68ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Sep 2024 09:59:02 +0200 Subject: [PATCH 58/65] handle cases when LASZIP and LASLIB have different include paths --- Installation/cmake/modules/FindLASLIB.cmake | 11 +++++++---- Installation/cmake/modules/UseLASLIB.cmake | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Installation/cmake/modules/FindLASLIB.cmake b/Installation/cmake/modules/FindLASLIB.cmake index 2353480c2452..9c557a6dce5b 100644 --- a/Installation/cmake/modules/FindLASLIB.cmake +++ b/Installation/cmake/modules/FindLASLIB.cmake @@ -9,14 +9,15 @@ # first look in user defined locations find_path(LASLIB_INCLUDE_DIR NAMES lasreader.hpp - PATHS /usr/local/include/LASlib/ + PATHS /usr/local/include/LASlib/ ENV LASLIB_INC_DIR ) - + find_path(LASZIP_INCLUDE_DIR NAMES mydefs.hpp PATHS /usr/local/include/LASzip/ ${LASLIB_INCLUDE_DIR}/../../LASzip/src + ${LASLIB_INCLUDE_DIR} ) find_library(LASLIB_LIBRARIES @@ -28,8 +29,10 @@ find_library(LASLIB_LIBRARIES ENV LASLIB_LIB_DIR ) -if(LASLIB_LIBRARIES AND LASLIB_INCLUDE_DIR) +if(LASLIB_LIBRARIES AND LASLIB_INCLUDE_DIR AND LASZIP_INCLUDE_DIR) + if (NOT ${LASLIB_INCLUDE_DIR} STREQUAL ${LASZIP_INCLUDE_DIR}) + list(APPEND LASLIB_INCLUDE_DIR ${LASZIP_INCLUDE_DIR}) + endif() set(LASLIB_FOUND TRUE) set(LASLIB_USE_FILE "UseLASLIB") endif() - diff --git a/Installation/cmake/modules/UseLASLIB.cmake b/Installation/cmake/modules/UseLASLIB.cmake index 1af7a023ceb0..f1ffb0bd9065 100644 --- a/Installation/cmake/modules/UseLASLIB.cmake +++ b/Installation/cmake/modules/UseLASLIB.cmake @@ -3,4 +3,4 @@ add_definitions(-DCGAL_LINKED_WITH_LASLIB) -message(DEPRECATION "This file UseLASLIB.cmake is deprecated, and the imported target `CGAL::TBB_support` from CGAL_LASLIB_support.cmake should be used instead.") +message(DEPRECATION "This file UseLASLIB.cmake is deprecated, and the imported target `CGAL::LASLIB_support` from CGAL_LASLIB_support.cmake should be used instead.") From cb78abd603526cb0af3f4f0b696e08470dc0bc2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Sep 2024 14:20:20 +0200 Subject: [PATCH 59/65] fixes for latest version of LAStools + be compatible with CONFIG mode provided CMAKE_FIND_PACKAGE_PREFER_CONFIG is set to TRUE --- .../cmake/modules/CGAL_LASLIB_support.cmake | 25 +++++++++++++------ Installation/cmake/modules/FindLASLIB.cmake | 11 ++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Installation/cmake/modules/CGAL_LASLIB_support.cmake b/Installation/cmake/modules/CGAL_LASLIB_support.cmake index e541326fdd83..e471c93f02b9 100644 --- a/Installation/cmake/modules/CGAL_LASLIB_support.cmake +++ b/Installation/cmake/modules/CGAL_LASLIB_support.cmake @@ -1,8 +1,19 @@ -if(LASLIB_FOUND AND NOT TARGET CGAL::LASLIB_support) - add_library(CGAL::LASLIB_support INTERFACE IMPORTED) - set_target_properties(CGAL::LASLIB_support PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB" - INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "${LASLIB_LIBRARIES}") +if(LASLIB_FOUND) + if (NOT TARGET CGAL::LASLIB_support) + if (NOT TARGET LASlib) + # message(STATUS "Found using MODULE mode") + add_library(CGAL::LASLIB_support INTERFACE IMPORTED) + set_target_properties(CGAL::LASLIB_support PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB" + INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${LASLIB_LIBRARIES}") + else() + # message(STATUS "Found using CONFIG mode") + add_library(CGAL::LASLIB_support INTERFACE IMPORTED) + set_target_properties(CGAL::LASLIB_support PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB") + target_link_libraries(CGAL::LASLIB_support INTERFACE LASlib) + endif() + endif() endif() diff --git a/Installation/cmake/modules/FindLASLIB.cmake b/Installation/cmake/modules/FindLASLIB.cmake index 9c557a6dce5b..00377657ee75 100644 --- a/Installation/cmake/modules/FindLASLIB.cmake +++ b/Installation/cmake/modules/FindLASLIB.cmake @@ -28,6 +28,17 @@ find_library(LASLIB_LIBRARIES ${LASLIB_INCLUDE_DIR}/../../lib ENV LASLIB_LIB_DIR ) +if (NOT LASLIB_LIBRARIES) + #library was renamed in recent versions of LAStools + find_library(LASLIB_LIBRARIES + NAMES LASlib + PATHS ENV LD_LIBRARY_PATH + ENV LIBRARY_PATH + /usr/local/lib + ${LASLIB_INCLUDE_DIR}/../../lib + ENV LASLIB_LIB_DIR + ) +endif() if(LASLIB_LIBRARIES AND LASLIB_INCLUDE_DIR AND LASZIP_INCLUDE_DIR) if (NOT ${LASLIB_INCLUDE_DIR} STREQUAL ${LASZIP_INCLUDE_DIR}) From b46e4359b1ca49926d5c682c46e7a9620a33b242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Sep 2024 15:52:51 +0200 Subject: [PATCH 60/65] make it work also for installed version --- Installation/cmake/modules/FindLASLIB.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Installation/cmake/modules/FindLASLIB.cmake b/Installation/cmake/modules/FindLASLIB.cmake index 00377657ee75..76c090e7edd8 100644 --- a/Installation/cmake/modules/FindLASLIB.cmake +++ b/Installation/cmake/modules/FindLASLIB.cmake @@ -17,6 +17,7 @@ find_path(LASZIP_INCLUDE_DIR NAMES mydefs.hpp PATHS /usr/local/include/LASzip/ ${LASLIB_INCLUDE_DIR}/../../LASzip/src + ${LASLIB_INCLUDE_DIR}/../LASzip ${LASLIB_INCLUDE_DIR} ) From d7601bc1325f855a89378c448418b95cdffdbd24 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Tue, 3 Sep 2024 16:01:37 +0200 Subject: [PATCH 61/65] update CMakeLists.txt condition for Visual Studio 2017 --- Point_set_3/test/Point_set_3/CMakeLists.txt | 6 +++--- .../test/Point_set_processing_3/CMakeLists.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Point_set_3/test/Point_set_3/CMakeLists.txt b/Point_set_3/test/Point_set_3/CMakeLists.txt index bb283d437711..82424d516a6f 100644 --- a/Point_set_3/test/Point_set_3/CMakeLists.txt +++ b/Point_set_3/test/Point_set_3/CMakeLists.txt @@ -32,7 +32,7 @@ create_single_source_cgal_program("test_deprecated_io_ps.cpp") #Use LAS #disable if MSVC 2017 -if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1910)) +if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910) find_package(LASLIB) include(CGAL_LASLIB_support) if (TARGET CGAL::LASLIB_support) @@ -41,5 +41,5 @@ if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1 message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") endif() else() - message(STATUS "NOTICE : the LAS reader does not work with Visual Studio 2017.") -endif() + message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") +endif() \ No newline at end of file diff --git a/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt b/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt index 733ce26de22a..4112a9e035aa 100644 --- a/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt +++ b/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt @@ -49,7 +49,7 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") endif() else() - message(STATUS "NOTICE : the LAS reader does not work with Visual Studio 2017.") + message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") endif() # Use Eigen From 1cf6fe884d965eb20c46b3b9adb50729b7292642 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Tue, 3 Sep 2024 16:05:37 +0200 Subject: [PATCH 62/65] missing end of line --- Point_set_3/test/Point_set_3/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Point_set_3/test/Point_set_3/CMakeLists.txt b/Point_set_3/test/Point_set_3/CMakeLists.txt index 82424d516a6f..75a8b79c7bf7 100644 --- a/Point_set_3/test/Point_set_3/CMakeLists.txt +++ b/Point_set_3/test/Point_set_3/CMakeLists.txt @@ -42,4 +42,4 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 endif() else() message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") -endif() \ No newline at end of file +endif() From a0276c9d74c033c970fb968c1db2c50536460246 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 4 Sep 2024 08:15:02 +0200 Subject: [PATCH 63/65] Update CHANGES.md Some changes for Mesh 3 are in the wrong place. --- Installation/CHANGES.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index a8ddd38c1a1c..04de99365db2 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -144,10 +144,6 @@ Release date: June 2024 to the [`GenericMap`](https://doc.cgal.org/6.0/Combinatorial_map/classGenericMap.html) concept, which enables users to insert an edge between two different faces in order to create faces with holes. -- Added new meshing criterion `edge_distance`, an upper bound for the distance from the edge to the 1D feature. -- **Breaking change**: the concept `MeshEdgeCriteria_3` was modified to include the new meshing criterion `edge_distance`. - - ### [Quadtrees, Octrees, and Orthtrees](https://doc.cgal.org/6.0/Manual/packages.html#PkgOrthtree) - **Breaking change**: @@ -225,6 +221,9 @@ Release date: June 2024 as well as the class `Triangle_accessor`. These were no longer used for several releases. - **Breaking change**: Removed the class templates `CGAL::Gray_image_mesh_domain_3`, `CGAL::Implicit_mesh_domain_3`, and `CGAL::Labeled_image_mesh_domain_3`, which were deprecated since CGAL-4.13. +- Added new meshing criterion `edge_distance`, an upper bound for the distance from the edge to the 1D feature. +- **Breaking change**: the concept `MeshEdgeCriteria_3` was modified to include the new meshing criterion `edge_distance`. + ### [3D Surface Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesher3) From e3b65d3c7557f00de8b7940bb48679fe27422844 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 4 Sep 2024 10:39:53 +0200 Subject: [PATCH 64/65] changing LAS_TOOLS_VERSION check to proper version --- Point_set_processing_3/include/CGAL/IO/read_las_points.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Point_set_processing_3/include/CGAL/IO/read_las_points.h b/Point_set_processing_3/include/CGAL/IO/read_las_points.h index e7d70470ff13..e22ffa59369e 100644 --- a/Point_set_processing_3/include/CGAL/IO/read_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/read_las_points.h @@ -385,7 +385,7 @@ bool read_LAS_with_properties(std::istream& is, if(!is) return false; -#if LAS_TOOLS_VERSION <= 170805 +#if LAS_TOOLS_VERSION < 240319 LASreaderLAS lasreader; #else LASreaderLAS lasreader(nullptr); From 248f648118ef437623da014571784d9b45b8c7d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 4 Sep 2024 15:11:37 +0200 Subject: [PATCH 65/65] do not doc internal variable --- Documentation/doc/Documentation/Third_party.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index eaafe426bddc..e012763b266e 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -98,8 +98,6 @@ solutions, and we recommend using one of them. The CMake variable `CGAL_CMAKE_EXACT_NT_BACKEND` can be used to select the library that will be used internally for multi precision number types. -The variable `CGAL_CMAKE_EXACT_NT_BACKEND-STRINGS` contains all the possible -values. \section secoptional3rdpartysoftware Optional Third Party Libraries