#include #include "libslic3r/libslic3r.h" #include "libslic3r/Print.hpp" #include "libslic3r/Layer.hpp" #include "test_data.hpp" using namespace Slic3r; using namespace Slic3r::Test; SCENARIO("Print: Skirt generation", "[Print]") { GIVEN("20mm cube and default config") { WHEN("skirt_loops is set to 2") { Slic3r::Print print; Slic3r::Test::init_and_process_print({TestMesh::cube_20x20x20}, print, { { "skirt_height", 1 }, { "skirt_distance", 1 }, { "skirt_loops", 2 } }); THEN("Skirt Extrusion collection has 2 loops in it") { REQUIRE(print.skirt().items_count() == 2); REQUIRE(print.skirt().flatten().entities.size() == 2); } } } } SCENARIO("Print: Changing number of solid shell layers does not cause all surfaces to become internal.", "[Print]") { GIVEN("sliced 20mm cube and config with top_shell_layers = 2 and bottom_shell_layers = 1") { Slic3r::DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config(); config.set_deserialize_strict({ { "top_shell_layers", 2 }, { "bottom_shell_layers", 1 }, { "layer_height", 0.25 }, // get a known number of layers { "initial_layer_print_height", 0.25 } }); Slic3r::Print print; Slic3r::Model model; Slic3r::Test::init_print({TestMesh::cube_20x20x20}, print, model, config); // Precondition: Ensure that the model has 2 solid top layers (79, 78) // and one solid bottom layer (0). auto test_is_solid_infill = [&print](size_t obj_id, size_t layer_id) { const Layer &layer = *(print.objects().at(obj_id)->get_layer((int)layer_id)); // iterate over all of the regions in the layer for (const LayerRegion *region : layer.regions()) { // for each region, iterate over the fill surfaces for (const Surface &surface : region->fill_surfaces.surfaces) CHECK(surface.is_solid()); } }; print.process(); test_is_solid_infill(0, 0); // should be solid test_is_solid_infill(0, 79); // should be solid test_is_solid_infill(0, 78); // should be solid WHEN("Model is re-sliced with top_shell_layers == 3") { config.set("top_shell_layers", 3); print.apply(model, config); print.process(); THEN("Print object does not have 0 solid bottom layers.") { test_is_solid_infill(0, 0); } AND_THEN("Print object has 3 top solid layers") { test_is_solid_infill(0, 79); test_is_solid_infill(0, 78); test_is_solid_infill(0, 77); } } } } SCENARIO("Print: Brim generation", "[Print]") { GIVEN("20mm cube and default config, 1mm first layer width") { WHEN("Brim is set to 6mm") { Slic3r::Print print; Slic3r::Test::init_and_process_print({TestMesh::cube_20x20x20}, print, { { "brim_type", "outer_only" }, { "initial_layer_line_width", 1 }, { "brim_width", 6 } }); THEN("Brim Extrusion collection has 6 loops in it") { size_t total_items = 0; for (const auto& pair : print.get_brimMap()) { total_items += pair.second.items_count(); } REQUIRE(total_items == 6); } } WHEN("Brim is set to 6mm, extrusion width 0.5mm") { Slic3r::Print print; Slic3r::Test::init_and_process_print({TestMesh::cube_20x20x20}, print, { { "brim_type", "outer_only" }, { "brim_width", 6 }, { "initial_layer_line_width", 0.5 } }); THEN("Brim Extrusion collection has 12 loops in it") { size_t total_items = 0; for (const auto& pair : print.get_brimMap()) { total_items += pair.second.items_count(); } REQUIRE(total_items == 12); } } } }