OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
MeshRepair.cpp File Reference
#include "MeshRepair.hpp"
#include "I18N.hpp"
#include "TriangleMesh.hpp"
#include <CGAL/AABB_face_graph_triangle_primitive.h>
#include <CGAL/AABB_traits_3.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/Bbox_3.h>
#include <CGAL/boost/graph/border.h>
#include <CGAL/boost/graph/helpers.h>
#include <CGAL/boost/graph/iterator.h>
#include <CGAL/box_intersection_d.h>
#include <CGAL/Box_intersection_d/Box_traits_d.h>
#include <CGAL/Box_intersection_d/Box_with_info_d.h>
#include <CGAL/Constrained_Delaunay_triangulation_2.h>
#include <CGAL/Constrained_triangulation_2.h>
#include <CGAL/Constrained_triangulation_face_base_2.h>
#include <CGAL/Default.h>
#include <CGAL/enum.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/exceptions.h>
#include <CGAL/global_functions_distance_3.h>
#include <CGAL/Kernel/global_functions_3.h>
#include <CGAL/Named_function_parameters.h>
#include <CGAL/number_utils.h>
#include <CGAL/Origin.h>
#include <CGAL/Polygon_mesh_processing/bbox.h>
#include <CGAL/Polygon_mesh_processing/connected_components.h>
#include <CGAL/Polygon_mesh_processing/internal/Snapping/snap.h>
#include <CGAL/Polygon_mesh_processing/manifoldness.h>
#include <CGAL/Polygon_mesh_processing/measure.h>
#include <CGAL/Polygon_mesh_processing/merge_border_vertices.h>
#include <CGAL/Polygon_mesh_processing/orient_polygon_soup.h>
#include <CGAL/Polygon_mesh_processing/orientation.h>
#include <CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h>
#include <CGAL/Polygon_mesh_processing/repair.h>
#include <CGAL/Polygon_mesh_processing/repair_degeneracies.h>
#include <CGAL/Polygon_mesh_processing/repair_self_intersections.h>
#include <CGAL/Polygon_mesh_processing/self_intersections.h>
#include <CGAL/Polygon_mesh_processing/stitch_borders.h>
#include <CGAL/Polygon_mesh_processing/triangulate_hole.h>
#include <CGAL/property_map.h>
#include <CGAL/Side_of_triangle_mesh.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Surface_mesh/Surface_mesh.h>
#include <CGAL/tags.h>
#include <CGAL/Triangulation_data_structure_2.h>
#include <CGAL/Triangulation_face_base_with_info_2.h>
#include <CGAL/Triangulation_vertex_base_with_info_2.h>
#include <boost/log/trivial.hpp>
#include <tbb/blocked_range.h>
#include <tbb/parallel_for.h>
#include <tbb/parallel_sort.h>
#include <algorithm>
#include <array>
#include <cmath>
#include <cstddef>
#include <cstdint>
#include <exception>
#include <functional>
#include <iterator>
#include <map>
#include <memory>
#include <numeric>
#include <set>
#include <string>
#include <tuple>
#include <utility>
#include <vector>

Go to the source code of this file.

Classes

class  Slic3r::anonymous_namespace{MeshRepair.cpp}::UnionFind
struct  Slic3r::anonymous_namespace{MeshRepair.cpp}::EdgeUse
struct  Slic3r::anonymous_namespace{MeshRepair.cpp}::SoupTopology
struct  Slic3r::anonymous_namespace{MeshRepair.cpp}::BorderLoop
struct  Slic3r::anonymous_namespace{MeshRepair.cpp}::CdtFaceInfo
struct  Slic3r::anonymous_namespace{MeshRepair.cpp}::UnitResult

Namespaces

namespace  Slic3r
 |/ Copyright (c) Prusa Research 2020 - 2023 Enrico Turri @enricoturri1966 |/ |/ PrusaSlicer is released under the terms of the AGPLv3 or higher |/
namespace  Slic3r::anonymous_namespace{MeshRepair.cpp}

Typedefs

