mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-15 08:23:00 +00:00
* Fix null-deref and arranger bugs that gate headless slicing tests export_gcode dereferenced a null result out-param, enum serialization dereferenced a null keys_map, and get_arrange_polys left bed_idx unseeded so the arranger dropped items. All only affect the headless test/CLI path. * Fix the headless test harness and add G-code test helpers Use the real arranger, fix temp-file handling with an RAII guard, and add layers_with_role / max_z for inspecting sliced G-code. * Re-enable the Model construction test * Re-enable SupportMaterial tests and add an enforced-support test * Re-enable and extend PrintObject layer-height and perimeter tests * Re-enable Print skirt, brim, and solid-surface tests * Re-enable and extend PrintGCode tests Un-hide the basic scenario (dead-key fixes, reframes, trimmed trivia) and add initial-layer-height, sequential-order, and null-result export tests. * Re-enable and reframe the skirt/brim tests Detect skirt/brim by G-code role comment instead of a sentinel speed, and resolve the previously-unfinished skirt-enclosure test. * Replace the stale lift()/unlift() test with a z_hop test * Delete the stub and broken Flow tests
97 lines
4.1 KiB
C++
97 lines
4.1 KiB
C++
#include <catch2/catch_all.hpp>
|
|
|
|
#include <numeric>
|
|
#include <sstream>
|
|
|
|
#include "test_data.hpp" // get access to init_print, etc
|
|
|
|
#include "libslic3r/Config.hpp"
|
|
#include "libslic3r/Model.hpp"
|
|
#include "libslic3r/Config.hpp"
|
|
#include "libslic3r/GCodeReader.hpp"
|
|
#include "libslic3r/Flow.hpp"
|
|
#include "libslic3r/libslic3r.h"
|
|
|
|
using namespace Slic3r::Test;
|
|
using namespace Slic3r;
|
|
|
|
/// Test the expected behavior for auto-width,
|
|
/// spacing, etc
|
|
SCENARIO("Flow: Flow math for non-bridges", "[Flow]") {
|
|
GIVEN("Nozzle Diameter of 0.4, a desired width of 1mm and layer height of 0.5") {
|
|
ConfigOptionFloatOrPercent width(1.0, false);
|
|
float nozzle_diameter = 0.4f;
|
|
float layer_height = 0.4f;
|
|
|
|
// Spacing for non-bridges is has some overlap
|
|
THEN("External perimeter flow has spacing fixed to 1.125 * nozzle_diameter") {
|
|
auto flow = Flow::new_from_config_width(frExternalPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height);
|
|
REQUIRE(flow.spacing() == Catch::Approx(1.125 * nozzle_diameter - layer_height * (1.0 - PI / 4.0)));
|
|
}
|
|
|
|
THEN("Internal perimeter flow has spacing fixed to 1.125 * nozzle_diameter") {
|
|
auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height);
|
|
REQUIRE(flow.spacing() == Catch::Approx(1.125 *nozzle_diameter - layer_height * (1.0 - PI / 4.0)));
|
|
}
|
|
THEN("Spacing for supplied width is 0.8927f") {
|
|
auto flow = Flow::new_from_config_width(frExternalPerimeter, width, nozzle_diameter, layer_height);
|
|
REQUIRE(flow.spacing() == Catch::Approx(width.value - layer_height * (1.0 - PI / 4.0)));
|
|
flow = Flow::new_from_config_width(frPerimeter, width, nozzle_diameter, layer_height);
|
|
REQUIRE(flow.spacing() == Catch::Approx(width.value - layer_height * (1.0 - PI / 4.0)));
|
|
}
|
|
}
|
|
/// Check the min/max
|
|
GIVEN("Nozzle Diameter of 0.25") {
|
|
float nozzle_diameter = 0.25f;
|
|
float layer_height = 0.5f;
|
|
WHEN("layer height is set to 0.2") {
|
|
layer_height = 0.15f;
|
|
THEN("Max width is set.") {
|
|
auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height);
|
|
REQUIRE(flow.width() == Catch::Approx(1.125 * nozzle_diameter));
|
|
}
|
|
}
|
|
WHEN("Layer height is set to 0.25") {
|
|
layer_height = 0.25f;
|
|
THEN("Min width is set.") {
|
|
auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height);
|
|
REQUIRE(flow.width() == Catch::Approx(1.125 * nozzle_diameter));
|
|
}
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
/// Check for an edge case in the maths where the spacing could be 0; original
|
|
/// math is 0.99. Slic3r issue #4654
|
|
GIVEN("Input spacing of 0.414159 and a total width of 2") {
|
|
double in_spacing = 0.414159;
|
|
double total_width = 2.0;
|
|
auto flow = Flow::new_from_spacing(1.0, 0.4, 0.3);
|
|
WHEN("solid_spacing() is called") {
|
|
double result = flow.solid_spacing(total_width, in_spacing);
|
|
THEN("Yielded spacing is greater than 0") {
|
|
REQUIRE(result > 0);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
/// Spacing, width calculation for bridge extrusions
|
|
SCENARIO("Flow: Flow math for bridges", "[Flow]") {
|
|
GIVEN("Nozzle Diameter of 0.4, a desired width of 1mm and layer height of 0.5") {
|
|
float nozzle_diameter = 0.4f;
|
|
float bridge_flow = 1.0f;
|
|
WHEN("Flow role is frExternalPerimeter") {
|
|
auto flow = Flow::bridging_flow(nozzle_diameter * sqrt(bridge_flow), nozzle_diameter);
|
|
THEN("Bridge width is same as nozzle diameter") {
|
|
REQUIRE(flow.width() == Catch::Approx(nozzle_diameter));
|
|
}
|
|
THEN("Bridge spacing is same as nozzle diameter + BRIDGE_EXTRA_SPACING") {
|
|
REQUIRE(flow.spacing() == Catch::Approx(nozzle_diameter + BRIDGE_EXTRA_SPACING));
|
|
}
|
|
}
|
|
}
|
|
}
|