mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-14 03:11:19 +00:00
fix: exporting a sliced print again gives different G-code (#16025)
extrude_infill() and extrude_support() reversed the layer's extrusion entities in place while chaining them, so each export started from the previous one's reversed toolpaths, and each copy of an object from the copy before it. The export-time region lists now hold const pointers, and chaining reverses a clone instead.
This commit is contained in:
@@ -561,6 +561,40 @@ TEST_CASE("export_gcode writes G-code without a result pointer", "[Print][export
|
||||
REQUIRE_FALSE(gcode.empty());
|
||||
}
|
||||
|
||||
TEST_CASE("Exporting a sliced print again gives the same G-code", "[Print][export_gcode][Regression]")
|
||||
{
|
||||
const int instances = GENERATE(1, 3);
|
||||
CAPTURE(instances);
|
||||
DynamicPrintConfig config = DynamicPrintConfig::full_print_config();
|
||||
TestMesh mesh = TestMesh::ipadstand;
|
||||
SECTION("infill reversed by chaining") { config.set_deserialize_strict({{"sparse_infill_pattern", "gyroid"}}); }
|
||||
SECTION("support reversed by chaining") {
|
||||
mesh = TestMesh::overhang;
|
||||
config.set_deserialize_strict({{"enable_support", true}, {"support_interface_pattern", "concentric"}});
|
||||
}
|
||||
Print print;
|
||||
Model model;
|
||||
Slic3r::Test::init_print({Slic3r::Test::mesh(mesh)}, print, model, config, nullptr, true, instances);
|
||||
|
||||
const auto export_without_timestamp = [&print]() {
|
||||
std::string gcode = Slic3r::Test::gcode(print);
|
||||
const size_t line = gcode.find("; generated by ");
|
||||
REQUIRE(line != std::string::npos);
|
||||
gcode.erase(line, gcode.find('\n', line) - line);
|
||||
return gcode;
|
||||
};
|
||||
const std::string first = export_without_timestamp();
|
||||
const std::string second = export_without_timestamp();
|
||||
|
||||
// Shows the first differing line on failure.
|
||||
const size_t diff = std::mismatch(first.begin(), first.end(), second.begin(), second.end()).first - first.begin();
|
||||
const size_t line_start = diff == 0 ? 0 : first.rfind('\n', diff - 1) + 1;
|
||||
INFO("first export: " << first.substr(line_start, first.find('\n', diff) - line_start));
|
||||
INFO("second export: " << second.substr(line_start, second.find('\n', diff) - line_start));
|
||||
CHECK(diff == first.size());
|
||||
CHECK(first.size() == second.size());
|
||||
}
|
||||
|
||||
TEST_CASE("Sequential printing follows model order", "[Print]")
|
||||
{
|
||||
// Two objects of different heights, taller one added first. Orca prints
|
||||
|
||||
Reference in New Issue
Block a user