using Slic3r::anonymous_namespace{MeshRepair.cpp}::Kernel = CGAL::Exact_predicates_inexact_constructions_kernel
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Point = Kernel::Point_3
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Vector = Kernel::Vector_3
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Mesh = CGAL::Surface_mesh<Point>
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Vertex = Mesh::Vertex_index
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Halfedge = Mesh::Halfedge_index
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Face = Mesh::Face_index
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Triangle = std::array<std::size_t, 3>
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Tree = CGAL::AABB_tree<CGAL::AABB_traits_3<Kernel, CGAL::AABB_face_graph_triangle_primitive<Mesh>>>
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Box = CGAL::Box_intersection_d::Box_with_info_d<double, 3, std::size_t>
using Slic3r::anonymous_namespace{MeshRepair.cpp}::CdtVb = CGAL::Triangulation_vertex_base_with_info_2<Vertex, Kernel>
using Slic3r::anonymous_namespace{MeshRepair.cpp}::CdtFb = CGAL::Constrained_triangulation_face_base_2<Kernel, CGAL::Triangulation_face_base_with_info_2<CdtFaceInfo, Kernel>>
using Slic3r::anonymous_namespace{MeshRepair.cpp}::Cdt = CGAL::Constrained_Delaunay_triangulation_2<Kernel, CGAL::Triangulation_data_structure_2<CdtVb, CdtFb>, CGAL::No_constraint_intersection_tag>

Functions

template<class Container, class Mask>
void Slic3r::anonymous_namespace{MeshRepair.cpp}::erase_marked (Container &items, const Mask &marked)
template<class Fn>
void Slic3r::anonymous_namespace{MeshRepair.cpp}::parallel_for_each (std::size_t n, Fn &&fn)
UnionFind Slic3r::anonymous_namespace{MeshRepair.cpp}::connect_vertices (std::size_t num_points, const std::vector< Triangle > &triangles)
bool Slic3r::anonymous_namespace{MeshRepair.cpp}::bbox_contains (const CGAL::Bbox_3 &outer, const CGAL::Bbox_3 &inner, double tolerance=0.)
std::vector< std::pair< std::size_t, std::size_t > > Slic3r::anonymous_namespace{MeshRepair.cpp}::overlapping_boxes (std::vector< Box > &boxes)
double Slic3r::anonymous_namespace{MeshRepair.cpp}::bbox_diagonal (const std::vector< Point > &points)
std::vector< EdgeUse > Slic3r::anonymous_namespace{MeshRepair.cpp}::sorted_edge_uses (const std::vector< Triangle > &triangles)
template<class Fn>
void Slic3r::anonymous_namespace{MeshRepair.cpp}::for_each_edge (const std::vector< EdgeUse > &uses, Fn &&fn)
bool Slic3r::anonymous_namespace{MeshRepair.cpp}::same_direction (const std::vector< Triangle > &triangles, const EdgeUse &e1, const EdgeUse &e2)
SoupTopology Slic3r::anonymous_namespace{MeshRepair.cpp}::analyze_topology (std::size_t num_points, const std::vector< Triangle > &triangles)
void Slic3r::anonymous_namespace{MeshRepair.cpp}::orient_with_cgal (std::vector< Point > &points, std::vector< Triangle > &triangles)
void Slic3r::anonymous_namespace{MeshRepair.cpp}::extract_group (const std::vector< Point > &points, const std::vector< Triangle > &triangles, const std::vector< std::size_t > &group, std::vector< Point > &group_points, std::vector< Triangle > &group_triangles)
std::vector< Mesh > Slic3r::anonymous_namespace{MeshRepair.cpp}::soup_to_meshes (const std::vector< Point > &points, const std::vector< Triangle > &triangles, const std::vector< std::vector< std::size_t > > &groups, bool known_valid)
std::vector< Mesh > Slic3r::anonymous_namespace{MeshRepair.cpp}::split_shells (Mesh &mesh)
std::vector< Mesh > Slic3r::anonymous_namespace{MeshRepair.cpp}::take_closed_shells (const std::vector< Point > &points, std::vector< Triangle > &triangles)
void Slic3r::anonymous_namespace{MeshRepair.cpp}::remove_duplicate_triangles (std::size_t num_points, std::vector< Triangle > &triangles)
void Slic3r::anonymous_namespace{MeshRepair.cpp}::clean_soup (std::vector< Point > &points, std::vector< Triangle > &triangles)
std::size_t Slic3r::anonymous_namespace{MeshRepair.cpp}::weld_border_vertices (const std::vector< Point > &points, std::vector< Triangle > &triangles, const std::vector< std::size_t > &border, double tolerance)
bool Slic3r::anonymous_namespace{MeshRepair.cpp}::orient_soup (std::vector< Point > &points, std::vector< Triangle > &triangles, std::size_t &reversed_parts)
std::size_t Slic3r::anonymous_namespace{MeshRepair.cpp}::keep_input_orientation (Mesh &mesh, const std::vector< Point > &points_before, const std::vector< Triangle > &triangles_before, const std::vector< Point > &points, const std::vector< Triangle > &triangles)
void Slic3r::anonymous_namespace{MeshRepair.cpp}::close_cracks (Mesh &mesh, double tolerance)
void Slic3r::anonymous_namespace{MeshRepair.cpp}::mark_nesting (Cdt &cdt)
bool Slic3r::anonymous_namespace{MeshRepair.cpp}::fill_planar_region (Mesh &mesh, const std::vector< const BorderLoop * > &loops)
void Slic3r::anonymous_namespace{MeshRepair.cpp}::fill_with_fan (Mesh &mesh, const BorderLoop &loop)
std::size_t Slic3r::anonymous_namespace{MeshRepair.cpp}::fill_holes (Mesh &mesh, double tolerance)
double Slic3r::anonymous_namespace{MeshRepair.cpp}::signed_volume (const Mesh &mesh)
std::size_t Slic3r::anonymous_namespace{MeshRepair.cpp}::remove_local_self_intersections (Mesh &shell)
bool Slic3r::anonymous_namespace{MeshRepair.cpp}::surfaces_intersect (const Mesh &mesh, const Tree &other)
Point Slic3r::anonymous_namespace{MeshRepair.cpp}::inner_sample (const Mesh &shell)
void Slic3r::anonymous_namespace{MeshRepair.cpp}::resolve_shells (std::vector< Mesh > &shells, MeshRepairStats &stats, const std::function< void(int)> &progress)
std::vector< std::vector< std::size_t > > Slic3r::anonymous_namespace{MeshRepair.cpp}::soup_units (const std::vector< Point > &points, const std::vector< Triangle > &triangles, const SoupTopology &topology, double tolerance)
UnitResult Slic3r::anonymous_namespace{MeshRepair.cpp}::repair_unit (const std::vector< Point > &points, const std::vector< Triangle > &triangles, const std::vector< std::size_t > &faces, const SoupTopology &topology, double tolerance)
bool Slic3r::anonymous_namespace{MeshRepair.cpp}::repair_soup (std::vector< Point > &points, std::vector< Triangle > &triangles, std::vector< Mesh > &shells, MeshRepairStats &stats, const std::function< void(int)> &progress)
bool Slic3r::anonymous_namespace{MeshRepair.cpp}::repair_its (const indexed_triangle_set &its, indexed_triangle_set &result, MeshRepairStats &stats, const std::function< void(int)> &progress)
bool Slic3r::repair_mesh (TriangleMesh &mesh, MeshRepairStats *stats_out, std::string *error, const std::function< void(int)> &progress)

