mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-02 18:10:41 +08:00

This new implementation should resolve several types of artifacts with multi-material segmentation. It should also increase the precision of projection, so sliced models should be much closer to how they were painted. Also, the slicing of painted models should be faster than before.
61 lines
1.6 KiB
C++
61 lines
1.6 KiB
C++
///|/ Copyright (c) Prusa Research 2021 Lukáš Hejl @hejllukas, Vojtěch Bubník @bubnikv
|
|
///|/
|
|
///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher
|
|
///|/
|
|
#ifndef slic3r_MultiMaterialSegmentation_hpp_
|
|
#define slic3r_MultiMaterialSegmentation_hpp_
|
|
|
|
#include <boost/polygon/polygon.hpp>
|
|
#include <utility>
|
|
#include <vector>
|
|
#include <functional>
|
|
|
|
#include "libslic3r/ExPolygon.hpp"
|
|
#include "libslic3r/Line.hpp"
|
|
#include "libslic3r/Point.hpp"
|
|
#include "libslic3r/libslic3r.h"
|
|
|
|
namespace Slic3r {
|
|
|
|
class PrintObject;
|
|
class ExPolygon;
|
|
|
|
using ExPolygons = std::vector<ExPolygon>;
|
|
|
|
struct ColoredLine
|
|
{
|
|
Line line;
|
|
int color;
|
|
int poly_idx = -1;
|
|
int local_line_idx = -1;
|
|
};
|
|
|
|
using ColoredLines = std::vector<ColoredLine>;
|
|
|
|
// Returns MMU segmentation based on painting in MMU segmentation gizmo
|
|
std::vector<std::vector<ExPolygons>> multi_material_segmentation_by_painting(const PrintObject &print_object, const std::function<void()> &throw_on_cancel_callback);
|
|
|
|
BoundingBox get_extents(const std::vector<ColoredLines> &colored_polygons);
|
|
|
|
} // namespace Slic3r
|
|
|
|
namespace boost::polygon {
|
|
template<> struct geometry_concept<Slic3r::ColoredLine>
|
|
{
|
|
typedef segment_concept type;
|
|
};
|
|
|
|
template<> struct segment_traits<Slic3r::ColoredLine>
|
|
{
|
|
typedef coord_t coordinate_type;
|
|
typedef Slic3r::Point point_type;
|
|
|
|
static inline point_type get(const Slic3r::ColoredLine &line, const direction_1d &dir)
|
|
{
|
|
return dir.to_int() ? line.line.b : line.line.a;
|
|
}
|
|
};
|
|
} // namespace boost::polygon
|
|
|
|
#endif // slic3r_MultiMaterialSegmentation_hpp_
|