Addressing problem with items slightly out of bed due to simplification

solves SPE-1824
This commit is contained in:
tamasmeszaros 2023-08-09 17:27:43 +02:00
parent b2a2710128
commit eae9a76249
6 changed files with 44 additions and 11 deletions

View File

@ -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

View File

@ -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:
; ;

View File

@ -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)};

View File

@ -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);

View File

@ -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);

View File

@ -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 = {};