new cheaper constructor for DynamicPrintConfig from FullPrintConfig:

DynamicPrintConfig::full_print_config()
new cheaper constructors of DynamicConfig / DynamicPrintConfig from ConfigBase
Unit tests: ported test_model from upstream Slic3r, thanks @lordofhyphens
Unit tests refactored to use less autos and initializer lists for readibility,
DynamicPrintConfig is handled by value, not by shared pointer.
This commit is contained in:
bubnikv 2019-10-16 11:16:50 +02:00
parent 90d5712091
commit 69c8b1cd21
12 changed files with 190 additions and 107 deletions

View file

@ -30,16 +30,16 @@ int get_brim_tool(std::string &gcode, Slic3r::GCodeReader& parser) {
}
TEST_CASE("Skirt height is honored") {
std::shared_ptr<Slic3r::DynamicPrintConfig> config(Slic3r::DynamicPrintConfig::new_from_defaults());
config->opt_int("skirts") = 1;
config->opt_int("skirt_height") = 5;
config->opt_int("perimeters") = 0;
config->opt_float("support_material_speed") = 99;
DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config();
config.opt_int("skirts") = 1;
config.opt_int("skirt_height") = 5;
config.opt_int("perimeters") = 0;
config.opt_float("support_material_speed") = 99;
// avoid altering speeds unexpectedly
config->set_deserialize("cooling", "0");
config->set_deserialize("first_layer_speed", "100%");
double support_speed = config->opt<Slic3r::ConfigOptionFloat>("support_material_speed")->value * MM_PER_MIN;
config.set_deserialize("cooling", "0");
config.set_deserialize("first_layer_speed", "100%");
double support_speed = config.opt<Slic3r::ConfigOptionFloat>("support_material_speed")->value * MM_PER_MIN;
std::map<double, bool> layers_with_skirt;
std::string gcode;
@ -62,7 +62,7 @@ TEST_CASE("Skirt height is honored") {
}
});
REQUIRE(layers_with_skirt.size() == (size_t)config->opt_int("skirt_height"));
REQUIRE(layers_with_skirt.size() == (size_t)config.opt_int("skirt_height"));
}
SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
@ -70,28 +70,28 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
Slic3r::Model model;
std::string gcode;
GIVEN("A default configuration") {
std::shared_ptr<Slic3r::DynamicPrintConfig> config(Slic3r::DynamicPrintConfig::new_from_defaults());
config->set_num_extruders(4);
config->opt_float("support_material_speed") = 99;
config->set_deserialize("first_layer_height", "0.3");
config->set_deserialize("gcode_comments", "1");
DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config();
config.set_num_extruders(4);
config.opt_float("support_material_speed") = 99;
config.set_deserialize("first_layer_height", "0.3");
config.set_deserialize("gcode_comments", "1");
// avoid altering speeds unexpectedly
config->set_deserialize("cooling", "0");
config->set_deserialize("first_layer_speed", "100%");
config.set_deserialize("cooling", "0");
config.set_deserialize("first_layer_speed", "100%");
// remove noise from top/solid layers
config->opt_int("top_solid_layers") = 0;
config->opt_int("bottom_solid_layers") = 1;
config.opt_int("top_solid_layers") = 0;
config.opt_int("bottom_solid_layers") = 1;
WHEN("Brim width is set to 5") {
config->opt_int("perimeters") = 0;
config->opt_int("skirts") = 0;
config->opt_float("brim_width") = 5;
config.opt_int("perimeters") = 0;
config.opt_int("skirts") = 0;
config.opt_float("brim_width") = 5;
THEN("Brim is generated") {
auto print = Slic3r::Test::init_print({TestMesh::cube_20x20x20}, model, config);
gcode = Slic3r::Test::gcode(print);
bool brim_generated = false;
double support_speed = config->opt<Slic3r::ConfigOptionFloat>("support_material_speed")->value * MM_PER_MIN;
double support_speed = config.opt<Slic3r::ConfigOptionFloat>("support_material_speed")->value * MM_PER_MIN;
parser.parse_buffer(gcode, [&brim_generated, support_speed] (Slic3r::GCodeReader& self, const Slic3r::GCodeReader::GCodeLine& line)
{
if (self.z() == Approx(0.3) || line.new_Z(self) == Approx(0.3)) {
@ -105,8 +105,8 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
}
WHEN("Skirt area is smaller than the brim") {
config->opt_int("skirts") = 1;
config->opt_float("brim_width") = 10;
config.opt_int("skirts") = 1;
config.opt_float("brim_width") = 10;
auto print = Slic3r::Test::init_print({TestMesh::cube_20x20x20}, model, config);
THEN("Gcode generates") {
REQUIRE(! Slic3r::Test::gcode(print).empty());
@ -114,8 +114,8 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
}
WHEN("Skirt height is 0 and skirts > 0") {
config->opt_int("skirts") = 2;
config->opt_int("skirt_height") = 0;
config.opt_int("skirts") = 2;
config.opt_int("skirt_height") = 0;
auto print = Slic3r::Test::init_print({TestMesh::cube_20x20x20}, model, config);
THEN("Gcode generates") {
@ -124,34 +124,34 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
}
WHEN("Perimeter extruder = 2 and support extruders = 3") {
config->opt_int("skirts") = 0;
config->opt_float("brim_width") = 5;
config->opt_int("perimeter_extruder") = 2;
config->opt_int("support_material_extruder") = 3;
config.opt_int("skirts") = 0;
config.opt_float("brim_width") = 5;
config.opt_int("perimeter_extruder") = 2;
config.opt_int("support_material_extruder") = 3;
THEN("Brim is printed with the extruder used for the perimeters of first object") {
auto print = Slic3r::Test::init_print({TestMesh::cube_20x20x20}, model, config);
gcode = Slic3r::Test::gcode(print);
int tool = get_brim_tool(gcode, parser);
REQUIRE(tool == config->opt_int("perimeter_extruder") - 1);
REQUIRE(tool == config.opt_int("perimeter_extruder") - 1);
}
}
WHEN("Perimeter extruder = 2, support extruders = 3, raft is enabled") {
config->opt_int("skirts") = 0;
config->opt_float("brim_width") = 5;
config->opt_int("perimeter_extruder") = 2;
config->opt_int("support_material_extruder") = 3;
config->opt_int("raft_layers") = 1;
config.opt_int("skirts") = 0;
config.opt_float("brim_width") = 5;
config.opt_int("perimeter_extruder") = 2;
config.opt_int("support_material_extruder") = 3;
config.opt_int("raft_layers") = 1;
THEN("brim is printed with same extruder as skirt") {
auto print = Slic3r::Test::init_print({TestMesh::cube_20x20x20}, model, config);
gcode = Slic3r::Test::gcode(print);
int tool = get_brim_tool(gcode, parser);
REQUIRE(tool == config->opt_int("support_material_extruder") - 1);
REQUIRE(tool == config.opt_int("support_material_extruder") - 1);
}
}
WHEN("brim width to 1 with layer_width of 0.5") {
config->opt_int("skirts") = 0;
config->set_deserialize("first_layer_extrusion_width", "0.5");
config->opt_float("brim_width") = 1;
config.opt_int("skirts") = 0;
config.set_deserialize("first_layer_extrusion_width", "0.5");
config.opt_float("brim_width") = 1;
THEN("2 brim lines") {
Slic3r::Model model;
@ -163,11 +163,11 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
#if 0
WHEN("brim ears on a square") {
config->opt_int("skirts") = 0);
config->set_deserialize("first_layer_extrusion_width", "0.5");
config->opt_float("brim_width") = 1;
config->set("brim_ears", true);
config->set("brim_ears_max_angle", 91);
config.opt_int("skirts") = 0);
config.set_deserialize("first_layer_extrusion_width", "0.5");
config.opt_float("brim_width") = 1;
config.set("brim_ears", true);
config.set("brim_ears_max_angle", 91);
Slic3r::Model model;
auto print = Slic3r::Test::init_print({TestMesh::cube_20x20x20}, model, config);
@ -179,11 +179,11 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
}
WHEN("brim ears on a square but with a too small max angle") {
config->set("skirts", 0);
config->set("first_layer_extrusion_width", 0.5);
config->set("brim_width", 1);
config->set("brim_ears", true);
config->set("brim_ears_max_angle", 89);
config.set("skirts", 0);
config.set("first_layer_extrusion_width", 0.5);
config.set("brim_width", 1);
config.set("brim_ears", true);
config.set("brim_ears_max_angle", 89);
THEN("no brim") {
Slic3r::Model model;
@ -195,25 +195,25 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
#endif
WHEN("Object is plated with overhang support and a brim") {
config->opt_float("layer_height") = 0.4;
config->set_deserialize("first_layer_height", "0.4");
config->opt_int("skirts") = 1;
config->opt_float("skirt_distance") = 0;
config->opt_float("support_material_speed") = 99;
config->opt_int("perimeter_extruder") = 1;
config->opt_int("support_material_extruder") = 2;
config->opt_int("infill_extruder") = 3; // ensure that a tool command gets emitted.
config->set_deserialize("cooling", "0"); // to prevent speeds to be altered
config->set_deserialize("first_layer_speed", "100%"); // to prevent speeds to be altered
config.opt_float("layer_height") = 0.4;
config.set_deserialize("first_layer_height", "0.4");
config.opt_int("skirts") = 1;
config.opt_float("skirt_distance") = 0;
config.opt_float("support_material_speed") = 99;
config.opt_int("perimeter_extruder") = 1;
config.opt_int("support_material_extruder") = 2;
config.opt_int("infill_extruder") = 3; // ensure that a tool command gets emitted.
config.set_deserialize("cooling", "0"); // to prevent speeds to be altered
config.set_deserialize("first_layer_speed", "100%"); // to prevent speeds to be altered
Slic3r::Model model;
auto print = Slic3r::Test::init_print({TestMesh::overhang}, model, config);
print->process();
// config->set("support_material", true); // to prevent speeds to be altered
// config.set("support_material", true); // to prevent speeds to be altered
THEN("skirt length is large enough to contain object with support") {
CHECK(config->opt_bool("support_material")); // test is not valid if support material is off
CHECK(config.opt_bool("support_material")); // test is not valid if support material is off
double skirt_length = 0.0;
Points extrusion_points;
int tool = -1;
@ -221,18 +221,18 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
auto print = Slic3r::Test::init_print({TestMesh::cube_20x20x20}, model, config);
std::string gcode = Slic3r::Test::gcode(print);
double support_speed = config->opt<ConfigOptionFloat>("support_material_speed")->value * MM_PER_MIN;
double support_speed = config.opt<ConfigOptionFloat>("support_material_speed")->value * MM_PER_MIN;
parser.parse_buffer(gcode, [config, &extrusion_points, &tool, &skirt_length, support_speed] (Slic3r::GCodeReader& self, const Slic3r::GCodeReader::GCodeLine& line)
{
// std::cerr << line.cmd() << "\n";
if (boost::starts_with(line.cmd(), "T")) {
tool = atoi(line.cmd().data() + 1);
} else if (self.z() == Approx(config->opt<ConfigOptionFloat>("first_layer_height")->value)) {
} else if (self.z() == Approx(config.opt<ConfigOptionFloat>("first_layer_height")->value)) {
// on first layer
if (line.extruding(self) && line.dist_XY(self) > 0) {
float speed = ( self.f() > 0 ? self.f() : line.new_F(self));
// std::cerr << "Tool " << tool << "\n";
if (speed == Approx(support_speed) && tool == config->opt_int("perimeter_extruder") - 1) {
if (speed == Approx(support_speed) && tool == config.opt_int("perimeter_extruder") - 1) {
// Skirt uses first material extruder, support material speed.
skirt_length += line.dist_XY(self);
} else {
@ -252,7 +252,7 @@ SCENARIO("Original Slic3r Skirt/Brim tests", "[!mayfail]") {
}
}
WHEN("Large minimum skirt length is used.") {
config->opt_float("min_skirt_length") = 20;
config.opt_float("min_skirt_length") = 20;
Slic3r::Model model;
auto print = Slic3r::Test::init_print({TestMesh::cube_20x20x20}, model, config);
THEN("Gcode generation doesn't crash") {