mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-06-04 11:14:17 +08:00
SPE-1837: Fixed issue when perimeters weren't generated with Arachne.
This commit is contained in:
parent
925cfd5231
commit
6df4891e6c
@ -9,14 +9,11 @@
|
|||||||
#include "RedistributeBeadingStrategy.hpp"
|
#include "RedistributeBeadingStrategy.hpp"
|
||||||
#include "OuterWallInsetBeadingStrategy.hpp"
|
#include "OuterWallInsetBeadingStrategy.hpp"
|
||||||
|
|
||||||
#include <limits>
|
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
|
|
||||||
namespace Slic3r::Arachne
|
namespace Slic3r::Arachne {
|
||||||
{
|
|
||||||
|
|
||||||
BeadingStrategyPtr BeadingStrategyFactory::makeStrategy(
|
BeadingStrategyPtr BeadingStrategyFactory::makeStrategy(const coord_t preferred_bead_width_outer,
|
||||||
const coord_t preferred_bead_width_outer,
|
|
||||||
const coord_t preferred_bead_width_inner,
|
const coord_t preferred_bead_width_inner,
|
||||||
const coord_t preferred_transition_length,
|
const coord_t preferred_transition_length,
|
||||||
const float transitioning_angle,
|
const float transitioning_angle,
|
||||||
@ -28,10 +25,15 @@ BeadingStrategyPtr BeadingStrategyFactory::makeStrategy(
|
|||||||
const coord_t max_bead_count,
|
const coord_t max_bead_count,
|
||||||
const coord_t outer_wall_offset,
|
const coord_t outer_wall_offset,
|
||||||
const int inward_distributed_center_wall_count,
|
const int inward_distributed_center_wall_count,
|
||||||
const double minimum_variable_line_ratio
|
const double minimum_variable_line_ratio)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
BeadingStrategyPtr ret = std::make_unique<DistributedBeadingStrategy>(preferred_bead_width_inner, preferred_transition_length, transitioning_angle, wall_split_middle_threshold, wall_add_middle_threshold, inward_distributed_center_wall_count);
|
// Handle a special case when there is just one external perimeter.
|
||||||
|
// Because big differences in bead width for inner and other perimeters cause issues with current beading strategies.
|
||||||
|
const coord_t optimal_width = max_bead_count <= 2 ? preferred_bead_width_outer : preferred_bead_width_inner;
|
||||||
|
BeadingStrategyPtr ret = std::make_unique<DistributedBeadingStrategy>(optimal_width, preferred_transition_length, transitioning_angle,
|
||||||
|
wall_split_middle_threshold, wall_add_middle_threshold,
|
||||||
|
inward_distributed_center_wall_count);
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(trace) << "Applying the Redistribute meta-strategy with outer-wall width = " << preferred_bead_width_outer << ", inner-wall width = " << preferred_bead_width_inner << ".";
|
BOOST_LOG_TRIVIAL(trace) << "Applying the Redistribute meta-strategy with outer-wall width = " << preferred_bead_width_outer << ", inner-wall width = " << preferred_bead_width_inner << ".";
|
||||||
ret = std::make_unique<RedistributeBeadingStrategy>(preferred_bead_width_outer, minimum_variable_line_ratio, std::move(ret));
|
ret = std::make_unique<RedistributeBeadingStrategy>(preferred_bead_width_outer, minimum_variable_line_ratio, std::move(ret));
|
||||||
|
|
||||||
@ -39,6 +41,7 @@ BeadingStrategyPtr BeadingStrategyFactory::makeStrategy(
|
|||||||
BOOST_LOG_TRIVIAL(trace) << "Applying the Widening Beading meta-strategy with minimum input width " << min_feature_size << " and minimum output width " << min_bead_width << ".";
|
BOOST_LOG_TRIVIAL(trace) << "Applying the Widening Beading meta-strategy with minimum input width " << min_feature_size << " and minimum output width " << min_bead_width << ".";
|
||||||
ret = std::make_unique<WideningBeadingStrategy>(std::move(ret), min_feature_size, min_bead_width);
|
ret = std::make_unique<WideningBeadingStrategy>(std::move(ret), min_feature_size, min_bead_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outer_wall_offset > 0) {
|
if (outer_wall_offset > 0) {
|
||||||
BOOST_LOG_TRIVIAL(trace) << "Applying the OuterWallOffset meta-strategy with offset = " << outer_wall_offset << ".";
|
BOOST_LOG_TRIVIAL(trace) << "Applying the OuterWallOffset meta-strategy with offset = " << outer_wall_offset << ".";
|
||||||
ret = std::make_unique<OuterWallInsetBeadingStrategy>(outer_wall_offset, std::move(ret));
|
ret = std::make_unique<OuterWallInsetBeadingStrategy>(outer_wall_offset, std::move(ret));
|
||||||
|
@ -744,3 +744,23 @@ TEST_CASE("Arachne - #10034 - Degenerated Voronoi diagram - That wasn't fixed by
|
|||||||
export_perimeters_to_svg(debug_out_path("arachne-degenerated-diagram-10034-rotation-not-works.svg"), polygons, perimeters, union_ex(wall_tool_paths.getInnerContour()));
|
export_perimeters_to_svg(debug_out_path("arachne-degenerated-diagram-10034-rotation-not-works.svg"), polygons, perimeters, union_ex(wall_tool_paths.getInnerContour()));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Arachne - SPE-1837 - No perimeters generated", "[ArachneNoPerimetersGeneratedSPE1837]") {
|
||||||
|
Polygon poly_0 = {
|
||||||
|
Point( 10000000, 10000000),
|
||||||
|
Point(-10000000, 10000000),
|
||||||
|
Point(-10000000, -10000000),
|
||||||
|
Point( 10000000, -10000000)
|
||||||
|
};
|
||||||
|
|
||||||
|
Polygons polygons = {poly_0};
|
||||||
|
coord_t ext_perimeter_spacing = 300000;
|
||||||
|
coord_t perimeter_spacing = 700000;
|
||||||
|
coord_t inset_count = 1;
|
||||||
|
|
||||||
|
Arachne::WallToolPaths wall_tool_paths(polygons, ext_perimeter_spacing, perimeter_spacing, inset_count, 0, 0.2, PrintObjectConfig::defaults(), PrintConfig::defaults());
|
||||||
|
wall_tool_paths.generate();
|
||||||
|
std::vector<Arachne::VariableWidthLines> perimeters = wall_tool_paths.getToolPaths();
|
||||||
|
|
||||||
|
REQUIRE(!perimeters.empty());
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user