mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-16 08:55:57 +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;
|
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(
|
static std::unique_ptr<ArrangeableToItemConverter> create(
|
||||||
ArrangeSettingsView::GeometryHandling geometry_handling,
|
ArrangeSettingsView::GeometryHandling geometry_handling,
|
||||||
coord_t safety_d);
|
coord_t safety_d);
|
||||||
@ -120,11 +124,19 @@ template<class ArrItem>
|
|||||||
class BasicItemConverter : public ArrangeableToItemConverter<ArrItem>
|
class BasicItemConverter : public ArrangeableToItemConverter<ArrItem>
|
||||||
{
|
{
|
||||||
coord_t m_safety_d;
|
coord_t m_safety_d;
|
||||||
|
coord_t m_simplify_tol;
|
||||||
|
|
||||||
public:
|
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 safety_dist() const noexcept { return m_safety_d; }
|
||||||
|
|
||||||
|
coord_t simplification_tolerance() const override
|
||||||
|
{
|
||||||
|
return m_simplify_tol;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class ArrItem>
|
template<class ArrItem>
|
||||||
@ -231,6 +243,18 @@ double get_fit_into_bed_rotation(const ArrItem &itm, const RectangleBed &bed)
|
|||||||
return ret;
|
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
|
}} // namespace Slic3r::arr2
|
||||||
|
|
||||||
#endif // ARRANGE2_HPP
|
#endif // ARRANGE2_HPP
|
||||||
|
@ -416,12 +416,22 @@ ArrItem AdvancedItemConverter<ArrItem>::get_arritem(const Arrangeable &arrbl,
|
|||||||
|
|
||||||
auto outline = arrbl.full_outline();
|
auto outline = arrbl.full_outline();
|
||||||
auto envelope = arrbl.full_envelope();
|
auto envelope = arrbl.full_envelope();
|
||||||
|
|
||||||
if (infl != 0) {
|
if (infl != 0) {
|
||||||
outline = offset_ex(outline, infl);
|
outline = offset_ex(outline, infl);
|
||||||
if (! envelope.empty())
|
if (! envelope.empty())
|
||||||
envelope = offset_ex(envelope, infl);
|
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;
|
ArrItem ret;
|
||||||
set_shape(ret, outline);
|
set_shape(ret, outline);
|
||||||
if (! envelope.empty())
|
if (! envelope.empty())
|
||||||
@ -448,15 +458,17 @@ ArrangeableToItemConverter<ArrItem>::create(
|
|||||||
{
|
{
|
||||||
std::unique_ptr<ArrangeableToItemConverter<ArrItem>> ret;
|
std::unique_ptr<ArrangeableToItemConverter<ArrItem>> ret;
|
||||||
|
|
||||||
|
constexpr coord_t SimplifyTol = scaled(.2);
|
||||||
|
|
||||||
switch(gh) {
|
switch(gh) {
|
||||||
case arr2::ArrangeSettingsView::ghConvex:
|
case arr2::ArrangeSettingsView::ghConvex:
|
||||||
ret = std::make_unique<ConvexItemConverter<ArrItem>>(safety_d);
|
ret = std::make_unique<ConvexItemConverter<ArrItem>>(safety_d);
|
||||||
break;
|
break;
|
||||||
case arr2::ArrangeSettingsView::ghBalanced:
|
case arr2::ArrangeSettingsView::ghBalanced:
|
||||||
ret = std::make_unique<BalancedItemConverter<ArrItem>>(safety_d);
|
ret = std::make_unique<BalancedItemConverter<ArrItem>>(safety_d, SimplifyTol);
|
||||||
break;
|
break;
|
||||||
case arr2::ArrangeSettingsView::ghAdvanced:
|
case arr2::ArrangeSettingsView::ghAdvanced:
|
||||||
ret = std::make_unique<AdvancedItemConverter<ArrItem>>(safety_d);
|
ret = std::make_unique<AdvancedItemConverter<ArrItem>>(safety_d, SimplifyTol);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
|
@ -114,8 +114,7 @@ Vec2crd DecomposedShape::centroid() const
|
|||||||
|
|
||||||
DecomposedShape decompose(const ExPolygons &shape)
|
DecomposedShape decompose(const ExPolygons &shape)
|
||||||
{
|
{
|
||||||
ExPolygons shape_s = expolygons_simplify(shape, scaled(.2));
|
return DecomposedShape{convex_decomposition_tess(shape)};
|
||||||
return DecomposedShape{convex_decomposition_tess(shape_s)};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DecomposedShape decompose(const Polygon &shape)
|
DecomposedShape decompose(const Polygon &shape)
|
||||||
@ -126,9 +125,7 @@ DecomposedShape decompose(const Polygon &shape)
|
|||||||
if (is_convex) {
|
if (is_convex) {
|
||||||
convex_shapes.emplace_back(shape);
|
convex_shapes.emplace_back(shape);
|
||||||
} else {
|
} else {
|
||||||
Polygon shape_s = shape;
|
convex_shapes = convex_decomposition_tess(shape);
|
||||||
shape_s.simplify(scaled(.2));
|
|
||||||
convex_shapes = convex_decomposition_tess(shape_s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return DecomposedShape{std::move(convex_shapes)};
|
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->settings.set_from(sc.settings());
|
||||||
|
|
||||||
task->bed = sc.bed();
|
task->bed = get_corrected_bed(sc.bed(), converter);
|
||||||
|
|
||||||
extract_selected(*task, sc.model(), 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->settings.set_from(sc.settings());
|
||||||
|
|
||||||
task->bed = sc.bed();
|
task->bed = get_corrected_bed(sc.bed(), converter);
|
||||||
|
|
||||||
extract(*task, sc, converter);
|
extract(*task, sc, converter);
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ std::unique_ptr<MultiplySelectionTask<ArrItem>> MultiplySelectionTask<ArrItem>::
|
|||||||
|
|
||||||
task.settings.set_from(scene.settings());
|
task.settings.set_from(scene.settings());
|
||||||
|
|
||||||
task.bed = scene.bed();
|
task.bed = get_corrected_bed(scene.bed(), itm_conv);
|
||||||
|
|
||||||
task.prototype_item = {};
|
task.prototype_item = {};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user