57 lines
2.8 KiB
C++
57 lines
2.8 KiB
C++
//Copyright (c) 2022 Ultimaker B.V.
|
|
//CuraEngine is released under the terms of the AGPLv3 or higher.
|
|
|
|
#ifndef REDISTRIBUTE_DISTRIBUTED_BEADING_STRATEGY_H
|
|
#define REDISTRIBUTE_DISTRIBUTED_BEADING_STRATEGY_H
|
|
|
|
#include "BeadingStrategy.hpp"
|
|
|
|
namespace Slic3r::Arachne
|
|
{
|
|
/*!
|
|
* A meta-beading-strategy that takes outer and inner wall widths into account.
|
|
*
|
|
* The outer wall will try to keep a constant width by only applying the beading strategy on the inner walls. This
|
|
* ensures that this outer wall doesn't react to changes happening to inner walls. It will limit print artifacts on
|
|
* the surface of the print. Although this strategy technically deviates from the original philosophy of the paper.
|
|
* It will generally results in better prints because of a smoother motion and less variation in extrusion width in
|
|
* the outer walls.
|
|
*
|
|
* If the thickness of the model is less then two times the optimal outer wall width and once the minimum inner wall
|
|
* width it will keep the minimum inner wall at a minimum constant and vary the outer wall widths symmetrical. Until
|
|
* The thickness of the model is that of at least twice the optimal outer wall width it will then use two
|
|
* symmetrical outer walls only. Until it transitions into a single outer wall. These last scenario's are always
|
|
* symmetrical in nature, disregarding the user specified strategy.
|
|
*/
|
|
class RedistributeBeadingStrategy : public BeadingStrategy
|
|
{
|
|
public:
|
|
/*!
|
|
* /param optimal_width_outer Outer wall width, guaranteed to be the actual (save rounding errors) at a
|
|
* bead count if the parent strategies' optimum bead width is a weighted
|
|
* average of the outer and inner walls at that bead count.
|
|
* /param minimum_variable_line_ratio Minimum factor that the variable line might deviate from the optimal width.
|
|
*/
|
|
RedistributeBeadingStrategy(coord_t optimal_width_outer, double minimum_variable_line_ratio, BeadingStrategyPtr parent);
|
|
|
|
~RedistributeBeadingStrategy() override = default;
|
|
|
|
Beading compute(coord_t thickness, coord_t bead_count) const override;
|
|
|
|
coord_t getOptimalThickness(coord_t bead_count) const override;
|
|
coord_t getTransitionThickness(coord_t lower_bead_count) const override;
|
|
coord_t getOptimalBeadCount(coord_t thickness) const override;
|
|
coord_t getTransitioningLength(coord_t lower_bead_count) const override;
|
|
float getTransitionAnchorPos(coord_t lower_bead_count) const override;
|
|
|
|
std::string toString() const override;
|
|
|
|
protected:
|
|
BeadingStrategyPtr parent;
|
|
coord_t optimal_width_outer;
|
|
double minimum_variable_line_ratio;
|
|
};
|
|
|
|
} // namespace Slic3r::Arachne
|
|
#endif // INWARD_DISTRIBUTED_BEADING_STRATEGY_H
|