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;
// 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

View File

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

View File

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

View File

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

View File

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

View File

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