Variables

constexpr std::size_t Slic3r::anonymous_namespace{MeshRepair.cpp}::NONE = std::size_t(-1)

Class Documentation

◆ Slic3r::anonymous_namespace{MeshRepair.cpp}::SoupTopology

struct Slic3r::anonymous_namespace{MeshRepair.cpp}::SoupTopology
Collaboration diagram for Slic3r::anonymous_namespace{MeshRepair.cpp}::SoupTopology:
Class Members
vector< char > bad_face
vector< size_t > border
vector< char > open_face
double open_fraction = 0.
vector< char > pinched

◆ Slic3r::anonymous_namespace{MeshRepair.cpp}::BorderLoop

struct Slic3r::anonymous_namespace{MeshRepair.cpp}::BorderLoop
Collaboration diagram for Slic3r::anonymous_namespace{MeshRepair.cpp}::BorderLoop:
Class Members
Bbox_3 bbox
Halfedge halfedge
vector< Halfedge > halfedges
Vector normal
double offset = 0.
bool planar = false

◆ Slic3r::anonymous_namespace{MeshRepair.cpp}::CdtFaceInfo

struct Slic3r::anonymous_namespace{MeshRepair.cpp}::CdtFaceInfo
Class Members
int nesting = -1

◆ Slic3r::anonymous_namespace{MeshRepair.cpp}::UnitResult

struct Slic3r::anonymous_namespace{MeshRepair.cpp}::UnitResult
Collaboration diagram for Slic3r::anonymous_namespace{MeshRepair.cpp}::UnitResult:
Class Members
bool closed = true
size_t filled = 0
size_t reversed = 0
vector< Mesh > shells