mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 13:25:56 +08:00
Addressing problem with items slightly out of bed due to simplification
solves SPE-1824
This commit is contained in:
parent
b2a2710128
commit
eae9a76249
@ -90,6 +90,10 @@ public:
|
||||
|
||||
virtual ArrItem convert(const Arrangeable &arrbl, coord_t offs = 0) const = 0;
|
||||
|
||||
// Returns the extent of simplification that the converter utilizes when
|
||||
// creating arrange items. Zero shall mean no simplification at all.
|
||||
virtual coord_t simplification_tolerance() const { return 0; }
|
||||
|
||||
static std::unique_ptr<ArrangeableToItemConverter> create(
|
||||
ArrangeSettingsView::GeometryHandling geometry_handling,
|
||||
coord_t safety_d);
|
||||
@ -120,11 +124,19 @@ template<class ArrItem>
|
||||
class BasicItemConverter : public ArrangeableToItemConverter<ArrItem>
|
||||
{
|
||||
coord_t m_safety_d;
|
||||
coord_t m_simplify_tol;
|
||||
|
||||
public:
|
||||
BasicItemConverter(coord_t safety_d = 0) : m_safety_d{safety_d} {}
|
||||
BasicItemConverter(coord_t safety_d = 0, coord_t simpl_tol = 0)
|
||||
: m_safety_d{safety_d}, m_simplify_tol{simpl_tol}
|
||||
{}
|
||||
|
||||
coord_t safety_dist() const noexcept { return m_safety_d; }
|
||||
|
||||
coord_t simplification_tolerance() const override
|
||||
{
|
||||
return m_simplify_tol;
|
||||
}
|
||||
};
|
||||
|
||||
template<class ArrItem>
|
||||
@ -231,6 +243,18 @@ double get_fit_into_bed_rotation(const ArrItem &itm, const RectangleBed &bed)
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<class ArrItem>
|
||||
auto get_corrected_bed(const ExtendedBed &bed,
|
||||
const ArrangeableToItemConverter<ArrItem> &converter)
|
||||
{
|
||||
auto bedcpy = bed;
|
||||
visit_bed([tol = -converter.simplification_tolerance()](auto &rawbed) {
|
||||
rawbed = offset(rawbed, tol);
|
||||
}, bedcpy);
|
||||
|
||||
return bedcpy;
|
||||
}
|
||||
|
||||
}} // namespace Slic3r::arr2
|
||||
|
||||
#endif // ARRANGE2_HPP
|
||||
|
@ -416,12 +416,22 @@ ArrItem AdvancedItemConverter<ArrItem>::get_arritem(const Arrangeable &arrbl,
|
||||
|
||||
auto outline = arrbl.full_outline();
|
||||
auto envelope = arrbl.full_envelope();
|
||||
|
||||
if (infl != 0) {
|
||||
outline = offset_ex(outline, infl);
|
||||
if (! envelope.empty())
|
||||
envelope = offset_ex(envelope, infl);
|
||||
}
|
||||
|
||||
auto simpl_tol = static_cast<double>(this->simplification_tolerance());
|
||||
|
||||
if (simpl_tol > 0)
|
||||
{
|
||||
outline = expolygons_simplify(outline, simpl_tol);
|
||||
if (!envelope.empty())
|
||||
envelope = expolygons_simplify(envelope, simpl_tol);
|
||||
}
|
||||
|
||||
ArrItem ret;
|
||||
set_shape(ret, outline);
|
||||
if (! envelope.empty())
|
||||
@ -448,15 +458,17 @@ ArrangeableToItemConverter<ArrItem>::create(
|
||||
{
|
||||
std::unique_ptr<ArrangeableToItemConverter<ArrItem>> ret;
|
||||
|
||||
constexpr coord_t SimplifyTol = scaled(.2);
|
||||
|
||||
switch(gh) {
|
||||
case arr2::ArrangeSettingsView::ghConvex:
|
||||
ret = std::make_unique<ConvexItemConverter<ArrItem>>(safety_d);
|
||||
break;
|
||||
case arr2::ArrangeSettingsView::ghBalanced:
|
||||
ret = std::make_unique<BalancedItemConverter<ArrItem>>(safety_d);
|
||||
ret = std::make_unique<BalancedItemConverter<ArrItem>>(safety_d, SimplifyTol);
|
||||
break;
|
||||
case arr2::ArrangeSettingsView::ghAdvanced:
|
||||
ret = std::make_unique<AdvancedItemConverter<ArrItem>>(safety_d);
|
||||
ret = std::make_unique<AdvancedItemConverter<ArrItem>>(safety_d, SimplifyTol);
|
||||
break;
|
||||
default:
|
||||
;
|
||||
|
@ -114,8 +114,7 @@ Vec2crd DecomposedShape::centroid() const
|
||||
|
||||
DecomposedShape decompose(const ExPolygons &shape)
|
||||
{
|
||||
ExPolygons shape_s = expolygons_simplify(shape, scaled(.2));
|
||||
return DecomposedShape{convex_decomposition_tess(shape_s)};
|
||||
return DecomposedShape{convex_decomposition_tess(shape)};
|
||||
}
|
||||
|
||||
DecomposedShape decompose(const Polygon &shape)
|
||||
@ -126,9 +125,7 @@ DecomposedShape decompose(const Polygon &shape)
|
||||
if (is_convex) {
|
||||
convex_shapes.emplace_back(shape);
|
||||
} else {
|
||||
Polygon shape_s = shape;
|
||||
shape_s.simplify(scaled(.2));
|
||||
convex_shapes = convex_decomposition_tess(shape_s);
|
||||
convex_shapes = convex_decomposition_tess(shape);
|
||||
}
|
||||
|
||||
return DecomposedShape{std::move(convex_shapes)};
|
||||
|
@ -47,7 +47,7 @@ std::unique_ptr<ArrangeTask<ArrItem>> ArrangeTask<ArrItem>::create(
|
||||
|
||||
task->settings.set_from(sc.settings());
|
||||
|
||||
task->bed = sc.bed();
|
||||
task->bed = get_corrected_bed(sc.bed(), converter);
|
||||
|
||||
extract_selected(*task, sc.model(), converter);
|
||||
|
||||
|
@ -124,7 +124,7 @@ std::unique_ptr<FillBedTask<ArrItem>> FillBedTask<ArrItem>::create(
|
||||
|
||||
task->settings.set_from(sc.settings());
|
||||
|
||||
task->bed = sc.bed();
|
||||
task->bed = get_corrected_bed(sc.bed(), converter);
|
||||
|
||||
extract(*task, sc, converter);
|
||||
|
||||
|
@ -15,7 +15,7 @@ std::unique_ptr<MultiplySelectionTask<ArrItem>> MultiplySelectionTask<ArrItem>::
|
||||
|
||||
task.settings.set_from(scene.settings());
|
||||
|
||||
task.bed = scene.bed();
|
||||
task.bed = get_corrected_bed(scene.bed(), itm_conv);
|
||||
|
||||
task.prototype_item = {};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user